Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
68 changes: 4 additions & 64 deletions wcfsetup/install/files/acp/templates/paidSubscriptionList.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.paidSubscription.list{/lang}{if $items} <span class="badge badgeInverse">{#$items}</span>{/if}</h1>
<h1 class="contentTitle">{lang}wcf.acp.paidSubscription.list{/lang} <span class="badge badgeInverse">{#$gridView->countRows()}</span></h1>
</div>

<nav class="contentHeaderNavigation">
Expand All @@ -14,68 +14,8 @@
</nav>
</header>

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

{if $objects|count}
<div class="section tabularBox">
<table class="table jsObjectActionContainer" data-object-action-class-name="wcf\data\paid\subscription\PaidSubscriptionAction">
<thead>
<tr>
<th class="columnID columnSubscriptionID{if $sortField == 'subscriptionID'} active {@$sortOrder}{/if}" colspan="2"><a href="{link controller='PaidSubscriptionList'}pageNo={@$pageNo}&sortField=subscriptionID&sortOrder={if $sortField == 'subscriptionID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
<th class="columnTitle{if $sortField == 'title'} active {@$sortOrder}{/if}"><a href="{link controller='PaidSubscriptionList'}pageNo={@$pageNo}&sortField=title&sortOrder={if $sortField == 'title' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.title{/lang}</a></th>
<th class="columnDigits columnCost{if $sortField == 'cost'} active {@$sortOrder}{/if}"><a href="{link controller='PaidSubscriptionList'}pageNo={@$pageNo}&sortField=cost&sortOrder={if $sortField == 'cost' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.paidSubscription.cost{/lang}</a></th>
<th class="columnDigits columnSubscriptionLength{if $sortField == 'subscriptionLength'} active {@$sortOrder}{/if}"><a href="{link controller='PaidSubscriptionList'}pageNo={@$pageNo}&sortField=subscriptionLength&sortOrder={if $sortField == 'subscriptionLength' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.paidSubscription.subscriptionLength{/lang}</a></th>
<th class="columnDigits columnShowOrder{if $sortField == 'showOrder'} active {@$sortOrder}{/if}"><a href="{link controller='PaidSubscriptionList'}pageNo={@$pageNo}&sortField=showOrder&sortOrder={if $sortField == 'showOrder' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.showOrder{/lang}</a></th>

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

<tbody class="jsReloadPageWhenEmpty">
{foreach from=$objects item=subscription}
<tr class="jsPaidSubscriptionRow jsObjectActionObject" data-object-id="{@$subscription->getObjectID()}">
<td class="columnIcon">
{objectAction action="toggle" isDisabled=$subscription->isDisabled}
<a href="{link controller='PaidSubscriptionEdit' id=$subscription->subscriptionID}{/link}" title="{lang}wcf.global.button.edit{/lang}" class="jsTooltip">{icon name='pencil'}</a>
{objectAction action="delete" objectTitle=$subscription->getTitle()}
<a href="{link controller='PaidSubscriptionUserAdd' id=$subscription->subscriptionID}{/link}" title="{lang}wcf.acp.paidSubscription.user.add{/lang}" class="jsTooltip">{icon name='plus'}</a>

{event name='itemButtons'}
</td>
<td class="columnID columnSubscriptionID">{@$subscription->subscriptionID}</td>
<td class="columnTitle"><a href="{link controller='PaidSubscriptionEdit' id=$subscription->subscriptionID}{/link}" title="{lang}wcf.acp.paidSubscription.edit{/lang}">{$subscription->getTitle()}</a></td>
<td class="columnDigits columnCost">{@$subscription->currency} {$subscription->cost|currency}</td>
<td class="columnDigits columnSubscriptionLength">{if $subscription->subscriptionLength}{@$subscription->subscriptionLength} {lang}wcf.acp.paidSubscription.subscriptionLengthUnit.{@$subscription->subscriptionLengthUnit}{/lang}{else}&infin;{/if}</td>
<td class="columnDigits columnShowOrder">{@$subscription->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><a href="{link controller='PaidSubscriptionAdd'}{/link}" class="button">{icon name='plus'} <span>{lang}wcf.acp.paidSubscription.add{/lang}</span></a></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='footer'}
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@

namespace wcf\acp\page;

use wcf\data\paid\subscription\PaidSubscriptionList;
use wcf\page\SortablePage;
use wcf\page\AbstractGridViewPage;
use wcf\system\gridView\AbstractGridView;
use wcf\system\gridView\admin\PaidSubscriptionGridView;

/**
* Shows the list of paid subscriptions.
*
* @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 PaidSubscriptionList $objectList
* @property PaidSubscriptionGridView $gridView
*/
class PaidSubscriptionListPage extends SortablePage
class PaidSubscriptionListPage extends AbstractGridViewPage
{
/**
* @inheritDoc
Expand All @@ -31,18 +32,9 @@ class PaidSubscriptionListPage extends SortablePage
*/
public $neededPermissions = ['admin.paidSubscription.canManageSubscription'];

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

/**
* @inheritDoc
*/
public $validSortFields = ['subscriptionID', 'title', 'showOrder', 'cost', 'subscriptionLength'];

/**
* @inheritDoc
*/
public $objectListClassName = PaidSubscriptionList::class;
#[\Override]
protected function createGridViewController(): AbstractGridView
{
return new PaidSubscriptionGridView();
}
}
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 @@ -186,6 +186,9 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
$event->register(new \wcf\system\endpoint\controller\core\languages\SetAsDefaultLanguage());
$event->register(new \wcf\system\endpoint\controller\core\languages\items\DeleteItem());
$event->register(new \wcf\system\endpoint\controller\core\labels\groups\DeleteGroup());
$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());
}
);

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

namespace wcf\data\paid\subscription;

use wcf\data\I18nDatabaseObjectList;

/**
* I18n implementation of paid subscriptions.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
*
* @method PaidSubscription current()
* @method PaidSubscription[] getObjects()
* @method PaidSubscription|null getSingleObject()
* @method PaidSubscription|null search($objectID)
* @property PaidSubscription[] $objects
*/
class I18nPaidSubscriptionList extends I18nDatabaseObjectList
{
/**
* @inheritDoc
*/
public $i18nFields = ['title' => 'titleI18n'];

/**
* @inheritDoc
*/
public $className = PaidSubscription::class;
}
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\PaidSubscriptionGridView;

/**
* Indicates that the paid subscription 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
*/
final class PaidSubscriptionGridViewInitialized implements IPsr14Event
{
public function __construct(public readonly PaidSubscriptionGridView $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\PaidSubscriptionInteractions;

/**
* Indicates that the provider for paid subscription interactions is collecting interactions.
*
* @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 PaidSubscriptionInteractionCollecting implements IPsr14Event
{
public function __construct(public readonly PaidSubscriptionInteractions $provider)
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

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

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use wcf\data\paid\subscription\PaidSubscription;
use wcf\data\paid\subscription\PaidSubscriptionAction;
use wcf\http\Helper;
use wcf\system\endpoint\DeleteRequest;
use wcf\system\endpoint\IController;
use wcf\system\WCF;

/**
* API endpoint for deleting paid subscriptions.
*
* @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/{id:\d+}')]
final class DeleteSubscription implements IController
{
#[\Override]
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
{
$subscription = Helper::fetchObjectFromRequestParameter($variables['id'], PaidSubscription::class);

$this->assertSubscriptionCanBeDeleted();

(new PaidSubscriptionAction([$subscription], 'delete'))->executeAction();

return new JsonResponse([]);
}

private function assertSubscriptionCanBeDeleted(): void
{
WCF::getSession()->checkPermissions(['admin.paidSubscription.canManageSubscription']);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

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

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use wcf\data\paid\subscription\PaidSubscription;
use wcf\data\paid\subscription\PaidSubscriptionAction;
use wcf\http\Helper;
use wcf\system\endpoint\IController;
use wcf\system\endpoint\PostRequest;
use wcf\system\exception\PermissionDeniedException;
use wcf\system\WCF;

/**
* API endpoint for disabling paid subscriptions.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
#[PostRequest('/core/paid/subscriptions/{id:\d+}/disable')]
final class DisableSubscription implements IController
{
#[\Override]
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
{
$subscription = Helper::fetchObjectFromRequestParameter($variables['id'], PaidSubscription::class);

$this->assertSubscriptionCanBeDisabled($subscription);

(new PaidSubscriptionAction([$subscription], 'toggle'))->executeAction();

return new JsonResponse([]);
}

private function assertSubscriptionCanBeDisabled(PaidSubscription $subscription): void
{
WCF::getSession()->checkPermissions(['admin.paidSubscription.canManageSubscription']);

if ($subscription->isDisabled) {
throw new PermissionDeniedException();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

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

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use wcf\data\paid\subscription\PaidSubscription;
use wcf\data\paid\subscription\PaidSubscriptionAction;
use wcf\http\Helper;
use wcf\system\endpoint\IController;
use wcf\system\endpoint\PostRequest;
use wcf\system\exception\PermissionDeniedException;
use wcf\system\WCF;

/**
* API endpoint for enabling paid subscriptions.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
#[PostRequest('/core/paid/subscriptions/{id:\d+}/enable')]
final class EnableSubscription implements IController
{
#[\Override]
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
{
$subscription = Helper::fetchObjectFromRequestParameter($variables['id'], PaidSubscription::class);

$this->assertSubscriptionCanBeEnabled($subscription);

(new PaidSubscriptionAction([$subscription], 'toggle'))->executeAction();

return new JsonResponse([]);
}

private function assertSubscriptionCanBeEnabled(PaidSubscription $subscription): void
{
WCF::getSession()->checkPermissions(['admin.paidSubscription.canManageSubscription']);

if (!$subscription->isDisabled) {
throw new PermissionDeniedException();
}
}
}
Loading