kibana-sinatra 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +28 -3
- data/lib/kibana/assets/app/app.js +16 -4
- data/lib/kibana/assets/app/components/require.config.js +2 -1
- data/lib/kibana/assets/app/components/settings.js +4 -3
- data/lib/kibana/assets/app/controllers/dash.js +1 -1
- data/lib/kibana/assets/app/controllers/dashLoader.js +5 -4
- data/lib/kibana/assets/app/dashboards/blank.json +2 -1
- data/lib/kibana/assets/app/dashboards/default.json +4 -51
- data/lib/kibana/assets/app/dashboards/guided.json +2 -1
- data/lib/kibana/assets/app/dashboards/logstash.json +2 -0
- data/lib/kibana/assets/app/dashboards/noted.json +2 -1
- data/lib/kibana/assets/app/directives/addPanel.js +5 -0
- data/lib/kibana/assets/app/directives/all.js +2 -1
- data/lib/kibana/assets/app/directives/configModal.js +34 -0
- data/lib/kibana/assets/app/directives/kibanaPanel.js +10 -4
- data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +10 -8
- data/lib/kibana/assets/app/panels/bettermap/editor.html +4 -4
- data/lib/kibana/assets/app/panels/bettermap/module.js +1 -1
- data/lib/kibana/assets/app/panels/dashcontrol/module.html +1 -4
- data/lib/kibana/assets/app/panels/histogram/editor.html +22 -22
- data/lib/kibana/assets/app/panels/histogram/module.html +4 -4
- data/lib/kibana/assets/app/panels/histogram/module.js +30 -24
- data/lib/kibana/assets/app/panels/histogram/timeSeries.js +16 -0
- data/lib/kibana/assets/app/panels/hits/editor.html +9 -9
- data/lib/kibana/assets/app/panels/map/editor.html +4 -4
- data/lib/kibana/assets/app/panels/pie/editor.html +47 -42
- data/lib/kibana/assets/app/panels/table/editor.html +39 -38
- data/lib/kibana/assets/app/panels/table/module.html +14 -5
- data/lib/kibana/assets/app/panels/table/module.js +23 -19
- data/lib/kibana/assets/app/panels/table/pagination.html +29 -24
- data/lib/kibana/assets/app/panels/terms/editor.html +53 -47
- data/lib/kibana/assets/app/panels/terms/module.js +7 -5
- data/lib/kibana/assets/app/panels/timepicker/module.html +2 -2
- data/lib/kibana/assets/app/partials/dashLoader.html +6 -6
- data/lib/kibana/assets/app/partials/dasheditor.html +127 -117
- data/lib/kibana/assets/app/partials/paneladd.html +1 -1
- data/lib/kibana/assets/app/partials/paneleditor.html +2 -2
- data/lib/kibana/assets/app/partials/panelgeneral.html +19 -17
- data/lib/kibana/assets/app/partials/roweditor.html +3 -3
- data/lib/kibana/assets/app/services/dashboard.js +67 -16
- data/lib/kibana/assets/app/services/fields.js +18 -15
- data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
- data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
- data/lib/kibana/assets/vendor/angular/angular.js +17 -0
- data/lib/kibana/assets/vendor/bootstrap/less/modals.less +3 -11
- data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +2 -3
- data/lib/kibana/assets/vendor/jquery/jquery.flot.js +2 -2
- data/lib/kibana/sinatra/version.rb +1 -1
- data/lib/kibana/views/config.erb +17 -7
- metadata +3 -5
- data/lib/kibana/assets/app/panels/dashcontrol/load.html +0 -40
- data/lib/kibana/assets/app/panels/dashcontrol/save.html +0 -30
- 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'"
|
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
|
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"
|
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
|
-
|
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
|
-
|
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(
|
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
|
-
|
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('
|
474
|
-
return function(text,
|
475
|
-
|
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
|
2
|
-
<div class="
|
3
|
-
<
|
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
|
-
|
6
|
-
|
7
|
-
<
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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> </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
|
2
|
-
<div class="
|
3
|
-
<
|
4
|
-
<
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
<
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
<
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
<
|
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
|
20
|
-
<div class="
|
21
|
-
<
|
22
|
-
<
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
<
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
<
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
<
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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.
|
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.
|
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.
|
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">
|
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-
|
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}}"
|
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"
|
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()">
|
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()">
|
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-
|
12
|
-
<div class="row
|
13
|
-
<div class="
|
14
|
-
<
|
15
|
-
|
16
|
-
|
17
|
-
<
|
18
|
-
|
19
|
-
|
20
|
-
<
|
21
|
-
|
22
|
-
|
23
|
-
<
|
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-
|
28
|
-
<div class="row
|
29
|
-
<
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
50
|
-
<div class="
|
51
|
-
<
|
52
|
-
|
53
|
-
|
54
|
-
<
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
<
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
<
|
63
|
-
|
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-
|
78
|
+
<div ng-if="editor.index == 2">
|
69
79
|
<div class="row-fluid">
|
70
|
-
<div class="
|
71
|
-
<
|
80
|
+
<div class="span8">
|
81
|
+
<h4>Rows</h4>
|
82
|
+
<table class="table table-condensed table-bordered">
|
72
83
|
<thead>
|
73
|
-
<th
|
74
|
-
<th
|
75
|
-
<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-
|
117
|
-
<
|
118
|
-
|
119
|
-
|
120
|
-
<
|
121
|
-
|
122
|
-
|
123
|
-
<
|
124
|
-
|
125
|
-
|
126
|
-
<
|
127
|
-
|
128
|
-
|
129
|
-
<
|
130
|
-
|
131
|
-
|
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="
|
141
|
-
<
|
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="
|
144
|
-
|
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 && 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
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
<
|
154
|
-
|
155
|
-
|
156
|
-
<
|
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>
|