From 76275cae373a4114afdd2086f0f39968d5d99585 Mon Sep 17 00:00:00 2001 From: Sven Klemm Date: Mon, 9 Jul 2018 11:22:03 +0200 Subject: [PATCH] show current value in dropdown when its not part of list --- .../components/sql_part/sql_part_editor.ts | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/public/app/core/components/sql_part/sql_part_editor.ts b/public/app/core/components/sql_part/sql_part_editor.ts index 56329d58a6c..8bac51680ad 100644 --- a/public/app/core/components/sql_part/sql_part_editor.ts +++ b/public/app/core/components/sql_part/sql_part_editor.ts @@ -15,7 +15,7 @@ var template = ` /** @ngInject */ export function sqlPartEditorDirective($compile, templateSrv) { - var paramTemplate = ''; + var paramTemplate = ''; return { restrict: 'E', @@ -30,6 +30,7 @@ export function sqlPartEditorDirective($compile, templateSrv) { var partDef = part.def; var $paramsContainer = elem.find('.query-part-parameters'); var debounceLookup = $scope.debounce; + var cancelBlur = null; $scope.partActions = []; @@ -53,7 +54,23 @@ export function sqlPartEditorDirective($compile, templateSrv) { } } - function inputBlur(paramIndex) { + $scope.inputBlur = function(paramIndex) { + cancelBlur = setTimeout($scope.switchToLink, 200); + }; + + $scope.updater = function(value) { + if (value === part.params[paramIndex]) { + clearTimeout(cancelBlur); + $input.focus(); + } + return value; + setTimeout(function() { + $scope.inputBlur.call($input[0], paramIndex); + }, 0); + return value; + }; + + $scope.switchToLink = function(paramIndex) { /*jshint validthis:true */ var $input = $(this); var $link = $input.prev(); @@ -70,12 +87,12 @@ export function sqlPartEditorDirective($compile, templateSrv) { $input.hide(); $link.show(); - } + }; function inputKeyPress(paramIndex, e) { /*jshint validthis:true */ if (e.which === 13) { - inputBlur.call(this, paramIndex); + $scope.inputBlur.call(this, paramIndex); } } @@ -105,6 +122,12 @@ export function sqlPartEditorDirective($compile, templateSrv) { var dynamicOptions = _.map(result, function(op) { return op.value; }); + + // add current value to dropdown if its not in resultset + if (_.indexOf(dynamicOptions, part.params[paramIndex]) === -1) { + dynamicOptions.unshift(part.params[paramIndex]); + } + callback(dynamicOptions); }); }); @@ -116,12 +139,7 @@ export function sqlPartEditorDirective($compile, templateSrv) { source: typeaheadSource, minLength: 0, items: 1000, - updater: function(value) { - setTimeout(function() { - inputBlur.call($input[0], paramIndex); - }, 0); - return value; - }, + updater: $scope.updater, }); var typeahead = $input.data('typeahead'); @@ -157,13 +175,13 @@ export function sqlPartEditorDirective($compile, templateSrv) { } var paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]); - var $paramLink = $('' + paramValue + ''); + var $paramLink = $('' + paramValue + ''); var $input = $(paramTemplate); $paramLink.appendTo($paramsContainer); $input.appendTo($paramsContainer); - $input.blur(_.partial(inputBlur, index)); + $input.blur(_.partial($scope.inputBlur, index)); $input.keyup(inputKeyDown); $input.keypress(_.partial(inputKeyPress, index)); $paramLink.click(_.partial(clickFuncParam, index));