module.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. angular.module('kibana.timepicker', [])
  2. .controller('timepicker', function($scope, $rootScope, $timeout) {
  3. // Set and populate defaults
  4. var _d = {
  5. mode : "relative",
  6. time_options : ['5m','15m','1h','6h','12h','24h','2d','7d','30d'],
  7. timespan : '15m',
  8. refresh : {
  9. enable: false,
  10. interval: 3,
  11. min: 3
  12. },
  13. time : {
  14. from : $scope.time.from,
  15. to : $scope.time.to
  16. }
  17. }
  18. _.each(_d, function(v, k) {
  19. $scope.panel[k] = _.isUndefined($scope.panel[k])
  20. ? _d[k] : $scope.panel[k];
  21. });
  22. // Private refresh interval that we can use for view display without causing
  23. // unnecessary refreshes during changes
  24. $scope.refresh_interval = $scope.panel.refresh.interval
  25. // Init a private time object with Date() objects depending on mode
  26. switch($scope.panel.mode) {
  27. case 'absolute':
  28. $scope.time = {
  29. from : Date.parse($scope.panel.time.from),
  30. to : Date.parse($scope.panel.time.to)
  31. }
  32. break;
  33. case 'since':
  34. $scope.time = {
  35. from : Date.parse($scope.panel.time.from),
  36. to : new Date()
  37. }
  38. break;
  39. case 'relative':
  40. $scope.time = {
  41. from : time_ago($scope.panel.timespan),
  42. to : new Date()
  43. }
  44. break;
  45. }
  46. // Init the values for the time/date pickers
  47. $scope.timepicker = {
  48. from : {
  49. time : $scope.time.from.format("HH:MM:ss"),
  50. date : $scope.time.from.format("mm/dd/yyyy")
  51. },
  52. to : {
  53. time : $scope.time.to.format("HH:MM:ss"),
  54. date : $scope.time.to.format("mm/dd/yyyy")
  55. }
  56. }
  57. // In the case that a panel is not ready to receive a time event, it may
  58. // request one be sent by broadcasting a 'get_time' even to its group
  59. if (!(_.isUndefined($scope.panel.group))) {
  60. // Broadcast time when initializing
  61. $rootScope.$broadcast($scope.panel.group+"-time", $scope.time)
  62. // And whenever it is requested
  63. $scope.$on($scope.panel.group+"-get_time", function(event) {
  64. $rootScope.$broadcast($scope.panel.group+"-time", $scope.time)
  65. });
  66. }
  67. $scope.$watch('panel.refresh.enable', function() {$scope.refresh()});
  68. $scope.$watch('panel.refresh.interval', function() {
  69. $timeout(function(){
  70. if(_.isNumber($scope.panel.refresh.interval)) {
  71. if($scope.panel.refresh.interval < $scope.panel.refresh.min) {
  72. $scope.panel.refresh.interval = $scope.panel.refresh.min
  73. $timeout.cancel($scope.panel.refresh.timer)
  74. return;
  75. }
  76. $timeout.cancel($scope.panel.refresh.timer)
  77. $scope.refresh()
  78. } else {
  79. $timeout.cancel($scope.panel.refresh.timer)
  80. }
  81. });
  82. });
  83. $scope.refresh = function() {
  84. if ($scope.panel.refresh.enable) {
  85. $scope.time_apply();
  86. $scope.panel.refresh.timer = $timeout(
  87. $scope.refresh,
  88. $scope.panel.refresh.interval*1000
  89. );
  90. } else {
  91. $timeout.cancel($scope.panel.refresh.timer)
  92. }
  93. }
  94. $scope.set_mode = function(mode) {
  95. $scope.panel.mode = mode;
  96. $scope.panel.refresh.enable = mode === 'absolute' ?
  97. false : $scope.panel.refresh.enable
  98. }
  99. $scope.to_now = function() {
  100. $scope.timepicker.to = {
  101. time : new Date().format("HH:MM:ss"),
  102. date : new Date().format("mm/dd/yyyy")
  103. }
  104. }
  105. $scope.set_timespan = function(timespan) {
  106. $scope.panel.timespan = timespan;
  107. $scope.timepicker.from = {
  108. time : time_ago(timespan).format("HH:MM:ss"),
  109. date : time_ago(timespan).format("mm/dd/yyyy")
  110. }
  111. $scope.time_apply();
  112. }
  113. $scope.time_check = function(){
  114. var from = $scope.panel.mode === 'relative' ? time_ago($scope.panel.timespan) :
  115. Date.parse($scope.timepicker.from.date + " " + $scope.timepicker.from.time)
  116. var to = $scope.panel.mode !== 'absolute' ? new Date() :
  117. Date.parse($scope.timepicker.to.date + " " + $scope.timepicker.to.time)
  118. if (from.getTime() >= to.getTime())
  119. from = new Date(to.getTime() - 1000)
  120. // Janky 0s timeout to get around $scope queue processing view issue
  121. $timeout(function(){
  122. $scope.timepicker = {
  123. from : {
  124. time : from.format("HH:MM:ss"),
  125. date : from.format("mm/dd/yyyy")
  126. },
  127. to : {
  128. time : to.format("HH:MM:ss"),
  129. date : to.format("mm/dd/yyyy")
  130. }
  131. }
  132. });
  133. }
  134. $scope.time_apply = function() {
  135. $scope.time_check();
  136. // Update internal time object
  137. $scope.time = {
  138. from : Date.parse($scope.timepicker.from.date + " " + $scope.timepicker.from.time),
  139. to : Date.parse($scope.timepicker.to.date + " " + $scope.timepicker.to.time)
  140. };
  141. // Broadcast time
  142. $rootScope.$broadcast($scope.panel.group+"-time", $scope.time)
  143. // Update panel's string representation of the time object
  144. $scope.panel.time = {
  145. from : $scope.time.from.format("mm/dd/yyyy HH:MM:ss"),
  146. to : $scope.time.to.format("mm/dd/yyyy HH:MM:ss")
  147. };
  148. };
  149. })