module.js 7.8 KB

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