fix: ensure items entries has one empty line atleast.

This commit is contained in:
a.bouhuolia
2021-08-03 21:41:53 +02:00
parent 6cd6bd8700
commit 1f3ed79f2a
5 changed files with 84 additions and 25 deletions

View File

@@ -1,4 +1,5 @@
import { sumBy } from 'lodash'; import { sumBy, isEmpty, last } from 'lodash';
import * as R from 'ramda';
import { toSafeNumber } from 'utils'; import { toSafeNumber } from 'utils';
/** /**
@@ -36,4 +37,19 @@ export const ITEM_TYPE = {
*/ */
export function getEntriesTotal(entries) { export function getEntriesTotal(entries) {
return sumBy(entries, 'amount'); return sumBy(entries, 'amount');
} }
/**
* Ensure the given entries have enough empty line on the last.
* @param {Object} defaultEntry - Default entry.
* @param {Array} entries - Entries.
* @return {Array}
*/
export const ensureEntriesHaveEmptyLine = R.curry((defaultEntry, entries) => {
const lastEntry = last(entries);
if (isEmpty(lastEntry.account_id) || isEmpty(lastEntry.amount)) {
return [...entries, defaultEntry];
}
return entries;
});

View File

@@ -1,5 +1,6 @@
import moment from 'moment'; import moment from 'moment';
import intl from 'react-intl-universal'; import intl from 'react-intl-universal';
import * as R from 'ramda';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { AppToaster } from 'components'; import { AppToaster } from 'components';
import { import {
@@ -7,6 +8,10 @@ import {
transformToForm, transformToForm,
repeatValue, repeatValue,
} from 'utils'; } from 'utils';
import {
updateItemsEntriesTotal,
ensureEntriesHaveEmptyLine,
} from 'containers/Entries/utils';
export const MIN_LINES_NUMBER = 4; export const MIN_LINES_NUMBER = 4;
@@ -33,17 +38,23 @@ export const defaultBill = {
}; };
export const transformToEditForm = (bill) => { export const transformToEditForm = (bill) => {
const initialEntries = [
...bill.entries.map((bill) => ({
...transformToForm(bill, defaultBill.entries[0]),
})),
...repeatValue(
defaultBill,
Math.max(MIN_LINES_NUMBER - bill.entries.length, 0),
),
];
const entries = R.compose(
ensureEntriesHaveEmptyLine(defaultBillEntry),
updateItemsEntriesTotal,
)(initialEntries);
return { return {
...transformToForm(bill, defaultBill), ...transformToForm(bill, defaultBill),
entries: [ entries,
...bill.entries.map((bill) => ({
...transformToForm(bill, defaultBill.entries[0]),
})),
...repeatValue(
defaultBill,
Math.max(MIN_LINES_NUMBER - bill.entries.length, 0),
),
],
}; };
}; };

View File

@@ -1,12 +1,17 @@
import React from 'react'; import React from 'react';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import moment from 'moment'; import moment from 'moment';
import * as R from 'ramda';
import { import {
defaultFastFieldShouldUpdate, defaultFastFieldShouldUpdate,
transactionNumber, transactionNumber,
repeatValue, repeatValue,
transformToForm, transformToForm,
} from 'utils'; } from 'utils';
import {
updateItemsEntriesTotal,
ensureEntriesHaveEmptyLine,
} from 'containers/Entries/utils';
export const MIN_LINES_NUMBER = 4; export const MIN_LINES_NUMBER = 4;
@@ -32,9 +37,8 @@ export const defaultEstimate = {
entries: [...repeatValue(defaultEstimateEntry, MIN_LINES_NUMBER)], entries: [...repeatValue(defaultEstimateEntry, MIN_LINES_NUMBER)],
}; };
export const transformToEditForm = (estimate) => ({ export const transformToEditForm = (estimate) => {
...transformToForm(estimate, defaultEstimate), const initialEntries = [
entries: [
...estimate.entries.map((estimate) => ({ ...estimate.entries.map((estimate) => ({
...transformToForm(estimate, defaultEstimateEntry), ...transformToForm(estimate, defaultEstimateEntry),
})), })),
@@ -42,8 +46,17 @@ export const transformToEditForm = (estimate) => ({
defaultEstimateEntry, defaultEstimateEntry,
Math.max(MIN_LINES_NUMBER - estimate.entries.length, 0), Math.max(MIN_LINES_NUMBER - estimate.entries.length, 0),
), ),
], ];
}); const entries = R.compose(
ensureEntriesHaveEmptyLine(defaultEstimateEntry),
updateItemsEntriesTotal,
)(initialEntries);
return {
...transformToForm(estimate, defaultEstimate),
entries
}
};
/** /**
* Syncs estimate number of the settings with the context form. * Syncs estimate number of the settings with the context form.

View File

@@ -1,13 +1,11 @@
import React from 'react'; import React from 'react';
import moment from 'moment'; import moment from 'moment';
import { isEmpty } from 'lodash';
import { import {
compose, compose,
transformToForm, transformToForm,
repeatValue, repeatValue,
transactionNumber, transactionNumber,
} from 'utils'; } from 'utils';
import { updateItemsEntriesTotal } from 'containers/Entries/utils';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
@@ -15,6 +13,10 @@ import { defaultFastFieldShouldUpdate } from 'utils';
import intl from 'react-intl-universal'; import intl from 'react-intl-universal';
import { ERROR } from 'common/errors'; import { ERROR } from 'common/errors';
import { AppToaster } from 'components'; import { AppToaster } from 'components';
import {
updateItemsEntriesTotal,
ensureEntriesHaveEmptyLine,
} from 'containers/Entries/utils';
export const MIN_LINES_NUMBER = 4; export const MIN_LINES_NUMBER = 4;
@@ -47,7 +49,7 @@ export const defaultInvoice = {
* Transform invoice to initial values in edit mode. * Transform invoice to initial values in edit mode.
*/ */
export function transformToEditForm(invoice) { export function transformToEditForm(invoice) {
const entries = compose(updateItemsEntriesTotal)([ const initialEntries = [
...invoice.entries.map((invoice) => ({ ...invoice.entries.map((invoice) => ({
...transformToForm(invoice, defaultInvoiceEntry), ...transformToForm(invoice, defaultInvoiceEntry),
})), })),
@@ -55,7 +57,11 @@ export function transformToEditForm(invoice) {
defaultInvoiceEntry, defaultInvoiceEntry,
Math.max(MIN_LINES_NUMBER - invoice.entries.length, 0), Math.max(MIN_LINES_NUMBER - invoice.entries.length, 0),
), ),
]); ];
const entries = compose(
ensureEntriesHaveEmptyLine(defaultInvoiceEntry),
updateItemsEntriesTotal,
)(initialEntries);
return { return {
...transformToForm(invoice, defaultInvoice), ...transformToForm(invoice, defaultInvoice),

View File

@@ -1,12 +1,17 @@
import React from 'react'; import React from 'react';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import moment from 'moment'; import moment from 'moment';
import * as R from 'ramda';
import { import {
defaultFastFieldShouldUpdate, defaultFastFieldShouldUpdate,
transactionNumber, transactionNumber,
repeatValue, repeatValue,
transformToForm, transformToForm,
} from 'utils'; } from 'utils';
import {
updateItemsEntriesTotal,
ensureEntriesHaveEmptyLine,
} from 'containers/Entries/utils';
export const MIN_LINES_NUMBER = 4; export const MIN_LINES_NUMBER = 4;
@@ -35,9 +40,8 @@ export const defaultReceipt = {
/** /**
* Transform to form in edit mode. * Transform to form in edit mode.
*/ */
export const transformToEditForm = (receipt) => ({ export const transformToEditForm = (receipt) => {
...transformToForm(receipt, defaultReceipt), const initialEntries = [
entries: [
...receipt.entries.map((entry) => ({ ...receipt.entries.map((entry) => ({
...transformToForm(entry, defaultReceiptEntry), ...transformToForm(entry, defaultReceiptEntry),
})), })),
@@ -45,8 +49,17 @@ export const transformToEditForm = (receipt) => ({
defaultReceiptEntry, defaultReceiptEntry,
Math.max(MIN_LINES_NUMBER - receipt.entries.length, 0), Math.max(MIN_LINES_NUMBER - receipt.entries.length, 0),
), ),
], ];
}); const entries = R.compose(
ensureEntriesHaveEmptyLine(defaultReceiptEntry),
updateItemsEntriesTotal,
)(initialEntries);
return {
...transformToForm(receipt, defaultReceipt),
entries,
};
};
export const useObserveReceiptNoSettings = (prefix, nextNumber) => { export const useObserveReceiptNoSettings = (prefix, nextNumber) => {
const { setFieldValue } = useFormikContext(); const { setFieldValue } = useFormikContext();