From 709e06a646dbd4affed8540b5ce4c9a873b7a0f1 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Thu, 14 Jul 2022 18:29:22 +0200 Subject: [PATCH] feat: add project api --- src/containers/AlertsContainer/registered.js | 2 + .../ProjectAlerts/ProjectDeleteAlert.tsx | 79 +++++++++++ .../containers/ProjectAlerts/index.ts | 8 ++ .../ProjectFormDialog/ProjectForm.schema.tsx | 11 +- .../ProjectFormDialog/ProjectForm.tsx | 39 ++++-- .../ProjectFormDialog/ProjectFormFields.tsx | 16 +-- .../ProjectFormFloatingActions.tsx | 8 +- .../ProjectFormDialog/ProjectFormProvider.tsx | 19 ++- .../ProjectsLanding/ProjectsDataTable.tsx | 58 +++----- .../ProjectsLanding/ProjectsListProvider.tsx | 26 +++- .../containers/ProjectsLanding/components.tsx | 8 +- src/containers/Projects/hooks/index.ts | 125 ++++++++++++++++++ src/containers/Projects/hooks/type.ts | 11 ++ src/lang/en/index.json | 4 + 14 files changed, 341 insertions(+), 73 deletions(-) create mode 100644 src/containers/Projects/containers/ProjectAlerts/ProjectDeleteAlert.tsx create mode 100644 src/containers/Projects/containers/ProjectAlerts/index.ts create mode 100644 src/containers/Projects/hooks/index.ts create mode 100644 src/containers/Projects/hooks/type.ts diff --git a/src/containers/AlertsContainer/registered.js b/src/containers/AlertsContainer/registered.js index 86ecefdbc..bbb3b3d94 100644 --- a/src/containers/AlertsContainer/registered.js +++ b/src/containers/AlertsContainer/registered.js @@ -23,6 +23,7 @@ import TransactionsLockingAlerts from '../TransactionsLocking/TransactionsLockin import WarehousesAlerts from '../Preferences/Warehouses/WarehousesAlerts'; import WarehousesTransfersAlerts from '../WarehouseTransfers/WarehousesTransfersAlerts'; import BranchesAlerts from '../Preferences/Branches/BranchesAlerts'; +import ProjectAlerts from '../../containers/Projects/containers/ProjectAlerts'; export default [ ...AccountsAlerts, @@ -50,4 +51,5 @@ export default [ ...WarehousesAlerts, ...WarehousesTransfersAlerts, ...BranchesAlerts, + ...ProjectAlerts, ]; diff --git a/src/containers/Projects/containers/ProjectAlerts/ProjectDeleteAlert.tsx b/src/containers/Projects/containers/ProjectAlerts/ProjectDeleteAlert.tsx new file mode 100644 index 000000000..514e6e5c6 --- /dev/null +++ b/src/containers/Projects/containers/ProjectAlerts/ProjectDeleteAlert.tsx @@ -0,0 +1,79 @@ +//@ts-nocheck +import React from 'react'; +import intl from 'react-intl-universal'; +import { FormattedMessage as T, FormattedHTMLMessage } from 'components'; +import { Intent, Alert } from '@blueprintjs/core'; +import { AppToaster } from 'components'; +import { useDeleteProject } from '../../hooks'; + +import withAlertStoreConnect from 'containers/Alert/withAlertStoreConnect'; +import withAlertActions from 'containers/Alert/withAlertActions'; + +import { compose } from 'utils'; + +/** + * Project delete alert. + */ +function ProjectDeleteAlert({ + name, + + // #withAlertStoreConnect + isOpen, + payload: { projectId }, + + // #withAlertActions + closeAlert, + + // #withDrawerActions + closeDrawer, +}) { + const { mutateAsync: deleteProjectMutate, isLoading } = useDeleteProject(); + + // handle cancel delete project alert. + const handleCancelDeleteAlert = () => { + closeAlert(name); + }; + + // handleConfirm delete project + const handleConfirmProjectDelete = () => { + deleteProjectMutate(projectId) + .then(() => { + AppToaster.show({ + message: intl.get('projects.alert.delete_message'), + intent: Intent.SUCCESS, + }); + }) + .catch( + ({ + response: { + data: { errors }, + }, + }) => {}, + ) + .finally(() => { + closeAlert(name); + }); + }; + + return ( + } + confirmButtonText={} + icon="trash" + intent={Intent.DANGER} + isOpen={isOpen} + onCancel={handleCancelDeleteAlert} + onConfirm={handleConfirmProjectDelete} + loading={isLoading} + > +

+ +

+
+ ); +} + +export default compose( + withAlertStoreConnect(), + withAlertActions, +)(ProjectDeleteAlert); diff --git a/src/containers/Projects/containers/ProjectAlerts/index.ts b/src/containers/Projects/containers/ProjectAlerts/index.ts new file mode 100644 index 000000000..8900c1269 --- /dev/null +++ b/src/containers/Projects/containers/ProjectAlerts/index.ts @@ -0,0 +1,8 @@ +import React from 'react'; + +const ProjectDeleteAlert = React.lazy(() => import('./ProjectDeleteAlert')); + +/** + * Project alerts. + */ +export default [{ name: 'project-delete', component: ProjectDeleteAlert }]; diff --git a/src/containers/Projects/containers/ProjectFormDialog/ProjectForm.schema.tsx b/src/containers/Projects/containers/ProjectFormDialog/ProjectForm.schema.tsx index 49efc1b21..03e6ff34b 100644 --- a/src/containers/Projects/containers/ProjectFormDialog/ProjectForm.schema.tsx +++ b/src/containers/Projects/containers/ProjectFormDialog/ProjectForm.schema.tsx @@ -1,19 +1,18 @@ import * as Yup from 'yup'; import intl from 'react-intl-universal'; -import { DATATYPES_LENGTH } from 'common/dataTypes'; const Schema = Yup.object().shape({ - contact: Yup.string().label(intl.get('project.schema.label.contact')), - projectName: Yup.string() + contact_id: Yup.string().label(intl.get('project.schema.label.contact')), + name: Yup.string() .label(intl.get('project.schema.label.project_name')) .required(), - projectDeadline: Yup.date() + deadline: Yup.date() .label(intl.get('project.schema.label.deadline')) .required(), - published: Yup.boolean().label( + published: Yup.boolean().label( intl.get('project.schema.label.project_state'), ), - projectCost: Yup.number().label( + cost_estimate: Yup.number().label( intl.get('project.schema.label.project_cost'), ), }); diff --git a/src/containers/Projects/containers/ProjectFormDialog/ProjectForm.tsx b/src/containers/Projects/containers/ProjectFormDialog/ProjectForm.tsx index 4a75c8292..f23b74a09 100644 --- a/src/containers/Projects/containers/ProjectFormDialog/ProjectForm.tsx +++ b/src/containers/Projects/containers/ProjectFormDialog/ProjectForm.tsx @@ -9,14 +9,14 @@ import { CreateProjectFormSchema } from './ProjectForm.schema'; import { useProjectFormContext } from './ProjectFormProvider'; import withDialogActions from 'containers/Dialog/withDialogActions'; -import { compose } from 'utils'; +import { compose, transformToForm } from 'utils'; const defaultInitialValues = { - contact: '', - projectName: '', - projectDeadline: moment(new Date()).format('YYYY-MM-DD'), + contact_id: '', + name: '', + deadline: moment(new Date()).format('YYYY-MM-DD'), published: false, - projectCost: '', + cost_estimate: '', }; /** @@ -28,20 +28,37 @@ function ProjectForm({ closeDialog, }) { // project form dialog context. - const { dialogName } = useProjectFormContext(); + const { + dialogName, + project, + isNewMode, + projectId, + createProjectMutate, + editProjectMutate, + } = useProjectFormContext(); // Initial form values const initialValues = { ...defaultInitialValues, + ...transformToForm(project, defaultInitialValues), }; // Handles the form submit. const handleFormSubmit = (values, { setSubmitting, setErrors }) => { - const form = {}; + setSubmitting(true); + const form = { ...values }; // Handle request response success. const onSuccess = (response) => { - AppToaster.show({}); + AppToaster.show({ + message: intl.get( + isNewMode + ? 'projects.dialog.success_message' + : 'projects.dialog.edit_success_message', + ), + + intent: Intent.SUCCESS, + }); closeDialog(dialogName); }; @@ -53,6 +70,12 @@ function ProjectForm({ }) => { setSubmitting(false); }; + + if (isNewMode) { + createProjectMutate(form).then(onSuccess).catch(onError); + } else { + editProjectMutate([projectId, form]).then(onSuccess).catch(onError); + } }; return ( diff --git a/src/containers/Projects/containers/ProjectFormDialog/ProjectFormFields.tsx b/src/containers/Projects/containers/ProjectFormDialog/ProjectFormFields.tsx index 464e7db56..ce28cd7dd 100644 --- a/src/containers/Projects/containers/ProjectFormDialog/ProjectFormFields.tsx +++ b/src/containers/Projects/containers/ProjectFormDialog/ProjectFormFields.tsx @@ -40,7 +40,7 @@ function ProjectFormFields() { return (
{/*------------ Contact -----------*/} - + {({ form, field: { value }, meta: { error, touched } }) => ( { - form.setFieldValue('contact', customer.id); + form.setFieldValue('contact_id', customer.id); }} allowCreate={true} popoverFill={true} @@ -64,19 +64,19 @@ function ProjectFormFields() { {/*------------ Project Name -----------*/} - + {/*------------ DeadLine -----------*/} date.toLocaleString()} popoverProps={{ position: Position.BOTTOM, @@ -94,14 +94,14 @@ function ProjectFormFields() { {/*------------ Cost Estimate -----------*/} diff --git a/src/containers/Projects/containers/ProjectFormDialog/ProjectFormFloatingActions.tsx b/src/containers/Projects/containers/ProjectFormDialog/ProjectFormFloatingActions.tsx index 57b798d35..6eaf36192 100644 --- a/src/containers/Projects/containers/ProjectFormDialog/ProjectFormFloatingActions.tsx +++ b/src/containers/Projects/containers/ProjectFormDialog/ProjectFormFloatingActions.tsx @@ -15,12 +15,12 @@ function ProjectFormFloatingActions({ // #withDialogActions closeDialog, }) { - // project form dialog context. - const { dialogName } = useProjectFormContext(); - // Formik context. const { isSubmitting } = useFormikContext(); + // project form dialog context. + const { dialogName } = useProjectFormContext(); + // Handle close button click. const handleCancelBtnClick = () => { closeDialog(dialogName); @@ -29,7 +29,7 @@ function ProjectFormFloatingActions({ return (
-