mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-17 05:10:31 +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 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 (
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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 }}
|
||||
/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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} />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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]);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user