DashboardScene: Add macro for interpolating __dashboard variable (#78172)

* DashbaordScene: Add macro for interpoladint __dashboard variable

* Review

* Test fix

* Test fix
This commit is contained in:
Dominik Prokop 2023-11-15 13:05:54 +01:00 committed by GitHub
parent 05febc4665
commit 384db8e0ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 3 deletions

View File

@ -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();
}

View File

@ -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);
});
});

View File

@ -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,
}),

View File

@ -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', () => {