diff options
author | Yoshie Muranaka <yoshiemuranaka@gmail.com> | 2020-06-22 19:14:05 +0300 |
---|---|---|
committer | Gunnar Mills <gmills@us.ibm.com> | 2020-07-17 04:09:00 +0300 |
commit | 0045400cf52a8ba34d24784d718ae69c3036302e (patch) | |
tree | bc0a70cee00fd2ebf4d7b94632bf726aa694fb7f /src | |
parent | b93608db49fa40f4e7ad742e4aa285d106caf117 (diff) | |
download | webui-vue-0045400cf52a8ba34d24784d718ae69c3036302e.tar.xz |
Refactor global TableFilter component and mixin
Add key property to TableFilter component to make sure filtering
is based on specific row property. Previously, the table filter
was checking all row properties for matches.
Signed-off-by: Yoshie Muranaka <yoshiemuranaka@gmail.com>
Change-Id: I589886a0d487ac3ab8def585cc7286e61992afdb
Diffstat (limited to 'src')
-rw-r--r-- | src/components/Global/TableFilter.vue | 65 | ||||
-rw-r--r-- | src/components/Mixins/TableFilterMixin.js | 16 | ||||
-rw-r--r-- | src/views/Health/EventLogs/EventLogs.vue | 1 | ||||
-rw-r--r-- | src/views/Health/Sensors/Sensors.vue | 1 |
4 files changed, 66 insertions, 17 deletions
diff --git a/src/components/Global/TableFilter.vue b/src/components/Global/TableFilter.vue index 8d264fb4..f2167a06 100644 --- a/src/components/Global/TableFilter.vue +++ b/src/components/Global/TableFilter.vue @@ -6,7 +6,7 @@ <b-button-close :disabled="dropdownVisible" :aria-hidden="true" - @click="removeTag(index)" + @click="removeTag(tag)" /> </b-badge> </p> @@ -21,13 +21,21 @@ <icon-filter /> {{ $t('global.action.filter') }} </template> - <b-dropdown-form @change="onChange"> + <b-dropdown-form> <b-form-group v-for="(filter, index) of filters" :key="index" :label="filter.label" > - <b-form-checkbox-group v-model="tags" :options="filter.values"> + <b-form-checkbox-group v-model="tags"> + <b-form-checkbox + v-for="value in filter.values" + :key="value" + :value="value" + @change="onChange($event, { filter, value })" + > + {{ value }} + </b-form-checkbox> </b-form-checkbox-group> </b-form-group> </b-dropdown-form> @@ -50,33 +58,66 @@ export default { default: () => [], validator: prop => { return prop.every( - filter => - filter.hasOwnProperty('label') && filter.hasOwnProperty('values') + filter => 'label' in filter && 'values' in filter && 'key' in filter ); } } }, data() { return { - tags: [], - dropdownVisible: false + dropdownVisible: false, + activeFilters: this.filters.map(({ key }) => { + return { + key, + values: [] + }; + }) }; }, + computed: { + tags: { + get() { + return this.activeFilters.reduce((arr, filter) => { + return [...arr, ...filter.values]; + }, []); + }, + set(value) { + return value; + } + } + }, methods: { - removeTag(index) { - this.tags = this.tags.filter((_, i) => i !== index); + removeTag(tag) { + this.activeFilters.forEach(filter => { + filter.values = filter.values.filter(val => val !== tag); + }); this.emitChange(); }, clearAllTags() { - this.tags = []; + this.activeFilters.forEach(filter => { + filter.values = []; + }); this.emitChange(); }, emitChange() { this.$emit('filterChange', { - activeFilters: this.tags + activeFilters: this.activeFilters }); }, - onChange() { + onChange( + checked, + { + filter: { key }, + value + } + ) { + this.activeFilters.forEach(filter => { + if (filter.key === key) { + checked + ? filter.values.push(value) + : (filter.values = filter.values.filter(val => val !== value)); + } + }); this.emitChange(); } } diff --git a/src/components/Mixins/TableFilterMixin.js b/src/components/Mixins/TableFilterMixin.js index 58e70c57..7cb7007d 100644 --- a/src/components/Mixins/TableFilterMixin.js +++ b/src/components/Mixins/TableFilterMixin.js @@ -3,13 +3,19 @@ import { includes } from 'lodash'; const TableFilterMixin = { methods: { getFilteredTableData(tableData = [], filters = []) { - if (filters.length === 0) return tableData; - // will return all items that match - // any of the filter tags (not all) + const filterItems = filters.reduce((arr, filter) => { + return [...arr, ...filter.values]; + }, []); + // If no filters are active, then return all table data + if (filterItems.length === 0) return tableData; + + // Check if row property value is included in list of + // active filters return tableData.filter(row => { let returnRow = false; - for (const filter of filters) { - if (includes(row, filter)) { + for (const { key, values } of filters) { + const rowProperty = row[key]; + if (rowProperty && includes(values, rowProperty)) { returnRow = true; break; } diff --git a/src/views/Health/EventLogs/EventLogs.vue b/src/views/Health/EventLogs/EventLogs.vue index f1c76164..87dcad5d 100644 --- a/src/views/Health/EventLogs/EventLogs.vue +++ b/src/views/Health/EventLogs/EventLogs.vue @@ -218,6 +218,7 @@ export default { ], tableFilters: [ { + key: 'severity', label: this.$t('pageEventLogs.table.severity'), values: ['OK', 'Warning', 'Critical'] } diff --git a/src/views/Health/Sensors/Sensors.vue b/src/views/Health/Sensors/Sensors.vue index 879e2363..7ff5e64c 100644 --- a/src/views/Health/Sensors/Sensors.vue +++ b/src/views/Health/Sensors/Sensors.vue @@ -159,6 +159,7 @@ export default { ], tableFilters: [ { + key: 'status', label: this.$t('pageSensors.table.status'), values: ['OK', 'Warning', 'Critical'] } |