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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kibana/assets/app/components/require.config.js +6 -1
  3. data/lib/kibana/assets/app/controllers/dash.js +3 -0
  4. data/lib/kibana/assets/app/dashboards/default.json +1 -1
  5. data/lib/kibana/assets/app/directives/all.js +2 -1
  6. data/lib/kibana/assets/app/directives/dashUpload.js +7 -2
  7. data/lib/kibana/assets/app/directives/kibanaPanel.js +10 -5
  8. data/lib/kibana/assets/app/directives/resizable.js +34 -0
  9. data/lib/kibana/assets/app/panels/bettermap/module.js +3 -3
  10. data/lib/kibana/assets/app/panels/column/module.html +9 -14
  11. data/lib/kibana/assets/app/panels/goal/module.js +3 -7
  12. data/lib/kibana/assets/app/panels/histogram/module.js +3 -12
  13. data/lib/kibana/assets/app/panels/hits/module.js +1 -6
  14. data/lib/kibana/assets/app/panels/map/module.html +1 -1
  15. data/lib/kibana/assets/app/panels/map/module.js +11 -12
  16. data/lib/kibana/assets/app/panels/sparklines/module.js +0 -5
  17. data/lib/kibana/assets/app/panels/stats/editor.html +9 -7
  18. data/lib/kibana/assets/app/panels/stats/module.html +30 -8
  19. data/lib/kibana/assets/app/panels/stats/module.js +17 -3
  20. data/lib/kibana/assets/app/panels/table/micropanel.html +6 -1
  21. data/lib/kibana/assets/app/panels/table/module.html +105 -87
  22. data/lib/kibana/assets/app/panels/table/module.js +46 -21
  23. data/lib/kibana/assets/app/panels/terms/module.html +76 -51
  24. data/lib/kibana/assets/app/panels/terms/module.js +3 -7
  25. data/lib/kibana/assets/app/panels/trends/editor.html +11 -10
  26. data/lib/kibana/assets/app/panels/trends/module.html +11 -2
  27. data/lib/kibana/assets/app/panels/trends/module.js +4 -0
  28. data/lib/kibana/assets/app/partials/dashboard.html +10 -8
  29. data/lib/kibana/assets/app/services/dashboard.js +5 -2
  30. data/lib/kibana/assets/app/services/esVersion.js +5 -1
  31. data/lib/kibana/assets/app/services/kbnIndex.js +4 -0
  32. data/lib/kibana/assets/app/services/panelMove.js +5 -4
  33. data/lib/kibana/assets/app/services/querySrv.js +1 -1
  34. data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
  35. data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
  36. data/lib/kibana/assets/vendor/LICENSE.json +5 -1
  37. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +29 -7
  38. data/lib/kibana/assets/vendor/jsonpath.js +87 -0
  39. data/lib/kibana/sinatra/version.rb +1 -1
  40. 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][$scope.panel.mode];
153
- obj.Value = results.facets['stats_'+alias][$scope.panel.mode]; //sort field
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 class="sidebar-nav">
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" style="{{panel.overflow}}:{{panel.height || row.height}};overflow-y:auto;overflow-x:hidden;" ng-if="panel.all_fields">
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" style="{{panel.overflow}}:{{panel.height || row.height}};overflow-y:auto;overflow-x:hidden;" ng-if="!panel.all_fields">
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 style="{{panel.overflow}}:{{panel.height || row.height}};" ng-class="{'table-main':panel.field_list}" class="table-doc-table">
94
-
95
- <div class="table-facet" ng-if="modalField">
96
- <h4><button class="btn btn-mini btn-danger" ng-click="closeFacet();">close</button> Top 10 terms in field {{modalField}}</h4>
97
- <kibana-simple-panel type="'{{facetType}}'" panel='{{facetPanel}}' ng-cloak></kibana-simple-panel>
98
- </div>
99
-
100
- <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>
101
- <div class="row-fluid" ng-show="panel.paging">
102
- <div class="span1 offset1" style="text-align:right">
103
- <i ng-click="panel.offset = 0" ng-show="panel.offset > 0" class='icon-circle-arrow-left pointer'></i>
104
- <i ng-click="panel.offset = (panel.offset - panel.size)" ng-show="panel.offset > 0" class='icon-arrow-left pointer'></i>
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
- <div class="span8" style="text-align:center">
107
- <strong>{{panel.offset}}</strong> to <strong>{{panel.offset + data.slice(panel.offset,panel.offset+panel.size).length}}</strong>
108
- <small> of {{data.length}} available for paging</small>
109
- </div>
110
- <div class="span1" style="text-align:left">
111
- <i ng-click="panel.offset = (panel.offset + panel.size)" ng-show="data.length > panel.offset+panel.size" class='icon-arrow-right pointer'></i>
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
- </div>
114
- <table class="table-hover table table-condensed" ng-style="panel.style">
115
- <thead ng-show="panel.header">
116
- <th ng-show="panel.fields.length<1">_source (select columns from the list to the left)</th>
117
- <th style="white-space:nowrap" ng-repeat="field in panel.fields">
118
- <i ng-show="!$first" class="pointer link icon-caret-left" ng-click="_.move(panel.fields,$index,$index-1)"></i>
119
-
120
- <span class="pointer" ng-click="set_sort(field)" ng-show='panel.sortable'>
121
- {{field}}
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
- <table class='table table-bordered table-condensed table-details' ng-switch-when="table">
147
- <thead>
148
- <th class="table-details-field">Field</th>
149
- <th class="table-details-action">Action</th>
150
- <th class="table-details-value">Value</th>
151
- </thead>
152
- <tr ng-repeat="(key,value) in event.kibana._source track by $index" ng-class-odd="'odd'">
153
- <td style="word-wrap:break-word" bo-text="key"></td>
154
- <td style="white-space:nowrap">
155
- <i class='icon-search pointer' ng-click="build_search(key,value)" bs-tooltip="'Add filter to match this value'"></i>
156
- <i class='icon-ban-circle pointer' ng-click="build_search(key,value,true)" bs-tooltip="'Add filter to NOT match this value'"></i>
157
- <i class="pointer icon-th" ng-click="toggle_field(key)" bs-tooltip="'Toggle table column'"></i>
158
- </td>
159
- <!-- At some point we need to create a more efficient way of applying the filter pipeline -->
160
- <td style="white-space:pre-wrap;word-wrap:break-word" bo-html="value|noXml|urlLink|stringify"></td>
161
- </tr>
162
- </table>
163
- <pre style="white-space:pre-wrap;word-wrap:break-word" bo-html="without_kibana(event)|tableJson:2" ng-switch-when="json"></pre>
164
- <pre bo-html="without_kibana(event)|tableJson:1" ng-switch-when="raw"></pre>
165
- </td>
166
- </tr>
167
- </tbody>
168
- </table>
169
- <div class="row-fluid" ng-show="panel.paging">
170
- <div class="span1 offset3" style="text-align:right">
171
- <i ng-click="panel.offset = 0" ng-show="panel.offset > 0" class='icon-circle-arrow-left pointer'></i>
172
- <i ng-click="panel.offset = (panel.offset - panel.size)" ng-show="panel.offset > 0" class='icon-arrow-left pointer'></i>
173
- </div>
174
- <div class="span4" style="text-align:center">
175
- <strong>{{panel.offset}}</strong> to <strong>{{panel.offset + data.slice(panel.offset,panel.offset+panel.size).length}}</strong>
176
- <small> of {{data.length}} available for paging</small>
177
- </div>
178
- <div class="span1" style="text-align:left">
179
- <i ng-click="panel.offset = (panel.offset + panel.size)" ng-show="data.length > panel.offset+panel.size" class='icon-arrow-right pointer'></i>
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
- '{"height":"200px","chart":"'+chart+'","field":"'+field+'"}','terms');
180
+ angular.toJson($scope.adhocOpts),'terms');
172
181
  },0);
173
182
  };
174
183
 
175
184
  $scope.statsModal = function(field) {
176
- $scope.modalField = field;
177
- showModal(
178
- '{"field":"'+field+'"}','statistics');
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
- <!-- START Pie or bar chart -->
10
- <div ng-show="panel.counter_pos == 'above' && (panel.chart == 'bar' || panel.chart == 'pie')" id='{{$id}}-legend'>
11
- <!-- vertical legend above -->
12
- <table class="small" ng-show="panel.arrangement == 'vertical'">
13
- <tr ng-repeat="term in legend">
14
- <td><i class="icon-circle" ng-style="{color:term.color}"></i></td>
15
- <td class="terms-legend-term" style="padding-right:10px;padding-left:10px;">{{term.label}}</td>
16
- <td>{{term.data[0][1]}}</td>
17
- </tr>
18
- </table>
19
-
20
- <!-- horizontal legend above -->
21
- <span class="small" ng-show="panel.arrangement == 'horizontal'" ng-repeat="term in legend" style="float:left;padding-left: 10px;">
22
- <span>
23
- <i class="icon-circle" ng-style="{color:term.color}"></i>
24
- <span class="terms-legend-term">{{term.label}}</span> ({{term.data[0][1]}})
25
- </span>
26
- </span>
27
-
28
- <span class="small pull-left" ng-show="panel.tmode == 'terms_stats'">
29
- &nbsp | {{ 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
- <span class="small pull-left" ng-show="panel.tmode == 'terms_stats'">
58
- &nbsp | {{ panel.tstat }} of <strong>{{ panel.valuefield }}</strong>
59
- </span>
50
+ <span class="small pull-left" ng-show="panel.tmode == 'terms_stats'">
51
+ &nbsp | {{ 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
+ &nbsp | {{ 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>