* CI: fix shellcheck issues (#789) Signed-off-by: Mario Trangoni <mjtrangoni@gmail.com> * annotations: fix options in grafana 6.x, fix #813 * fix function editor in Grafana 6.4, closes #810 * add typings for grafana packages * Add $__range_series variable for calculating function over the whole series, #531 * fix tests * Don't set alert styles for react panels, fix #823 * docs: add range variables * docs: percentile reference * fix codespell * update packages (build with node 12) * update circleci node image to 12 * fix test configuration (babel) * Fix 817 (#851) * problems: update panel schema * update packages (build with node 12) * problems: use datasource from target * problems: fix query editor after schema update * problems: fix list layout * update circleci node image to 12 * fix tests * build(deps-dev): bump lodash from 4.17.10 to 4.17.13 (#852) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.10 to 4.17.13. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.10...4.17.13) Signed-off-by: dependabot[bot] <support@github.com> * fix packages security alerts * problems: fix tags adding and removal * fix adding func from typeahead, closes #468 * update change log * bump plugin version to 3.10.5 * problems: fix tag removal (list layout) * Fix percentile() function, closes #862 (#863) Like the other aggregation functions, the datapoints need to be sorted in time before calling groupBy_perf(). * Update copyright, happy New Year! * fix not acknowledged problem color with a message (#858) * fix not acknowledged problem color with a message * fix not acknowledged problem color with a message, closes #857 * Variable query editor (#856) * refactor: convert module to typescript * refactor: covert utils to typescript * variable query editor WIP * variable editor: fix type error after grafana/ui update * variable editor: use FormLabel from grafana/ui * variable editor: refactor * variable editor: input validation and highlights * variable editor: fix tests * variable query: fix backward compatibility with empty queries * fix linter errors * variable editor: fix variable replacement in queries * Fixes for backend Co-authored-by: Mario Trangoni <mario@mariotrangoni.de> Co-authored-by: Alexander Zobnin <alexanderzobnin@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Reibert <mreibert@netskope.com> Co-authored-by: memfiz <arnis.civciss@gmail.com>
107 lines
2.9 KiB
JavaScript
107 lines
2.9 KiB
JavaScript
import angular from 'angular';
|
|
import _ from 'lodash';
|
|
import $ from 'jquery';
|
|
import * as metricFunctions from './metricFunctions';
|
|
|
|
angular
|
|
.module('grafana.directives')
|
|
.directive('addMetricFunction',
|
|
|
|
/** @ngInject */
|
|
function($compile) {
|
|
var inputTemplate = '<input type="text"'+
|
|
' class="gf-form-input"' +
|
|
' spellcheck="false" style="display:none"></input>';
|
|
|
|
var buttonTemplate = '<a class="gf-form-label tight-form-func dropdown-toggle query-part"' +
|
|
' tabindex="1" gf-dropdown="functionMenu" data-toggle="dropdown">' +
|
|
'<i class="fa fa-plus"></i></a>';
|
|
|
|
return {
|
|
link: function($scope, elem) {
|
|
var categories = metricFunctions.getCategories();
|
|
var allFunctions = getAllFunctionNames(categories);
|
|
|
|
$scope.functionMenu = createFunctionDropDownMenu(categories);
|
|
|
|
var $input = $(inputTemplate);
|
|
var $button = $(buttonTemplate);
|
|
$input.appendTo(elem);
|
|
$button.appendTo(elem);
|
|
|
|
$input.attr('data-provide', 'typeahead');
|
|
$input.typeahead({
|
|
source: allFunctions,
|
|
minLength: 1,
|
|
items: 10,
|
|
updater: function (value) {
|
|
var funcDef = metricFunctions.getFuncDef(value);
|
|
if (!funcDef) {
|
|
// try find close match
|
|
value = value.toLowerCase();
|
|
funcDef = _.find(allFunctions, function(funcName) {
|
|
return funcName.toLowerCase().indexOf(value) === 0;
|
|
});
|
|
|
|
if (!funcDef) { return; }
|
|
}
|
|
|
|
$scope.$apply(function() {
|
|
$scope.ctrl.addFunction(funcDef);
|
|
});
|
|
|
|
$input.trigger('blur');
|
|
return '';
|
|
}
|
|
});
|
|
|
|
$button.click(function() {
|
|
$button.hide();
|
|
$input.show();
|
|
$input.focus();
|
|
});
|
|
|
|
$input.keyup(function() {
|
|
elem.toggleClass('open', $input.val() === '');
|
|
});
|
|
|
|
$input.blur(function() {
|
|
// clicking the function dropdown menu won't
|
|
// work if you remove class at once
|
|
setTimeout(function() {
|
|
$input.val('');
|
|
$input.hide();
|
|
$button.show();
|
|
elem.removeClass('open');
|
|
}, 200);
|
|
});
|
|
|
|
$compile(elem.contents())($scope);
|
|
}
|
|
};
|
|
});
|
|
|
|
function getAllFunctionNames(categories) {
|
|
return _.reduce(categories, function(list, category) {
|
|
_.each(category, function(func) {
|
|
list.push(func.name);
|
|
});
|
|
return list;
|
|
}, []);
|
|
}
|
|
|
|
function createFunctionDropDownMenu(categories) {
|
|
return _.map(categories, function(list, category) {
|
|
return {
|
|
text: category,
|
|
submenu: _.map(list, function(value) {
|
|
return {
|
|
text: value.name,
|
|
click: "ctrl.addFunction('" + value.name + "')",
|
|
};
|
|
})
|
|
};
|
|
});
|
|
}
|
|
|