module.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*jshint globalstrict:true */
  2. /*global angular:true */
  3. /*
  4. ## Timepicker
  5. ### Parameters
  6. * mode :: The default mode of the panel. Options: 'relative', 'absolute' 'since' Default: 'relative'
  7. * time_options :: An array of possible time options. Default: ['5m','15m','1h','6h','12h','24h','2d','7d','30d']
  8. * timespan :: The default options selected for the relative view. Default: '15m'
  9. * timefield :: The field in which time is stored in the document.
  10. * refresh: Object containing refresh parameters
  11. * enable :: true/false, enable auto refresh by default. Default: false
  12. * interval :: Seconds between auto refresh. Default: 30
  13. * min :: The lowest interval a user may set
  14. */
  15. 'use strict';
  16. angular.module('kibana.timepicker', [])
  17. .controller('timepicker', function($scope, $rootScope, $timeout, timer, $http, dashboard, filterSrv) {
  18. $scope.panelMeta = {
  19. status : "Stable",
  20. description : "A panel for controlling the time range filters. If you have time based data, "+
  21. " or if you're using time stamped indices, you need one of these"
  22. };
  23. // Set and populate defaults
  24. var _d = {
  25. status : "Stable",
  26. mode : "relative",
  27. time_options : ['5m','15m','1h','6h','12h','24h','2d','7d','30d'],
  28. timespan : '15m',
  29. timefield : '@timestamp',
  30. timeformat : "",
  31. refresh : {
  32. enable : false,
  33. interval: 30,
  34. min : 3
  35. }
  36. };
  37. _.defaults($scope.panel,_d);
  38. var _groups = _.isArray($scope.panel.group) ?
  39. $scope.panel.group : [$scope.panel.group];
  40. $scope.init = function() {
  41. // Private refresh interval that we can use for view display without causing
  42. // unnecessary refreshes during changes
  43. $scope.refresh_interval = $scope.panel.refresh.interval;
  44. $scope.filterSrv = filterSrv;
  45. // Init a private time object with Date() objects depending on mode
  46. switch($scope.panel.mode) {
  47. case 'absolute':
  48. $scope.time = {
  49. from : moment($scope.panel.time.from,'MM/DD/YYYY HH:mm:ss') || moment(kbn.time_ago($scope.panel.timespan)),
  50. to : moment($scope.panel.time.to,'MM/DD/YYYY HH:mm:ss') || moment()
  51. };
  52. break;
  53. case 'since':
  54. $scope.time = {
  55. from : moment($scope.panel.time.from,'MM/DD/YYYY HH:mm:ss') || moment(kbn.time_ago($scope.panel.timespan)),
  56. to : moment()
  57. };
  58. break;
  59. case 'relative':
  60. $scope.time = {
  61. from : moment(kbn.time_ago($scope.panel.timespan)),
  62. to : moment()
  63. };
  64. break;
  65. }
  66. $scope.time.field = $scope.panel.timefield;
  67. // These 3 statements basicly do everything time_apply() does
  68. set_timepicker($scope.time.from,$scope.time.to);
  69. update_panel();
  70. // If we're in a mode where something must be calculated, clear existing filters
  71. // and set new ones
  72. if($scope.panel.mode !== 'absolute') {
  73. set_time_filter($scope.time);
  74. }
  75. dashboard.refresh();
  76. // Start refresh timer if enabled
  77. if ($scope.panel.refresh.enable) {
  78. $scope.set_interval($scope.panel.refresh.interval);
  79. }
  80. // In case some other panel broadcasts a time, set us to an absolute range
  81. $scope.$on('refresh', function() {
  82. if(filterSrv.idsByType('time').length > 0) {
  83. var time = filterSrv.timeRange('min');
  84. if($scope.time.from.diff(moment.utc(time.from),'seconds') !== 0 ||
  85. $scope.time.to.diff(moment.utc(time.to),'seconds') !== 0)
  86. {
  87. $scope.set_mode('absolute');
  88. // These 3 statements basicly do everything time_apply() does
  89. set_timepicker(moment(time.from),moment(time.to));
  90. $scope.time = $scope.time_calc();
  91. update_panel();
  92. }
  93. }
  94. });
  95. };
  96. $scope.set_interval = function (refresh_interval) {
  97. $scope.panel.refresh.interval = refresh_interval;
  98. if(_.isNumber($scope.panel.refresh.interval)) {
  99. if($scope.panel.refresh.interval < $scope.panel.refresh.min) {
  100. $scope.panel.refresh.interval = $scope.panel.refresh.min;
  101. timer.cancel($scope.refresh_timer);
  102. return;
  103. }
  104. timer.cancel($scope.refresh_timer);
  105. $scope.refresh();
  106. } else {
  107. timer.cancel($scope.refresh_timer);
  108. }
  109. };
  110. $scope.refresh = function() {
  111. if ($scope.panel.refresh.enable) {
  112. timer.cancel($scope.refresh_timer);
  113. $scope.refresh_timer = timer.register($timeout(function() {
  114. $scope.refresh();
  115. $scope.time_apply();
  116. },$scope.panel.refresh.interval*1000));
  117. } else {
  118. timer.cancel($scope.refresh_timer);
  119. }
  120. };
  121. var update_panel = function() {
  122. // Update panel's string representation of the time object.Don't update if
  123. // we're in relative mode since we dont want to store the time object in the
  124. // json for relative periods
  125. if($scope.panel.mode !== 'relative') {
  126. $scope.panel.time = {
  127. from : $scope.time.from.format("MM/DD/YYYY HH:mm:ss"),
  128. to : $scope.time.to.format("MM/DD/YYYY HH:mm:ss"),
  129. };
  130. } else {
  131. delete $scope.panel.time;
  132. }
  133. };
  134. $scope.set_mode = function(mode) {
  135. $scope.panel.mode = mode;
  136. $scope.panel.refresh.enable = mode === 'absolute' ?
  137. false : $scope.panel.refresh.enable;
  138. update_panel();
  139. };
  140. $scope.to_now = function() {
  141. $scope.timepicker.to = {
  142. time : moment().format("HH:mm:ss"),
  143. date : moment().format("MM/DD/YYYY")
  144. };
  145. };
  146. $scope.set_timespan = function(timespan) {
  147. $scope.panel.timespan = timespan;
  148. $scope.timepicker.from = {
  149. time : moment(kbn.time_ago(timespan)).format("HH:mm:ss"),
  150. date : moment(kbn.time_ago(timespan)).format("MM/DD/YYYY")
  151. };
  152. $scope.time_apply();
  153. };
  154. $scope.close_edit = function() {
  155. $scope.time_apply();
  156. };
  157. //
  158. $scope.time_calc = function(){
  159. var from,to;
  160. // If time picker is defined (usually is) TOFIX: Horrible parsing
  161. if(!(_.isUndefined($scope.timepicker))) {
  162. from = $scope.panel.mode === 'relative' ? moment(kbn.time_ago($scope.panel.timespan)) :
  163. moment(moment.utc($scope.timepicker.from.date).format('MM/DD/YYYY') + " " + $scope.timepicker.from.time,'MM/DD/YYYY HH:mm:ss');
  164. to = $scope.panel.mode !== 'absolute' ? moment() :
  165. moment(moment.utc($scope.timepicker.to.date).format('MM/DD/YYYY') + " " + $scope.timepicker.to.time,'MM/DD/YYYY HH:mm:ss');
  166. // Otherwise (probably initialization)
  167. } else {
  168. from = $scope.panel.mode === 'relative' ? moment(kbn.time_ago($scope.panel.timespan)) :
  169. $scope.time.from;
  170. to = $scope.panel.mode !== 'absolute' ? moment() :
  171. $scope.time.to;
  172. }
  173. if (from.valueOf() >= to.valueOf()) {
  174. from = moment(to.valueOf() - 1000);
  175. }
  176. $timeout(function(){
  177. set_timepicker(from,to);
  178. });
  179. return {
  180. from : from,
  181. to : to
  182. };
  183. };
  184. $scope.time_apply = function() {
  185. $scope.panel.error = "";
  186. // Update internal time object
  187. // Remove all other time filters
  188. filterSrv.removeByType('time');
  189. $scope.time = $scope.time_calc();
  190. $scope.time.field = $scope.panel.timefield;
  191. update_panel();
  192. set_time_filter($scope.time);
  193. dashboard.refresh();
  194. };
  195. function set_time_filter(time) {
  196. time.type = 'time';
  197. // Clear all time filters, set a new one
  198. filterSrv.removeByType('time');
  199. $scope.panel.filter_id = filterSrv.set(compile_time(time));
  200. return $scope.panel.filter_id;
  201. }
  202. // Prefer to pass around Date() objects since interacting with
  203. // moment objects in libraries that are expecting Date()s can be tricky
  204. function compile_time(time) {
  205. time = _.clone(time);
  206. time.from = time.from.toDate();
  207. time.to = time.to.toDate();
  208. return time;
  209. }
  210. function set_timepicker(from,to) {
  211. // Janky 0s timeout to get around $scope queue processing view issue
  212. $scope.timepicker = {
  213. from : {
  214. time : from.format("HH:mm:ss"),
  215. date : from.format("MM/DD/YYYY")
  216. },
  217. to : {
  218. time : to.format("HH:mm:ss"),
  219. date : to.format("MM/DD/YYYY")
  220. }
  221. };
  222. }
  223. });