mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 16:45:43 -06:00
2dc5872bd6
* New Dashboard: Fix "build a dashboard" when used with empty dash page feature Closes #66659
94 lines
2.6 KiB
TypeScript
94 lines
2.6 KiB
TypeScript
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, datasource?: string): number | undefined {
|
|
const newPanel: Partial<PanelModel> = {
|
|
type: 'timeseries',
|
|
title: 'Panel Title',
|
|
gridPos: calculateNewPanelGridPos(dashboard),
|
|
datasource: datasource ? { uid: datasource } : null,
|
|
isNew: true,
|
|
};
|
|
|
|
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;
|
|
}
|