module.js 7.9 KB

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