mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-21 15:20:34 +00:00
fix(ManualJournal): manual journal auto-increment dialog.
This commit is contained in:
@@ -2,7 +2,7 @@ import React, { useMemo } from 'react';
|
|||||||
import { Formik, Form } from 'formik';
|
import { Formik, Form } from 'formik';
|
||||||
import { Intent } from '@blueprintjs/core';
|
import { Intent } from '@blueprintjs/core';
|
||||||
import { useIntl } from 'react-intl';
|
import { useIntl } from 'react-intl';
|
||||||
import { defaultTo, isEmpty } from 'lodash';
|
import { defaultTo, isEmpty, omit } from 'lodash';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { useHistory } from 'react-router-dom';
|
import { useHistory } from 'react-router-dom';
|
||||||
|
|
||||||
@@ -36,6 +36,7 @@ function MakeJournalEntriesForm({
|
|||||||
// #withSettings
|
// #withSettings
|
||||||
journalNextNumber,
|
journalNextNumber,
|
||||||
journalNumberPrefix,
|
journalNumberPrefix,
|
||||||
|
journalAutoIncrement,
|
||||||
baseCurrency,
|
baseCurrency,
|
||||||
}) {
|
}) {
|
||||||
// Journal form context.
|
// Journal form context.
|
||||||
@@ -64,7 +65,9 @@ function MakeJournalEntriesForm({
|
|||||||
}
|
}
|
||||||
: {
|
: {
|
||||||
...defaultManualJournal,
|
...defaultManualJournal,
|
||||||
journal_number: defaultTo(journalNumber, ''),
|
...(journalAutoIncrement) && ({
|
||||||
|
journal_number: defaultTo(journalNumber, ''),
|
||||||
|
}),
|
||||||
currency_code: defaultTo(baseCurrency, ''),
|
currency_code: defaultTo(baseCurrency, ''),
|
||||||
entries: orderingLinesIndexes(defaultManualJournal.entries),
|
entries: orderingLinesIndexes(defaultManualJournal.entries),
|
||||||
}),
|
}),
|
||||||
@@ -106,7 +109,14 @@ function MakeJournalEntriesForm({
|
|||||||
setSubmitting(false);
|
setSubmitting(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const form = { ...values, publish: submitPayload.publish, entries };
|
const form = {
|
||||||
|
...omit(values, ['journal_number', 'journal_number_manually']),
|
||||||
|
...(values.journal_number_manually) && ({
|
||||||
|
journal_number: values.journal_number,
|
||||||
|
}),
|
||||||
|
entries,
|
||||||
|
publish: submitPayload.publish,
|
||||||
|
};
|
||||||
|
|
||||||
// Handle the request error.
|
// Handle the request error.
|
||||||
const handleError = ({
|
const handleError = ({
|
||||||
@@ -182,6 +192,7 @@ export default compose(
|
|||||||
withSettings(({ manualJournalsSettings, organizationSettings }) => ({
|
withSettings(({ manualJournalsSettings, organizationSettings }) => ({
|
||||||
journalNextNumber: parseInt(manualJournalsSettings?.nextNumber, 10),
|
journalNextNumber: parseInt(manualJournalsSettings?.nextNumber, 10),
|
||||||
journalNumberPrefix: manualJournalsSettings?.numberPrefix,
|
journalNumberPrefix: manualJournalsSettings?.numberPrefix,
|
||||||
|
journalAutoIncrement: manualJournalsSettings?.autoIncrement,
|
||||||
baseCurrency: organizationSettings?.baseCurrency,
|
baseCurrency: organizationSettings?.baseCurrency,
|
||||||
})),
|
})),
|
||||||
)(MakeJournalEntriesForm);
|
)(MakeJournalEntriesForm);
|
||||||
|
|||||||
@@ -11,7 +11,13 @@ import { FormattedMessage as T } from 'react-intl';
|
|||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
|
||||||
import { CLASSES } from 'common/classes';
|
import { CLASSES } from 'common/classes';
|
||||||
import { momentFormatter, tansformDateValue, saveInvoke } from 'utils';
|
import {
|
||||||
|
momentFormatter,
|
||||||
|
compose,
|
||||||
|
inputIntent,
|
||||||
|
handleDateChange,
|
||||||
|
tansformDateValue,
|
||||||
|
} from 'utils';
|
||||||
import {
|
import {
|
||||||
Hint,
|
Hint,
|
||||||
FieldHint,
|
FieldHint,
|
||||||
@@ -20,12 +26,10 @@ import {
|
|||||||
InputPrependButton,
|
InputPrependButton,
|
||||||
CurrencySelectList,
|
CurrencySelectList,
|
||||||
} from 'components';
|
} from 'components';
|
||||||
|
import withSettings from 'containers/Settings/withSettings';
|
||||||
import { useMakeJournalFormContext } from './MakeJournalProvider';
|
import { useMakeJournalFormContext } from './MakeJournalProvider';
|
||||||
import withDialogActions from 'containers/Dialog/withDialogActions';
|
import withDialogActions from 'containers/Dialog/withDialogActions';
|
||||||
|
import { useObserveJournalNoSettings } from './utils';
|
||||||
import { compose, inputIntent, handleDateChange } from 'utils';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make journal entries header.
|
* Make journal entries header.
|
||||||
*/
|
*/
|
||||||
@@ -35,6 +39,11 @@ function MakeJournalEntriesHeader({
|
|||||||
|
|
||||||
// #withDialog
|
// #withDialog
|
||||||
openDialog,
|
openDialog,
|
||||||
|
|
||||||
|
// #withSettings
|
||||||
|
journalAutoIncrement,
|
||||||
|
journalNextNumber,
|
||||||
|
journalNumberPrefix,
|
||||||
}) {
|
}) {
|
||||||
const { currencies } = useMakeJournalFormContext();
|
const { currencies } = useMakeJournalFormContext();
|
||||||
|
|
||||||
@@ -43,11 +52,22 @@ function MakeJournalEntriesHeader({
|
|||||||
openDialog('journal-number-form', {});
|
openDialog('journal-number-form', {});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Handle journal number field blur event.
|
// Handle journal number blur.
|
||||||
const handleJournalNumberChanged = (event) => {
|
const handleJournalNoBlur = (form, field) => (event) => {
|
||||||
saveInvoke(onJournalNumberChanged, event.currentTarget.value);
|
const newValue = event.target.value;
|
||||||
|
|
||||||
|
if (field.value !== newValue) {
|
||||||
|
openDialog('journal-number-form', {
|
||||||
|
initialFormValues: {
|
||||||
|
manualTransactionNo: newValue,
|
||||||
|
incrementMode: 'manual-transaction',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useObserveJournalNoSettings(journalNumberPrefix, journalNextNumber);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames(CLASSES.PAGE_FORM_HEADER_FIELDS)}>
|
<div className={classNames(CLASSES.PAGE_FORM_HEADER_FIELDS)}>
|
||||||
{/*------------ Posting date -----------*/}
|
{/*------------ Posting date -----------*/}
|
||||||
@@ -100,8 +120,9 @@ function MakeJournalEntriesHeader({
|
|||||||
<ControlGroup fill={true}>
|
<ControlGroup fill={true}>
|
||||||
<InputGroup
|
<InputGroup
|
||||||
fill={true}
|
fill={true}
|
||||||
{...field}
|
value={field.value}
|
||||||
onBlur={handleJournalNumberChanged}
|
asyncControl={true}
|
||||||
|
onBlur={handleJournalNoBlur(form, field)}
|
||||||
/>
|
/>
|
||||||
<InputPrependButton
|
<InputPrependButton
|
||||||
buttonProps={{
|
buttonProps={{
|
||||||
@@ -183,4 +204,9 @@ function MakeJournalEntriesHeader({
|
|||||||
|
|
||||||
export default compose(
|
export default compose(
|
||||||
withDialogActions,
|
withDialogActions,
|
||||||
|
withSettings(({ manualJournalsSettings }) => ({
|
||||||
|
journalAutoIncrement: manualJournalsSettings?.autoIncrement,
|
||||||
|
journalNextNumber: manualJournalsSettings?.nextNumber,
|
||||||
|
journalNumberPrefix: manualJournalsSettings?.numberPrefix,
|
||||||
|
})),
|
||||||
)(MakeJournalEntriesHeader);
|
)(MakeJournalEntriesHeader);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useFormikContext } from 'formik';
|
import { useFormikContext } from 'formik';
|
||||||
import JournalNumberDialog from 'containers/Dialogs/JournalNumberDialog';
|
import JournalNumberDialog from 'containers/Dialogs/JournalNumberDialog';
|
||||||
import { transactionNumber } from 'utils';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make journal form dialogs.
|
* Make journal form dialogs.
|
||||||
@@ -10,11 +9,9 @@ export default function MakeJournalFormDialogs() {
|
|||||||
const { setFieldValue } = useFormikContext();
|
const { setFieldValue } = useFormikContext();
|
||||||
|
|
||||||
// Update the form once the journal number form submit confirm.
|
// Update the form once the journal number form submit confirm.
|
||||||
const handleConfirm = (values) => {
|
const handleConfirm = ({ manually, incrementNumber }) => {
|
||||||
setFieldValue(
|
setFieldValue('journal_number', incrementNumber || '');
|
||||||
'journal_number',
|
setFieldValue('journal_number_manually', manually);
|
||||||
transactionNumber(values.number_prefix, values.next_number),
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -17,19 +17,19 @@ const MakeJournalFormContext = createContext();
|
|||||||
*/
|
*/
|
||||||
function MakeJournalProvider({ journalId, ...props }) {
|
function MakeJournalProvider({ journalId, ...props }) {
|
||||||
// Load the accounts list.
|
// Load the accounts list.
|
||||||
const { data: accounts, isFetching: isAccountsLoading } = useAccounts();
|
const { data: accounts, isLoading: isAccountsLoading } = useAccounts();
|
||||||
|
|
||||||
// Load the customers list.
|
// Load the customers list.
|
||||||
const {
|
const {
|
||||||
data: { customers },
|
data: { customers },
|
||||||
isFetching: isCustomersLoading,
|
isLoading: isCustomersLoading,
|
||||||
} = useCustomers();
|
} = useCustomers();
|
||||||
|
|
||||||
// Load the currencies list.
|
// Load the currencies list.
|
||||||
const { data: currencies, isFetching: isCurrenciesLoading } = useCurrencies();
|
const { data: currencies, isLoading: isCurrenciesLoading } = useCurrencies();
|
||||||
|
|
||||||
// Load the details of the given manual journal.
|
// Load the details of the given manual journal.
|
||||||
const { data: manualJournal, isFetching: isJournalLoading } = useJournal(
|
const { data: manualJournal, isLoading: isJournalLoading } = useJournal(
|
||||||
journalId,
|
journalId,
|
||||||
{
|
{
|
||||||
enabled: !!journalId,
|
enabled: !!journalId,
|
||||||
@@ -40,7 +40,7 @@ function MakeJournalProvider({ journalId, ...props }) {
|
|||||||
const { mutateAsync: editJournalMutate } = useEditJournal();
|
const { mutateAsync: editJournalMutate } = useEditJournal();
|
||||||
|
|
||||||
// Loading the journal settings.
|
// Loading the journal settings.
|
||||||
const { isFetching: isSettingsLoading } = useSettings();
|
const { isLoading: isSettingsLoading } = useSettings();
|
||||||
|
|
||||||
// Submit form payload.
|
// Submit form payload.
|
||||||
const [submitPayload, setSubmitPayload] = useState({});
|
const [submitPayload, setSubmitPayload] = useState({});
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Intent } from '@blueprintjs/core';
|
import { Intent } from '@blueprintjs/core';
|
||||||
import { sumBy, setWith, toSafeInteger, get } from 'lodash';
|
import { sumBy, setWith, toSafeInteger, get, values } from 'lodash';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
|
|
||||||
import { updateTableRow, repeatValue, transformToForm } from 'utils';
|
import {
|
||||||
|
transactionNumber,
|
||||||
|
updateTableRow,
|
||||||
|
repeatValue,
|
||||||
|
transformToForm,
|
||||||
|
} from 'utils';
|
||||||
import { AppToaster } from 'components';
|
import { AppToaster } from 'components';
|
||||||
import { formatMessage } from 'services/intl';
|
import { formatMessage } from 'services/intl';
|
||||||
|
import { useFormikContext } from 'formik';
|
||||||
|
|
||||||
const ERROR = {
|
const ERROR = {
|
||||||
JOURNAL_NUMBER_ALREADY_EXISTS: 'JOURNAL.NUMBER.ALREADY.EXISTS',
|
JOURNAL_NUMBER_ALREADY_EXISTS: 'JOURNAL.NUMBER.ALREADY.EXISTS',
|
||||||
@@ -153,3 +159,12 @@ export const transformErrors = (resErrors, { setErrors, errors }) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const useObserveJournalNoSettings = (prefix, nextNumber) => {
|
||||||
|
const { setFieldValue } = useFormikContext();
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
const journalNo = transactionNumber(prefix, nextNumber);
|
||||||
|
setFieldValue('journal_number', journalNo);
|
||||||
|
}, [setFieldValue, prefix, nextNumber]);
|
||||||
|
};
|
||||||
|
|||||||
@@ -6,7 +6,11 @@ import ReferenceNumberForm from 'containers/JournalNumber/ReferenceNumberForm';
|
|||||||
|
|
||||||
import withDialogActions from 'containers/Dialog/withDialogActions';
|
import withDialogActions from 'containers/Dialog/withDialogActions';
|
||||||
import withSettings from 'containers/Settings/withSettings';
|
import withSettings from 'containers/Settings/withSettings';
|
||||||
import { saveInvoke, compose, optionsMapToArray } from 'utils';
|
import { saveInvoke, compose } from 'utils';
|
||||||
|
import {
|
||||||
|
transformFormToSettings,
|
||||||
|
transformSettingsToForm,
|
||||||
|
} from 'containers/JournalNumber/utils';
|
||||||
|
|
||||||
import 'style/pages/ManualJournal/JournalNumberDialog.scss'
|
import 'style/pages/ManualJournal/JournalNumberDialog.scss'
|
||||||
|
|
||||||
@@ -17,29 +21,38 @@ function JournalNumberDialogContent({
|
|||||||
// #withSettings
|
// #withSettings
|
||||||
nextNumber,
|
nextNumber,
|
||||||
numberPrefix,
|
numberPrefix,
|
||||||
|
autoIncrement,
|
||||||
|
|
||||||
// #withDialogActions
|
// #withDialogActions
|
||||||
closeDialog,
|
closeDialog,
|
||||||
|
|
||||||
// #ownProps
|
// #ownProps
|
||||||
onConfirm
|
onConfirm,
|
||||||
|
initialValues
|
||||||
}) {
|
}) {
|
||||||
const { isLoading: isSettingsLoading } = useSettingsManualJournals();
|
const { isLoading: isSettingsLoading } = useSettingsManualJournals();
|
||||||
const { mutateAsync: saveSettingsMutate } = useSaveSettings();
|
const { mutateAsync: saveSettingsMutate } = useSaveSettings();
|
||||||
|
|
||||||
// Handle the form submit.
|
// Handle the form submit.
|
||||||
const handleSubmitForm = (values, { setSubmitting }) => {
|
const handleSubmitForm = (values, { setSubmitting }) => {
|
||||||
const options = optionsMapToArray(values).map((option) => ({
|
// Transformes the form values to settings to save it.
|
||||||
key: option.key, ...option, group: 'manual_journals',
|
const options = transformFormToSettings(values, 'manual_journals');
|
||||||
}));
|
|
||||||
|
|
||||||
saveSettingsMutate({ options }).then(() => {
|
// Handle success.
|
||||||
|
const handleSuccess = () => {
|
||||||
setSubmitting(false);
|
setSubmitting(false);
|
||||||
closeDialog('journal-number-form');
|
closeDialog('journal-number-form');
|
||||||
saveInvoke(onConfirm, values);
|
saveInvoke(onConfirm, values);
|
||||||
}).catch(() => {
|
};
|
||||||
|
// Handle errors.
|
||||||
|
const handleErrors = () => {
|
||||||
setSubmitting(false);
|
setSubmitting(false);
|
||||||
});
|
};
|
||||||
|
if (values.incrementMode === 'manual-transaction') {
|
||||||
|
handleSuccess();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
saveSettingsMutate({ options }).then(handleSuccess).catch(handleErrors);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleClose = useCallback(() => {
|
const handleClose = useCallback(() => {
|
||||||
@@ -49,8 +62,14 @@ function JournalNumberDialogContent({
|
|||||||
return (
|
return (
|
||||||
<DialogContent isLoading={isSettingsLoading}>
|
<DialogContent isLoading={isSettingsLoading}>
|
||||||
<ReferenceNumberForm
|
<ReferenceNumberForm
|
||||||
initialNumber={nextNumber}
|
initialValues={{
|
||||||
initialPrefix={numberPrefix}
|
...transformSettingsToForm({
|
||||||
|
nextNumber,
|
||||||
|
numberPrefix,
|
||||||
|
autoIncrement,
|
||||||
|
}),
|
||||||
|
...initialValues,
|
||||||
|
}}
|
||||||
onSubmit={handleSubmitForm}
|
onSubmit={handleSubmitForm}
|
||||||
onClose={handleClose}
|
onClose={handleClose}
|
||||||
/>
|
/>
|
||||||
@@ -63,5 +82,6 @@ export default compose(
|
|||||||
withSettings(({ manualJournalsSettings }) => ({
|
withSettings(({ manualJournalsSettings }) => ({
|
||||||
nextNumber: manualJournalsSettings?.nextNumber,
|
nextNumber: manualJournalsSettings?.nextNumber,
|
||||||
numberPrefix: manualJournalsSettings?.numberPrefix,
|
numberPrefix: manualJournalsSettings?.numberPrefix,
|
||||||
|
autoIncrement: manualJournalsSettings?.autoIncrement,
|
||||||
})),
|
})),
|
||||||
)(JournalNumberDialogContent);
|
)(JournalNumberDialogContent);
|
||||||
@@ -8,14 +8,14 @@ const JournalNumberDialogContent = lazy(() => import('./JournalNumberDialogConte
|
|||||||
|
|
||||||
function JournalNumberDialog({
|
function JournalNumberDialog({
|
||||||
dialogName,
|
dialogName,
|
||||||
payload = { id: null },
|
payload: { initialFormValues },
|
||||||
isOpen,
|
isOpen,
|
||||||
onConfirm
|
onConfirm
|
||||||
}) {
|
}) {
|
||||||
|
|
||||||
const handleConfirm = (values) => {
|
const handleConfirm = (values) => {
|
||||||
saveInvoke(onConfirm, values)
|
saveInvoke(onConfirm, values)
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog
|
<Dialog
|
||||||
name={dialogName}
|
name={dialogName}
|
||||||
@@ -27,7 +27,7 @@ function JournalNumberDialog({
|
|||||||
>
|
>
|
||||||
<DialogSuspense>
|
<DialogSuspense>
|
||||||
<JournalNumberDialogContent
|
<JournalNumberDialogContent
|
||||||
journalNumberId={payload.id}
|
initialValues={{ ...initialFormValues }}
|
||||||
onConfirm={handleConfirm}
|
onConfirm={handleConfirm}
|
||||||
/>
|
/>
|
||||||
</DialogSuspense>
|
</DialogSuspense>
|
||||||
|
|||||||
Reference in New Issue
Block a user