From 68b848f14699e5099039372358b91f07749ed3d1 Mon Sep 17 00:00:00 2001 From: Moritz Zeumer Date: Wed, 24 Jul 2024 16:05:47 +0200 Subject: [PATCH 1/2] Add Pandemos Slice for filters --- frontend/src/store/PandemosFilterSlice.ts | 114 ++++++++++++++++++++++ frontend/src/store/index.ts | 4 +- 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 frontend/src/store/PandemosFilterSlice.ts diff --git a/frontend/src/store/PandemosFilterSlice.ts b/frontend/src/store/PandemosFilterSlice.ts new file mode 100644 index 00000000..c103c550 --- /dev/null +++ b/frontend/src/store/PandemosFilterSlice.ts @@ -0,0 +1,114 @@ +// SPDX-FileCopyrightText: 2024 German Aerospace Center (DLR) +// SPDX-License-Identifier: Apache-2.0 + +import {createSlice, PayloadAction} from '@reduxjs/toolkit'; + +export interface PandemosFilter { + tripDurationMin?: number; + tripDurationMax?: number; + ageGroups?: number[]; + transportationModes?: number[]; + activities?: number[]; + originTypes?: number[]; + destinationTypes?: number[]; +} + +const initialState: PandemosFilter = {}; + +/** + * This slice manages and stores all filters & selections for the pandemos section. + */ +export const PandemosFilterSlice = createSlice({ + name: 'PandemosFilter', + initialState, + reducers: { + /** + * Set selected trip duration (or range). + * No parameters to reset selection. + */ + selectTripDuration(state, action: PayloadAction<{start?: number; end?: number}>) { + state.tripDurationMin = action.payload.start; + state.tripDurationMax = action.payload.end ?? action.payload.start; + }, + /** + * Set selected age group(s). + * Accepts single number or a list of numbers. + * No parameter to reset selection. + */ + selectAgeGroups(state, action: PayloadAction<{ageGroups?: number | number[]}>) { + if (action.payload.ageGroups) { + state.ageGroups = []; + state.ageGroups.concat(action.payload.ageGroups); + } else { + // reset filter if parameter is undefined + state.ageGroups = undefined; + } + }, + /** + * Set selected transportation mode(s). + * Accepts single number or a list of numbers. + * No parameter to reset selection. + */ + selectTransportationModes(state, action: PayloadAction<{transportationModes?: number | number[]}>) { + if (action.payload.transportationModes) { + state.transportationModes = []; + state.transportationModes.concat(action.payload.transportationModes); + } else { + // reset filter if parameter is undefined + state.transportationModes = undefined; + } + }, + /** + * Set selected activity(-ies). + * Accepts single number or a list of numbers. + * No parameters to reset selection. + */ + selectActivities(state, action: PayloadAction<{activities?: number | number[]}>) { + if (action.payload.activities) { + state.activities = []; + state.activities.concat(action.payload.activities); + } else { + // reset filter if parameter is undefined + state.activities = undefined; + } + }, + /** + * Set selected origin type(s). + * Accepts single number or a list of numbers. + * No parameters to reset selection. + */ + selectOriginTypes(state, action: PayloadAction<{originTypes?: number | number[]}>) { + if (action.payload.originTypes) { + state.originTypes = []; + state.originTypes.concat(action.payload.originTypes); + } else { + // reset filter if parameter is undefined + state.originTypes = undefined; + } + }, + /** + * Set selected destination type(s). + * Accepts single number or a list of numbers. + * No parameters to reset selection. + */ + selectDestinationTypes(state, action: PayloadAction<{destinationTypes?: number | number[]}>) { + if (action.payload.destinationTypes) { + state.destinationTypes = []; + state.destinationTypes.concat(action.payload.destinationTypes); + } else { + // reset filter if parameter is undefined + state.destinationTypes = undefined; + } + }, + }, +}); + +export const { + selectTripDuration, + selectAgeGroups, + selectTransportationModes, + selectActivities, + selectOriginTypes, + selectDestinationTypes, +} = PandemosFilterSlice.actions; +export default PandemosFilterSlice.reducer; diff --git a/frontend/src/store/index.ts b/frontend/src/store/index.ts index 729b48fb..6a3037d8 100644 --- a/frontend/src/store/index.ts +++ b/frontend/src/store/index.ts @@ -11,11 +11,12 @@ import {persistReducer, persistStore} from 'redux-persist'; import storage from 'redux-persist/lib/storage'; import {groupApi} from './services/groupApi'; import LayoutReducer from './LayoutSlice'; +import PandemosFilterReducer from "./PandemosFilterSlice"; const persistConfig = { key: 'root', storage, - whitelist: ['dataSelection', 'userPreference'], + whitelist: ['dataSelection', 'userPreference', 'pandemosFilter'], }; const rootReducer = combineReducers({ @@ -23,6 +24,7 @@ const rootReducer = combineReducers({ scenarioList: ScenarioReducer, userPreference: UserPreferenceReducer, layoutSlice: LayoutReducer, + pandemosFilter: PandemosFilterReducer, [caseDataApi.reducerPath]: caseDataApi.reducer, [scenarioApi.reducerPath]: scenarioApi.reducer, [groupApi.reducerPath]: groupApi.reducer, From da307859f8a7ef6349aec158f3cd8871f2b5223d Mon Sep 17 00:00:00 2001 From: Moritz Zeumer Date: Wed, 24 Jul 2024 16:18:12 +0200 Subject: [PATCH 2/2] add infection states --- frontend/src/store/PandemosFilterSlice.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/frontend/src/store/PandemosFilterSlice.ts b/frontend/src/store/PandemosFilterSlice.ts index c103c550..8dad589c 100644 --- a/frontend/src/store/PandemosFilterSlice.ts +++ b/frontend/src/store/PandemosFilterSlice.ts @@ -11,6 +11,7 @@ export interface PandemosFilter { activities?: number[]; originTypes?: number[]; destinationTypes?: number[]; + infectionStates?: number[]; } const initialState: PandemosFilter = {}; @@ -100,6 +101,20 @@ export const PandemosFilterSlice = createSlice({ state.destinationTypes = undefined; } }, + /** + * Set selected infection state(s). + * Accepts single number or a list of numbers. + * No parameters to reset selection. + */ + selectInfectionStates(state, action: PayloadAction<{infectionStates?: number | number[]}>) { + if (action.payload.infectionStates) { + state.infectionStates = []; + state.infectionStates.concat(action.payload.infectionStates); + } else { + // reset filter if parameter is undefined + state.infectionStates = undefined; + } + }, }, }); @@ -110,5 +125,6 @@ export const { selectActivities, selectOriginTypes, selectDestinationTypes, + selectInfectionStates, } = PandemosFilterSlice.actions; export default PandemosFilterSlice.reducer;