From 79c0be876f3182d8304bdd9ff1187d3a7d509ae5 Mon Sep 17 00:00:00 2001 From: Dominik Prokop Date: Wed, 14 Aug 2024 16:16:20 +0200 Subject: [PATCH] [v10.4.x] TemplateSrv: Backportable version of 90808 (#91242) * TemplateSrv: Backportable version of 90808 (#90833) TemplateSrv: Backportable version of 90808 (#90816) * TemplateSrv: Add test case for SafeSerializableSceneObject * Update dashboard data source to use scoped vars scene object valueOf * 11.1.x Backportable version of 90808 * lint (cherry picked from commit 2e5b41cbcb403d7dee6ecdfacb94a6bc52cd6e90) * betterer --- .betterer.results | 3 +++ public/app/features/templating/template_srv.ts | 7 +++++-- public/app/plugins/datasource/dashboard/datasource.ts | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.betterer.results b/.betterer.results index 6dfe5f4e261..b87a910ecbc 100644 --- a/.betterer.results +++ b/.betterer.results @@ -4682,6 +4682,9 @@ exports[`better eslint`] = { "public/app/plugins/datasource/cloudwatch/utils/logsRetry.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], + "public/app/plugins/datasource/dashboard/datasource.ts:5381": [ + [0, 0, 0, "Do not use any type assertions.", "0"] + ], "public/app/plugins/datasource/dashboard/runSharedRequest.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] diff --git a/public/app/features/templating/template_srv.ts b/public/app/features/templating/template_srv.ts index 9aa3133080c..7bc046eeb83 100644 --- a/public/app/features/templating/template_srv.ts +++ b/public/app/features/templating/template_srv.ts @@ -15,7 +15,7 @@ import { TemplateSrv as BaseTemplateSrv, VariableInterpolation, } from '@grafana/runtime'; -import { sceneGraph, VariableCustomFormatterFn } from '@grafana/scenes'; +import { sceneGraph, VariableCustomFormatterFn, SceneObject } from '@grafana/scenes'; import { VariableFormatID } from '@grafana/schema'; import { getVariablesCompatibility } from '../dashboard-scene/utils/getVariablesCompatibility'; @@ -249,8 +249,11 @@ export class TemplateSrv implements BaseTemplateSrv { ): string { // Scenes compatability (primary method) is via SceneObject inside scopedVars. This way we get a much more accurate "local" scope for the evaluation if (scopedVars && scopedVars.__sceneObject) { + // We are using valueOf here as __sceneObject can be after scenes 5.6.0 a SafeSerializableSceneObject that overrides valueOf to return the underlying SceneObject + const sceneObject: SceneObject = scopedVars.__sceneObject.value.valueOf(); + return sceneGraph.interpolate( - scopedVars.__sceneObject.value, + sceneObject, target, scopedVars, format as string | VariableCustomFormatterFn | undefined diff --git a/public/app/plugins/datasource/dashboard/datasource.ts b/public/app/plugins/datasource/dashboard/datasource.ts index c90c36d6963..641a15e02a2 100644 --- a/public/app/plugins/datasource/dashboard/datasource.ts +++ b/public/app/plugins/datasource/dashboard/datasource.ts @@ -6,6 +6,7 @@ import { DataQueryResponse, DataSourceInstanceSettings, TestDataSourceResponse, + ScopedVar, } from '@grafana/data'; import { SceneDataProvider, SceneDataTransformer, SceneObject } from '@grafana/scenes'; import { findVizPanelByKey, getVizPanelKeyForPanelId } from 'app/features/dashboard-scene/utils/utils'; @@ -25,7 +26,8 @@ export class DashboardDatasource extends DataSourceApi { } query(options: DataQueryRequest): Observable { - const scene: SceneObject | undefined = options.scopedVars?.__sceneObject?.value; + const sceneScopedVar: ScopedVar | undefined = options.scopedVars?.__sceneObject; + let scene: SceneObject | undefined = sceneScopedVar ? (sceneScopedVar.value.valueOf() as SceneObject) : undefined; if (!scene) { throw new Error('Can only be called from a scene');