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 (
-