From 2cc53f328bb3db53cd5b7133703c4021434da329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 30 Jul 2015 08:28:42 +0200 Subject: [PATCH] fix(templating): fixed scoped vars issue when generating urls for panel links, fixes #2410 --- public/app/features/panellinks/linkSrv.js | 14 +++++----- public/app/features/templating/templateSrv.js | 23 +++++++++------- .../app/panels/singlestat/singleStatPanel.js | 2 +- public/test/specs/templateSrv-specs.js | 26 +++++++++++++++++-- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/public/app/features/panellinks/linkSrv.js b/public/app/features/panellinks/linkSrv.js index 49ddcb95316..413d3d9303b 100644 --- a/public/app/features/panellinks/linkSrv.js +++ b/public/app/features/panellinks/linkSrv.js @@ -59,21 +59,21 @@ function (angular, kbn, _) { return info; }; - this.getPanelLinkAnchorInfo = function(link) { + this.getPanelLinkAnchorInfo = function(link, scopedVars) { var info = {}; if (link.type === 'absolute') { info.target = link.targetBlank ? '_blank' : '_self'; - info.href = templateSrv.replace(link.url || ''); - info.title = templateSrv.replace(link.title || ''); + info.href = templateSrv.replace(link.url || '', scopedVars); + info.title = templateSrv.replace(link.title || '', scopedVars); info.href += '?'; } else if (link.dashUri) { info.href = 'dashboard/' + link.dashUri + '?'; - info.title = templateSrv.replace(link.title || ''); + info.title = templateSrv.replace(link.title || '', scopedVars); info.target = link.targetBlank ? '_blank' : ''; } else { - info.title = templateSrv.replace(link.title || ''); + info.title = templateSrv.replace(link.title || '', scopedVars); var slug = kbn.slugifyForUrl(link.dashboard || ''); info.href = 'dashboard/db/' + slug + '?'; } @@ -87,12 +87,12 @@ function (angular, kbn, _) { } if (link.includeVars) { - templateSrv.fillVariableValuesForUrl(params); + templateSrv.fillVariableValuesForUrl(params, scopedVars); } info.href = this.addParamsToUrl(info.href, params); if (link.params) { - info.href += "&" + templateSrv.replace(link.params); + info.href += "&" + templateSrv.replace(link.params, scopedVars); } return info; diff --git a/public/app/features/templating/templateSrv.js b/public/app/features/templating/templateSrv.js index 40b661b0cbc..b00fba9e71c 100644 --- a/public/app/features/templating/templateSrv.js +++ b/public/app/features/templating/templateSrv.js @@ -115,17 +115,20 @@ function (angular, _) { }); }; - this.fillVariableValuesForUrl = function(params) { - var toUrlVal = function(current) { - if (current.text === 'All') { - return 'All'; - } else { - return current.value; - } - }; - + this.fillVariableValuesForUrl = function(params, scopedVars) { _.each(this.variables, function(variable) { - params['var-' + variable.name] = toUrlVal(variable.current); + var current = variable.current; + var value = current.value; + + if (current.text === 'All') { + value = 'All'; + } + + if (scopedVars && scopedVars[variable.name] !== void 0) { + value = scopedVars[variable.name].value; + } + + params['var-' + variable.name] = value; }); }; diff --git a/public/app/panels/singlestat/singleStatPanel.js b/public/app/panels/singlestat/singleStatPanel.js index 2463ca1e38e..8ef74ba5820 100644 --- a/public/app/panels/singlestat/singleStatPanel.js +++ b/public/app/panels/singlestat/singleStatPanel.js @@ -183,7 +183,7 @@ function (angular, app, _, $) { elem.click(function() { if (panel.links.length === 0) { return; } var link = panel.links[0]; - var linkInfo = linkSrv.getPanelLinkAnchorInfo(link); + var linkInfo = linkSrv.getPanelLinkAnchorInfo(link, scope.panel.scopedVars); if (panel.links[0].targetBlank) { var redirectWindow = window.open(linkInfo.href, '_blank'); redirectWindow.location; diff --git a/public/test/specs/templateSrv-specs.js b/public/test/specs/templateSrv-specs.js index 89bb28f397a..4f8befa14b9 100644 --- a/public/test/specs/templateSrv-specs.js +++ b/public/test/specs/templateSrv-specs.js @@ -109,7 +109,6 @@ define([ describe('when checking if a string contains a variable', function() { beforeEach(function() { _templateSrv.init([{ name: 'test', current: { value: 'muuuu' } }]); - _templateSrv.updateTemplateData(); }); it('should find it with $var syntax', function() { @@ -127,7 +126,6 @@ define([ describe('updateTemplateData with simple value', function() { beforeEach(function() { _templateSrv.init([{ name: 'test', current: { value: 'muuuu' } }]); - _templateSrv.updateTemplateData(); }); it('should set current value and update template data', function() { @@ -136,6 +134,30 @@ define([ }); }); + describe('fillVariableValuesForUrl with multi value', function() { + beforeEach(function() { + _templateSrv.init([{ name: 'test', current: { value: ['val1', 'val2'] }}]); + }); + + it('should set multiple url params', function() { + var params = {}; + _templateSrv.fillVariableValuesForUrl(params); + expect(params['var-test']).to.eql(['val1', 'val2']); + }); + }); + + describe('fillVariableValuesForUrl with multi value and scopedVars', function() { + beforeEach(function() { + _templateSrv.init([{ name: 'test', current: { value: ['val1', 'val2'] }}]); + }); + + it('should set multiple url params', function() { + var params = {}; + _templateSrv.fillVariableValuesForUrl(params, {'test': {value: 'val1'}}); + expect(params['var-test']).to.eql('val1'); + }); + }); + describe('replaceWithText', function() { beforeEach(function() { _templateSrv.init([