grafana/public/app/features/manage-dashboards/state/reducers.ts
Leo 27b6b3b3bd
Folder: Replace folderId with folderUid (#58393)
* support folderuid in FolderPicker

* support folderuid in unified alerting

* support folderuid when returning to view mode after editing a panel

* support folderuid when preselecting the folderpicker in dashboard general settings

* support folderuid when saving dashboard

* support folderuid when pre-selecting folderpicker in dashboard form

* support folderuid in routes when loading a dashboard

* support folderuid when saving dashboard json

* support folderuid when validating new dashboard name

* support folderuid when moving dashboard to another folder

* support folderuid on dashboard action buttons

* support folderuid when creating a new dashboard on an empty folder

* support folderuid when showing library panel modal

* support folderuid when saving library panel

* support folderuid when importing dashboard

* fixed broken tests

* use folderuid when importing dashboards

* remove commented line

* fix typo when comparing uid values
2022-11-17 09:22:57 +01:00

134 lines
3.5 KiB
TypeScript

import { createSlice, Draft, PayloadAction } from '@reduxjs/toolkit';
import { DataSourceInstanceSettings, LoadingState } from '@grafana/data';
import { LibraryElementDTO } from '../../library-panels/types';
export enum DashboardSource {
Gcom = 0,
Json = 1,
}
export interface ImportDashboardDTO {
title: string;
uid: string;
gnetId: string;
constants: string[];
dataSources: DataSourceInstanceSettings[];
elements: LibraryElementDTO[];
folder: { uid: string; title?: string };
}
export enum InputType {
DataSource = 'datasource',
Constant = 'constant',
LibraryPanel = 'libraryPanel',
}
export enum LibraryPanelInputState {
New = 'new',
Exists = 'exists',
Different = 'different',
}
export interface DashboardInput {
name: string;
label: string;
info: string;
value: string;
type: InputType;
}
export interface DataSourceInput extends DashboardInput {
pluginId: string;
}
export interface LibraryPanelInput {
model: LibraryElementDTO;
state: LibraryPanelInputState;
}
export interface DashboardInputs {
dataSources: DataSourceInput[];
constants: DashboardInput[];
libraryPanels: LibraryPanelInput[];
}
export interface ImportDashboardState {
meta: { updatedAt: string; orgName: string };
dashboard: any;
source: DashboardSource;
inputs: DashboardInputs;
state: LoadingState;
}
export const initialImportDashboardState: ImportDashboardState = {
meta: { updatedAt: '', orgName: '' },
dashboard: {},
source: DashboardSource.Json,
inputs: {} as DashboardInputs,
state: LoadingState.NotStarted,
};
const importDashboardSlice = createSlice({
name: 'manageDashboards',
initialState: initialImportDashboardState,
reducers: {
setGcomDashboard: (state: Draft<ImportDashboardState>, action: PayloadAction<any>) => {
state.dashboard = {
...action.payload.json,
id: null,
};
state.meta = { updatedAt: action.payload.updatedAt, orgName: action.payload.orgName };
state.source = DashboardSource.Gcom;
state.state = LoadingState.Done;
},
setJsonDashboard: (state: Draft<ImportDashboardState>, action: PayloadAction<any>) => {
state.dashboard = {
...action.payload,
id: null,
};
state.meta = initialImportDashboardState.meta;
state.source = DashboardSource.Json;
state.state = LoadingState.Done;
},
clearDashboard: (state: Draft<ImportDashboardState>) => {
state.dashboard = {};
state.state = LoadingState.NotStarted;
},
setInputs: (state: Draft<ImportDashboardState>, action: PayloadAction<any[]>) => {
state.inputs = {
dataSources: action.payload.filter((p) => p.type === InputType.DataSource),
constants: action.payload.filter((p) => p.type === InputType.Constant),
libraryPanels: [],
};
},
setLibraryPanelInputs: (state: Draft<ImportDashboardState>, action: PayloadAction<LibraryPanelInput[]>) => {
state.inputs.libraryPanels = action.payload;
},
fetchFailed: (state: Draft<ImportDashboardState>) => {
state.dashboard = {};
state.state = LoadingState.Error;
},
fetchDashboard: (state: Draft<ImportDashboardState>) => {
state.state = LoadingState.Loading;
},
},
});
export const {
clearDashboard,
setInputs,
setGcomDashboard,
setJsonDashboard,
setLibraryPanelInputs,
fetchFailed,
fetchDashboard,
} = importDashboardSlice.actions;
export const importDashboardReducer = importDashboardSlice.reducer;
export default {
importDashboard: importDashboardReducer,
};