From 7ea417d8c06c1ecbadaeaeec2dc39763b340884e Mon Sep 17 00:00:00 2001 From: elforjani3 Date: Sun, 5 Jul 2020 21:30:51 +0200 Subject: [PATCH] Fix / takse expense & Journal --- .../Accounting/MakeJournalEntriesForm.js | 13 ++++ .../Accounting/MakeJournalEntriesPage.js | 2 +- .../Accounting/ManualJournalActionsBar.js | 8 +-- .../Accounting/ManualJournalsDataTable.js | 29 ++++++--- .../Accounting/ManualJournalsList.js | 15 ++--- .../containers/Accounts/AccountsViewsTabs.js | 9 +-- .../containers/Expenses/ExpenseDataTable.js | 10 ++- client/src/containers/Expenses/ExpenseForm.js | 54 ++++++++++------ .../containers/Expenses/ExpenseViewTabs.js | 21 ++++--- .../src/containers/Expenses/ExpensesList.js | 61 ++++++++++++++----- client/src/lang/en/index.js | 27 +++++++- 11 files changed, 176 insertions(+), 73 deletions(-) diff --git a/client/src/containers/Accounting/MakeJournalEntriesForm.js b/client/src/containers/Accounting/MakeJournalEntriesForm.js index 3afe8950e..bc7a28ac2 100644 --- a/client/src/containers/Accounting/MakeJournalEntriesForm.js +++ b/client/src/containers/Accounting/MakeJournalEntriesForm.js @@ -34,6 +34,7 @@ const ERROR = { VENDORS_NOT_WITH_PAYABLE_ACCOUNT: 'VENDORS.NOT.WITH.PAYABLE.ACCOUNT', PAYABLE_ENTRIES_HAS_NO_VENDORS: 'PAYABLE.ENTRIES.HAS.NO.VENDORS', RECEIVABLE_ENTRIES_HAS_NO_CUSTOMERS: 'RECEIVABLE.ENTRIES.HAS.NO.CUSTOMERS', + CREDIT_DEBIT_SUMATION_SHOULD_NOT_EQUAL_ZERO:'CREDIT.DEBIT.SUMATION.SHOULD.NOT.EQUAL.ZERO' }; /** @@ -57,6 +58,7 @@ function MakeJournalEntriesForm({ onFormSubmit, onCancelForm, }) { + const { formatMessage } = useIntl(); const { setFiles, @@ -68,10 +70,12 @@ function MakeJournalEntriesForm({ saveCallback: requestSubmitMedia, deleteCallback: requestDeleteMedia, }); + const handleDropFiles = useCallback((_files) => { setFiles(_files.filter((file) => file.uploaded === false)); }, []); + const savedMediaIds = useRef([]); const clearSavedMediaIds = () => { savedMediaIds.current = []; @@ -222,6 +226,15 @@ function MakeJournalEntriesForm({ }), }); } + if(hasError(ERROR.CREDIT_DEBIT_SUMATION_SHOULD_NOT_EQUAL_ZERO)){ + + AppToaster.show({ + message:formatMessage({ + id:'credit_debit_summation_should_not_equal_zero' + }), + intent:Intent.DANGER + }) + } }; const formik = useFormik({ diff --git a/client/src/containers/Accounting/MakeJournalEntriesPage.js b/client/src/containers/Accounting/MakeJournalEntriesPage.js index 9a9686e40..b8e4a4d2d 100644 --- a/client/src/containers/Accounting/MakeJournalEntriesPage.js +++ b/client/src/containers/Accounting/MakeJournalEntriesPage.js @@ -46,7 +46,7 @@ function MakeJournalEntriesPage({ ); const handleCancel = useCallback(() => { - history.push('/manual-journals'); + history.goBack(); }, [history]); return ( diff --git a/client/src/containers/Accounting/ManualJournalActionsBar.js b/client/src/containers/Accounting/ManualJournalActionsBar.js index 62d83264e..e687d7a4d 100644 --- a/client/src/containers/Accounting/ManualJournalActionsBar.js +++ b/client/src/containers/Accounting/ManualJournalActionsBar.js @@ -41,7 +41,7 @@ function ManualJournalActionsBar({ addManualJournalsTableQueries, onFilterChanged, - selectedRows, + selectedRows = [], onBulkDelete, }) { const { path } = useRouteMatch(); @@ -73,9 +73,9 @@ function ManualJournalActionsBar({ onFilterChanged && onFilterChanged(filterConditions); }, }); - const hasSelectedRows = useMemo(() => selectedRows.length > 0, [ - selectedRows, - ]); + const hasSelectedRows = useMemo( + () => selectedRows.length > 0, + [selectedRows]); // Handle delete button click. const handleBulkDelete = useCallback(() => { diff --git a/client/src/containers/Accounting/ManualJournalsDataTable.js b/client/src/containers/Accounting/ManualJournalsDataTable.js index aba441aa7..defed27bd 100644 --- a/client/src/containers/Accounting/ManualJournalsDataTable.js +++ b/client/src/containers/Accounting/ManualJournalsDataTable.js @@ -23,12 +23,12 @@ import withManualJournals from 'containers/Accounting/withManualJournals'; import withManualJournalsActions from 'containers/Accounting/withManualJournalsActions'; /** - * Status column accessor. + * Status column accessor. */ -function StatusAccessor(row) { +const StatusAccessor = (row) => { return ( - + @@ -41,7 +41,7 @@ function StatusAccessor(row) { ); -} +}; /** * Note column accessor. @@ -115,12 +115,12 @@ function ManualJournalsDataTable({ - {!journal.status && ( + - )} + ({ + minWidth: 40, + width: 40, + maxWidth: 40, + }), + [], + ); return ( { requestDeleteBulkManualJournals(bulkDelete) .then(() => { + setBulkDelete(false); AppToaster.show({ message: formatMessage( { id: 'the_journals_has_been_successfully_deleted' }, @@ -121,7 +126,6 @@ function ManualJournalsTable({ ), intent: Intent.SUCCESS, }); - setBulkDelete(false); }) .catch((error) => { setBulkDelete(false); @@ -181,6 +185,7 @@ function ManualJournalsTable({ message: formatMessage({ id: 'the_manual_journal_id_has_been_published', }), + intent: Intent.SUCCESS, }); }); }, @@ -237,11 +242,7 @@ function ManualJournalsTable({ onConfirm={handleConfirmManualJournalDelete} >

- +

diff --git a/client/src/containers/Accounts/AccountsViewsTabs.js b/client/src/containers/Accounts/AccountsViewsTabs.js index 5b16396f1..0ecc6ea20 100644 --- a/client/src/containers/Accounts/AccountsViewsTabs.js +++ b/client/src/containers/Accounts/AccountsViewsTabs.js @@ -1,11 +1,7 @@ import React, { useEffect, useRef } from 'react'; import { useHistory } from 'react-router'; import { connect } from 'react-redux'; -import { - Alignment, - Navbar, - NavbarGroup, -} from '@blueprintjs/core'; +import { Alignment, Navbar, NavbarGroup } from '@blueprintjs/core'; import { useParams, withRouter } from 'react-router-dom'; import { pick, debounce } from 'lodash'; @@ -38,13 +34,14 @@ function AccountsViewsTabs({ customViewChanged, onViewChanged, }) { + const history = useHistory(); const { custom_view_id: customViewId = null } = useParams(); useEffect(() => { changeAccountsCurrentView(customViewId || -1); setTopbarEditView(customViewId); - changePageSubtitle((customViewId && viewItem) ? viewItem.name : ''); + changePageSubtitle(customViewId && viewItem ? viewItem.name : ''); addAccountsTableQueries({ custom_view_id: customViewId, diff --git a/client/src/containers/Expenses/ExpenseDataTable.js b/client/src/containers/Expenses/ExpenseDataTable.js index 3f1ffb325..5d0e23614 100644 --- a/client/src/containers/Expenses/ExpenseDataTable.js +++ b/client/src/containers/Expenses/ExpenseDataTable.js @@ -12,6 +12,7 @@ import { Tag, } from '@blueprintjs/core'; import { useParams } from 'react-router-dom'; +import { withRouter } from 'react-router'; import { FormattedMessage as T, useIntl } from 'react-intl'; import moment from 'moment'; @@ -28,6 +29,7 @@ import withDashboardActions from 'containers/Dashboard/withDashboardActions'; import withViewDetails from 'containers/Views/withViewDetails'; import withExpenses from 'containers/Expenses/withExpenses'; import withExpensesActions from 'containers/Expenses/withExpensesActions'; +import withCurrentView from 'containers/Views/withCurrentView'; function ExpensesDataTable({ //#withExpenes @@ -55,6 +57,10 @@ function ExpensesDataTable({ const [initialMount, setInitialMount] = useState(false); const { formatMessage } = useIntl(); + useEffect(()=>{ + setInitialMount(false) + },[customViewId]) + useUpdateEffect(() => { if (!expensesLoading) { setInitialMount(true); @@ -260,7 +266,7 @@ function ExpensesDataTable({ selectionColumn={true} noInitialFetch={true} sticky={true} - loading={expensesLoading} + loading={expensesLoading && !initialMount} onSelectedRowsChange={handleSelectedRowsChange} rowContextMenu={onRowContextMenu} pagination={true} @@ -274,6 +280,8 @@ function ExpensesDataTable({ } export default compose( + withRouter, + withCurrentView, withDialogActions, withDashboardActions, withExpensesActions, diff --git a/client/src/containers/Expenses/ExpenseForm.js b/client/src/containers/Expenses/ExpenseForm.js index 5d515f55c..bc80e6f7a 100644 --- a/client/src/containers/Expenses/ExpenseForm.js +++ b/client/src/containers/Expenses/ExpenseForm.js @@ -28,6 +28,11 @@ import Dragzone from 'components/Dragzone'; import useMedia from 'hooks/useMedia'; import { compose, repeatValue } from 'utils'; +const ERROR = { + TOTAL_AMOUNT_EQUALS_ZERO: 'TOTAL.AMOUNT.EQUALS.ZERO', + EXPENSE_ALREADY_PUBLISHED: 'EXPENSE.ALREADY.PUBLISHED', +}; + function ExpenseForm({ // #withMedia requestSubmitMedia, @@ -134,9 +139,7 @@ function ExpenseForm({ description: '', reference_no: '', currency_code: '', - categories: [ - ...repeatValue(defaultCategory, 4), - ], + categories: [...repeatValue(defaultCategory, 4)], }), [defaultCategory], ); @@ -177,6 +180,30 @@ function ExpenseForm({ : []; }, [expense]); + // Transform API errors in toasts messages. + const transformErrors = (errors, { setErrors }) => { + const hasError = (errorType) => errors.some((e) => e.type === errorType); + if (hasError(ERROR.TOTAL_AMOUNT_EQUALS_ZERO)) { + setErrors( + AppToaster.show({ + message: formatMessage({ + id: 'total_amount_equals_zero', + }), + intent: Intent.DANGER, + }), + ); + } + if (hasError(ERROR.EXPENSE_ALREADY_PUBLISHED)) { + setErrors( + AppToaster.show({ + message: formatMessage({ + id: 'expense_already_published', + }), + }), + ); + } + }; + const formik = useFormik({ enableReinitialize: true, validationSchema, @@ -214,16 +241,7 @@ function ExpenseForm({ resetForm(); }) .catch((errors) => { - if (errors.find((e) => e.type === 'TOTAL.AMOUNT.EQUALS.ZERO')) { - } - setErrors( - AppToaster.show({ - message: formatMessage({ - id: 'total_amount_equals_zero', - }), - intent: Intent.DANGER, - }), - ); + transformErrors(errors, { setErrors }); setSubmitting(false); }); } else { @@ -244,6 +262,7 @@ function ExpenseForm({ // resolve(response); }) .catch((errors) => { + transformErrors(errors, { setErrors }); setSubmitting(false); }); } @@ -298,11 +317,9 @@ function ExpenseForm({ const handleClearAllLines = () => { formik.setFieldValue( 'categories', - orderingCategoriesIndex([ - ...repeatValue(defaultCategory, 4), - ]), - ); - } + orderingCategoriesIndex([...repeatValue(defaultCategory, 4)]), + ); + }; return (
@@ -316,7 +333,6 @@ function ExpenseForm({ formik={formik} defaultRow={defaultCategory} /> -