Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 4 additions & 152 deletions wcfsetup/install/files/acp/templates/boxList.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<header class="contentHeader">
<div class="contentHeaderTitle">
<h1 class="contentTitle">{lang}wcf.acp.box.list{/lang}{if $items} <span class="badge badgeInverse">{#$items}</span>{/if}</h1>
<h1 class="contentTitle">{lang}wcf.acp.box.list{/lang}</h1>
</div>

<nav class="contentHeaderNavigation">
Expand All @@ -19,157 +19,9 @@
</nav>
</header>

<form method="post" action="{link controller='BoxList'}{/link}">
<section class="section">
<h2 class="sectionTitle">{lang}wcf.global.filter{/lang}</h2>

<div class="row rowColGap formGrid">
<dl class="col-xs-12 col-md-4">
<dt></dt>
<dd>
<input type="text" id="name" name="name" value="{$name}" placeholder="{lang}wcf.global.name{/lang}" class="long">
</dd>
</dl>

<dl class="col-xs-12 col-md-4">
<dt></dt>
<dd>
<input type="text" id="boxTitle" name="title" value="{$title}" placeholder="{lang}wcf.global.title{/lang}" class="long">
</dd>
</dl>

<dl class="col-xs-12 col-md-4">
<dt></dt>
<dd>
<input type="text" id="boxContent" name="content" value="{$content}" placeholder="{lang}wcf.acp.box.content{/lang}" class="long">
</dd>
</dl>

<dl class="col-xs-12 col-md-4">
<dt></dt>
<dd>
<select name="position" id="boxPosition">
<option value="0">{lang}wcf.acp.box.position{/lang}</option>
{foreach from=$availablePositions item=availablePosition}
<option value="{$availablePosition}"{if $availablePosition == $position} selected{/if}>{lang}wcf.acp.box.position.{@$availablePosition}{/lang}</option>
{/foreach}
</select>
</dd>
</dl>

<dl class="col-xs-12 col-md-4">
<dt></dt>
<dd>
<select name="boxType" id="boxType">
<option value="">{lang}wcf.acp.box.type{/lang}</option>
<option value="text"{if $boxType == 'text'} selected{/if}>{lang}wcf.acp.box.type.text{/lang}</option>
<option value="html"{if $boxType == 'html'} selected{/if}>{lang}wcf.acp.box.type.html{/lang}</option>
<option value="tpl"{if $boxType == 'tpl'} selected{/if}>{lang}wcf.acp.box.type.tpl{/lang}</option>
<option value="system"{if $boxType == 'system'} selected{/if}>{lang}wcf.acp.box.type.system{/lang}</option>
</select>
</dd>
</dl>

<dl class="col-xs-12 col-md-4">
<dt></dt>
<dd>
<label><input type="checkbox" name="originIsNotSystem" value="1"{if $originIsNotSystem} checked{/if}> {lang}wcf.acp.box.originIsNotSystem{/lang}</label>
</dd>
</dl>

{event name='filterFields'}
</div>

<div class="formSubmit">
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
{csrfToken}
</div>
</section>
</form>

{hascontent}
<div class="paginationTop">
{content}
{assign var='linkParameters' value=''}
{if $name}{capture append=linkParameters}&name={@$name|rawurlencode}{/capture}{/if}
{if $title}{capture append=linkParameters}&title={@$title|rawurlencode}{/capture}{/if}
{if $content}{capture append=linkParameters}&content={@$content|rawurlencode}{/capture}{/if}
{if $position}{capture append=linkParameters}&position={@$position}{/capture}{/if}
{if $boxType}{capture append=linkParameters}&boxType={@$boxType|rawurlencode}{/capture}{/if}
{if $originIsNotSystem}{capture append=linkParameters}&originIsNotSystem=1{/capture}{/if}

{pages print=true assign=pagesLinks controller="BoxList" link="pageNo=%d&sortField=$sortField&sortOrder=$sortOrder$linkParameters"}
{/content}
</div>
{/hascontent}

{if $objects|count}
<div class="section tabularBox">
<table class="table jsObjectActionContainer" data-object-action-class-name="wcf\data\box\BoxAction">
<thead>
<tr>
<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>
<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>
<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>
<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>
<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>

{event name='columnHeads'}
</tr>
</thead>

<tbody class="jsReloadPageWhenEmpty">
{foreach from=$objects item=box}
<tr class="jsBoxRow jsObjectActionObject" data-object-id="{@$box->getObjectID()}">
<td class="columnIcon">
{objectAction action="toggle" isDisabled=$box->isDisabled}
<a href="{link controller='BoxEdit' id=$box->boxID}{/link}" title="{lang}wcf.global.button.edit{/lang}" class="jsTooltip">{icon name='pencil'}</a>
{if $box->canDelete()}
{objectAction action="delete" objectTitle=$box->name}
{else}
<span class="disabled" title="{lang}wcf.global.button.delete{/lang}">
{icon name='xmark'}
</span>
{/if}

{event name='rowButtons'}
</td>
<td class="columnID columnBoxID">{@$box->boxID}</td>
<td class="columnTitle columnName"><a href="{link controller='BoxEdit' id=$box->boxID}{/link}">{$box->name}</a></td>
<td class="columnText columnBoxType">{lang}wcf.acp.box.type.{@$box->boxType}{/lang}</td>
<td class="columnText columnPosition">{lang}wcf.acp.box.position.{@$box->position}{/lang}</td>
<td class="columnDigits columnShowOrder">{#$box->showOrder}</td>

{event name='columns'}
</tr>
{/foreach}
</tbody>
</table>
</div>

<footer class="contentFooter">
{hascontent}
<div class="paginationBottom">
{content}{@$pagesLinks}{/content}
</div>
{/hascontent}

<nav class="contentFooterNavigation">
<ul>
<li>
<button class="button jsButtonBoxAdd">
{icon name='plus'}
<span>{lang}wcf.acp.box.add{/lang}</span>
</button>
</li>

{event name='contentFooterNavigation'}
</ul>
</nav>
</footer>
{else}
<woltlab-core-notice type="info">{lang}wcf.global.noItems{/lang}</woltlab-core-notice>
{/if}
<div class="section">
{unsafe:$gridView->render()}
</div>

{include file='boxAddDialog'}

Expand Down
156 changes: 16 additions & 140 deletions wcfsetup/install/files/lib/acp/page/BoxListPage.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,188 +2,64 @@

namespace wcf\acp\page;

use wcf\data\box\Box;
use wcf\data\box\BoxList;
use wcf\page\SortablePage;
use wcf\page\AbstractGridViewPage;
use wcf\system\gridView\AbstractGridView;
use wcf\system\gridView\admin\BoxGridView;
use wcf\system\language\LanguageFactory;
use wcf\system\WCF;
use wcf\util\StringUtil;

/**
* Shows a list of boxes.
*
* @author Marcel Werk
* @copyright 2001-2019 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @author Olaf Braun, Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 3.0
*
* @property BoxList $objectList
* @property BoxGridView $gridView
*/
class BoxListPage extends SortablePage
class BoxListPage extends AbstractGridViewPage
{
/**
* @inheritDoc
*/
public $activeMenuItem = 'wcf.acp.menu.link.cms.box.list';

/**
* @inheritDoc
*/
public $objectListClassName = BoxList::class;

/**
* @inheritDoc
*/
public $neededPermissions = ['admin.content.cms.canManageBox'];

/**
* @inheritDoc
*/
public $defaultSortField = 'name';

/**
* @inheritDoc
*/
public $validSortFields = ['boxID', 'name', 'boxType', 'position', 'showOrder'];

/**
* @inheritDoc
*/
public $itemsPerPage = 50;

/**
* name
* @var string
*/
public $name = '';

/**
* title
* @var string
*/
public $title = '';

/**
* content
* @var string
*/
public $content = '';

/**
* box type
* @var string
*/
public $boxType = '';

/**
* box position
* @var string
*/
public $position = '';

/**
* display 'Add Box' dialog on load
* @var int
*/
public $showBoxAddDialog = 0;

/**
* filters the list of boxes showing only custom boxes
* @var bool
*/
public $originIsNotSystem = 0;

/**
* @inheritDoc
*/
#[\Override]
public function readParameters()
{
parent::readParameters();

if (!empty($_REQUEST['name'])) {
$this->name = StringUtil::trim($_REQUEST['name']);
}
if (!empty($_REQUEST['title'])) {
$this->title = StringUtil::trim($_REQUEST['title']);
}
if (!empty($_REQUEST['content'])) {
$this->content = StringUtil::trim($_REQUEST['content']);
}
if (!empty($_REQUEST['boxType'])) {
$this->boxType = $_REQUEST['boxType'];
}
if (!empty($_REQUEST['position'])) {
$this->position = $_REQUEST['position'];
}
if (!empty($_REQUEST['showBoxAddDialog'])) {
$this->showBoxAddDialog = 1;
}
if (!empty($_REQUEST['originIsNotSystem'])) {
$this->originIsNotSystem = 1;
}
}

/**
* @inheritDoc
*/
protected function initObjectList()
{
parent::initObjectList();

// hide menu boxes
$this->objectList->getConditionBuilder()->add('box.boxType <> ?', ['menu']);

if (!empty($this->name)) {
$this->objectList->getConditionBuilder()->add('box.name LIKE ?', ['%' . $this->name . '%']);
}
if (!empty($this->title)) {
$this->objectList->getConditionBuilder()->add(
'box.boxID IN (
SELECT boxID
FROM wcf1_box_content
WHERE title LIKE ?
)',
['%' . $this->title . '%']
);
}
if (!empty($this->content)) {
$this->objectList->getConditionBuilder()->add(
'box.boxID IN (
SELECT boxID
FROM wcf1_box_content
WHERE content LIKE ?
)',
['%' . $this->content . '%']
);
}
if (!empty($this->position)) {
$this->objectList->getConditionBuilder()->add('box.position = ?', [$this->position]);
}
if (!empty($this->boxType)) {
$this->objectList->getConditionBuilder()->add('box.boxType = ?', [$this->boxType]);
}
if ($this->originIsNotSystem) {
$this->objectList->getConditionBuilder()->add('box.originIsSystem = ?', [0]);
}
}

/**
* @inheritDoc
*/
#[\Override]
public function assignVariables()
{
parent::assignVariables();

WCF::getTPL()->assign([
'name' => $this->name,
'title' => $this->title,
'content' => $this->content,
'boxType' => $this->boxType,
'position' => $this->position,
'availablePositions' => Box::$availablePositions,
'availableLanguages' => LanguageFactory::getInstance()->getLanguages(),
'showBoxAddDialog' => $this->showBoxAddDialog,
'originIsNotSystem' => $this->originIsNotSystem,
]);
}

#[\Override]
protected function createGridViewController(): AbstractGridView
{
return new BoxGridView();
}
}
3 changes: 3 additions & 0 deletions wcfsetup/install/files/lib/bootstrap/com.woltlab.wcf.php
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,9 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
$event->register(new \wcf\system\endpoint\controller\core\users\ranks\DeleteUserRank());
$event->register(new \wcf\system\endpoint\controller\core\interactions\GetBulkContextMenuOptions());
$event->register(new \wcf\system\endpoint\controller\core\interactions\GetContextMenuOptions());
$event->register(new \wcf\system\endpoint\controller\core\boxes\DisableBox());
$event->register(new \wcf\system\endpoint\controller\core\boxes\EnableBox());
$event->register(new \wcf\system\endpoint\controller\core\boxes\DeleteBox());
}
);

Expand Down
Loading