From 3a7f8a4512c06b01e284673a33f05b71e1b9f362 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Sun, 25 Jul 2021 03:59:02 +0200 Subject: [PATCH] fix: Filter financial reports by items, customers or vendors. --- client/src/components/ContactsMultiSelect.js | 60 ++--- client/src/components/FinancialStatement.js | 13 +- .../src/components/Items/ItemsMultiSelect.js | 77 +++++++ client/src/components/Items/index.js | 1 + client/src/components/MultiSelect.js | 214 +++++++++--------- client/src/components/index.js | 3 + .../APAgingSummary/APAgingSummary.js | 3 +- .../APAgingSummary/APAgingSummaryHeader.js | 36 +-- .../APAgingSummaryHeaderGeneral.js | 38 +++- .../ARAgingSummary/ARAgingSummary.js | 5 +- .../ARAgingSummary/ARAgingSummaryHeader.js | 17 +- .../ARAgingSummaryHeaderGeneral.js | 26 ++- .../BalanceSheet/BalanceSheetHeader.js | 33 +-- .../CashFlowStatementHeader.js | 18 +- .../CustomersBalanceSummaryGeneralPanel.js | 44 +++- .../CustomersBalanceSummaryHeader.js | 15 +- .../CustomersBalanceSummaryProvider.js | 15 +- .../CustomersTransactionsHeader.js | 21 +- ...CustomersTransactionsHeaderGeneralPanel.js | 32 +++ .../CustomersTransactionsProvider.js | 14 +- .../GeneralLedger/GeneralLedgerHeader.js | 21 +- .../InventoryItemDetails.js | 10 +- .../InventoryItemDetailsHeader.js | 23 +- .../InventoryItemDetailsHeaderGeneralPanel.js | 33 +++ .../InventoryItemDetailsProvider.js | 16 +- .../InventoryValuation/InventoryValuation.js | 2 +- .../InventoryValuationHeader.js | 20 +- .../InventoryValuationHeaderGeneralPanel.js | 37 ++- .../InventoryValuationProvider.js | 14 +- .../PurchasesByItems/PurchasesByItems.js | 2 +- .../PurchasesByItemsGeneralPanel.js | 34 +++ .../PurchasesByItemsHeader.js | 26 ++- .../PurchasesByItemsProvider.js | 17 +- .../SalesByItems/SalesByItemProvider.js | 14 +- .../SalesByItems/SalesByItems.js | 2 +- .../SalesByItemsHeaderGeneralPanel.js | 32 +++ .../TrialBalanceSheetHeader.js | 35 ++- .../VendorsBalanceSummaryHeader.js | 11 +- .../VendorsBalanceSummaryHeaderGeneral.js | 34 ++- .../VendorsBalanceSummaryProvider.js | 16 +- .../VendorsTransactionsHeader.js | 19 +- .../VendorsTransactionsHeaderGeneralPanel.js | 29 +++ .../VendorsTransactionsProvider.js | 15 +- .../containers/FinancialStatements/common.js | 2 +- client/src/lang/en/index.json | 9 +- .../FinancialStatements/ARAgingSummary.scss | 9 + .../SalesAndPurchasesSheet.scss | 20 ++ client/src/utils.js | 11 +- .../CustomerBalanceSummary/index.ts | 7 + .../InventoryDetails/index.ts | 4 + .../InventoryValuationSheet.ts | 4 + .../FinancialStatements/PurchasesByItem.ts | 6 + .../FinancialStatements/SalesByItems.ts | 4 + .../TransactionsByCustomers/index.ts | 23 +- .../TransactionsByVendors/index.ts | 16 +- .../VendorBalanceSummary/index.ts | 4 + .../interfaces/IInventoryValuationSheet.ts | 1 + server/src/interfaces/InventoryDetails.ts | 1 + server/src/interfaces/SalesByItemsSheet.ts | 1 + .../src/interfaces/TransactionsByCustomers.ts | 4 +- .../src/interfaces/TransactionsByVendors.ts | 4 +- .../AgingSummary/ARAgingSummaryService.ts | 2 +- .../InventoryDetailsRepository.ts | 11 +- .../InventoryDetailsService.ts | 7 +- .../InventoryValuationSheetService.ts | 13 +- .../PurchasesByItemsService.ts | 9 +- .../SalesByItems/SalesByItemsService.ts | 10 +- .../TransactionsByCustomersRepository.ts | 12 +- .../TransactionsByCustomersService.ts | 4 +- .../TransactionsByVendorRepository.ts | 17 +- .../TransactionsByVendorService.ts | 9 +- 71 files changed, 1021 insertions(+), 350 deletions(-) create mode 100644 client/src/components/Items/ItemsMultiSelect.js create mode 100644 client/src/components/Items/index.js diff --git a/client/src/components/ContactsMultiSelect.js b/client/src/components/ContactsMultiSelect.js index 5c8171294..75755ab9a 100644 --- a/client/src/components/ContactsMultiSelect.js +++ b/client/src/components/ContactsMultiSelect.js @@ -1,58 +1,57 @@ -import React, { useMemo, useCallback, useState } from 'react'; +import React, { useCallback, useState } from 'react'; import { MenuItem, Button } from '@blueprintjs/core'; -import { omit } from 'lodash'; +import intl from 'react-intl-universal'; import MultiSelect from 'components/MultiSelect'; import { FormattedMessage as T } from 'components'; -import intl from 'react-intl-universal'; +import { safeInvoke } from 'utils'; +/** + * Contacts multi-select component. + */ export default function ContactsMultiSelect({ contacts, defaultText = , buttonProps, - onCustomerSelected: onContactSelected, - ...selectProps + onContactSelect, + contactsSelected = [], + ...multiSelectProps }) { - const [selectedContacts, setSelectedContacts] = useState({}); + const [localSelected, setLocalSelected] = useState([ ...contactsSelected]); - const isContactSelect = useCallback( - (id) => typeof selectedContacts[id] !== 'undefined', - [selectedContacts], + // Detarmines the given id is selected. + const isItemSelected = useCallback( + (id) => localSelected.some(s => s === id), + [localSelected], ); + // Contact item renderer. const contactRenderer = useCallback( (contact, { handleClick }) => ( ), - [isContactSelect], + [isItemSelected], ); - const countSelected = useMemo( - () => Object.values(selectedContacts).length, - [selectedContacts], - ); + // Count selected items. + const countSelected = localSelected.length; - const onContactSelect = useCallback( + // Handle item selected. + const handleItemSelect = useCallback( ({ id }) => { - const selected = { - ...(isContactSelect(id) - ? { - ...omit(selectedContacts, [id]), - } - : { - ...selectedContacts, - [id]: true, - }), - }; - setSelectedContacts({ ...selected }); - onContactSelected && onContactSelected(selected); + const selected = isItemSelected(id) + ? localSelected.filter(s => s !== id) + : [...localSelected, id]; + + setLocalSelected([ ...selected ]); + safeInvoke(onContactSelect, selected); }, - [setSelectedContacts, selectedContacts, isContactSelect, onContactSelected], + [setLocalSelected, localSelected, isItemSelected, onContactSelect], ); return ( @@ -62,7 +61,8 @@ export default function ContactsMultiSelect({ itemRenderer={contactRenderer} popoverProps={{ minimal: true }} filterable={true} - onItemSelect={onContactSelect} + onItemSelect={handleItemSelect} + {...multiSelectProps} >