diff --git a/frontend/src/component/feature/FeatureToggleList/FeatureToggleFilters/AddFilterButton.tsx b/frontend/src/component/feature/FeatureToggleList/FeatureToggleFilters/AddFilterButton.tsx index 8c8f3661bb..ce7a30485f 100644 --- a/frontend/src/component/feature/FeatureToggleList/FeatureToggleFilters/AddFilterButton.tsx +++ b/frontend/src/component/feature/FeatureToggleList/FeatureToggleFilters/AddFilterButton.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import Button from '@mui/material/Button'; import Menu from '@mui/material/Menu'; import MenuItem from '@mui/material/MenuItem'; -import { IFilterItem } from './FeatureToggleFilters'; +import { IFilterVisibility, IFilterItem } from './FeatureToggleFilters'; import { Box, styled } from '@mui/material'; import { Add } from '@mui/icons-material'; @@ -11,13 +11,13 @@ const StyledButton = styled(Button)(({ theme }) => ({ padding: theme.spacing(1.25), })); interface IAddFilterButtonProps { - availableFilters: IFilterItem[]; - setAvailableFilters: (filters: IFilterItem[]) => void; + visibleFilters: IFilterVisibility; + setVisibleFilters: (filters: IFilterVisibility) => void; } const AddFilterButton = ({ - availableFilters, - setAvailableFilters, + visibleFilters, + setVisibleFilters, }: IAddFilterButtonProps) => { const [anchorEl, setAnchorEl] = useState(null); @@ -29,15 +29,11 @@ const AddFilterButton = ({ }; const onClick = (label: string) => { - const filters = availableFilters.map((filter) => - filter.label === label - ? { - ...filter, - enabled: true, - } - : filter, - ); - setAvailableFilters(filters); + const filterVisibility = { + ...visibleFilters, + [label]: true, + }; + setVisibleFilters(filterVisibility); handleClose(); }; @@ -53,16 +49,12 @@ const AddFilterButton = ({ open={Boolean(anchorEl)} onClose={handleClose} > - {availableFilters.map( - (filter) => - !filter.enabled && ( - onClick(filter.label)} - > - {filter.label} - - ), + {Object.entries(visibleFilters).map(([label, enabled]) => + !enabled ? ( + onClick(label)}> + {label} + + ) : null, )} diff --git a/frontend/src/component/feature/FeatureToggleList/FeatureToggleFilters/FeatureToggleFilters.tsx b/frontend/src/component/feature/FeatureToggleList/FeatureToggleFilters/FeatureToggleFilters.tsx index 491904592e..9aa1a7cb02 100644 --- a/frontend/src/component/feature/FeatureToggleList/FeatureToggleFilters/FeatureToggleFilters.tsx +++ b/frontend/src/component/feature/FeatureToggleList/FeatureToggleFilters/FeatureToggleFilters.tsx @@ -30,11 +30,14 @@ export interface IFilterItem { value: string; }[]; filterKey: keyof FeatureTogglesListFilters; - enabled?: boolean; singularOperators: [string, ...string[]]; pluralOperators: [string, ...string[]]; } +export type IFilterVisibility = { + [key: string]: boolean | undefined; +}; + export const FeatureToggleFilters: VFC = ({ state, onChange, @@ -54,16 +57,14 @@ export const FeatureToggleFilters: VFC = ({ ]; const [availableFilters, setAvailableFilters] = useState([]); - const removeFilter = (label: string) => { - const filters = availableFilters.map((filter) => - filter.label === label - ? { - ...filter, - enabled: false, - } - : filter, - ); - setAvailableFilters(filters); + const [visibleFilters, setVisibleFilters] = useState({}); + + const hideFilter = (label: string) => { + const filterVisibility = { + ...visibleFilters, + [label]: false, + }; + setVisibleFilters(filterVisibility); }; useEffect(() => { @@ -76,14 +77,13 @@ export const FeatureToggleFilters: VFC = ({ value: segment.name, })); - const newFilterItems: IFilterItem[] = [ + const availableFilters: IFilterItem[] = [ { label: 'State', options: stateOptions, filterKey: 'state', singularOperators: ['IS', 'IS_NOT'], pluralOperators: ['IS_ANY_OF', 'IS_NONE_OF'], - enabled: Boolean(state.state), }, { label: 'Project', @@ -91,7 +91,6 @@ export const FeatureToggleFilters: VFC = ({ filterKey: 'project', singularOperators: ['IS', 'IS_NOT'], pluralOperators: ['IS_ANY_OF', 'IS_NONE_OF'], - enabled: Boolean(state.project), }, { label: 'Segment', @@ -104,22 +103,30 @@ export const FeatureToggleFilters: VFC = ({ 'EXCLUDE_IF_ANY_OF', 'EXCLUDE_ALL', ], - enabled: Boolean(state.segment), }, ]; - setAvailableFilters(newFilterItems); - }, [ - JSON.stringify(projects), - JSON.stringify(state), - JSON.stringify(segments), - ]); + setAvailableFilters(availableFilters); + }, [JSON.stringify(projects), JSON.stringify(segments)]); + + useEffect(() => { + const filterVisibility: IFilterVisibility = { + State: Boolean(state.state), + Project: Boolean(state.project), + Segment: Boolean(state.segment), + }; + setVisibleFilters(filterVisibility); + }, [JSON.stringify(state)]); + + const hasAvailableFilters = Object.values(visibleFilters).some( + (value) => !value, + ); return ( {availableFilters.map( (filter) => - filter.enabled && ( + visibleFilters[filter.label] && ( = ({ } singularOperators={filter.singularOperators} pluralOperators={filter.pluralOperators} - onChipClose={() => removeFilter(filter.label)} + onChipClose={() => hideFilter(filter.label)} /> ), )} !filter.enabled)} + condition={hasAvailableFilters} show={ } />