mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-20 23:00:34 +00:00
fix: edit project time entry.
This commit is contained in:
@@ -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 (
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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 }}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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} />
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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]);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user