feat(core): add filters clear

This commit is contained in:
Rémi DOREAU
2020-09-18 15:40:05 +02:00
parent 864d44396b
commit e5a461375f
3 changed files with 31 additions and 4 deletions
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable guard-for-in */
import React, { useEffect, useReducer } from 'react';
import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';
import {
@@ -98,6 +99,7 @@ type Option = {
export type CheckboxTreeProps = {
subCategories: SubCategory[];
label: string;
triggerReset?: boolean;
onChange: (arg: any) => any;
};
@@ -111,7 +113,8 @@ type checkOptionPayload = {
type Action =
| { type: 'checkOption'; payload: checkOptionPayload }
| { type: 'checkCategory'; payload: string }
| { type: 'toggleCategory'; payload: string };
| { type: 'toggleCategory'; payload: string }
| { type: 'triggerReset' };
const reducer = (
state: IndexedObject<SubCategoryWithIndexedOptions>,
@@ -128,21 +131,32 @@ const reducer = (
);
});
}
case 'checkCategory':
case 'checkCategory': {
return produce(state, newState => {
const category = newState[action.payload];
const options = category.options;
category.isChecked = !category.isChecked;
// eslint-disable-next-line guard-for-in
for (const option in options) {
options[option].isChecked = category.isChecked;
}
});
}
case 'toggleCategory':
return produce(state, newState => {
const category = newState[action.payload];
category.isOpen = !category.isOpen;
});
case 'triggerReset': {
return produce(state, newState => {
for (const category in newState) {
newState[category].isChecked = false;
for (const option in newState[category].options) {
newState[category].options[option].isChecked =
newState[category].isChecked;
}
}
});
}
default:
return state;
}
@@ -191,6 +205,10 @@ export const CheckboxTree = (props: CheckboxTreeProps) => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [state]);
useEffect(() => {
dispatch({ type: 'triggerReset' });
}, [props.triggerReset]);
return (
<div>
<Typography variant="button">{props.label}</Typography>
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import React, { useState } from 'react';
import React, { useEffect, useState } from 'react';
import {
createStyles,
makeStyles,
@@ -102,6 +102,7 @@ export type SelectProps = {
label: string;
placeholder?: string;
onChange: (arg: any) => any;
triggerReset?: boolean;
};
export const SelectComponent = (props: SelectProps) => {
@@ -112,6 +113,10 @@ export const SelectComponent = (props: SelectProps) => {
);
const [canOpen, setCanOpen] = React.useState(false);
useEffect(() => {
setValue(multiple ? [] : "")
}, [props.triggerReset, multiple])
const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {
setValue(event.target.value as any);
onChange(event.target.value);
@@ -75,11 +75,13 @@ export const Filters = (props: Props) => {
const [filters, setFilters] = useState(props.filters);
const [selectedFilters, setSelectedFilters] = useState<SelectedFilters>({});
const [reset, triggerReset] = useState(false);
// Trigger re-rendering
const handleClick = () => {
setSelectedFilters({});
setFilters([...props.filters]);
triggerReset(el => !el)
};
useEffect(() => {
@@ -101,6 +103,7 @@ export const Filters = (props: Props) => {
filters.map(filter =>
filter.type === 'checkbox-tree' ? (
<CheckboxTree
triggerReset={reset}
key={filter.element.label}
{...(filter.element as CheckboxTreeProps)}
onChange={el =>
@@ -126,6 +129,7 @@ export const Filters = (props: Props) => {
/>
) : (
<Select
triggerReset={reset}
key={filter.element.label}
{...(filter.element as SelectProps)}
onChange={el =>