Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
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
1 change: 1 addition & 0 deletions com.woltlab.wcf/templates/headIncludeJavaScript.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ window.addEventListener('pageshow', function(event) {
{foreach from=$__wcf->getMessageQuoteManager()->getUsedQuotes() key=editorID item=uuids}['{unsafe:$editorID|encodeJS}', [{implode from=$uuids item=uuid}'{unsafe:$uuid|encodeJS}'{/implode}]]{/foreach}
]),
{/if}
reportEndpoint: '{link controller="Report"}{/link}',
});
});
</script>
Expand Down
88 changes: 4 additions & 84 deletions com.woltlab.wcf/templates/moderationActivation.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,7 @@

{capture assign='contentHeader'}
<header class="contentHeader">
<div class="contentHeaderTitle">
<h1 class="contentTitle">{$__wcf->getActivePage()->getTitle()}: {$queue->getTitle()}</h1>
<ul class="inlineList contentHeaderMetaData">
{event name='beforeMetaData'}

{if $queue->lastChangeTime}
<li title="{lang}wcf.moderation.lastChangeTime{/lang}">
{icon name='clock'}
{time time=$queue->lastChangeTime}
</li>
{/if}

<li title="{lang}wcf.moderation.assignedUser{/lang}">
{icon name='user'}
<span id="moderationAssignedUser">
{if $queue->assignedUserID}
<a href="{link controller='User' id=$assignedUserID}{/link}" class="userLink" data-object-id="{$assignedUserID}">{$queue->assignedUsername}</a>
{else}
{lang}wcf.moderation.assignedUser.nobody{/lang}
{/if}
</span>
</li>

<li title="{lang}wcf.moderation.status{/lang}">
{icon name='arrows-rotate'}
<span id="moderationQueueStatus">{$queue->getStatus()}</span>
</li>

{event name='afterMetaData'}
</ul>
</div>
{include file='moderationContentHeader' title=$__wcf->getActivePage()->getTitle() queue=$queue sandbox=true}

{hascontent}
<nav class="contentHeaderNavigation">
Expand All @@ -48,40 +18,9 @@
{/capture}

{capture assign='contentInteractionButtons'}
<button
type="button"
id="moderationAssignUser"
class="contentInteractionButton button small jsOnly"
data-url="{$queue->endpointAssignUser()}"
>
{icon name='user-plus' type='solid'}
<span>{lang}wcf.moderation.assignedUser.change{/lang}</span>
</button>
{if !$queue->isDone()}
<button
type="button"
id="enableContent"
class="contentInteractionButton button small jsOnly"
data-object-id="{$queue->queueID}"
data-redirect-url="{link controller='ModerationList'}{/link}"
>
{icon name='check'}
<span>{lang}wcf.moderation.activation.enableContent{/lang}</span>
</button>
{if $queueManager->canRemoveContent($queue->getDecoratedObject())}
<button
type="button"
id="removeContent"
class="contentInteractionButton button small jsOnly"
data-object-id="{$queue->queueID}"
data-object-name="{$queue->getTitle()}"
data-redirect-url="{link controller='ModerationList'}{/link}"
>
{icon name='xmark'}
<span>{lang}wcf.moderation.activation.removeContent{/lang}</span>
</button>
{/if}
{/if}
<div class="contentInteractionButton">
{unsafe:$interactionContextMenu->render()}
</div>
{/capture}

{include file='header'}
Expand All @@ -106,23 +45,4 @@
{include file='comments' commentContainerID='moderationQueueCommentList' commentObjectID=$queueID}
</section>

<script data-relocate="true">
require(['WoltLabSuite/Core/Controller/Moderation/AssignUser'], ({ setup }) => {
{jsphrase name='wcf.moderation.assignedUser.nobody'}

setup(document.getElementById('moderationAssignUser'));
});

{if !$queue->isDone()}
require(['WoltLabSuite/Core/Controller/Moderation/Activation'], ({ setup }) => {
{jsphrase name='wcf.moderation.activation.enableContent.confirmMessage'}

setup(
document.getElementById('enableContent'),
document.getElementById('removeContent'),
);
});
{/if}
</script>

{include file='footer'}
29 changes: 29 additions & 0 deletions com.woltlab.wcf/templates/moderationContentHeader.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<div class="contentHeaderTitle">
<h1 class="contentTitle">{$title}: {$queue->getTitle()}</h1>
<ul class="inlineList contentHeaderMetaData">
{event name='beforeMetaData'}

{if $queue->lastChangeTime}
<li title="{lang}wcf.moderation.lastChangeTime{/lang}">
{icon name='clock'}
{time time=$queue->lastChangeTime}
</li>
{/if}

<li title="{lang}wcf.moderation.assignedUser{/lang}">
{icon name='user'}
{if $queue->assignedUserID}
<a href="{link controller='User' id=$queue->assignedUserID}{/link}" class="userLink" data-object-id="{$queue->assignedUserID}">{$queue->assignedUsername}</a>
{else}
{lang}wcf.moderation.assignedUser.nobody{/lang}
{/if}
</li>

<li title="{lang}wcf.moderation.status{/lang}">
{icon name='arrows-rotate'}
{$queue->getStatus()}
</li>

{event name='afterMetaData'}
</ul>
</div>
94 changes: 4 additions & 90 deletions com.woltlab.wcf/templates/moderationReport.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,7 @@

{capture assign='contentHeader'}
<header class="contentHeader">
<div class="contentHeaderTitle">
<h1 class="contentTitle">{$__wcf->getActivePage()->getTitle()}: {$queue->getTitle()}</h1>
<ul class="inlineList contentHeaderMetaData">
{event name='beforeMetaData'}

{if $queue->lastChangeTime}
<li title="{lang}wcf.moderation.lastChangeTime{/lang}">
{icon name='clock'}
{time time=$queue->lastChangeTime}
</li>
{/if}

<li title="{lang}wcf.moderation.assignedUser{/lang}">
{icon name='user'}
<span id="moderationAssignedUser">
{if $queue->assignedUserID}
<a href="{link controller='User' id=$assignedUserID}{/link}" class="userLink" data-object-id="{$assignedUserID}">{$queue->assignedUsername}</a>
{else}
{lang}wcf.moderation.assignedUser.nobody{/lang}
{/if}
</span>
</li>

<li title="{lang}wcf.moderation.status{/lang}">
{icon name='arrows-rotate'}
<span id="moderationQueueStatus">{$queue->getStatus()}</span>
</li>

{event name='afterMetaData'}
</ul>
</div>
{include file='moderationContentHeader' title=$__wcf->getActivePage()->getTitle() queue=$queue sandbox=true}

{hascontent}
<nav class="contentHeaderNavigation">
Expand All @@ -48,44 +18,9 @@
{/capture}

{capture assign='contentInteractionButtons'}
<button
type="button"
id="moderationAssignUser"
class="contentInteractionButton button small jsOnly"
data-url="{$queue->endpointAssignUser()}"
>
{icon name='user-plus' type='solid'}
<span>{lang}wcf.moderation.assignedUser.change{/lang}</span>
</button>
{if !$queue->isDone()}
{if $queueManager->canRemoveContent($queue->getDecoratedObject())}
<button
type="button"
id="removeContent"
class="contentInteractionButton button small jsOnly"
data-object-id="{$queue->queueID}"
data-object-name="{$queue->getTitle()}"
data-redirect-url="{link controller='ModerationList'}{/link}"
>{icon name='xmark'} <span>{lang}wcf.moderation.activation.removeContent{/lang}</span></button>
{/if}
<button
type="button"
id="removeReport"
class="contentInteractionButton button small jsOnly"
data-object-id="{$queue->queueID}"
data-redirect-url="{link controller='ModerationList'}{/link}"
>{icon name='square-check'} <span>{lang}wcf.moderation.report.removeReport{/lang}</span></button>
{/if}
{if $queue->canChangeJustifiedStatus()}
<button
type="button"
id="changeJustifiedStatus"
class="contentInteractionButton button small jsOnly"
data-object-id="{$queue->queueID}"
data-redirect-url="{link controller='ModerationReport' object=$queue}{/link}"
data-justified="{if $queue->markAsJustified}true{else}false{/if}"
>{icon name='arrows-rotate'} <span>{lang}wcf.moderation.report.changeJustifiedStatus{/lang}</span></button>
{/if}
<div class="contentInteractionButton">
{unsafe:$interactionContextMenu->render()}
</div>
{/capture}

{include file='header'}
Expand Down Expand Up @@ -133,25 +68,4 @@
{include file='comments' commentContainerID='moderationQueueCommentList' commentObjectID=$queueID}
</section>

<script data-relocate="true">
require(['WoltLabSuite/Core/Controller/Moderation/AssignUser'], ({ setup }) => {
{jsphrase name='wcf.moderation.assignedUser.nobody'}

setup(document.getElementById('moderationAssignUser'));
});

require(['WoltLabSuite/Core/Controller/Moderation/Report'], ({ setup }) => {
{jsphrase name='wcf.moderation.report.removeReport.confirmMessage'}
{jsphrase name='wcf.moderation.report.removeReport.markAsJustified'}
{jsphrase name='wcf.moderation.report.changeJustifiedStatus.confirmMessage'}
{jsphrase name='wcf.moderation.report.changeJustifiedStatus.markAsJustified'}

setup(
document.getElementById('removeContent'),
document.getElementById('removeReport'),
document.getElementById('changeJustifiedStatus')
);
});
</script>

{include file='footer'}
6 changes: 0 additions & 6 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
parameters:
ignoreErrors:
-
message: '#^Variable \$this might not be defined\.$#'
identifier: variable.undefined
count: 1
path: wcfsetup/install/files/acp/update_com.woltlab.wcf_6.1_spider_step1.php

-
message: '#^Property wcf\\acp\\form\\AbstractCategoryAddForm\:\:\$categoryNodeTree \(wcf\\data\\category\\UncachedCategoryNodeTree\) does not accept wcf\\data\\category\\CategoryNodeTree\.$#'
identifier: assign.propertyType
Expand Down
2 changes: 1 addition & 1 deletion ts/WoltLabSuite/Core/Api/ModerationQueues/DeleteContent.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Deletes the content associated with a moderation queue entry.
* Deletes the content associated with a moderation queue.
*
* @author Marcel Werk
* @copyright 2001-2024 WoltLab GmbH
Expand Down
2 changes: 1 addition & 1 deletion ts/WoltLabSuite/Core/Api/ModerationQueues/EnableContent.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Enables the content associated with a moderation queue entry.
* Enables the content associated with a moderation queue.
*
* @author Marcel Werk
* @copyright 2001-2024 WoltLab GmbH
Expand Down
32 changes: 32 additions & 0 deletions ts/WoltLabSuite/Core/Api/ModerationQueues/GetUserMenuItems.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* Retrieves the user menu items for the moderation queues.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
* @woltlabExcludeBundle tiny
*/

import { prepareRequest } from "WoltLabSuite/Core/Ajax/Backend";
import { ApiResult, apiResultFromError, apiResultFromValue } from "../Result";
import { UserMenuData } from "WoltLabSuite/Core/Ui/User/Menu/Data/Provider";

type Response = {
unreadModerationCount: number;
items: UserMenuData[];
};

export async function getUserMenuItems(): Promise<ApiResult<Response>> {
let response: Response;

try {
response = (await prepareRequest(`${window.WSC_RPC_API_URL}core/moderation-queues/user-menu-items`)
.get()
.fetchAsJson()) as Response;
} catch (e) {
return apiResultFromError(e);
}

return apiResultFromValue(response);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/**
* Marks all moderation queues as read.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
* @woltlabExcludeBundle tiny
*/

import { prepareRequest } from "WoltLabSuite/Core/Ajax/Backend";
import { ApiResult, apiResultFromError, apiResultFromValue } from "../Result";

export async function markAllModerationQueuesAsRead(): Promise<ApiResult<[]>> {
try {
await prepareRequest(`${window.WSC_RPC_API_URL}core/moderation-queues/mark-all-as-read`).post().fetchAsJson();
} catch (e) {
return apiResultFromError(e);
}

return apiResultFromValue([]);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/**
* Marks a moderation queue as read.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
* @woltlabExcludeBundle tiny
*/

import { prepareRequest } from "WoltLabSuite/Core/Ajax/Backend";
import { ApiResult, apiResultFromError, apiResultFromValue } from "../Result";

type Response = {
unreadModerationItems: number;
};

export async function markModerationQueueAsRead(queueId: number): Promise<ApiResult<Response>> {
let response: Response;

try {
response = (await prepareRequest(`${window.WSC_RPC_API_URL}core/moderation-queues/${queueId}/mark-as-read`)
.post()
.fetchAsJson()) as Response;
} catch (e) {
return apiResultFromError(e);
}

return apiResultFromValue(response);
}
3 changes: 0 additions & 3 deletions ts/WoltLabSuite/Core/Bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,6 @@ export function setup(options: BoostrapOptions): void {
});
}

whenFirstSeen("[data-report-content]", () => {
void import("./Ui/Moderation/Report").then(({ setup }) => setup());
});
whenFirstSeen(".messageTabMenu", () => {
void import("./Component/Message/MessageTabMenu").then(({ setup }) => setup());
});
Expand Down
4 changes: 4 additions & 0 deletions ts/WoltLabSuite/Core/BootstrapFrontend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ interface BootstrapOptions {
styleChanger: boolean;
removeQuotes?: string[];
usedQuotes?: Map<string, string[]>;
reportEndpoint: string;
}

/**
Expand Down Expand Up @@ -167,4 +168,7 @@ export function setup(options: BootstrapOptions): void {
whenFirstSeen("[data-ignore-user]", () => {
void import("./Component/User/Ignore").then(({ setup }) => setup());
});
whenFirstSeen("[data-report-content]", () => {
void import("./Ui/Moderation/Report").then(({ setup }) => setup(options.reportEndpoint));
});
}
Loading