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={}
+ >
+
+
+ )}
+
+
+ );
+}
diff --git a/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormProvider.js b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormProvider.js
new file mode 100644
index 000000000..7a8d95b96
--- /dev/null
+++ b/src/containers/Dialogs/TransactionsLockingDialog/TransactionsLockingFormProvider.js
@@ -0,0 +1,21 @@
+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/containers/Dialogs/TransactionsLockingDialog/index.js b/src/containers/Dialogs/TransactionsLockingDialog/index.js
new file mode 100644
index 000000000..d6ff27db8
--- /dev/null
+++ b/src/containers/Dialogs/TransactionsLockingDialog/index.js
@@ -0,0 +1,30 @@
+import React from 'react';
+import { Dialog, DialogSuspense, FormattedMessage as T } from 'components';
+import withDialogRedux from 'components/DialogReduxConnect';
+import { compose } from 'utils';
+
+const TransactionsLockingContent = React.lazy(() =>
+ import('./TransactionsLockingDialogContent'),
+);
+
+/**
+ * Transaction Locking dialog
+ */
+function TransactionsLockingDialog({ dialogName, payload = {}, isOpen }) {
+ return (
+ }
+ canEscapeKeyClose={true}
+ isOpen={isOpen}
+ className={'dialog--transaction--locking'}
+ >
+
+
+
+
+ );
+}
+
+export default compose(withDialogRedux())(TransactionsLockingDialog);
diff --git a/src/containers/TransactionsLocking/TransactionsLockingList.js b/src/containers/TransactionsLocking/TransactionsLockingList.js
new file mode 100644
index 000000000..8fca53981
--- /dev/null
+++ b/src/containers/TransactionsLocking/TransactionsLockingList.js
@@ -0,0 +1,79 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import styled from 'styled-components';
+
+import { TransactionsLockingProvider } from './TransactionsLockingProvider';
+import { TransactionLockingContent } from './components';
+import withDialogActions from 'containers/Dialog/withDialogActions';
+
+import { compose } from 'utils';
+
+/**
+ * Transactions locking list.
+ */
+function TransactionsLockingList({
+ // #withDialogActions
+ openDialog,
+}) {
+ // Handle switch transactions locking.
+ const handleSwitchTransactionsLocking = () => {
+ openDialog('transactions-locking', {});
+ };
+
+ const DataTest = [
+ {
+ name: 'sales',
+ description:
+ 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do',
+ },
+ {
+ name: 'purchases',
+ description:
+ 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do',
+ },
+ {
+ name: 'financial',
+ description:
+ 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do',
+ },
+ ];
+
+ return (
+
+
+
+ Transaction Locking
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+
+ Lock All Transactions At Once.
+ {''}Lock All Transactions At Once.
+
+
+ {DataTest.map(({ name, description }) => (
+
+ ))}
+
+
+ );
+}
+export default compose(withDialogActions)(TransactionsLockingList);
+
+const TransactionsLocking = styled.div`
+ display: flex;
+ flex-direction: column;
+ margin: 22px 32px;
+`;
+
+const TransactionsLockingParagraph = styled.div`
+ line-height: 1.5rem;
+ font-size: 16px;
+ h2 {
+ margin-bottom: 12px;
+ }
+`;
diff --git a/src/containers/TransactionsLocking/TransactionsLockingProvider.js b/src/containers/TransactionsLocking/TransactionsLockingProvider.js
new file mode 100644
index 000000000..33f1b855c
--- /dev/null
+++ b/src/containers/TransactionsLocking/TransactionsLockingProvider.js
@@ -0,0 +1,25 @@
+import React from 'react';
+import DashboardInsider from 'components/Dashboard/DashboardInsider';
+
+const TransactionsLockingContext = React.createContext();
+
+/**
+ * Transactions locking data provider.
+ */
+function TransactionsLockingProvider({ ...props }) {
+ // Provider
+ const provider = {};
+
+ return (
+
+
+
+ );
+}
+
+const useTransactionsLockingContext = () =>
+ React.useContext(TransactionsLockingContext);
+
+export { TransactionsLockingProvider, useTransactionsLockingContext };
diff --git a/src/containers/TransactionsLocking/components.js b/src/containers/TransactionsLocking/components.js
new file mode 100644
index 000000000..7eb39dea1
--- /dev/null
+++ b/src/containers/TransactionsLocking/components.js
@@ -0,0 +1,51 @@
+import React from 'react';
+import styled from 'styled-components';
+import { Switch, FormGroup, Intent } from '@blueprintjs/core';
+import { Icon, FormattedMessage as T } from 'components';
+
+export const TransactionLockingContent = ({ name, description, onSwitch }) => (
+
+
+
+
+
+
+
+
+
+
{description}
+
+
+
+
+
+
+);
+
+const TransactionLockingWrapp = styled.div`
+ display: flex;
+ align-items: center;
+ border-radius: 6px;
+ border: 1px solid #d2dce2;
+ max-width: 610px;
+ padding: 22px 15px;
+ margin-top: 25px;
+
+ div.block {
+ flex: 1 1 0;
+ margin-left: 20px;
+ width: 100%;
+ }
+`;
+
+const TransactionsLockingcontent = styled.div`
+ display: flex;
+ align-items: center;
+ flex: 1 1 0;
+`;
diff --git a/src/lang/en/index.json b/src/lang/en/index.json
index 3a1f34b77..006185a77 100644
--- a/src/lang/en/index.json
+++ b/src/lang/en/index.json
@@ -1467,5 +1467,12 @@
"sms_notification.payment_details.type": "Payment receive thank you.",
"sms_notification.receipt_details.type": "Sale receipt details",
"personal": "Personal",
- "list.create":"Create {value}"
+ "list.create":"Create {value}",
+ "roles.label":"Roles",
+ "roles.column.name":"Name",
+ "roles.column.description":"description",
+ "roles.edit_roles":"Edit Roles",
+ "roles.delete_roles":"Delete Roles",
+ "sidebar.transactions_locaking":"Transactions Locaking",
+ "transactions_locking.dialog.label":"Transactions locking"
}
\ No newline at end of file
diff --git a/src/routes/dashboard.js b/src/routes/dashboard.js
index f0c2097b1..dd9764664 100644
--- a/src/routes/dashboard.js
+++ b/src/routes/dashboard.js
@@ -785,6 +785,13 @@ export const getDashboardRoutes = () => [
subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
defaultSearchResource: RESOURCES_TYPES.ACCOUNT,
},
+ {
+ path: `/transactions-locking`,
+ component: lazy(() =>
+ import('../containers/TransactionsLocking/TransactionsLockingList'),
+ ),
+ pageTitle: intl.get('sidebar.transactions_locaking'),
+ },
// Homepage
{
path: `/`,
diff --git a/src/style/pages/TransactionsLocking/TransactionsLockingDialog.scss b/src/style/pages/TransactionsLocking/TransactionsLockingDialog.scss
new file mode 100644
index 000000000..b1aed0430
--- /dev/null
+++ b/src/style/pages/TransactionsLocking/TransactionsLockingDialog.scss
@@ -0,0 +1,27 @@
+.dialog--transaction--locking {
+ max-width: 400px;
+ .bp3-form-group {
+ margin-bottom: 15px;
+ margin-top: 15px;
+
+ label.bp3-label {
+ font-size: 13px;
+ margin-bottom: 3px;
+ }
+ }
+
+ .form-group {
+ &--reason {
+ .bp3-form-content {
+ textarea {
+ width: 100%;
+ min-width: 100%;
+ font-size: 14px;
+ }
+ }
+ }
+ }
+ .bp3-dialog-footer {
+ padding-top: 10px;
+ }
+}