2025-04-01 10:38:02 +09:00

94 lines
2.4 KiB
TypeScript

import { VizPanel, sceneGraph, behaviors, SceneObject, SceneGridRow } from '@grafana/scenes';
import { DashboardDataLayerSet } from '../scene/DashboardDataLayerSet';
import { DashboardScene } from '../scene/DashboardScene';
import { VizPanelLinks } from '../scene/PanelLinks';
import { isClonedKey } from './clone';
import { getDashboardSceneFor, getLayoutManagerFor, getPanelIdForVizPanel } from './utils';
function getTimePicker(scene: DashboardScene) {
return scene.state.controls?.state.timePicker;
}
function getRefreshPicker(scene: DashboardScene) {
return scene.state.controls?.state.refreshPicker;
}
function getPanelLinks(panel: VizPanel) {
if (panel.state.titleItems && Array.isArray(panel.state.titleItems)) {
// search panel.state.titleItems for VizPanelLinks
const panelLink = panel.state.titleItems.find((item) => item instanceof VizPanelLinks);
return panelLink ?? null;
}
return null;
}
function getVizPanels(scene: DashboardScene): VizPanel[] {
return scene.state.body.getVizPanels();
}
/**
* Will look for all panels in the entire scene starting from root
* and find the next free panel id
*/
export function getNextPanelId(scene: SceneObject): number {
let max = 0;
sceneGraph
.findAllObjects(scene.getRoot(), (obj) => obj instanceof VizPanel || obj instanceof SceneGridRow)
.forEach((panel) => {
if (isClonedKey(panel.state.key!)) {
return;
}
const panelId = getPanelIdForVizPanel(panel);
if (panelId > max) {
max = panelId;
}
});
return max + 1;
}
function getDataLayers(scene: DashboardScene): DashboardDataLayerSet {
const data = sceneGraph.getData(scene);
if (!(data instanceof DashboardDataLayerSet)) {
throw new Error('DashboardDataLayerSet not found');
}
return data;
}
function getAllSelectedObjects(scene: SceneObject): SceneObject[] {
return (
getDashboardSceneFor(scene)
.state.editPane.state.selection?.getSelectionEntries()
.map(([, ref]) => ref.resolve()) ?? []
);
}
export function getCursorSync(scene: DashboardScene) {
const cursorSync = scene.state.$behaviors?.find((b) => b instanceof behaviors.CursorSync);
if (cursorSync instanceof behaviors.CursorSync) {
return cursorSync;
}
return;
}
export const dashboardSceneGraph = {
getTimePicker,
getRefreshPicker,
getPanelLinks,
getVizPanels,
getDataLayers,
getAllSelectedObjects,
getCursorSync,
getLayoutManagerFor,
getNextPanelId,
};