diff --git a/src/app/directives/ngModelOnBlur.js b/src/app/directives/ngModelOnBlur.js
index 1aea09f9dc8..8057c071bdb 100644
--- a/src/app/directives/ngModelOnBlur.js
+++ b/src/app/directives/ngModelOnBlur.js
@@ -1,5 +1,8 @@
-define(['angular'],
-function (angular) {
+define([
+ 'angular',
+ 'kbn'
+],
+function (angular, kbn) {
'use strict';
angular
@@ -34,5 +37,18 @@ function (angular) {
});
}
};
+ })
+ .directive('validTimeSpan', function() {
+ return {
+ require: 'ngModel',
+ link: function(scope, elm, attrs, ctrl) {
+ ctrl.$validators.integer = function(modelValue, viewValue) {
+ if (ctrl.$isEmpty(modelValue)) {
+ return true;
+ }
+ return kbn.isValidTimeSpan(viewValue);
+ };
+ }
+ };
});
});
diff --git a/src/app/features/panel/partials/panelTime.html b/src/app/features/panel/partials/panelTime.html
index 7b8b507a2ae..0c407cf2ff1 100644
--- a/src/app/features/panel/partials/panelTime.html
+++ b/src/app/features/panel/partials/panelTime.html
@@ -12,8 +12,8 @@
Last
-
@@ -31,8 +31,8 @@
Amount
-
diff --git a/src/app/panels/timepicker/editor.html b/src/app/panels/timepicker/editor.html
index 33a5fbfaf00..34712ad582d 100644
--- a/src/app/panels/timepicker/editor.html
+++ b/src/app/panels/timepicker/editor.html
@@ -18,7 +18,10 @@
+ ng-model="panel.nowDelay" placeholder="0m"
+ valid-time-span
+ bs-tooltip="'Enter 1m to ignore the last minute (because it can contain incomplete metrics)'"
+ data-placement="right">
diff --git a/src/css/less/grafana.less b/src/css/less/grafana.less
index 7b32d09e854..55e8def8f33 100644
--- a/src/css/less/grafana.less
+++ b/src/css/less/grafana.less
@@ -13,6 +13,7 @@
@import "gfbox.less";
@import "dashlist.less";
@import "admin.less";
+@import "validation.less";
.row-control-inner {
padding:0px;
diff --git a/src/css/less/validation.less b/src/css/less/validation.less
new file mode 100644
index 00000000000..a0568bfc96a
--- /dev/null
+++ b/src/css/less/validation.less
@@ -0,0 +1,3 @@
+input[type=text].ng-invalid {
+ box-shadow: inset 0 0px 7px @red;
+}