From 86babc7c872f28e79d590d543960ad6c4b35d14d Mon Sep 17 00:00:00 2001 From: craigrbarnes Date: Thu, 23 Jan 2025 15:46:40 -0600 Subject: [PATCH] add filtersExpandSlice --- .../src/features/cohort/filterExpandSlice.ts | 63 +++++++++++++++++++ packages/core/src/features/cohort/index.ts | 7 +++ packages/core/src/reducers.ts | 2 + 3 files changed, 72 insertions(+) create mode 100644 packages/core/src/features/cohort/filterExpandSlice.ts diff --git a/packages/core/src/features/cohort/filterExpandSlice.ts b/packages/core/src/features/cohort/filterExpandSlice.ts new file mode 100644 index 00000000..f57ed415 --- /dev/null +++ b/packages/core/src/features/cohort/filterExpandSlice.ts @@ -0,0 +1,63 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import type { CoreState } from '../../reducers'; + +// TODO: after multiple cohort support is merged move this to CohortBuilder +type ExpandedFiltersState = Record>; + +const initialState: ExpandedFiltersState = {}; + +const expandSlice = createSlice({ + name: 'CohortBuilder/filterExpand', + initialState: initialState, + reducers: { + toggleCohortBuilderCategoryFilter: ( + state, + action: PayloadAction<{ + index: string; + field: string; + expanded: boolean; + }>, + ) => { + return { + ...state, + [action.payload.index]: { + [action.payload.field]: action.payload.expanded, + }, + }; + }, + toggleCohortBuilderAllFilters: ( + state, + action: PayloadAction<{ index: string; expand: boolean }>, + ) => { + return { + ...state, + [action.payload.index]: Object.keys(state[action.payload.index]).reduce( + (acc, k) => { + acc[k] = action.payload.expand; + return acc; + }, + {} as Record, + ), + }; + }, + }, +}); + +export const cohortBuilderFiltersExpandedReducer = expandSlice.reducer; + +export const { + toggleCohortBuilderCategoryFilter, + toggleCohortBuilderAllFilters, +} = expandSlice.actions; + +export const selectFilterExpanded = ( + state: CoreState, + index: string, + field: string, +): boolean => state.cohortFiltersExpanded?.[index]?.[field]; + +export const selectAllFiltersCollapsed = ( + state: CoreState, + index: string, +): boolean => + Object.values(state.cohortFiltersExpanded[index]).every((e) => !e); diff --git a/packages/core/src/features/cohort/index.ts b/packages/core/src/features/cohort/index.ts index 98de9a5e..f6419907 100644 --- a/packages/core/src/features/cohort/index.ts +++ b/packages/core/src/features/cohort/index.ts @@ -14,6 +14,11 @@ import { clearCohortFilters, } from './cohortSlice'; +import { + toggleCohortBuilderCategoryFilter, + toggleCohortBuilderAllFilters, +} from './filterExpandSlice'; + export { selectCohortFilters, selectIndexFilters, @@ -27,4 +32,6 @@ export { setCohortIndexFilters, removeCohortFilter, clearCohortFilters, + toggleCohortBuilderCategoryFilter, + toggleCohortBuilderAllFilters, }; diff --git a/packages/core/src/reducers.ts b/packages/core/src/reducers.ts index b8d75540..fe390673 100644 --- a/packages/core/src/reducers.ts +++ b/packages/core/src/reducers.ts @@ -12,6 +12,7 @@ import { userAuthApiReducerPath, userAuthApiReducer, } from './features/user/userSliceRTK'; +import { cohortBuilderFiltersExpandedReducer } from './features/cohort/filterExpandSlice'; export const rootReducer = combineReducers({ gen3Services: gen3ServicesReducer, @@ -20,6 +21,7 @@ export const rootReducer = combineReducers({ drsHostnames: drsHostnamesReducer, modals: modalReducer, cohorts: cohortReducer, + cohortFiltersExpanded: cohortBuilderFiltersExpandedReducer, activeWorkspace: activeWorkspaceReducer, dataLibrarySelection: dataLibrarySelectionReducer, [guppyApiSliceReducerPath]: guppyApiReducer,