mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-16 21:00:31 +00:00
feat(expenses): filter expenses accounts.
This commit is contained in:
@@ -3,7 +3,7 @@ import { MenuItem, Button } from '@blueprintjs/core';
|
||||
import { Select } from '@blueprintjs/select';
|
||||
import { FormattedMessage as T } from 'react-intl';
|
||||
import classNames from 'classnames';
|
||||
import { isEmpty } from 'lodash';
|
||||
import { filterAccountsByQuery } from './utils';
|
||||
import { CLASSES } from 'common/classes';
|
||||
|
||||
export default function AccountsSelectList({
|
||||
@@ -14,32 +14,30 @@ export default function AccountsSelectList({
|
||||
onAccountSelected,
|
||||
disabled = false,
|
||||
popoverFill = false,
|
||||
filterByParentTypes = [],
|
||||
filterByTypes = [],
|
||||
|
||||
filterByParentTypes,
|
||||
filterByTypes,
|
||||
filterByNormal,
|
||||
buttonProps = {}
|
||||
filterByRootTypes,
|
||||
|
||||
buttonProps = {},
|
||||
}) {
|
||||
// Filters accounts based on filter props.
|
||||
const filteredAccounts = useMemo(() => {
|
||||
let filteredAccounts = [...accounts];
|
||||
|
||||
if (!isEmpty(filterByParentTypes)) {
|
||||
filteredAccounts = filteredAccounts.filter(
|
||||
(account) => filterByParentTypes.indexOf(account.account_parent_type) !== -1,
|
||||
);
|
||||
}
|
||||
if (!isEmpty(filterByTypes)) {
|
||||
filteredAccounts = filteredAccounts.filter(
|
||||
(account) => filterByTypes.indexOf(account.account_type) !== -1,
|
||||
);
|
||||
}
|
||||
if (!isEmpty(filterByNormal)) {
|
||||
filteredAccounts = filteredAccounts.filter(
|
||||
(account) => filterByTypes.indexOf(account.account_normal) === filterByNormal,
|
||||
);
|
||||
}
|
||||
let filteredAccounts = filterAccountsByQuery(accounts, {
|
||||
filterByRootTypes,
|
||||
filterByParentTypes,
|
||||
filterByTypes,
|
||||
filterByNormal,
|
||||
});
|
||||
return filteredAccounts;
|
||||
}, [accounts, filterByParentTypes, filterByTypes, filterByNormal]);
|
||||
}, [
|
||||
accounts,
|
||||
filterByRootTypes,
|
||||
filterByParentTypes,
|
||||
filterByTypes,
|
||||
filterByNormal,
|
||||
]);
|
||||
|
||||
// Find initial account object to set it as default account in initial render.
|
||||
const initialAccount = useMemo(
|
||||
@@ -103,7 +101,11 @@ export default function AccountsSelectList({
|
||||
noResults={<MenuItem disabled={true} text={<T id={'no_accounts'} />} />}
|
||||
itemRenderer={accountItem}
|
||||
itemPredicate={filterAccountsPredicater}
|
||||
popoverProps={{ minimal: true, usePortal: !popoverFill, inline: popoverFill }}
|
||||
popoverProps={{
|
||||
minimal: true,
|
||||
usePortal: !popoverFill,
|
||||
inline: popoverFill,
|
||||
}}
|
||||
filterable={true}
|
||||
onItemSelect={onAccountSelect}
|
||||
disabled={disabled}
|
||||
|
||||
@@ -1,48 +1,47 @@
|
||||
import React, { useState, useCallback, useEffect, useMemo } from 'react';
|
||||
import { MenuItem } from '@blueprintjs/core';
|
||||
import { Suggest } from '@blueprintjs/select';
|
||||
import { isEmpty } from 'lodash';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { CLASSES } from 'common/classes';
|
||||
|
||||
import { FormattedMessage as T } from 'react-intl';
|
||||
import { filterAccountsByQuery } from './utils';
|
||||
|
||||
/**
|
||||
* Accounts suggest field.
|
||||
*/
|
||||
export default function AccountsSuggestField({
|
||||
accounts,
|
||||
initialAccountId,
|
||||
selectedAccountId,
|
||||
defaultSelectText = 'Select account',
|
||||
popoverFill = false,
|
||||
onAccountSelected,
|
||||
|
||||
filterByParentTypes = [],
|
||||
filterByTypes = [],
|
||||
filterByNormal,
|
||||
popoverFill = false,
|
||||
filterByRootTypes = [],
|
||||
|
||||
...suggestProps
|
||||
}) {
|
||||
// Filters accounts based on filter props.
|
||||
const filteredAccounts = useMemo(() => {
|
||||
let filteredAccounts = [...accounts];
|
||||
|
||||
if (!isEmpty(filterByParentTypes)) {
|
||||
filteredAccounts = filteredAccounts.filter(
|
||||
(account) => filterByParentTypes.indexOf(account.account_parent_type) !== -1,
|
||||
);
|
||||
}
|
||||
if (!isEmpty(filterByTypes)) {
|
||||
filteredAccounts = filteredAccounts.filter(
|
||||
(account) => filterByTypes.indexOf(account.account_type) !== -1,
|
||||
);
|
||||
}
|
||||
if (!isEmpty(filterByNormal)) {
|
||||
filteredAccounts = filteredAccounts.filter(
|
||||
(account) => filterByTypes.indexOf(account.account_normal) === filterByNormal,
|
||||
);
|
||||
}
|
||||
let filteredAccounts = filterAccountsByQuery(accounts, {
|
||||
filterByRootTypes,
|
||||
filterByParentTypes,
|
||||
filterByTypes,
|
||||
filterByNormal,
|
||||
});
|
||||
return filteredAccounts;
|
||||
}, [accounts, filterByParentTypes, filterByTypes, filterByNormal]);
|
||||
}, [
|
||||
accounts,
|
||||
filterByRootTypes,
|
||||
filterByParentTypes,
|
||||
filterByTypes,
|
||||
filterByNormal,
|
||||
]);
|
||||
|
||||
// Find initial account object to set it as default account in initial render.
|
||||
const initialAccount = useMemo(
|
||||
|
||||
@@ -7,12 +7,14 @@ import AccountsSuggestField from 'components/AccountsSuggestField';
|
||||
// import AccountsSelectList from 'components/AccountsSelectList';
|
||||
import { FormGroup, Classes, Intent } from '@blueprintjs/core';
|
||||
|
||||
// Account cell renderer.
|
||||
/**
|
||||
* Account cell renderer.
|
||||
*/
|
||||
export default function AccountCellRenderer({
|
||||
column: {
|
||||
id,
|
||||
accountsDataProp,
|
||||
filterAccountsByRootType,
|
||||
filterAccountsByRootTypes,
|
||||
filterAccountsByTypes,
|
||||
},
|
||||
row: { index, original },
|
||||
@@ -55,7 +57,7 @@ export default function AccountCellRenderer({
|
||||
accounts={accounts}
|
||||
onAccountSelected={handleAccountSelected}
|
||||
selectedAccountId={initialValue}
|
||||
filterByRootTypes={filterAccountsByRootType}
|
||||
filterByRootTypes={filterAccountsByRootTypes}
|
||||
filterByTypes={filterAccountsByTypes}
|
||||
inputProps={{
|
||||
inputRef: (ref) => (accountRef.current = ref),
|
||||
|
||||
46
client/src/components/utils.js
Normal file
46
client/src/components/utils.js
Normal file
@@ -0,0 +1,46 @@
|
||||
import { castArray, isEmpty, includes, pickBy } from 'lodash';
|
||||
|
||||
/**
|
||||
* Filters the given accounts of the given query.
|
||||
* @param {*} accounts
|
||||
* @param {*} queryProps
|
||||
* @returns {*}
|
||||
*/
|
||||
export const filterAccountsByQuery = (accounts, queryProps) => {
|
||||
const defaultQuery = {
|
||||
filterByParentTypes: [],
|
||||
filterByTypes: [],
|
||||
filterByNormal: [],
|
||||
filterByRootTypes: [],
|
||||
...pickBy(queryProps, v => v !== undefined),
|
||||
};
|
||||
const query = {
|
||||
filterByParentTypes: castArray(defaultQuery.filterByParentTypes),
|
||||
filterByTypes: castArray(defaultQuery.filterByTypes),
|
||||
filterByNormal: castArray(defaultQuery.filterByNormal),
|
||||
filterByRootTypes: castArray(defaultQuery.filterByRootTypes),
|
||||
};
|
||||
let filteredAccounts = [...accounts];
|
||||
|
||||
if (!isEmpty(query.filterByParentTypes)) {
|
||||
filteredAccounts = filteredAccounts.filter((account) =>
|
||||
includes(query.filterByParentTypes, account.account_parent_type),
|
||||
);
|
||||
}
|
||||
if (!isEmpty(query.filterByTypes)) {
|
||||
filteredAccounts = filteredAccounts.filter((account) =>
|
||||
includes(query.filterByTypes, account.account_type),
|
||||
);
|
||||
}
|
||||
if (!isEmpty(query.filterByNormal)) {
|
||||
filteredAccounts = filteredAccounts.filter((account) =>
|
||||
includes(query.filterByTypes, account.account_normal),
|
||||
);
|
||||
}
|
||||
if (!isEmpty(query.filterByRootTypes)) {
|
||||
filteredAccounts = filteredAccounts.filter((account) =>
|
||||
includes(query.filterByRootTypes, account.account_root_type),
|
||||
);
|
||||
}
|
||||
return filteredAccounts;
|
||||
};
|
||||
Reference in New Issue
Block a user