From 18d9c534131db212bf19ae640669d6c8373b5b03 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Tue, 10 Nov 2020 13:06:11 +0200 Subject: [PATCH] fix: filtering accounts list. --- client/src/components/AccountsSelectList.js | 36 ++++++++++++++++--- .../DataTableCells/AccountsListFieldCell.js | 21 ++++++++--- .../containers/Expenses/ExpenseFormHeader.js | 9 ++--- .../src/containers/Expenses/ExpenseTable.js | 9 +---- client/src/containers/Items/ItemFormBody.js | 2 ++ .../PaymentMades/PaymentMadeFormHeader.js | 8 ++--- .../PaymentReceiveFormHeader.js | 9 ++--- 7 files changed, 57 insertions(+), 37 deletions(-) diff --git a/client/src/components/AccountsSelectList.js b/client/src/components/AccountsSelectList.js index 68e079184..de1511753 100644 --- a/client/src/components/AccountsSelectList.js +++ b/client/src/components/AccountsSelectList.js @@ -2,6 +2,7 @@ import React, { useCallback, useState, useEffect, useMemo } from 'react'; import { MenuItem, Button } from '@blueprintjs/core'; import { Select } from '@blueprintjs/select'; import { FormattedMessage as T } from 'react-intl'; +import { isEmpty } from 'lodash'; export default function AccountsSelectList({ accounts, @@ -10,11 +11,36 @@ export default function AccountsSelectList({ defaultSelectText = 'Select account', onAccountSelected, disabled = false, + filterByRootTypes = [], + filterByTypes = [], + filterByNormal }) { + // Filters accounts based on filter props. + const filteredAccounts = useMemo(() => { + let filteredAccounts = [...accounts]; + + if (!isEmpty(filterByRootTypes)) { + filteredAccounts = filteredAccounts.filter( + (account) => filterByRootTypes.indexOf(account.type.root_type) !== -1, + ); + } + if (!isEmpty(filterByTypes)) { + filteredAccounts = filteredAccounts.filter( + (account) => filterByTypes.indexOf(account.type.key) !== -1, + ); + } + if (!isEmpty(filterByNormal)) { + filteredAccounts = filteredAccounts.filter( + (account) => filterByTypes.indexOf(account.type.normal) === filterByNormal, + ); + } + return filteredAccounts; + }, [accounts, filterByRootTypes, filterByTypes, filterByNormal]); + // Find initial account object to set it as default account in initial render. const initialAccount = useMemo( - () => accounts.find((a) => a.id === initialAccountId), - [initialAccountId], + () => filteredAccounts.find((a) => a.id === initialAccountId), + [initialAccountId, filteredAccounts], ); const [selectedAccount, setSelectedAccount] = useState( @@ -24,11 +50,11 @@ export default function AccountsSelectList({ useEffect(() => { if (typeof selectedAccountId !== 'undefined') { const account = selectedAccountId - ? accounts.find((a) => a.id === selectedAccountId) + ? filteredAccounts.find((a) => a.id === selectedAccountId) : null; setSelectedAccount(account); } - }, [selectedAccountId, accounts, setSelectedAccount]); + }, [selectedAccountId, filteredAccounts, setSelectedAccount]); // Account item of select accounts field. const accountItem = useCallback((item, { handleClick, modifiers, query }) => { @@ -69,7 +95,7 @@ export default function AccountsSelectList({ return (