diff --git a/public/app/features/dashboard-scene/scene/DashboardMacro.ts b/public/app/features/dashboard-scene/scene/DashboardMacro.ts new file mode 100644 index 00000000000..cb74c7f3baf --- /dev/null +++ b/public/app/features/dashboard-scene/scene/DashboardMacro.ts @@ -0,0 +1,40 @@ +import { FormatVariable, SceneObject, sceneUtils } from '@grafana/scenes'; + +import { getDashboardSceneFor } from '../utils/utils'; + +/** + * Handles expressions like ${__dashboard.uid} + */ +class DashboardMacro implements FormatVariable { + public state: { name: string; type: string }; + + public constructor( + name: string, + private _sceneObject: SceneObject + ) { + this.state = { name: name, type: 'dashboard_macro' }; + } + + public getValue(fieldPath?: string): string { + const dashboard = getDashboardSceneFor(this._sceneObject); + switch (fieldPath) { + case 'uid': + return dashboard.state.uid || ''; + case 'title': + case 'name': + case 'id': + default: + return dashboard.state.title; + } + } + + public getValueText?(): string { + return ''; + } +} + +export function registerDashboardMacro() { + const unregister = sceneUtils.registerVariableMacro('__dashboard', DashboardMacro); + + return () => unregister(); +} diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts index 2912d9951f4..7ac19530a5f 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts @@ -113,9 +113,9 @@ describe('transformSaveModelToScene', () => { const scene = createDashboardSceneFromDashboardModel(oldModel); - expect(scene.state.$behaviors).toHaveLength(1); - expect(scene.state.$behaviors![0]).toBeInstanceOf(behaviors.CursorSync); - expect((scene.state.$behaviors![0] as behaviors.CursorSync).state.sync).toEqual(DashboardCursorSync.Crosshair); + expect(scene.state.$behaviors).toHaveLength(2); + expect(scene.state.$behaviors![1]).toBeInstanceOf(behaviors.CursorSync); + expect((scene.state.$behaviors![1] as behaviors.CursorSync).state.sync).toEqual(DashboardCursorSync.Crosshair); }); }); diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts index 637e2b940be..4433de0e3f7 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts @@ -32,6 +32,7 @@ import { DashboardDTO } from 'app/types'; import { AlertStatesDataLayer } from '../scene/AlertStatesDataLayer'; import { DashboardAnnotationsDataLayer } from '../scene/DashboardAnnotationsDataLayer'; +import { registerDashboardMacro } from '../scene/DashboardMacro'; import { DashboardScene } from '../scene/DashboardScene'; import { LibraryVizPanel } from '../scene/LibraryVizPanel'; import { VizPanelLinks, VizPanelLinksMenu } from '../scene/PanelLinks'; @@ -249,6 +250,7 @@ export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel) }), $variables: variables, $behaviors: [ + registerDashboardMacro, new behaviors.CursorSync({ sync: oldModel.graphTooltip, }), diff --git a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts index 101b43873a4..73ba8b7252e 100644 --- a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.test.ts @@ -146,6 +146,15 @@ jest.mock('@grafana/runtime', () => ({ }, }, })); + +jest.mock('@grafana/scenes', () => ({ + ...jest.requireActual('@grafana/scenes'), + sceneUtils: { + ...jest.requireActual('@grafana/scenes').sceneUtils, + registerVariableMacro: jest.fn(), + }, +})); + describe('transformSceneToSaveModel', () => { describe('Given a simple scene with variables', () => { it('Should transform back to persisted model', () => {