summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/components/Global/TableFilter.vue65
-rw-r--r--src/components/Mixins/TableFilterMixin.js16
-rw-r--r--src/views/Health/EventLogs/EventLogs.vue1
-rw-r--r--src/views/Health/Sensors/Sensors.vue1
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']
}