query_part_editor.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. define([
  2. 'angular',
  3. 'lodash',
  4. 'jquery',
  5. ],
  6. function (angular, _, $) {
  7. 'use strict';
  8. angular
  9. .module('grafana.directives')
  10. .directive('influxQueryPartEditor', function($compile, templateSrv) {
  11. var paramTemplate = '<input type="text" style="display:none"' +
  12. ' class="input-mini tight-form-func-param"></input>';
  13. return {
  14. restrict: 'E',
  15. templateUrl: 'app/plugins/datasource/influxdb/partials/query_part.html',
  16. scope: {
  17. part: "=",
  18. removeAction: "&",
  19. partUpdated: "&",
  20. },
  21. link: function postLink($scope, elem) {
  22. var part = $scope.part;
  23. var partDef = part.def;
  24. var $paramsContainer = elem.find('.query-part-parameters');
  25. var $controlsContainer = elem.find('.tight-form-func-controls');
  26. function clickFuncParam(paramIndex) {
  27. /*jshint validthis:true */
  28. var $link = $(this);
  29. var $input = $link.next();
  30. $input.val(part.params[paramIndex]);
  31. $input.css('width', ($link.width() + 16) + 'px');
  32. $link.hide();
  33. $input.show();
  34. $input.focus();
  35. $input.select();
  36. var typeahead = $input.data('typeahead');
  37. if (typeahead) {
  38. $input.val('');
  39. typeahead.lookup();
  40. }
  41. }
  42. function inputBlur(paramIndex) {
  43. /*jshint validthis:true */
  44. var $input = $(this);
  45. var $link = $input.prev();
  46. var newValue = $input.val();
  47. if (newValue !== '' || part.def.params[paramIndex].optional) {
  48. $link.html(templateSrv.highlightVariablesAsHtml(newValue));
  49. part.updateParam($input.val(), paramIndex);
  50. $scope.$apply($scope.partUpdated);
  51. }
  52. $input.hide();
  53. $link.show();
  54. }
  55. function inputKeyPress(paramIndex, e) {
  56. /*jshint validthis:true */
  57. if(e.which === 13) {
  58. inputBlur.call(this, paramIndex);
  59. }
  60. }
  61. function inputKeyDown() {
  62. /*jshint validthis:true */
  63. this.style.width = (3 + this.value.length) * 8 + 'px';
  64. }
  65. function addTypeahead($input, paramIndex) {
  66. $input.attr('data-provide', 'typeahead');
  67. var options = partDef.params[paramIndex].options;
  68. if (partDef.params[paramIndex].type === 'int') {
  69. options = _.map(options, function(val) { return val.toString(); });
  70. }
  71. $input.typeahead({
  72. source: options,
  73. minLength: 0,
  74. items: 20,
  75. updater: function (value) {
  76. setTimeout(function() {
  77. inputBlur.call($input[0], paramIndex);
  78. }, 0);
  79. return value;
  80. }
  81. });
  82. var typeahead = $input.data('typeahead');
  83. typeahead.lookup = function () {
  84. this.query = this.$element.val() || '';
  85. return this.process(this.source);
  86. };
  87. }
  88. $scope.toggleControls = function() {
  89. var targetDiv = elem.closest('.tight-form');
  90. if (elem.hasClass('show-function-controls')) {
  91. elem.removeClass('show-function-controls');
  92. targetDiv.removeClass('has-open-function');
  93. $controlsContainer.hide();
  94. return;
  95. }
  96. elem.addClass('show-function-controls');
  97. targetDiv.addClass('has-open-function');
  98. $controlsContainer.show();
  99. };
  100. function addElementsAndCompile() {
  101. _.each(partDef.params, function(param, index) {
  102. if (param.optional && part.params.length <= index) {
  103. return;
  104. }
  105. if (index > 0) {
  106. $('<span>, </span>').appendTo($paramsContainer);
  107. }
  108. var paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]);
  109. var $paramLink = $('<a class="graphite-func-param-link pointer">' + paramValue + '</a>');
  110. var $input = $(paramTemplate);
  111. $paramLink.appendTo($paramsContainer);
  112. $input.appendTo($paramsContainer);
  113. $input.blur(_.partial(inputBlur, index));
  114. $input.keyup(inputKeyDown);
  115. $input.keypress(_.partial(inputKeyPress, index));
  116. $paramLink.click(_.partial(clickFuncParam, index));
  117. if (partDef.params[index].options) {
  118. addTypeahead($input, index);
  119. }
  120. });
  121. }
  122. function relink() {
  123. $paramsContainer.empty();
  124. addElementsAndCompile();
  125. }
  126. relink();
  127. }
  128. };
  129. });
  130. });