refactor(webapp): Accounts Select and MultiSelect components

This commit is contained in:
a.bouhuolia
2023-04-30 17:33:15 +02:00
parent 83510cfa70
commit 6f0f47f38a
13 changed files with 341 additions and 481 deletions

View File

@@ -1,31 +1,79 @@
// @ts-nocheck
import React from 'react';
import React, { useMemo } from 'react';
import { MenuItem } from '@blueprintjs/core';
import { MultiSelect } from '../MultiSelectTaggable';
import { FMultiSelect } from '../Forms';
import { accountPredicate } from './_components';
import { filterAccountsByQuery, nestedArrayToflatten } from '@/utils';
import { MenuItemNestedText } from '../Menu';
export function AccountsMultiSelect({ ...multiSelectProps }) {
/**
* Default account item renderer of the list.
* @returns {JSX.Element}
*/
const accountRenderer = (
item,
{ handleClick, modifiers, query },
{ isSelected },
) => {
if (!modifiers.matchesPredicate) {
return null;
}
return (
<MultiSelect
itemRenderer={(
item,
{ active, selected, handleClick, modifiers, query },
) => {
return (
<MenuItem
active={active}
icon={selected ? 'tick' : 'blank'}
text={item.name}
label={item.code}
key={item.id}
onClick={handleClick}
/>
);
}}
<MenuItem
active={modifiers.active}
disabled={modifiers.disabled}
text={<MenuItemNestedText level={item.account_level} text={item.name} />}
key={item.id}
onClick={handleClick}
icon={isSelected ? 'tick' : 'blank'}
/>
);
};
/**
* Accounts multi-select field binded with Formik form.
* @param {*} param0
* @returns {JSX.Element}
*/
export function AccountsMultiSelect({
items,
filterByRootTypes,
filterByParentTypes,
filterByTypes,
filterByNormal,
...rest
}) {
// Filters accounts based on the given filter props.
const filteredAccounts = useMemo(() => {
const flattenAccounts = nestedArrayToflatten(items);
return filterAccountsByQuery(flattenAccounts, {
filterByRootTypes,
filterByParentTypes,
filterByTypes,
filterByNormal,
});
}, [
items,
filterByRootTypes,
filterByParentTypes,
filterByTypes,
filterByNormal,
]);
return (
<FMultiSelect
items={filteredAccounts}
valueAccessor={'id'}
textAccessor={'name'}
labelAccessor={'code'}
tagAccessor={'name'}
popoverProps={{ minimal: true }}
fill={true}
tagRenderer={(item) => item.name}
resetOnSelect={true}
{...multiSelectProps}
itemPredicate={accountPredicate}
itemRenderer={accountRenderer}
{...rest}
/>
);
}