DashoardScene: Add dashboardUID and panelId to requests (#75719)

This commit is contained in:
Torkel Ödegaard 2023-09-29 13:19:03 +02:00 committed by GitHub
parent f895798fdb
commit f842b47d78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 3 deletions

View File

@ -1,4 +1,5 @@
import { sceneGraph, SceneGridItem, SceneGridLayout, VizPanel } from '@grafana/scenes';
import { CoreApp } from '@grafana/data';
import { sceneGraph, SceneGridItem, SceneGridLayout, SceneQueryRunner, VizPanel } from '@grafana/scenes';
import { DashboardScene } from './DashboardScene';
@ -50,6 +51,24 @@ describe('DashboardScene', () => {
});
});
});
describe('Enriching data requests', () => {
let scene: DashboardScene;
beforeEach(() => {
scene = buildTestScene();
scene.onEnterEditMode();
});
it('Should add app, uid, and panelId', () => {
const queryRunner = sceneGraph.findObject(scene, (o) => o.state.key === 'data-query-runner')!;
expect(scene.enrichDataRequest(queryRunner)).toEqual({
app: CoreApp.Dashboard,
dashboardUID: 'dash-1',
panelId: 1,
});
});
});
});
function buildTestScene() {
@ -65,6 +84,7 @@ function buildTestScene() {
title: 'Panel A',
key: 'panel-1',
pluginId: 'table',
$data: new SceneQueryRunner({ key: 'data-query-runner', queries: [{ refId: 'A' }] }),
}),
}),
new SceneGridItem({

View File

@ -1,7 +1,7 @@
import * as H from 'history';
import { Unsubscribable } from 'rxjs';
import { NavModelItem, UrlQueryMap } from '@grafana/data';
import { CoreApp, DataQueryRequest, NavModelItem, UrlQueryMap } from '@grafana/data';
import { locationService } from '@grafana/runtime';
import {
getUrlSyncManager,
@ -18,7 +18,13 @@ import { DashboardMeta } from 'app/types';
import { DashboardSceneRenderer } from '../scene/DashboardSceneRenderer';
import { SaveDashboardDrawer } from '../serialization/SaveDashboardDrawer';
import { findVizPanelByKey, forceRenderChildren, getDashboardUrl } from '../utils/utils';
import {
findVizPanelByKey,
forceRenderChildren,
getClosestVizPanel,
getDashboardUrl,
getPanelIdForVizPanel,
} from '../utils/utils';
import { DashboardSceneUrlSync } from './DashboardSceneUrlSync';
@ -191,4 +197,17 @@ export class DashboardScene extends SceneObjectBase<DashboardSceneState> {
public closeModal() {
this.setState({ overlay: undefined });
}
/**
* Called by the SceneQueryRunner to privide contextural parameters (tracking) props for the request
*/
public enrichDataRequest(sceneObject: SceneObject): Partial<DataQueryRequest> {
const panel = getClosestVizPanel(sceneObject);
return {
app: CoreApp.Dashboard,
dashboardUID: this.state.uid,
panelId: (panel && getPanelIdForVizPanel(panel)) ?? 0,
};
}
}

View File

@ -174,3 +174,15 @@ export function getDashboardSceneFor(sceneObject: SceneObject): DashboardScene {
throw new Error('SceneObject root is not a DashboardScene');
}
export function getClosestVizPanel(sceneObject: SceneObject): VizPanel | null {
if (sceneObject instanceof VizPanel) {
return sceneObject;
}
if (sceneObject.parent) {
return getClosestVizPanel(sceneObject.parent);
}
return null;
}