Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
117 changes: 4 additions & 113 deletions wcfsetup/install/files/acp/templates/paidSubscriptionUserList.tpl
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
{include file='header' pageTitle='wcf.acp.paidSubscription.user.list'}

<script data-relocate="true">
require(['WoltLabSuite/Core/Ui/User/Search/Input'], (UiUserSearchInput) => {
new UiUserSearchInput(document.getElementById('username'));
});
</script>

<header class="contentHeader">
<div class="contentHeaderTitle">
<h1 class="contentTitle">{lang}wcf.acp.paidSubscription.user.list{/lang}{if $items} <span class="badge badgeInverse">{#$items}</span>{/if}</h1>
<h1 class="contentTitle">{lang}wcf.acp.paidSubscription.user.list{/lang} <span class="badge badgeInverse">{#$gridView->countRows()}</span></h1>
</div>

{hascontent}
Expand All @@ -20,111 +14,8 @@
{/hascontent}
</header>

<form method="post" action="{link controller='PaidSubscriptionUserList'}{/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="username" name="username" value="{$username}" placeholder="{lang}wcf.user.username{/lang}" class="long">
</dd>
</dl>

{if $availableSubscriptions|count > 1}
<dl class="col-xs-12 col-md-4">
<dt></dt>
<dd>
<select name="subscriptionID" id="subscriptionID">
<option value="0">{lang}wcf.acp.paidSubscription.subscription{/lang}</option>
{foreach from=$availableSubscriptions item=availableSubscription}
<option value="{$availableSubscription->subscriptionID}"{if $availableSubscription->subscriptionID == $subscriptionID} selected{/if}>{$availableSubscription->getTitle()}</option>
{/foreach}
</select>
</dd>
</dl>
{/if}

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

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

{assign var='linkParameters' value=''}
{if $username}{capture append=linkParameters}&username={@$username|rawurlencode}{/capture}{/if}
{if $subscriptionID}{capture append=linkParameters}&subscriptionID={@$subscriptionID}{/capture}{/if}

{hascontent}
<div class="paginationTop">
{content}{pages print=true assign=pagesLinks controller='PaidSubscriptionUserList' 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\paid\subscription\user\PaidSubscriptionUserAction"
<thead>
<tr>
<th class="columnID columnSubscriptionUserID{if $sortField == 'subscriptionUserID'} active {@$sortOrder}{/if}" colspan="2"><a href="{link controller='PaidSubscriptionUserList'}pageNo={@$pageNo}&sortField=subscriptionUserID&sortOrder={if $sortField == 'subscriptionUserID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
<th class="columnText columnUsername{if $sortField == 'username'} active {@$sortOrder}{/if}"><a href="{link controller='PaidSubscriptionUserList'}pageNo={@$pageNo}&sortField=username&sortOrder={if $sortField == 'username' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.user.username{/lang}</a></th>
<th class="columnText columnSubscriptionTitle{if $sortField == 'subscriptionID'} active {@$sortOrder}{/if}"><a href="{link controller='PaidSubscriptionUserList'}pageNo={@$pageNo}&sortField=subscriptionID&sortOrder={if $sortField == 'subscriptionID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.acp.paidSubscription.subscription{/lang}</a></th>
<th class="columnDate columnEndDate{if $sortField == 'endDate'} active {@$sortOrder}{/if}"><a href="{link controller='PaidSubscriptionUserList'}pageNo={@$pageNo}&sortField=endDate&sortOrder={if $sortField == 'endDate' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{@$linkParameters}{/link}">{lang}wcf.acp.paidSubscription.user.endDate{/lang}</a></th>

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

<tbody class="jsReloadPageWhenEmpty">
{foreach from=$objects item=subscriptionUser}
<tr class="jsPaidSubscriptionUserRow jsObjectActionObject" data-object-id="{@$subscriptionUser->getObjectID()}">
<td class="columnIcon">
{if $subscriptionUser->endDate}
<a href="{link controller='PaidSubscriptionUserEdit' id=$subscriptionUser->subscriptionUserID}{/link}" title="{lang}wcf.global.button.edit{/lang}" class="jsTooltip">{icon name='pencil'}</a>
{else}
<span class="disabled" title="{lang}wcf.global.button.edit{/lang}">
{icon name='pencil'}
</span>
{/if}
{objectAction action="delete" confirmMessage='wcf.acp.paidSubscription.user.delete.confirmMessage'}

{event name='itemButtons'}
</td>
<td class="columnID columnSubscriptionUserID">{@$subscriptionUser->subscriptionUserID}</td>
<td class="columnText columnUsername"><a href="{link controller='UserEdit' id=$subscriptionUser->userID}{/link}" title="{lang}wcf.acp.user.edit{/lang}">{$subscriptionUser->username}</a></td>
<td class="columnText columnSubscriptionTitle">{$subscriptionUser->title|phrase}</td>
<td class="columnDate columnEndDate">{if $subscriptionUser->endDate}{@$subscriptionUser->endDate|time}{/if}</td>

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

</div>

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

{hascontent}
<nav class="contentFooterNavigation">
<ul>
{content}{event name='contentFooterNavigation'}{/content}
</ul>
</nav>
{/hascontent}
</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='footer'}
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,20 @@

namespace wcf\acp\page;

use wcf\data\paid\subscription\user\PaidSubscriptionUserList;
use wcf\page\SortablePage;
use wcf\system\cache\builder\PaidSubscriptionCacheBuilder;
use wcf\system\WCF;
use wcf\util\StringUtil;
use wcf\page\AbstractGridViewPage;
use wcf\system\gridView\AbstractGridView;
use wcf\system\gridView\admin\PaidSubscriptionUserGridView;

/**
* Shows the list of paid subscription users.
*
* @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>
*
* @property PaidSubscriptionUserList $objectList
* @property PaidSubscriptionUserGridView $gridView
*/
class PaidSubscriptionUserListPage extends SortablePage
class PaidSubscriptionUserListPage extends AbstractGridViewPage
{
/**
* @inheritDoc
Expand All @@ -34,104 +32,9 @@ class PaidSubscriptionUserListPage extends SortablePage
*/
public $neededPermissions = ['admin.paidSubscription.canManageSubscription'];

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

/**
* @inheritDoc
*/
public $validSortFields = ['subscriptionUserID', 'username', 'subscriptionID', 'startDate', 'endDate'];

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

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

/**
* subscription id
* @var int
*/
public $subscriptionID = 0;

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

if (isset($_REQUEST['username'])) {
$this->username = StringUtil::trim($_REQUEST['username']);
}
if (isset($_REQUEST['subscriptionID'])) {
$this->subscriptionID = \intval($_REQUEST['subscriptionID']);
}
}

/**
* Initializes DatabaseObjectList instance.
*/
protected function initObjectList()
{
parent::initObjectList();

if ($this->username) {
$this->objectList->getConditionBuilder()->add(
'paid_subscription_user.userID IN (
SELECT userID
FROM wcf1_user
WHERE username LIKE ?
)',
['%' . $this->username . '%']
);
}
if ($this->subscriptionID) {
$this->objectList->getConditionBuilder()->add(
'paid_subscription_user.subscriptionID = ?',
[$this->subscriptionID]
);
}

$this->objectList->getConditionBuilder()->add('paid_subscription_user.isActive = ?', [1]);
$this->objectList->sqlSelects = 'user_table.username, paid_subscription.title';
$this->objectList->sqlJoins = "
LEFT JOIN wcf1_user user_table
ON user_table.userID = paid_subscription_user.userID
LEFT JOIN wcf1_paid_subscription paid_subscription
ON paid_subscription.subscriptionID = paid_subscription_user.subscriptionID";
}

/**
* @inheritDoc
*/
protected function readObjects()
{
if ($this->sortField == 'username') {
$this->sqlOrderBy = 'user_table.username ' . $this->sortOrder . ', paid_subscription_user.subscriptionUserID ' . $this->sortOrder;
}

parent::readObjects();
}

/**
* @inheritDoc
*/
public function assignVariables()
{
parent::assignVariables();

WCF::getTPL()->assign([
'username' => $this->username,
'subscriptionID' => $this->subscriptionID,
'availableSubscriptions' => PaidSubscriptionCacheBuilder::getInstance()->getData(),
]);
return new PaidSubscriptionUserGridView();
}
}
1 change: 1 addition & 0 deletions wcfsetup/install/files/lib/bootstrap/com.woltlab.wcf.php
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
$event->register(new \wcf\system\endpoint\controller\core\paid\subscriptions\DeleteSubscription());
$event->register(new \wcf\system\endpoint\controller\core\paid\subscriptions\DisableSubscription());
$event->register(new \wcf\system\endpoint\controller\core\paid\subscriptions\EnableSubscription());
$event->register(new \wcf\system\endpoint\controller\core\paid\subscriptions\users\DeleteSubscriptionUser());
}
);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace wcf\event\gridView\admin;

use wcf\event\IPsr14Event;
use wcf\system\gridView\admin\PaidSubscriptionUserGridView;

/**
* Indicates that the acp paid subscription user grid view has been initialized.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
class PaidSubscriptionUserGridViewInitialized implements IPsr14Event
{
public function __construct(public readonly PaidSubscriptionUserGridView $gridView)
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace wcf\event\interaction\admin;

use wcf\event\IPsr14Event;
use wcf\system\interaction\admin\PaidSubscriptionUserInteractions;

/**
* Indicates that the provider for paid subscription user interactions has been initialized.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
final class PaidSubscriptionUserInteractionCollecting implements IPsr14Event
{
public function __construct(public readonly PaidSubscriptionUserInteractions $provider)
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace wcf\system\endpoint\controller\core\paid\subscriptions\users;

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use wcf\data\paid\subscription\user\PaidSubscriptionUser;
use wcf\data\paid\subscription\user\PaidSubscriptionUserAction;
use wcf\http\Helper;
use wcf\system\endpoint\DeleteRequest;
use wcf\system\endpoint\IController;
use wcf\system\exception\IllegalLinkException;
use wcf\system\WCF;

/**
* API endpoint for the deletion of paid subscriptions for users.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
#[DeleteRequest('/core/paid/subscriptions/users/{id:\d+}')]
final class DeleteSubscriptionUser implements IController
{
#[\Override]
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
{
$this->assertSubscriptionUserCanDeleted();

$user = Helper::fetchObjectFromRequestParameter($variables['id'], PaidSubscriptionUser::class);

(new PaidSubscriptionUserAction([$user], 'delete'))->executeAction();

return new JsonResponse([]);
}

private function assertSubscriptionUserCanDeleted(): void
{
if (!\MODULE_PAID_SUBSCRIPTION) {
throw new IllegalLinkException();
}

WCF::getSession()->checkPermissions(['admin.paidSubscription.canManageSubscription']);
}
}
Loading