fix(webapp): filter by customers, vendors and items in reports do not work

This commit is contained in:
Ahmed Bouhuolia
2023-08-20 01:59:44 +02:00
parent 5bf8a9e0ff
commit fbeb489128
41 changed files with 733 additions and 584 deletions

View File

@@ -1,43 +1,78 @@
// @ts-nocheck
import React, { useCallback } from 'react';
import { MenuItem } from '@blueprintjs/core';
import { MultiSelect } from '../MultiSelectTaggable';
import * as R from 'ramda';
import { FMultiSelect } from '../Forms';
import withDrawerActions from '@/containers/Drawer/withDrawerActions';
import { DRAWERS } from '@/constants/drawers';
/**
* Contacts multi-select component.
*/
export function ContactsMultiSelect({ ...multiSelectProps }) {
// Filters accounts items.
const filterContactsPredicater = useCallback(
(query, contact, _index, exactMatch) => {
const normalizedTitle = contact.display_name.toLowerCase();
const normalizedQuery = query.toLowerCase();
if (exactMatch) {
return normalizedTitle === normalizedQuery;
} else {
return normalizedTitle.indexOf(normalizedQuery) >= 0;
}
},
[],
);
export function ContactsMultiSelect({ allowCreate, ...multiSelectProps }) {
// Maybe inject new item props to select component.
const maybeCreateNewItemRenderer = allowCreate ? createNewItemRenderer : null;
const maybeCreateNewItemFromQuery = allowCreate
? createNewItemFromQuery
: null;
return (
<MultiSelect
itemRenderer={(contact, { selected, active, handleClick }) => (
<MenuItem
active={active}
icon={selected ? 'tick' : 'blank'}
text={contact.display_name}
key={contact.id}
onClick={handleClick}
/>
)}
<FMultiSelect
valueAccessor={'id'}
textAccessor={'display_name'}
tagAccessor={'display_name'}
popoverProps={{ minimal: true }}
fill={true}
itemPredicate={filterContactsPredicater}
tagRenderer={(item) => item.display_name}
createNewItemRenderer={maybeCreateNewItemRenderer}
createNewItemFromQuery={maybeCreateNewItemFromQuery}
{...multiSelectProps}
/>
);
}
/**
* Customers multi-select component.
*/
function CustomersMultiSelectRoot({
// #withDrawerAction
openDrawer,
closeDrawer,
...props
}) {
const handleCreateItemClick = () => {
openDrawer(DRAWERS.QUICK_CREATE_CUSTOMER);
};
return (
<ContactsMultiSelect
onCreateItemSelect={handleCreateItemClick}
{...props}
/>
);
}
/**
* Vendors multi-select component.
*/
function VendorsMultiSelectRoot({
// #withDrawerAction
openDrawer,
closeDrawer,
...props
}) {
const handleCreateItemClick = () => {
openDrawer(DRAWERS.QUICK_WRITE_VENDOR);
};
return (
<ContactsMultiSelect
onCreateItemSelect={handleCreateItemClick}
{...props}
/>
);
}
export const CustomersMultiSelect = R.compose(withDrawerActions)(
CustomersMultiSelectRoot,
);
export const VendorsMultiSelect = R.compose(withDrawerActions)(
VendorsMultiSelectRoot,
);

View File

@@ -1,49 +1,48 @@
// @ts-nocheck
import React, { useCallback } from 'react';
import { MenuItem } from '@blueprintjs/core';
import { MultiSelect } from '@/components';
import React from 'react';
import * as R from 'ramda';
import { FMultiSelect } from '@/components/Forms';
import withDialogActions from '@/containers/Dialog/withDialogActions';
/**
* Items multi-select.
*/
export function ItemsMultiSelect({ ...multiSelectProps }) {
// Filters accounts items.
const filterItemsPredicater = useCallback(
(query, item, _index, exactMatch) => {
const normalizedTitle = item.name.toLowerCase();
const normalizedQuery = query.toLowerCase();
function ItemsMultiSelectRoot({
// #withDialogAction
openDialog,
closeDialog,
if (exactMatch) {
return normalizedTitle === normalizedQuery;
} else {
return `${normalizedTitle} ${item.code}`.indexOf(normalizedQuery) >= 0;
}
},
[],
);
// #props
allowCreate,
...multiSelectProps
}) {
// Maybe inject new item props to select component.
const maybeCreateNewItemRenderer = allowCreate ? createNewItemRenderer : null;
const maybeCreateNewItemFromQuery = allowCreate
? createNewItemFromQuery
: null;
// Handles the create item click.
const handleCreateItemClick = () => {
openDialog(DialogsName.AccountForm);
};
return (
<MultiSelect
itemRenderer={(item, { selected, handleClick, active }) => (
<MenuItem
active={active}
icon={selected ? 'tick' : 'blank'}
text={item.name}
label={item.code}
key={item.id}
onClick={handleClick}
/>
)}
popoverProps={{ minimal: true, usePortal: false, targetTagName: 'div ' }}
<FMultiSelect
valueAccessor={'id'}
textAccessor={'name'}
labelAccessor={'code'}
tagAccessor={'name'}
fill={true}
itemPredicate={filterItemsPredicater}
tagRenderer={(item) => item.name}
popoverProps={{ minimal: true }}
resetOnSelect={true}
createNewItemRenderer={maybeCreateNewItemRenderer}
createNewItemFromQuery={maybeCreateNewItemFromQuery}
onCreateItemSelect={handleCreateItemClick}
{...multiSelectProps}
/>
);
}
ItemsMultiSelect.defaultProps = {
initialSelectedItems: [],
};
export const ItemsMultiSelect =
R.compose(withDialogActions)(ItemsMultiSelectRoot);