Skip to content

Commit c21f872

Browse files
authored
Merge pull request #6191 from WoltLab/6.2-box-list-to-grid-view
Migrate `BoxListPage` to grid view
2 parents 35c5ec4 + 5b3f49f commit c21f872

File tree

10 files changed

+394
-292
lines changed

10 files changed

+394
-292
lines changed

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

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

88
<nav class="contentHeaderNavigation">
@@ -19,157 +19,9 @@
1919
</nav>
2020
</header>
2121

22-
<form method="post" action="{link controller='BoxList'}{/link}">
23-
<section class="section">
24-
<h2 class="sectionTitle">{lang}wcf.global.filter{/lang}</h2>
25-
26-
<div class="row rowColGap formGrid">
27-
<dl class="col-xs-12 col-md-4">
28-
<dt></dt>
29-
<dd>
30-
<input type="text" id="name" name="name" value="{$name}" placeholder="{lang}wcf.global.name{/lang}" class="long">
31-
</dd>
32-
</dl>
33-
34-
<dl class="col-xs-12 col-md-4">
35-
<dt></dt>
36-
<dd>
37-
<input type="text" id="boxTitle" name="title" value="{$title}" placeholder="{lang}wcf.global.title{/lang}" class="long">
38-
</dd>
39-
</dl>
40-
41-
<dl class="col-xs-12 col-md-4">
42-
<dt></dt>
43-
<dd>
44-
<input type="text" id="boxContent" name="content" value="{$content}" placeholder="{lang}wcf.acp.box.content{/lang}" class="long">
45-
</dd>
46-
</dl>
47-
48-
<dl class="col-xs-12 col-md-4">
49-
<dt></dt>
50-
<dd>
51-
<select name="position" id="boxPosition">
52-
<option value="0">{lang}wcf.acp.box.position{/lang}</option>
53-
{foreach from=$availablePositions item=availablePosition}
54-
<option value="{$availablePosition}"{if $availablePosition == $position} selected{/if}>{lang}wcf.acp.box.position.{@$availablePosition}{/lang}</option>
55-
{/foreach}
56-
</select>
57-
</dd>
58-
</dl>
59-
60-
<dl class="col-xs-12 col-md-4">
61-
<dt></dt>
62-
<dd>
63-
<select name="boxType" id="boxType">
64-
<option value="">{lang}wcf.acp.box.type{/lang}</option>
65-
<option value="text"{if $boxType == 'text'} selected{/if}>{lang}wcf.acp.box.type.text{/lang}</option>
66-
<option value="html"{if $boxType == 'html'} selected{/if}>{lang}wcf.acp.box.type.html{/lang}</option>
67-
<option value="tpl"{if $boxType == 'tpl'} selected{/if}>{lang}wcf.acp.box.type.tpl{/lang}</option>
68-
<option value="system"{if $boxType == 'system'} selected{/if}>{lang}wcf.acp.box.type.system{/lang}</option>
69-
</select>
70-
</dd>
71-
</dl>
72-
73-
<dl class="col-xs-12 col-md-4">
74-
<dt></dt>
75-
<dd>
76-
<label><input type="checkbox" name="originIsNotSystem" value="1"{if $originIsNotSystem} checked{/if}> {lang}wcf.acp.box.originIsNotSystem{/lang}</label>
77-
</dd>
78-
</dl>
79-
80-
{event name='filterFields'}
81-
</div>
82-
83-
<div class="formSubmit">
84-
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
85-
{csrfToken}
86-
</div>
87-
</section>
88-
</form>
89-
90-
{hascontent}
91-
<div class="paginationTop">
92-
{content}
93-
{assign var='linkParameters' value=''}
94-
{if $name}{capture append=linkParameters}&name={@$name|rawurlencode}{/capture}{/if}
95-
{if $title}{capture append=linkParameters}&title={@$title|rawurlencode}{/capture}{/if}
96-
{if $content}{capture append=linkParameters}&content={@$content|rawurlencode}{/capture}{/if}
97-
{if $position}{capture append=linkParameters}&position={@$position}{/capture}{/if}
98-
{if $boxType}{capture append=linkParameters}&boxType={@$boxType|rawurlencode}{/capture}{/if}
99-
{if $originIsNotSystem}{capture append=linkParameters}&originIsNotSystem=1{/capture}{/if}
100-
101-
{pages print=true assign=pagesLinks controller="BoxList" link="pageNo=%d&sortField=$sortField&sortOrder=$sortOrder$linkParameters"}
102-
{/content}
103-
</div>
104-
{/hascontent}
105-
106-
{if $objects|count}
107-
<div class="section tabularBox">
108-
<table class="table jsObjectActionContainer" data-object-action-class-name="wcf\data\box\BoxAction">
109-
<thead>
110-
<tr>
111-
<th class="columnID columnBoxID{if $sortField == 'boxID'} active {@$sortOrder}{/if}" colspan="2"><a href="{link controller='BoxList'}pageNo={@$pageNo}&sortField=boxID&sortOrder={if $sortField == 'boxID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
112-
<th class="columnTitle columnName{if $sortField == 'name'} active {@$sortOrder}{/if}"><a href="{link controller='BoxList'}pageNo={@$pageNo}&sortField=name&sortOrder={if $sortField == 'name' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.global.name{/lang}</a></th>
113-
<th class="columnText columnBoxType{if $sortField == 'boxType'} active {@$sortOrder}{/if}"><a href="{link controller='BoxList'}pageNo={@$pageNo}&sortField=boxType&sortOrder={if $sortField == 'boxType' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.acp.box.type{/lang}</a></th>
114-
<th class="columnText columnPosition{if $sortField == 'position'} active {@$sortOrder}{/if}"><a href="{link controller='BoxList'}pageNo={@$pageNo}&sortField=position&sortOrder={if $sortField == 'position' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.acp.box.position{/lang}</a></th>
115-
<th class="columnDigits columnShowOrder{if $sortField == 'showOrder'} active {@$sortOrder}{/if}"><a href="{link controller='BoxList'}pageNo={@$pageNo}&sortField=showOrder&sortOrder={if $sortField == 'showOrder' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.global.showOrder{/lang}</a></th>
116-
117-
{event name='columnHeads'}
118-
</tr>
119-
</thead>
120-
121-
<tbody class="jsReloadPageWhenEmpty">
122-
{foreach from=$objects item=box}
123-
<tr class="jsBoxRow jsObjectActionObject" data-object-id="{@$box->getObjectID()}">
124-
<td class="columnIcon">
125-
{objectAction action="toggle" isDisabled=$box->isDisabled}
126-
<a href="{link controller='BoxEdit' id=$box->boxID}{/link}" title="{lang}wcf.global.button.edit{/lang}" class="jsTooltip">{icon name='pencil'}</a>
127-
{if $box->canDelete()}
128-
{objectAction action="delete" objectTitle=$box->name}
129-
{else}
130-
<span class="disabled" title="{lang}wcf.global.button.delete{/lang}">
131-
{icon name='xmark'}
132-
</span>
133-
{/if}
134-
135-
{event name='rowButtons'}
136-
</td>
137-
<td class="columnID columnBoxID">{@$box->boxID}</td>
138-
<td class="columnTitle columnName"><a href="{link controller='BoxEdit' id=$box->boxID}{/link}">{$box->name}</a></td>
139-
<td class="columnText columnBoxType">{lang}wcf.acp.box.type.{@$box->boxType}{/lang}</td>
140-
<td class="columnText columnPosition">{lang}wcf.acp.box.position.{@$box->position}{/lang}</td>
141-
<td class="columnDigits columnShowOrder">{#$box->showOrder}</td>
142-
143-
{event name='columns'}
144-
</tr>
145-
{/foreach}
146-
</tbody>
147-
</table>
148-
</div>
149-
150-
<footer class="contentFooter">
151-
{hascontent}
152-
<div class="paginationBottom">
153-
{content}{@$pagesLinks}{/content}
154-
</div>
155-
{/hascontent}
156-
157-
<nav class="contentFooterNavigation">
158-
<ul>
159-
<li>
160-
<button class="button jsButtonBoxAdd">
161-
{icon name='plus'}
162-
<span>{lang}wcf.acp.box.add{/lang}</span>
163-
</button>
164-
</li>
165-
166-
{event name='contentFooterNavigation'}
167-
</ul>
168-
</nav>
169-
</footer>
170-
{else}
171-
<woltlab-core-notice type="info">{lang}wcf.global.noItems{/lang}</woltlab-core-notice>
172-
{/if}
22+
<div class="section">
23+
{unsafe:$gridView->render()}
24+
</div>
17325

17426
{include file='boxAddDialog'}
17527

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

Lines changed: 16 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -2,188 +2,64 @@
22

33
namespace wcf\acp\page;
44

5-
use wcf\data\box\Box;
6-
use wcf\data\box\BoxList;
7-
use wcf\page\SortablePage;
5+
use wcf\page\AbstractGridViewPage;
6+
use wcf\system\gridView\AbstractGridView;
7+
use wcf\system\gridView\admin\BoxGridView;
88
use wcf\system\language\LanguageFactory;
99
use wcf\system\WCF;
10-
use wcf\util\StringUtil;
1110

1211
/**
1312
* Shows a list of boxes.
1413
*
15-
* @author Marcel Werk
16-
* @copyright 2001-2019 WoltLab GmbH
17-
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14+
* @author Olaf Braun, Marcel Werk
15+
* @copyright 2001-2025 WoltLab GmbH
16+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1817
* @since 3.0
1918
*
20-
* @property BoxList $objectList
19+
* @property BoxGridView $gridView
2120
*/
22-
class BoxListPage extends SortablePage
21+
class BoxListPage extends AbstractGridViewPage
2322
{
2423
/**
2524
* @inheritDoc
2625
*/
2726
public $activeMenuItem = 'wcf.acp.menu.link.cms.box.list';
2827

29-
/**
30-
* @inheritDoc
31-
*/
32-
public $objectListClassName = BoxList::class;
33-
3428
/**
3529
* @inheritDoc
3630
*/
3731
public $neededPermissions = ['admin.content.cms.canManageBox'];
3832

39-
/**
40-
* @inheritDoc
41-
*/
42-
public $defaultSortField = 'name';
43-
44-
/**
45-
* @inheritDoc
46-
*/
47-
public $validSortFields = ['boxID', 'name', 'boxType', 'position', 'showOrder'];
48-
49-
/**
50-
* @inheritDoc
51-
*/
52-
public $itemsPerPage = 50;
53-
54-
/**
55-
* name
56-
* @var string
57-
*/
58-
public $name = '';
59-
60-
/**
61-
* title
62-
* @var string
63-
*/
64-
public $title = '';
65-
66-
/**
67-
* content
68-
* @var string
69-
*/
70-
public $content = '';
71-
72-
/**
73-
* box type
74-
* @var string
75-
*/
76-
public $boxType = '';
77-
78-
/**
79-
* box position
80-
* @var string
81-
*/
82-
public $position = '';
83-
8433
/**
8534
* display 'Add Box' dialog on load
8635
* @var int
8736
*/
8837
public $showBoxAddDialog = 0;
8938

90-
/**
91-
* filters the list of boxes showing only custom boxes
92-
* @var bool
93-
*/
94-
public $originIsNotSystem = 0;
95-
96-
/**
97-
* @inheritDoc
98-
*/
39+
#[\Override]
9940
public function readParameters()
10041
{
10142
parent::readParameters();
10243

103-
if (!empty($_REQUEST['name'])) {
104-
$this->name = StringUtil::trim($_REQUEST['name']);
105-
}
106-
if (!empty($_REQUEST['title'])) {
107-
$this->title = StringUtil::trim($_REQUEST['title']);
108-
}
109-
if (!empty($_REQUEST['content'])) {
110-
$this->content = StringUtil::trim($_REQUEST['content']);
111-
}
112-
if (!empty($_REQUEST['boxType'])) {
113-
$this->boxType = $_REQUEST['boxType'];
114-
}
115-
if (!empty($_REQUEST['position'])) {
116-
$this->position = $_REQUEST['position'];
117-
}
11844
if (!empty($_REQUEST['showBoxAddDialog'])) {
11945
$this->showBoxAddDialog = 1;
12046
}
121-
if (!empty($_REQUEST['originIsNotSystem'])) {
122-
$this->originIsNotSystem = 1;
123-
}
12447
}
12548

126-
/**
127-
* @inheritDoc
128-
*/
129-
protected function initObjectList()
130-
{
131-
parent::initObjectList();
132-
133-
// hide menu boxes
134-
$this->objectList->getConditionBuilder()->add('box.boxType <> ?', ['menu']);
135-
136-
if (!empty($this->name)) {
137-
$this->objectList->getConditionBuilder()->add('box.name LIKE ?', ['%' . $this->name . '%']);
138-
}
139-
if (!empty($this->title)) {
140-
$this->objectList->getConditionBuilder()->add(
141-
'box.boxID IN (
142-
SELECT boxID
143-
FROM wcf1_box_content
144-
WHERE title LIKE ?
145-
)',
146-
['%' . $this->title . '%']
147-
);
148-
}
149-
if (!empty($this->content)) {
150-
$this->objectList->getConditionBuilder()->add(
151-
'box.boxID IN (
152-
SELECT boxID
153-
FROM wcf1_box_content
154-
WHERE content LIKE ?
155-
)',
156-
['%' . $this->content . '%']
157-
);
158-
}
159-
if (!empty($this->position)) {
160-
$this->objectList->getConditionBuilder()->add('box.position = ?', [$this->position]);
161-
}
162-
if (!empty($this->boxType)) {
163-
$this->objectList->getConditionBuilder()->add('box.boxType = ?', [$this->boxType]);
164-
}
165-
if ($this->originIsNotSystem) {
166-
$this->objectList->getConditionBuilder()->add('box.originIsSystem = ?', [0]);
167-
}
168-
}
169-
170-
/**
171-
* @inheritDoc
172-
*/
49+
#[\Override]
17350
public function assignVariables()
17451
{
17552
parent::assignVariables();
17653

17754
WCF::getTPL()->assign([
178-
'name' => $this->name,
179-
'title' => $this->title,
180-
'content' => $this->content,
181-
'boxType' => $this->boxType,
182-
'position' => $this->position,
183-
'availablePositions' => Box::$availablePositions,
18455
'availableLanguages' => LanguageFactory::getInstance()->getLanguages(),
18556
'showBoxAddDialog' => $this->showBoxAddDialog,
186-
'originIsNotSystem' => $this->originIsNotSystem,
18757
]);
18858
}
59+
60+
#[\Override]
61+
protected function createGridViewController(): AbstractGridView
62+
{
63+
return new BoxGridView();
64+
}
18965
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
169169
$event->register(new \wcf\system\endpoint\controller\core\captchas\questions\EnableQuestion());
170170
$event->register(new \wcf\system\endpoint\controller\core\captchas\questions\DisableQuestion());
171171
$event->register(new \wcf\system\endpoint\controller\core\captchas\questions\DeleteQuestion());
172+
$event->register(new \wcf\system\endpoint\controller\core\boxes\DisableBox());
173+
$event->register(new \wcf\system\endpoint\controller\core\boxes\EnableBox());
174+
$event->register(new \wcf\system\endpoint\controller\core\boxes\DeleteBox());
172175
}
173176
);
174177

0 commit comments

Comments
 (0)