diff --git a/superset-frontend/src/dashboard/actions/nativeFilters.ts b/superset-frontend/src/dashboard/actions/nativeFilters.ts index 8d183271e..fca59f2ba 100644 --- a/superset-frontend/src/dashboard/actions/nativeFilters.ts +++ b/superset-frontend/src/dashboard/actions/nativeFilters.ts @@ -96,6 +96,7 @@ export const setFilterConfiguration = ( }); dispatch({ type: SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE, + unitName: DataMaskType.NativeFilters, filterConfig, }); } catch (err) { diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.tsx index 098bd6fc6..2e3814760 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.tsx @@ -240,6 +240,30 @@ const FilterBar: React.FC = ({ } }, [filterValues.length]); + useEffect(() => { + // Remove deleted filters from local state + Object.keys(dataMaskSelected).forEach(selectedId => { + if (!filters[selectedId]) { + setDataMaskSelected(draft => { + delete draft[selectedId]; + }); + } + }); + Object.keys(dataMaskApplied).forEach(appliedId => { + if (!filters[appliedId]) { + setLastAppliedFilterData(draft => { + delete draft[appliedId]; + }); + } + }); + }, [ + dataMaskApplied, + dataMaskSelected, + filters, + setDataMaskSelected, + setLastAppliedFilterData, + ]); + const cascadeChildren = useMemo( () => mapParentFiltersToChildren(filterValues), [filterValues], diff --git a/superset-frontend/src/dataMask/actions.ts b/superset-frontend/src/dataMask/actions.ts index 434066194..5432c30d4 100644 --- a/superset-frontend/src/dataMask/actions.ts +++ b/superset-frontend/src/dataMask/actions.ts @@ -33,6 +33,7 @@ export const SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE = export interface SetDataMaskForFilterConfigComplete { type: typeof SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE; filterConfig: FilterConfiguration; + unitName: DataMaskType; } export const SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL = 'SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL'; diff --git a/superset-frontend/src/dataMask/reducer.ts b/superset-frontend/src/dataMask/reducer.ts index a027a12c3..387f81179 100644 --- a/superset-frontend/src/dataMask/reducer.ts +++ b/superset-frontend/src/dataMask/reducer.ts @@ -49,14 +49,9 @@ const setUnitDataMask = ( } }; -const emptyDataMask = { - [DataMaskType.NativeFilters]: {}, - [DataMaskType.CrossFilters]: {}, - [DataMaskType.OwnFilters]: {}, -}; - const dataMaskReducer = produce( (draft: DataMaskStateWithId, action: AnyDataMaskAction) => { + const oldData = { ...draft }; switch (action.type) { case UPDATE_DATA_MASK: Object.values(DataMaskType).forEach(unitName => @@ -65,20 +60,21 @@ const dataMaskReducer = produce( break; case SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE: - Object.values(DataMaskType).forEach(unitName => { - draft[unitName] = emptyDataMask[unitName]; - }); + draft[action.unitName] = {}; (action.filterConfig ?? []).forEach(filter => { - draft[DataMaskType.NativeFilters][filter.id] = - draft[DataMaskType.NativeFilters][filter.id] ?? - getInitialMask(filter.id); + draft[action.unitName][filter.id] = + oldData[action.unitName][filter.id] ?? getInitialMask(filter.id); }); break; default: } }, - emptyDataMask, + { + [DataMaskType.NativeFilters]: {}, + [DataMaskType.CrossFilters]: {}, + [DataMaskType.OwnFilters]: {}, + }, ); export default dataMaskReducer;