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'; 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() { function buildTestScene() {
@ -65,6 +84,7 @@ function buildTestScene() {
title: 'Panel A', title: 'Panel A',
key: 'panel-1', key: 'panel-1',
pluginId: 'table', pluginId: 'table',
$data: new SceneQueryRunner({ key: 'data-query-runner', queries: [{ refId: 'A' }] }),
}), }),
}), }),
new SceneGridItem({ new SceneGridItem({

View File

@ -1,7 +1,7 @@
import * as H from 'history'; import * as H from 'history';
import { Unsubscribable } from 'rxjs'; import { Unsubscribable } from 'rxjs';
import { NavModelItem, UrlQueryMap } from '@grafana/data'; import { CoreApp, DataQueryRequest, NavModelItem, UrlQueryMap } from '@grafana/data';
import { locationService } from '@grafana/runtime'; import { locationService } from '@grafana/runtime';
import { import {
getUrlSyncManager, getUrlSyncManager,
@ -18,7 +18,13 @@ import { DashboardMeta } from 'app/types';
import { DashboardSceneRenderer } from '../scene/DashboardSceneRenderer'; import { DashboardSceneRenderer } from '../scene/DashboardSceneRenderer';
import { SaveDashboardDrawer } from '../serialization/SaveDashboardDrawer'; 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'; import { DashboardSceneUrlSync } from './DashboardSceneUrlSync';
@ -191,4 +197,17 @@ export class DashboardScene extends SceneObjectBase<DashboardSceneState> {
public closeModal() { public closeModal() {
this.setState({ overlay: undefined }); 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'); 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;
}