From 68bbba296c6f99b81d2882e1fef6f37cf4a6bb51 Mon Sep 17 00:00:00 2001 From: Yoshie Muranaka Date: Mon, 18 May 2020 09:49:37 -0700 Subject: Add date filter on Event logs page Created global TableDateFilter component that uses the BootstrapVue Datepicker with a native text input. This will allow users to manually enter a date in ISO format or use the Bootstrap calendar dropdown. Storing language preference from Login to use locale prop on BootstrapVue Datepicker component. Signed-off-by: Yoshie Muranaka Change-Id: I66de9fb04451572c9a90f90d8522934b6204aed2 --- src/assets/styles/_obmc-custom.scss | 1 + .../vendor-overrides/bootstrap-vue/_calendar.scss | 8 + .../vendor-overrides/bootstrap-vue/_index.scss | 1 + src/components/Global/TableDateFilter.vue | 176 +++++++++++++++++++++ src/components/Mixins/TableFilterMixin.js | 19 +++ src/locales/en-US.json | 8 + src/main.js | 2 + src/store/modules/GlobalStore.js | 10 +- src/views/Health/EventLogs/EventLogs.vue | 42 +++-- src/views/Login/Login.vue | 5 +- 10 files changed, 254 insertions(+), 18 deletions(-) create mode 100644 src/assets/styles/vendor-overrides/bootstrap-vue/_calendar.scss create mode 100644 src/assets/styles/vendor-overrides/bootstrap-vue/_index.scss create mode 100644 src/components/Global/TableDateFilter.vue (limited to 'src') diff --git a/src/assets/styles/_obmc-custom.scss b/src/assets/styles/_obmc-custom.scss index f443799f..63bed23f 100644 --- a/src/assets/styles/_obmc-custom.scss +++ b/src/assets/styles/_obmc-custom.scss @@ -18,3 +18,4 @@ // Vendor overrides must be the last file imported @import "./vendor-overrides/bootstrap/index"; +@import "./vendor-overrides/bootstrap-vue/index"; diff --git a/src/assets/styles/vendor-overrides/bootstrap-vue/_calendar.scss b/src/assets/styles/vendor-overrides/bootstrap-vue/_calendar.scss new file mode 100644 index 00000000..bf7572e2 --- /dev/null +++ b/src/assets/styles/vendor-overrides/bootstrap-vue/_calendar.scss @@ -0,0 +1,8 @@ +.b-calendar-nav { + .btn { + &:hover { + background: none; + color: $dark; + } + } +} \ No newline at end of file diff --git a/src/assets/styles/vendor-overrides/bootstrap-vue/_index.scss b/src/assets/styles/vendor-overrides/bootstrap-vue/_index.scss new file mode 100644 index 00000000..a6658148 --- /dev/null +++ b/src/assets/styles/vendor-overrides/bootstrap-vue/_index.scss @@ -0,0 +1 @@ +@import "./calendar"; diff --git a/src/components/Global/TableDateFilter.vue b/src/components/Global/TableDateFilter.vue new file mode 100644 index 00000000..e73d7d51 --- /dev/null +++ b/src/components/Global/TableDateFilter.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/src/components/Mixins/TableFilterMixin.js b/src/components/Mixins/TableFilterMixin.js index 25c7497a..58e70c57 100644 --- a/src/components/Mixins/TableFilterMixin.js +++ b/src/components/Mixins/TableFilterMixin.js @@ -16,6 +16,25 @@ const TableFilterMixin = { } return returnRow; }); + }, + getFilteredTableDataByDate( + tableData = [], + startDate, + endDate, + propertyKey = 'date' + ) { + if (!startDate && !endDate) return tableData; + const startDateInMs = startDate ? startDate.getTime() : 0; + const endDateInMs = endDate + ? endDate.getTime() + : Number.POSITIVE_INFINITY; + return tableData.filter(row => { + const date = row[propertyKey]; + if (!(date instanceof Date)) return; + + const dateInMs = date.getTime(); + if (dateInMs >= startDateInMs && dateInMs <= endDateInMs) return row; + }); } } }; diff --git a/src/locales/en-US.json b/src/locales/en-US.json index 9fc64d0b..8a722e39 100644 --- a/src/locales/en-US.json +++ b/src/locales/en-US.json @@ -22,7 +22,13 @@ "showPassword": "Show password as plain text. Note: this will visually expose your password on the screen.", "tooltip": "Tooltip" }, + "calendar": { + "openDatePicker": "Open date picker", + "useCursorKeysToNavigateCalendarDates" : "Use cursor keys to navigate calendar dates" + }, "form": { + "dateMustBeAfter": "Date must be after %{date}", + "dateMustBeBefore": "Date must be before %{date}", "fieldRequired": "Field required", "invalidFormat": "Invalid format", "invalidValue": "Invalid value", @@ -46,7 +52,9 @@ "informational": "Informational" }, "table": { + "fromDate": "From date", "itemsPerPage": "Items per page", + "toDate": "To date", "viewAll": "View all" } }, diff --git a/src/main.js b/src/main.js index 6896ec2f..0c6d5b07 100644 --- a/src/main.js +++ b/src/main.js @@ -11,6 +11,7 @@ import { DropdownPlugin, FormPlugin, FormCheckboxPlugin, + FormDatepickerPlugin, FormFilePlugin, FormGroupPlugin, FormInputPlugin, @@ -74,6 +75,7 @@ Vue.use(CollapsePlugin); Vue.use(DropdownPlugin); Vue.use(FormPlugin); Vue.use(FormCheckboxPlugin); +Vue.use(FormDatepickerPlugin); Vue.use(FormFilePlugin); Vue.use(FormGroupPlugin); Vue.use(FormInputPlugin); diff --git a/src/store/modules/GlobalStore.js b/src/store/modules/GlobalStore.js index 1327422a..42e9e2bf 100644 --- a/src/store/modules/GlobalStore.js +++ b/src/store/modules/GlobalStore.js @@ -30,16 +30,20 @@ const GlobalStore = { namespaced: true, state: { bmcTime: null, - hostStatus: 'unreachable' + hostStatus: 'unreachable', + languagePreference: localStorage.getItem('storedLanguage') || 'en-US' }, getters: { hostStatus: state => state.hostStatus, - bmcTime: state => state.bmcTime + bmcTime: state => state.bmcTime, + languagePreference: state => state.languagePreference }, mutations: { setBmcTime: (state, bmcTime) => (state.bmcTime = bmcTime), setHostStatus: (state, hostState) => - (state.hostStatus = hostStateMapper(hostState)) + (state.hostStatus = hostStateMapper(hostState)), + setLanguagePreference: (state, language) => + (state.languagePreference = language) }, actions: { async getBmcTime({ commit }) { diff --git a/src/views/Health/EventLogs/EventLogs.vue b/src/views/Health/EventLogs/EventLogs.vue index a5ef3757..44a24859 100644 --- a/src/views/Health/EventLogs/EventLogs.vue +++ b/src/views/Health/EventLogs/EventLogs.vue @@ -1,6 +1,11 @@