diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue index a579316b3..f91f6878f 100644 --- a/src/components/MonitorList.vue +++ b/src/components/MonitorList.vue @@ -89,17 +89,11 @@ export default { }, data() { return { - searchText: "", selectMode: false, selectAll: false, disableSelectAllWatcher: false, selectedMonitors: {}, windowTop: 0, - filterState: { - status: null, - active: null, - tags: null, - } }; }, computed: { @@ -164,6 +158,59 @@ export default { return Object.keys(this.selectedMonitors).length; }, + /** + * Returns applied filters based on query params. + * @returns {{ status: number[], active: bool, tags: number[] }} The current filter state. + */ + filterState() { + // Since query params are always strings, convert them to the correct type + let status = this.$route.query["status"] || null; + if (status) { + if (!Array.isArray(status)) { + status = [ status ]; + } + status = status.map(Number); + } + // Casting to boolean does not work here as Boolean("false") === true + let active = this.$route.query["active"] || null; + if (active) { + if (!Array.isArray(active)) { + active = [ active ]; + } + active = active.map(val => val === "true"); + } + let tags = this.$route.query["tags"] || null; + if (tags) { + if (!Array.isArray(tags)) { + tags = [ tags ]; + } + tags = tags.map(Number); + } + return { + status, + active, + tags, + }; + }, + + searchText: { + get() { + return this.$route.query.searchText || ""; + }, + set(value) { + const newQuery = { + ...this.$route.query, + searchText: value, + }; + if (!value) { + delete newQuery.searchText; + } + this.$router.replace({ + query: newQuery, + }); + } + }, + /** * Determines if any filters are active. * @returns {boolean} True if any filter is active, false otherwise. @@ -239,11 +286,27 @@ export default { }, /** * Update the MonitorList Filter - * @param {object} newFilter Object with new filter + * @param {{ status: number[], active: bool, tags: number[] }} newFilter Object with new filter * @returns {void} */ updateFilter(newFilter) { - this.filterState = newFilter; + let newQuery = { + ...this.$route.query, + ...newFilter, + }; + if (!newFilter.status || newFilter.status.length === 0) { + delete newQuery.status; + } + if (!newFilter.active || newFilter.active.length === 0) { + delete newQuery.active; + } + if (!newFilter.tags || newFilter.tags.length === 0) { + delete newQuery.tags; + } + + this.$router.replace({ + query: newQuery, + }); }, /** * Deselect a monitor diff --git a/src/components/MonitorListFilter.vue b/src/components/MonitorListFilter.vue index 330efc9be..74b5fdf7e 100644 --- a/src/components/MonitorListFilter.vue +++ b/src/components/MonitorListFilter.vue @@ -118,8 +118,9 @@