grafana/public/app/features/dashboard/state/reducers.ts

110 lines
3.3 KiB
TypeScript
Raw Normal View History

import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import {
DashboardInitPhase,
DashboardState,
DashboardAclDTO,
DashboardInitError,
QueriesToUpdateOnDashboardLoad,
} from 'app/types';
2018-09-13 09:00:02 -05:00
import { processAclItems } from 'app/core/utils/acl';
import { panelEditorReducer } from '../panel_editor/state/reducers';
import { DashboardModel } from './DashboardModel';
import { PanelModel } from './PanelModel';
2018-09-13 09:00:02 -05:00
2018-10-25 09:56:49 -05:00
export const initialState: DashboardState = {
initPhase: DashboardInitPhase.NotStarted,
isInitSlow: false,
getModel: () => null,
2018-09-13 09:00:02 -05:00
permissions: [],
modifiedQueries: null,
panels: {},
initError: null,
2018-09-13 09:00:02 -05:00
};
const dashbardSlice = createSlice({
name: 'dashboard',
initialState,
reducers: {
loadDashboardPermissions: (state, action: PayloadAction<DashboardAclDTO[]>) => {
state.permissions = processAclItems(action.payload);
},
dashboardInitFetching: (state, action: PayloadAction) => {
state.initPhase = DashboardInitPhase.Fetching;
},
dashboardInitServices: (state, action: PayloadAction) => {
state.initPhase = DashboardInitPhase.Services;
},
dashboardInitSlow: (state, action: PayloadAction) => {
state.isInitSlow = true;
},
dashboardInitCompleted: (state, action: PayloadAction<DashboardModel>) => {
state.getModel = () => action.payload;
state.initPhase = DashboardInitPhase.Completed;
state.isInitSlow = false;
for (const panel of action.payload.panels) {
state.panels[panel.id] = {
pluginId: panel.type,
};
}
},
dashboardInitFailed: (state, action: PayloadAction<DashboardInitError>) => {
state.initPhase = DashboardInitPhase.Failed;
state.initError = action.payload;
state.getModel = () => {
return new DashboardModel({ title: 'Dashboard init failed' }, { canSave: false, canEdit: false });
};
},
cleanUpDashboard: (state, action: PayloadAction) => {
if (state.getModel()) {
state.getModel()!.destroy();
state.getModel = () => null;
}
state.initPhase = DashboardInitPhase.NotStarted;
state.isInitSlow = false;
state.initError = null;
},
setDashboardQueriesToUpdateOnLoad: (state, action: PayloadAction<QueriesToUpdateOnDashboardLoad>) => {
state.modifiedQueries = action.payload;
},
clearDashboardQueriesToUpdateOnLoad: (state, action: PayloadAction) => {
state.modifiedQueries = null;
},
dashboardPanelTypeChanged: (state, action: PayloadAction<DashboardPanelTypeChangedPayload>) => {
state.panels[action.payload.panelId] = { pluginId: action.payload.pluginId };
},
addPanelToDashboard: (state, action: PayloadAction<AddPanelPayload>) => {},
},
});
export interface DashboardPanelTypeChangedPayload {
panelId: number;
pluginId: string;
}
export interface AddPanelPayload {
panel: PanelModel;
}
export const {
loadDashboardPermissions,
dashboardInitFetching,
dashboardInitFailed,
dashboardInitSlow,
dashboardInitCompleted,
dashboardInitServices,
cleanUpDashboard,
setDashboardQueriesToUpdateOnLoad,
clearDashboardQueriesToUpdateOnLoad,
dashboardPanelTypeChanged,
addPanelToDashboard,
} = dashbardSlice.actions;
export const dashboardReducer = dashbardSlice.reducer;
2018-09-13 09:00:02 -05:00
export default {
dashboard: dashboardReducer,
panelEditor: panelEditorReducer,
2018-09-13 09:00:02 -05:00
};