diff --git a/public/app/core/utils/rangeutil.ts b/public/app/core/utils/rangeutil.ts
new file mode 100644
index 00000000000..fc0ecbab17c
--- /dev/null
+++ b/public/app/core/utils/rangeutil.ts
@@ -0,0 +1,108 @@
+///
+
+import moment = require('moment');
+import _ = require('lodash');
+import angular = require('angular');
+
+var spans = {
+ 's': {display: 'second'},
+ 'm': {display: 'minute'},
+ 'h': {display: 'hour'},
+ 'd': {display: 'day'},
+ 'w': {display: 'week'},
+ 'M': {display: 'month'},
+ 'y': {display: 'year'},
+};
+
+var rangeOptions = [
+ { from: 'now/d', to: 'now/d', display: 'Today', section: 0 },
+ { from: 'now/w', to: 'now/w', display: 'This week', section: 0 },
+ { from: 'now/d', to: 'now', display: 'The day so far', section: 0 },
+ { from: 'now/w', to: 'now', display: 'Week to date', section: 0 },
+ { from: 'now/M', to: 'now/M', display: 'This month', section: 0 },
+ { from: 'now/y', to: 'now/y', display: 'This year', section: 0 },
+
+ { from: 'now-1d/d', to: 'now-1d/d', display: 'Yesterday', section: 1 },
+ { from: 'now-2d/d', to: 'now-2d/d', display: 'Day before yesterday', section: 1 },
+ { from: 'now-7d/d', to: 'now-7d/d', display: 'This day last week', section: 1 },
+ { from: 'now-1w/w', to: 'now-1w/w', display: 'Previous week', section: 1 },
+ { from: 'now-1M/M', to: 'now-1M/M', display: 'Previous month', section: 1 },
+ { from: 'now-1y/y', to: 'now-1y/y', display: 'Previous year', section: 1 },
+
+ { from: 'now-5m', to: 'now', display: 'Last 5 minutes', section: 2 },
+ { from: 'now-15m', to: 'now', display: 'Last 15 minutes', section: 2 },
+ { from: 'now-30m', to: 'now', display: 'Last 30 minutes', section: 2 },
+ { from: 'now-1h', to: 'now', display: 'Last 1 hour', section: 2 },
+ { from: 'now-4h', to: 'now', display: 'Last 4 hours', section: 2 },
+ { from: 'now-12h', to: 'now', display: 'Last 12 hours', section: 2 },
+ { from: 'now-24h', to: 'now', display: 'Last 24 hours', section: 2 },
+ { from: 'now-7d', to: 'now', display: 'Last 7 days', section: 2 },
+
+ { from: 'now-30d', to: 'now', display: 'Last 30 days', section: 3 },
+ { from: 'now-60d', to: 'now', display: 'Last 60 days', section: 3 },
+ { from: 'now-90d', to: 'now', display: 'Last 90 days', section: 3 },
+ { from: 'now-6M', to: 'now', display: 'Last 6 months', section: 3 },
+ { from: 'now-1y', to: 'now', display: 'Last 1 year', section: 3 },
+ { from: 'now-2y', to: 'now', display: 'Last 2 years', section: 3 },
+ { from: 'now-5y', to: 'now', display: 'Last 5 years', section: 3 },
+];
+
+var rangeIndex = {};
+_.each(rangeOptions, function (frame) {
+ rangeIndex[frame.from + ' to ' + frame.to] = frame;
+});
+
+ function getRelativeTimesList(timepickerSettings) {
+ return _.map(timepickerSettings.time_options, function(duration: string) {
+ return describeTextRange(duration);
+ });
+ }
+
+ // handles expressions like
+ // 5m
+ // 5m to now/d
+ // now/d to now
+ // now/d
+ // if no to then to now is assumed
+ function describeTextRange(expr: string) {
+ let rangeExpr = 'now-' + expr + ' to now';
+ if (expr.indexOf('now') === 0) {
+ rangeExpr = expr + ' to now';
+ }
+
+ let opt = rangeIndex[rangeExpr];
+ if (opt) {
+ return opt;
+ }
+
+ opt = {from: 'now-' + expr, to: 'now', display: 'Parse error'};
+
+ if (/^\d+\w$/.test(expr)) {
+ let unit = expr[expr.length - 1];
+ let amount = parseInt(expr.substring(0, expr.length - 1));
+ let span = spans[unit];
+ if (span) {
+ opt.display = 'Last ' + amount + ' ' + span.display;
+ if (amount > 1) {
+ opt.display += 's';
+ }
+ }
+ }
+
+ return opt;
+ }
+
+ function describeTimeRange(range) {
+ var option = rangeIndex[range.from.toString() + ' to ' + range.to.toString()];
+ if (option) {
+ return option.display;
+ }
+ return "NA";
+ }
+
+export = {
+ getRelativeTimesList: getRelativeTimesList,
+ describeTextRange: describeTextRange,
+ describeTimeRange: describeTimeRange,
+}
+
diff --git a/public/app/features/dashboard/timepicker/timepicker.ts b/public/app/features/dashboard/timepicker/timepicker.ts
index 5cd0b6b7924..5427cb2a308 100644
--- a/public/app/features/dashboard/timepicker/timepicker.ts
+++ b/public/app/features/dashboard/timepicker/timepicker.ts
@@ -5,13 +5,13 @@ import _ = require('lodash');
import moment = require('moment');
import kbn = require('kbn');
import dateMath = require('app/core/utils/datemath');
-import {TimeRange} from './timerange';
+import rangeUtil = require('app/core/utils/rangeutil');
export class TimePickerCtrl {
static defaults = {
status : "Stable",
- time_options : ['5m','15m','1h','6h','12h','24h','today', '2d','7d','30d'],
+ time_options : ['5m','15m','1h','6h','12h','24h','2d','7d','30d'],
refresh_intervals : ['5s','10s','30s','1m','5m','15m','30m','1h','2h','1d'],
};
@@ -81,7 +81,7 @@ export class TimePickerCtrl {
if (this.timeSrv.time) {
if (this.$scope.panel.now) {
- model.rangeString = TimeRange.describeRelativeTime(this.timeSrv.time);
+ model.rangeString = rangeUtil.describeTimeRange(this.timeSrv.time);
}
else {
model.rangeString = this.$scope.dashboard.formatDate(model.from.date, 'MMM D, YYYY HH:mm:ss') + ' to ' +
@@ -93,7 +93,7 @@ export class TimePickerCtrl {
}
loadTimeOptions() {
- this.$scope.timeOptions = TimeRange.getRelativeTimesList(this.$scope.panel);
+ this.$scope.timeOptions = rangeUtil.getRelativeTimesList(this.$scope.panel);
this.$scope.refreshMenuLeftSide = this.$scope.time.rangeString.length < 10;
}
diff --git a/public/app/features/dashboard/timepicker/timerange.ts b/public/app/features/dashboard/timepicker/timerange.ts
deleted file mode 100644
index 50bf205d346..00000000000
--- a/public/app/features/dashboard/timepicker/timerange.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-///
-
-import _ = require('lodash');
-import moment = require('moment');
-
-var rangeOptions = [
- { from: 'now/d', to: 'now/d', display: 'Today', section: 0 },
- { from: 'now/w', to: 'now/w', display: 'This week', section: 0 },
-
- { from: 'now/d', to: 'now', display: 'The day so far', section: 0 },
- { from: 'now/w', to: 'now', display: 'Week to date', section: 0 },
- // { from: 'now/M', to: 'now/M', display: 'This month', section: 0 },
- // { from: 'now/y', to: 'now/y', display: 'This year', section: 0 },
- //
- // { from: 'now-1d/d', to: 'now-1d/d', display: 'Yesterday', section: 1 },
- // { from: 'now-2d/d', to: 'now-2d/d', display: 'Day before yesterday', section: 1 },
- // { from: 'now-7d/d', to: 'now-7d/d', display: 'This day last week', section: 1 },
- // { from: 'now-1w/w', to: 'now-1w/w', display: 'Previous week', section: 1 },
- // { from: 'now-1M/M', to: 'now-1M/M', display: 'Previous month', section: 1 },
- // { from: 'now-1y/y', to: 'now-1y/y', display: 'Previous year', section: 1 },
-
- { from: 'now-5m', to: 'now', display: 'Last 5 minutes', section: 2 },
- { from: 'now-15m', to: 'now', display: 'Last 15 minutes', section: 2 },
- { from: 'now-30m', to: 'now', display: 'Last 30 minutes', section: 2 },
- { from: 'now-1h', to: 'now', display: 'Last 1 hour', section: 2 },
- { from: 'now-4h', to: 'now', display: 'Last 4 hours', section: 2 },
- { from: 'now-12h', to: 'now', display: 'Last 12 hours', section: 2 },
- { from: 'now-24h', to: 'now', display: 'Last 24 hours', section: 2 },
- { from: 'now-7d', to: 'now', display: 'Last 7 days', section: 2 },
-
- { from: 'now-30d', to: 'now', display: 'Last 30 days', section: 3 },
- // { from: 'now-60d', to: 'now', display: 'Last 60 days', section: 3 },
- // { from: 'now-90d', to: 'now', display: 'Last 90 days', section: 3 },
- // { from: 'now-6M', to: 'now', display: 'Last 6 months', section: 3 },
- // { from: 'now-1y', to: 'now', display: 'Last 1 year', section: 3 },
- // { from: 'now-2y', to: 'now', display: 'Last 2 years', section: 3 },
- // { from: 'now-5y', to: 'now', display: 'Last 5 years', section: 3 },
-];
-
-var rangeIndex = {};
-_.each(rangeOptions, function (frame) {
- rangeIndex[frame.from + ' to ' + frame.to] = frame;
-});
-
-export class TimeRange {
-
- static getRelativeTimesList(timepickerSettings) {
- return rangeOptions;
- }
-
- static describeRelativeTime(range) {
- var option = rangeIndex[range.from.toString() + ' to ' + range.to.toString()];
- if (option) {
- return option.display;
- }
- return "NA";
- }
-}
-
-
diff --git a/public/test/specs/core/utils/datemath_specs.ts b/public/test/specs/core/utils/datemath_specs.ts
index 85e0f224807..333f592ac07 100644
--- a/public/test/specs/core/utils/datemath_specs.ts
+++ b/public/test/specs/core/utils/datemath_specs.ts
@@ -70,7 +70,7 @@ describe("DateMath", () => {
});
});
- describe.only('rounding', () => {
+ describe('rounding', () => {
var now;
var anchored;
diff --git a/public/test/specs/core/utils/rangeutil_specs.ts b/public/test/specs/core/utils/rangeutil_specs.ts
new file mode 100644
index 00000000000..0c72be4f7dc
--- /dev/null
+++ b/public/test/specs/core/utils/rangeutil_specs.ts
@@ -0,0 +1,34 @@
+import {describe, beforeEach, it, sinon, expect} from 'test/lib/common'
+
+import rangeUtil = require('app/core/utils/rangeutil')
+import _ = require('lodash')
+import moment = require('moment')
+
+describe("rangeUtil", () => {
+
+ describe("Can get range explained", () => {
+
+ it('should handle simple old expression with only amount and unit', () => {
+ var info = rangeUtil.describeTextRange('5m');
+ expect(info.display).to.be('Last 5 minutes')
+ });
+
+ it('should have singular when amount is 1', () => {
+ var info = rangeUtil.describeTextRange('1h');
+ expect(info.display).to.be('Last 1 hour')
+ });
+
+ it('should handle now/d', () => {
+ var info = rangeUtil.describeTextRange('now/d');
+ expect(info.display).to.be('The day so far');
+ });
+
+ it('should handle now/w', () => {
+ var info = rangeUtil.describeTextRange('now/w');
+ expect(info.display).to.be('Week to date');
+ });
+
+
+ });
+
+});