kibana-sinatra 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (237) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +30 -2
  3. data/Rakefile +1 -0
  4. data/kibana-sinatra.gemspec +2 -0
  5. data/lib/kibana/assets/app/app.js +0 -0
  6. data/lib/kibana/assets/app/components/extend-jquery.js +0 -0
  7. data/lib/kibana/assets/app/components/kbn.js +132 -2
  8. data/lib/kibana/assets/app/components/require.config.js +0 -0
  9. data/lib/kibana/assets/app/components/settings.js +0 -0
  10. data/lib/kibana/assets/app/components/underscore.extended.js +0 -0
  11. data/lib/kibana/assets/app/controllers/all.js +1 -0
  12. data/lib/kibana/assets/app/controllers/dash.js +0 -0
  13. data/lib/kibana/assets/app/controllers/dashLoader.js +10 -3
  14. data/lib/kibana/assets/app/controllers/pulldown.js +45 -0
  15. data/lib/kibana/assets/app/controllers/row.js +3 -0
  16. data/lib/kibana/assets/app/dashboards/blank.json +0 -0
  17. data/lib/kibana/assets/app/dashboards/default.json +78 -19
  18. data/lib/kibana/assets/app/dashboards/guided.json +60 -52
  19. data/lib/kibana/assets/app/dashboards/logstash.js +6 -49
  20. data/lib/kibana/assets/app/dashboards/logstash.json +104 -95
  21. data/lib/kibana/assets/app/dashboards/noted.json +56 -87
  22. data/lib/kibana/assets/app/directives/addPanel.js +0 -0
  23. data/lib/kibana/assets/app/directives/all.js +1 -0
  24. data/lib/kibana/assets/app/directives/arrayJoin.js +0 -0
  25. data/lib/kibana/assets/app/directives/confirmClick.js +0 -0
  26. data/lib/kibana/assets/app/directives/dashUpload.js +0 -0
  27. data/lib/kibana/assets/app/directives/kibanaPanel.js +1 -1
  28. data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +54 -0
  29. data/lib/kibana/assets/app/directives/ngBlur.js +0 -0
  30. data/lib/kibana/assets/app/directives/ngModelOnBlur.js +0 -0
  31. data/lib/kibana/assets/app/directives/tip.js +0 -0
  32. data/lib/kibana/assets/app/filters/all.js +11 -1
  33. data/lib/kibana/assets/app/panels/bettermap/editor.html +0 -0
  34. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/layers-2x.png +0 -0
  35. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/layers.png +0 -0
  36. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-icon-2x.png +0 -0
  37. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-icon.png +0 -0
  38. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-shadow.png +0 -0
  39. data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet-src.js +0 -0
  40. data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.css +0 -0
  41. data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.ie.css +0 -0
  42. data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.js +0 -0
  43. data/lib/kibana/assets/app/panels/bettermap/leaflet/plugins.css +0 -0
  44. data/lib/kibana/assets/app/panels/bettermap/leaflet/plugins.js +0 -0
  45. data/lib/kibana/assets/app/panels/bettermap/module.css +0 -0
  46. data/lib/kibana/assets/app/panels/bettermap/module.html +0 -0
  47. data/lib/kibana/assets/app/panels/bettermap/module.js +0 -0
  48. data/lib/kibana/assets/app/panels/column/editor.html +0 -0
  49. data/lib/kibana/assets/app/panels/column/module.html +0 -0
  50. data/lib/kibana/assets/app/panels/column/module.js +0 -0
  51. data/lib/kibana/assets/app/panels/column/panelgeneral.html +0 -0
  52. data/lib/kibana/assets/app/panels/dashcontrol/editor.html +0 -0
  53. data/lib/kibana/assets/app/panels/dashcontrol/load.html +0 -0
  54. data/lib/kibana/assets/app/panels/dashcontrol/module.html +0 -0
  55. data/lib/kibana/assets/app/panels/dashcontrol/module.js +0 -0
  56. data/lib/kibana/assets/app/panels/dashcontrol/save.html +0 -0
  57. data/lib/kibana/assets/app/panels/dashcontrol/share.html +0 -0
  58. data/lib/kibana/assets/app/panels/derivequeries/editor.html +0 -0
  59. data/lib/kibana/assets/app/panels/derivequeries/module.html +0 -0
  60. data/lib/kibana/assets/app/panels/derivequeries/module.js +0 -0
  61. data/lib/kibana/assets/app/panels/fields/editor.html +0 -0
  62. data/lib/kibana/assets/app/panels/fields/micropanel.html +0 -0
  63. data/lib/kibana/assets/app/panels/fields/module.html +0 -0
  64. data/lib/kibana/assets/app/panels/fields/module.js +0 -0
  65. data/lib/kibana/assets/app/panels/filtering/editor.html +0 -0
  66. data/lib/kibana/assets/app/panels/filtering/meta.html +0 -0
  67. data/lib/kibana/assets/app/panels/filtering/module.html +25 -13
  68. data/lib/kibana/assets/app/panels/filtering/module.js +6 -2
  69. data/lib/kibana/assets/app/panels/histogram/editor.html +1 -1
  70. data/lib/kibana/assets/app/panels/histogram/interval.js +0 -0
  71. data/lib/kibana/assets/app/panels/histogram/module.html +26 -24
  72. data/lib/kibana/assets/app/panels/histogram/module.js +8 -11
  73. data/lib/kibana/assets/app/panels/histogram/timeSeries.js +0 -0
  74. data/lib/kibana/assets/app/panels/hits/editor.html +0 -0
  75. data/lib/kibana/assets/app/panels/hits/module.html +0 -0
  76. data/lib/kibana/assets/app/panels/hits/module.js +0 -0
  77. data/lib/kibana/assets/app/panels/map/editor.html +0 -0
  78. data/lib/kibana/assets/app/panels/map/lib/jquery.jvectormap.min.js +0 -0
  79. data/lib/kibana/assets/app/panels/map/lib/map.europe.js +0 -0
  80. data/lib/kibana/assets/app/panels/map/lib/map.usa.js +0 -0
  81. data/lib/kibana/assets/app/panels/map/lib/map.world.js +0 -0
  82. data/lib/kibana/assets/app/panels/map/module.html +0 -0
  83. data/lib/kibana/assets/app/panels/map/module.js +0 -1
  84. data/lib/kibana/assets/app/panels/pie/editor.html +0 -0
  85. data/lib/kibana/assets/app/panels/pie/module.html +0 -0
  86. data/lib/kibana/assets/app/panels/pie/module.js +1 -2
  87. data/lib/kibana/assets/app/panels/query/editor.html +0 -0
  88. data/lib/kibana/assets/app/panels/query/meta.html +0 -0
  89. data/lib/kibana/assets/app/panels/query/module.html +1 -1
  90. data/lib/kibana/assets/app/panels/query/module.js +0 -0
  91. data/lib/kibana/assets/app/panels/query/query.css +0 -0
  92. data/lib/kibana/assets/app/panels/table/editor.html +0 -0
  93. data/lib/kibana/assets/app/panels/table/micropanel.html +1 -1
  94. data/lib/kibana/assets/app/panels/table/module.html +2 -2
  95. data/lib/kibana/assets/app/panels/table/module.js +1 -3
  96. data/lib/kibana/assets/app/panels/table/pagination.html +0 -0
  97. data/lib/kibana/assets/app/panels/terms/editor.html +0 -0
  98. data/lib/kibana/assets/app/panels/terms/module.html +0 -0
  99. data/lib/kibana/assets/app/panels/terms/module.js +0 -1
  100. data/lib/kibana/assets/app/panels/text/editor.html +0 -0
  101. data/lib/kibana/assets/app/panels/text/lib/showdown.js +0 -0
  102. data/lib/kibana/assets/app/panels/text/module.html +0 -0
  103. data/lib/kibana/assets/app/panels/text/module.js +0 -0
  104. data/lib/kibana/assets/app/panels/timepicker/custom.html +78 -0
  105. data/lib/kibana/assets/app/panels/timepicker/editor.html +8 -28
  106. data/lib/kibana/assets/app/panels/timepicker/module.html +49 -69
  107. data/lib/kibana/assets/app/panels/timepicker/module.js +137 -190
  108. data/lib/kibana/assets/app/panels/timepicker/refreshctrl.html +0 -0
  109. data/lib/kibana/assets/app/panels/trends/editor.html +0 -0
  110. data/lib/kibana/assets/app/panels/trends/module.html +0 -0
  111. data/lib/kibana/assets/app/panels/trends/module.js +2 -1
  112. data/lib/kibana/assets/app/partials/dashLoader.html +76 -47
  113. data/lib/kibana/assets/app/partials/dashLoaderShare.html +0 -0
  114. data/lib/kibana/assets/app/partials/dashboard.html +77 -61
  115. data/lib/kibana/assets/app/partials/dasheditor.html +38 -17
  116. data/lib/kibana/assets/app/partials/inspector.html +0 -0
  117. data/lib/kibana/assets/app/partials/load.html +0 -0
  118. data/lib/kibana/assets/app/partials/modal.html +0 -0
  119. data/lib/kibana/assets/app/partials/paneladd.html +0 -0
  120. data/lib/kibana/assets/app/partials/paneleditor.html +0 -0
  121. data/lib/kibana/assets/app/partials/panelgeneral.html +0 -0
  122. data/lib/kibana/assets/app/partials/querySelect.html +0 -0
  123. data/lib/kibana/assets/app/partials/roweditor.html +1 -1
  124. data/lib/kibana/assets/app/services/alertSrv.js +0 -0
  125. data/lib/kibana/assets/app/services/all.js +0 -0
  126. data/lib/kibana/assets/app/services/dashboard.js +49 -7
  127. data/lib/kibana/assets/app/services/fields.js +0 -0
  128. data/lib/kibana/assets/app/services/filterSrv.js +79 -47
  129. data/lib/kibana/assets/app/services/kbnIndex.js +0 -0
  130. data/lib/kibana/assets/app/services/panelMove.js +1 -16
  131. data/lib/kibana/assets/app/services/querySrv.js +0 -0
  132. data/lib/kibana/assets/app/services/timer.js +0 -0
  133. data/lib/kibana/assets/css/animate.min.css +0 -0
  134. data/lib/kibana/assets/css/bootstrap-responsive.min.css +0 -0
  135. data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
  136. data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
  137. data/lib/kibana/assets/css/font-awesome.min.css +0 -0
  138. data/lib/kibana/assets/css/normalize.min.css +0 -0
  139. data/lib/kibana/assets/css/timepicker.css +0 -0
  140. data/lib/kibana/assets/font/FontAwesome.otf +0 -0
  141. data/lib/kibana/assets/font/fontawesome-webfont.eot +0 -0
  142. data/lib/kibana/assets/font/fontawesome-webfont.svg +0 -0
  143. data/lib/kibana/assets/font/fontawesome-webfont.ttf +0 -0
  144. data/lib/kibana/assets/font/fontawesome-webfont.woff +0 -0
  145. data/lib/kibana/assets/img/glyphicons-halflings-white.png +0 -0
  146. data/lib/kibana/assets/img/glyphicons-halflings.png +0 -0
  147. data/lib/kibana/assets/img/kibana.png +0 -0
  148. data/lib/kibana/assets/img/load.gif +0 -0
  149. data/lib/kibana/assets/img/load_big.gif +0 -0
  150. data/lib/kibana/assets/index.html +5 -7
  151. data/lib/kibana/assets/vendor/angular/angular-dragdrop.js +0 -0
  152. data/lib/kibana/assets/vendor/angular/angular-sanitize.js +28 -26
  153. data/lib/kibana/assets/vendor/angular/angular-strap.js +0 -0
  154. data/lib/kibana/assets/vendor/angular/angular.js +3128 -1410
  155. data/lib/kibana/assets/vendor/angular/datepicker.js +0 -0
  156. data/lib/kibana/assets/vendor/angular/timepicker.js +0 -0
  157. data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +34 -0
  158. data/lib/kibana/assets/vendor/bootstrap/less/accordion.less +0 -0
  159. data/lib/kibana/assets/vendor/bootstrap/less/alerts.less +0 -0
  160. data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.dark.less +0 -0
  161. data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.less +0 -0
  162. data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.light.less +0 -0
  163. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +0 -0
  164. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.light.less +0 -0
  165. data/lib/kibana/assets/vendor/bootstrap/less/breadcrumbs.less +0 -0
  166. data/lib/kibana/assets/vendor/bootstrap/less/button-groups.less +0 -0
  167. data/lib/kibana/assets/vendor/bootstrap/less/buttons.less +0 -0
  168. data/lib/kibana/assets/vendor/bootstrap/less/carousel.less +0 -0
  169. data/lib/kibana/assets/vendor/bootstrap/less/close.less +0 -0
  170. data/lib/kibana/assets/vendor/bootstrap/less/code.less +0 -0
  171. data/lib/kibana/assets/vendor/bootstrap/less/component-animations.less +0 -0
  172. data/lib/kibana/assets/vendor/bootstrap/less/dropdowns.less +0 -0
  173. data/lib/kibana/assets/vendor/bootstrap/less/forms.less +0 -0
  174. data/lib/kibana/assets/vendor/bootstrap/less/grid.less +0 -0
  175. data/lib/kibana/assets/vendor/bootstrap/less/hero-unit.less +0 -0
  176. data/lib/kibana/assets/vendor/bootstrap/less/labels-badges.less +0 -0
  177. data/lib/kibana/assets/vendor/bootstrap/less/layouts.less +0 -0
  178. data/lib/kibana/assets/vendor/bootstrap/less/media.less +0 -0
  179. data/lib/kibana/assets/vendor/bootstrap/less/mixins.less +0 -0
  180. data/lib/kibana/assets/vendor/bootstrap/less/modals.less +0 -0
  181. data/lib/kibana/assets/vendor/bootstrap/less/navbar.less +0 -0
  182. data/lib/kibana/assets/vendor/bootstrap/less/navs.less +0 -0
  183. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +221 -5
  184. data/lib/kibana/assets/vendor/bootstrap/less/pager.less +0 -0
  185. data/lib/kibana/assets/vendor/bootstrap/less/pagination.less +0 -0
  186. data/lib/kibana/assets/vendor/bootstrap/less/popovers.less +0 -0
  187. data/lib/kibana/assets/vendor/bootstrap/less/progress-bars.less +0 -0
  188. data/lib/kibana/assets/vendor/bootstrap/less/reset.less +0 -0
  189. data/lib/kibana/assets/vendor/bootstrap/less/responsive-1200px-min.less +0 -0
  190. data/lib/kibana/assets/vendor/bootstrap/less/responsive-767px-max.less +0 -0
  191. data/lib/kibana/assets/vendor/bootstrap/less/responsive-768px-979px.less +0 -0
  192. data/lib/kibana/assets/vendor/bootstrap/less/responsive-navbar.less +0 -0
  193. data/lib/kibana/assets/vendor/bootstrap/less/responsive-utilities.less +0 -0
  194. data/lib/kibana/assets/vendor/bootstrap/less/responsive.less +0 -0
  195. data/lib/kibana/assets/vendor/bootstrap/less/scaffolding.less +0 -0
  196. data/lib/kibana/assets/vendor/bootstrap/less/sprites.less +0 -0
  197. data/lib/kibana/assets/vendor/bootstrap/less/tables.less +0 -0
  198. data/lib/kibana/assets/vendor/bootstrap/less/tests/buttons.html +0 -0
  199. data/lib/kibana/assets/vendor/bootstrap/less/tests/css-tests.css +0 -0
  200. data/lib/kibana/assets/vendor/bootstrap/less/tests/css-tests.html +0 -0
  201. data/lib/kibana/assets/vendor/bootstrap/less/tests/forms-responsive.html +0 -0
  202. data/lib/kibana/assets/vendor/bootstrap/less/tests/forms.html +0 -0
  203. data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar-fixed-top.html +0 -0
  204. data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar-static-top.html +0 -0
  205. data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar.html +0 -0
  206. data/lib/kibana/assets/vendor/bootstrap/less/thumbnails.less +0 -0
  207. data/lib/kibana/assets/vendor/bootstrap/less/tooltip.less +0 -0
  208. data/lib/kibana/assets/vendor/bootstrap/less/type.less +0 -0
  209. data/lib/kibana/assets/vendor/bootstrap/less/utilities.less +0 -0
  210. data/lib/kibana/assets/vendor/bootstrap/less/variables.dark.less +0 -0
  211. data/lib/kibana/assets/vendor/bootstrap/less/variables.less +0 -0
  212. data/lib/kibana/assets/vendor/bootstrap/less/variables.light.less +0 -0
  213. data/lib/kibana/assets/vendor/bootstrap/less/wells.less +0 -0
  214. data/lib/kibana/assets/vendor/elasticjs/elastic-angular-client.js +0 -0
  215. data/lib/kibana/assets/vendor/elasticjs/elastic.js +0 -0
  216. data/lib/kibana/assets/vendor/filesaver.js +0 -0
  217. data/lib/kibana/assets/vendor/jquery/jquery-1.8.0.js +0 -0
  218. data/lib/kibana/assets/vendor/jquery/jquery-ui-1.10.3.js +0 -0
  219. data/lib/kibana/assets/vendor/jquery/jquery.flot.js +0 -0
  220. data/lib/kibana/assets/vendor/jquery/jquery.flot.pie.js +0 -0
  221. data/lib/kibana/assets/vendor/jquery/jquery.flot.selection.js +0 -0
  222. data/lib/kibana/assets/vendor/jquery/jquery.flot.stack.js +0 -0
  223. data/lib/kibana/assets/vendor/jquery/jquery.flot.stackpercent.js +0 -0
  224. data/lib/kibana/assets/vendor/jquery/jquery.flot.time.js +0 -0
  225. data/lib/kibana/assets/vendor/modernizr-2.6.1.js +0 -0
  226. data/lib/kibana/assets/vendor/moment.js +0 -0
  227. data/lib/kibana/assets/vendor/require/css-build.js +0 -0
  228. data/lib/kibana/assets/vendor/require/css.js +0 -0
  229. data/lib/kibana/assets/vendor/require/require.js +0 -0
  230. data/lib/kibana/assets/vendor/require/text.js +0 -0
  231. data/lib/kibana/assets/vendor/require/tmpl.js +0 -0
  232. data/lib/kibana/assets/vendor/timezone.js +0 -0
  233. data/lib/kibana/assets/vendor/underscore.js +0 -0
  234. data/lib/kibana/sinatra/version.rb +1 -1
  235. data/lib/tasks/update.rb +51 -0
  236. metadata +34 -3
  237. data/lib/kibana/assets/css/main.css +0 -193
@@ -1,6 +1,6 @@
1
1
  /*
2
2
 
3
- ## Timepicker
3
+ ## Timepicker2
4
4
 
5
5
  ### Parameters
6
6
  * mode :: The default mode of the panel. Options: 'relative', 'absolute' 'since' Default: 'relative'
@@ -25,7 +25,7 @@ function (angular, app, _, moment, kbn) {
25
25
  var module = angular.module('kibana.panels.timepicker', []);
26
26
  app.useModule(module);
27
27
 
28
- module.controller('timepicker', function($scope, $rootScope, $timeout, timer, $http, dashboard, filterSrv) {
28
+ module.controller('timepicker', function($scope, $modal, $q, filterSrv) {
29
29
  $scope.panelMeta = {
30
30
  status : "Stable",
31
31
  description : "A panel for controlling the time range filters. If you have time based data, "+
@@ -36,233 +36,180 @@ function (angular, app, _, moment, kbn) {
36
36
  // Set and populate defaults
37
37
  var _d = {
38
38
  status : "Stable",
39
- mode : "relative",
40
39
  time_options : ['5m','15m','1h','6h','12h','24h','2d','7d','30d'],
41
- timespan : '15m',
42
- timefield : '@timestamp',
43
- timeformat : "",
44
- refresh : {
45
- enable : false,
46
- interval: 30,
47
- min : 3
48
- }
40
+ refresh_intervals : ['5s','10s','30s','1m','5m','15m','30m','1h','2h','1d'],
41
+
42
+ timefield : '@timestamp'
49
43
  };
50
44
  _.defaults($scope.panel,_d);
51
45
 
46
+ var customTimeModal = $modal({
47
+ template: './app/panels/timepicker/custom.html',
48
+ persist: true,
49
+ show: false,
50
+ scope: $scope,
51
+ keyboard: false
52
+ });
53
+
54
+ $scope.filterSrv = filterSrv;
55
+
56
+ // ng-pattern regexs
57
+ $scope.patterns = {
58
+ date: /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/,
59
+ hour: /^([01]?[0-9]|2[0-3])$/,
60
+ minute: /^[0-5][0-9]$/,
61
+ second: /^[0-5][0-9]$/,
62
+ millisecond: /^[0-9]*$/
63
+ };
64
+
65
+ $scope.$on('refresh', function(){$scope.init();});
66
+
52
67
  $scope.init = function() {
53
- // Private refresh interval that we can use for view display without causing
54
- // unnecessary refreshes during changes
55
- $scope.refresh_interval = $scope.panel.refresh.interval;
56
- $scope.filterSrv = filterSrv;
57
-
58
- // Init a private time object with Date() objects depending on mode
59
- switch($scope.panel.mode) {
60
- case 'absolute':
61
- $scope.time = {
62
- from : moment($scope.panel.time.from,'MM/DD/YYYY HH:mm:ss') || moment(kbn.time_ago($scope.panel.timespan)),
63
- to : moment($scope.panel.time.to,'MM/DD/YYYY HH:mm:ss') || moment()
64
- };
65
- break;
66
- case 'since':
67
- $scope.time = {
68
- from : moment($scope.panel.time.from,'MM/DD/YYYY HH:mm:ss') || moment(kbn.time_ago($scope.panel.timespan)),
69
- to : moment()
70
- };
71
- break;
72
- case 'relative':
73
- $scope.time = {
74
- from : moment(kbn.time_ago($scope.panel.timespan)),
75
- to : moment()
76
- };
77
- break;
78
- }
79
- $scope.time.field = $scope.panel.timefield;
80
- // These 3 statements basicly do everything time_apply() does
81
- set_timepicker($scope.time.from,$scope.time.to);
82
- update_panel();
83
-
84
- // If we're in a mode where something must be calculated, clear existing filters
85
- // and set new ones
86
- if($scope.panel.mode !== 'absolute') {
87
- set_time_filter($scope.time);
68
+ var time = filterSrv.timeRange('last');
69
+ if(time) {
70
+ $scope.panel.now = filterSrv.timeRange(false).to === "now" ? true : false;
71
+ $scope.time = getScopeTimeObj(time.from,time.to);
88
72
  }
73
+ };
89
74
 
90
- dashboard.refresh();
91
-
75
+ $scope.customTime = function() {
76
+ // Assume the form is valid since we're setting it to something valid
77
+ $scope.input.$setValidity("dummy", true);
78
+ $scope.temptime = cloneTime($scope.time);
92
79
 
93
- // Start refresh timer if enabled
94
- if ($scope.panel.refresh.enable) {
95
- $scope.set_interval($scope.panel.refresh.interval);
96
- }
80
+ // Date picker needs the date to be at the start of the day
81
+ $scope.temptime.from.date.setHours(0,0,0,0);
82
+ $scope.temptime.to.date.setHours(0,0,0,0);
97
83
 
98
- // In case some other panel broadcasts a time, set us to an absolute range
99
- $scope.$on('refresh', function() {
100
- if(filterSrv.idsByType('time').length > 0) {
101
- var time = filterSrv.timeRange('min');
102
-
103
- if($scope.time.from.diff(moment.utc(time.from),'seconds') !== 0 ||
104
- $scope.time.to.diff(moment.utc(time.to),'seconds') !== 0)
105
- {
106
- $scope.set_mode('absolute');
107
-
108
- // These 3 statements basicly do everything time_apply() does
109
- set_timepicker(moment(time.from),moment(time.to));
110
- $scope.time = $scope.time_calc();
111
- update_panel();
112
- }
113
- }
84
+ $q.when(customTimeModal).then(function(modalEl) {
85
+ modalEl.modal('show');
114
86
  });
115
87
  };
116
88
 
117
- $scope.set_interval = function (refresh_interval) {
118
- $scope.panel.refresh.interval = refresh_interval;
119
- if(_.isNumber($scope.panel.refresh.interval)) {
120
- if($scope.panel.refresh.interval < $scope.panel.refresh.min) {
121
- $scope.panel.refresh.interval = $scope.panel.refresh.min;
122
- timer.cancel($scope.refresh_timer);
123
- return;
89
+ // Constantly validate the input of the fields. This function does not change any date variables
90
+ // outside of its own scope
91
+ $scope.validate = function(time) {
92
+ // Assume the form is valid. There is a hidden dummy input for invalidating it programatically.
93
+ $scope.input.$setValidity("dummy", true);
94
+
95
+ var _from = datepickerToLocal(time.from.date),
96
+ _to = datepickerToLocal(time.to.date),
97
+ _t = time;
98
+
99
+ if($scope.input.$valid) {
100
+
101
+ _from.setHours(_t.from.hour,_t.from.minute,_t.from.second,_t.from.millisecond);
102
+ _to.setHours(_t.to.hour,_t.to.minute,_t.to.second,_t.to.millisecond);
103
+
104
+ // Check that the objects are valid and to is after from
105
+ if(isNaN(_from.getTime()) || isNaN(_to.getTime()) || _from.getTime() >= _to.getTime()) {
106
+ $scope.input.$setValidity("dummy", false);
107
+ return false;
124
108
  }
125
- timer.cancel($scope.refresh_timer);
126
- $scope.refresh();
127
109
  } else {
128
- timer.cancel($scope.refresh_timer);
110
+ return false;
129
111
  }
112
+
113
+ return {from:_from,to:_to};
130
114
  };
131
115
 
132
- $scope.refresh = function() {
133
- if ($scope.panel.refresh.enable) {
134
- timer.cancel($scope.refresh_timer);
135
- $scope.refresh_timer = timer.register($timeout(function() {
136
- $scope.refresh();
137
- $scope.time_apply();
138
- },$scope.panel.refresh.interval*1000));
139
- } else {
140
- timer.cancel($scope.refresh_timer);
141
- }
116
+ $scope.setNow = function() {
117
+ $scope.time.to = getTimeObj(new Date());
142
118
  };
143
119
 
144
- var update_panel = function() {
145
- // Update panel's string representation of the time object.Don't update if
146
- // we're in relative mode since we dont want to store the time object in the
147
- // json for relative periods
148
- if($scope.panel.mode !== 'relative') {
149
- $scope.panel.time = {
150
- from : $scope.time.from.format("MM/DD/YYYY HH:mm:ss"),
151
- to : $scope.time.to.format("MM/DD/YYYY HH:mm:ss"),
152
- };
153
- } else {
154
- delete $scope.panel.time;
120
+ /*
121
+ time : {
122
+ from: Date
123
+ to: Date
155
124
  }
156
- };
125
+ */
126
+ $scope.setAbsoluteTimeFilter = function (time) {
157
127
 
158
- $scope.set_mode = function(mode) {
159
- $scope.panel.mode = mode;
160
- $scope.panel.refresh.enable = mode === 'absolute' ?
161
- false : $scope.panel.refresh.enable;
128
+ // Create filter object
129
+ var _filter = _.clone(time);
162
130
 
163
- update_panel();
164
- };
131
+ _filter.type = 'time';
132
+ _filter.field = $scope.panel.timefield;
165
133
 
166
- $scope.to_now = function() {
167
- $scope.timepicker.to = {
168
- time : moment().format("HH:mm:ss"),
169
- date : moment().format("MM/DD/YYYY")
170
- };
171
- };
134
+ if($scope.panel.now) {
135
+ _filter.to = "now";
136
+ }
172
137
 
173
- $scope.set_timespan = function(timespan) {
174
- $scope.panel.timespan = timespan;
175
- $scope.timepicker.from = {
176
- time : moment(kbn.time_ago(timespan)).format("HH:mm:ss"),
177
- date : moment(kbn.time_ago(timespan)).format("MM/DD/YYYY")
178
- };
179
- $scope.time_apply();
180
- };
138
+ // Clear all time filters, set a new one
139
+ filterSrv.removeByType('time',true);
181
140
 
182
- $scope.close_edit = function() {
183
- $scope.time_apply();
184
- };
141
+ // Set the filter
142
+ $scope.panel.filter_id = filterSrv.set(_filter);
185
143
 
186
- //
187
- $scope.time_calc = function(){
188
- var from,to;
189
- // If time picker is defined (usually is) TOFIX: Horrible parsing
190
- if(!(_.isUndefined($scope.timepicker))) {
191
- from = $scope.panel.mode === 'relative' ? moment(kbn.time_ago($scope.panel.timespan)) :
192
- moment(moment($scope.timepicker.from.date).format('MM/DD/YYYY') + " " + $scope.timepicker.from.time,'MM/DD/YYYY HH:mm:ss');
193
- to = $scope.panel.mode !== 'absolute' ? moment() :
194
- moment(moment($scope.timepicker.to.date).format('MM/DD/YYYY') + " " + $scope.timepicker.to.time,'MM/DD/YYYY HH:mm:ss');
195
- // Otherwise (probably initialization)
196
- } else {
197
- from = $scope.panel.mode === 'relative' ? moment(kbn.time_ago($scope.panel.timespan)) :
198
- $scope.time.from;
199
- to = $scope.panel.mode !== 'absolute' ? moment() :
200
- $scope.time.to;
201
- }
144
+ // Update our representation
145
+ $scope.time = getScopeTimeObj(time.from,time.to);
202
146
 
203
- if (from.valueOf() >= to.valueOf()) {
204
- from = moment(to.valueOf() - 1000);
205
- }
147
+ return $scope.panel.filter_id;
148
+ };
206
149
 
207
- $timeout(function(){
208
- set_timepicker(from,to);
209
- });
150
+ $scope.setRelativeFilter = function(timespan) {
210
151
 
211
- return {
212
- from : from,
213
- to : to
152
+ $scope.panel.now = true;
153
+ // Create filter object
154
+ var _filter = {
155
+ type : 'time',
156
+ field : $scope.panel.timefield,
157
+ from : "now-"+timespan,
158
+ to: "now"
214
159
  };
215
- };
216
160
 
217
- $scope.time_apply = function() {
218
- $scope.panel.error = "";
219
- // Update internal time object
161
+ // Clear all time filters, set a new one
162
+ filterSrv.removeByType('time',true);
220
163
 
221
- // Remove all other time filters
222
- filterSrv.removeByType('time');
164
+ // Set the filter
165
+ $scope.panel.filter_id = filterSrv.set(_filter);
223
166
 
167
+ // Update our representation
168
+ $scope.time = getScopeTimeObj(kbn.parseDate(_filter.from),new Date());
224
169
 
225
- $scope.time = $scope.time_calc();
226
- $scope.time.field = $scope.panel.timefield;
170
+ return $scope.panel.filter_id;
171
+ };
227
172
 
228
- update_panel();
229
- set_time_filter($scope.time);
173
+ var pad = function(n, width, z) {
174
+ z = z || '0';
175
+ n = n + '';
176
+ return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
177
+ };
230
178
 
231
- dashboard.refresh();
179
+ var cloneTime = function(time) {
180
+ var _n = {
181
+ from: _.clone(time.from),
182
+ to: _.clone(time.to)
183
+ };
184
+ // Create new dates as _.clone is shallow.
185
+ _n.from.date = new Date(_n.from.date);
186
+ _n.to.date = new Date(_n.to.date);
187
+ return _n;
188
+ };
232
189
 
190
+ var getScopeTimeObj = function(from,to) {
191
+ return {
192
+ from: getTimeObj(from),
193
+ to: getTimeObj(to)
194
+ };
233
195
  };
234
- $scope.$watch('panel.mode', $scope.time_apply);
235
196
 
236
- function set_time_filter(time) {
237
- time.type = 'time';
238
- // Clear all time filters, set a new one
239
- filterSrv.removeByType('time');
240
- $scope.panel.filter_id = filterSrv.set(compile_time(time));
241
- return $scope.panel.filter_id;
242
- }
243
-
244
- // Prefer to pass around Date() objects since interacting with
245
- // moment objects in libraries that are expecting Date()s can be tricky
246
- function compile_time(time) {
247
- time = _.clone(time);
248
- time.from = time.from.toDate();
249
- time.to = time.to.toDate();
250
- return time;
251
- }
252
-
253
- function set_timepicker(from,to) {
254
- // Janky 0s timeout to get around $scope queue processing view issue
255
- $scope.timepicker = {
256
- from : {
257
- time : from.format("HH:mm:ss"),
258
- date : from.format("MM/DD/YYYY")
259
- },
260
- to : {
261
- time : to.format("HH:mm:ss"),
262
- date : to.format("MM/DD/YYYY")
263
- }
197
+ var getTimeObj = function(date) {
198
+ return {
199
+ date: new Date(date),
200
+ hour: pad(date.getHours(),2),
201
+ minute: pad(date.getMinutes(),2),
202
+ second: pad(date.getSeconds(),2),
203
+ millisecond: pad(date.getMilliseconds(),3)
264
204
  };
265
- }
205
+ };
206
+
207
+ // Do not use the results of this function unless you plan to use setHour/Minutes/etc on the result
208
+ var datepickerToLocal = function(date) {
209
+ date = moment(date).clone().toDate();
210
+ return moment(new Date(date.getTime() + date.getTimezoneOffset() * 60000)).toDate();
211
+ };
212
+
266
213
 
267
214
  });
268
- });
215
+ });
File without changes
File without changes
@@ -87,7 +87,8 @@ function (angular, app, _, kbn) {
87
87
  timeField = timeField[0];
88
88
  }
89
89
 
90
- $scope.time = filterSrv.timeRange('min');
90
+ // This logic can be simplifie greatly with the new kbn.parseDate
91
+ $scope.time = filterSrv.timeRange('last');
91
92
  $scope.old_time = {
92
93
  from : new Date($scope.time.from.getTime() - kbn.interval_to_ms($scope.panel.ago)),
93
94
  to : new Date($scope.time.to.getTime() - kbn.interval_to_ms($scope.panel.ago))
@@ -1,37 +1,23 @@
1
+ <style>
2
+ .noarrow>a:after {
3
+ display: none !important;
4
+ }
5
+ </style>
1
6
 
2
- <li><a bs-tooltip="'Goto saved default'" data-placement="bottom" href='#/dashboard'><i class='icon-home'></i></a></li>
7
+ <li ng-repeat="pulldown in dashboard.current.nav" ng-controller="PulldownCtrl" ng-show="pulldown.enable"><kibana-simple-panel type="pulldown.type" panel="pulldown" ng-cloak></kibana-simple-panel></li>
3
8
 
9
+ <li><a bs-tooltip="'Goto saved default'" data-placement="bottom" href='#/dashboard'><i class='icon-home'></i></a></li>
4
10
  <li class="dropdown" bs-tooltip="'Load'" data-placement="bottom" ng-show="showDropdown('load')" >
5
11
  <a href="#" class="dropdown-toggle" data-toggle="dropdown" ng-click="elasticsearch_dblist('title:'+elasticsearch.query+'*')">
6
12
  <i class='icon-folder-open'></i>
7
13
  </a>
14
+
15
+
8
16
  <ul class="dropdown-menu" style="padding:10px">
9
- <li ng-show='loader.load_local'>
10
- <h5>Local File <tip>Load dashboard JSON layout from file</tip></h5>
11
- <form>
12
- <input type="file" id="dashupload" dash-upload /><br>
13
- </form>
14
- </li>
15
- <li ng-show='loader.load_gist'>
16
- <h5>Gist <tip>Enter a gist number or url</tip></h5>
17
- <form>
18
- <input type="text" ng-model="gist.url"/ placeholder="Gist number or URL"><br>
19
- <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>
20
- <h6 ng-show="gist.files.length">Dashboards in gist:{{gist.url | gistid}} <small>click to load</small></h6>
21
- <h6 ng-hide="gist.files.length">No gist dashboards found</h6>
22
- <table class="table table-condensed table-striped">
23
- <tr ng-repeat="file in gist.files">
24
- <td><a ng-click="dashboard.dash_load(file)">{{file.title}}</a></td>
25
- </tr>
26
- </table>
27
- </form>
28
- </li>
29
- <li ng-show='loader.load_elasticsearch'>
30
- <h5>Elasticsearch</h5>
31
- <form>
17
+ <li ng-show='dashboard.current.loader.load_elasticsearch'>
18
+ <form class="nomargin">
32
19
  <input type="text" ng-model="elasticsearch.query" ng-change="elasticsearch_dblist('title:'+elasticsearch.query+'*')" placeholder="Type to filter"/>
33
20
  </form>
34
- <h6 ng-show="elasticsearch.dashboards.length">Elasticsearch stored dashboards</h6>
35
21
  <h6 ng-hide="elasticsearch.dashboards.length">No dashboards matching your query found</h6>
36
22
  <table class="table table-condensed table-striped">
37
23
  <tr ng-repeat="row in elasticsearch.dashboards | orderBy:['_id']">
@@ -41,38 +27,81 @@
41
27
  </tr>
42
28
  </table>
43
29
  </li>
30
+
31
+ <li class="dropdown-submenu noarrow">
32
+ <a tabindex="-1" href="#" class="small" style="padding:0"><i class="icon-caret-left"></i> Advanced</a>
33
+ <ul class="dropdown-menu" style="padding:10px">
34
+ <li ng-show='dashboard.current.loader.load_local'>
35
+ <h5>Local File <tip>Load dashboard JSON layout from file</tip></h5>
36
+ <form>
37
+ <input type="file" id="dashupload" dash-upload /><br>
38
+ </form>
39
+ </li>
40
+ <li ng-show='dashboard.current.loader.load_gist'>
41
+ <h5>Gist <tip>Enter a gist number or url</tip></h5>
42
+ <form>
43
+ <input type="text" ng-model="gist.url"/ placeholder="Gist number or URL"><br>
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
+ <h6 ng-show="gist.files.length">Dashboards in gist:{{gist.url | gistid}} <small>click to load</small></h6>
46
+ <h6 ng-hide="gist.files.length || !gist.url.length">No gist dashboards found</h6>
47
+ <table class="table table-condensed table-striped">
48
+ <tr ng-repeat="file in gist.files">
49
+ <td><a ng-click="dashboard.dash_load(file)">{{file.title}}</a></td>
50
+ </tr>
51
+ </table>
52
+ </form>
53
+ </li>
54
+ </ul>
55
+ </li>
56
+
44
57
  </ul>
58
+
59
+
45
60
  </li>
46
61
  <li class="dropdown" bs-tooltip="'Save'" data-placement="bottom" ng-show="showDropdown('save')">
47
62
  <a href="#" class="dropdown-toggle" data-toggle="dropdown">
48
63
  <i class='icon-save'></i>
49
64
  </a>
65
+
66
+
50
67
  <ul class="dropdown-menu" style="padding:10px">
51
- <li ng-show="loader.save_default || loader.save_local">
52
- <h5>Locally</h5>
53
- <ul class="unstyled">
54
- <li><a class="link" ng-show="loader.save_local" ng-click="dashboard.to_file()"><i class="icon-download"></i> Export to File</a> <tip>Export layout, not data, to file</tip></li>
55
- <li><a class="link" ng-show="loader.save_default" ng-click="set_default()"><i class="icon-bookmark"></i> Set as Browser Default</a> <tip>Store dashboard preference to browser's localStorage</tip></li>
56
- <li><a class="link" ng-show="loader.save_default" ng-click="purge_default()"><i class="icon-ban-circle"></i> Clear Browser Default</a></li>
57
- </ul>
58
- </li>
59
- <li ng-show="loader.save_gist">
60
- <h5>Gist</h5>
61
- <form class="input-append">
62
- <input class='input-medium' placeholder='Title' type="text" ng-model="gist.title"/>
63
- <button class="btn" ng-click="save_gist()"><i class="icon-github-alt"></i></button>
64
- </form><br>
65
- <small ng-show="gist.last">Last gist: <a target="_blank" href="{{gist.last}}">{{gist.last}}</a></small>
66
- </li>
67
- <li ng-show="loader.save_elasticsearch">
68
- <h5>Elasticsearch</h5>
69
- <form class="input-append">
70
- <input class='input-medium' placeholder="{{dashboard.current.title}}" type="text" ng-model="elasticsearch.title"/>
68
+
69
+ <li ng-show="dashboard.current.loader.save_elasticsearch">
70
+ <form class="input-append nomargin">
71
+ <input class='input-medium' ng-model="dashboard.current.title" type="text" ng-model="elasticsearch.title"/>
71
72
  <button class="btn" ng-click="elasticsearch_save('dashboard')"><i class="icon-save"></i></button>
72
73
  </form>
73
74
  </li>
75
+
76
+ <li class="dropdown-submenu noarrow">
77
+ <a tabindex="-1" href="#" class="small" style="padding:0"><i class="icon-caret-left"></i> Advanced</a>
78
+ <ul class="dropdown-menu">
79
+
80
+ <li ng-show="dashboard.current.loader.save_default">
81
+ <a class="link" ng-click="set_default()">Set as my home</a>
82
+ </li>
83
+ <li ng-show="dashboard.current.loader.save_default">
84
+ <a class="link" ng-click="purge_default()">Clear my home</a>
85
+ </li>
86
+ <li ng-show="dashboard.current.loader.save_local">
87
+ <a class="link" ng-click="dashboard.to_file()">Export schema</a>
88
+ </li>
89
+
90
+ <li ng-show="dashboard.current.loader.save_gist" style="margin:10px">
91
+ <h6>Gist</h6>
92
+ <form class="input-append">
93
+ <input class='input-medium' placeholder='Title' type="text" ng-model="gist.title"/>
94
+ <button class="btn" ng-click="save_gist()"><i class="icon-github-alt"></i></button>
95
+ </form><br>
96
+ <small ng-show="gist.last">Last gist: <a target="_blank" href="{{gist.last}}">{{gist.last}}</a></small>
97
+ </li>
98
+ </ul>
99
+ </li>
74
100
  </ul>
101
+
102
+
75
103
  </li>
76
- <li ng-show="showDropdown('share')"><a bs-tooltip="'Share'" data-placement="bottom" ng-click="elasticsearch_save('temp',loader.save_temp_ttl)" bs-modal="'app/partials/dashLoaderShare.html'"><i class='icon-share'></i></a></li>
104
+ <li ng-show="showDropdown('share')"><a bs-tooltip="'Share'" data-placement="bottom" ng-click="elasticsearch_save('temp',dashboard.current.loader.save_temp_ttl)" bs-modal="'app/partials/dashLoaderShare.html'"><i class='icon-share'></i></a></li>
105
+
106
+ <li ng-show="dashboard.current.editable" bs-tooltip="'Configure dashboard'" data-placement="bottom"><a href='#' bs-modal="'app/partials/dasheditor.html'"><i class='icon-cog pointer'></i></a></li>
77
107
 
78
- <li ng-show="dashboard.current.editable "bs-tooltip="'Configure dashboard'" data-placement="bottom"><a href='#' bs-modal="'app/partials/dasheditor.html'"><i class='icon-cog pointer'></i></a></li>