diff --git a/frontend/src/component/project/Project/ExperimentalProjectFeatures/ExperimentalProjectTable/ExperimentalProjectTable.tsx b/frontend/src/component/project/Project/ExperimentalProjectFeatures/ExperimentalProjectTable/ExperimentalProjectTable.tsx index 96b56f01ed..0e6a5f3d7d 100644 --- a/frontend/src/component/project/Project/ExperimentalProjectFeatures/ExperimentalProjectTable/ExperimentalProjectTable.tsx +++ b/frontend/src/component/project/Project/ExperimentalProjectFeatures/ExperimentalProjectTable/ExperimentalProjectTable.tsx @@ -127,6 +127,11 @@ export const ExperimentalProjectFeatureToggles = ({ stateConfig, ); + const filterState = { + tag: tableState.tag, + createdAt: tableState.createdAt, + }; + const { features, total, refetch, loading, initialLoad } = useFeatureSearch( mapValues( { @@ -429,7 +434,7 @@ export const ExperimentalProjectFeatureToggles = ({ > ({ - display: 'flex', - padding: theme.spacing(2, 3), - gap: theme.spacing(1), - flexWrap: 'wrap', -})); - -type FeatureTogglesListFilters = { - tag?: FilterItemParams | null | undefined; - createdAt?: FilterItemParams | null | undefined; -}; - -interface IFeatureToggleFiltersProps { - state: FeatureTogglesListFilters; - onChange: (value: FeatureTogglesListFilters) => void; +interface IProjectOverviewFilters { + state: FilterItemParamHolder; + onChange: (value: FilterItemParamHolder) => void; } -export interface IFilterItem { - label: string; - options: { - label: string; - value: string; - }[]; - filterKey: keyof FeatureTogglesListFilters; - singularOperators: [string, ...string[]]; - pluralOperators: [string, ...string[]]; -} - -export const ProjectOverviewFilters: VFC = ({ +export const ProjectOverviewFilters: VFC = ({ state, onChange, }) => { const { tags } = useAllTags(); - const [availableFilters, setAvailableFilters] = useState([]); - const [unselectedFilters, setUnselectedFilters] = useState([]); - const [selectedFilters, setSelectedFilters] = useState([]); - - const deselectFilter = (label: string) => { - const newSelectedFilters = selectedFilters.filter((f) => f !== label); - const newUnselectedFilters = [...unselectedFilters, label].sort(); - - setSelectedFilters(newSelectedFilters); - setUnselectedFilters(newUnselectedFilters); - }; - - const mergeArraysKeepingOrder = ( - firstArray: string[], - secondArray: string[], - ): string[] => { - const elementsSet = new Set(firstArray); - - secondArray.forEach((element) => { - if (!elementsSet.has(element)) { - firstArray.push(element); - } - }); - - return firstArray; - }; useEffect(() => { const tagsOptions = (tags || []).map((tag) => ({ @@ -89,95 +37,22 @@ export const ProjectOverviewFilters: VFC = ({ 'EXCLUDE_ALL', ], }, + { + label: 'Created date', + options: [], + filterKey: 'createdAt', + dateOperators: ['IS_ON_OR_AFTER', 'IS_BEFORE'], + }, ]; setAvailableFilters(availableFilters); }, [JSON.stringify(tags)]); - useEffect(() => { - const fieldsMapping = [ - { - stateField: 'tag', - label: 'Tags', - }, - { - stateField: 'createdAt', - label: 'Created date', - }, - ]; - - const newSelectedFilters = fieldsMapping - .filter((field) => - Boolean( - state[field.stateField as keyof FeatureTogglesListFilters], - ), - ) - .map((field) => field.label); - const newUnselectedFilters = fieldsMapping - .filter( - (field) => - !state[field.stateField as keyof FeatureTogglesListFilters], - ) - .map((field) => field.label) - .sort(); - - setSelectedFilters( - mergeArraysKeepingOrder(selectedFilters, newSelectedFilters), - ); - setUnselectedFilters(newUnselectedFilters); - }, [JSON.stringify(state)]); - - const hasAvailableFilters = unselectedFilters.length > 0; return ( - - {selectedFilters.map((selectedFilter) => { - if (selectedFilter === 'Created date') { - return ( - onChange({ createdAt: value })} - operators={['IS_ON_OR_AFTER', 'IS_BEFORE']} - onChipClose={() => deselectFilter('Created date')} - /> - ); - } - - const filter = availableFilters.find( - (filter) => filter.label === selectedFilter, - ); - - if (!filter) { - return null; - } - - return ( - - onChange({ [filter.filterKey]: value }) - } - singularOperators={filter.singularOperators} - pluralOperators={filter.pluralOperators} - onChipClose={() => deselectFilter(filter.label)} - /> - ); - })} - - - } - /> - + ); };