From 040e075fc43dbd1afb7ba973357ae18eb989d524 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Fri, 5 Jan 2018 14:40:01 -0700 Subject: [PATCH] store time filter history in localStorage --- src/ui/public/timefilter/lib/diff_interval.js | 2 + src/ui/public/timefilter/lib/diff_time.js | 2 + src/ui/public/timefilter/time_history.js | 85 +++++++++++++++++++ src/ui/public/timefilter/timefilter.js | 5 +- .../kbn_timepicker_absolute_panel.html | 14 +++ .../kbn_timepicker_absolute_panel.js | 12 ++- src/ui/public/timepicker/modes.js | 5 ++ src/ui/public/timepicker/timepicker.js | 15 ++-- 8 files changed, 130 insertions(+), 10 deletions(-) create mode 100644 src/ui/public/timefilter/time_history.js create mode 100644 src/ui/public/timepicker/modes.js diff --git a/src/ui/public/timefilter/lib/diff_interval.js b/src/ui/public/timefilter/lib/diff_interval.js index 427e50378135022..db472f142f9a849 100644 --- a/src/ui/public/timefilter/lib/diff_interval.js +++ b/src/ui/public/timefilter/lib/diff_interval.js @@ -1,5 +1,6 @@ import _ from 'lodash'; import { UtilsDiffTimePickerValsProvider } from 'ui/utils/diff_time_picker_vals'; +import { timeHistory } from 'ui/timefilter/time_history'; export function TimefilterLibDiffIntervalProvider(Private) { const diff = Private(UtilsDiffTimePickerValsProvider); @@ -9,6 +10,7 @@ export function TimefilterLibDiffIntervalProvider(Private) { return function () { if (diff(self.refreshInterval, oldRefreshInterval)) { + timeHistory.setRefreshInterval(self.refreshInterval); self.emit('update'); if (!self.refreshInterval.pause && self.refreshInterval.value !== 0) { self.emit('fetch'); diff --git a/src/ui/public/timefilter/lib/diff_time.js b/src/ui/public/timefilter/lib/diff_time.js index 9577cb91cbced26..13ee90e9d49ac09 100644 --- a/src/ui/public/timefilter/lib/diff_time.js +++ b/src/ui/public/timefilter/lib/diff_time.js @@ -1,5 +1,6 @@ import _ from 'lodash'; import { UtilsDiffTimePickerValsProvider } from 'ui/utils/diff_time_picker_vals'; +import { timeHistory } from 'ui/timefilter/time_history'; export function TimefilterLibDiffTimeProvider(Private) { const diff = Private(UtilsDiffTimePickerValsProvider); @@ -8,6 +9,7 @@ export function TimefilterLibDiffTimeProvider(Private) { let oldTime = _.clone(self.time); return function () { if (diff(self.time, oldTime)) { + timeHistory.setTime(self.time); self.emit('update'); self.emit('fetch'); } diff --git a/src/ui/public/timefilter/time_history.js b/src/ui/public/timefilter/time_history.js new file mode 100644 index 000000000000000..009695903706a89 --- /dev/null +++ b/src/ui/public/timefilter/time_history.js @@ -0,0 +1,85 @@ +import _ from 'lodash'; +import moment from 'moment'; +import { Storage } from 'ui/storage'; +import { TIME_MODES } from 'ui/timepicker/modes'; + +const MAX_HISTORY = 20; +const TIME_HISTORY_KEY = 'kibana.timepicker.timeHistory'; +const TIME_KEY = 'kibana.timepicker.time'; +const REFRESH_INTERVAL_KEY = 'kibana.timepicker.refreshInterval'; + +class TimeHistory { + constructor() { + this.storage = new Storage(window.localStorage); + } + + setRefreshInterval(refreshInterval) { + if (!refreshInterval) { + return; + } + + this.storage.set(REFRESH_INTERVAL_KEY, refreshInterval); + } + + getRefreshInterval(defaultRefreshValue) { + const refreshInterval = this.storage.get(REFRESH_INTERVAL_KEY); + if (!refreshInterval) { + return defaultRefreshValue; + } + return refreshInterval; + } + + setTime(time) { + if (!time) { + return; + } + + // time from/to can be strings or moment objects - convert to strings so always dealing with same types + const justStringsTime = { + from: moment.isMoment(time.from) ? time.from.toISOString() : time.from, + mode: time.mode, + to: moment.isMoment(time.to) ? time.to.toISOString() : time.to + }; + + this.storage.set(TIME_KEY, justStringsTime); + + let timeHistory = this.storage.get(TIME_HISTORY_KEY); + if (!timeHistory) { + timeHistory = { + [TIME_MODES.ABSOLUTE]: [], + [TIME_MODES.RELATIVE]: [], + }; + } + if (!Object.keys(timeHistory).includes(justStringsTime.mode)) { + return; + } + const noDuplicates = timeHistory[justStringsTime.mode].filter(t => { + return !_.isEqual(t, justStringsTime); + }); + noDuplicates.unshift(justStringsTime); + if (noDuplicates.length >= MAX_HISTORY) { + noDuplicates.length = MAX_HISTORY; + } + timeHistory[time.mode] = noDuplicates; + this.storage.set(TIME_HISTORY_KEY, timeHistory); + } + + getTimeHistory(timeMode) { + const timeHistory = this.storage.get(TIME_HISTORY_KEY); + if (!timeHistory || !Object.keys(timeHistory).includes(timeMode)) { + return []; + } + + return timeHistory[timeMode]; + } + + getTime(defaultTime) { + const time = this.storage.get(TIME_KEY); + if (!time) { + return defaultTime; + } + return time; + } +} + +export const timeHistory = new TimeHistory(); diff --git a/src/ui/public/timefilter/timefilter.js b/src/ui/public/timefilter/timefilter.js index 0e804066c90b0de..5a8b80afe0c87de 100644 --- a/src/ui/public/timefilter/timefilter.js +++ b/src/ui/public/timefilter/timefilter.js @@ -8,6 +8,7 @@ import { TimefilterLibDiffTimeProvider } from 'ui/timefilter/lib/diff_time'; import { TimefilterLibDiffIntervalProvider } from 'ui/timefilter/lib/diff_interval'; import uiRoutes from 'ui/routes'; import { uiModules } from 'ui/modules'; +import { timeHistory } from 'ui/timefilter/time_history'; uiRoutes .addSetupWork(function (timefilter) { @@ -36,8 +37,8 @@ uiModules self.isAutoRefreshSelectorEnabled = false; self.init = _.once(function () { - const timeDefaults = config.get('timepicker:timeDefaults'); - const refreshIntervalDefaults = config.get('timepicker:refreshIntervalDefaults'); + const timeDefaults = timeHistory.getTime(config.get('timepicker:timeDefaults')); + const refreshIntervalDefaults = timeHistory.getRefreshInterval(config.get('timepicker:refreshIntervalDefaults')); // These can be date math strings or moments. self.time = _.defaults(globalState.time || {}, timeDefaults); diff --git a/src/ui/public/timepicker/absolute_panel/kbn_timepicker_absolute_panel.html b/src/ui/public/timepicker/absolute_panel/kbn_timepicker_absolute_panel.html index e016b3042ad6fd4..65e0a92b1f48751 100644 --- a/src/ui/public/timepicker/absolute_panel/kbn_timepicker_absolute_panel.html +++ b/src/ui/public/timepicker/absolute_panel/kbn_timepicker_absolute_panel.html @@ -64,6 +64,20 @@
+