feat: add project time entry.

This commit is contained in:
elforjani13
2022-07-31 18:32:50 +02:00
parent 7350fef5c4
commit 2e7ba59beb
7 changed files with 62 additions and 23 deletions

View File

@@ -566,6 +566,11 @@ export const SidebarMenu = [
type: ISidebarMenuItemType.Dialog, type: ISidebarMenuItemType.Dialog,
dialogName: 'project-form', dialogName: 'project-form',
}, },
{
text: <T id={'projects.label.new_time_entry'} />,
type: ISidebarMenuItemType.Dialog,
dialogName: 'project-time-entry-form',
},
], ],
}, },
], ],

View File

@@ -6,12 +6,6 @@ const Schema = Yup.object().shape({
date: Yup.date() date: Yup.date()
.label(intl.get('project_time_entry.schema.label.date')) .label(intl.get('project_time_entry.schema.label.date'))
.required(), .required(),
// projectId: Yup.string()
// .label(intl.get('project_time_entry.schema.label.project_name'))
// .required(),
// taskId: Yup.string()
// .label(intl.get('project_time_entry.schema.label.task_name'))
// .required(),
description: Yup.string().nullable().max(DATATYPES_LENGTH.TEXT), description: Yup.string().nullable().max(DATATYPES_LENGTH.TEXT),
duration: Yup.string() duration: Yup.string()
.label(intl.get('project_time_entry.schema.label.duration')) .label(intl.get('project_time_entry.schema.label.duration'))

View File

@@ -14,7 +14,7 @@ import { compose } from '@/utils';
const defaultInitialValues = { const defaultInitialValues = {
date: moment(new Date()).format('YYYY-MM-DD'), date: moment(new Date()).format('YYYY-MM-DD'),
// projectId: '', projectId: '',
taskId: '', taskId: '',
description: '', description: '',
duration: '', duration: '',

View File

@@ -5,6 +5,7 @@ import { Classes, Intent, Position } from '@blueprintjs/core';
import { CLASSES } from '@/constants/classes'; import { CLASSES } from '@/constants/classes';
import classNames from 'classnames'; import classNames from 'classnames';
import { import {
If,
FFormGroup, FFormGroup,
FInputGroup, FInputGroup,
FDateInput, FDateInput,
@@ -15,6 +16,7 @@ import {
import { useProjectTimeEntryFormContext } from './ProjectTimeEntryFormProvider'; import { useProjectTimeEntryFormContext } from './ProjectTimeEntryFormProvider';
import { TaskSelect, ProjectsSelect } from '../../components'; import { TaskSelect, ProjectsSelect } from '../../components';
import { momentFormatter } from '@/utils'; import { momentFormatter } from '@/utils';
import { useSetProjectToForm } from './utils';
/** /**
* Project time entry form fields. * Project time entry form fields.
@@ -22,23 +24,29 @@ import { momentFormatter } from '@/utils';
*/ */
function ProjectTimeEntryFormFields() { function ProjectTimeEntryFormFields() {
// time entry form dialog context. // time entry form dialog context.
const { projectTasks } = useProjectTimeEntryFormContext(); const { projectTasks, projects, projectId } =
useProjectTimeEntryFormContext();
// Sets the project id.
useSetProjectToForm();
return ( return (
<div className={Classes.DIALOG_BODY}> <div className={Classes.DIALOG_BODY}>
{/*------------ Project -----------*/} {/*------------ Project -----------*/}
<FFormGroup <If condition={!projectId}>
name={'projectId'} <FFormGroup
label={<T id={'project_time_entry.dialog.project'} />}
labelInfo={<FieldRequiredHint />}
className={classNames('form-group--select-list', Classes.FILL)}
>
<ProjectsSelect
name={'projectId'} name={'projectId'}
projects={[]} label={<T id={'project_time_entry.dialog.project'} />}
popoverProps={{ minimal: true }} labelInfo={<FieldRequiredHint />}
/> className={classNames('form-group--select-list', Classes.FILL)}
</FFormGroup> >
<ProjectsSelect
name={'projectId'}
projects={projects}
popoverProps={{ minimal: true }}
/>
</FFormGroup>
</If>
{/*------------ Task -----------*/} {/*------------ Task -----------*/}
<FFormGroup <FFormGroup
name={'taskId'} name={'taskId'}

View File

@@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import { import {
useProjects,
useProjectTasks, useProjectTasks,
useCreateProjectTimeEntry, useCreateProjectTimeEntry,
useEditProjectTimeEntry, useEditProjectTimeEntry,
@@ -18,6 +19,9 @@ function ProjectTimeEntryFormProvider({
projectId, projectId,
...props ...props
}) { }) {
// project payload.
const [project, setProjectPayload] = React.useState(projectId);
// Create and edit project time entry mutations. // Create and edit project time entry mutations.
const { mutateAsync: createProjectTimeEntryMutate } = const { mutateAsync: createProjectTimeEntryMutate } =
useCreateProjectTimeEntry(); useCreateProjectTimeEntry();
@@ -26,22 +30,34 @@ function ProjectTimeEntryFormProvider({
// Handle fetch project tasks. // Handle fetch project tasks.
const { const {
data: { projectTasks }, data: { projectTasks },
isLoading: isProjectTasksLoading, } = useProjectTasks(project, {
} = useProjectTasks(projectId, { enabled: !!project,
enabled: !!projectId,
}); });
// Fetch project list data table or list
const {
data: { projects },
isLoading: isProjectsLoading,
isSuccess: isProjectsSuccess,
} = useProjects();
// provider payload. // provider payload.
const provider = { const provider = {
dialogName, dialogName,
projects,
projectId, projectId,
projectTasks, projectTasks,
setProjectPayload,
isProjectsSuccess,
createProjectTimeEntryMutate, createProjectTimeEntryMutate,
editProjectTimeEntryMutate, editProjectTimeEntryMutate,
}; };
return ( return (
<DialogContent name={'project-time-entry-form'}> <DialogContent
isLoading={isProjectsLoading}
name={'project-time-entry-form'}
>
<ProjecctTimeEntryFormContext.Provider value={provider} {...props} /> <ProjecctTimeEntryFormContext.Provider value={provider} {...props} />
</DialogContent> </DialogContent>
); );

View File

@@ -0,0 +1,15 @@
import React from 'react';
import { useFormikContext } from 'formik';
import { useProjectTimeEntryFormContext } from './ProjectTimeEntryFormProvider';
export const useSetProjectToForm = () => {
const { values } = useFormikContext();
const { setProjectPayload, isProjectsSuccess } =
useProjectTimeEntryFormContext();
React.useEffect(() => {
if (isProjectsSuccess) {
setProjectPayload(values.projectId);
}
}, [values.projectId]);
};

View File

@@ -2050,6 +2050,7 @@
"projects.action.new_task": "New Task", "projects.action.new_task": "New Task",
"projects.action.delete_project": "Delete Project", "projects.action.delete_project": "Delete Project",
"projects.label.new_project": "New Project", "projects.label.new_project": "New Project",
"projects.label.new_time_entry":"New Time Entry",
"projects.dialog.contact": "Contact", "projects.dialog.contact": "Contact",
"projects.dialog.project_name": "Project Name", "projects.dialog.project_name": "Project Name",
"projects.dialog.deadline": "Deadline", "projects.dialog.deadline": "Deadline",