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

View File

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

View File

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

View File

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

View File

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

View File

@@ -15,12 +15,18 @@ const ProjectTimeEntryFormDialogContent = React.lazy(
function ProjectTimeEntryFormDialog({
dialogName,
isOpen,
payload: { projectId },
payload: { timesheetId = null, projectId = null, action },
}) {
return (
<ProjectTimeEntryFormDialogRoot
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}
autoFocus={true}
canEscapeKeyClose={true}
@@ -29,6 +35,7 @@ function ProjectTimeEntryFormDialog({
<DialogSuspense>
<ProjectTimeEntryFormDialogContent
dialogName={dialogName}
timeEntry={timesheetId}
project={projectId}
/>
</DialogSuspense>

View File

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