From 9f05aa736cadd6de0b2baa2df483ffcdadb66f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 16 Dec 2021 12:05:00 +0100 Subject: [PATCH] Panel: Support using $__interval and $__interval_ms in panel title --- .../dashboard/state/PanelModel.test.ts | 12 +++++++++ .../features/dashboard/state/PanelModel.ts | 27 ++++++++----------- .../features/query/state/PanelQueryRunner.ts | 7 +++++ 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/public/app/features/dashboard/state/PanelModel.test.ts b/public/app/features/dashboard/state/PanelModel.test.ts index 39c5145b44f..83a802b0493 100644 --- a/public/app/features/dashboard/state/PanelModel.test.ts +++ b/public/app/features/dashboard/state/PanelModel.test.ts @@ -233,6 +233,18 @@ describe('PanelModel', () => { const out = model.replaceVariables('hello $aaa and $bbb', extra); expect(out).toBe('hello XXX and BBB'); }); + + it('Can use request scoped vars', () => { + model.getQueryRunner().getLastRequest = () => { + return { + scopedVars: { + __interval: { text: '10m', value: '10m' }, + }, + }; + }; + const out = model.replaceVariables('hello $__interval'); + expect(out).toBe('hello 10m'); + }); }); describe('when changing panel type', () => { diff --git a/public/app/features/dashboard/state/PanelModel.ts b/public/app/features/dashboard/state/PanelModel.ts index 7bfc7c72a7d..8e9acd31793 100644 --- a/public/app/features/dashboard/state/PanelModel.ts +++ b/public/app/features/dashboard/state/PanelModel.ts @@ -564,26 +564,21 @@ export class PanelModel implements DataConfigSource, IPanelModel { } replaceVariables(value: string, extraVars: ScopedVars | undefined, format?: string | Function) { - let vars = this.scopedVars; - - if (extraVars) { - vars = vars ? { ...vars, ...extraVars } : extraVars; - } + const lastRequest = this.getQueryRunner().getLastRequest(); + const vars: ScopedVars = Object.assign({}, this.scopedVars, lastRequest?.scopedVars, extraVars); const allVariablesParams = getVariablesUrlParams(vars); const variablesQuery = urlUtil.toUrlParams(allVariablesParams); const timeRangeUrl = urlUtil.toUrlParams(getTimeSrv().timeRangeForUrl()); - vars = { - ...vars, - [DataLinkBuiltInVars.keepTime]: { - text: timeRangeUrl, - value: timeRangeUrl, - }, - [DataLinkBuiltInVars.includeVars]: { - text: variablesQuery, - value: variablesQuery, - }, + vars[DataLinkBuiltInVars.keepTime] = { + text: timeRangeUrl, + value: timeRangeUrl, + }; + + vars[DataLinkBuiltInVars.includeVars] = { + text: variablesQuery, + value: variablesQuery, }; return getTemplateSrv().replace(value, vars, format); @@ -602,7 +597,7 @@ export class PanelModel implements DataConfigSource, IPanelModel { * If you need the raw title without interpolation use title property instead. * */ getDisplayTitle(): string { - return this.replaceVariables(this.title, {}, 'text'); + return this.replaceVariables(this.title, undefined, 'text'); } } diff --git a/public/app/features/query/state/PanelQueryRunner.ts b/public/app/features/query/state/PanelQueryRunner.ts index 020f2a32d10..94ad9096607 100644 --- a/public/app/features/query/state/PanelQueryRunner.ts +++ b/public/app/features/query/state/PanelQueryRunner.ts @@ -73,6 +73,7 @@ export class PanelQueryRunner { private subscription?: Unsubscribable; private lastResult?: PanelData; private dataConfigSource: DataConfigSource; + private lastRequest?: DataQueryRequest; constructor(dataConfigSource: DataConfigSource) { this.subject = new ReplaySubject(1); @@ -251,6 +252,8 @@ export class PanelQueryRunner { request.interval = norm.interval; request.intervalMs = norm.intervalMs; + this.lastRequest = request; + this.pipeToSubject(runRequest(ds, request), panelId); } catch (err) { console.error('PanelQueryRunner Error', err); @@ -333,6 +336,10 @@ export class PanelQueryRunner { getLastResult(): PanelData | undefined { return this.lastResult; } + + getLastRequest(): DataQueryRequest | undefined { + return this.lastRequest; + } } async function getDataSource(