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
84 changes: 4 additions & 80 deletions wcfsetup/install/files/acp/templates/packageUpdateServerList.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.updateServer.list{/lang}{if $items} <span class="badge badgeInverse">{#$items}</span>{/if}</h1>
<h1 class="contentTitle">{lang}wcf.acp.updateServer.list{/lang} <span class="badge badgeInverse">{#$gridView->countRows()}</span></h1>
</div>

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

{hascontent}
<div class="paginationTop">
{content}{pages print=true assign=pagesLinks controller="PackageUpdateServerList" 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\package\update\server\PackageUpdateServerAction">
<thead>
<tr>
<th class="columnID columnPackageUpdateServerID{if $sortField == 'packageUpdateServerID'} active {@$sortOrder}{/if}" colspan="2"><a href="{link controller='PackageUpdateServerList'}pageNo={@$pageNo}&sortField=packageUpdateServerID&sortOrder={if $sortField == 'packageUpdateServerID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
<th class="columnTitle columnServerURL{if $sortField == 'serverURL'} active {@$sortOrder}{/if}"><a href="{link controller='PackageUpdateServerList'}pageNo={@$pageNo}&sortField=serverURL&sortOrder={if $sortField == 'serverURL' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.updateServer.serverURL{/lang}</a></th>
<th class="columnLoginUsername{if $sortField == 'loginUsername'} active {@$sortOrder}{/if}"><a href="{link controller='PackageUpdateServerList'}pageNo={@$pageNo}&sortField=loginUsername&sortOrder={if $sortField == 'loginUsername' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.updateServer.loginUsername{/lang}</a></th>
<th class="columnDigits columnPackages{if $sortField == 'packages'} active {@$sortOrder}{/if}"><a href="{link controller='PackageUpdateServerList'}pageNo={@$pageNo}&sortField=packages&sortOrder={if $sortField == 'packages' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.updateServer.packages{/lang}</a></th>
<th class="columnStatus{if $sortField == 'status'} active {@$sortOrder}{/if}"><a href="{link controller='PackageUpdateServerList'}pageNo={@$pageNo}&sortField=status&sortOrder={if $sortField == 'status' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.updateServer.status{/lang}</a></th>
<th class="columnText columnErrorText{if $sortField == 'errorMessage'} active {@$sortOrder}{/if}"><a href="{link controller='PackageUpdateServerList'}pageNo={@$pageNo}&sortField=errorMessage&sortOrder={if $sortField == 'errorMessage' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.updateServer.errorMessage{/lang}</a></th>
<th class="columnDate columnTimestamp{if $sortField == 'lastUpdateTime'} active {@$sortOrder}{/if}"><a href="{link controller='PackageUpdateServerList'}pageNo={@$pageNo}&sortField=lastUpdateTime&sortOrder={if $sortField == 'lastUpdateTime' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.updateServer.lastUpdateTime{/lang}</a></th>

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

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

{event name='itemButtons'}
</td>
<td class="columnID columnPackageUpdateServerID">{@$updateServer->packageUpdateServerID}</td>
<td class="columnTitle columnServerURL"><a href="{link controller='PackageUpdateServerEdit' id=$updateServer->packageUpdateServerID}{/link}" title="{lang}wcf.acp.updateServer.edit{/lang}">{$updateServer->serverURL}</a></td>
<td class="columnLoginUsername">{$updateServer->loginUsername}</td>
<td class="columnDigits columnPackages">{#$updateServer->packages}</td>
<td class="columnStatus"><span class="badge{if $updateServer->status == 'online'} green{else} red{/if}">{@$updateServer->status}</span></td>
<td class="columnText columnErrorText" title="{$updateServer->errorMessage}">{$updateServer->errorMessage|truncate:"30"}</td>
<td class="columnDate columnTimestamp">{if $updateServer->lastUpdateTime}{@$updateServer->lastUpdateTime|time}{/if}</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='PackageUpdateServerAdd'}{/link}" class="button">{icon name='plus'} <span>{lang}wcf.acp.updateServer.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\package\update\server\PackageUpdateServerList;
use wcf\page\SortablePage;
use wcf\page\AbstractGridViewPage;
use wcf\system\gridView\AbstractGridView;
use wcf\system\gridView\admin\PackageUpdateServerGridView;

/**
* Shows information about available update package servers.
*
* @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 PackageUpdateServerList $objectList
* @property PackageUpdateServerGridView $gridView
*/
class PackageUpdateServerListPage extends SortablePage
class PackageUpdateServerListPage extends AbstractGridViewPage
{
/**
* @inheritDoc
Expand All @@ -26,36 +27,9 @@ class PackageUpdateServerListPage extends SortablePage
*/
public $neededPermissions = ['admin.configuration.package.canEditServer'];

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

/**
* @inheritDoc
*/
public $validSortFields = [
'packageUpdateServerID',
'serverURL',
'loginUsername',
'status',
'errorMessage',
'lastUpdateTime',
'packages',
];

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

/**
* @inheritDoc
*/
public function readObjects()
#[\Override]
protected function createGridViewController(): AbstractGridView
{
$this->sqlOrderBy = ($this->sortField != 'packages' ? 'package_update_server.' : '') . $this->sortField . ' ' . $this->sortOrder;

parent::readObjects();
return new PackageUpdateServerGridView();
}
}
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 @@ -182,6 +182,9 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
$event->register(new \wcf\system\endpoint\controller\core\bbCodes\DeleteBBCodes());
$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\packages\updates\servers\DisableServer());
$event->register(new \wcf\system\endpoint\controller\core\packages\updates\servers\DeleteServer());
$event->register(new \wcf\system\endpoint\controller\core\packages\updates\servers\EnableServer());
}
);

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\PackageUpdateServerGridView;

/**
* Indicates that the provider for package update server 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 PackageUpdateServerGridViewInitialized implements IPsr14Event
{
public function __construct(public readonly PackageUpdateServerGridView $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\PackageUpdateServerInteractions;

/**
* Indicates that the provider for package update server 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 PackageUpdateServerInteractionCollecting implements IPsr14Event
{
public function __construct(public readonly PackageUpdateServerInteractions $provider)
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace wcf\system\endpoint\controller\core\packages\updates\servers;

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use wcf\data\package\update\server\PackageUpdateServer;
use wcf\data\package\update\server\PackageUpdateServerAction;
use wcf\http\Helper;
use wcf\system\endpoint\DeleteRequest;
use wcf\system\endpoint\IController;
use wcf\system\exception\PermissionDeniedException;
use wcf\system\WCF;

/**
* API endpoint for the deletion of package update servers.
*
* @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/packages/updates/servers/{id}')]
final class DeleteServer implements IController
{
#[\Override]
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
{
$server = Helper::fetchObjectFromRequestParameter($variables['id'], PackageUpdateServer::class);

$this->assertServerCanBeDeleted($server);

(new PackageUpdateServerAction([$server], 'delete'))->executeAction();

return new JsonResponse([]);
}

private function assertServerCanBeDeleted(PackageUpdateServer $server): void
{
WCF::getSession()->checkPermissions(['admin.configuration.package.canEditServer']);

if (!$server->canDelete()) {
throw new PermissionDeniedException();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

namespace wcf\system\endpoint\controller\core\packages\updates\servers;

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use wcf\data\package\update\server\PackageUpdateServer;
use wcf\data\package\update\server\PackageUpdateServerAction;
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 package update servers.
*
* @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/packages/updates/servers/{id}/disable')]
final class DisableServer implements IController
{
#[\Override]
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
{
$server = Helper::fetchObjectFromRequestParameter($variables['id'], PackageUpdateServer::class);

$this->assertServerCanBeDisabled($server);

(new PackageUpdateServerAction([$server], 'toggle'))->executeAction();

return new JsonResponse([]);
}

private function assertServerCanBeDisabled(PackageUpdateServer $server): void
{
WCF::getSession()->checkPermissions(['admin.configuration.package.canEditServer']);

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

namespace wcf\system\endpoint\controller\core\packages\updates\servers;

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use wcf\data\package\update\server\PackageUpdateServer;
use wcf\data\package\update\server\PackageUpdateServerAction;
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 package update servers.
*
* @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/packages/updates/servers/{id}/enable')]
final class EnableServer implements IController
{
#[\Override]
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
{
$server = Helper::fetchObjectFromRequestParameter($variables['id'], PackageUpdateServer::class);

$this->assertServerCanBeEnabled($server);

(new PackageUpdateServerAction([$server], 'toggle'))->executeAction();

return new JsonResponse([]);
}

private function assertServerCanBeEnabled(PackageUpdateServer $server): void
{
WCF::getSession()->checkPermissions(['admin.configuration.package.canEditServer']);

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