grafana/public/app/features/dashboard/utils/dashboard.ts

92 lines
2.5 KiB
TypeScript
Raw Normal View History

import { chain, cloneDeep, defaults, find } from 'lodash';
import { PanelPluginMeta } from '@grafana/data';
import config from 'app/core/config';
import { LS_PANEL_COPY_KEY } from 'app/core/constants';
import store from 'app/core/store';
import { DashboardModel, PanelModel } from 'app/features/dashboard/state';
import { calculateNewPanelGridPos } from 'app/features/dashboard/utils/panel';
export function onCreateNewPanel(dashboard: DashboardModel): number | undefined {
const newPanel: Partial<PanelModel> = {
type: 'timeseries',
title: 'Panel Title',
gridPos: calculateNewPanelGridPos(dashboard),
};
dashboard.addPanel(newPanel);
return newPanel.id;
}
export function onCreateNewRow(dashboard: DashboardModel) {
const newRow = {
type: 'row',
title: 'Row title',
gridPos: { x: 0, y: 0 },
};
dashboard.addPanel(newRow);
}
export function onAddLibraryPanel(dashboard: DashboardModel) {
const newPanel = {
type: 'add-library-panel',
gridPos: calculateNewPanelGridPos(dashboard),
};
dashboard.addPanel(newPanel);
}
type PanelPluginInfo = { defaults: { gridPos: { w: number; h: number }; title: string } };
export function onPasteCopiedPanel(dashboard: DashboardModel, panelPluginInfo?: PanelPluginMeta & PanelPluginInfo) {
if (!panelPluginInfo) {
return;
}
const gridPos = calculateNewPanelGridPos(dashboard);
const newPanel = {
type: panelPluginInfo.id,
title: 'Panel Title',
gridPos: {
x: gridPos.x,
y: gridPos.y,
w: panelPluginInfo.defaults.gridPos.w,
h: panelPluginInfo.defaults.gridPos.h,
},
};
// apply panel template / defaults
if (panelPluginInfo.defaults) {
defaults(newPanel, panelPluginInfo.defaults);
newPanel.title = panelPluginInfo.defaults.title;
store.delete(LS_PANEL_COPY_KEY);
}
dashboard.addPanel(newPanel);
}
export function getCopiedPanelPlugin(): (PanelPluginMeta & PanelPluginInfo) | undefined {
const panels = chain(config.panels)
.filter({ hideFromList: false })
.map((item) => item)
.value();
const copiedPanelJson = store.get(LS_PANEL_COPY_KEY);
if (copiedPanelJson) {
const copiedPanel = JSON.parse(copiedPanelJson);
const pluginInfo = find(panels, { id: copiedPanel.type });
if (pluginInfo) {
const pluginCopy: PanelPluginMeta = cloneDeep(pluginInfo);
pluginCopy.name = copiedPanel.title;
pluginCopy.sort = -1;
return { ...pluginCopy, defaults: { ...copiedPanel } };
}
}
return undefined;
}