diff --git a/client/src/components/AccountsSelectList.js b/client/src/components/AccountsSelectList.js
index b326184f2..f826d33c7 100644
--- a/client/src/components/AccountsSelectList.js
+++ b/client/src/components/AccountsSelectList.js
@@ -1,29 +1,23 @@
-import React, {useMemo, useCallback, useState} from 'react';
-import {omit} from 'lodash';
+import React, {useCallback, useState} from 'react';
import {
MenuItem,
- FormGroup,
Button,
- Intent,
} from '@blueprintjs/core';
import {Select} from '@blueprintjs/select';
-// import MultiSelect from 'components/MultiSelect';
export default function AccountsMultiSelect({
accounts,
onAccountSelected,
error,
+ initialAccount,
}) {
- const [selectedAccount, setSelectedAccount] = useState(null);
-
+ const [selectedAccount, setSelectedAccount] = useState(
+ initialAccount || null
+ );
// Account item of select accounts field.
const accountItem = useCallback((item, { handleClick, modifiers, query }) => {
return (
-
+
);
}, []);
@@ -33,20 +27,17 @@ export default function AccountsMultiSelect({
}, [setSelectedAccount, onAccountSelected]);
return (
-
}
itemRenderer={accountItem}
popoverProps={{ minimal: true }}
filterable={true}
- onItemSelect={onAccountSelect}
- >
+ onItemSelect={onAccountSelect}>
-
);
}
\ No newline at end of file
diff --git a/client/src/components/DataTableCells/AccountsListFieldCell.js b/client/src/components/DataTableCells/AccountsListFieldCell.js
index 70b2d1d2e..6cee2c770 100644
--- a/client/src/components/DataTableCells/AccountsListFieldCell.js
+++ b/client/src/components/DataTableCells/AccountsListFieldCell.js
@@ -1,4 +1,4 @@
-import React, {useCallback} from 'react';
+import React, {useCallback, useMemo} from 'react';
import AccountsSelectList from 'components/AccountsSelectList';
import classNames from 'classnames';
import {
@@ -20,6 +20,10 @@ const AccountCellRenderer = ({
const { account_id = false } = (errors[index] || {});
+ const initialAccount = useMemo(() =>
+ accounts.find(a => a.id === initialValue),
+ [accounts, initialValue]);
+
return (
+ error={account_id}
+ initialAccount={initialAccount} />
);
};
diff --git a/client/src/components/MoneyInputGroup.js b/client/src/components/MoneyInputGroup.js
index adefb2913..97812135c 100644
--- a/client/src/components/MoneyInputGroup.js
+++ b/client/src/components/MoneyInputGroup.js
@@ -64,7 +64,9 @@ export default function MoneyFieldGroup({
const options = useMemo(() => ({
prefix, suffix, thousands, decimal, precision,
- }), []);
+ }), [
+ prefix, suffix, thousands, decimal, precision,
+ ]);
const handleChange = useCallback((event) => {
const formatted = formatter(event.target.value, options);
@@ -72,12 +74,12 @@ export default function MoneyFieldGroup({
setState(formatted);
onChange && onChange(event, value);
- }, []);
+ }, [onChange, options]);
useEffect(() => {
const formatted = formatter(value, options);
setState(formatted)
- }, []);
+ }, [value, options, setState]);
return (
({
-
+ getManualJournal: (id) => getManualJournal(state, id),
});
export const mapDispatchToProps = (dispatch) => ({
- makeJournalEntries: (form) => dispatch(makeJournalEntries({ form })),
+ requestMakeJournalEntries: (form) => dispatch(makeJournalEntries({ form })),
+ fetchManualJournal: (id) => dispatch(fetchManualJournal({ id })),
+ requestEditManualJournal: (id, form) => dispatch(editManualJournal({ id, form }))
});
export default connect(mapStateToProps, mapDispatchToProps);
\ No newline at end of file
diff --git a/client/src/containers/Dashboard/Accounting/MakeJournalEntriesForm.js b/client/src/containers/Dashboard/Accounting/MakeJournalEntriesForm.js
index e56efab7f..c32079c79 100644
--- a/client/src/containers/Dashboard/Accounting/MakeJournalEntriesForm.js
+++ b/client/src/containers/Dashboard/Accounting/MakeJournalEntriesForm.js
@@ -13,21 +13,23 @@ import {compose} from 'utils';
import useAsync from 'hooks/async';
import moment from 'moment';
import AppToaster from 'components/AppToaster';
+import {pick, omit} from 'lodash';
function MakeJournalEntriesForm({
- makeJournalEntries,
- fetchAccounts,
+ requestMakeJournalEntries,
+ requestEditManualJournal,
changePageTitle,
+ changePageSubtitle,
+ editJournal,
}) {
useEffect(() => {
- changePageTitle('New Journal');
- }, []);
-
- const fetchHook = useAsync(async () => {
- await Promise.all([
- fetchAccounts(),
- ]);
- });
+ if (editJournal && editJournal.id) {
+ changePageTitle('Edit Journal');
+ changePageSubtitle(`No. ${editJournal.journal_number}`);
+ } else {
+ changePageTitle('New Journal');
+ }
+ }, [changePageTitle, changePageSubtitle, editJournal]);
const validationSchema = Yup.object().shape({
journal_number: Yup.string().required(),
@@ -54,22 +56,31 @@ function MakeJournalEntriesForm({
note: '',
}), []);
+ const initialValues = useMemo(() => ({
+ journal_number: '',
+ date: moment(new Date()).format('YYYY-MM-DD'),
+ description: '',
+ reference: '',
+ entries: [
+ defaultEntry,
+ defaultEntry,
+ defaultEntry,
+ defaultEntry,
+ ],
+ }), [defaultEntry]);
+
const formik = useFormik({
enableReinitialize: true,
validationSchema,
initialValues: {
- journal_number: '',
- date: moment(new Date()).format('YYYY-MM-DD'),
- description: '',
- reference: '',
- entries: [
- defaultEntry,
- defaultEntry,
- defaultEntry,
- defaultEntry,
- defaultEntry,
- defaultEntry,
- ],
+ ...(editJournal) ? {
+ ...pick(editJournal, Object.keys(initialValues)),
+ entries: editJournal.entries.map((entry) => ({
+ ...pick(entry, Object.keys(defaultEntry)),
+ }))
+ } : {
+ ...initialValues,
+ }
},
onSubmit: (values, actions) => {
const form = values.entries.filter((entry) => (
@@ -87,18 +98,31 @@ function MakeJournalEntriesForm({
AppToaster.show({
message: 'credit_and_debit_not_equal',
});
+ actions.setSubmitting(false);
return;
}
-
- makeJournalEntries({ ...values, entries: form })
- .then((response) => {
- AppToaster.show({
- message: 'manual_journal_has_been_submit',
- });
- actions.setSubmitting(false);
- }).catch((error) => {
- actions.setSubmitting(false);
- });
+
+ if (editJournal && editJournal.id) {
+ requestEditManualJournal(editJournal.id, { ...values, entries: form })
+ .then((response) => {
+ AppToaster.show({
+ message: 'manual_journal_has_been_edited',
+ });
+ actions.setSubmitting(false);
+ }).catch((error) => {
+ actions.setSubmitting(false);
+ });
+ } else {
+ requestMakeJournalEntries({ ...values, entries: form })
+ .then((response) => {
+ AppToaster.show({
+ message: 'manual_journal_has_been_submit',
+ });
+ actions.setSubmitting(false);
+ }).catch((error) => {
+ actions.setSubmitting(false);
+ });
+ }
},
});
diff --git a/client/src/containers/Dashboard/Accounting/MakeJournalEntriesHeader.js b/client/src/containers/Dashboard/Accounting/MakeJournalEntriesHeader.js
index bf8ba92d9..761c8f696 100644
--- a/client/src/containers/Dashboard/Accounting/MakeJournalEntriesHeader.js
+++ b/client/src/containers/Dashboard/Accounting/MakeJournalEntriesHeader.js
@@ -21,12 +21,13 @@ export default function MakeJournalEntriesHeader({
}) {
const intl = useIntl();
- const handleDateChange = (date) => {
+ const handleDateChange = useCallback((date) => {
const formatted = moment(date).format('YYYY-MM-DD');
formik.setFieldValue('date', formatted);
- };
+ }, [formik]);
- const infoIcon = useMemo(() => (), []);
+ const infoIcon = useMemo(() =>
+ (), []);
return (