fix(core): AND logic between group of filters

This commit is contained in:
Rémi DOREAU
2020-09-16 16:53:30 +02:00
parent cc0af155e0
commit 864d44396b
2 changed files with 15 additions and 9 deletions
@@ -59,6 +59,10 @@ export type Filter = {
| Without<SelectProps, 'onChange'>;
};
export type SelectedFilters = {
[key: string]: string | string[];
};
type Props = {
filters: Filter[];
onChangeFilters: (arg: any) => any;
@@ -70,7 +74,7 @@ export const Filters = (props: Props) => {
const { onChangeFilters } = props;
const [filters, setFilters] = useState(props.filters);
const [selectedFilters, setSelectedFilters] = useState({});
const [selectedFilters, setSelectedFilters] = useState<SelectedFilters>({});
// Trigger re-rendering
const handleClick = () => {
+10 -8
View File
@@ -45,7 +45,7 @@ import MTable, {
Options,
} from 'material-table';
import React, { forwardRef, useState } from 'react';
import { Filters } from './Filters';
import { Filters, SelectedFilters } from './Filters';
const tableIcons = {
Add: forwardRef((props, ref: React.Ref<SVGSVGElement>) => (
@@ -217,17 +217,19 @@ export function Table<T extends object = {}>({
const getFieldByTitle = (titleValue: string | keyof T) =>
columns.find(el => el.title === titleValue)?.field;
const onChangeFilters = (selectedFilters: any) => {
const onChangeFilters = (selectedFilters: SelectedFilters) => {
const selectedFiltersArray = Object.values(selectedFilters);
if (selectedFiltersArray.flat().length) {
const newData = (props.data as any[]).filter(
el =>
!!Object.entries(selectedFilters).find(([key, value]) => {
if (Array.isArray(value)) {
return value.includes(el[getFieldByTitle(key)]);
}
return el[getFieldByTitle(key)] === value;
}),
!!Object.entries(selectedFilters)
.filter(([, value]) => !!value.length)
.every(([key, value]) => {
if (Array.isArray(value)) {
return value.includes(el[getFieldByTitle(key)]);
}
return el[getFieldByTitle(key)] === value;
}),
);
setTableData(newData);
} else {