diff --git a/client/src/containers/Accounting/MakeJournalEntriesForm.js b/client/src/containers/Accounting/MakeJournalEntriesForm.js index f586d6056..e247bca8c 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 = []; @@ -238,12 +242,15 @@ function MakeJournalEntriesForm({ ); } setErrors({ ...newErrors }); - AppToaster.show({ - message: toastMessages.map((message) => { - return
- {message}
; - }), - intent: Intent.DANGER, - }); + + if (toastMessages.length > 0) { + AppToaster.show({ + message: toastMessages.map((message) => { + return
- {message}
; + }), + 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 f4959fc4b..f88b7c1f2 100644 --- a/client/src/containers/Accounting/ManualJournalsDataTable.js +++ b/client/src/containers/Accounting/ManualJournalsDataTable.js @@ -23,9 +23,9 @@ 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} >

- +

@@ -258,7 +259,7 @@ function ManualJournalsTable({ >

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 228f933de..a5ac30e5f 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 1eb98c672..b659e8f00 100644 --- a/client/src/containers/Expenses/ExpenseForm.js +++ b/client/src/containers/Expenses/ExpenseForm.js @@ -29,6 +29,9 @@ import useMedia from 'hooks/useMedia'; import { compose, repeatValue } from 'utils'; const MIN_LINES_NUMBER = 4; +const ERROR = { + EXPENSE_ALREADY_PUBLISHED: 'EXPENSE.ALREADY.PUBLISHED', +}; function ExpenseForm({ // #withMedia @@ -187,6 +190,21 @@ 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.EXPENSE_ALREADY_PUBLISHED)) { + setErrors( + AppToaster.show({ + message: formatMessage({ + id: 'the_expense_is_already_published', + }), + }), + ); + } + }; + const formik = useFormik({ enableReinitialize: true, validationSchema, @@ -237,16 +255,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 { @@ -265,6 +274,7 @@ function ExpenseForm({ clearSavedMediaIds(); }) .catch((errors) => { + transformErrors(errors, { setErrors }); setSubmitting(false); }); } @@ -335,7 +345,6 @@ function ExpenseForm({ formik={formik} defaultRow={defaultCategory} /> -