diff --git a/ts/WoltLabSuite/Core/Api/GridViews/GetRow.ts b/ts/WoltLabSuite/Core/Api/GridViews/GetRow.ts index 9e57ba1b5c..f1f0a4864d 100644 --- a/ts/WoltLabSuite/Core/Api/GridViews/GetRow.ts +++ b/ts/WoltLabSuite/Core/Api/GridViews/GetRow.ts @@ -17,11 +17,17 @@ type Response = { export async function getRow( gridViewClass: string, objectId: string | number, + filters?: Map, gridViewParameters?: Map, ): Promise { const url = new URL(`${window.WSC_RPC_API_URL}core/grid-views/row`); url.searchParams.set("gridView", gridViewClass); url.searchParams.set("objectID", objectId.toString()); + if (filters) { + filters.forEach((value, key) => { + url.searchParams.set(`filters[${key}]`, value); + }); + } if (gridViewParameters) { gridViewParameters.forEach((value, key) => { if (Array.isArray(value)) { diff --git a/ts/WoltLabSuite/Core/Api/ListViews/GetItem.ts b/ts/WoltLabSuite/Core/Api/ListViews/GetItem.ts index 9068f5021f..dfbb610137 100644 --- a/ts/WoltLabSuite/Core/Api/ListViews/GetItem.ts +++ b/ts/WoltLabSuite/Core/Api/ListViews/GetItem.ts @@ -17,11 +17,17 @@ type Response = { export async function getItem( listViewClass: string, objectId: string | number, + filters?: Map, listViewParameters?: Map, ): Promise { const url = new URL(`${window.WSC_RPC_API_URL}core/list-views/item`); url.searchParams.set("listView", listViewClass); url.searchParams.set("objectID", objectId.toString()); + if (filters) { + filters.forEach((value, key) => { + url.searchParams.set(`filters[${key}]`, value); + }); + } if (listViewParameters) { listViewParameters.forEach((value, key) => { if (Array.isArray(value)) { diff --git a/ts/WoltLabSuite/Core/Component/GridView.ts b/ts/WoltLabSuite/Core/Component/GridView.ts index 252278ed9c..fae0d55acc 100644 --- a/ts/WoltLabSuite/Core/Component/GridView.ts +++ b/ts/WoltLabSuite/Core/Component/GridView.ts @@ -67,11 +67,17 @@ export class GridView { } async #refreshRow(row: HTMLElement): Promise { - const { template } = await getRow(this.#gridClassName, row.dataset.objectId!, this.#gridViewParameters); + const { template } = await getRow( + this.#gridClassName, + row.dataset.objectId!, + this.#state.getActiveFilters(), + this.#gridViewParameters, + ); row.replaceWith(DomUtil.createFragmentFromHtml(template)); this.#state.refreshSelection(); DomChangeListener.trigger(); + this.#checkEmptyTable(); } #initInteractions(): void { diff --git a/ts/WoltLabSuite/Core/Component/ListView.ts b/ts/WoltLabSuite/Core/Component/ListView.ts index fc77d26662..bdcdd93331 100644 --- a/ts/WoltLabSuite/Core/Component/ListView.ts +++ b/ts/WoltLabSuite/Core/Component/ListView.ts @@ -71,10 +71,16 @@ export class ListView { } async #refreshItem(item: HTMLElement): Promise { - const { template } = await getItem(this.#viewClassName, item.dataset.objectId!, this.#listViewParameters); + const { template } = await getItem( + this.#viewClassName, + item.dataset.objectId!, + this.#state.getActiveFilters(), + this.#listViewParameters, + ); item.replaceWith(createFragmentFromHtml(template)); this.#state.refreshSelection(); triggerDomChange(); + this.#checkEmptyList(); } #initInteractions(): void { diff --git a/wcfsetup/install/files/js/WoltLabSuite/Core/Api/GridViews/GetRow.js b/wcfsetup/install/files/js/WoltLabSuite/Core/Api/GridViews/GetRow.js index 5121e7924c..42cb911982 100644 --- a/wcfsetup/install/files/js/WoltLabSuite/Core/Api/GridViews/GetRow.js +++ b/wcfsetup/install/files/js/WoltLabSuite/Core/Api/GridViews/GetRow.js @@ -10,10 +10,15 @@ define(["require", "exports", "WoltLabSuite/Core/Ajax/Backend", "../Result"], fu "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getRow = getRow; - async function getRow(gridViewClass, objectId, gridViewParameters) { + async function getRow(gridViewClass, objectId, filters, gridViewParameters) { const url = new URL(`${window.WSC_RPC_API_URL}core/grid-views/row`); url.searchParams.set("gridView", gridViewClass); url.searchParams.set("objectID", objectId.toString()); + if (filters) { + filters.forEach((value, key) => { + url.searchParams.set(`filters[${key}]`, value); + }); + } if (gridViewParameters) { gridViewParameters.forEach((value, key) => { if (Array.isArray(value)) { diff --git a/wcfsetup/install/files/js/WoltLabSuite/Core/Api/ListViews/GetItem.js b/wcfsetup/install/files/js/WoltLabSuite/Core/Api/ListViews/GetItem.js index 7887cd2d93..939f6bce03 100644 --- a/wcfsetup/install/files/js/WoltLabSuite/Core/Api/ListViews/GetItem.js +++ b/wcfsetup/install/files/js/WoltLabSuite/Core/Api/ListViews/GetItem.js @@ -10,10 +10,15 @@ define(["require", "exports", "WoltLabSuite/Core/Ajax/Backend", "../Result"], fu "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getItem = getItem; - async function getItem(listViewClass, objectId, listViewParameters) { + async function getItem(listViewClass, objectId, filters, listViewParameters) { const url = new URL(`${window.WSC_RPC_API_URL}core/list-views/item`); url.searchParams.set("listView", listViewClass); url.searchParams.set("objectID", objectId.toString()); + if (filters) { + filters.forEach((value, key) => { + url.searchParams.set(`filters[${key}]`, value); + }); + } if (listViewParameters) { listViewParameters.forEach((value, key) => { if (Array.isArray(value)) { diff --git a/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView.js b/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView.js index 305db65135..0231259938 100644 --- a/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView.js +++ b/wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView.js @@ -39,10 +39,11 @@ define(["require", "exports", "tslib", "../Api/GridViews/GetRow", "../Api/GridVi Listener_1.default.trigger(); } async #refreshRow(row) { - const { template } = await (0, GetRow_1.getRow)(this.#gridClassName, row.dataset.objectId, this.#gridViewParameters); + const { template } = await (0, GetRow_1.getRow)(this.#gridClassName, row.dataset.objectId, this.#state.getActiveFilters(), this.#gridViewParameters); row.replaceWith(Util_1.default.createFragmentFromHtml(template)); this.#state.refreshSelection(); Listener_1.default.trigger(); + this.#checkEmptyTable(); } #initInteractions() { (0, Selector_1.wheneverFirstSeen)(`#${this.#table.id} tbody tr`, (row) => { diff --git a/wcfsetup/install/files/js/WoltLabSuite/Core/Component/ListView.js b/wcfsetup/install/files/js/WoltLabSuite/Core/Component/ListView.js index 5736f97591..1c92a418db 100644 --- a/wcfsetup/install/files/js/WoltLabSuite/Core/Component/ListView.js +++ b/wcfsetup/install/files/js/WoltLabSuite/Core/Component/ListView.js @@ -41,10 +41,11 @@ define(["require", "exports", "tslib", "./ListView/State", "../Dom/Change/Listen (0, Listener_1.trigger)(); } async #refreshItem(item) { - const { template } = await (0, GetItem_1.getItem)(this.#viewClassName, item.dataset.objectId, this.#listViewParameters); + const { template } = await (0, GetItem_1.getItem)(this.#viewClassName, item.dataset.objectId, this.#state.getActiveFilters(), this.#listViewParameters); item.replaceWith((0, Util_1.createFragmentFromHtml)(template)); this.#state.refreshSelection(); (0, Listener_1.trigger)(); + this.#checkEmptyList(); } #initInteractions() { (0, Selector_1.wheneverFirstSeen)(`#${this.#viewElement.id} .listView__item`, (item) => { diff --git a/wcfsetup/install/files/lib/system/endpoint/controller/core/gridViews/GetRow.class.php b/wcfsetup/install/files/lib/system/endpoint/controller/core/gridViews/GetRow.class.php index ca96857fb6..5a9ff2c284 100644 --- a/wcfsetup/install/files/lib/system/endpoint/controller/core/gridViews/GetRow.class.php +++ b/wcfsetup/install/files/lib/system/endpoint/controller/core/gridViews/GetRow.class.php @@ -40,6 +40,10 @@ public function __invoke(ServerRequestInterface $request, array $variables): Res throw new PermissionDeniedException(); } + if ($parameters->filters !== []) { + $view->setActiveFilters($parameters->filters); + } + $view->setObjectIDFilter($parameters->objectID); return new JsonResponse([ @@ -55,6 +59,8 @@ public function __construct( /** @var non-empty-string */ public readonly string $gridView, public readonly string|int $objectID, + /** @var string[] */ + public readonly array $filters, /** @var array */ public readonly array $gridViewParameters, ) {} diff --git a/wcfsetup/install/files/lib/system/endpoint/controller/core/listViews/GetItem.class.php b/wcfsetup/install/files/lib/system/endpoint/controller/core/listViews/GetItem.class.php index 6f63a466f1..104ba45206 100644 --- a/wcfsetup/install/files/lib/system/endpoint/controller/core/listViews/GetItem.class.php +++ b/wcfsetup/install/files/lib/system/endpoint/controller/core/listViews/GetItem.class.php @@ -40,6 +40,10 @@ public function __invoke(ServerRequestInterface $request, array $variables): Res throw new PermissionDeniedException(); } + if ($parameters->filters !== []) { + $view->setActiveFilters($parameters->filters); + } + $view->setObjectIDFilter($parameters->objectID); return new JsonResponse([ @@ -55,6 +59,8 @@ public function __construct( /** @var non-empty-string */ public readonly string $listView, public readonly string|int $objectID, + /** @var string[] */ + public readonly array $filters, /** @var array */ public readonly array $listViewParameters, ) {}