fix: edit project time entry.

This commit is contained in:
elforjani13
2022-08-06 12:34:41 +02:00
parent 5c8c3586e0
commit 4cb7a50a1d
7 changed files with 55 additions and 23 deletions

View File

@@ -10,12 +10,12 @@ import { CreateProjectTimeEntryFormSchema } from './ProjectTimeEntryForm.schema'
import { useProjectTimeEntryFormContext } from './ProjectTimeEntryFormProvider'; import { useProjectTimeEntryFormContext } from './ProjectTimeEntryFormProvider';
import withDialogActions from '@/containers/Dialog/withDialogActions'; import withDialogActions from '@/containers/Dialog/withDialogActions';
import { compose } from '@/utils'; import { compose, transformToForm } from '@/utils';
const defaultInitialValues = { const defaultInitialValues = {
date: moment(new Date()).format('YYYY-MM-DD'), date: moment(new Date()).format('YYYY-MM-DD'),
projectId: '', task_id: '',
taskId: '', project_id: '',
description: '', description: '',
duration: '', duration: '',
}; };
@@ -31,6 +31,9 @@ function ProjectTimeEntryForm({
// time entry form dialog context. // time entry form dialog context.
const { const {
dialogName, dialogName,
isNewMode,
timesheetId,
projectTimeEntry,
createProjectTimeEntryMutate, createProjectTimeEntryMutate,
editProjectTimeEntryMutate, editProjectTimeEntryMutate,
} = useProjectTimeEntryFormContext(); } = useProjectTimeEntryFormContext();
@@ -38,6 +41,7 @@ function ProjectTimeEntryForm({
// Initial form values // Initial form values
const initialValues = { const initialValues = {
...defaultInitialValues, ...defaultInitialValues,
...transformToForm(projectTimeEntry, defaultInitialValues),
}; };
// Handles the form submit. // Handles the form submit.
@@ -50,7 +54,7 @@ function ProjectTimeEntryForm({
const onSuccess = (response) => { const onSuccess = (response) => {
AppToaster.show({ AppToaster.show({
message: intl.get( message: intl.get(
true isNewMode
? 'project_time_entry.success_message' ? 'project_time_entry.success_message'
: 'project_time_entry.dialog.edit_success_message', : 'project_time_entry.dialog.edit_success_message',
), ),
@@ -68,9 +72,15 @@ function ProjectTimeEntryForm({
}) => { }) => {
setSubmitting(false); setSubmitting(false);
}; };
createProjectTimeEntryMutate([values.taskId, form]) if (isNewMode) {
.then(onSuccess) createProjectTimeEntryMutate([values.taskId, form])
.catch(onError); .then(onSuccess)
.catch(onError);
} else {
editProjectTimeEntryMutate([timesheetId, form])
.then(onSuccess)
.catch(onError);
}
}; };
return ( return (

View File

@@ -9,10 +9,15 @@ import ProjectTimeEntryForm from './ProjectTimeEntryForm';
export default function ProjectTimeEntryFormDialogContent({ export default function ProjectTimeEntryFormDialogContent({
// #ownProps // #ownProps
dialogName, dialogName,
timeEntry,
project, project,
}) { }) {
return ( return (
<ProjectTimeEntryFormProvider projectId={project} dialogName={dialogName}> <ProjectTimeEntryFormProvider
timesheetId={timeEntry}
projectId={project}
dialogName={dialogName}
>
<ProjectTimeEntryForm /> <ProjectTimeEntryForm />
</ProjectTimeEntryFormProvider> </ProjectTimeEntryFormProvider>
); );

View File

@@ -35,13 +35,13 @@ function ProjectTimeEntryFormFields() {
{/*------------ Project -----------*/} {/*------------ Project -----------*/}
<If condition={!projectId}> <If condition={!projectId}>
<FFormGroup <FFormGroup
name={'projectId'} name={'project_id'}
label={<T id={'project_time_entry.dialog.project'} />} label={<T id={'project_time_entry.dialog.project'} />}
labelInfo={<FieldRequiredHint />} labelInfo={<FieldRequiredHint />}
className={classNames('form-group--select-list', Classes.FILL)} className={classNames('form-group--select-list', Classes.FILL)}
> >
<ProjectsSelect <ProjectsSelect
name={'projectId'} name={'project_id'}
projects={projects} projects={projects}
popoverProps={{ minimal: true }} popoverProps={{ minimal: true }}
/> />
@@ -49,13 +49,13 @@ function ProjectTimeEntryFormFields() {
</If> </If>
{/*------------ Task -----------*/} {/*------------ Task -----------*/}
<FFormGroup <FFormGroup
name={'taskId'} name={'task_id'}
label={<T id={'project_time_entry.dialog.task'} />} label={<T id={'project_time_entry.dialog.task'} />}
labelInfo={<FieldRequiredHint />} labelInfo={<FieldRequiredHint />}
className={classNames('form-group--select-list', Classes.FILL)} className={classNames('form-group--select-list', Classes.FILL)}
> >
<TaskSelect <TaskSelect
name={'taskId'} name={'task_id'}
tasks={projectTasks} tasks={projectTasks}
popoverProps={{ minimal: true }} popoverProps={{ minimal: true }}
/> />

View File

@@ -18,7 +18,7 @@ function ProjectTimeEntryFormFloatingActions({
const { dialogName } = useProjectTimeEntryFormContext(); const { dialogName } = useProjectTimeEntryFormContext();
// Formik context. // Formik context.
const { isSubmitting, values, errors } = useFormikContext(); const { isSubmitting } = useFormikContext();
// Handle close button click. // Handle close button click.
const handleCancelBtnClick = () => { const handleCancelBtnClick = () => {
@@ -37,7 +37,7 @@ function ProjectTimeEntryFormFloatingActions({
style={{ minWidth: '75px' }} style={{ minWidth: '75px' }}
type="submit" type="submit"
> >
<T id={'time_entry.dialog.create'} /> <T id={'project_time_entry.dialog.create'} />
</Button> </Button>
</div> </div>
</div> </div>

View File

@@ -4,6 +4,7 @@ import {
useProjectTasks, useProjectTasks,
useCreateProjectTimeEntry, useCreateProjectTimeEntry,
useEditProjectTimeEntry, useEditProjectTimeEntry,
useProjectTimeEntry,
} from '../../hooks'; } from '../../hooks';
import { DialogContent } from '@/components'; import { DialogContent } from '@/components';
@@ -17,6 +18,7 @@ function ProjectTimeEntryFormProvider({
// #ownProps // #ownProps
dialogName, dialogName,
projectId, projectId,
timesheetId,
...props ...props
}) { }) {
// project payload. // project payload.
@@ -34,28 +36,37 @@ function ProjectTimeEntryFormProvider({
enabled: !!project, enabled: !!project,
}); });
// Handle fetch project time entry detail.
const { data: projectTimeEntry, isLoading: isProjectTimeEntryLoading } =
useProjectTimeEntry(timesheetId, {
enabled: !!timesheetId,
});
// Fetch project list data table or list // Fetch project list data table or list
const { const {
data: { projects }, data: { projects },
isLoading: isProjectsLoading, isLoading: isProjectsLoading,
isSuccess: isProjectsSuccess,
} = useProjects(); } = useProjects();
const isNewMode = !timesheetId;
// provider payload. // provider payload.
const provider = { const provider = {
dialogName, dialogName,
projects, projects,
projectId, projectId,
timesheetId,
projectTasks, projectTasks,
isNewMode,
setProjectPayload, setProjectPayload,
isProjectsSuccess, projectTimeEntry,
createProjectTimeEntryMutate, createProjectTimeEntryMutate,
editProjectTimeEntryMutate, editProjectTimeEntryMutate,
}; };
return ( return (
<DialogContent <DialogContent
isLoading={isProjectsLoading} isLoading={isProjectsLoading || isProjectTimeEntryLoading}
name={'project-time-entry-form'} name={'project-time-entry-form'}
> >
<ProjecctTimeEntryFormContext.Provider value={provider} {...props} /> <ProjecctTimeEntryFormContext.Provider value={provider} {...props} />

View File

@@ -15,12 +15,18 @@ const ProjectTimeEntryFormDialogContent = React.lazy(
function ProjectTimeEntryFormDialog({ function ProjectTimeEntryFormDialog({
dialogName, dialogName,
isOpen, isOpen,
payload: { projectId }, payload: { timesheetId = null, projectId = null, action },
}) { }) {
return ( return (
<ProjectTimeEntryFormDialogRoot <ProjectTimeEntryFormDialogRoot
name={dialogName} name={dialogName}
title={<T id={'project_time_entry.dialog.label'} />} title={
action === 'edit' ? (
<T id={'project_time_entry.dialog.edit_time_entry'} />
) : (
<T id={'project_time_entry.dialog.new_time_entry'} />
)
}
isOpen={isOpen} isOpen={isOpen}
autoFocus={true} autoFocus={true}
canEscapeKeyClose={true} canEscapeKeyClose={true}
@@ -29,6 +35,7 @@ function ProjectTimeEntryFormDialog({
<DialogSuspense> <DialogSuspense>
<ProjectTimeEntryFormDialogContent <ProjectTimeEntryFormDialogContent
dialogName={dialogName} dialogName={dialogName}
timeEntry={timesheetId}
project={projectId} project={projectId}
/> />
</DialogSuspense> </DialogSuspense>

View File

@@ -4,12 +4,11 @@ import { useProjectTimeEntryFormContext } from './ProjectTimeEntryFormProvider';
export const useSetProjectToForm = () => { export const useSetProjectToForm = () => {
const { values } = useFormikContext(); const { values } = useFormikContext();
const { setProjectPayload, isProjectsSuccess } = const { setProjectPayload } = useProjectTimeEntryFormContext();
useProjectTimeEntryFormContext();
React.useEffect(() => { React.useEffect(() => {
if (isProjectsSuccess) { if (values.project_id) {
setProjectPayload(values.projectId); setProjectPayload(values.project_id);
} }
}, [values.projectId]); }, [values.projectId]);
}; };