From fe8f41f20034d9104ea7a7bd624006e374fe9635 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Thu, 18 Nov 2021 17:28:11 +0200 Subject: [PATCH] feat: Transactions locking. --- src/components/DialogsContainer.js | 4 +- src/config/sidebarMenu.js | 4 + .../TransactionsLockingDialogContent.js | 14 ++++ .../TransactionsLockingFloatingActions.js | 50 ++++++++++++ .../TransactionsLockingForm.js | 48 +++++++++++ .../TransactionsLockingForm.schema.js | 13 +++ .../TransactionsLockingFormContent.js | 17 ++++ .../TransactionsLockingFormFields.js | 72 +++++++++++++++++ .../TransactionsLockingFormProvider.js | 21 +++++ .../TransactionsLockingDialog/index.js | 30 +++++++ .../TransactionsLockingList.js | 79 +++++++++++++++++++ .../TransactionsLockingProvider.js | 25 ++++++ .../TransactionsLocking/components.js | 51 ++++++++++++ src/lang/en/index.json | 9 ++- src/routes/dashboard.js | 7 ++ .../TransactionsLockingDialog.scss | 27 +++++++ 16 files changed, 469 insertions(+), 2 deletions(-) create mode 100644 src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingDialogContent.js create mode 100644 src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFloatingActions.js create mode 100644 src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.js create mode 100644 src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.schema.js create mode 100644 src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormContent.js create mode 100644 src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormFields.js create mode 100644 src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormProvider.js create mode 100644 src/containers/Dialogs/TransactionsLockingDialog/index.js create mode 100644 src/containers/TransactionsLocking/TransactionsLockingList.js create mode 100644 src/containers/TransactionsLocking/TransactionsLockingProvider.js create mode 100644 src/containers/TransactionsLocking/components.js create mode 100644 src/style/pages/TransactionsLocking/TransactionsLockingDialog.scss diff --git a/src/components/DialogsContainer.js b/src/components/DialogsContainer.js index db9f883c2..871e38a58 100644 --- a/src/components/DialogsContainer.js +++ b/src/components/DialogsContainer.js @@ -23,8 +23,9 @@ import BadDebtDialog from '../containers/Dialogs/BadDebtDialog'; import NotifyInvoiceViaSMSDialog from '../containers/Dialogs/NotifyInvoiceViaSMSDialog'; import NotifyReceiptViaSMSDialog from '../containers/Dialogs/NotifyReceiptViaSMSDialog'; import NotifyEstimateViaSMSDialog from '../containers/Dialogs/NotifyEstimateViaSMSDialog'; -import NotifyPaymentReceiveViaSMSDialog from '../containers/Dialogs/NotifyPaymentReceiveViaSMSDialog' +import NotifyPaymentReceiveViaSMSDialog from '../containers/Dialogs/NotifyPaymentReceiveViaSMSDialog'; import SMSMessageDialog from '../containers/Dialogs/SMSMessageDialog'; +import TransactionsLockingDialog from '../containers/Dialogs/TransactionsLockingDialog'; /** * Dialogs container. @@ -58,6 +59,7 @@ export default function DialogsContainer() { + ); } diff --git a/src/config/sidebarMenu.js b/src/config/sidebarMenu.js index ddd6799b3..bb02d9100 100644 --- a/src/config/sidebarMenu.js +++ b/src/config/sidebarMenu.js @@ -172,6 +172,10 @@ export default [ text: , href: '/manual-journals', }, + { + text: , + href: '/transactions-locking', + }, { text: , href: '/exchange-rates', diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingDialogContent.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingDialogContent.js new file mode 100644 index 000000000..28d763962 --- /dev/null +++ b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingDialogContent.js @@ -0,0 +1,14 @@ +import React from 'react'; +import { TransactionsLockingFormProvider } from './TransactionsLockingFormProvider'; +import TransactionsLockingForm from './TransactionsLockingForm'; + +export default function TransactionsLockingDialogContent({ + // #ownProps + dialogName, +}) { + return ( + + + + ); +} diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFloatingActions.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFloatingActions.js new file mode 100644 index 000000000..51c29dedc --- /dev/null +++ b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFloatingActions.js @@ -0,0 +1,50 @@ +import React from 'react'; +import { Intent, Button, Classes } from '@blueprintjs/core'; +import { useFormikContext } from 'formik'; +import { FormattedMessage as T } from 'components'; + +import { useTransactionLockingContext } from './TransactionsLockingFormProvider'; +import withDialogActions from 'containers/Dialog/withDialogActions'; +import { compose } from 'utils'; + +/** + * Transactions locking floating actions. + */ +function TransactionsLockingFloatingActions({ + // #withDialogActions + closeDialog, +}) { + // Formik context. + const { isSubmitting } = useFormikContext(); + + const { dialogName } = useTransactionLockingContext(); + + // Handle cancel button click. + const handleCancelBtnClick = (event) => { + closeDialog(dialogName); + }; + + return ( +
+
+ + +
+
+ ); +} + +export default compose(withDialogActions)(TransactionsLockingFloatingActions); diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.js new file mode 100644 index 000000000..9bba5437a --- /dev/null +++ b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.js @@ -0,0 +1,48 @@ +import React from 'react'; +import moment from 'moment'; +import { Intent } from '@blueprintjs/core'; +import { Formik } from 'formik'; +import intl from 'react-intl-universal'; + +import '../../../style/pages/TransactionsLocking/TransactionsLockingDialog.scss' + +import { AppToaster } from 'components'; +import { CreateTransactionsLockingFormSchema } from './TransactionsLockingForm.schema'; + +import { useTransactionLockingContext } from './TransactionsLockingFormProvider'; +import TransactionsLockingFormContent from './TransactionsLockingFormContent'; + +import withDialogActions from 'containers/Dialog/withDialogActions'; +import { compose } from 'utils'; + +const defaultInitialValues = { + date: moment(new Date()).format('YYYY-MM-DD'), + reason: '', +}; + +/** + * Transactions Locking From. + */ +function TransactionsLockingForm({ + // #withDialogActions + closeDialog, +}) { + const { dialogName } = useTransactionLockingContext(); + // Initial form values. + const initialValues = { + ...defaultInitialValues, + }; + + // Handles the form submit. + const handleFormSubmit = (values, { setSubmitting, setErrors }) => {}; + + return ( + + ); +} +export default compose(withDialogActions)(TransactionsLockingForm); diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.schema.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.schema.js new file mode 100644 index 000000000..a74058f3f --- /dev/null +++ b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.schema.js @@ -0,0 +1,13 @@ +import * as Yup from 'yup'; +import intl from 'react-intl-universal'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; + +const Schema = Yup.object().shape({ + date: Yup.date().required().label(intl.get('date')), + reason: Yup.string() + .required() + .min(3) + .max(DATATYPES_LENGTH.TEXT) + .label(intl.get('reason')), +}); +export const CreateTransactionsLockingFormSchema = Schema; diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormContent.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormContent.js new file mode 100644 index 000000000..43a1e1dda --- /dev/null +++ b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormContent.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { Form } from 'formik'; + +import TransactionsLockingFormFields from './TransactionsLockingFormFields'; +import TransactionsLockingFloatingActions from './TransactionsLockingFloatingActions'; + +/** + * Transactions locking form content. + */ +export default function TransactionsLockingFormContent() { + return ( +
+ + + + ); +} diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormFields.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormFields.js new file mode 100644 index 000000000..bede9d2fc --- /dev/null +++ b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormFields.js @@ -0,0 +1,72 @@ +import React from 'react'; +import { FastField, ErrorMessage } from 'formik'; +import { Classes, FormGroup, TextArea, Position } from '@blueprintjs/core'; +import { DateInput } from '@blueprintjs/datetime'; +import classNames from 'classnames'; +import { CLASSES } from 'common/classes'; +import { FieldRequiredHint, FormattedMessage as T } from 'components'; +import { useAutofocus } from 'hooks'; +import { + inputIntent, + momentFormatter, + tansformDateValue, + handleDateChange, +} from 'utils'; + +/** + * Transactions locking form fields. + */ +export default function TransactionsLockingFormFields() { + const dateFieldRef = useAutofocus(); + + return ( +
+ {/*------------ Date -----------*/} + + {({ form, field: { value }, meta: { error, touched } }) => ( + } + labelInfo={} + intent={inputIntent({ error, touched })} + helperText={} + minimal={true} + className={classNames(CLASSES.FILL, 'form-group--date')} + > + { + form.setFieldValue('date', formattedDate); + })} + value={tansformDateValue(value)} + popoverProps={{ + position: Position.BOTTOM, + minimal: true, + }} + intent={inputIntent({ error, touched })} + inputRef={(ref) => (dateFieldRef.current = ref)} + /> + + )} + + {/*------------ reasons -----------*/} + + {({ field, meta: { error, touched } }) => ( + } + labelInfo={} + className={'form-group--reason'} + intent={inputIntent({ error, touched })} + helperText={} + > +