From 864d44396b3b268ea656bbb033091661080f46e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20DOREAU?= Date: Wed, 16 Sep 2020 16:53:30 +0200 Subject: [PATCH] fix(core): AND logic between group of filters --- packages/core/src/components/Table/Filters.tsx | 6 +++++- packages/core/src/components/Table/Table.tsx | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/core/src/components/Table/Filters.tsx b/packages/core/src/components/Table/Filters.tsx index b797783857..d7b0d682be 100644 --- a/packages/core/src/components/Table/Filters.tsx +++ b/packages/core/src/components/Table/Filters.tsx @@ -59,6 +59,10 @@ export type Filter = { | Without; }; +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({}); // Trigger re-rendering const handleClick = () => { diff --git a/packages/core/src/components/Table/Table.tsx b/packages/core/src/components/Table/Table.tsx index 4ab5dcd6f5..c2e91109de 100644 --- a/packages/core/src/components/Table/Table.tsx +++ b/packages/core/src/components/Table/Table.tsx @@ -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) => ( @@ -217,17 +217,19 @@ export function Table({ 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 {