kibana-sinatra 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +28 -3
  3. data/lib/kibana/assets/app/app.js +16 -4
  4. data/lib/kibana/assets/app/components/require.config.js +2 -1
  5. data/lib/kibana/assets/app/components/settings.js +4 -3
  6. data/lib/kibana/assets/app/controllers/dash.js +1 -1
  7. data/lib/kibana/assets/app/controllers/dashLoader.js +5 -4
  8. data/lib/kibana/assets/app/dashboards/blank.json +2 -1
  9. data/lib/kibana/assets/app/dashboards/default.json +4 -51
  10. data/lib/kibana/assets/app/dashboards/guided.json +2 -1
  11. data/lib/kibana/assets/app/dashboards/logstash.json +2 -0
  12. data/lib/kibana/assets/app/dashboards/noted.json +2 -1
  13. data/lib/kibana/assets/app/directives/addPanel.js +5 -0
  14. data/lib/kibana/assets/app/directives/all.js +2 -1
  15. data/lib/kibana/assets/app/directives/configModal.js +34 -0
  16. data/lib/kibana/assets/app/directives/kibanaPanel.js +10 -4
  17. data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +10 -8
  18. data/lib/kibana/assets/app/panels/bettermap/editor.html +4 -4
  19. data/lib/kibana/assets/app/panels/bettermap/module.js +1 -1
  20. data/lib/kibana/assets/app/panels/dashcontrol/module.html +1 -4
  21. data/lib/kibana/assets/app/panels/histogram/editor.html +22 -22
  22. data/lib/kibana/assets/app/panels/histogram/module.html +4 -4
  23. data/lib/kibana/assets/app/panels/histogram/module.js +30 -24
  24. data/lib/kibana/assets/app/panels/histogram/timeSeries.js +16 -0
  25. data/lib/kibana/assets/app/panels/hits/editor.html +9 -9
  26. data/lib/kibana/assets/app/panels/map/editor.html +4 -4
  27. data/lib/kibana/assets/app/panels/pie/editor.html +47 -42
  28. data/lib/kibana/assets/app/panels/table/editor.html +39 -38
  29. data/lib/kibana/assets/app/panels/table/module.html +14 -5
  30. data/lib/kibana/assets/app/panels/table/module.js +23 -19
  31. data/lib/kibana/assets/app/panels/table/pagination.html +29 -24
  32. data/lib/kibana/assets/app/panels/terms/editor.html +53 -47
  33. data/lib/kibana/assets/app/panels/terms/module.js +7 -5
  34. data/lib/kibana/assets/app/panels/timepicker/module.html +2 -2
  35. data/lib/kibana/assets/app/partials/dashLoader.html +6 -6
  36. data/lib/kibana/assets/app/partials/dasheditor.html +127 -117
  37. data/lib/kibana/assets/app/partials/paneladd.html +1 -1
  38. data/lib/kibana/assets/app/partials/paneleditor.html +2 -2
  39. data/lib/kibana/assets/app/partials/panelgeneral.html +19 -17
  40. data/lib/kibana/assets/app/partials/roweditor.html +3 -3
  41. data/lib/kibana/assets/app/services/dashboard.js +67 -16
  42. data/lib/kibana/assets/app/services/fields.js +18 -15
  43. data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
  44. data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
  45. data/lib/kibana/assets/vendor/angular/angular.js +17 -0
  46. data/lib/kibana/assets/vendor/bootstrap/less/modals.less +3 -11
  47. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +2 -3
  48. data/lib/kibana/assets/vendor/jquery/jquery.flot.js +2 -2
  49. data/lib/kibana/sinatra/version.rb +1 -1
  50. data/lib/kibana/views/config.erb +17 -7
  51. metadata +3 -5
  52. data/lib/kibana/assets/app/panels/dashcontrol/load.html +0 -40
  53. data/lib/kibana/assets/app/panels/dashcontrol/save.html +0 -30
  54. data/lib/kibana/assets/app/panels/dashcontrol/share.html +0 -11
@@ -10,15 +10,21 @@
10
10
  <div class="row-fluid">
11
11
  <div bindonce ng-class="{'span3':panel.field_list}" ng-if="panel.field_list">
12
12
  <div class="sidebar-nav">
13
- <strong>Fields <i class=" icon-chevron-sign-left pointer " ng-click="panel.field_list = !panel.field_list" bs-tooltip="'Hide field list'" ng-show="panel.field_list"></i></strong><p>
13
+ <strong>Fields <i class=" icon-chevron-sign-left pointer " ng-click="panel.field_list = !panel.field_list" bs-tooltip="'Hide field list'"></i></strong><p>
14
14
  <div class="small">
15
- <span class="link" ng-click="panel.all_fields = true;" ng-class="{strong:panel.all_fields}">
16
- All ({{fields.list.length}})</span><br>
17
- <span class="link" ng-click="panel.all_fields = false;" ng-class="{strong:!panel.all_fields}">
15
+ <span class="link small" ng-click="panel.all_fields = true;" ng-if="fields.list.length" ng-class="{strong:panel.all_fields}">
16
+ All ({{fields.list.length}})</span> /
17
+ <span class="link small" ng-click="panel.all_fields = false;" ng-class="{strong:!panel.all_fields}">
18
18
  Current ({{current_fields.length || 0}})</span>
19
19
 
20
20
  </div>
21
21
  <div><input type="text" class="input-medium" placeholder="Type to filter..." ng-model="fieldFilter"></div>
22
+ <div ng-show="panel.all_fields" class="small muted" style="margin-bottom:10px">
23
+ <strong>Note</strong> These fields have been<br>
24
+ extracted from your mapping.<br>
25
+ Not all fields may be available<br>
26
+ in your source document.
27
+ </div>
22
28
 
23
29
  <ul class="unstyled" style="{{panel.overflow}}:{{panel.height || row.height}};overflow-y:auto;overflow-x:hidden;" ng-if="panel.all_fields">
24
30
  <li ng-style="panel.style" ng-repeat="field in fields.list|filter:fieldFilter|orderBy:identity">
@@ -69,7 +75,10 @@
69
75
  <tbody bindonce ng-repeat="event in data| slice:panel.offset:panel.offset+panel.size" ng-class-odd="'odd'">
70
76
  <tr ng-click="toggle_details(event)" class="pointer">
71
77
  <td ng-if="panel.fields.length<1" bo-text="event._source|stringify|tableTruncate:panel.trimFactor:1"></td>
72
- <td ng-show="panel.fields.length>0" ng-repeat="field in panel.fields" bo-html="(event.kibana.highlight[field]||event.kibana._source[field]) |tableHighlight | tableTruncate:panel.trimFactor:panel.fields.length"></td>
78
+ <td ng-show="panel.fields.length>0" ng-repeat="field in panel.fields">
79
+ <span ng-if="!panel.localTime || panel.timeField != field" bo-html="(event.kibana.highlight[field]||event.kibana._source[field]) |tableHighlight | tableTruncate:panel.trimFactor:panel.fields.length"></span>
80
+ <span ng-if="panel.localTime && panel.timeField == field" bo-html="event.sort[1]|tableLocalTime:event"></span>
81
+ </td>
73
82
  </tr>
74
83
  <tr ng-if="event.kibana.details">
75
84
  <td colspan={{panel.fields.length}} ng-switch="event.kibana.view">
@@ -109,6 +109,14 @@ function (angular, app, _, kbn, moment) {
109
109
  * still available in the expanded view of the event.
110
110
  */
111
111
  trimFactor: 300,
112
+ /** @scratch /panels/table/5
113
+ * localTime:: Set to true to adjust the timeField to the browser's local time
114
+ */
115
+ localTime: false,
116
+ /** @scratch /panels/table/5
117
+ * timeField:: If localTime is set to true, this field will be adjusted to the browsers local time
118
+ */
119
+ timeField: '@timestamp',
112
120
  /** @scratch /panels/table/5
113
121
  * spyable:: Set to false to disable the inspect icon
114
122
  */
@@ -258,7 +266,8 @@ function (angular, app, _, kbn, moment) {
258
266
  _segment,
259
267
  request,
260
268
  boolQuery,
261
- results;
269
+ queries,
270
+ sort;
262
271
 
263
272
  $scope.panel.error = false;
264
273
 
@@ -267,6 +276,12 @@ function (angular, app, _, kbn, moment) {
267
276
  return;
268
277
  }
269
278
 
279
+ sort = [$scope.ejs.Sort($scope.panel.sort[0]).order($scope.panel.sort[1])];
280
+ if($scope.panel.localTime) {
281
+ sort.push($scope.ejs.Sort($scope.panel.timeField).order($scope.panel.sort[1]));
282
+ }
283
+
284
+
270
285
  $scope.panelMeta.loading = true;
271
286
 
272
287
  _segment = _.isUndefined(segment) ? 0 : segment;
@@ -275,7 +290,8 @@ function (angular, app, _, kbn, moment) {
275
290
  request = $scope.ejs.Request().indices(dashboard.indices[_segment]);
276
291
 
277
292
  $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
278
- var queries = querySrv.getQueryObjs($scope.panel.queries.ids);
293
+
294
+ queries = querySrv.getQueryObjs($scope.panel.queries.ids);
279
295
 
280
296
  boolQuery = $scope.ejs.BoolQuery();
281
297
  _.each(queries,function(q) {
@@ -294,14 +310,12 @@ function (angular, app, _, kbn, moment) {
294
310
  .postTags('@end-highlight@')
295
311
  )
296
312
  .size($scope.panel.size*$scope.panel.pages)
297
- .sort($scope.panel.sort[0],$scope.panel.sort[1]);
313
+ .sort(sort);
298
314
 
299
315
  $scope.populate_modal(request);
300
316
 
301
- results = request.doSearch();
302
-
303
317
  // Populate scope when we have results
304
- results.then(function(results) {
318
+ request.doSearch().then(function(results) {
305
319
  $scope.panelMeta.loading = false;
306
320
 
307
321
  if(_segment === 0) {
@@ -470,19 +484,9 @@ function (angular, app, _, kbn, moment) {
470
484
  });
471
485
 
472
486
  // WIP
473
- module.filter('tableFieldFormat', function(fields){
474
- return function(text,field,event,scope) {
475
- var type;
476
- if(
477
- !_.isUndefined(fields.mapping[event._index]) &&
478
- !_.isUndefined(fields.mapping[event._index][event._type])
479
- ) {
480
- type = fields.mapping[event._index][event._type][field]['type'];
481
- if(type === 'date' && scope.panel.normTimes) {
482
- return moment(text).format('YYYY-MM-DD HH:mm:ss');
483
- }
484
- }
485
- return text;
487
+ module.filter('tableLocalTime', function(){
488
+ return function(text,event) {
489
+ return moment(event.sort[1]).format("YYYY-MM-DDTHH:mm:ss.SSSZ");
486
490
  };
487
491
  });
488
492
 
@@ -1,27 +1,32 @@
1
- <div class="row-fluid">
2
- <div class="span3">
3
- <h6>Show Controls</h6><input type="checkbox" ng-model="panel.paging" ng-checked="panel.paging">
1
+ <div class="editor-row">
2
+ <div class="section">
3
+ <div class="editor-option">
4
+ <h6>Show Controls</h6><input type="checkbox" ng-model="panel.paging" ng-checked="panel.paging">
5
+ </div>
6
+ <div class="editor-option">
7
+ <h6>Overflow</h6>
8
+ <select class="input-small" ng-model="panel.overflow" ng-options="f.value as f.key for f in [{key:'scroll',value:'height'},{key:'expand',value:'min-height'}]"></select>
9
+ </div>
4
10
  </div>
5
- <div class="span2">
6
- <h6>Overflow</h6>
7
- <select class="input-small" ng-model="panel.overflow" ng-options="f.value as f.key for f in [{key:'scroll',value:'height'},{key:'expand',value:'min-height'}]"></select>
8
- </div>
9
- </div>
10
- <div class="row-fluid">
11
- <div class="span2">
12
- <h6>Per Page</h6>
13
- <input type="number" class="input-mini" ng-model="panel.size" ng-change="get_data()">
14
- </div>
15
- <div class="span1">
16
- <h6>&nbsp;</h6>
17
- <center><i class='icon-remove'></i><center>
18
- </div>
19
- <div class="span2">
20
- <h6>Page limit</h6>
21
- <input type="number" class="input-mini" ng-model="panel.pages" ng-change="get_data()">
22
- </div>
23
- <div class="span2 large">
24
- <h6>Pageable</h6>
25
- <strong class="large">= {{panel.size * panel.pages}}</strong>
11
+
12
+ <div class="section">
13
+ <div class="editor-option">
14
+ <h6>Per Page</h6>
15
+ <input type="number" class="input-mini" ng-model="panel.size" ng-change="get_data()">
16
+ </div>
17
+ <div class="editor-option">
18
+ <h6>&nbsp;</h6>
19
+ <center><i class='icon-remove'></i><center>
20
+ </div>
21
+ <div class="editor-option">
22
+ <h6>Page limit</h6>
23
+ <input type="number" class="input-mini" ng-model="panel.pages" ng-change="get_data()">
24
+ </div>
25
+ <div class="editor-option large">
26
+ <h6>Pageable</h6>
27
+ <strong class="large">= {{panel.size * panel.pages}}</strong>
28
+ </div>
26
29
  </div>
30
+
27
31
  </div>
32
+
@@ -1,51 +1,57 @@
1
- <div class="row-fluid">
2
- <div class="span2">
3
- <label class="small">Field</label>
4
- <input type="text" class="input-small" bs-typeahead="fields.list" ng-model="panel.field" ng-change="set_refresh(true)">
5
- </div>
6
- <div class="span2">
7
- <label class="small">Length</label>
8
- <input class="input-small" type="number" ng-model="panel.size" ng-change="set_refresh(true)">
9
- </div>
10
- <div class="span3">
11
- <label class="small">Order</label>
12
- <select class="input-medium" ng-model="panel.order" ng-options="f for f in ['count','term','reverse_count','reverse_term']" ng-change="set_refresh(true)"></select></span>
13
- </div>
14
- <div class="span4">
15
- <label class="small">Exclude Terms(s) (comma seperated)</label>
16
- <input array-join type="text" ng-model='panel.exclude'></input>
1
+ <div class="editor-row">
2
+ <div class="section">
3
+ <h5>Parameters</h5>
4
+ <div class="editor-option">
5
+ <label class="small">Field</label>
6
+ <input type="text" class="input-small" bs-typeahead="fields.list" ng-model="panel.field" ng-change="set_refresh(true)">
7
+ </div>
8
+ <div class="editor-option">
9
+ <label class="small">Length</label>
10
+ <input class="input-small" type="number" ng-model="panel.size" ng-change="set_refresh(true)">
11
+ </div>
12
+ <div class="editor-option">
13
+ <label class="small">Order</label>
14
+ <select class="input-medium" ng-model="panel.order" ng-options="f for f in ['count','term','reverse_count','reverse_term']" ng-change="set_refresh(true)"></select></span>
15
+ </div>
16
+ <div class="editor-option">
17
+ <label class="small">Exclude Terms(s) (comma seperated)</label>
18
+ <input array-join type="text" ng-model='panel.exclude'></input>
19
+ </div>
17
20
  </div>
18
21
  </div>
19
- <div class="row-fluid">
20
- <div class="span2">
21
- <label class="small">Style</label>
22
- <select class="input-small" ng-model="panel.chart" ng-options="f for f in ['bar','pie','table']"></select></span>
23
- </div>
24
- <div class="span2" ng-show="panel.chart == 'table'">
25
- <label class="small">Font Size</label>
26
- <select class="input-mini" ng-model="panel.style['font-size']" ng-options="f for f in ['7pt','8pt','9pt','10pt','12pt','14pt','16pt','18pt','20pt','24pt','28pt','32pt','36pt','42pt','48pt','52pt','60pt','72pt']"></select></span>
27
- </div>
28
- <div class="span2" ng-show="panel.chart == 'bar' || panel.chart == 'pie'">
29
- <label class="small">Legend</label>
30
- <select class="input-small" ng-model="panel.counter_pos" ng-options="f for f in ['above','below','none']"></select></span>
31
- </div>
32
- <div class="span3" ng-show="panel.chart != 'table' && panel.counter_pos != 'none'">
33
- <label class="small" >Legend Format</label>
34
- <select class="input-small" ng-model="panel.arrangement" ng-options="f for f in ['horizontal','vertical']"></select></span>
35
- </div>
36
- <div class="span1">
37
- <label class="small">Missing</label><input type="checkbox" ng-model="panel.missing" ng-checked="panel.missing">
38
- </div>
39
- <div class="span1">
40
- <label class="small">Other</label><input type="checkbox" ng-model="panel.other" ng-checked="panel.other">
41
- </div>
42
- <div class="span1" ng-show="panel.chart == 'pie'">
43
- <label class="small">Donut</label><input type="checkbox" ng-model="panel.donut" ng-checked="panel.donut">
44
- </div>
45
- <div class="span1" ng-show="panel.chart == 'pie'">
46
- <label class="small">Tilt</label><input type="checkbox" ng-model="panel.tilt" ng-checked="panel.tilt">
47
- </div>
48
- <div class="span1" ng-show="panel.chart == 'pie'">
49
- <label class="small">Labels</label><input type="checkbox" ng-model="panel.labels" ng-checked="panel.labels">
22
+ <div class="editor-row">
23
+ <div class="section">
24
+ <h5>View Options</h5>
25
+ <div class="editor-option">
26
+ <label class="small">Style</label>
27
+ <select class="input-small" ng-model="panel.chart" ng-options="f for f in ['bar','pie','table']"></select></span>
28
+ </div>
29
+ <div class="editor-option" ng-show="panel.chart == 'table'">
30
+ <label class="small">Font Size</label>
31
+ <select class="input-mini" ng-model="panel.style['font-size']" ng-options="f for f in ['7pt','8pt','9pt','10pt','12pt','14pt','16pt','18pt','20pt','24pt','28pt','32pt','36pt','42pt','48pt','52pt','60pt','72pt']"></select></span>
32
+ </div>
33
+ <div class="editor-option" ng-show="panel.chart == 'bar' || panel.chart == 'pie'">
34
+ <label class="small">Legend</label>
35
+ <select class="input-small" ng-model="panel.counter_pos" ng-options="f for f in ['above','below','none']"></select></span>
36
+ </div>
37
+ <div class="editor-option" ng-show="panel.chart != 'table' && panel.counter_pos != 'none'">
38
+ <label class="small" >Legend Format</label>
39
+ <select class="input-small" ng-model="panel.arrangement" ng-options="f for f in ['horizontal','vertical']"></select></span>
40
+ </div>
41
+ <div class="editor-option">
42
+ <label class="small">Missing</label><input type="checkbox" ng-model="panel.missing" ng-checked="panel.missing">
43
+ </div>
44
+ <div class="editor-option">
45
+ <label class="small">Other</label><input type="checkbox" ng-model="panel.other" ng-checked="panel.other">
46
+ </div>
47
+ <div class="editor-option" ng-show="panel.chart == 'pie'">
48
+ <label class="small">Donut</label><input type="checkbox" ng-model="panel.donut" ng-checked="panel.donut">
49
+ </div>
50
+ <div class="editor-option" ng-show="panel.chart == 'pie'">
51
+ <label class="small">Tilt</label><input type="checkbox" ng-model="panel.tilt" ng-checked="panel.tilt">
52
+ </div>
53
+ <div class="editor-option" ng-show="panel.chart == 'pie'">
54
+ <label class="small">Labels</label><input type="checkbox" ng-model="panel.labels" ng-checked="panel.labels">
55
+ </div>
50
56
  </div>
51
57
  </div>
@@ -22,7 +22,7 @@ function (angular, app, _, $, kbn) {
22
22
  var module = angular.module('kibana.panels.terms', []);
23
23
  app.useModule(module);
24
24
 
25
- module.controller('terms', function($scope, querySrv, dashboard, filterSrv) {
25
+ module.controller('terms', function($scope, querySrv, dashboard, filterSrv, fields) {
26
26
  $scope.panelMeta = {
27
27
  modals : [
28
28
  {
@@ -134,6 +134,9 @@ function (angular, app, _, $, kbn) {
134
134
  boolQuery,
135
135
  queries;
136
136
 
137
+ $scope.field = _.contains(fields.list,$scope.panel.field+'.raw') ?
138
+ $scope.panel.field+'.raw' : $scope.panel.field;
139
+
137
140
  request = $scope.ejs.Request().indices(dashboard.indices);
138
141
 
139
142
  $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
@@ -145,11 +148,10 @@ function (angular, app, _, $, kbn) {
145
148
  boolQuery = boolQuery.should(querySrv.toEjsObj(q));
146
149
  });
147
150
 
148
-
149
151
  // Terms mode
150
152
  request = request
151
153
  .facet($scope.ejs.TermsFacet('terms')
152
- .field($scope.panel.field)
154
+ .field($scope.field)
153
155
  .size($scope.panel.size)
154
156
  .order($scope.panel.order)
155
157
  .exclude($scope.panel.exclude)
@@ -187,10 +189,10 @@ function (angular, app, _, $, kbn) {
187
189
 
188
190
  $scope.build_search = function(term,negate) {
189
191
  if(_.isUndefined(term.meta)) {
190
- filterSrv.set({type:'terms',field:$scope.panel.field,value:term.label,
192
+ filterSrv.set({type:'terms',field:$scope.field,value:term.label,
191
193
  mandate:(negate ? 'mustNot':'must')});
192
194
  } else if(term.meta === 'missing') {
193
- filterSrv.set({type:'exists',field:$scope.panel.field,
195
+ filterSrv.set({type:'exists',field:$scope.field,
194
196
  mandate:(negate ? 'must':'mustNot')});
195
197
  } else {
196
198
  return;
@@ -15,7 +15,7 @@
15
15
  <ul class="nav nav-pills timepicker-dropdown">
16
16
  <li class="dropdown">
17
17
 
18
- <a class="dropdown-toggle timepicker-dropdown" data-toggle="dropdown" href="" bs-tooltip="(time.from.date | date:'yyyy-MM-dd HH:mm:ss.sss') + ' <br>to<br>' +(time.to.date | date:'yyyy-MM-dd HH:mm:ss.sss')" data-placement="bottom" ng-click="dismiss();">
18
+ <a class="dropdown-toggle timepicker-dropdown" data-toggle="dropdown" href="" bs-tooltip="time.from.date ? (time.from.date | date:'yyyy-MM-dd HH:mm:ss.sss') + ' <br>to<br>' +(time.to.date | date:'yyyy-MM-dd HH:mm:ss.sss') : 'Click to set a time filter'" data-placement="bottom" ng-click="dismiss();">
19
19
 
20
20
  <span ng-show="filterSrv.idsByType('time').length">
21
21
  <span class="pointer" ng-hide="panel.now">{{time.from.date | date:'MMM d, y HH:mm:ss'}}</span>
@@ -24,7 +24,7 @@
24
24
  <span class="pointer" ng-hide="panel.now" >{{time.to.date | date:'MMM d, y HH:mm:ss'}}</span>
25
25
  <span class="pointer" ng-show="panel.now">{{time.to.date | moment:'ago'}}</span>
26
26
  </span>
27
- <span ng-hide="filterSrv.idsByType('time').length">Set a time filter</span>
27
+ <span ng-hide="filterSrv.idsByType('time').length">Time filter</span>
28
28
  <span ng-show="dashboard.current.refresh" class="text-warning">refreshed every {{dashboard.current.refresh}} </span>
29
29
  <i class="icon-caret-down"></i>
30
30
  </a>
@@ -14,15 +14,15 @@
14
14
 
15
15
 
16
16
  <ul class="dropdown-menu" style="padding:10px">
17
- <li ng-show='dashboard.current.loader.load_elasticsearch'>
17
+ <li ng-if='dashboard.current.loader.load_elasticsearch'>
18
18
  <form class="nomargin">
19
19
  <input type="text" ng-model="elasticsearch.query" ng-change="elasticsearch_dblist('title:'+elasticsearch.query+'*')" placeholder="Type to filter"/>
20
20
  </form>
21
21
  <h6 ng-hide="elasticsearch.dashboards.length">No dashboards matching your query found</h6>
22
22
  <table class="table table-condensed table-striped">
23
- <tr ng-repeat="row in elasticsearch.dashboards | orderBy:['_id']">
23
+ <tr bindonce ng-repeat="row in elasticsearch.dashboards | orderBy:['_id']">
24
24
  <td><a ng-click="elasticsearch_delete(row._id)"><i class="icon-remove"></i></a></td>
25
- <td><a href="#/dashboard/elasticsearch/{{row._id}}">{{row._id}}</a></td>
25
+ <td><a href="#/dashboard/elasticsearch/{{row._id}}" bo-text="row._id"></a></td>
26
26
  <td><a><i class="icon-share" ng-click="share = dashboard.share_link(row._id,'elasticsearch',row._id)" bs-modal="'app/panels/dashcontrol/share.html'"></i></a></td>
27
27
  </tr>
28
28
  </table>
@@ -40,7 +40,7 @@
40
40
  <li ng-show='dashboard.current.loader.load_gist'>
41
41
  <h5>Gist <tip>Enter a gist number or url</tip></h5>
42
42
  <form>
43
- <input type="text" ng-model="gist.url"/ placeholder="Gist number or URL"><br>
43
+ <input type="text" ng-model="gist.url" placeholder="Gist number or URL"><br>
44
44
  <button class="btn" ng-click="gist_dblist(dashboard.gist_id(gist.url))" ng-show="dashboard.is_gist(gist.url)"><i class="icon-github-alt"></i> Get gist:{{gist.url | gistid}}</button>
45
45
  <h6 ng-show="gist.files.length">Dashboards in gist:{{gist.url | gistid}} <small>click to load</small></h6>
46
46
  <h6 ng-hide="gist.files.length || !gist.url.length">No gist dashboards found</h6>
@@ -78,10 +78,10 @@
78
78
  <ul class="dropdown-menu">
79
79
 
80
80
  <li ng-show="dashboard.current.loader.save_default">
81
- <a class="link" ng-click="set_default()">Set as my home</a>
81
+ <a class="link" ng-click="set_default()">Save as Home</a>
82
82
  </li>
83
83
  <li ng-show="dashboard.current.loader.save_default">
84
- <a class="link" ng-click="purge_default()">Clear my home</a>
84
+ <a class="link" ng-click="purge_default()">Reset Home</a>
85
85
  </li>
86
86
  <li ng-show="dashboard.current.loader.save_local">
87
87
  <a class="link" ng-click="dashboard.to_file()">Export schema</a>
@@ -8,152 +8,162 @@
8
8
  </div>
9
9
  </div>
10
10
 
11
- <div ng-show="editor.index == 0">
12
- <div class="row-fluid">
13
- <div class="span4">
14
- <label class="small">Title</label><input type="text" class="input-large" ng-model='dashboard.current.title'></input>
15
- </div>
16
- <div class="span1">
17
- <label class="small"> Editable </label><input type="checkbox" ng-model="dashboard.current.editable" ng-checked="dashboard.current.editable" />
18
- </div>
19
- <div class="span1">
20
- <label class="small"> Hints <tip>Show 'Add panel' hints in empty spaces</tip></label><input type="checkbox" ng-model="dashboard.current.panel_hints" ng-checked="dashboard.current.panel_hints" />
21
- </div>
22
- <div class="span3">
23
- <label class="small">Style</label><select class="input-small" ng-model="dashboard.current.style" ng-options="f for f in ['dark','light']"></select>
11
+ <div ng-if="editor.index == 0">
12
+ <div class="editor-row">
13
+ <div class="section">
14
+ <div class="editor-option">
15
+ <label class="small">Title</label><input type="text" class="input-large" ng-model='dashboard.current.title'></input>
16
+ </div>
17
+ <div class="editor-option">
18
+ <label class="small">Style</label><select class="input-small" ng-model="dashboard.current.style" ng-options="f for f in ['dark','light']"></select>
19
+ </div>
20
+ <div class="editor-option">
21
+ <label class="small"> Editable </label><input type="checkbox" ng-model="dashboard.current.editable" ng-checked="dashboard.current.editable" />
22
+ </div>
23
+ <div class="editor-option">
24
+ <label class="small"> Hints <tip>Show 'Add panel' hints in empty spaces</tip></label><input type="checkbox" ng-model="dashboard.current.panel_hints" ng-checked="dashboard.current.panel_hints" />
25
+ </div>
24
26
  </div>
25
27
  </div>
26
28
  </div>
27
- <div ng-show="editor.index == 1">
28
- <div class="row-fluid">
29
- <h4>Index Settings</h4>
30
- <div ng-show="dashboard.current.index.interval != 'none'" class="row-fluid">
31
- <div class="span12">
32
- <p class="small">
33
- Time stamped indices use your selected time range to create a list of
34
- indices that match a specified timestamp pattern. This can be very
35
- efficient for some data sets (eg, logs) For example, to match the
36
- default logstash index pattern you might use
37
- <code>[logstash-]YYYY.MM.DD</code>. The [] in "[logstash-]" are
38
- important as they instruct Kibana not to treat those letters as a
39
- pattern.
40
- Please also note that indices should rollover at midnight <strong>UTC</strong>.
41
- </p>
42
- <p class="small">
43
- See <a href="http://momentjs.com/docs/#/displaying/format/">http://momentjs.com/docs/#/displaying/format/</a>
44
- for documentation on date formatting.
45
- </p>
29
+ <div ng-if="editor.index == 1">
30
+ <div class="editor-row">
31
+ <div class="section">
32
+ <h5>Index Settings</h5>
33
+ <div ng-show="dashboard.current.index.interval != 'none'" class="row-fluid">
34
+ <div class="editor-option">
35
+ <p class="small">
36
+ Time stamped indices use your selected time range to create a list of
37
+ indices that match a specified timestamp pattern. This can be very
38
+ efficient for some data sets (eg, logs) For example, to match the
39
+ default logstash index pattern you might use
40
+ <code>[logstash-]YYYY.MM.DD</code>. The [] in "[logstash-]" are
41
+ important as they instruct Kibana not to treat those letters as a
42
+ pattern.
43
+ Please also note that indices should rollover at midnight <strong>UTC</strong>.
44
+ </p>
45
+ <p class="small">
46
+ See <a href="http://momentjs.com/docs/#/displaying/format/">http://momentjs.com/docs/#/displaying/format/</a>
47
+ for documentation on date formatting.
48
+ </p>
49
+ </div>
46
50
  </div>
47
51
  </div>
48
52
  </div>
49
- <div class="row-fluid">
50
- <div class="span2">
51
- <h6>Timestamping</h6><select class="input-small" ng-model="dashboard.current.index.interval" ng-options="f for f in ['none','hour','day','week','month','year']"></select>
52
- </div>
53
- <div class="span4" ng-show="dashboard.current.index.interval != 'none'">
54
- <h6>Index pattern <small>Absolutes in []</small></h6>
55
- <input type="text" class="input-medium" ng-model="dashboard.current.index.pattern">
56
- </div>
57
- <div class="span2" ng-show="dashboard.current.index.interval != 'none'">
58
- <h6>Failover <i class="icon-question-sign" bs-tooltip="'If no indices match the pattern, failover to default index *NOT RECOMMENDED*'"></i></h6>
59
- <input type="checkbox" ng-model="dashboard.current.failover" ng-checked="dashboard.current.failover" />
60
- </div>
61
- <div class="span4" ng-show="dashboard.current.failover || dashboard.current.index.interval == 'none'">
62
- <h6>Default Index <small ng-show="dashboard.current.index.interval != 'none'">If index not found</small></h6>
63
- <input type="text" class="input-medium" ng-model="dashboard.current.index.default">
53
+ <div class="editor-row">
54
+ <div class="section">
55
+ <div class="editor-option">
56
+ <h6>Timestamping</h6><select class="input-small" ng-model="dashboard.current.index.interval" ng-options="f for f in ['none','hour','day','week','month','year']"></select>
57
+ </div>
58
+ <div class="editor-option" ng-show="dashboard.current.index.interval != 'none'">
59
+ <h6>Index pattern <small>Absolutes in []</small></h6>
60
+ <input type="text" class="input-large" ng-model="dashboard.current.index.pattern">
61
+ </div>
62
+ <div class="editor-option" ng-show="dashboard.current.index.interval != 'none'">
63
+ <h6>Failover <i class="icon-question-sign" bs-tooltip="'If no indices match the pattern, failover to default index *NOT RECOMMENDED*'"></i></h6>
64
+ <input type="checkbox" ng-model="dashboard.current.failover" ng-checked="dashboard.current.failover" />
65
+ </div>
66
+ <div class="editor-option" ng-show="dashboard.current.failover || dashboard.current.index.interval == 'none'">
67
+ <h6>Default Index <small ng-show="dashboard.current.index.interval != 'none'">If index not found</small></h6>
68
+ <input type="text" class="input-medium" ng-model="dashboard.current.index.default">
69
+ </div>
70
+ <div class="editor-option">
71
+ <h6>Preload Fields <i class="icon-question-sign" bs-tooltip="'Preload available fields for the purpose of autocomplete. Turn this off if you have many fields'"></i></h6>
72
+ <input type="checkbox" ng-model="dashboard.current.index.warm_fields" ng-checked="dashboard.current.index.warm_fields" />
73
+ </div>
64
74
  </div>
65
75
  </div>
66
76
  </div>
67
77
 
68
- <div ng-show="editor.index == 2">
78
+ <div ng-if="editor.index == 2">
69
79
  <div class="row-fluid">
70
- <div class="span12">
71
- <table class="table table-condensed table-striped">
80
+ <div class="span8">
81
+ <h4>Rows</h4>
82
+ <table class="table table-condensed table-bordered">
72
83
  <thead>
73
- <th>Title</th>
74
- <th>Delete</th>
75
- <th>Move</th>
84
+ <th width="1%"></th>
85
+ <th width="1%"></th>
86
+ <th width="1%"></th>
87
+ <th width="97%">Title</th>
76
88
  </thead>
77
89
  <tr ng-repeat="row in dashboard.current.rows">
78
- <td>{{row.title}}</td>
79
- <td><i ng-click="dashboard.current.rows = _.without(dashboard.current.rows,row)" class="pointer icon-remove"></i></td>
80
90
  <td><i ng-click="_.move(dashboard.current.rows,$index,$index-1)" ng-hide="$first" class="pointer icon-arrow-up"></i></td>
81
91
  <td><i ng-click="_.move(dashboard.current.rows,$index,$index+1)" ng-hide="$last" class="pointer icon-arrow-down"></i></td>
92
+ <td><i ng-click="dashboard.current.rows = _.without(dashboard.current.rows,row)" class="pointer icon-remove"></i></td>
93
+ <td>{{row.title}}</td>
82
94
  </tr>
83
95
  </table>
84
96
  </div>
97
+ <div class="span4">
98
+ <h4>Add Row</h4>
99
+ <label class="small">Title</label>
100
+ <input type="text" class="input-medium" ng-model='row.title' placeholder="New row"></input>
101
+ <label class="small">Height</label>
102
+ <input type="text" class="input-mini" ng-model='row.height'></input>
103
+ </div>
85
104
  </div>
86
105
  <div class="row-fluid">
87
- <form>
88
- <div class="span5">
89
- <label class="small">Title</label>
90
- <input type="text" class="input-large" ng-model='row.title' placeholder="New row"></input>
91
- </div>
92
- <div class="span2">
93
- <label class="small">Height</label>
94
- <input type="text" class="input-mini" ng-model='row.height'></input>
95
- </div>
96
- <div class="span1">
97
- <label class="small"> Editable </label>
98
- <input type="checkbox" ng-model="row.editable" ng-checked="row.editable" />
99
- </div>
100
- </form>
101
- </div>
102
- </div>
103
106
 
104
- <div ng-show="editor.index == 3">
105
- <h5>Pulldowns</h5>
106
- <div class="row-fluid">
107
- <div class="span2" ng-repeat="pulldown in dashboard.current.pulldowns">
108
- <label class="small" style="text-transform:capitalize;">{{pulldown.type}}</label><input type="checkbox" ng-model="pulldown.enable" ng-checked="pulldown.enable">
109
- </div>
110
- <div class="span2" ng-repeat="pulldown in dashboard.current.nav">
111
- <label class="small" style="text-transform:capitalize;">{{pulldown.type}}</label><input type="checkbox" ng-model="pulldown.enable" ng-checked="pulldown.enable">
112
- </div>
113
107
  </div>
114
108
  </div>
115
109
 
116
- <div ng-show="editor.index == 3" ng-controller="dashLoader">
117
- <h5>Save to</h5>
118
- <div class="row-fluid">
119
- <div class="span2">
120
- <label class="small">Export</label><input type="checkbox" ng-model="dashboard.current.loader.save_local" ng-checked="dashboard.current.loader.save_local">
121
- </div>
122
- <div class="span2">
123
- <label class="small">Browser</label><input type="checkbox" ng-model="dashboard.current.loader.save_default" ng-checked="dashboard.current.loader.save_default">
124
- </div>
125
- <div class="span2">
126
- <label class="small">Gist <tip>Requires your domain to be OAUTH registered with Github<tip></label><input type="checkbox" ng-model="dashboard.current.loader.save_gist" ng-checked="dashboard.current.loader.save_gist">
127
- </div>
128
- <div class="span2">
129
- <label class="small">Elasticsearch</label><input type="checkbox" ng-model="dashboard.current.loader.save_elasticsearch" ng-checked="dashboard.current.loader.save_elasticsearch">
130
- </div>
131
- </div>
132
- <h5>Load from</h5>
133
- <div class="row-fluid">
134
- <div class="span2">
135
- <label class="small">Local file</label><input type="checkbox" ng-model="dashboard.current.loader.load_local" ng-checked="dashboard.current.loader.load_local">
136
- </div>
137
- <div class="span2">
138
- <label class="small">Gist</label><input type="checkbox" ng-model="dashboard.current.loader.load_gist" ng-checked="dashboard.current.loader.load_gist">
110
+ <div ng-if="editor.index == 3" ng-controller="dashLoader">
111
+ <div class="editor-row">
112
+ <div class="section">
113
+ <h5>Save to</h5>
114
+ <div class="editor-option">
115
+ <label class="small">Export</label><input type="checkbox" ng-model="dashboard.current.loader.save_local" ng-checked="dashboard.current.loader.save_local">
116
+ </div>
117
+ <div class="editor-option">
118
+ <label class="small">Browser</label><input type="checkbox" ng-model="dashboard.current.loader.save_default" ng-checked="dashboard.current.loader.save_default">
119
+ </div>
120
+ <div class="editor-option">
121
+ <label class="small">Gist <tip>Requires your domain to be OAUTH registered with Github<tip></label><input type="checkbox" ng-model="dashboard.current.loader.save_gist" ng-checked="dashboard.current.loader.save_gist">
122
+ </div>
123
+ <div class="editor-option">
124
+ <label class="small">Elasticsearch</label><input type="checkbox" ng-model="dashboard.current.loader.save_elasticsearch" ng-checked="dashboard.current.loader.save_elasticsearch">
125
+ </div>
139
126
  </div>
140
- <div class="span2">
141
- <label class="small">Elasticsearch</label><input type="checkbox" ng-model="dashboard.current.loader.load_elasticsearch" ng-checked="dashboard.current.loader.load_elasticsearch">
127
+ <div class="section">
128
+ <h5>Load from</h5>
129
+ <div class="editor-option">
130
+ <label class="small">Local file</label><input type="checkbox" ng-model="dashboard.current.loader.load_local" ng-checked="dashboard.current.loader.load_local">
131
+ </div>
132
+ <div class="editor-option">
133
+ <label class="small">Gist</label><input type="checkbox" ng-model="dashboard.current.loader.load_gist" ng-checked="dashboard.current.loader.load_gist">
134
+ </div>
135
+ <div class="editor-option">
136
+ <label class="small">Elasticsearch</label><input type="checkbox" ng-model="dashboard.current.loader.load_elasticsearch" ng-checked="dashboard.current.loader.load_elasticsearch">
137
+ </div>
138
+ <div class="editor-option" ng-show="dashboard.current.loader.load.elasticsearch">
139
+ <label class="small">ES list size</label><input class="input-mini" type="number" ng-model="dashboard.current.loader.load_elasticsearch_size">
140
+ </div>
142
141
  </div>
143
- <div class="span3" ng-show="dashboard.current.loader.load.elasticsearch">
144
- <label class="small">ES list size</label><input class="input-mini" type="number" ng-model="dashboard.current.loader.load_elasticsearch_size">
142
+ <div class="section">
143
+ <h5>Sharing</h5>
144
+ <div class="editor-option" >
145
+ <label class="small">Allow Sharing <tip>Allow generating adhoc links to dashboards</tip></label><input type="checkbox" ng-model="dashboard.current.loader.save_temp" ng-checked="dashboard.current.loader.save_temp">
146
+ </div>
147
+ <div class="editor-option" ng-show="dashboard.current.loader.save_temp">
148
+ <label class="small">TTL <tip>Expire temp urls</tip></label><input type="checkbox" ng-model="dashboard.current.loader.save_temp_ttl_enable">
149
+ </div>
150
+ <div class="editor-option" ng-show="dashboard.current.loader.save_temp &amp;&amp; dashboard.current.loader.save_temp_ttl_enable">
151
+ <label class="small">TTL Duration <tip>Elasticsearch date math, eg: 1m,1d,1w,30d </tip></label><input class="input-small" type="text" ng-model="dashboard.current.loader.save_temp_ttl">
152
+ </div>
145
153
  </div>
146
154
  </div>
147
- <h5>Sharing</h5>
148
- <div class="row-fluid">
149
- <div class="span2" >
150
- <label class="small">Allow Sharing <tip>Allow generating adhoc links to dashboards</tip></label><input type="checkbox" ng-model="dashboard.current.loader.save_temp" ng-checked="dashboard.current.loader.save_temp">
151
- </div>
152
- <div class="span2" ng-show="dashboard.current.loader.save_temp">
153
- <label class="small">TTL <tip>Expire temp urls</tip></label><input type="checkbox" ng-model="dashboard.current.loader.save_temp_ttl_enable">
154
- </div>
155
- <div class="span5" ng-show="dashboard.current.loader.save_temp &amp;&amp; dashboard.current.loader.save_temp_ttl_enable">
156
- <label class="small">TTL Duration <tip>Elasticsearch date math, eg: 1m,1d,1w,30d </tip></label><input class="input-small" type="text" ng-model="dashboard.current.loader.save_temp_ttl">
155
+ </div>
156
+
157
+ <div ng-if="editor.index == 3">
158
+ <div class="editor-row">
159
+ <div class="section">
160
+ <h5>Pulldowns</h5>
161
+ <div class="editor-option" ng-repeat="pulldown in dashboard.current.pulldowns">
162
+ <label class="small" style="text-transform:capitalize;">{{pulldown.type}}</label><input type="checkbox" ng-model="pulldown.enable" ng-checked="pulldown.enable">
163
+ </div>
164
+ <div class="editor-option" ng-repeat="pulldown in dashboard.current.nav">
165
+ <label class="small" style="text-transform:capitalize;">{{pulldown.type}}</label><input type="checkbox" ng-model="pulldown.enable" ng-checked="pulldown.enable">
166
+ </div>
157
167
  </div>
158
168
  </div>
159
169
  </div>