search.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. define([
  2. 'angular',
  3. 'underscore',
  4. 'config',
  5. 'jquery'
  6. ],
  7. function (angular, _, config, $) {
  8. 'use strict';
  9. var module = angular.module('kibana.controllers');
  10. module.controller('SearchCtrl', function($scope, dashboard, keyboardManager, $element) {
  11. $scope.init = function() {
  12. $scope.elasticsearch = $scope.elasticsearch || {};
  13. $scope.giveSearchFocus = 0;
  14. $scope.selectedIndex = null;
  15. keyboardManager.bind('s', function() {
  16. $element.find('.dropdown').addClass('open');
  17. $scope.giveSearchFocus += 1;
  18. });
  19. keyboardManager.bind('esc', function() {
  20. $element.find('.dropdown').removeClass('open');
  21. });
  22. };
  23. $scope.keyDown = function (evt) {
  24. if (evt.keyCode === 40) {
  25. $scope.selectedIndex = ($scope.selectedIndex || 0) + 1;
  26. }
  27. };
  28. $scope.elasticsearch_dashboards = function(queryStr) {
  29. dashboard.elasticsearch_list(queryStr + '*', 50).then(function(results) {
  30. if(_.isUndefined(results.hits)) {
  31. $scope.search_results = { dashboards: [] };
  32. return;
  33. }
  34. $scope.search_results = { dashboards: results.hits.hits };
  35. });
  36. };
  37. $scope.elasticsearch_dblist = function(queryStr) {
  38. queryStr = queryStr.toLowerCase();
  39. if (queryStr.indexOf('d:') === 0) {
  40. $scope.elasticsearch_dashboards(queryStr.substring(2, queryStr.length));
  41. return;
  42. }
  43. var words = queryStr.split(' ');
  44. var query = $scope.ejs.BoolQuery();
  45. var terms = _.map(words, function(word) {
  46. return $scope.ejs.MatchQuery('metricPath_ng', word).boost(1.2);
  47. });
  48. var ngramQuery = $scope.ejs.BoolQuery();
  49. ngramQuery.must(terms);
  50. var fieldMatchQuery = $scope.ejs.FieldQuery('metricPath', queryStr + "*").boost(1.2);
  51. query.should([ngramQuery, fieldMatchQuery]);
  52. var request = $scope.ejs.Request().indices(config.grafana_index).types('metricKey');
  53. var results = request.query(query).size(20).doSearch();
  54. results.then(function(results) {
  55. if (results && results.hits && results.hits.hits.length > 0) {
  56. $scope.search_results = { metrics: results.hits.hits };
  57. }
  58. else {
  59. $scope.search_results = { metric: [] };
  60. }
  61. });
  62. };
  63. $scope.openSearch = function () {
  64. $scope.giveSearchFocus = $scope.giveSearchFocus + 1;
  65. };
  66. $scope.addMetricToCurrentDashboard = function (metricId) {
  67. dashboard.current.rows.push({
  68. title: '',
  69. height: '250px',
  70. editable: true,
  71. panels: [
  72. {
  73. type: 'graphite',
  74. title: 'test',
  75. span: 12,
  76. targets: [ { target: metricId } ]
  77. }
  78. ]
  79. });
  80. };
  81. });
  82. module.directive('xngFocus', function() {
  83. return function(scope, element, attrs) {
  84. $(element).click(function(e) {
  85. e.stopPropagation();
  86. });
  87. scope.$watch(attrs.xngFocus,function (newValue) {
  88. setTimeout(function() {
  89. newValue && element.focus();
  90. }, 200);
  91. },true);
  92. };
  93. });
  94. });