Skip to content

Commit dbf86b9

Browse files
committed
Implement usingGridView() to create an dialog with a grid view as content
1 parent 82415aa commit dbf86b9

File tree

6 files changed

+207
-1
lines changed

6 files changed

+207
-1
lines changed

ts/WoltLabSuite/Core/Component/Dialog/Setup.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import DialogControls from "./Controls";
1212
import * as DomUtil from "../../Dom/Util";
1313
import FormBuilderSetup from "../FormBuilder/Setup";
14+
import { GridViewSetup } from "WoltLabSuite/Core/Component/GridView/Setup";
1415

1516
export class DialogSetup {
1617
fromElement(element: HTMLElement | DocumentFragment): DialogControls {
@@ -51,6 +52,10 @@ export class DialogSetup {
5152
return new FormBuilderSetup();
5253
}
5354

55+
usingGridView(): GridViewSetup {
56+
return new GridViewSetup();
57+
}
58+
5459
withoutContent(): DialogControls {
5560
const dialog = document.createElement("woltlab-core-dialog");
5661

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* @author Olaf Braun
3+
* @copyright 2001-2025 WoltLab GmbH
4+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
5+
* @since 6.2
6+
*/
7+
8+
import { dialogFactory } from "WoltLabSuite/Core/Component/Dialog";
9+
import { prepareRequest } from "WoltLabSuite/Core/Ajax/Backend";
10+
import WoltlabCoreDialog from "WoltLabSuite/Core/Element/woltlab-core-dialog";
11+
12+
interface ResponseGridView {
13+
gridView: string;
14+
}
15+
16+
export class GridViewSetup {
17+
async fromGridView(
18+
title: string,
19+
gridViewClass: string,
20+
pageNo: number = 1,
21+
sortField: string = "",
22+
sortOrder: string = "ASC",
23+
filters?: Map<string, string>,
24+
gridViewParameters?: Map<string, string>,
25+
): Promise<WoltlabCoreDialog> {
26+
const url = new URL(`${window.WSC_RPC_API_URL}core/grid-views/render`);
27+
url.searchParams.set("gridView", gridViewClass);
28+
url.searchParams.set("pageNo", pageNo.toString());
29+
url.searchParams.set("sortField", sortField);
30+
url.searchParams.set("sortOrder", sortOrder);
31+
if (filters) {
32+
filters.forEach((value, key) => {
33+
url.searchParams.set(`filters[${key}]`, value);
34+
});
35+
}
36+
if (gridViewParameters) {
37+
gridViewParameters.forEach((value, key) => {
38+
url.searchParams.set(`gridViewParameters[${key}]`, value);
39+
});
40+
}
41+
const json = (await prepareRequest(url).get().fetchAsJson()) as ResponseGridView;
42+
43+
// Prevents a circular dependency.
44+
const { dialogFactory } = await import("../Dialog");
45+
46+
const dialog = dialogFactory().fromHtml(json.gridView).withoutControls();
47+
dialog.show(title);
48+
49+
return dialog;
50+
}
51+
}

wcfsetup/install/files/js/WoltLabSuite/Core/Component/Dialog/Setup.js

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wcfsetup/install/files/js/WoltLabSuite/Core/Component/GridView/Setup.js

Lines changed: 70 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wcfsetup/install/files/lib/bootstrap/com.woltlab.wcf.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
138138
$event->register(new \wcf\system\endpoint\controller\core\comments\responses\UpdateResponse());
139139
$event->register(new \wcf\system\endpoint\controller\core\exceptions\RenderException());
140140
$event->register(new \wcf\system\endpoint\controller\core\gridViews\GetRows());
141+
$event->register(new \wcf\system\endpoint\controller\core\gridViews\GetGridView());
141142
$event->register(new \wcf\system\endpoint\controller\core\gridViews\GetRow());
142143
$event->register(new \wcf\system\endpoint\controller\core\cronjobs\logs\ClearLogs());
143144
$event->register(new \wcf\system\endpoint\controller\core\messages\GetMentionSuggestions());
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
namespace wcf\system\endpoint\controller\core\gridViews;
4+
5+
use Laminas\Diactoros\Response\JsonResponse;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\ServerRequestInterface;
8+
use wcf\http\Helper;
9+
use wcf\system\endpoint\GetRequest;
10+
use wcf\system\endpoint\IController;
11+
use wcf\system\exception\PermissionDeniedException;
12+
use wcf\system\exception\UserInputException;
13+
use wcf\system\gridView\AbstractGridView;
14+
15+
/**
16+
* API endpoint to render the grid view
17+
*
18+
* @author Olaf Braun
19+
* @copyright 2001-2025 WoltLab GmbH
20+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
21+
* @since 6.2
22+
*/
23+
#[GetRequest('/core/grid-views/render')]
24+
final class GetGridView implements IController
25+
{
26+
#[\Override]
27+
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
28+
{
29+
$parameters = Helper::mapApiParameters($request, GetGridViewParameters::class);
30+
31+
if (!\is_subclass_of($parameters->gridView, AbstractGridView::class)) {
32+
throw new UserInputException('gridView', 'invalid');
33+
}
34+
35+
$view = new $parameters->gridView(...$parameters->gridViewParameters);
36+
// @phpstan-ignore function.alreadyNarrowedType, instanceof.alwaysTrue
37+
\assert($view instanceof AbstractGridView);
38+
39+
if (!$view->isAccessible()) {
40+
throw new PermissionDeniedException();
41+
}
42+
43+
$view->setPageNo($parameters->pageNo);
44+
if ($parameters->sortField) {
45+
$view->setSortField($parameters->sortField);
46+
}
47+
if ($parameters->sortOrder) {
48+
$view->setSortOrder($parameters->sortOrder);
49+
}
50+
51+
if ($parameters->filters !== []) {
52+
$view->setActiveFilters($parameters->filters);
53+
}
54+
55+
return new JsonResponse([
56+
'gridView' => $view->render(),
57+
]);
58+
}
59+
}
60+
61+
/** @internal */
62+
final class GetGridViewParameters
63+
{
64+
public function __construct(
65+
/** @var non-empty-string */
66+
public readonly string $gridView,
67+
public readonly int $pageNo,
68+
public readonly string $sortField,
69+
public readonly string $sortOrder,
70+
/** @var string[] */
71+
public readonly array $filters,
72+
/** @var string[] */
73+
public readonly array $gridViewParameters,
74+
) {
75+
}
76+
}

0 commit comments

Comments
 (0)