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
11 changes: 10 additions & 1 deletion ts/WoltLabSuite/Core/Api/Gridviews/GetRow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,19 @@ type Response = {
template: string;
};

export async function getRow(gridViewClass: string, objectId: string | number): Promise<ApiResult<Response>> {
export async function getRow(
gridViewClass: string,
objectId: string | number,
gridViewParameters?: Map<string, string>,
): Promise<ApiResult<Response>> {
const url = new URL(`${window.WSC_RPC_API_URL}core/grid-views/row`);
url.searchParams.set("gridView", gridViewClass);
url.searchParams.set("objectID", objectId.toString());
if (gridViewParameters) {
gridViewParameters.forEach((value, key) => {
url.searchParams.set(`gridViewParameters[${key}]`, value);
});
}

let response: Response;
try {
Expand Down
2 changes: 1 addition & 1 deletion ts/WoltLabSuite/Core/Component/GridView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ export class GridView {
}

async #refreshRow(row: HTMLElement): Promise<void> {
const response = (await getRow(this.#gridClassName, row.dataset.objectId!)).unwrap();
const response = (await getRow(this.#gridClassName, row.dataset.objectId!, this.#gridViewParameters)).unwrap();
row.replaceWith(DomUtil.createFragmentFromHtml(response.template));
DomChangeListener.trigger();
}
Expand Down
58 changes: 3 additions & 55 deletions wcfsetup/install/files/acp/templates/acpSessionLog.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -14,60 +14,8 @@
</nav>
</header>

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

{if $objects|count}
<div class="section tabularBox">
<table class="table">
<thead>
<tr>
<th class="columnID columnSessionAccessLogID{if $sortField == 'sessionAccessLogID'} active {@$sortOrder}{/if}"><a href="{link controller='ACPSessionLog' id=$sessionLogID}pageNo={@$pageNo}&sortField=sessionAccessLogID&sortOrder={if $sortField == 'sessionAccessLogID' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.global.objectID{/lang}</a></th>
<th class="columnURL columnIpAddress{if $sortField == 'ipAddress'} active {@$sortOrder}{/if}"><a href="{link controller='ACPSessionLog' id=$sessionLogID}pageNo={@$pageNo}&sortField=ipAddress&sortOrder={if $sortField == 'ipAddress' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.user.ipAddress{/lang}</a></th>
<th class="columnDate{if $sortField == 'time'} active {@$sortOrder}{/if}"><a href="{link controller='ACPSessionLog' id=$sessionLogID}pageNo={@$pageNo}&sortField=time&sortOrder={if $sortField == 'time' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.sessionLog.time{/lang}</a></th>
<th class="columnText columnClassName{if $sortField == 'className'} active {@$sortOrder}{/if}"><a href="{link controller='ACPSessionLog' id=$sessionLogID}pageNo={@$pageNo}&sortField=className&sortOrder={if $sortField == 'className' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.sessionLog.className{/lang}</a></th>
<th class="columnURL columnRequestURI{if $sortField == 'requestURI'} active {@$sortOrder}{/if}"><a href="{link controller='ACPSessionLog' id=$sessionLogID}pageNo={@$pageNo}&sortField=requestURI&sortOrder={if $sortField == 'requestURI' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.sessionLog.requestURI{/lang}</a></th>
<th class="columnText columnRequestMethod{if $sortField == 'requestMethod'} active {@$sortOrder}{/if}"><a href="{link controller='ACPSessionLog' id=$sessionLogID}pageNo={@$pageNo}&sortField=requestMethod&sortOrder={if $sortField == 'requestMethod' && $sortOrder == 'ASC'}DESC{else}ASC{/if}{/link}">{lang}wcf.acp.sessionLog.requestMethod{/lang}</a></th>

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

<tbody>
{foreach from=$objects item=sessionAccessLog}
<tr>
<td class="columnID columnSessionAccessLogID">{@$sessionAccessLog->sessionAccessLogID}</td>
<td class="columnURL columnIpAddress{if $sessionAccessLog->ipAddress != $sessionLog->ipAddress} hot{/if}">{$sessionAccessLog->getIpAddress()}</td>
<td class="columnDate columnTime">{@$sessionAccessLog->time|time}</td>
<td class="columnText columnClassName">{$sessionAccessLog->className}</td>
<td class="columnURL columnRequestURI" title="{$sessionAccessLog->requestURI}">{$sessionAccessLog->requestURI|truncate:50|tableWordwrap}</td>
<td class="columnText columnRequestMethod">{$sessionAccessLog->requestMethod}</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='ACPSessionLogList'}{/link}" class="button">{icon name='list'} <span>{lang}wcf.acp.sessionLog.list{/lang}</span></a></li>

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

{include file='footer'}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

93 changes: 32 additions & 61 deletions wcfsetup/install/files/lib/acp/page/ACPSessionLogPage.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@

namespace wcf\acp\page;

use wcf\data\acp\session\access\log\ACPSessionAccessLogList;
use wcf\data\acp\session\log\ACPSessionLog;
use wcf\page\SortablePage;
use wcf\page\AbstractGridViewPage;
use wcf\system\exception\IllegalLinkException;
use wcf\system\gridView\AbstractGridView;
use wcf\system\gridView\admin\ACPSessionGridView;
use wcf\system\request\LinkHandler;
use wcf\system\WCF;

/**
* Shows the details of a logged sessions.
*
* @author Marcel Werk
* @copyright 2001-2019 WoltLab GmbH
* @author Olaf Braun, Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
*
* @property ACPSessionAccessLogList $objectList
* @property ACPSessionGridView $gridView
*/
class ACPSessionLogPage extends SortablePage
class ACPSessionLogPage extends AbstractGridViewPage
{
/**
* @inheritDoc
Expand All @@ -34,80 +36,49 @@ class ACPSessionLogPage extends SortablePage
*/
public $neededPermissions = ['admin.management.canViewLog'];

/**
* @inheritDoc
*/
public $defaultSortField = 'time';
public ACPSessionLog $sessionLog;

/**
* @inheritDoc
*/
public $validSortFields = ['sessionAccessLogID', 'ipAddress', 'time', 'requestURI', 'requestMethod', 'className'];

/**
* session log id
* @var int
*/
public $sessionLogID = 0;

/**
* session log object
* @var ACPSessionLog
*/
public $sessionLog;

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

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

// get session log
if (isset($_REQUEST['id'])) {
$this->sessionLogID = \intval($_REQUEST['id']);
if (!isset($_REQUEST['id'])) {
throw new IllegalLinkException();
}
$this->sessionLog = new ACPSessionLog($this->sessionLogID);
$this->sessionLog = new ACPSessionLog(\intval($_REQUEST['id']));
if (!$this->sessionLog->sessionLogID) {
throw new IllegalLinkException();
}
}

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

$this->objectList->getConditionBuilder()->add('sessionLogID = ?', [$this->sessionLogID]);
WCF::getTPL()->assign([
'sessionLog' => $this->sessionLog,
]);
}

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

parent::readObjects();
return new ACPSessionGridView($this->sessionLog->sessionLogID);
}

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

WCF::getTPL()->assign([
'sessionLogID' => $this->sessionLogID,
'sessionLog' => $this->sessionLog,
]);
parent::initGridView();

$this->gridView->setBaseUrl(
LinkHandler::getInstance()->getControllerLink(
ACPSessionLogPage::class,
['id' => $this->sessionLog->sessionLogID]
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ public function handle(ServerRequestInterface $request): ResponseInterface
<<<'EOT'
array {
gridView: string,
filters: string[]
filters: string[],
gridViewParameters: string[]
}
EOT
);
Expand All @@ -41,7 +42,7 @@ public function handle(ServerRequestInterface $request): ResponseInterface
throw new UserInputException('gridView', 'invalid');
}

$view = new $parameters['gridView'];
$view = new $parameters['gridView'](...$parameters['gridViewParameters']);
\assert($view instanceof AbstractGridView);

if (!$view->isAccessible()) {
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\ACPSessionGridView;

/**
* Indicates that the acp session grid view has been initialized.
*
* @author Olaf Braun
* @copyright 2001-2024 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
final class ACPSessionGridViewInitialized implements IPsr14Event
{
public function __construct(public readonly ACPSessionGridView $gridView)
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function __invoke(ServerRequestInterface $request, array $variables): Res
throw new UserInputException('gridView', 'invalid');
}

$view = new $parameters->gridView();
$view = new $parameters->gridView(...$parameters->gridViewParameters);
\assert($view instanceof AbstractGridView);

if (!$view->isAccessible()) {
Expand All @@ -54,5 +54,7 @@ public function __construct(
/** @var non-empty-string */
public readonly string $gridView,
public readonly string|int $objectID,
/** @var string[] */
public readonly array $gridViewParameters,
) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ public function getFilterActionEndpoint(): string
{
return LinkHandler::getInstance()->getControllerLink(
GridViewFilterAction::class,
['gridView' => \get_class($this)]
['gridView' => \get_class($this), 'gridViewParameters' => $this->getParameters()]
);
}

Expand Down
Loading