Skip to content

Commit 1f1ca86

Browse files
authored
Merge pull request #6190 from WoltLab/6.2-bb-code-media-provider-to-grid-view
Migrate `BBCodeMediaProviderListPage` to grid view
2 parents c21f872 + ce0afb3 commit 1f1ca86

File tree

11 files changed

+320
-78
lines changed

11 files changed

+320
-78
lines changed

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

Lines changed: 4 additions & 57 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.mediaProvider.list{/lang}{if $items} <span class="badge badgeInverse">{#$items}</span>{/if}</h1>
5+
<h1 class="contentTitle">{lang}wcf.acp.bbcode.mediaProvider.list{/lang} <span class="badge badgeInverse">{#$gridView->countRows()}</span></h1>
66
</div>
77

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

17-
{hascontent}
18-
<div class="paginationTop">
19-
{content}{pages print=true assign=pagesLinks controller="BBCodeMediaProviderList" 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\media\provider\BBCodeMediaProviderAction">
26-
<thead>
27-
<tr>
28-
<th class="columnID columnMediaProviderID{if $sortField == 'providerID'} active {@$sortOrder}{/if}" colspan="2"><a href="{link controller='BBCodeMediaProviderList'}pageNo={@$pageNo}&sortField=providerID&sortOrder={if $sortField == 'providerID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
29-
<th class="columnTitle columnMediaProviderTitle{if $sortField == 'title'} active {@$sortOrder}{/if}"><a href="{link controller='BBCodeMediaProviderList'}pageNo={@$pageNo}&sortField=title&sortOrder={if $sortField == 'title' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.bbcode.mediaProvider.title{/lang}</a></th>
30-
31-
{event name='columnHeads'}
32-
</tr>
33-
</thead>
34-
35-
<tbody class="jsReloadPageWhenEmpty">
36-
{foreach from=$objects item='mediaProvider'}
37-
<tr class="jsMediaProviderRow jsObjectActionObject" data-object-id="{@$mediaProvider->getObjectID()}">
38-
<td class="columnIcon">
39-
{objectAction action="toggle" isDisabled=$mediaProvider->isDisabled}
40-
<a href="{link controller='BBCodeMediaProviderEdit' object=$mediaProvider}{/link}" title="{lang}wcf.global.button.edit{/lang}" class="jsTooltip">{icon name='pencil'}</a>
41-
{objectAction action="delete" objectTitle=$mediaProvider->getTitle()}
42-
43-
{event name='rowButtons'}
44-
</td>
45-
<td class="columnID">{@$mediaProvider->providerID}</td>
46-
<td class="columnTitle columnMediaProviderTitle"><a href="{link controller='BBCodeMediaProviderEdit' object=$mediaProvider}{/link}">{$mediaProvider->title}</a></td>
47-
48-
{event name='columns'}
49-
</tr>
50-
{/foreach}
51-
</tbody>
52-
</table>
53-
</div>
54-
55-
<footer class="contentFooter">
56-
{hascontent}
57-
<div class="paginationBottom">
58-
{content}{@$pagesLinks}{/content}
59-
</div>
60-
{/hascontent}
61-
62-
<nav class="contentFooterNavigation">
63-
<ul>
64-
<li><a href="{link controller='BBCodeMediaProviderAdd'}{/link}" class="button">{icon name='plus'} <span>{lang}wcf.acp.bbcode.mediaProvider.add{/lang}</span></a></li>
65-
66-
{event name='contentFooterNavigation'}
67-
</ul>
68-
</nav>
69-
</footer>
70-
{else}
71-
<woltlab-core-notice type="info">{lang}wcf.global.noItems{/lang}</woltlab-core-notice>
72-
{/if}
17+
<div class="section">
18+
{unsafe:$gridView->render()}
19+
</div>
7320

7421
{include file='footer'}

wcfsetup/install/files/lib/acp/page/BBCodeMediaProviderListPage.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\media\provider\BBCodeMediaProviderList;
6-
use wcf\page\SortablePage;
5+
use wcf\page\AbstractGridViewPage;
6+
use wcf\system\gridView\AbstractGridView;
7+
use wcf\system\gridView\admin\BBCodeMediaProviderGridView;
78

89
/**
910
* Lists the available media providers.
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 BBCodeMediaProviderList $objectList
16+
* @property BBCodeMediaProviderGridView $gridView
1617
*/
17-
class BBCodeMediaProviderListPage extends SortablePage
18+
class BBCodeMediaProviderListPage extends AbstractGridViewPage
1819
{
1920
/**
2021
* @inheritDoc
2122
*/
2223
public $activeMenuItem = 'wcf.acp.menu.link.bbcode.mediaProvider.list';
2324

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

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

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

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
172172
$event->register(new \wcf\system\endpoint\controller\core\boxes\DisableBox());
173173
$event->register(new \wcf\system\endpoint\controller\core\boxes\EnableBox());
174174
$event->register(new \wcf\system\endpoint\controller\core\boxes\DeleteBox());
175+
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\DeleteProvider());
176+
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\DisableProvider());
177+
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\EnableProvider());
175178
}
176179
);
177180

wcfsetup/install/files/lib/data/bbcode/media/provider/BBCodeMediaProvider.class.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
* @property-read string $regex regular expression to recognize media elements/element urls
2424
* @property-read string $html html code used to render media elements
2525
* @property-read string $className callback class name
26+
* @property-read int $isDisabled
2627
*/
2728
class BBCodeMediaProvider extends DatabaseObject implements IRouteController
2829
{
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\BBCodeMediaProviderGridView;
7+
8+
/**
9+
* Indicates that the bb code media provider 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 BBCodeMediaProviderGridViewInitialized implements IPsr14Event
17+
{
18+
public function __construct(public readonly BBCodeMediaProviderGridView $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\BBCodeMediaProviderInteractions;
7+
8+
/**
9+
* Indicates that the provider for bb code media provider interactions 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 BBCodeMediaProviderInteractionCollecting implements IPsr14Event
17+
{
18+
public function __construct(public readonly BBCodeMediaProviderInteractions $provider)
19+
{
20+
}
21+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace wcf\system\endpoint\controller\core\bbcodes\media\providers;
4+
5+
use Laminas\Diactoros\Response\JsonResponse;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\ServerRequestInterface;
8+
use wcf\data\bbcode\media\provider\BBCodeMediaProvider;
9+
use wcf\data\bbcode\media\provider\BBCodeMediaProviderAction;
10+
use wcf\http\Helper;
11+
use wcf\system\endpoint\DeleteRequest;
12+
use wcf\system\endpoint\IController;
13+
use wcf\system\WCF;
14+
15+
/**
16+
* API endpoint for deleting bb code media provider.
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+
#[DeleteRequest('/core/bbcodes/media/providers/{id:\d+}')]
24+
final class DeleteProvider implements IController
25+
{
26+
#[\Override]
27+
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
28+
{
29+
$provider = Helper::fetchObjectFromRequestParameter($variables['id'], BBCodeMediaProvider::class);
30+
31+
$this->assertMediaProviderCanBeDeleted();
32+
33+
(new BBCodeMediaProviderAction([$provider], 'delete'))->executeAction();
34+
35+
return new JsonResponse([]);
36+
}
37+
38+
private function assertMediaProviderCanBeDeleted(): void
39+
{
40+
WCF::getSession()->checkPermissions(['admin.content.bbcode.canManageBBCode']);
41+
}
42+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace wcf\system\endpoint\controller\core\bbcodes\media\providers;
4+
5+
use Laminas\Diactoros\Response\JsonResponse;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\ServerRequestInterface;
8+
use wcf\data\bbcode\media\provider\BBCodeMediaProvider;
9+
use wcf\data\bbcode\media\provider\BBCodeMediaProviderAction;
10+
use wcf\http\Helper;
11+
use wcf\system\endpoint\IController;
12+
use wcf\system\endpoint\PostRequest;
13+
use wcf\system\exception\PermissionDeniedException;
14+
use wcf\system\WCF;
15+
16+
/**
17+
* API endpoint for disabling bb code media provider.
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+
#[PostRequest('/core/bbcodes/media/providers/{id:\d+}/disable')]
25+
final class DisableProvider implements IController
26+
{
27+
#[\Override]
28+
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
29+
{
30+
$provider = Helper::fetchObjectFromRequestParameter($variables['id'], BBCodeMediaProvider::class);
31+
32+
$this->assertMediaProviderCanBeDisabled($provider);
33+
34+
(new BBCodeMediaProviderAction([$provider], 'toggle'))->executeAction();
35+
36+
return new JsonResponse([]);
37+
}
38+
39+
private function assertMediaProviderCanBeDisabled(BBCodeMediaProvider $provider): void
40+
{
41+
WCF::getSession()->checkPermissions(['admin.content.bbcode.canManageBBCode']);
42+
43+
if ($provider->isDisabled) {
44+
throw new PermissionDeniedException();
45+
}
46+
}
47+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace wcf\system\endpoint\controller\core\bbcodes\media\providers;
4+
5+
use Laminas\Diactoros\Response\JsonResponse;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\ServerRequestInterface;
8+
use wcf\data\bbcode\media\provider\BBCodeMediaProvider;
9+
use wcf\data\bbcode\media\provider\BBCodeMediaProviderAction;
10+
use wcf\http\Helper;
11+
use wcf\system\endpoint\IController;
12+
use wcf\system\endpoint\PostRequest;
13+
use wcf\system\exception\PermissionDeniedException;
14+
use wcf\system\WCF;
15+
16+
/**
17+
* API endpoint for enabling bb code media provider.
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+
#[PostRequest('/core/bbcodes/media/providers/{id:\d+}/enable')]
25+
final class EnableProvider implements IController
26+
{
27+
#[\Override]
28+
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
29+
{
30+
$provider = Helper::fetchObjectFromRequestParameter($variables['id'], BBCodeMediaProvider::class);
31+
32+
$this->assertMediaProviderCanBeEnabled($provider);
33+
34+
(new BBCodeMediaProviderAction([$provider], 'toggle'))->executeAction();
35+
36+
return new JsonResponse([]);
37+
}
38+
39+
private function assertMediaProviderCanBeEnabled(BBCodeMediaProvider $provider): void
40+
{
41+
WCF::getSession()->checkPermissions(['admin.content.bbcode.canManageBBCode']);
42+
43+
if (!$provider->isDisabled) {
44+
throw new PermissionDeniedException();
45+
}
46+
}
47+
}

0 commit comments

Comments
 (0)