kibana-sinatra 3.0.1.0 → 3.1.0.0
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/lib/kibana/assets/app/components/require.config.js +6 -1
- data/lib/kibana/assets/app/controllers/dash.js +3 -0
- data/lib/kibana/assets/app/dashboards/default.json +1 -1
- data/lib/kibana/assets/app/directives/all.js +2 -1
- data/lib/kibana/assets/app/directives/dashUpload.js +7 -2
- data/lib/kibana/assets/app/directives/kibanaPanel.js +10 -5
- data/lib/kibana/assets/app/directives/resizable.js +34 -0
- data/lib/kibana/assets/app/panels/bettermap/module.js +3 -3
- data/lib/kibana/assets/app/panels/column/module.html +9 -14
- data/lib/kibana/assets/app/panels/goal/module.js +3 -7
- data/lib/kibana/assets/app/panels/histogram/module.js +3 -12
- data/lib/kibana/assets/app/panels/hits/module.js +1 -6
- data/lib/kibana/assets/app/panels/map/module.html +1 -1
- data/lib/kibana/assets/app/panels/map/module.js +11 -12
- data/lib/kibana/assets/app/panels/sparklines/module.js +0 -5
- data/lib/kibana/assets/app/panels/stats/editor.html +9 -7
- data/lib/kibana/assets/app/panels/stats/module.html +30 -8
- data/lib/kibana/assets/app/panels/stats/module.js +17 -3
- data/lib/kibana/assets/app/panels/table/micropanel.html +6 -1
- data/lib/kibana/assets/app/panels/table/module.html +105 -87
- data/lib/kibana/assets/app/panels/table/module.js +46 -21
- data/lib/kibana/assets/app/panels/terms/module.html +76 -51
- data/lib/kibana/assets/app/panels/terms/module.js +3 -7
- data/lib/kibana/assets/app/panels/trends/editor.html +11 -10
- data/lib/kibana/assets/app/panels/trends/module.html +11 -2
- data/lib/kibana/assets/app/panels/trends/module.js +4 -0
- data/lib/kibana/assets/app/partials/dashboard.html +10 -8
- data/lib/kibana/assets/app/services/dashboard.js +5 -2
- data/lib/kibana/assets/app/services/esVersion.js +5 -1
- data/lib/kibana/assets/app/services/kbnIndex.js +4 -0
- data/lib/kibana/assets/app/services/panelMove.js +5 -4
- data/lib/kibana/assets/app/services/querySrv.js +1 -1
- 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/LICENSE.json +5 -1
- data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +29 -7
- data/lib/kibana/assets/vendor/jsonpath.js +87 -0
- data/lib/kibana/sinatra/version.rb +1 -1
- metadata +4 -2
@@ -48,6 +48,7 @@ define([
|
|
48
48
|
description: 'A statistical panel for displaying aggregations using the Elastic Search statistical facet query.'
|
49
49
|
};
|
50
50
|
|
51
|
+
$scope.modes = ['count','min','max','mean','total','variance','std_deviation','sum_of_squares'];
|
51
52
|
|
52
53
|
var defaults = {
|
53
54
|
queries : {
|
@@ -62,7 +63,17 @@ define([
|
|
62
63
|
sort_reverse: false,
|
63
64
|
label_name: 'Query',
|
64
65
|
value_name: 'Value',
|
65
|
-
spyable : true
|
66
|
+
spyable : true,
|
67
|
+
show: {
|
68
|
+
count: true,
|
69
|
+
min: true,
|
70
|
+
max: true,
|
71
|
+
mean: true,
|
72
|
+
std_deviation: true,
|
73
|
+
sum_of_squares: true,
|
74
|
+
total: true,
|
75
|
+
variance: true
|
76
|
+
}
|
66
77
|
};
|
67
78
|
|
68
79
|
_.defaults($scope.panel, defaults);
|
@@ -76,6 +87,7 @@ define([
|
|
76
87
|
};
|
77
88
|
|
78
89
|
$scope.set_sort = function(field) {
|
90
|
+
console.log(field);
|
79
91
|
if($scope.panel.sort_field === field && $scope.panel.sort_reverse === false) {
|
80
92
|
$scope.panel.sort_reverse = true;
|
81
93
|
} else if($scope.panel.sort_field === field && $scope.panel.sort_reverse === true) {
|
@@ -149,8 +161,8 @@ define([
|
|
149
161
|
var obj = _.clone(q);
|
150
162
|
obj.label = alias;
|
151
163
|
obj.Label = alias.toLowerCase(); //sort field
|
152
|
-
obj.value = results.facets['stats_'+alias]
|
153
|
-
obj.Value = results.facets['stats_'+alias]
|
164
|
+
obj.value = results.facets['stats_'+alias];
|
165
|
+
obj.Value = results.facets['stats_'+alias]; //sort field
|
154
166
|
return obj;
|
155
167
|
});
|
156
168
|
|
@@ -159,6 +171,8 @@ define([
|
|
159
171
|
rows: rows
|
160
172
|
};
|
161
173
|
|
174
|
+
console.log($scope.data);
|
175
|
+
|
162
176
|
$scope.$emit('render');
|
163
177
|
});
|
164
178
|
};
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<span>
|
6
6
|
<i class="pointer icon-search" ng-click="fieldExists(micropanel.field,'must');dismiss();" bs-tooltip="'Find events with this field'"></i>
|
7
7
|
<i class="pointer icon-ban-circle" ng-click="fieldExists(micropanel.field,'mustNot');dismiss();" bs-tooltip="'Find events without this field'"></i>
|
8
|
-
<strong>Micro Analysis of {{micropanel.field}}</strong>
|
8
|
+
<strong>Micro Analysis of {{micropanel.field}} <span ng-if='micropanel.type'>({{micropanel.type}})</span></strong>
|
9
9
|
<span ng-show="micropanel.hasArrays">
|
10
10
|
as
|
11
11
|
<a class="link" ng-class="{'strong':micropanel.grouped}" ng-click="toggle_micropanel(micropanel.field,true)">Groups</a> /
|
@@ -59,6 +59,11 @@
|
|
59
59
|
<li><a ng-click="termsModal(field,'table');dismiss();">Table</a></li>
|
60
60
|
</ul>
|
61
61
|
</div>
|
62
|
+
<div class="btn-group" ng-show="micropanel.hasStats">
|
63
|
+
<a class="btn dropdown-toggle pointer" ng-click="statsModal(field);dismiss();">
|
64
|
+
<i class="icon-list-ol"></i> Stats
|
65
|
+
</a>
|
66
|
+
</div>
|
62
67
|
|
63
68
|
</div>
|
64
69
|
</div>
|
@@ -47,12 +47,17 @@
|
|
47
47
|
.table-field-value {
|
48
48
|
white-space: pre-wrap;
|
49
49
|
}
|
50
|
+
|
51
|
+
.table-facet {
|
52
|
+
padding: 10px;
|
53
|
+
border: 1px solid #666;
|
54
|
+
}
|
50
55
|
</style>
|
51
56
|
|
52
57
|
<div class="table-container">
|
53
58
|
|
54
59
|
<div bindonce ng-class="{'table-sidebar':panel.field_list}" ng-if="panel.field_list">
|
55
|
-
<div
|
60
|
+
<div style="{{panel.overflow}}:{{panel.height||row.height}};overflow-y:auto">
|
56
61
|
|
57
62
|
<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>
|
58
63
|
|
@@ -73,14 +78,14 @@
|
|
73
78
|
in your source document.
|
74
79
|
</div>
|
75
80
|
|
76
|
-
<ul class="unstyled"
|
81
|
+
<ul class="unstyled" ng-if="panel.all_fields">
|
77
82
|
<li class="table-fieldname" ng-style="panel.style" ng-repeat="field in fields.list|filter:fieldFilter|orderBy:identity">
|
78
83
|
<i class="pointer" ng-class="{'icon-check': columns[field],'icon-check-empty': _.isUndefined(columns[field])}" ng-click="toggle_field(field)"></i>
|
79
84
|
<a class="pointer" data-unique="1" bs-popover="'app/panels/table/micropanel.html'" data-placement="rightTop" ng-click="toggle_micropanel(field,true)" ng-class="{label: columns[field]}" bo-text="field"></a>
|
80
85
|
</li>
|
81
86
|
</ul>
|
82
87
|
|
83
|
-
<ul class="unstyled"
|
88
|
+
<ul class="unstyled" ng-if="!panel.all_fields">
|
84
89
|
<li class="table-fieldname" ng-style="panel.style" ng-repeat="field in current_fields|filter:fieldFilter|orderBy:identity">
|
85
90
|
<i class="pointer" ng-class="{'icon-check': columns[field],'icon-check-empty': _.isUndefined(columns[field])}" ng-click="toggle_field(field)"></i>
|
86
91
|
<a class="pointer" data-unique="1" bs-popover="'app/panels/table/micropanel.html'" data-placement="rightTop" ng-click="toggle_micropanel(field,true)" ng-class="{label: columns[field]}" bo-text="field"></a>
|
@@ -90,93 +95,106 @@
|
|
90
95
|
</div>
|
91
96
|
</div>
|
92
97
|
|
93
|
-
<div
|
94
|
-
|
95
|
-
<div
|
96
|
-
<
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
98
|
+
<div ng-class="{'table-main':panel.field_list}" class="table-doc-table">
|
99
|
+
|
100
|
+
<div style="{{panel.overflow}}:{{panel.height||row.height}};overflow-y:auto">
|
101
|
+
<div class="table-facet" ng-if="modalField">
|
102
|
+
<h4>
|
103
|
+
<button class="btn btn-mini btn-danger" ng-click="closeFacet();">close</button>
|
104
|
+
{{adhocOpts.title}}
|
105
|
+
<span class="pointer ng-scope ng-pristine ng-valid ui-draggable" bs-tooltip="'Drag to add to dashboard'"
|
106
|
+
data-drag="true"
|
107
|
+
data-jqyoui-options="kbnJqUiDraggableOptions"
|
108
|
+
jqyoui-draggable="{animate:false,mutate:false,onStart:'panelMoveStart',onStop:'panelMoveStop',embedded:true}"
|
109
|
+
ng-model="adhocOpts"
|
110
|
+
data-original-title=""
|
111
|
+
title=""
|
112
|
+
aria-disabled="false" style="position: relative;"><i class="icon-move"></i></span>
|
113
|
+
</h4>
|
114
|
+
<kibana-simple-panel type="'{{facetType}}'" panel='{{facetPanel}}' ng-cloak></kibana-simple-panel>
|
105
115
|
</div>
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
116
|
+
|
117
|
+
<i class="pull-left icon-chevron-sign-right pointer" ng-click="panel.field_list = !panel.field_list" bs-tooltip="'Show field list'" ng-show="!panel.field_list"></i>
|
118
|
+
<div class="row-fluid" ng-show="panel.paging">
|
119
|
+
<div class="span1 offset1" style="text-align:right">
|
120
|
+
<i ng-click="panel.offset = 0" ng-show="panel.offset > 0" class='icon-circle-arrow-left pointer'></i>
|
121
|
+
<i ng-click="panel.offset = (panel.offset - panel.size)" ng-show="panel.offset > 0" class='icon-arrow-left pointer'></i>
|
122
|
+
</div>
|
123
|
+
<div class="span8" style="text-align:center">
|
124
|
+
<strong>{{panel.offset}}</strong> to <strong>{{panel.offset + data.slice(panel.offset,panel.offset+panel.size).length}}</strong>
|
125
|
+
<small> of {{data.length}} available for paging</small>
|
126
|
+
</div>
|
127
|
+
<div class="span1" style="text-align:left">
|
128
|
+
<i ng-click="panel.offset = (panel.offset + panel.size)" ng-show="data.length > panel.offset+panel.size" class='icon-arrow-right pointer'></i>
|
129
|
+
</div>
|
112
130
|
</div>
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
<i ng-show='field == panel.sort[0]' class="pointer link" ng-class="{'icon-chevron-up': panel.sort[1] == 'asc','icon-chevron-down': panel.sort[1] == 'desc'}"></i>
|
123
|
-
</span>
|
124
|
-
<span ng-show='!panel.sortable'>{{field}}</span>
|
125
|
-
<i ng-show="!$last" class="pointer link icon-caret-right" ng-click="_.move(panel.fields,$index,$index+1)"></i>
|
126
|
-
</th>
|
127
|
-
|
128
|
-
</thead>
|
129
|
-
<tbody bindonce ng-repeat="event in data| slice:panel.offset:panel.offset+panel.size" ng-class-odd="'odd'">
|
130
|
-
<tr ng-click="toggle_details(event)" class="pointer">
|
131
|
-
<td ng-if="panel.fields.length<1" bo-text="event._source|stringify|tableTruncate:panel.trimFactor:1"></td>
|
132
|
-
<td ng-show="panel.fields.length>0" ng-repeat="field in panel.fields">
|
133
|
-
<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" class="table-field-value"></span>
|
134
|
-
<span ng-if="panel.localTime && panel.timeField == field" bo-html="event.sort[1]|tableLocalTime:event" class="table-field-value"></span>
|
135
|
-
</td>
|
136
|
-
</tr>
|
137
|
-
<tr ng-if="event.kibana.details">
|
138
|
-
<td colspan={{panel.fields.length}} ng-switch="event.kibana.view">
|
139
|
-
<span>
|
140
|
-
View:
|
141
|
-
<a class="link" ng-class="{'strong':event.kibana.view == 'table'}" ng-click="event.kibana.view = 'table'">Table</a> /
|
142
|
-
<a class="link" ng-class="{'strong':event.kibana.view == 'json'}" ng-click="event.kibana.view = 'json'">JSON</a> /
|
143
|
-
<a class="link" ng-class="{'strong':event.kibana.view == 'raw'}" ng-click="event.kibana.view = 'raw'">Raw</a>
|
144
|
-
<i class="link pull-right icon-chevron-up" ng-click="toggle_details(event)"></i>
|
131
|
+
<table class="table-hover table table-condensed" ng-style="panel.style">
|
132
|
+
<thead ng-show="panel.header">
|
133
|
+
<th ng-show="panel.fields.length<1">_source (select columns from the list to the left)</th>
|
134
|
+
<th style="white-space:nowrap" ng-repeat="field in panel.fields">
|
135
|
+
<i ng-show="!$first" class="pointer link icon-caret-left" ng-click="_.move(panel.fields,$index,$index-1)"></i>
|
136
|
+
|
137
|
+
<span class="pointer" ng-click="set_sort(field)" ng-show='panel.sortable'>
|
138
|
+
{{field}}
|
139
|
+
<i ng-show='field == panel.sort[0]' class="pointer link" ng-class="{'icon-chevron-up': panel.sort[1] == 'asc','icon-chevron-down': panel.sort[1] == 'desc'}"></i>
|
145
140
|
</span>
|
146
|
-
<
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
141
|
+
<span ng-show='!panel.sortable'>{{field}}</span>
|
142
|
+
<i ng-show="!$last" class="pointer link icon-caret-right" ng-click="_.move(panel.fields,$index,$index+1)"></i>
|
143
|
+
</th>
|
144
|
+
|
145
|
+
</thead>
|
146
|
+
<tbody bindonce ng-repeat="event in data| slice:panel.offset:panel.offset+panel.size" ng-class-odd="'odd'">
|
147
|
+
<tr ng-click="toggle_details(event)" class="pointer">
|
148
|
+
<td ng-if="panel.fields.length<1" bo-text="event._source|stringify|tableTruncate:panel.trimFactor:1"></td>
|
149
|
+
<td ng-show="panel.fields.length>0" ng-repeat="field in panel.fields">
|
150
|
+
<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" class="table-field-value"></span>
|
151
|
+
<span ng-if="panel.localTime && panel.timeField == field" bo-html="event.sort[1]|tableLocalTime:event" class="table-field-value"></span>
|
152
|
+
</td>
|
153
|
+
</tr>
|
154
|
+
<tr ng-if="event.kibana.details">
|
155
|
+
<td colspan={{panel.fields.length}} ng-switch="event.kibana.view">
|
156
|
+
<span>
|
157
|
+
View:
|
158
|
+
<a class="link" ng-class="{'strong':event.kibana.view == 'table'}" ng-click="event.kibana.view = 'table'">Table</a> /
|
159
|
+
<a class="link" ng-class="{'strong':event.kibana.view == 'json'}" ng-click="event.kibana.view = 'json'">JSON</a> /
|
160
|
+
<a class="link" ng-class="{'strong':event.kibana.view == 'raw'}" ng-click="event.kibana.view = 'raw'">Raw</a>
|
161
|
+
<i class="link pull-right icon-chevron-up" ng-click="toggle_details(event)"></i>
|
162
|
+
</span>
|
163
|
+
<table class='table table-bordered table-condensed table-details' ng-switch-when="table">
|
164
|
+
<thead>
|
165
|
+
<th class="table-details-field">Field</th>
|
166
|
+
<th class="table-details-action">Action</th>
|
167
|
+
<th class="table-details-value">Value</th>
|
168
|
+
</thead>
|
169
|
+
<tr ng-repeat="(key,value) in event.kibana._source track by $index" ng-class-odd="'odd'">
|
170
|
+
<td style="word-wrap:break-word" bo-text="key"></td>
|
171
|
+
<td style="white-space:nowrap">
|
172
|
+
<i class='icon-search pointer' ng-click="build_search(key,value)" bs-tooltip="'Add filter to match this value'"></i>
|
173
|
+
<i class='icon-ban-circle pointer' ng-click="build_search(key,value,true)" bs-tooltip="'Add filter to NOT match this value'"></i>
|
174
|
+
<i class="pointer icon-th" ng-click="toggle_field(key)" bs-tooltip="'Toggle table column'"></i>
|
175
|
+
</td>
|
176
|
+
<!-- At some point we need to create a more efficient way of applying the filter pipeline -->
|
177
|
+
<td style="white-space:pre-wrap;word-wrap:break-word" bo-html="value|noXml|urlLink|stringify"></td>
|
178
|
+
</tr>
|
179
|
+
</table>
|
180
|
+
<pre style="white-space:pre-wrap;word-wrap:break-word" bo-html="without_kibana(event)|tableJson:2" ng-switch-when="json"></pre>
|
181
|
+
<pre bo-html="without_kibana(event)|tableJson:1" ng-switch-when="raw"></pre>
|
182
|
+
</td>
|
183
|
+
</tr>
|
184
|
+
</tbody>
|
185
|
+
</table>
|
186
|
+
<div class="row-fluid" ng-show="panel.paging">
|
187
|
+
<div class="span1 offset3" style="text-align:right">
|
188
|
+
<i ng-click="panel.offset = 0" ng-show="panel.offset > 0" class='icon-circle-arrow-left pointer'></i>
|
189
|
+
<i ng-click="panel.offset = (panel.offset - panel.size)" ng-show="panel.offset > 0" class='icon-arrow-left pointer'></i>
|
190
|
+
</div>
|
191
|
+
<div class="span4" style="text-align:center">
|
192
|
+
<strong>{{panel.offset}}</strong> to <strong>{{panel.offset + data.slice(panel.offset,panel.offset+panel.size).length}}</strong>
|
193
|
+
<small> of {{data.length}} available for paging</small>
|
194
|
+
</div>
|
195
|
+
<div class="span1" style="text-align:left">
|
196
|
+
<i ng-click="panel.offset = (panel.offset + panel.size)" ng-show="data.length > panel.offset+panel.size" class='icon-arrow-right pointer'></i>
|
197
|
+
</div>
|
180
198
|
</div>
|
181
199
|
</div>
|
182
200
|
</div>
|
@@ -18,6 +18,7 @@ define([
|
|
18
18
|
'lodash',
|
19
19
|
'kbn',
|
20
20
|
'moment',
|
21
|
+
'jsonpath'
|
21
22
|
],
|
22
23
|
function (angular, app, _, kbn, moment) {
|
23
24
|
'use strict';
|
@@ -167,37 +168,41 @@ function (angular, app, _, kbn, moment) {
|
|
167
168
|
$scope.closeFacet();
|
168
169
|
$timeout(function() {
|
169
170
|
$scope.modalField = field;
|
171
|
+
$scope.adhocOpts = {
|
172
|
+
height: "200px",
|
173
|
+
chart: chart,
|
174
|
+
field: field,
|
175
|
+
span: $scope.panel.span,
|
176
|
+
type: 'terms',
|
177
|
+
title: 'Top 10 terms in field ' + field
|
178
|
+
};
|
170
179
|
showModal(
|
171
|
-
|
180
|
+
angular.toJson($scope.adhocOpts),'terms');
|
172
181
|
},0);
|
173
182
|
};
|
174
183
|
|
175
184
|
$scope.statsModal = function(field) {
|
176
|
-
$scope.
|
177
|
-
|
178
|
-
|
185
|
+
$scope.closeFacet();
|
186
|
+
$timeout(function() {
|
187
|
+
$scope.modalField = field;
|
188
|
+
$scope.adhocOpts = {
|
189
|
+
height: "200px",
|
190
|
+
field: field,
|
191
|
+
mode: 'mean',
|
192
|
+
span: $scope.panel.span,
|
193
|
+
type: 'stats',
|
194
|
+
title: 'Statistics for ' + field
|
195
|
+
};
|
196
|
+
showModal(
|
197
|
+
angular.toJson($scope.adhocOpts),'stats');
|
198
|
+
},0);
|
179
199
|
};
|
180
200
|
|
181
201
|
var showModal = function(panel,type) {
|
182
202
|
$scope.facetPanel = panel;
|
183
203
|
$scope.facetType = type;
|
184
|
-
|
185
|
-
// create a new modal. Can't reuse one modal unforunately as the directive will not
|
186
|
-
// re-render on show.
|
187
|
-
/*
|
188
|
-
$modal({
|
189
|
-
template: './app/panels/table/modal.html',
|
190
|
-
persist: false,
|
191
|
-
show: true,
|
192
|
-
scope: $scope.$new(),
|
193
|
-
keyboard: false
|
194
|
-
});
|
195
|
-
*/
|
196
|
-
|
197
204
|
};
|
198
205
|
|
199
|
-
|
200
|
-
|
201
206
|
$scope.toggle_micropanel = function(field,groups) {
|
202
207
|
var docs = _.map($scope.data,function(_d){return _d.kibana._source;});
|
203
208
|
var topFieldValues = kbn.top_field_values(docs,field,10,groups);
|
@@ -210,6 +215,26 @@ function (angular, app, _, kbn, moment) {
|
|
210
215
|
limit: 10,
|
211
216
|
count: _.countBy(docs,function(doc){return _.contains(_.keys(doc),field);})['true']
|
212
217
|
};
|
218
|
+
|
219
|
+
|
220
|
+
var nodeInfo = $scope.ejs.client.get('/' + dashboard.indices + '/_mapping/field/' + field,
|
221
|
+
undefined, undefined, function(data, status) {
|
222
|
+
console.log(status);
|
223
|
+
return;
|
224
|
+
});
|
225
|
+
|
226
|
+
return nodeInfo.then(function(p) {
|
227
|
+
var types = _.uniq(jsonPath(p, '*.*.*.*.mapping.*.type'));
|
228
|
+
if (_.isArray(types)) {
|
229
|
+
$scope.micropanel.type = types.join(', ');
|
230
|
+
}
|
231
|
+
|
232
|
+
|
233
|
+
if(_.intersection(types, ['long','float','integer','double']).length > 0) {
|
234
|
+
$scope.micropanel.hasStats = true;
|
235
|
+
}
|
236
|
+
});
|
237
|
+
|
213
238
|
};
|
214
239
|
|
215
240
|
$scope.micropanelColor = function(index) {
|
@@ -289,9 +314,9 @@ function (angular, app, _, kbn, moment) {
|
|
289
314
|
return;
|
290
315
|
}
|
291
316
|
|
292
|
-
sort = [$scope.ejs.Sort($scope.panel.sort[0]).order($scope.panel.sort[1])];
|
317
|
+
sort = [$scope.ejs.Sort($scope.panel.sort[0]).order($scope.panel.sort[1]).ignoreUnmapped(true)];
|
293
318
|
if($scope.panel.localTime) {
|
294
|
-
sort.push($scope.ejs.Sort($scope.panel.timeField).order($scope.panel.sort[1]));
|
319
|
+
sort.push($scope.ejs.Sort($scope.panel.timeField).order($scope.panel.sort[1]).ignoreUnmapped(true));
|
295
320
|
}
|
296
321
|
|
297
322
|
|
@@ -4,66 +4,91 @@
|
|
4
4
|
.terms-legend-term {
|
5
5
|
word-break: break-all;
|
6
6
|
}
|
7
|
+
|
8
|
+
.terms-remaining {
|
9
|
+
bottom:0;
|
10
|
+
top:0;
|
11
|
+
background-color: #f00;
|
12
|
+
}
|
13
|
+
|
14
|
+
.terms-wrapper {
|
15
|
+
display: table;
|
16
|
+
width: 100%;
|
17
|
+
}
|
18
|
+
|
19
|
+
.terms-legend {
|
20
|
+
display: table-row;
|
21
|
+
height: 0;
|
22
|
+
}
|
23
|
+
|
24
|
+
.terms-legend {
|
25
|
+
display: table-row;
|
26
|
+
}
|
7
27
|
</style>
|
8
28
|
|
9
|
-
|
10
|
-
<div
|
11
|
-
<!--
|
12
|
-
<
|
13
|
-
|
14
|
-
|
15
|
-
<
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<span
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
<span class="small pull-left" ng-show="panel.tmode == 'terms_stats'">
|
29
|
-
  | {{ panel.tstat }} of <strong>{{ panel.valuefield }}</strong>
|
30
|
-
</span>
|
31
|
-
|
32
|
-
</div>
|
33
|
-
|
34
|
-
<!-- keep legend from over lapping -->
|
35
|
-
<div style="clear:both"></div>
|
36
|
-
|
37
|
-
<div ng-show="panel.chart == 'pie' || panel.chart == 'bar'" terms-chart params="{{panel}}" style="position:relative" class="pointer"></div>
|
38
|
-
|
39
|
-
<div ng-show="panel.counter_pos == 'below' && (panel.chart == 'bar' || panel.chart == 'pie')" id='{{$id}}-legend'>
|
40
|
-
<!-- vertical legend below -->
|
41
|
-
<table class="small" ng-show="panel.arrangement == 'vertical'">
|
42
|
-
<tr ng-repeat="term in legend">
|
43
|
-
<td><i class="icon-circle" ng-style="{color:term.color}"></i></i></td>
|
44
|
-
<td class="terms-legend-term" style="padding-right:10px;padding-left:10px;">{{term.label}}</td>
|
45
|
-
<td>{{term.data[0][1]}}</td>
|
46
|
-
</tr>
|
47
|
-
</table>
|
48
|
-
|
49
|
-
<!-- horizontal legend below -->
|
50
|
-
<span class="small" ng-show="panel.arrangement == 'horizontal'" ng-repeat="term in legend" style="float:left;padding-left: 10px;">
|
51
|
-
<span>
|
52
|
-
<i class="icon-circle" ng-style="{color:term.color}"></i>
|
53
|
-
<span class="terms-legend-term">{{term.label}}</span> ({{term.data[0][1]}})
|
29
|
+
|
30
|
+
<div class="terms-wrapper">
|
31
|
+
<!-- LEGEND -->
|
32
|
+
<div class="terms-legend" ng-show="panel.counter_pos == 'above' && (panel.chart == 'bar' || panel.chart == 'pie')" id='{{$id}}-legend'>
|
33
|
+
<!-- vertical legend above -->
|
34
|
+
<table class="small" ng-show="panel.arrangement == 'vertical'">
|
35
|
+
<tr ng-repeat="term in legend">
|
36
|
+
<td><i class="icon-circle" ng-style="{color:term.color}"></i></td>
|
37
|
+
<td class="terms-legend-term" style="padding-right:10px;padding-left:10px;">{{term.label}}</td>
|
38
|
+
<td>{{term.data[0][1]}}</td>
|
39
|
+
</tr>
|
40
|
+
</table>
|
41
|
+
|
42
|
+
<!-- horizontal legend above -->
|
43
|
+
<span class="small" ng-show="panel.arrangement == 'horizontal'" ng-repeat="term in legend" style="float:left;padding-left: 10px;">
|
44
|
+
<span>
|
45
|
+
<i class="icon-circle" ng-style="{color:term.color}"></i>
|
46
|
+
<span class="terms-legend-term">{{term.label}}</span> ({{term.data[0][1]}})
|
47
|
+
</span>
|
54
48
|
</span>
|
55
|
-
</span>
|
56
49
|
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
<span class="small pull-left" ng-show="panel.tmode == 'terms_stats'">
|
51
|
+
  | {{ panel.tstat }} of <strong>{{ panel.valuefield }}</strong>
|
52
|
+
</span>
|
60
53
|
|
54
|
+
</div>
|
55
|
+
<!-- keep legend from over lapping -->
|
61
56
|
<div style="clear:both"></div>
|
62
|
-
</div>
|
63
|
-
<!-- END Pie or Bar chart -->
|
64
57
|
|
65
58
|
|
59
|
+
<!-- CHART -->
|
60
|
+
<div ng-show="panel.chart == 'pie' || panel.chart == 'bar'" terms-chart params="{{panel}}" style="position:relative" class="pointer terms-chart">
|
61
|
+
</div>
|
62
|
+
|
63
|
+
<!-- LEGEND -->
|
64
|
+
<div class="terms-legend" ng-show="panel.counter_pos == 'below' && (panel.chart == 'bar' || panel.chart == 'pie')" id='{{$id}}-legend'>
|
65
|
+
<!-- vertical legend below -->
|
66
|
+
<table class="small" ng-show="panel.arrangement == 'vertical'">
|
67
|
+
<tr ng-repeat="term in legend">
|
68
|
+
<td><i class="icon-circle" ng-style="{color:term.color}"></i></i></td>
|
69
|
+
<td class="terms-legend-term" style="padding-right:10px;padding-left:10px;">{{term.label}}</td>
|
70
|
+
<td>{{term.data[0][1]}}</td>
|
71
|
+
</tr>
|
72
|
+
</table>
|
73
|
+
|
74
|
+
<!-- horizontal legend below -->
|
75
|
+
<span class="small" ng-show="panel.arrangement == 'horizontal'" ng-repeat="term in legend" style="float:left;padding-left: 10px;">
|
76
|
+
<span>
|
77
|
+
<i class="icon-circle" ng-style="{color:term.color}"></i>
|
78
|
+
<span class="terms-legend-term">{{term.label}}</span> ({{term.data[0][1]}})
|
79
|
+
</span>
|
80
|
+
</span>
|
81
|
+
|
82
|
+
<span class="small pull-left" ng-show="panel.tmode == 'terms_stats'">
|
83
|
+
  | {{ panel.tstat }} of <strong>{{ panel.valuefield }}</strong>
|
84
|
+
</span>
|
85
|
+
|
86
|
+
<div style="clear:both"></div>
|
87
|
+
</div>
|
88
|
+
<!-- END Pie or Bar chart -->
|
89
|
+
|
66
90
|
|
91
|
+
<!-- TABLE -->
|
67
92
|
<table ng-style="panel.style" class="table table-striped table-condensed" ng-show="panel.chart == 'table'">
|
68
93
|
<thead>
|
69
94
|
<th>Term</th> <th>{{ panel.tmode == 'terms_stats' ? panel.tstat : 'Count' }}</th> <th>Action</th>
|