kibana-sinatra 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/lib/kibana/assets/app/app.js +0 -1
  4. data/lib/kibana/assets/app/components/extend-jquery.js +1 -0
  5. data/lib/kibana/assets/app/components/kbn.js +31 -10
  6. data/lib/kibana/assets/app/components/require.config.js +5 -2
  7. data/lib/kibana/assets/app/components/underscore.extended.js +4 -0
  8. data/lib/kibana/assets/app/controllers/dash.js +10 -6
  9. data/lib/kibana/assets/app/controllers/dashLoader.js +0 -3
  10. data/lib/kibana/assets/app/dashboards/logstash.js +2 -2
  11. data/lib/kibana/assets/app/directives/all.js +2 -1
  12. data/lib/kibana/assets/app/directives/esVersion.js +24 -0
  13. data/lib/kibana/assets/app/directives/kibanaPanel.js +9 -8
  14. data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +25 -4
  15. data/lib/kibana/assets/app/filters/all.js +13 -1
  16. data/lib/kibana/assets/app/panels/bettermap/module.js +4 -3
  17. data/lib/kibana/assets/app/panels/derivequeries/editor.html +1 -23
  18. data/lib/kibana/assets/app/panels/derivequeries/module.html +1 -31
  19. data/lib/kibana/assets/app/panels/derivequeries/module.js +3 -110
  20. data/lib/kibana/assets/app/panels/filtering/module.html +8 -8
  21. data/lib/kibana/assets/app/panels/filtering/module.js +11 -1
  22. data/lib/kibana/assets/app/panels/histogram/editor.html +37 -66
  23. data/lib/kibana/assets/app/panels/histogram/module.html +14 -8
  24. data/lib/kibana/assets/app/panels/histogram/module.js +191 -65
  25. data/lib/kibana/assets/app/panels/histogram/queriesEditor.html +43 -0
  26. data/lib/kibana/assets/app/panels/histogram/styleEditor.html +84 -0
  27. data/lib/kibana/assets/app/panels/histogram/timeSeries.js +39 -2
  28. data/lib/kibana/assets/app/panels/hits/module.js +10 -13
  29. data/lib/kibana/assets/app/panels/map/module.js +9 -6
  30. data/lib/kibana/assets/app/panels/pie/module.js +4 -3
  31. data/lib/kibana/assets/app/panels/query/editors/lucene.html +0 -0
  32. data/lib/kibana/assets/app/panels/query/editors/regex.html +0 -0
  33. data/lib/kibana/assets/app/panels/query/editors/topN.html +12 -0
  34. data/lib/kibana/assets/app/panels/query/help/lucene.html +30 -0
  35. data/lib/kibana/assets/app/panels/query/help/regex.html +10 -0
  36. data/lib/kibana/assets/app/panels/query/help/topN.html +14 -0
  37. data/lib/kibana/assets/app/panels/query/helpModal.html +12 -0
  38. data/lib/kibana/assets/app/panels/query/meta.html +29 -16
  39. data/lib/kibana/assets/app/panels/query/module.html +11 -6
  40. data/lib/kibana/assets/app/panels/query/module.js +50 -2
  41. data/lib/kibana/assets/app/panels/query/query.css +8 -0
  42. data/lib/kibana/assets/app/panels/sparklines/editor.html +23 -0
  43. data/lib/kibana/assets/app/panels/sparklines/interval.js +57 -0
  44. data/lib/kibana/assets/app/panels/sparklines/module.html +10 -0
  45. data/lib/kibana/assets/app/panels/sparklines/module.js +379 -0
  46. data/lib/kibana/assets/app/panels/sparklines/timeSeries.js +216 -0
  47. data/lib/kibana/assets/app/panels/table/micropanel.html +36 -18
  48. data/lib/kibana/assets/app/panels/table/modal.html +45 -0
  49. data/lib/kibana/assets/app/panels/table/module.html +15 -3
  50. data/lib/kibana/assets/app/panels/table/module.js +67 -16
  51. data/lib/kibana/assets/app/panels/terms/module.js +8 -4
  52. data/lib/kibana/assets/app/panels/timepicker/module.html +5 -2
  53. data/lib/kibana/assets/app/panels/trends/module.html +8 -2
  54. data/lib/kibana/assets/app/panels/trends/module.js +15 -18
  55. data/lib/kibana/assets/app/partials/dashLoader.html +11 -11
  56. data/lib/kibana/assets/app/partials/dashboard.html +1 -1
  57. data/lib/kibana/assets/app/partials/dasheditor.html +1 -1
  58. data/lib/kibana/assets/app/services/all.js +2 -1
  59. data/lib/kibana/assets/app/services/dashboard.js +5 -4
  60. data/lib/kibana/assets/app/services/esVersion.js +150 -0
  61. data/lib/kibana/assets/app/services/fields.js +3 -3
  62. data/lib/kibana/assets/app/services/filterSrv.js +6 -1
  63. data/lib/kibana/assets/app/services/querySrv.js +153 -38
  64. data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
  65. data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
  66. data/lib/kibana/assets/img/small.png +0 -0
  67. data/lib/kibana/assets/index.html +2 -1
  68. data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +14 -6
  69. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +2 -1
  70. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +33 -12
  71. data/lib/kibana/assets/vendor/chromath.js +34 -0
  72. data/lib/kibana/assets/vendor/jquery/jquery.flot.events.js +641 -0
  73. data/lib/kibana/sinatra/version.rb +1 -1
  74. data/lib/kibana/views/config.erb +2 -1
  75. metadata +22 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 221a7a79930e7d8f883991735a36f74c1b5bd1dd
4
- data.tar.gz: 025fb9fc6da32eec6bc51afd7539787f4a7d7d3d
3
+ metadata.gz: b90d776ed0faabd51b00e390a59c193d63c4eb94
4
+ data.tar.gz: d38a9fb1987082bd9c38ff97be8763c985bf75d4
5
5
  SHA512:
6
- metadata.gz: d1ea7865b8a2402452b6322cc87d86532c5149c118689f90790460a0672277a23834959c076fe4ef84d1b9a5e3ea026d930320b523a33164415e65142b38eb09
7
- data.tar.gz: 3277260d44cb68aff4e94e11715548d49f398b5d4e6344fa4a9c102d681c99093e5199a84ce03ef59bd3db9621672efcee5053aa4fbc629e7aed5d56571af899
6
+ metadata.gz: 9e7aa803378bd32ad9e524ed7c11cb77cff766d936496db3dd8e17ffa08048eddd9090afadf2eca7c67e26b413f875166c8f673a1ce1ba8e425e8f82eaf342cf
7
+ data.tar.gz: 221b2797b0615c18553e404dcae19ba30fc32096c04137e22fc57cff53a703074dcc4b210113e392e1537986b86fe958dda0369218847ffc40bc067855cfa855
data/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  This gem provides [Kibana 3](https://github.com/elasticsearch/kibana) inside a [Sinatra](http://www.sinatrarb.com/) app that you can include in any Rack based system, including Rails.
6
6
 
7
+ It is currently based on Kibana 3 commit [90d765d942f194c9561b3d25b3f7c1bc734e9203](https://github.com/elasticsearch/kibana/commits/master)
8
+
7
9
  ## Installation
8
10
 
9
11
  Add this line to your application's Gemfile:
@@ -6,7 +6,6 @@ define([
6
6
  'jquery',
7
7
  'underscore',
8
8
  'require',
9
-
10
9
  'elasticjs',
11
10
  'bootstrap',
12
11
  'angular-sanitize',
@@ -20,6 +20,7 @@ function ($) {
20
20
  'font-weight' : 200,
21
21
  'background-color': '#1f1f1f',
22
22
  'border-radius': '5px',
23
+ 'z-index': 9999
23
24
  }
24
25
  };
25
26
 
@@ -1,4 +1,4 @@
1
- define(['jquery', 'underscore','moment'],
1
+ define(['jquery','underscore','moment','chromath'],
2
2
  function($, _, moment) {
3
3
  'use strict';
4
4
 
@@ -13,14 +13,10 @@ function($, _, moment) {
13
13
  return field_array.sort();
14
14
  };
15
15
 
16
- kbn.get_all_fields = function(data) {
17
- var fields = [];
18
- _.each(data,function(hit) {
19
- fields = _.uniq(fields.concat(_.keys(hit)));
20
- });
21
- // Remove stupid angular key
22
- fields = _.without(fields,'$$hashKey');
23
- return fields;
16
+ kbn.get_all_fields = function(data,flat) {
17
+ return _.uniq(_.without(_.reduce(data,function(memo,hit) {
18
+ return flat ? memo.concat(_.keys(kbn.flatten_json(hit._source))) : memo.concat(_.keys(hit._source));
19
+ },[]),'$$hashkey'));
24
20
  };
25
21
 
26
22
  kbn.has_field = function(obj,field) {
@@ -41,7 +37,7 @@ function($, _, moment) {
41
37
  }
42
38
  });
43
39
  var counts = _.countBy(_.without(field_array,field),function(field){return field;});
44
- return counts;
40
+ return _.map(counts, function(num, key){return {name:key,count:num};});
45
41
  };
46
42
 
47
43
  kbn.recurse_field_dots = function(object,field) {
@@ -315,6 +311,15 @@ function($, _, moment) {
315
311
  }
316
312
  unit = mathString.charAt(i++);
317
313
  switch (unit) {
314
+ case 'y':
315
+ if (type === 0) {
316
+ roundUp ? dateTime.endOf('year') : dateTime.startOf('year');
317
+ } else if (type === 1) {
318
+ dateTime.add('years',num);
319
+ } else if (type === 2) {
320
+ dateTime.subtract('years',num);
321
+ }
322
+ break;
318
323
  case 'M':
319
324
  if (type === 0) {
320
325
  roundUp ? dateTime.endOf('month') : dateTime.startOf('month');
@@ -458,5 +463,21 @@ function($, _, moment) {
458
463
  ].join(';') + '"></div>';
459
464
  };
460
465
 
466
+ kbn.colorSteps = function(col,steps) {
467
+
468
+ var _d = steps > 5 ? 1.6/steps : 0.25, // distance between steps
469
+ _p = []; // adjustment percentage
470
+
471
+ // Create a range of numbers between -0.8 and 0.8
472
+ for(var i = 1; i<steps+1; i+=1) {
473
+ _p.push(i%2 ? ((i-1)*_d*-1)/2 : i*_d/2);
474
+ }
475
+
476
+ // Create the color range
477
+ return _.map(_p.sort(function(a,b){return a-b;}),function(v) {
478
+ return v<0 ? Chromath.darken(col,v*-1).toString() : Chromath.lighten(col,v).toString();
479
+ });
480
+ };
481
+
461
482
  return kbn;
462
483
  });
@@ -13,7 +13,7 @@ require.config({
13
13
  text: '../vendor/require/text',
14
14
  moment: '../vendor/moment',
15
15
  filesaver: '../vendor/filesaver',
16
-
16
+ chromath: '../vendor/chromath',
17
17
  angular: '../vendor/angular/angular',
18
18
  'angular-dragdrop': '../vendor/angular/angular-dragdrop',
19
19
  'angular-strap': '../vendor/angular/angular-strap',
@@ -32,6 +32,7 @@ require.config({
32
32
 
33
33
  'jquery.flot': '../vendor/jquery/jquery.flot',
34
34
  'jquery.flot.pie': '../vendor/jquery/jquery.flot.pie',
35
+ 'jquery.flot.events': '../vendor/jquery/jquery.flot.events',
35
36
  'jquery.flot.selection': '../vendor/jquery/jquery.flot.selection',
36
37
  'jquery.flot.stack': '../vendor/jquery/jquery.flot.stack',
37
38
  'jquery.flot.stackpercent':'../vendor/jquery/jquery.flot.stackpercent',
@@ -66,6 +67,7 @@ require.config({
66
67
  'jquery-ui': ['jquery'],
67
68
  'jquery.flot': ['jquery'],
68
69
  'jquery.flot.pie': ['jquery', 'jquery.flot'],
70
+ 'jquery.flot.events': ['jquery', 'jquery.flot'],
69
71
  'jquery.flot.selection':['jquery', 'jquery.flot'],
70
72
  'jquery.flot.stack': ['jquery', 'jquery.flot'],
71
73
  'jquery.flot.stackpercent':['jquery', 'jquery.flot'],
@@ -86,5 +88,6 @@ require.config({
86
88
  datepicker: ['jquery', 'bootstrap'],
87
89
 
88
90
  elasticjs: ['angular', '../vendor/elasticjs/elastic']
89
- }
91
+ },
92
+ waitSeconds: 60,
90
93
  });
@@ -18,6 +18,10 @@ function () {
18
18
  array.splice(index, 1);
19
19
  return array;
20
20
  },
21
+ // If variable is value, then return alt. If variable is anything else, return value;
22
+ toggle: function (variable, value, alt) {
23
+ return variable === value ? alt : value;
24
+ },
21
25
  toggleInOut: function(array,value) {
22
26
  if(_.contains(array,value)) {
23
27
  array = _.without(array,value);
@@ -10,13 +10,15 @@ function (angular, config, _) {
10
10
  var module = angular.module('kibana.controllers');
11
11
 
12
12
  module.controller('DashCtrl', function(
13
- $scope, $route, ejsResource, fields, dashboard, alertSrv, panelMove) {
13
+ $scope, $route, ejsResource, fields, dashboard, alertSrv, panelMove, esVersion) {
14
+
15
+ $scope.requiredElasticSearchVersion = ">=0.20.5";
16
+
14
17
  $scope.editor = {
15
18
  index: 0
16
19
  };
17
20
 
18
- // For moving stuff around the dashboard. Needs better names
19
- $scope.panelMove = panelMove;
21
+ // For moving stuff around the dashboard.
20
22
  $scope.panelMoveDrop = panelMove.onDrop;
21
23
  $scope.panelMoveStart = panelMove.onStart;
22
24
  $scope.panelMoveStop = panelMove.onStop;
@@ -24,16 +26,18 @@ function (angular, config, _) {
24
26
  $scope.panelMoveOut = panelMove.onOut;
25
27
 
26
28
 
27
-
28
29
  $scope.init = function() {
29
30
  $scope.config = config;
30
- // Make underscore.js available to views
31
+ // Make stuff, including underscore.js available to views
31
32
  $scope._ = _;
32
33
  $scope.dashboard = dashboard;
33
34
  $scope.dashAlerts = alertSrv;
35
+ $scope.esVersion = esVersion;
36
+
37
+ // Clear existing alerts
34
38
  alertSrv.clearAll();
35
39
 
36
- // Provide a global list of all see fields
40
+ // Provide a global list of all seen fields
37
41
  $scope.fields = fields;
38
42
  $scope.reset_row();
39
43
 
@@ -11,9 +11,6 @@ function (angular, _) {
11
11
  $scope.loader = dashboard.current.loader;
12
12
 
13
13
  $scope.init = function() {
14
- $scope.advancedLoad = false;
15
- $scope.advancedSave = false;
16
-
17
14
  $scope.gist_pattern = /(^\d{5,}$)|(^[a-z0-9]{10,}$)|(gist.github.com(\/*.*)\/[a-z0-9]{5,}\/*$)/;
18
15
  $scope.gist = $scope.gist || {};
19
16
  $scope.elasticsearch = $scope.elasticsearch || {};
@@ -73,7 +73,7 @@ if(!_.isUndefined(ARGS.query)) {
73
73
  queries = {
74
74
  0: {
75
75
  query: '*',
76
- id: 0
76
+ id: 0,
77
77
  }
78
78
  };
79
79
  }
@@ -93,7 +93,7 @@ dashboard.services.filter = {
93
93
  field: ARGS.timefield||"@timestamp",
94
94
  type: "time",
95
95
  active: true,
96
- id: 0
96
+ id: 0,
97
97
  }
98
98
  },
99
99
  ids: [0]
@@ -7,5 +7,6 @@ define([
7
7
  './ngBlur',
8
8
  './ngModelOnBlur',
9
9
  './tip',
10
- './confirmClick'
10
+ './confirmClick',
11
+ './esVersion'
11
12
  ], function () {});
@@ -0,0 +1,24 @@
1
+ /*
2
+ Only show an element if it meets an Elasticsearch version requirement
3
+ */
4
+
5
+ define([
6
+ 'angular',
7
+ 'app',
8
+ ],
9
+ function (angular) {
10
+ 'use strict';
11
+
12
+ angular
13
+ .module('kibana.directives')
14
+ .directive('esVersion', function(esVersion) {
15
+ return {
16
+ restrict: 'A',
17
+ link: function(scope, elem, attr) {
18
+ if(!esVersion.is(attr.esVersion)) {
19
+ elem.hide();
20
+ }
21
+ }
22
+ };
23
+ });
24
+ });
@@ -13,8 +13,15 @@ function (angular) {
13
13
 
14
14
  '<div class="row-fluid panel-extra"><div class="panel-extra-container">' +
15
15
 
16
+
17
+ '<span class="extra row-button" ng-show="panel.editable != false">' +
18
+ '<span confirm-click="row.panels = _.without(row.panels,panel)" '+
19
+ 'confirmation="Are you sure you want to remove this {{panel.type}} panel?" class="pointer">'+
20
+ '<i class="icon-remove pointer" bs-tooltip="\'Remove\'"></i></span>'+
21
+ '</span>' +
22
+
16
23
  '<span class="extra row-button" ng-hide="panel.draggable == false">' +
17
- '<span class="row-text pointer" bs-tooltip="\'Drag here to move\'"' +
24
+ '<span class="pointer" bs-tooltip="\'Drag here to move\'"' +
18
25
  'data-drag=true data-jqyoui-options="{revert: \'invalid\',helper:\'clone\'}"'+
19
26
  ' jqyoui-draggable="'+
20
27
  '{'+
@@ -23,18 +30,12 @@ function (angular) {
23
30
  'index:{{$index}},'+
24
31
  'onStart:\'panelMoveStart\','+
25
32
  'onStop:\'panelMoveStop\''+
26
- '}" ng-model="row.panels">{{panel.type}}</span>'+
33
+ '}" ng-model="row.panels"><i class="icon-move"></i></span>'+
27
34
  '</span>' +
28
35
  '<span class="extra row-button" ng-show="panel.draggable == false">' +
29
36
  '<span class="row-text">{{panel.type}}</span>'+
30
37
  '</span>' +
31
38
 
32
- '<span class="extra row-button" ng-show="panel.editable != false">' +
33
- '<span confirm-click="row.panels = _.without(row.panels,panel)" '+
34
- 'confirmation="Are you sure you want to remove this {{panel.type}} panel?" class="pointer">'+
35
- '<i class="icon-remove pointer" bs-tooltip="\'Remove\'"></i></span>'+
36
- '</span>' +
37
-
38
39
  '<span class="row-button extra" ng-show="panel.editable != false">' +
39
40
  '<span bs-modal="\'app/partials/paneleditor.html\'" class="pointer">'+
40
41
  '<i class="icon-cog pointer" bs-tooltip="\'Configure\'"></i></span>'+
@@ -1,12 +1,19 @@
1
1
  define([
2
- 'angular'
2
+ 'angular',
3
+ 'underscore'
3
4
  ],
4
- function (angular) {
5
+ function (angular, _) {
5
6
  'use strict';
6
7
 
7
8
  angular
8
9
  .module('kibana.directives')
9
10
  .directive('kibanaSimplePanel', function($compile) {
11
+ var panelLoading = '<span ng-show="panelMeta.loading == true">' +
12
+ '<span style="font-size:72px;font-weight:200">'+
13
+ '<i class="icon-spinner icon-spin"></i> loading ...' +
14
+ '</span>'+
15
+ '</span>';
16
+
10
17
  return {
11
18
  restrict: 'E',
12
19
  link: function($scope, elem, attr) {
@@ -22,10 +29,10 @@ function (angular) {
22
29
  elem.removeClass("ng-cloak");
23
30
  }
24
31
 
25
- $scope.$watch(attr.type, function (name) {
32
+ function loadController(name) {
26
33
  elem.addClass("ng-cloak");
27
-
28
34
  // load the panels module file, then render it in the dom.
35
+
29
36
  $scope.require([
30
37
  'jquery',
31
38
  'text!panels/'+name+'/module.html'
@@ -37,6 +44,7 @@ function (angular) {
37
44
  $controllers = $controllers.add($module.find('ngcontroller, [ng-controller], .ng-controller'));
38
45
 
39
46
  if ($controllers.length) {
47
+ $controllers.first().prepend(panelLoading);
40
48
  $scope.require([
41
49
  'panels/'+name+'/module'
42
50
  ], function() {
@@ -46,6 +54,19 @@ function (angular) {
46
54
  loadModule($module);
47
55
  }
48
56
  });
57
+ }
58
+
59
+ $scope.$watch(attr.type, function (name) {
60
+ loadController(name);
61
+ });
62
+
63
+ $scope.$watch(attr.panel, function (panel) {
64
+ // If the panel attribute is specified, create a new scope. This ruins configuration
65
+ // so don't do it with anything that needs to use editor.html
66
+ if(!_.isUndefined(panel)) {
67
+ $scope = $scope.$new();
68
+ $scope.panel = angular.fromJson(panel);
69
+ }
49
70
  });
50
71
  }
51
72
  };
@@ -24,6 +24,18 @@ define(['angular', 'jquery', 'underscore', 'moment'], function (angular, $, _, m
24
24
  };
25
25
  });
26
26
 
27
+ /*
28
+ Filter an array of objects by elasticsearch version requirements
29
+ */
30
+ module.filter('esVersion', function(esVersion) {
31
+ return function(items, require) {
32
+ var ret = _.filter(items,function(qt) {
33
+ return esVersion.is(qt[require]) ? true : false;
34
+ });
35
+ return ret;
36
+ };
37
+ });
38
+
27
39
  module.filter('slice', function() {
28
40
  return function(arr, start, end) {
29
41
  if(!_.isUndefined(arr)) {
@@ -37,7 +49,7 @@ define(['angular', 'jquery', 'underscore', 'moment'], function (angular, $, _, m
37
49
  if(_.isObject(arr) && !_.isArray(arr)) {
38
50
  return angular.toJson(arr);
39
51
  } else {
40
- return arr.toString();
52
+ return _.isNull(arr) ? null : arr.toString();
41
53
  }
42
54
  };
43
55
  });
@@ -101,10 +101,11 @@ function (angular, app, _, L, localRequire) {
101
101
  var _segment = _.isUndefined(segment) ? 0 : segment;
102
102
 
103
103
  $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
104
- // This could probably be changed to a BoolFilter
104
+ var queries = querySrv.getQueryObjs($scope.panel.queries.ids);
105
+
105
106
  var boolQuery = $scope.ejs.BoolQuery();
106
- _.each($scope.panel.queries.ids,function(id) {
107
- boolQuery = boolQuery.should(querySrv.getEjsObj(id));
107
+ _.each(queries,function(q) {
108
+ boolQuery = boolQuery.should(querySrv.toEjsObj(q));
108
109
  });
109
110
 
110
111
  var request = $scope.ejs.Request().indices(dashboard.indices[_segment])
@@ -1,23 +1 @@
1
- <div>
2
- <div class="row-fluid">
3
- <div class="span1">
4
- <label class="small">Length</label>
5
- <input type="number" style="width:80%" ng-model="panel.size" ng-change="set_refresh(true)">
6
- </div>
7
- <div class="span3">
8
- <label class="small">Field</label>
9
- <input type="text" bs-typeahead="fields.list" style="width:80%" ng-change="set_refresh(true)" ng-model='panel.field'></select>
10
- </div>
11
- <div class="span3">
12
- <label class="small">Query Mode</label>
13
- <select style="width:80%" ng-change="set_refresh(true)" ng-model='panel.mode' ng-options="f for f in ['terms only','AND', 'OR']"></select>
14
- </div>
15
- <div class="span4">
16
- <label class="small">Exclude Terms(s) (comma seperated)</label>
17
- <input array-join type="text" style="width:90%" ng-change="set_refresh(true)" ng-model='panel.exclude'></input>
18
- </div>
19
- <div class="span1">
20
- <label class="small"> Rest </label><input type="checkbox" ng-model="panel.rest" ng-checked="panel.rest" ng-change="set_refresh(true)">
21
- </div>
22
- </div>
23
- </div>
1
+ <div></div>
@@ -1,33 +1,3 @@
1
1
  <div ng-controller='derivequeries' ng-init="init()">
2
- <style>
3
- .end-derive {
4
- position:absolute;
5
- right:15px;
6
- top:5px;
7
- }
8
- .panel-derive-field {
9
- text-decoration: underline;
10
- cursor: pointer;
11
- }
12
- .panel-derive {
13
- padding-right: 35px !important;
14
- height: 31px !important;
15
- -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
16
- -moz-box-sizing: border-box; /* Firefox, other Gecko */
17
- box-sizing: border-box; /* Opera/IE 8+ */
18
- }
19
- </style>
20
- <label class="small">Create new queries from
21
- <span class="panel-derive-field" ng-show="!editing" ng-click="editing=true">{{panel.field}}</span>
22
- <select ng-show="editing && fields.list.length>1" class="input-medium" ng-model="panel.field" ng-options="f for f in fields.list" ng-change='editing=false' ng-blur="editing=false"></select>
23
- <input ng-show="editing && fields.list.length<2" type="text" ng-model="panel.field" ng-blur="editing=false"/>
24
- ({{panel.mode}} mode)</label>
25
- <div>
26
- <form class="form-search" style="position:relative" ng-submit="get_data()">
27
- <input class="search-query panel-derive input-block-level" bs-typeahead="panel.history" data-min-length=0 data-items=100 type="text" ng-model="panel.query"/>
28
- <span class="end-derive">
29
- <i class="icon-search pointer" ng-click="get_data()"></i>
30
- </span
31
- </form>
32
- </div>
2
+ <h4>This panel has been removed and replaced with the new topN query type. Click the colored dot associated with a query to configure the, much improved, equivilent of a derived query.</h4>
33
3
  </div>