| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- /*jshint globalstrict:true */
- /*global angular:true */
- /*
- ## Timepicker
- ### Parameters
- * mode :: The default mode of the panel. Options: 'relative', 'absolute' 'since' Default: 'relative'
- * time_options :: An array of possible time options. Default: ['5m','15m','1h','6h','12h','24h','2d','7d','30d']
- * timespan :: The default options selected for the relative view. Default: '15m'
- * timefield :: The field in which time is stored in the document.
- * refresh: Object containing refresh parameters
- * enable :: true/false, enable auto refresh by default. Default: false
- * interval :: Seconds between auto refresh. Default: 30
- * min :: The lowest interval a user may set
- */
- 'use strict';
- angular.module('kibana.timepicker', [])
- .controller('timepicker', function($scope, $rootScope, $timeout, timer, $http, dashboard, filterSrv) {
- $scope.panelMeta = {
- status : "Stable",
- description : "A panel for controlling the time range filters. If you have time based data, "+
- " or if you're using time stamped indices, you need one of these"
- };
- // Set and populate defaults
- var _d = {
- status : "Stable",
- mode : "relative",
- time_options : ['5m','15m','1h','6h','12h','24h','2d','7d','30d'],
- timespan : '15m',
- timefield : '@timestamp',
- timeformat : "",
- refresh : {
- enable : false,
- interval: 30,
- min : 3
- }
- };
- _.defaults($scope.panel,_d);
- var _groups = _.isArray($scope.panel.group) ?
- $scope.panel.group : [$scope.panel.group];
- $scope.init = function() {
- // Private refresh interval that we can use for view display without causing
- // unnecessary refreshes during changes
- $scope.refresh_interval = $scope.panel.refresh.interval;
- $scope.filterSrv = filterSrv;
- // Init a private time object with Date() objects depending on mode
- switch($scope.panel.mode) {
- case 'absolute':
- $scope.time = {
- from : moment($scope.panel.time.from,'MM/DD/YYYY HH:mm:ss') || moment(kbn.time_ago($scope.panel.timespan)),
- to : moment($scope.panel.time.to,'MM/DD/YYYY HH:mm:ss') || moment()
- };
- break;
- case 'since':
- $scope.time = {
- from : moment($scope.panel.time.from,'MM/DD/YYYY HH:mm:ss') || moment(kbn.time_ago($scope.panel.timespan)),
- to : moment()
- };
- break;
- case 'relative':
- $scope.time = {
- from : moment(kbn.time_ago($scope.panel.timespan)),
- to : moment()
- };
- break;
- }
- $scope.time.field = $scope.panel.timefield;
- // These 3 statements basicly do everything time_apply() does
- set_timepicker($scope.time.from,$scope.time.to);
- update_panel();
- // If we're in a mode where something must be calculated, clear existing filters
- // and set new ones
- if($scope.panel.mode !== 'absolute') {
- set_time_filter($scope.time);
- }
- dashboard.refresh();
- // Start refresh timer if enabled
- if ($scope.panel.refresh.enable) {
- $scope.set_interval($scope.panel.refresh.interval);
- }
- // In case some other panel broadcasts a time, set us to an absolute range
- $scope.$on('refresh', function() {
- if(filterSrv.idsByType('time').length > 0) {
- var time = filterSrv.timeRange('min');
- if($scope.time.from.diff(moment.utc(time.from),'seconds') !== 0 ||
- $scope.time.to.diff(moment.utc(time.to),'seconds') !== 0)
- {
- $scope.set_mode('absolute');
- // These 3 statements basicly do everything time_apply() does
- set_timepicker(moment(time.from),moment(time.to));
- $scope.time = $scope.time_calc();
- update_panel();
- }
- }
- });
- };
- $scope.set_interval = function (refresh_interval) {
- $scope.panel.refresh.interval = refresh_interval;
- if(_.isNumber($scope.panel.refresh.interval)) {
- if($scope.panel.refresh.interval < $scope.panel.refresh.min) {
- $scope.panel.refresh.interval = $scope.panel.refresh.min;
- timer.cancel($scope.refresh_timer);
- return;
- }
- timer.cancel($scope.refresh_timer);
- $scope.refresh();
- } else {
- timer.cancel($scope.refresh_timer);
- }
- };
- $scope.refresh = function() {
- if ($scope.panel.refresh.enable) {
- timer.cancel($scope.refresh_timer);
- $scope.refresh_timer = timer.register($timeout(function() {
- $scope.refresh();
- $scope.time_apply();
- },$scope.panel.refresh.interval*1000));
- } else {
- timer.cancel($scope.refresh_timer);
- }
- };
- var update_panel = function() {
- // Update panel's string representation of the time object.Don't update if
- // we're in relative mode since we dont want to store the time object in the
- // json for relative periods
- if($scope.panel.mode !== 'relative') {
- $scope.panel.time = {
- from : $scope.time.from.format("MM/DD/YYYY HH:mm:ss"),
- to : $scope.time.to.format("MM/DD/YYYY HH:mm:ss"),
- };
- } else {
- delete $scope.panel.time;
- }
- };
- $scope.set_mode = function(mode) {
- $scope.panel.mode = mode;
- $scope.panel.refresh.enable = mode === 'absolute' ?
- false : $scope.panel.refresh.enable;
- update_panel();
- };
- $scope.to_now = function() {
- $scope.timepicker.to = {
- time : moment().format("HH:mm:ss"),
- date : moment().format("MM/DD/YYYY")
- };
- };
- $scope.set_timespan = function(timespan) {
- $scope.panel.timespan = timespan;
- $scope.timepicker.from = {
- time : moment(kbn.time_ago(timespan)).format("HH:mm:ss"),
- date : moment(kbn.time_ago(timespan)).format("MM/DD/YYYY")
- };
- $scope.time_apply();
- };
- $scope.close_edit = function() {
- $scope.time_apply();
- };
- //
- $scope.time_calc = function(){
- var from,to;
- // If time picker is defined (usually is) TOFIX: Horrible parsing
- if(!(_.isUndefined($scope.timepicker))) {
- from = $scope.panel.mode === 'relative' ? moment(kbn.time_ago($scope.panel.timespan)) :
- moment(moment.utc($scope.timepicker.from.date).format('MM/DD/YYYY') + " " + $scope.timepicker.from.time,'MM/DD/YYYY HH:mm:ss');
- to = $scope.panel.mode !== 'absolute' ? moment() :
- moment(moment.utc($scope.timepicker.to.date).format('MM/DD/YYYY') + " " + $scope.timepicker.to.time,'MM/DD/YYYY HH:mm:ss');
- // Otherwise (probably initialization)
- } else {
- from = $scope.panel.mode === 'relative' ? moment(kbn.time_ago($scope.panel.timespan)) :
- $scope.time.from;
- to = $scope.panel.mode !== 'absolute' ? moment() :
- $scope.time.to;
- }
- if (from.valueOf() >= to.valueOf()) {
- from = moment(to.valueOf() - 1000);
- }
- $timeout(function(){
- set_timepicker(from,to);
- });
- return {
- from : from,
- to : to
- };
- };
- $scope.time_apply = function() {
- $scope.panel.error = "";
- // Update internal time object
- // Remove all other time filters
- filterSrv.removeByType('time');
-
- $scope.time = $scope.time_calc();
- $scope.time.field = $scope.panel.timefield;
-
- update_panel();
- set_time_filter($scope.time);
- dashboard.refresh();
- };
- function set_time_filter(time) {
- time.type = 'time';
- // Clear all time filters, set a new one
- filterSrv.removeByType('time');
- $scope.panel.filter_id = filterSrv.set(compile_time(time));
- return $scope.panel.filter_id;
- }
- // Prefer to pass around Date() objects since interacting with
- // moment objects in libraries that are expecting Date()s can be tricky
- function compile_time(time) {
- time = _.clone(time);
- time.from = time.from.toDate();
- time.to = time.to.toDate();
- return time;
- }
- function set_timepicker(from,to) {
- // Janky 0s timeout to get around $scope queue processing view issue
- $scope.timepicker = {
- from : {
- time : from.format("HH:mm:ss"),
- date : from.format("MM/DD/YYYY")
- },
- to : {
- time : to.format("HH:mm:ss"),
- date : to.format("MM/DD/YYYY")
- }
- };
- }
- });
|