123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import { DashboardSection, DashboardSectionItem, SearchAction } from '../types';
- import { mergeReducers } from '../utils';
- import { TOGGLE_ALL_CHECKED, TOGGLE_CHECKED, MOVE_ITEMS, DELETE_ITEMS } from './actionTypes';
- import { dashboardsSearchState, DashboardsSearchState, searchReducer } from './dashboardSearch';
- export interface ManageDashboardsState extends DashboardsSearchState {
- allChecked: boolean;
- }
- export const manageDashboardsState: ManageDashboardsState = {
- ...dashboardsSearchState,
- allChecked: false,
- };
- const reducer = (state: ManageDashboardsState, action: SearchAction) => {
- switch (action.type) {
- case TOGGLE_ALL_CHECKED:
- const newAllChecked = !state.allChecked;
- return {
- ...state,
- results: state.results.map((result) => {
- return {
- ...result,
- checked: newAllChecked,
- items: result.items.map((item) => ({ ...item, checked: newAllChecked })),
- };
- }),
- allChecked: newAllChecked,
- };
- case TOGGLE_CHECKED:
- const { id } = action.payload;
- return {
- ...state,
- results: state.results.map((result) => {
- if (result.id === id) {
- return {
- ...result,
- checked: !result.checked,
- items: result.items.map((item) => ({ ...item, checked: !result.checked })),
- };
- }
- return {
- ...result,
- items: result.items.map((item) => (item.id === id ? { ...item, checked: !item.checked } : item)),
- };
- }),
- };
- case MOVE_ITEMS: {
- const dashboards: DashboardSectionItem[] = action.payload.dashboards;
- const folder: DashboardSection = action.payload.folder;
- const uids = dashboards.map((db) => db.uid);
- return {
- ...state,
- results: state.results.map((result) => {
- if (folder.id === result.id) {
- return result.expanded
- ? {
- ...result,
- items: [...result.items, ...dashboards.map((db) => ({ ...db, checked: false }))],
- checked: false,
- }
- : result;
- } else {
- return { ...result, items: result.items.filter((item) => !uids.includes(item.uid)) };
- }
- }),
- };
- }
- case DELETE_ITEMS: {
- const { folders, dashboards } = action.payload;
- if (!folders.length && !dashboards.length) {
- return state;
- }
- return {
- ...state,
- results: state.results.reduce((filtered, result) => {
- if (!folders.includes(result.uid)) {
- return [...filtered, { ...result, items: result.items.filter((item) => !dashboards.includes(item.uid)) }];
- }
- return filtered;
- }, [] as DashboardSection[]),
- };
- }
- default:
- return state;
- }
- };
- export const manageDashboardsReducer = mergeReducers([searchReducer, reducer]);
|