Skip to content

Commit 8943476

Browse files
authored
Merge pull request #6189 from WoltLab/6.2-bbcode-list-to-grid-view
Migrate `BBCodeListPage` ot grid view
2 parents 1f1ca86 + 797505f commit 8943476

File tree

8 files changed

+233
-85
lines changed

8 files changed

+233
-85
lines changed

wcfsetup/install/files/acp/templates/bbcodeList.tpl

Lines changed: 4 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<header class="contentHeader">
44
<div class="contentHeaderTitle">
5-
<h1 class="contentTitle">{lang}wcf.acp.bbcode.list{/lang}{if $items} <span class="badge badgeInverse">{#$items}</span>{/if}</h1>
5+
<h1 class="contentTitle">{lang}wcf.acp.bbcode.list{/lang} <span class="badge badgeInverse">{#$gridView->countRows()}</span></h1>
66
</div>
77

88
<nav class="contentHeaderNavigation">
@@ -14,68 +14,8 @@
1414
</nav>
1515
</header>
1616

17-
{hascontent}
18-
<div class="paginationTop">
19-
{content}{pages print=true assign=pagesLinks controller="BBCodeList" link="pageNo=%d&sortField=$sortField&sortOrder=$sortOrder"}{/content}
20-
</div>
21-
{/hascontent}
22-
23-
{if $objects|count}
24-
<div class="section tabularBox">
25-
<table class="table jsObjectActionContainer" data-object-action-class-name="wcf\data\bbcode\BBCodeAction">
26-
<thead>
27-
<tr>
28-
<th class="columnID columnBBCodeID{if $sortField == 'bbcodeID'} active {@$sortOrder}{/if}" colspan="2"><a href="{link controller='BBCodeList'}pageNo={@$pageNo}&sortField=bbcodeID&sortOrder={if $sortField == 'bbcodeID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
29-
<th class="columnTitle columnBBCode{if $sortField == 'bbcodeTag'} active {@$sortOrder}{/if}"><a href="{link controller='BBCodeList'}pageNo={@$pageNo}&sortField=bbcodeTag&sortOrder={if $sortField == 'bbcodeTag' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.bbcode.bbcodeTag{/lang}</a></th>
30-
<th class="columnText columnClassName{if $sortField == 'className'} active {@$sortOrder}{/if}"><a href="{link controller='BBCodeList'}pageNo={@$pageNo}&sortField=className&sortOrder={if $sortField == 'className' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.bbcode.className{/lang}</a></th>
31-
32-
{event name='columnHeads'}
33-
</tr>
34-
</thead>
35-
36-
<tbody class="jsReloadPageWhenEmpty">
37-
{foreach from=$objects item=bbcode}
38-
<tr class="jsBBCodeRow jsObjectActionObject" data-object-id="{@$bbcode->getObjectID()}">
39-
<td class="columnIcon">
40-
<a href="{link controller='BBCodeEdit' object=$bbcode}{/link}" title="{lang}wcf.global.button.edit{/lang}" class="jsTooltip">{icon name='pencil'}</a>
41-
{if $bbcode->canDelete()}
42-
{objectAction action="delete" objectTitle=$bbcode->getTitle()}
43-
{else}
44-
<span class="disabled" title="{lang}wcf.global.button.delete{/lang}">
45-
{icon name='xmark'}
46-
</span>
47-
{/if}
48-
49-
{event name='rowButtons'}
50-
</td>
51-
<td class="columnID">{@$bbcode->bbcodeID}</td>
52-
<td class="columnTitle columnBBCode"><a href="{link controller='BBCodeEdit' object=$bbcode}{/link}">[{$bbcode->bbcodeTag}]</a></td>
53-
<td class="columnText columnClassName">{$bbcode->className}</td>
54-
55-
{event name='columns'}
56-
</tr>
57-
{/foreach}
58-
</tbody>
59-
</table>
60-
</div>
61-
62-
<footer class="contentFooter">
63-
{hascontent}
64-
<div class="paginationBottom">
65-
{content}{@$pagesLinks}{/content}
66-
</div>
67-
{/hascontent}
68-
69-
<nav class="contentFooterNavigation">
70-
<ul>
71-
<li><a href="{link controller='BBCodeAdd'}{/link}" class="button">{icon name='plus'} <span>{lang}wcf.acp.bbcode.add{/lang}</span></a></li>
72-
73-
{event name='contentFooterNavigation'}
74-
</ul>
75-
</nav>
76-
</footer>
77-
{else}
78-
<woltlab-core-notice type="info">{lang}wcf.global.noItems{/lang}</woltlab-core-notice>
79-
{/if}
17+
<div class="section">
18+
{unsafe:$gridView->render()}
19+
</div>
8020

8121
{include file='footer'}

wcfsetup/install/files/lib/acp/page/BBCodeListPage.class.php

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,39 @@
22

33
namespace wcf\acp\page;
44

5-
use wcf\data\bbcode\BBCodeList;
6-
use wcf\page\SortablePage;
5+
use wcf\page\AbstractGridViewPage;
6+
use wcf\system\gridView\AbstractGridView;
7+
use wcf\system\gridView\admin\BBCodeGridView;
78

89
/**
910
* Lists the available BBCodes.
1011
*
11-
* @author Tim Duesterhus
12-
* @copyright 2001-2019 WoltLab GmbH
13-
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
12+
* @author Olaf Braun, Tim Duesterhus
13+
* @copyright 2001-2025 WoltLab GmbH
14+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1415
*
15-
* @property BBCodeList $objectList
16+
* @property BBCodeGridView $gridView
1617
*/
17-
class BBCodeListPage extends SortablePage
18+
class BBCodeListPage extends AbstractGridViewPage
1819
{
1920
/**
2021
* @inheritDoc
2122
*/
2223
public $activeMenuItem = 'wcf.acp.menu.link.bbcode.list';
2324

24-
/**
25-
* @inheritDoc
26-
*/
27-
public $defaultSortField = 'bbcodeTag';
28-
2925
/**
3026
* @inheritDoc
3127
*/
3228
public $neededPermissions = ['admin.content.bbcode.canManageBBCode'];
3329

34-
/**
35-
* @inheritDoc
36-
*/
37-
public $objectListClassName = BBCodeList::class;
38-
3930
/**
4031
* @inheritDoc
4132
*/
4233
public $templateName = 'bbcodeList';
4334

44-
/**
45-
* @inheritDoc
46-
*/
47-
public $validSortFields = ['bbcodeID', 'bbcodeTag', 'className'];
35+
#[\Override]
36+
public function createGridViewController(): AbstractGridView
37+
{
38+
return new BBCodeGridView();
39+
}
4840
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
175175
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\DeleteProvider());
176176
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\DisableProvider());
177177
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\EnableProvider());
178+
$event->register(new \wcf\system\endpoint\controller\core\bbCodes\DeleteBBCodes());
178179
}
179180
);
180181

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace wcf\event\gridView\admin;
4+
5+
use wcf\event\IPsr14Event;
6+
use wcf\system\gridView\admin\BBCodeGridView;
7+
8+
/**
9+
* Indicates that the bb codes grid view has been initialized.
10+
*
11+
* @author Olaf Braun
12+
* @copyright 2001-2025 WoltLab GmbH
13+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14+
* @since 6.2
15+
*/
16+
final class BBCodeGridViewInitialized implements IPsr14Event
17+
{
18+
public function __construct(public readonly BBCodeGridView $gridView)
19+
{
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace wcf\event\interaction\admin;
4+
5+
use wcf\event\IPsr14Event;
6+
use wcf\system\interaction\admin\BBCodeInteractions;
7+
8+
/**
9+
* Indicates that the provider for bb codes is collecting interactions.
10+
*
11+
* @author Olaf Braun
12+
* @copyright 2001-2025 WoltLab GmbH
13+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14+
* @since 6.2
15+
*/
16+
final class BBCodeInteractionCollecting implements IPsr14Event
17+
{
18+
public function __construct(public readonly BBCodeInteractions $provider)
19+
{
20+
}
21+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace wcf\system\endpoint\controller\core\bbCodes;
4+
5+
use Laminas\Diactoros\Response\JsonResponse;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\ServerRequestInterface;
8+
use wcf\data\bbcode\BBCode;
9+
use wcf\data\bbcode\BBCodeAction;
10+
use wcf\http\Helper;
11+
use wcf\system\endpoint\DeleteRequest;
12+
use wcf\system\endpoint\IController;
13+
use wcf\system\exception\PermissionDeniedException;
14+
use wcf\system\WCF;
15+
16+
/**
17+
* API endpoint for deleting bb codes.
18+
*
19+
* @author Olaf Braun
20+
* @copyright 2001-2025 WoltLab GmbH
21+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
22+
* @since 6.2
23+
*/
24+
#[DeleteRequest('/core/bbcodes/{id:\d+}')]
25+
final class DeleteBBCodes implements IController
26+
{
27+
#[\Override]
28+
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
29+
{
30+
$bbCode = Helper::fetchObjectFromRequestParameter($variables['id'], BBCode::class);
31+
32+
$this->assertBBCodeCanBeDeleted($bbCode);
33+
34+
(new BBCodeAction([$bbCode], 'delete'))->executeAction();
35+
36+
return new JsonResponse([]);
37+
}
38+
39+
private function assertBBCodeCanBeDeleted(BBCode $bbcode): void
40+
{
41+
if (!WCF::getSession()->getPermission("admin.content.bbcode.canManageBBCode")) {
42+
throw new PermissionDeniedException();
43+
}
44+
45+
if (!$bbcode->canDelete()) {
46+
throw new PermissionDeniedException();
47+
}
48+
}
49+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
namespace wcf\system\gridView\admin;
4+
5+
use wcf\acp\form\BBCodeEditForm;
6+
use wcf\data\bbcode\BBCodeList;
7+
use wcf\data\DatabaseObject;
8+
use wcf\data\DatabaseObjectList;
9+
use wcf\event\gridView\admin\BBCodeGridViewInitialized;
10+
use wcf\event\IPsr14Event;
11+
use wcf\system\gridView\AbstractGridView;
12+
use wcf\system\gridView\filter\TextFilter;
13+
use wcf\system\gridView\GridViewColumn;
14+
use wcf\system\gridView\GridViewRowLink;
15+
use wcf\system\gridView\renderer\AbstractColumnRenderer;
16+
use wcf\system\gridView\renderer\ObjectIdColumnRenderer;
17+
use wcf\system\interaction\admin\BBCodeInteractions;
18+
use wcf\system\interaction\Divider;
19+
use wcf\system\interaction\EditInteraction;
20+
use wcf\system\WCF;
21+
22+
/**
23+
* Grid view for the list of bb codes.
24+
*
25+
* @author Olaf Braun
26+
* @copyright 2001-2025 WoltLab GmbH
27+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
28+
* @since 6.2
29+
*/
30+
final class BBCodeGridView extends AbstractGridView
31+
{
32+
public function __construct()
33+
{
34+
$this->addColumns([
35+
GridViewColumn::for('bbcodeID')
36+
->label('wcf.global.objectID')
37+
->renderer(new ObjectIdColumnRenderer())
38+
->sortable(),
39+
GridViewColumn::for('bbcodeTag')
40+
->label('wcf.acp.bbcode.bbcodeTag')
41+
->filter(new TextFilter())
42+
->titleColumn()
43+
->renderer(
44+
new class extends AbstractColumnRenderer {
45+
#[\Override]
46+
public function render(mixed $value, DatabaseObject $row): string
47+
{
48+
return \sprintf('[%s]', $value);
49+
}
50+
}
51+
)
52+
->sortable(),
53+
GridViewColumn::for('className')
54+
->label('wcf.acp.bbcode.className')
55+
->filter(new TextFilter())
56+
->sortable(),
57+
]);
58+
59+
$provider = new BBCodeInteractions();
60+
$provider->addInteractions([
61+
new Divider(),
62+
new EditInteraction(BBCodeEditForm::class)
63+
]);
64+
$this->setInteractionProvider($provider);
65+
66+
$this->setSortField('bbcodeTag');
67+
$this->addRowLink(new GridViewRowLink(BBCodeEditForm::class));
68+
}
69+
70+
#[\Override]
71+
public function isAccessible(): bool
72+
{
73+
return WCF::getSession()->getPermission('admin.content.bbcode.canManageBBCode');
74+
}
75+
76+
#[\Override]
77+
protected function createObjectList(): DatabaseObjectList
78+
{
79+
return new BBCodeList();
80+
}
81+
82+
#[\Override]
83+
protected function getInitializedEvent(): ?IPsr14Event
84+
{
85+
return new BBCodeGridViewInitialized($this);
86+
}
87+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace wcf\system\interaction\admin;
4+
5+
use wcf\data\bbcode\BBCode;
6+
use wcf\event\interaction\admin\BBCodeInteractionCollecting;
7+
use wcf\system\event\EventHandler;
8+
use wcf\system\interaction\AbstractInteractionProvider;
9+
use wcf\system\interaction\DeleteInteraction;
10+
11+
/**
12+
* Interaction provider for bb codes.
13+
*
14+
* @author Olaf Braun
15+
* @copyright 2001-2025 WoltLab GmbH
16+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
17+
* @since 6.2
18+
*/
19+
final class BBCodeInteractions extends AbstractInteractionProvider
20+
{
21+
public function __construct()
22+
{
23+
$this->addInteractions([
24+
new DeleteInteraction('core/bbcodes/%s', static fn(BBCode $bbcode) => $bbcode->canDelete()),
25+
]);
26+
27+
EventHandler::getInstance()->fire(
28+
new BBCodeInteractionCollecting($this)
29+
);
30+
}
31+
32+
#[\Override]
33+
public function getObjectClassName(): string
34+
{
35+
return BBCode::class;
36+
}
37+
}

0 commit comments

Comments
 (0)