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.
- 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>
|