diff --git a/public/app/features/templating/editorCtrl.js b/public/app/features/templating/editorCtrl.js index 5efebc21e30..a8181ee1db3 100644 --- a/public/app/features/templating/editorCtrl.js +++ b/public/app/features/templating/editorCtrl.js @@ -13,6 +13,7 @@ function (angular, _) { type: 'query', datasource: null, refresh: 0, + sort: 1, name: '', hide: 0, options: [], @@ -34,6 +35,12 @@ function (angular, _) { {value: 2, text: "On Time Range Change"}, ]; + $scope.sortOptions = [ + {value: 0, text: "Without Sort"}, + {value: 1, text: "Alphabetical"}, + {value: 2, text: "Numerical"}, + ]; + $scope.hideOptions = [ {value: 0, text: ""}, {value: 1, text: "Label"}, diff --git a/public/app/features/templating/partials/editor.html b/public/app/features/templating/partials/editor.html index dd5aa6fa543..b55959bad93 100644 --- a/public/app/features/templating/partials/editor.html +++ b/public/app/features/templating/partials/editor.html @@ -181,6 +181,17 @@ +
+ + Sort + + How to sort the values of this variable. + + +
+ +
+
Query diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index fb751a2ce3a..896c152ce35 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -327,7 +327,7 @@ function (angular, _, kbn) { this.metricNamesToVariableValues = function(variable, metricNames) { var regex, options, i, matches; - options = {}; // use object hash to remove duplicates + options = []; if (variable.regex) { regex = kbn.stringToJsRegex(templateSrv.replace(variable.regex)); @@ -355,10 +355,24 @@ function (angular, _, kbn) { } } - options[value] = {text: text, value: value}; + options.push({text: text, value: value}); } + options = _.uniq(options, 'value'); - return _.sortBy(options, 'text'); + if (variable.sort === 1) { + return _.sortBy(options, 'text'); + } else if (variable.sort === 2) { + return _.sortBy(options, function(opt) { + var matches = opt.text.match(/.*?(\d+).*/); + if (!matches) { + return 0; + } else { + return parseInt(matches[1], 10); + } + }); + } else { + return options; + } }; this.addAllOption = function(variable) { diff --git a/public/test/specs/templateValuesSrv-specs.js b/public/test/specs/templateValuesSrv-specs.js index 7a8d8c1fccb..df59b798f3d 100644 --- a/public/test/specs/templateValuesSrv-specs.js +++ b/public/test/specs/templateValuesSrv-specs.js @@ -386,5 +386,43 @@ define([ }); }); + describeUpdateVariable('without sort', function(scenario) { + scenario.setup(function() { + scenario.variable = {type: 'query', query: 'apps.*', name: 'test', sort: 0}; + scenario.queryResult = [{text: 'bbb2'}, {text: 'aaa10'}, { text: 'ccc3'}]; + }); + + it('should return options without sort', function() { + expect(scenario.variable.options[0].text).to.be('bbb2'); + expect(scenario.variable.options[1].text).to.be('aaa10'); + expect(scenario.variable.options[2].text).to.be('ccc3'); + }); + }); + + describeUpdateVariable('with alphabetical sort', function(scenario) { + scenario.setup(function() { + scenario.variable = {type: 'query', query: 'apps.*', name: 'test', sort: 1}; + scenario.queryResult = [{text: 'bbb2'}, {text: 'aaa10'}, { text: 'ccc3'}]; + }); + + it('should return options with alphabetical sort', function() { + expect(scenario.variable.options[0].text).to.be('aaa10'); + expect(scenario.variable.options[1].text).to.be('bbb2'); + expect(scenario.variable.options[2].text).to.be('ccc3'); + }); + }); + + describeUpdateVariable('with numerical sort', function(scenario) { + scenario.setup(function() { + scenario.variable = {type: 'query', query: 'apps.*', name: 'test', sort: 2}; + scenario.queryResult = [{text: 'bbb2'}, {text: 'aaa10'}, { text: 'ccc3'}]; + }); + + it('should return options with numerical sort', function() { + expect(scenario.variable.options[0].text).to.be('bbb2'); + expect(scenario.variable.options[1].text).to.be('ccc3'); + expect(scenario.variable.options[2].text).to.be('aaa10'); + }); + }); }); });