diff --git a/src/components/DialogsContainer.js b/src/components/DialogsContainer.js index 656c7d9d8..d9d3609c5 100644 --- a/src/components/DialogsContainer.js +++ b/src/components/DialogsContainer.js @@ -25,11 +25,13 @@ import NotifyReceiptViaSMSDialog from '../containers/Dialogs/NotifyReceiptViaSMS import NotifyEstimateViaSMSDialog from '../containers/Dialogs/NotifyEstimateViaSMSDialog'; import NotifyPaymentReceiveViaSMSDialog from '../containers/Dialogs/NotifyPaymentReceiveViaSMSDialog'; import SMSMessageDialog from '../containers/Dialogs/SMSMessageDialog'; -import TransactionsLockingDialog from '../containers/Dialogs/TransactionsLockingDialog'; import RefundCreditNoteDialog from '../containers/Dialogs/RefundCreditNoteDialog'; import RefundVendorCreditDialog from '../containers/Dialogs/RefundVendorCreditDialog'; import ReconcileCreditNoteDialog from '../containers/Dialogs/ReconcileCreditNoteDialog'; import ReconcileVendorCreditDialog from '../containers/Dialogs/ReconcileVendorCreditDialog'; +import LockingTransactionsDialog from '../containers/Dialogs/LockingTransactionsDialog'; +import UnlockingTransactionsDialog from '../containers/Dialogs/UnlockingTransactionsDialog'; +import UnlockingPartialTransactionsDialog from '../containers/Dialogs/UnlockingPartialTransactionsDialog'; /** * Dialogs container. @@ -63,11 +65,15 @@ export default function DialogsContainer() { - + + + ); } diff --git a/src/config/sidebarMenu.js b/src/config/sidebarMenu.js index 7a904a1fb..1ea65f2a0 100644 --- a/src/config/sidebarMenu.js +++ b/src/config/sidebarMenu.js @@ -425,14 +425,14 @@ export default [ ability: ManualJournalAction.View, }, }, - // { - // text: , - // href: '/transactions-locking', - // permission: { - // subject: AbilitySubject.ManualJournal, - // ability: ManualJournalAction.TransactionLocking, - // }, - // }, + { + text: , + href: '/transactions-locking', + // permission: { + // subject: AbilitySubject.ManualJournal, + // ability: ManualJournalAction.TransactionLocking, + // }, + }, { text: , href: '/exchange-rates', diff --git a/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsDialogContent.js b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsDialogContent.js new file mode 100644 index 000000000..287b70a38 --- /dev/null +++ b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsDialogContent.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { LockingTransactionsFormProvider } from './LockingTransactionsFormProvider'; +import LockingTransactionsForm from './LockingTransactionsForm'; + +/** + * Locking transactions dialog content. + */ +export default function LockingTransactionsDialogContent({ + // #ownProps + dialogName, +}) { + return ( + + + + ); +} diff --git a/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsForm.js b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsForm.js new file mode 100644 index 000000000..4de89c382 --- /dev/null +++ b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsForm.js @@ -0,0 +1,73 @@ +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 { CreateLockingTransactionsFormSchema } from './LockingTransactionsForm.schema'; + +import { useLockingTransactionsContext } from './LockingTransactionsFormProvider'; +import LockingTransactionsFormContent from './LockingTransactionsFormContent'; + +import withDialogActions from 'containers/Dialog/withDialogActions'; +import { compose } from 'utils'; + +const defaultInitialValues = { + module: 'all', + lock_to_date: moment(new Date()).format('YYYY-MM-DD'), + reason: '', +}; + +/** + * Locking Transactions Form. + */ +function LockingTransactionsForm({ + // #withDialogActions + closeDialog, +}) { + const { dialogName, createLockingTransactionMutate } = + useLockingTransactionsContext(); + + // Initial form values. + const initialValues = { + ...defaultInitialValues, + }; + + // Handles the form submit. + const handleFormSubmit = (values, { setSubmitting, setErrors }) => { + setSubmitting(true); + + // Handle request response success. + const onSuccess = (response) => { + AppToaster.show({ + message: intl.get('locking_transactions.dialog.success_message'), + intent: Intent.SUCCESS, + }); + closeDialog(dialogName); + }; + + // Handle request response errors. + const onError = ({ + response: { + data: { errors }, + }, + }) => { + setSubmitting(false); + }; + + createLockingTransactionMutate(values).then(onSuccess).catch(onError); + }; + + return ( + + ); +} +export default compose(withDialogActions)(LockingTransactionsForm); diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.schema.js b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsForm.schema.js similarity index 63% rename from src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.schema.js rename to src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsForm.schema.js index a74058f3f..d2f8199f9 100644 --- a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.schema.js +++ b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsForm.schema.js @@ -3,11 +3,12 @@ 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')), + lock_to_date: Yup.date().required().label(intl.get('date')), + module: Yup.string().required(), reason: Yup.string() .required() .min(3) .max(DATATYPES_LENGTH.TEXT) .label(intl.get('reason')), }); -export const CreateTransactionsLockingFormSchema = Schema; +export const CreateLockingTransactionsFormSchema = Schema; diff --git a/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormContent.js b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormContent.js new file mode 100644 index 000000000..c7e46a26c --- /dev/null +++ b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormContent.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { Form } from 'formik'; + +import LockingTransactionsFormFields from './LockingTransactionsFormFields'; +import LockingTransactionsFormFloatingActions from './LockingTransactionsFormFloatingActions'; + +/** + * locking Transactions form content. + */ +export default function LockingTransactionsFormContent() { + return ( +
+ + + + ); +} diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormFields.js b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormFields.js similarity index 79% rename from src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormFields.js rename to src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormFields.js index bede9d2fc..2c6d1a75b 100644 --- a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormFields.js +++ b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormFields.js @@ -14,28 +14,28 @@ import { } from 'utils'; /** - * Transactions locking form fields. + * locking Transactions form fields. */ -export default function TransactionsLockingFormFields() { +export default function LockingTransactionsFormFields() { const dateFieldRef = useAutofocus(); return (
- {/*------------ Date -----------*/} - + {/*------------ Locking Date -----------*/} + {({ form, field: { value }, meta: { error, touched } }) => ( } + label={} labelInfo={} intent={inputIntent({ error, touched })} - helperText={} + helperText={} minimal={true} className={classNames(CLASSES.FILL, 'form-group--date')} > { - form.setFieldValue('date', formattedDate); + form.setFieldValue('lock_to_date', formattedDate); })} value={tansformDateValue(value)} popoverProps={{ @@ -48,11 +48,12 @@ export default function TransactionsLockingFormFields() { )} - {/*------------ reasons -----------*/} + + {/*------------ Locking Reason -----------*/} {({ field, meta: { error, touched } }) => ( } + label={} labelInfo={} className={'form-group--reason'} intent={inputIntent({ error, touched })} diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFloatingActions.js b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormFloatingActions.js similarity index 62% rename from src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFloatingActions.js rename to src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormFloatingActions.js index 51c29dedc..b76ee054e 100644 --- a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFloatingActions.js +++ b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormFloatingActions.js @@ -3,21 +3,21 @@ import { Intent, Button, Classes } from '@blueprintjs/core'; import { useFormikContext } from 'formik'; import { FormattedMessage as T } from 'components'; -import { useTransactionLockingContext } from './TransactionsLockingFormProvider'; +import { useLockingTransactionsContext } from './LockingTransactionsFormProvider'; import withDialogActions from 'containers/Dialog/withDialogActions'; import { compose } from 'utils'; /** - * Transactions locking floating actions. + * locking Transactions floating actions. */ -function TransactionsLockingFloatingActions({ +function LockingTransactionsFormFloatingActions({ // #withDialogActions closeDialog, }) { // Formik context. const { isSubmitting } = useFormikContext(); - const { dialogName } = useTransactionLockingContext(); + const { dialogName } = useLockingTransactionsContext(); // Handle cancel button click. const handleCancelBtnClick = (event) => { @@ -27,24 +27,22 @@ function TransactionsLockingFloatingActions({ return (
- +
); } -export default compose(withDialogActions)(TransactionsLockingFloatingActions); +export default compose(withDialogActions)( + LockingTransactionsFormFloatingActions, +); diff --git a/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormProvider.js b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormProvider.js new file mode 100644 index 000000000..d12a3ca30 --- /dev/null +++ b/src/containers/Dialogs/LockingTransactionsDialog/LockingTransactionsFormProvider.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { DialogContent } from 'components'; +import { useCreateLockingTransactoin } from 'hooks/query'; + +const LockingTransactionsContext = React.createContext(); + +/** + * Locking transactions form provider. + */ +function LockingTransactionsFormProvider({ dialogName, ...props }) { + + // Create locking transactions mutations. + const { mutateAsync: createLockingTransactionMutate } = + useCreateLockingTransactoin(); + + // State provider. + const provider = { + dialogName, + createLockingTransactionMutate, + }; + return ( + + + + ); +} + +const useLockingTransactionsContext = () => + React.useContext(LockingTransactionsContext); + +export { LockingTransactionsFormProvider, useLockingTransactionsContext }; diff --git a/src/containers/Dialogs/TransactionsLockingDialog/index.js b/src/containers/Dialogs/LockingTransactionsDialog/index.js similarity index 54% rename from src/containers/Dialogs/TransactionsLockingDialog/index.js rename to src/containers/Dialogs/LockingTransactionsDialog/index.js index d6ff27db8..2b1c19085 100644 --- a/src/containers/Dialogs/TransactionsLockingDialog/index.js +++ b/src/containers/Dialogs/LockingTransactionsDialog/index.js @@ -3,28 +3,28 @@ import { Dialog, DialogSuspense, FormattedMessage as T } from 'components'; import withDialogRedux from 'components/DialogReduxConnect'; import { compose } from 'utils'; -const TransactionsLockingContent = React.lazy(() => - import('./TransactionsLockingDialogContent'), +const LockingTransactionsDialogContent = React.lazy(() => + import('./LockingTransactionsDialogContent'), ); /** - * Transaction Locking dialog + * Locking Transactions dialog */ -function TransactionsLockingDialog({ dialogName, payload = {}, isOpen }) { +function LockingTransactionsDialog({ dialogName, payload = {}, isOpen }) { return ( } + title={} canEscapeKeyClose={true} isOpen={isOpen} className={'dialog--transaction--locking'} > - + ); } -export default compose(withDialogRedux())(TransactionsLockingDialog); +export default compose(withDialogRedux())(LockingTransactionsDialog); diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingDialogContent.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingDialogContent.js deleted file mode 100644 index 28d763962..000000000 --- a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingDialogContent.js +++ /dev/null @@ -1,14 +0,0 @@ -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/TransactionsLockingForm.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.js deleted file mode 100644 index 9bba5437a..000000000 --- a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingForm.js +++ /dev/null @@ -1,48 +0,0 @@ -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/TransactionsLockingFormContent.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormContent.js deleted file mode 100644 index 43a1e1dda..000000000 --- a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormContent.js +++ /dev/null @@ -1,17 +0,0 @@ -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/TransactionsLockingFormProvider.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormProvider.js deleted file mode 100644 index 7a8d95b96..000000000 --- a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormProvider.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; -import { DialogContent } from 'components'; - -const TransactionsLockingContext = React.createContext(); - -function TransactionsLockingFormProvider({ dialogName, ...props }) { - // State provider. - const provider = { - dialogName, - }; - return ( - - - - ); -} - -const useTransactionLockingContext = () => - React.useContext(TransactionsLockingContext); - -export { TransactionsLockingFormProvider, useTransactionLockingContext }; diff --git a/src/style/pages/TransactionsLocking/TransactionsLockingDialog.scss b/src/style/pages/TransactionsLocking/TransactionsLockingDialog.scss index b1aed0430..c02dbdd4f 100644 --- a/src/style/pages/TransactionsLocking/TransactionsLockingDialog.scss +++ b/src/style/pages/TransactionsLocking/TransactionsLockingDialog.scss @@ -1,8 +1,9 @@ .dialog--transaction--locking { - max-width: 400px; + max-width: 450px; + .bp3-form-group { - margin-bottom: 15px; - margin-top: 15px; + margin-bottom: 10px; + margin-top: 10px; label.bp3-label { font-size: 13px; @@ -22,6 +23,9 @@ } } .bp3-dialog-footer { + display: flex; + justify-content: flex-start; padding-top: 10px; + margin-left: 10px; } }