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
14 changes: 10 additions & 4 deletions wcfsetup/install/files/acp/js/WCF.ACP.js
Original file line number Diff line number Diff line change
Expand Up @@ -474,9 +474,7 @@ WCF.ACP.Package.Uninstallation = WCF.ACP.Package.Installation.extend({
this._elements = elements;
this._packageID = 0;

if (this._elements !== undefined && this._elements.length) {
this._super(0, 'UninstallPackage');
}
this._super(0, 'UninstallPackage');
},

/**
Expand All @@ -498,7 +496,15 @@ WCF.ACP.Package.Uninstallation = WCF.ACP.Package.Installation.extend({
* @see WCF.ACP.Package.Installation.init()
*/
_init: function() {
this._elements.click($.proxy(this._showConfirmationDialog, this));
//this._elements.click($.proxy(this._showConfirmationDialog, this));

require(['WoltLabSuite/Core/Helper/Selector'], ({ wheneverFirstSeen }) => {
wheneverFirstSeen(".jsUninstallButton", (button) => {
button.addEventListener('click', (event) => {
this._showConfirmationDialog(event);
});
});
});
},

/**
Expand Down
85 changes: 4 additions & 81 deletions wcfsetup/install/files/acp/templates/packageList.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

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

{hascontent}
Expand Down Expand Up @@ -72,85 +72,8 @@
{/if}
{/if}

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

{if $objects|count}
<div class="section tabularBox">
<table class="table">
<thead>
<tr>
<th colspan="2" class="columnID{if $sortField == 'packageID'} active {@$sortOrder}{/if}"><a href="{link controller='PackageList'}pageNo={@$pageNo}&sortField=packageID&sortOrder={if $sortField == 'packageID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
<th class="columnTitle{if $sortField == 'packageNameI18n'} active {@$sortOrder}{/if}"><a href="{link controller='PackageList'}pageNo={@$pageNo}&sortField=packageNameI18n&sortOrder={if $sortField == 'packageNameI18n' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.package.name{/lang}</a></th>
<th class="columnText{if $sortField == 'author'} active {@$sortOrder}{/if}"><a href="{link controller='PackageList'}pageNo={@$pageNo}&sortField=author&sortOrder={if $sortField == 'author' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.package.author{/lang}</a></th>
<th class="columnText">{lang}wcf.acp.package.version{/lang}</th>
<th class="columnDate{if $sortField == 'updateDate'} active {@$sortOrder}{/if}"><a href="{link controller='PackageList'}pageNo={@$pageNo}&sortField=updateDate&sortOrder={if $sortField == 'updateDate' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.package.updateDate{/lang}</a></th>

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

<tbody>
{foreach from=$objects item=$package}
<tr class="jsPackageRow" data-package="{$package->package}">
<td class="columnIcon">
{if $package->canUninstall()}
<button type="button" class="jsUninstallButton jsTooltip" title="{lang}wcf.acp.package.button.uninstall{/lang}" data-object-id="{@$package->packageID}" data-confirm-message="{lang __encode=true}wcf.acp.package.uninstallation.confirm{/lang}" data-is-required="{if $package->isRequired()}true{else}false{/if}" data-is-application="{if $package->isApplication}true{else}false{/if}">
{icon name='xmark'}
</button>
{else}
<span class="disabled" title="{lang}wcf.acp.package.button.uninstall{/lang}">
{icon name='xmark'}
</span>
{/if}

{event name='rowButtons'}
</td>
<td class="columnID">{@$package->packageID}</td>
<td id="packageName{@$package->packageID}" class="columnTitle" title="{$package->getDescription()}">
<a href="{link controller='Package' id=$package->packageID}{/link}"><span>{$package}</span></a>
{if $taintedApplications[$package->packageID]|isset}
<span class="jsTooltip" title="{lang taintedApplication=null}wcf.acp.package.application.isTainted{/lang}">
{icon name='triangle-exclamation'}
</span>
{/if}
</td>
<td class="columnText">{if $package->authorURL}<a href="{$package->authorURL}" class="externalURL"{if EXTERNAL_LINK_TARGET_BLANK} target="_blank" rel="noopener"{/if}>{$package->author}</a>{else}{$package->author}{/if}</td>
<td class="columnText">{$package->packageVersion}</td>
<td class="columnDate">{@$package->updateDate|time}</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}
{if $__wcf->session->getPermission('admin.configuration.package.canInstallPackage')}
<li><a href="{link controller='PackageStartInstall'}action=install{/link}" class="button">{icon name='plus'} <span>{lang}wcf.acp.package.startInstall{/lang}</span></a></li>
{/if}

{event name='contentFooterNavigation'}
{/content}
</ul>
</nav>
{/hascontent}
</footer>
{/if}
<div class="section">
{unsafe:$gridView->render()}
</div>

{include file='footer'}
70 changes: 13 additions & 57 deletions wcfsetup/install/files/lib/acp/page/PackageListPage.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@

namespace wcf\acp\page;

use wcf\data\package\I18nPackageList;
use wcf\data\package\update\server\PackageUpdateServer;
use wcf\page\SortablePage;
use wcf\page\AbstractGridViewPage;
use wcf\system\application\ApplicationHandler;
use wcf\system\gridView\admin\PackageGridView;
use wcf\system\language\LanguageFactory;
use wcf\system\WCF;

/**
* Shows a list of all installed packages.
*
* @author Marcel Werk
* @copyright 2001-2019 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @author Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
*
* @extends SortablePage<I18nPackageList>
* @extends AbstractGridViewPage<PackageGridView>
*/
class PackageListPage extends SortablePage
final class PackageListPage extends AbstractGridViewPage
{
/**
* @inheritDoc
Expand All @@ -33,47 +33,13 @@ class PackageListPage extends SortablePage
'admin.configuration.package.canUninstallPackage',
];

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

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

/**
* @inheritDoc
*/
public $defaultSortOrder = 'DESC';

/**
* @inheritDoc
*/
public $validSortFields = [
'packageID',
'package',
'packageDir',
'packageNameI18n',
'packageDescription',
'packageDate',
'packageURL',
'isApplication',
'author',
'authorURL',
'installDate',
'updateDate',
];

/**
* @inheritDoc
*/
public $objectListClassName = I18nPackageList::class;
#[\Override]
protected function createGridView(): PackageGridView
{
return new PackageGridView();
}

/**
* @inheritDoc
*/
#[\Override]
public function assignVariables()
{
parent::assignVariables();
Expand All @@ -94,14 +60,4 @@ public function assignVariables()
'upgradeOverrideEnabled' => PackageUpdateServer::isUpgradeOverrideEnabled(),
]);
}

/**
* @inheritDoc
*/
protected function readObjects()
{
$this->sqlOrderBy = ($this->sortField == 'packageNameI18n' ? '' : 'package.') . ($this->sortField == 'packageType' ? 'isApplication ' . $this->sortOrder : $this->sortField . ' ' . $this->sortOrder) . ($this->sortField != 'packageNameI18n' ? ', packageNameI18n ASC' : '');

parent::readObjects();
}
}
18 changes: 18 additions & 0 deletions wcfsetup/install/files/lib/data/package/Package.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use wcf\acp\page\PackagePage;
use wcf\data\DatabaseObject;
use wcf\data\ILinkableObject;
use wcf\system\application\ApplicationHandler;
use wcf\system\package\PackageInstallationDispatcher;
use wcf\system\request\IRouteController;
use wcf\system\request\LinkHandler;
Expand Down Expand Up @@ -460,4 +461,21 @@ public static function writeConfigFile($packageID)

\file_put_contents($packageDir . PackageInstallationDispatcher::CONFIG_FILE, $content);
}

/**
* @since 6.2
*/
public function isTainted(): bool
{
if (!$this->isApplication) {
return false;
}

$package = ApplicationHandler::getInstance()->getApplicationByID($this->packageID);
if ($package === null) {
return false;
}

return $package->isTainted;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace wcf\event\gridView\admin;

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

/**
* Indicates that the package grid view has been initialized.
*
* @author marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
final class PackageGridViewInitialized implements IPsr14Event
{
public function __construct(public readonly PackageGridView $gridView) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace wcf\event\interaction\admin;

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

/**
* Indicates that the provider for packages is collecting interactions.
*
* @author Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
final class PackageInteractionCollecting implements IPsr14Event
{
public function __construct(public readonly PackageInteractions $provider) {}
}
Loading