mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-23 00:22:19 +01:00
refactor: simplify configuration for filters (#5622)
This is building block of abstraction for filters.
This commit is contained in:
parent
11b477d872
commit
c0c1dba9b0
@ -31,16 +31,25 @@ interface IFeatureToggleFiltersProps {
|
||||
onChange: (value: FeatureTogglesListFilters) => void;
|
||||
}
|
||||
|
||||
interface IFilterItem {
|
||||
type IBaseFilterItem = {
|
||||
label: string;
|
||||
options: {
|
||||
label: string;
|
||||
value: string;
|
||||
}[];
|
||||
filterKey: keyof FeatureTogglesListFilters;
|
||||
};
|
||||
|
||||
type ITextFilterItem = IBaseFilterItem & {
|
||||
singularOperators: [string, ...string[]];
|
||||
pluralOperators: [string, ...string[]];
|
||||
}
|
||||
};
|
||||
|
||||
type IDateFilterItem = IBaseFilterItem & {
|
||||
dateOperators: [string, ...string[]];
|
||||
};
|
||||
|
||||
type IFilterItem = ITextFilterItem | IDateFilterItem;
|
||||
|
||||
export const FeatureToggleFilters: VFC<IFeatureToggleFiltersProps> = ({
|
||||
state,
|
||||
@ -147,6 +156,12 @@ export const FeatureToggleFilters: VFC<IFeatureToggleFiltersProps> = ({
|
||||
'EXCLUDE_ALL',
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Created date',
|
||||
options: [],
|
||||
filterKey: 'createdAt',
|
||||
dateOperators: ['IS_ON_OR_AFTER', 'IS_BEFORE'],
|
||||
},
|
||||
];
|
||||
|
||||
setAvailableFilters(availableFilters);
|
||||
@ -157,46 +172,17 @@ export const FeatureToggleFilters: VFC<IFeatureToggleFiltersProps> = ({
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
const hasMultipleProjects = projects.length > 1;
|
||||
|
||||
const fieldsMapping = [
|
||||
{
|
||||
stateField: 'state',
|
||||
label: 'State',
|
||||
},
|
||||
...(hasMultipleProjects
|
||||
? [
|
||||
{
|
||||
stateField: 'project',
|
||||
label: 'Project',
|
||||
},
|
||||
]
|
||||
: []),
|
||||
{
|
||||
stateField: 'tag',
|
||||
label: 'Tags',
|
||||
},
|
||||
{
|
||||
stateField: 'segment',
|
||||
label: 'Segment',
|
||||
},
|
||||
{
|
||||
stateField: 'createdAt',
|
||||
label: 'Created date',
|
||||
},
|
||||
];
|
||||
|
||||
const newSelectedFilters = fieldsMapping
|
||||
const newSelectedFilters = availableFilters
|
||||
.filter((field) =>
|
||||
Boolean(
|
||||
state[field.stateField as keyof FeatureTogglesListFilters],
|
||||
state[field.filterKey as keyof FeatureTogglesListFilters],
|
||||
),
|
||||
)
|
||||
.map((field) => field.label);
|
||||
const newUnselectedFilters = fieldsMapping
|
||||
const newUnselectedFilters = availableFilters
|
||||
.filter(
|
||||
(field) =>
|
||||
!state[field.stateField as keyof FeatureTogglesListFilters],
|
||||
!state[field.filterKey as keyof FeatureTogglesListFilters],
|
||||
)
|
||||
.map((field) => field.label)
|
||||
.sort();
|
||||
@ -205,24 +191,12 @@ export const FeatureToggleFilters: VFC<IFeatureToggleFiltersProps> = ({
|
||||
mergeArraysKeepingOrder(selectedFilters, newSelectedFilters),
|
||||
);
|
||||
setUnselectedFilters(newUnselectedFilters);
|
||||
}, [JSON.stringify(state), JSON.stringify(projects)]);
|
||||
}, [JSON.stringify(state), JSON.stringify(availableFilters)]);
|
||||
|
||||
const hasAvailableFilters = unselectedFilters.length > 0;
|
||||
return (
|
||||
<StyledBox>
|
||||
{selectedFilters.map((selectedFilter) => {
|
||||
if (selectedFilter === 'Created date') {
|
||||
return (
|
||||
<FilterDateItem
|
||||
label={'Created date'}
|
||||
state={state.createdAt}
|
||||
onChange={(value) => onChange({ createdAt: value })}
|
||||
operators={['IS_ON_OR_AFTER', 'IS_BEFORE']}
|
||||
onChipClose={() => deselectFilter('Created date')}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
const filter = availableFilters.find(
|
||||
(filter) => filter.label === selectedFilter,
|
||||
);
|
||||
@ -231,6 +205,20 @@ export const FeatureToggleFilters: VFC<IFeatureToggleFiltersProps> = ({
|
||||
return null;
|
||||
}
|
||||
|
||||
if ('dateOperators' in filter) {
|
||||
return (
|
||||
<FilterDateItem
|
||||
label={filter.label}
|
||||
state={state[filter.filterKey]}
|
||||
onChange={(value) =>
|
||||
onChange({ [filter.filterKey]: value })
|
||||
}
|
||||
operators={filter.dateOperators}
|
||||
onChipClose={() => deselectFilter(filter.label)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<FilterItem
|
||||
key={filter.label}
|
||||
|
Loading…
Reference in New Issue
Block a user