diff --git a/ts/WoltLabSuite/Core/Component/GridView.ts b/ts/WoltLabSuite/Core/Component/GridView.ts index 78e4b71dc6..01fbb01858 100644 --- a/ts/WoltLabSuite/Core/Component/GridView.ts +++ b/ts/WoltLabSuite/Core/Component/GridView.ts @@ -109,9 +109,9 @@ export class GridView { parameters.push(parameter); } - this.#filter.getActiveFilters().forEach((value, key) => { - parameters.push([`filters[${key}]`, value]); - }); + for (const parameter of this.#filter.getQueryParameters()) { + parameters.push(parameter); + } if (parameters.length > 0) { url.search += url.search !== "" ? "&" : "?"; @@ -145,7 +145,6 @@ export class GridView { #handlePopState(): void { let pageNo = 1; - this.#filter.resetFilters(); const url = new URL(window.location.href); url.searchParams.forEach((value, key) => { @@ -153,13 +152,9 @@ export class GridView { pageNo = parseInt(value, 10); return; } - - const matches = key.match(/^filters\[([a-z0-9_]+)\]$/i); - if (matches) { - this.#filter.setFilter(matches[1], value); - } }); + this.#filter.updateFromSearchParams(url.searchParams); this.#sorting.updateFromSearchParams(url.searchParams); this.#switchPage(pageNo, false); diff --git a/ts/WoltLabSuite/Core/Component/GridView/Filter.ts b/ts/WoltLabSuite/Core/Component/GridView/Filter.ts index bfd111f89a..4992699527 100644 --- a/ts/WoltLabSuite/Core/Component/GridView/Filter.ts +++ b/ts/WoltLabSuite/Core/Component/GridView/Filter.ts @@ -16,16 +16,29 @@ export class Filter extends EventTarget { this.#setupEventListeners(); } - resetFilters(): void { - this.#filters.clear(); + getActiveFilters(): Map { + return new Map(this.#filters); } - setFilter(key: string, value: string): void { - this.#filters.set(key, value); + getQueryParameters(): [string, string][] { + const parameters: [string, string][] = []; + + for (const [key, value] of this.#filters.entries()) { + parameters.push([`filters[${key}]`, value]); + } + + return parameters; } - getActiveFilters(): Map { - return new Map(this.#filters); + updateFromSearchParams(params: URLSearchParams): void { + this.#filters.clear(); + + params.forEach((value, key) => { + const matches = key.match(/^filters\[([a-z0-9_]+)\]$/i); + if (matches) { + this.#filters.set(matches[1], value); + } + }); } setFilterLabels(labels: ArrayLike): void { diff --git a/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView.js b/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView.js index 6a1efd1684..b6ef25ff9a 100644 --- a/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView.js +++ b/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView.js @@ -73,9 +73,9 @@ define(["require", "exports", "tslib", "../Api/Gridviews/GetRow", "../Api/Gridvi for (const parameter of this.#sorting.getQueryParameters()) { parameters.push(parameter); } - this.#filter.getActiveFilters().forEach((value, key) => { - parameters.push([`filters[${key}]`, value]); - }); + for (const parameter of this.#filter.getQueryParameters()) { + parameters.push(parameter); + } if (parameters.length > 0) { url.search += url.search !== "" ? "&" : "?"; url.search += new URLSearchParams(parameters).toString(); @@ -102,18 +102,14 @@ define(["require", "exports", "tslib", "../Api/Gridviews/GetRow", "../Api/Gridvi } #handlePopState() { let pageNo = 1; - this.#filter.resetFilters(); const url = new URL(window.location.href); url.searchParams.forEach((value, key) => { if (key === "pageNo") { pageNo = parseInt(value, 10); return; } - const matches = key.match(/^filters\[([a-z0-9_]+)\]$/i); - if (matches) { - this.#filter.setFilter(matches[1], value); - } }); + this.#filter.updateFromSearchParams(url.searchParams); this.#sorting.updateFromSearchParams(url.searchParams); this.#switchPage(pageNo, false); } diff --git a/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView/Filter.js b/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView/Filter.js index 30680efb9f..a140be5528 100644 --- a/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView/Filter.js +++ b/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView/Filter.js @@ -13,15 +13,25 @@ define(["require", "exports", "../../Helper/PromiseMutex", "../Dialog"], functio this.#filterPills = document.getElementById(`${gridId}_filters`); this.#setupEventListeners(); } - resetFilters() { - this.#filters.clear(); - } - setFilter(key, value) { - this.#filters.set(key, value); - } getActiveFilters() { return new Map(this.#filters); } + getQueryParameters() { + const parameters = []; + for (const [key, value] of this.#filters.entries()) { + parameters.push([`filters[${key}]`, value]); + } + return parameters; + } + updateFromSearchParams(params) { + this.#filters.clear(); + params.forEach((value, key) => { + const matches = key.match(/^filters\[([a-z0-9_]+)\]$/i); + if (matches) { + this.#filters.set(matches[1], value); + } + }); + } setFilterLabels(labels) { if (this.#filterPills === null) { return;