diff --git a/public/app/controllers/signupCtrl.ts b/public/app/controllers/signupCtrl.ts
index 27f0aeabac4..d59f1f0eb68 100644
--- a/public/app/controllers/signupCtrl.ts
+++ b/public/app/controllers/signupCtrl.ts
@@ -1,8 +1,7 @@
///
-///
import angular = require('angular');
-declare var config : any;
+import config = require('config');
var module = angular.module('grafana.controllers');
diff --git a/public/app/core/directives/array_join.ts b/public/app/core/directives/array_join.ts
index 3fa1c209847..fd88b5cfb8c 100644
--- a/public/app/core/directives/array_join.ts
+++ b/public/app/core/directives/array_join.ts
@@ -3,7 +3,7 @@
import angular = require('angular');
import _ = require('lodash');
-export function ArrayJoin() {
+export function arrayJoin() {
'use strict';
return {
@@ -29,5 +29,5 @@ export function ArrayJoin() {
};
}
-angular.module('grafana.directives').directive('arrayJoin', ArrayJoin);
+angular.module('grafana.directives').directive('arrayJoin', arrayJoin);
diff --git a/public/app/directives/grafanaSimplePanel.js b/public/app/directives/grafanaSimplePanel.js
deleted file mode 100644
index ce34e2841e7..00000000000
--- a/public/app/directives/grafanaSimplePanel.js
+++ /dev/null
@@ -1,66 +0,0 @@
-define([
- 'angular',
-],
-function (angular) {
- 'use strict';
-
- angular
- .module('grafana.directives')
- .directive('grafanaSimplePanel', function($compile) {
- var panelLoading = '' +
- ''+
- ' loading ...' +
- ''+
- '';
-
- return {
- restrict: 'E',
- link: function($scope, elem, attr) {
-
- // once we have the template, scan it for controllers and
- // load the module.js if we have any
-
- // compile the module and uncloack. We're done
- function loadModule($module) {
- $module.appendTo(elem);
- /* jshint indent:false */
- $compile(elem.contents())($scope);
- elem.removeClass("ng-cloak");
- }
-
- function loadController(name) {
- elem.addClass("ng-cloak");
- // load the panels module file, then render it in the dom.
- var nameAsPath = name.replace(".", "/");
- $scope.require([
- 'jquery',
- 'text!panels/'+nameAsPath+'/module.html'
- ], function ($, moduleTemplate) {
- var $module = $(moduleTemplate);
- // top level controllers
- var $controllers = $module.filter('ngcontroller, [ng-controller], .ng-controller');
- // add child controllers
- $controllers = $controllers.add($module.find('ngcontroller, [ng-controller], .ng-controller'));
-
- if ($controllers.length) {
- $controllers.first().prepend(panelLoading);
- $scope.require([
- 'panels/'+nameAsPath+'/module'
- ], function() {
- loadModule($module);
- });
- } else {
- loadModule($module);
- }
- });
- }
-
- $scope.$watch(attr.type, function (name) {
- loadController(name);
- });
-
- }
- };
- });
-
-});
diff --git a/public/app/features/dashboard/all.js b/public/app/features/dashboard/all.js
index d6e713070e9..0ee3a64a806 100644
--- a/public/app/features/dashboard/all.js
+++ b/public/app/features/dashboard/all.js
@@ -16,6 +16,7 @@ define([
'./timeSrv',
'./unsavedChangesSrv',
'./directives/dashSearchView',
+ './timepicker/timepicker',
'./graphiteImportCtrl',
'./dynamicDashboardSrv',
'./importCtrl',
diff --git a/public/app/features/dashboard/dashboardSrv.js b/public/app/features/dashboard/dashboardSrv.js
index 0ee2fde8a4b..b7a9e1dbbab 100644
--- a/public/app/features/dashboard/dashboardSrv.js
+++ b/public/app/features/dashboard/dashboardSrv.js
@@ -31,7 +31,7 @@ function (angular, $, kbn, _, moment) {
this.hideControls = data.hideControls || false;
this.sharedCrosshair = data.sharedCrosshair || false;
this.rows = data.rows || [];
- this.nav = data.nav || [];
+ this.timepicker = data.timepicker || {};
this.time = data.time || { from: 'now-6h', to: 'now' };
this.templating = this._ensureListExist(data.templating);
this.annotations = this._ensureListExist(data.annotations);
@@ -40,11 +40,6 @@ function (angular, $, kbn, _, moment) {
this.schemaVersion = data.schemaVersion || 0;
this.version = data.version || 0;
this.links = data.links || [];
-
- if (this.nav.length === 0) {
- this.nav.push({ type: 'timepicker' });
- }
-
this._updateSchema(data);
this._initMeta(meta);
}
@@ -232,9 +227,9 @@ function (angular, $, kbn, _, moment) {
var i, j, k;
var oldVersion = this.schemaVersion;
var panelUpgrades = [];
- this.schemaVersion = 6;
+ this.schemaVersion = 7;
- if (oldVersion === 6) {
+ if (oldVersion === 7) {
return;
}
@@ -329,6 +324,11 @@ function (angular, $, kbn, _, moment) {
}
}
+ if (oldVersion < 7 && old.nav && old.nav.length) {
+ this.timepicker = old.nav[0];
+ delete this.nav;
+ }
+
if (panelUpgrades.length === 0) {
return;
}
diff --git a/public/app/features/dashboard/partials/dashboardTopNav.html b/public/app/features/dashboard/partials/dashboardTopNav.html
index 58445abf505..f370ce324f5 100644
--- a/public/app/features/dashboard/partials/dashboardTopNav.html
+++ b/public/app/features/dashboard/partials/dashboardTopNav.html
@@ -61,9 +61,8 @@
Back to dashboard
-
-
-
+
+
diff --git a/public/app/features/dashboard/partials/settings.html b/public/app/features/dashboard/partials/settings.html
index 256b7cd825f..892eebbb927 100644
--- a/public/app/features/dashboard/partials/settings.html
+++ b/public/app/features/dashboard/partials/settings.html
@@ -5,9 +5,7 @@
-
diff --git a/public/app/panels/timepicker/module.js b/public/app/features/dashboard/timepicker/timepicker.ts
similarity index 71%
rename from public/app/panels/timepicker/module.js
rename to public/app/features/dashboard/timepicker/timepicker.ts
index 0e6525016e8..72de01db29b 100644
--- a/public/app/panels/timepicker/module.js
+++ b/public/app/features/dashboard/timepicker/timepicker.ts
@@ -1,32 +1,13 @@
-/*
+///
- ## Timepicker2
+import angular = require('angular');
+import _ = require('lodash');
+import moment = require('moment');
+import kbn = require('kbn');
- ### 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
-*/
-define([
- 'angular',
- 'app',
- 'lodash',
- 'moment',
- 'kbn'
-],
-function (angular, app, _, moment, kbn) {
- 'use strict';
-
- var module = angular.module('grafana.panels.timepicker', []);
- app.useModule(module);
-
- module.controller('timepicker', function($scope, $rootScope, timeSrv) {
+export class TimePickerCtrl {
+ constructor($scope : any, $rootScope, timeSrv) {
$scope.panelMeta = {
status : "Stable",
description : ""
@@ -39,8 +20,6 @@ function (angular, app, _, moment, kbn) {
refresh_intervals : ['5s','10s','30s','1m','5m','15m','30m','1h','2h','1d'],
};
- _.defaults($scope.panel,_d);
-
// ng-pattern regexs
$scope.patterns = {
date: /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/,
@@ -57,6 +36,10 @@ function (angular, app, _, moment, kbn) {
});
$scope.init = function() {
+ $scope.panel = $scope.dashboard.timepicker;
+
+ _.defaults($scope.panel, _d);
+
var time = timeSrv.timeRange(true);
$scope.panel.now = false;
@@ -86,11 +69,11 @@ function (angular, app, _, moment, kbn) {
$scope.temptime = cloneTime($scope.time);
$scope.temptime.now = $scope.panel.now;
- $scope.temptime.from.date.setHours(0,0,0,0);
- $scope.temptime.to.date.setHours(0,0,0,0);
+ $scope.temptime.from.date.setHours(0, 0, 0, 0);
+ $scope.temptime.to.date.setHours(0, 0, 0, 0);
// Date picker needs the date to be at the start of the day
- if(new Date().getTimezoneOffset() < 0) {
+ if (new Date().getTimezoneOffset() < 0) {
$scope.temptime.from.date = moment($scope.temptime.from.date).add(1, 'days').toDate();
$scope.temptime.to.date = moment($scope.temptime.to.date).add(1, 'days').toDate();
}
@@ -100,7 +83,7 @@ function (angular, app, _, moment, kbn) {
// Constantly validate the input of the fields. This function does not change any date variables
// outside of its own scope
- $scope.validate = function(time) {
+ $scope.validate = function(time) : any {
// Assume the form is valid. There is a hidden dummy input for invalidating it programatically.
$scope.input.$setValidity("dummy", true);
@@ -108,13 +91,13 @@ function (angular, app, _, moment, kbn) {
_to = datepickerToLocal(time.to.date),
_t = time;
- if($scope.input.$valid) {
+ if ($scope.input.$valid) {
- _from.setHours(_t.from.hour,_t.from.minute,_t.from.second,_t.from.millisecond);
- _to.setHours(_t.to.hour,_t.to.minute,_t.to.second,_t.to.millisecond);
+ _from.setHours(_t.from.hour, _t.from.minute, _t.from.second, _t.from.millisecond);
+ _to.setHours(_t.to.hour, _t.to.minute, _t.to.second, _t.to.millisecond);
// Check that the objects are valid and to is after from
- if(isNaN(_from.getTime()) || isNaN(_to.getTime()) || _from.getTime() >= _to.getTime()) {
+ if (isNaN(_from.getTime()) || isNaN(_to.getTime()) || _from.getTime() >= _to.getTime()) {
$scope.input.$setValidity("dummy", false);
return false;
}
@@ -122,29 +105,23 @@ function (angular, app, _, moment, kbn) {
return false;
}
- return { from: _from, to:_to, now: time.now};
+ return { from: _from, to: _to, now: time.now };
};
$scope.setNow = function() {
$scope.time.to = getTimeObj(new Date());
};
- /*
- time : {
- from: Date
- to: Date
- }
- */
$scope.setAbsoluteTimeFilter = function (time) {
// Create filter object
var _filter = _.clone(time);
- if(time.now) {
+ if (time.now) {
_filter.to = "now";
}
// Update our representation
- $scope.time = getScopeTimeObj(time.from,time.to);
+ $scope.time = getScopeTimeObj(time.from, time.to);
timeSrv.setTime(_filter);
};
@@ -160,10 +137,10 @@ function (angular, app, _, moment, kbn) {
timeSrv.setTime(range);
- $scope.time = getScopeTimeObj(kbn.parseDate(range.from),new Date());
+ $scope.time = getScopeTimeObj(kbn.parseDate(range.from), new Date());
};
- var pad = function(n, width, z) {
+ var pad : any = function(n, width, z) {
z = z || '0';
n = n.toString();
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
@@ -180,8 +157,8 @@ function (angular, app, _, moment, kbn) {
return _n;
};
- var getScopeTimeObj = function(from,to) {
- var model = {from: getTimeObj(from), to: getTimeObj(to)};
+ var getScopeTimeObj = function(from, to) {
+ var model : any = {from: getTimeObj(from), to: getTimeObj(to)};
if (model.from.date) {
model.tooltip = $scope.dashboard.formatDate(model.from.date) + '
to
';
@@ -212,10 +189,10 @@ function (angular, app, _, moment, kbn) {
var getTimeObj = function(date) {
return {
date: new Date(date),
- hour: pad(date.getHours(),2),
- minute: pad(date.getMinutes(),2),
- second: pad(date.getSeconds(),2),
- millisecond: pad(date.getMilliseconds(),3)
+ hour: pad(date.getHours(), 2),
+ minute: pad(date.getMinutes(), 2),
+ second: pad(date.getSeconds(), 2),
+ millisecond: pad(date.getMilliseconds(), 3)
};
};
@@ -234,7 +211,7 @@ function (angular, app, _, moment, kbn) {
var to = (center + (timespan*factor)/2);
var from = (center - (timespan*factor)/2);
- if(to > Date.now() && range.to <= Date.now()) {
+ if (to > Date.now() && range.to <= Date.now()) {
var offset = to - Date.now();
from = from - offset;
to = Date.now();
@@ -246,5 +223,32 @@ function (angular, app, _, moment, kbn) {
});
};
- });
-});
+ $scope.init();
+ }
+}
+
+export function settingsDirective() {
+ 'use strict';
+ return {
+ restrict: 'E',
+ templateUrl: 'app/features/dashboard/timepicker/settings.html',
+ controller: TimePickerCtrl,
+ scope: true,
+ link: function() {
+ }
+ };
+}
+
+export function timePickerDirective() {
+ 'use strict';
+ return {
+ restrict: 'E',
+ templateUrl: 'app/features/dashboard/timepicker/timepicker.html',
+ controller: TimePickerCtrl,
+ scope: true
+ };
+}
+
+
+angular.module('grafana.directives').directive('gfTimePickerSettings', settingsDirective);
+angular.module('grafana.directives').directive('gfTimePicker', timePickerDirective);
diff --git a/public/app/features/dashlinks/editor.html b/public/app/features/dashlinks/editor.html
index 33283fed03d..9f44d72206c 100644
--- a/public/app/features/dashlinks/editor.html
+++ b/public/app/features/dashlinks/editor.html
@@ -67,7 +67,7 @@
-