kibana-sinatra 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/kibana-sinatra.gemspec +1 -0
  4. data/lib/kibana/assets/app/app.js +8 -3
  5. data/lib/kibana/assets/app/components/kbn.js +45 -10
  6. data/lib/kibana/assets/app/components/{underscore.extended.js → lodash.extended.js} +2 -4
  7. data/lib/kibana/assets/app/components/require.config.js +5 -6
  8. data/lib/kibana/assets/app/components/settings.js +1 -1
  9. data/lib/kibana/assets/app/controllers/dash.js +10 -5
  10. data/lib/kibana/assets/app/controllers/dashLoader.js +1 -1
  11. data/lib/kibana/assets/app/controllers/pulldown.js +1 -1
  12. data/lib/kibana/assets/app/controllers/row.js +1 -1
  13. data/lib/kibana/assets/app/dashboards/default.json +1 -1
  14. data/lib/kibana/assets/app/dashboards/logstash.js +4 -4
  15. data/lib/kibana/assets/app/dashboards/logstash.json +1 -1
  16. data/lib/kibana/assets/app/directives/addPanel.js +1 -1
  17. data/lib/kibana/assets/app/directives/arrayJoin.js +1 -1
  18. data/lib/kibana/assets/app/directives/configModal.js +23 -5
  19. data/lib/kibana/assets/app/directives/kibanaPanel.js +70 -50
  20. data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +1 -1
  21. data/lib/kibana/assets/app/factories/store.js +59 -0
  22. data/lib/kibana/assets/app/filters/all.js +6 -13
  23. data/lib/kibana/assets/app/panels/bettermap/module.html +5 -0
  24. data/lib/kibana/assets/app/panels/bettermap/module.js +1 -1
  25. data/lib/kibana/assets/app/panels/column/editor.html +1 -1
  26. data/lib/kibana/assets/app/panels/column/module.js +7 -6
  27. data/lib/kibana/assets/app/panels/dashcontrol/module.js +1 -1
  28. data/lib/kibana/assets/app/panels/derivequeries/module.js +1 -1
  29. data/lib/kibana/assets/app/panels/fields/module.js +1 -1
  30. data/lib/kibana/assets/app/panels/filtering/module.html +10 -17
  31. data/lib/kibana/assets/app/panels/filtering/module.js +19 -1
  32. data/lib/kibana/assets/app/panels/histogram/module.html +4 -4
  33. data/lib/kibana/assets/app/panels/histogram/module.js +62 -12
  34. data/lib/kibana/assets/app/panels/histogram/timeSeries.js +6 -3
  35. data/lib/kibana/assets/app/panels/hits/module.js +1 -1
  36. data/lib/kibana/assets/app/panels/map/module.js +1 -1
  37. data/lib/kibana/assets/app/panels/pie/editor.html +1 -1
  38. data/lib/kibana/assets/app/panels/pie/module.js +1 -1
  39. data/lib/kibana/assets/app/panels/query/meta.html +1 -1
  40. data/lib/kibana/assets/app/panels/query/module.html +1 -1
  41. data/lib/kibana/assets/app/panels/query/module.js +2 -7
  42. data/lib/kibana/assets/app/panels/query/query.css +9 -7
  43. data/lib/kibana/assets/app/panels/sparklines/module.js +2 -2
  44. data/lib/kibana/assets/app/panels/sparklines/timeSeries.js +3 -3
  45. data/lib/kibana/assets/app/panels/stats/editor.html +36 -0
  46. data/lib/kibana/assets/app/panels/stats/module.html +15 -0
  47. data/lib/kibana/assets/app/panels/stats/module.js +199 -0
  48. data/lib/kibana/assets/app/panels/table/editor.html +23 -27
  49. data/lib/kibana/assets/app/panels/table/micropanel.html +3 -1
  50. data/lib/kibana/assets/app/panels/table/module.js +7 -1
  51. data/lib/kibana/assets/app/panels/terms/editor.html +16 -3
  52. data/lib/kibana/assets/app/panels/terms/module.html +14 -5
  53. data/lib/kibana/assets/app/panels/terms/module.js +66 -18
  54. data/lib/kibana/assets/app/panels/text/module.js +1 -1
  55. data/lib/kibana/assets/app/panels/timepicker/editor.html +14 -12
  56. data/lib/kibana/assets/app/panels/timepicker/module.html +3 -8
  57. data/lib/kibana/assets/app/panels/timepicker/module.js +1 -1
  58. data/lib/kibana/assets/app/panels/trends/module.js +1 -1
  59. data/lib/kibana/assets/app/partials/dashLoader.html +10 -10
  60. data/lib/kibana/assets/app/partials/dashboard.html +35 -44
  61. data/lib/kibana/assets/app/partials/dasheditor.html +7 -5
  62. data/lib/kibana/assets/app/partials/paneleditor.html +2 -1
  63. data/lib/kibana/assets/app/partials/panelgeneral.html +1 -1
  64. data/lib/kibana/assets/app/partials/roweditor.html +11 -9
  65. data/lib/kibana/assets/app/services/alertSrv.js +1 -1
  66. data/lib/kibana/assets/app/services/dashboard.js +27 -14
  67. data/lib/kibana/assets/app/services/esVersion.js +70 -31
  68. data/lib/kibana/assets/app/services/fields.js +14 -37
  69. data/lib/kibana/assets/app/services/filterSrv.js +7 -11
  70. data/lib/kibana/assets/app/services/kbnIndex.js +24 -15
  71. data/lib/kibana/assets/app/services/panelMove.js +1 -1
  72. data/lib/kibana/assets/app/services/querySrv.js +20 -6
  73. data/lib/kibana/assets/app/services/timer.js +1 -1
  74. data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
  75. data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
  76. data/lib/kibana/assets/img/cubes.png +0 -0
  77. data/lib/kibana/assets/img/light.png +0 -0
  78. data/lib/kibana/assets/index.html +3 -2
  79. data/lib/kibana/assets/vendor/LICENSE.json +90 -0
  80. data/lib/kibana/assets/vendor/angular/angular-cookies.js +185 -0
  81. data/lib/kibana/assets/vendor/angular/angular-dragdrop.js +33 -4
  82. data/lib/kibana/assets/vendor/blob.js +178 -0
  83. data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +6 -1
  84. data/lib/kibana/assets/vendor/bootstrap/less/bak/bootswatch.dark.less +555 -0
  85. data/lib/kibana/assets/vendor/bootstrap/less/bak/variables.dark.less +304 -0
  86. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +349 -327
  87. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.light.less +590 -7
  88. data/lib/kibana/assets/vendor/bootstrap/less/modals.less +1 -1
  89. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +191 -75
  90. data/lib/kibana/assets/vendor/bootstrap/less/variables.dark.less +96 -97
  91. data/lib/kibana/assets/vendor/bootstrap/less/variables.light.less +84 -81
  92. data/lib/kibana/assets/vendor/jquery/jquery.flot.events.js +39 -51
  93. data/lib/kibana/assets/vendor/lodash.js +6785 -0
  94. data/lib/kibana/assets/vendor/numeral.js +565 -0
  95. data/lib/kibana/sinatra/version.rb +1 -1
  96. data/lib/kibana/views/config.erb +1 -0
  97. data/test/sinatra_test.rb +2 -2
  98. metadata +30 -4
  99. data/lib/kibana/assets/vendor/underscore.js +0 -1246
@@ -39,7 +39,8 @@
39
39
  default logstash index pattern you might use
40
40
  <code>[logstash-]YYYY.MM.DD</code>. The [] in "[logstash-]" are
41
41
  important as they instruct Kibana not to treat those letters as a
42
- pattern.
42
+ pattern. You may also specify multiple indices by seperating them with a comma(,).
43
+ For example <code>[web-]YYYY.MM.DD,[mail-]YYYY.MM.DD</code>
43
44
  Please also note that indices should rollover at midnight <strong>UTC</strong>.
44
45
  </p>
45
46
  <p class="small">
@@ -79,7 +80,7 @@
79
80
  <div class="row-fluid">
80
81
  <div class="span8">
81
82
  <h4>Rows</h4>
82
- <table class="table table-condensed table-bordered">
83
+ <table class="table table-striped">
83
84
  <thead>
84
85
  <th width="1%"></th>
85
86
  <th width="1%"></th>
@@ -90,7 +91,7 @@
90
91
  <td><i ng-click="_.move(dashboard.current.rows,$index,$index-1)" ng-hide="$first" class="pointer icon-arrow-up"></i></td>
91
92
  <td><i ng-click="_.move(dashboard.current.rows,$index,$index+1)" ng-hide="$last" class="pointer icon-arrow-down"></i></td>
92
93
  <td><i ng-click="dashboard.current.rows = _.without(dashboard.current.rows,row)" class="pointer icon-remove"></i></td>
93
- <td>{{row.title}}</td>
94
+ <td>{{row.title||'Untitled'}}</td>
94
95
  </tr>
95
96
  </table>
96
97
  </div>
@@ -177,6 +178,7 @@
177
178
  </div>
178
179
 
179
180
  <div class="modal-footer">
180
- <button ng-click="add_row(dashboard.current,row); reset_row();" class="btn btn-success" ng-show="editor.index == 2">Create Row</button>
181
- <button type="button" class="btn btn-danger" ng-click="editor.index=0;dismiss();reset_panel();dashboard.refresh()">Close</button>
181
+ <button type="button" ng-click="add_row(dashboard.current,row); reset_row();" class="btn btn-info" ng-show="editor.index == 2">Create Row</button>
182
+ <button type="button" class="btn btn-success" ng-click="editor.index=0;editSave(dashboard);dismiss();reset_panel();dashboard.refresh()">Save</button>
183
+ <button type="button" class="btn btn-danger" ng-click="editor.index=0;dismiss();reset_panel();dashboard.refresh()">Cancel</button>
182
184
  </div>
@@ -19,5 +19,6 @@
19
19
 
20
20
  <div class="modal-footer">
21
21
  <!-- close_edit() is provided here to allow for a scope to perform action on dismiss -->
22
- <button type="button" class="btn btn-danger" ng-click="editor.index=0;close_edit();dismiss()">Close</button>
22
+ <button type="button" class="btn btn-success" ng-click="editor.index=0;editSave(panel);close_edit();dismiss()">Save</button>
23
+ <button type="button" class="btn btn-danger" ng-click="editor.index=0;dismiss()">Cancel</button>
23
24
  </div>
@@ -9,7 +9,7 @@
9
9
  <label class="small">Title</label><input type="text" class="input-medium" ng-model='panel.title'></input>
10
10
  </div>
11
11
  <div class="editor-option" ng-hide="panel.sizeable == false">
12
- <label class="small">Span</label> <select class="input-mini" ng-model="panel.span" ng-options="f for f in [0,1,2,3,4,5,6,7,8,9,10,11,12]"></select>
12
+ <label class="small">Span</label> <select class="input-mini" ng-model="panel.span" ng-options="f for f in [1,2,3,4,5,6,7,8,9,10,11,12]"></select>
13
13
  </div>
14
14
  <div class="editor-option">
15
15
  <label class="small">Editable</label><input type="checkbox" ng-model="panel.editable" ng-checked="panel.editable">
@@ -6,23 +6,23 @@
6
6
  </div>
7
7
  </div>
8
8
 
9
- <div class="row-fluid" ng-if="editor.index == 0">
10
- <div class="span4">
9
+ <div class="editor-row" ng-if="editor.index == 0">
10
+ <div class="editor-option">
11
11
  <label class="small">Title</label><input type="text" class="input-medium" ng-model='row.title'></input>
12
12
  </div>
13
- <div class="span2">
13
+ <div class="editor-option">
14
14
  <label class="small">Height</label><input type="text" class="input-mini" ng-model='row.height'></input>
15
15
  </div>
16
- <div class="span1">
16
+ <div class="editor-option">
17
17
  <label class="small"> Editable </label><input type="checkbox" ng-model="row.editable" ng-checked="row.editable" />
18
18
  </div>
19
- <div class="span1">
19
+ <div class="editor-option">
20
20
  <label class="small"> Collapsable </label><input type="checkbox" ng-model="row.collapsable" ng-checked="row.collapsable" />
21
21
  </div>
22
22
  </div>
23
23
  <div class="row-fluid" ng-if="editor.index == 1">
24
24
  <div class="span12">
25
- <h4>Panels <i class="icon-plus-sign link" bs-tooltip="'Add panel'" ng-click="editor.index = 2"></i></h4>
25
+ <h4>Panels</h4>
26
26
  <table class="table table-condensed table-striped">
27
27
  <thead>
28
28
  <th>Title</th>
@@ -36,7 +36,7 @@
36
36
  <tr ng-repeat="panel in row.panels">
37
37
  <td>{{panel.title}}</td>
38
38
  <td>{{panel.type}}</td>
39
- <td><select ng-hide="panel.sizeable == false" class="input-mini" ng-model="panel.span" ng-options="size for size in [0,1,2,3,4,5,6,7,8,9,10,11,12]"></select></td>
39
+ <td><select ng-hide="panel.sizeable == false" class="input-mini" ng-model="panel.span" ng-options="size for size in [1,2,3,4,5,6,7,8,9,10,11,12]"></select></td>
40
40
  <td><i ng-click="row.panels = _.without(row.panels,panel)" class="pointer icon-remove"></i></td>
41
41
  <td><i ng-click="_.move(row.panels,$index,$index-1)" ng-hide="$first" class="pointer icon-arrow-up"></i></td>
42
42
  <td><i ng-click="_.move(row.panels,$index,$index+1)" ng-hide="$last" class="pointer icon-arrow-down"></i></td>
@@ -60,6 +60,8 @@
60
60
  </div>
61
61
  </div>
62
62
  <div class="modal-footer">
63
- <button ng-show="panel.type &amp;&amp; editor.index == 2" ng-click="add_panel(row,panel); reset_panel(); editor.index == 1;" class="btn btn-success" ng-disabled="panel.loadingEditor">Add Panel</button>
64
- <button type="button" class="btn btn-danger" ng-click="editor.index=0;dismiss();reset_panel();close_edit()">Close</button>
63
+ <button ng-show="editor.index == 1" ng-click="editor.index = 2;" class="btn btn-info" ng-disabled="panel.loadingEditor">Add Panel</button>
64
+ <button ng-show="panel.type && editor.index == 2" ng-click="editSave(row);add_panel(row,panel);reset_panel();editor.index = 0;dismiss();" class="btn btn-success" ng-disabled="panel.loadingEditor">Save</button>
65
+ <button ng-hide="panel.type && editor.index == 2" ng-click="editor.index=0;editSave(row);dismiss();reset_panel();close_edit()" class="btn btn-success">Save</button>
66
+ <button type="button" class="btn btn-danger" ng-click="editor.index=0;dismiss();reset_panel();close_edit()">Cancel</button>
65
67
  </div>
@@ -1,6 +1,6 @@
1
1
  define([
2
2
  'angular',
3
- 'underscore'
3
+ 'lodash'
4
4
  ],
5
5
  function (angular, _) {
6
6
  'use strict';
@@ -2,11 +2,12 @@ define([
2
2
  'angular',
3
3
  'jquery',
4
4
  'kbn',
5
- 'underscore',
5
+ 'lodash',
6
6
  'config',
7
7
  'moment',
8
8
  'modernizr',
9
- 'filesaver'
9
+ 'filesaver',
10
+ 'blob'
10
11
  ],
11
12
  function (angular, $, kbn, _, config, moment, Modernizr) {
12
13
  'use strict';
@@ -15,7 +16,7 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
15
16
 
16
17
  module.service('dashboard', function(
17
18
  $routeParams, $http, $rootScope, $injector, $location, $timeout,
18
- ejsResource, timer, kbnIndex, alertSrv
19
+ ejsResource, timer, kbnIndex, alertSrv, esVersion, esMinVersion
19
20
  ) {
20
21
  // A hash of defaults to use when loading a dashboard
21
22
 
@@ -79,7 +80,14 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
79
80
  // Clear the current dashboard to prevent reloading
80
81
  self.current = {};
81
82
  self.indices = [];
82
- route();
83
+ esVersion.isMinimum().then(function(isMinimum) {
84
+ if(isMinimum) {
85
+ route();
86
+ } else {
87
+ alertSrv.set('Upgrade Required',"Your version of Elasticsearch is too old. Kibana requires" +
88
+ " Elasticsearch " + esMinVersion + " or above.", "error");
89
+ }
90
+ });
83
91
  });
84
92
 
85
93
  var route = function() {
@@ -114,7 +122,6 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
114
122
  // as their default
115
123
  if (Modernizr.localstorage) {
116
124
  if(!(_.isUndefined(window.localStorage['dashboard'])) && window.localStorage['dashboard'] !== '') {
117
- console.log(window.localStorage['dashboard']);
118
125
  $location.path(config.default_route);
119
126
  alertSrv.set('Saving to browser storage has been replaced',' with saving to Elasticsearch.'+
120
127
  ' Click <a href="#/dashboard/local/deprecated">here</a> to load your old dashboard anyway.');
@@ -247,7 +254,6 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
247
254
  };
248
255
 
249
256
  this.set_default = function(route) {
250
- console.log(route);
251
257
  if (Modernizr.localstorage) {
252
258
  // Purge any old dashboards
253
259
  if(!_.isUndefined(window.localStorage['dashboard'])) {
@@ -490,18 +496,25 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
490
496
  });
491
497
  };
492
498
 
499
+ this.start_scheduled_refresh = function (after_ms) {
500
+ timer.cancel(self.refresh_timer);
501
+ self.refresh_timer = timer.register($timeout(function () {
502
+ self.start_scheduled_refresh(after_ms);
503
+ self.refresh();
504
+ }, after_ms));
505
+ };
506
+
507
+ this.cancel_scheduled_refresh = function () {
508
+ timer.cancel(self.refresh_timer);
509
+ };
510
+
493
511
  this.set_interval = function (interval) {
494
512
  self.current.refresh = interval;
495
- if(interval) {
513
+ if (interval) {
496
514
  var _i = kbn.interval_to_ms(interval);
497
- timer.cancel(self.refresh_timer);
498
- self.refresh_timer = timer.register($timeout(function() {
499
- self.set_interval(interval);
500
- self.refresh();
501
- },_i));
502
- self.refresh();
515
+ this.start_scheduled_refresh(_i);
503
516
  } else {
504
- timer.cancel(self.refresh_timer);
517
+ this.cancel_scheduled_refresh();
505
518
  }
506
519
  };
507
520
 
@@ -1,6 +1,6 @@
1
1
  define([
2
2
  'angular',
3
- 'underscore',
3
+ 'lodash',
4
4
  'config'
5
5
  ],
6
6
  function (angular, _, config) {
@@ -8,47 +8,55 @@ function (angular, _, config) {
8
8
 
9
9
  var module = angular.module('kibana.services');
10
10
 
11
- module.service('esVersion', function($http, alertSrv) {
11
+ module.service('esVersion', function($http, alertSrv, esMinVersion, $q) {
12
12
 
13
13
  this.versions = [];
14
14
 
15
15
  // save a reference to this
16
- var self = this;
16
+ var self = this,
17
+ defer = $q.defer();
17
18
 
18
19
  this.init = function() {
19
20
  getVersions();
20
21
  };
21
22
 
22
23
  var getVersions = function() {
23
- var nodeInfo = $http({
24
- url: config.elasticsearch + '/_nodes',
25
- method: "GET"
26
- }).error(function(data, status) {
27
- if(status === 0) {
28
- alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
29
- ". Please ensure that Elasticsearch is reachable from your system." ,'error');
30
- } else {
31
- alertSrv.set('Error',"Could not reach "+config.elasticsearch+"/_nodes. If you"+
32
- " are using a proxy, ensure it is configured correctly",'error');
33
- }
34
- });
24
+ if(self.versions.length !== 0) {
25
+ defer.resolve(self.versions);
26
+ return defer.promise;
27
+ } else {
28
+ var nodeInfo = $http({
29
+ url: config.elasticsearch + '/_nodes',
30
+ method: "GET",
31
+ }).error(function(data, status) {
32
+ if(status === 0) {
33
+ alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
34
+ ". Please ensure that Elasticsearch is reachable from your system." ,'error');
35
+ } else {
36
+ alertSrv.set('Error',"Could not reach "+config.elasticsearch+"/_nodes. If you"+
37
+ " are using a proxy, ensure it is configured correctly",'error');
38
+ }
39
+ });
35
40
 
36
- return nodeInfo.then(function(p) {
37
- _.each(p.data.nodes, function(v) {
38
- self.versions.push(v.version.split('-')[0]);
41
+ return nodeInfo.then(function(p) {
42
+ _.each(p.data.nodes, function(v) {
43
+ self.versions.push(v.version.split('-')[0]);
44
+ });
45
+ self.versions = sortVersions(_.uniq(self.versions));
46
+ return self.versions;
39
47
  });
40
- self.versions = sortVersions(_.uniq(self.versions));
41
- });
48
+ }
49
+
42
50
  };
43
51
 
44
52
  // Get the max version in this cluster
45
- this.max = function() {
46
- return _.last(self.versions);
53
+ this.max = function(versions) {
54
+ return _.last(versions);
47
55
  };
48
56
 
49
57
  // Return the lowest version in the cluster
50
- this.min = function() {
51
- return _.first(self.versions);
58
+ this.min = function(versions) {
59
+ return _.first(versions);
52
60
  };
53
61
 
54
62
  // Sort versions from lowest to highest
@@ -90,29 +98,47 @@ function (angular, _, config) {
90
98
  return _cf;
91
99
  };
92
100
 
101
+ this.isMinimum = function() {
102
+ return self.gte(esMinVersion);
103
+ };
104
+
93
105
  // check if lowest version in cluster = `version`
94
106
  this.eq = function(version) {
95
- return version === self.min() ? true : false;
107
+ return getVersions().then(function(v) {
108
+ return version === self.min(v) ? true : false;
109
+ });
110
+
96
111
  };
97
112
 
98
113
  // version > lowest version in cluster?
99
114
  this.gt = function(version) {
100
- return version === self.min() ? false : self.gte(version);
115
+ return getVersions().then(function(v) {
116
+ return version === self.min(v) ? false : self.gte(version);
117
+ });
118
+
101
119
  };
102
120
 
103
121
  // version < highest version in cluster?
104
122
  this.lt = function(version) {
105
- return version === self.max() ? false : self.lte(version);
123
+ return getVersions().then(function(v) {
124
+ return version === self.max(v) ? false : self.lte(version);
125
+ });
126
+
106
127
  };
107
128
 
108
129
  // Check if the lowest version in the cluster is >= to `version`
109
130
  this.gte = function(version) {
110
- return self.compare(version,self.min());
131
+ return getVersions().then(function(v) {
132
+ return self.compare(version,self.min(v));
133
+ });
134
+
111
135
  };
112
136
 
113
137
  // Check if the highest version in the cluster is <= to `version`
114
138
  this.lte = function(version) {
115
- return self.compare(self.max(),version);
139
+ return getVersions().then(function(v) {
140
+ return self.compare(self.max(v),version);
141
+ });
116
142
  };
117
143
 
118
144
  // Determine if a specific version is greater than or equal to another
@@ -121,10 +147,11 @@ function (angular, _, config) {
121
147
  var b = required.split('.');
122
148
  var i;
123
149
 
124
- for (i = 0; i < a.length; ++i) {
150
+ // leave suffixes as is ("RC1 or -SNAPSHOT")
151
+ for (i = 0; i < Math.min(a.length, 3); ++i) {
125
152
  a[i] = Number(a[i]);
126
153
  }
127
- for (i = 0; i < b.length; ++i) {
154
+ for (i = 0; i < Math.min(b.length, 3); ++i) {
128
155
  b[i] = Number(b[i]);
129
156
  }
130
157
  if (a.length === 2) {
@@ -140,6 +167,18 @@ function (angular, _, config) {
140
167
  if (a[2] > b[2]){return true;}
141
168
  if (a[2] < b[2]){return false;}
142
169
 
170
+ if (a.length > 3) {
171
+ // rc/beta suffix
172
+ if (b.length <= 3) {
173
+ return false;
174
+ } // no suffix on b -> a<b
175
+ return a[3] >= b[3];
176
+ }
177
+ if (b.length > 3) {
178
+ // b has a suffix but a not -> a>b
179
+ return true;
180
+ }
181
+
143
182
  return true;
144
183
  };
145
184
 
@@ -1,6 +1,6 @@
1
1
  define([
2
2
  'angular',
3
- 'underscore',
3
+ 'lodash',
4
4
  'config'
5
5
  ],
6
6
  function (angular, _, config) {
@@ -8,7 +8,8 @@ function (angular, _, config) {
8
8
 
9
9
  var module = angular.module('kibana.services');
10
10
 
11
- module.service('fields', function(dashboard, $rootScope, $http, alertSrv) {
11
+ module.service('fields', function(dashboard, $rootScope, $http, esVersion, alertSrv) {
12
+
12
13
  // Save a reference to this
13
14
  var self = this;
14
15
 
@@ -36,7 +37,8 @@ function (angular, _, config) {
36
37
  var fields = [];
37
38
  _.each(m, function(types) {
38
39
  _.each(types, function(type) {
39
- fields = _.without(_.union(fields,_.keys(type)),'_all','_source');
40
+ fields = _.difference(_.union(fields,_.keys(type)),
41
+ ['_parent','_routing','_size','_ttl','_all','_uid','_version','_boost','_source']);
40
42
  });
41
43
  });
42
44
  return fields;
@@ -44,7 +46,7 @@ function (angular, _, config) {
44
46
 
45
47
  this.map = function(indices) {
46
48
  var request = $http({
47
- url: config.elasticsearch + "/" + indices.join(',') + "/_mapping",
49
+ url: config.elasticsearch + "/" + indices.join(',') + "/_mapping/field/*",
48
50
  method: "GET"
49
51
  }).error(function(data, status) {
50
52
  if(status === 0) {
@@ -52,7 +54,7 @@ function (angular, _, config) {
52
54
  ". Please ensure that Elasticsearch is reachable from your system." ,'error');
53
55
  } else {
54
56
  alertSrv.set('Error',"No index found at "+config.elasticsearch+"/" +
55
- indices.join(',')+"/_mapping. Please create at least one index." +
57
+ indices.join(',')+"/_mapping/field/*. Please create at least one index." +
56
58
  "If you're using a proxy ensure it is configured correctly.",'error');
57
59
  }
58
60
  });
@@ -60,43 +62,18 @@ function (angular, _, config) {
60
62
  // Flatten the mapping of each index into dot notated keys.
61
63
  return request.then(function(p) {
62
64
  var mapping = {};
63
- _.each(p.data, function(type,index) {
64
- mapping[index] = {};
65
- _.each(type, function (fields,typename) {
66
- mapping[index][typename] = flatten(fields);
65
+ return esVersion.gte('1.0.0.RC1').then(function(version) {
66
+ _.each(p.data, function(indexMap,index) {
67
+ mapping[index] = {};
68
+ _.each((version ? indexMap.mappings : indexMap), function (typeMap,type) {
69
+ mapping[index][type] = typeMap;
70
+ });
67
71
  });
72
+ return mapping;
68
73
  });
69
- return mapping;
70
74
  });
71
75
  };
72
76
 
73
- var flatten = function(obj,prefix) {
74
- var propName = (prefix) ? prefix : '',
75
- dot = (prefix) ? '.':'',
76
- ret = {};
77
- for(var attr in obj){
78
- if(attr === 'dynamic_templates' || attr === '_default_') {
79
- continue;
80
- }
81
- // For now only support multi field on the top level
82
- // and if there is a default field set.
83
- if(obj[attr]['type'] === 'multi_field') {
84
- ret[attr] = obj[attr]['fields'][attr] || obj[attr];
85
- var keys = _.without(_.keys(obj[attr]['fields']),attr);
86
- for(var key in keys) {
87
- ret[attr+'.'+keys[key]] = obj[attr]['fields'][keys[key]];
88
- }
89
- } else if (attr === 'properties') {
90
- _.extend(ret,flatten(obj[attr], propName));
91
- } else if(typeof obj[attr] === 'object'){
92
- _.extend(ret,flatten(obj[attr], propName + dot + attr));
93
- } else {
94
- ret[propName] = obj;
95
- }
96
- }
97
- return ret;
98
- };
99
-
100
77
  });
101
78
 
102
79
  });