Skip to content

Commit 704f4bd

Browse files
committed
Migrate WCF.Moderation.Management to Typescript
Closes #6090
1 parent e004b8f commit 704f4bd

File tree

20 files changed

+889
-81
lines changed

20 files changed

+889
-81
lines changed

com.woltlab.wcf/templates/moderationActivation.tpl

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,35 @@
33
{capture assign='contentHeader'}
44
<header class="contentHeader">
55
<div class="contentHeaderTitle">
6-
<h1 class="contentTitle">{$__wcf->getActivePage()->getTitle()}</h1>
7-
8-
{if $queue->lastChangeTime}
9-
<dl class="plain inlineDataList">
10-
<dt>{lang}wcf.moderation.lastChangeTime{/lang}</dt>
11-
<dd>{@$queue->lastChangeTime|time}</dd>
12-
</dl>
13-
{/if}
14-
15-
<dl class="plain inlineDataList" id="moderationAssignedUserContainer">
16-
<dt>{lang}wcf.moderation.assignedUser{/lang}</dt>
17-
<dd id="moderationAssignedUser">
18-
{if $queue->assignedUserID}
19-
<a href="{link controller='User' id=$assignedUserID}{/link}" class="userLink" data-object-id="{@$assignedUserID}">{$queue->assignedUsername}</a>
20-
{else}
21-
{lang}wcf.moderation.assignedUser.nobody{/lang}
22-
{/if}
23-
</dd>
24-
</dl>
25-
26-
<dl class="plain inlineDataList" id="moderationStatusContainer">
27-
<dt>{lang}wcf.moderation.status{/lang}</dt>
28-
<dd id="moderationQueueStatus">{$queue->getStatus()}</dd>
29-
</dl>
6+
<h1 class="contentTitle">{$__wcf->getActivePage()->getTitle()}: {$queue->getTitle()}</h1>
7+
<ul class="inlineList contentHeaderMetaData">
8+
{event name='beforeMetaData'}
9+
10+
{if $queue->lastChangeTime}
11+
<li title="{lang}wcf.moderation.lastChangeTime{/lang}">
12+
{icon name='clock'}
13+
{time time=$queue->lastChangeTime}
14+
</li>
15+
{/if}
16+
17+
<li title="{lang}wcf.moderation.assignedUser{/lang}">
18+
{icon name='user'}
19+
<span id="moderationAssignedUser">
20+
{if $queue->assignedUserID}
21+
<a href="{link controller='User' id=$assignedUserID}{/link}" class="userLink" data-object-id="{$assignedUserID}">{$queue->assignedUsername}</a>
22+
{else}
23+
{lang}wcf.moderation.assignedUser.nobody{/lang}
24+
{/if}
25+
</span>
26+
</li>
27+
28+
<li title="{lang}wcf.moderation.status{/lang}">
29+
{icon name='arrows-rotate'}
30+
<span id="moderationQueueStatus">{$queue->getStatus()}</span>
31+
</li>
32+
33+
{event name='afterMetaData'}
34+
</ul>
3035
</div>
3136

3237
{hascontent}
@@ -53,8 +58,29 @@
5358
<span>{lang}wcf.moderation.assignedUser.change{/lang}</span>
5459
</button>
5560
{if !$queue->isDone()}
56-
<button type="button" id="enableContent" class="contentInteractionButton button small jsOnly">{icon name='check'} <span>{lang}wcf.moderation.activation.enableContent{/lang}</span></button>
57-
{if $queueManager->canRemoveContent($queue->getDecoratedObject())}<button type="button" id="removeContent" class="contentInteractionButton button small jsOnly">{icon name='xmark'} <span>{lang}wcf.moderation.activation.removeContent{/lang}</span></button>{/if}
61+
<button
62+
type="button"
63+
id="enableContent"
64+
class="contentInteractionButton button small jsOnly"
65+
data-object-id="{$queue->queueID}"
66+
data-redirect-url="{link controller='ModerationList'}{/link}"
67+
>
68+
{icon name='check'}
69+
<span>{lang}wcf.moderation.activation.enableContent{/lang}</span>
70+
</button>
71+
{if $queueManager->canRemoveContent($queue->getDecoratedObject())}
72+
<button
73+
type="button"
74+
id="removeContent"
75+
class="contentInteractionButton button small jsOnly"
76+
data-object-id="{$queue->queueID}"
77+
data-object-name="{$queue->getTitle()}"
78+
data-redirect-url="{link controller='ModerationList'}{/link}"
79+
>
80+
{icon name='xmark'}
81+
<span>{lang}wcf.moderation.activation.removeContent{/lang}</span>
82+
</button>
83+
{/if}
5884
{/if}
5985
{/capture}
6086

@@ -65,10 +91,10 @@
6591
<section class="section sectionContainerList">
6692
<header class="sectionHeader">
6793
<h2 class="sectionTitle">{lang}wcf.moderation.activation.content{/lang}</h2>
68-
<p class="sectionDescription">{lang}wcf.moderation.type.{@$queue->getObjectTypeName()}{/lang}</p>
94+
<p class="sectionDescription">{lang}wcf.moderation.type.{$queue->getObjectTypeName()}{/lang}</p>
6995
</header>
7096

71-
{@$disabledContent}
97+
{unsafe:$disabledContent}
7298
</section>
7399

74100
<section id="comments" class="section sectionContainerList moderationComments">
@@ -86,15 +112,17 @@
86112
87113
setup(document.getElementById('moderationAssignUser'));
88114
});
89-
90-
$(function() {
91-
WCF.Language.addObject({
92-
'wcf.moderation.activation.enableContent.confirmMessage': '{jslang}wcf.moderation.activation.enableContent.confirmMessage{/jslang}',
93-
'wcf.moderation.activation.removeContent.confirmMessage': '{jslang}wcf.moderation.activation.removeContent.confirmMessage{/jslang}',
115+
116+
{if !$queue->isDone()}
117+
require(['WoltLabSuite/Core/Controller/Moderation/Activation'], ({ setup }) => {
118+
{jsphrase name='wcf.moderation.activation.enableContent.confirmMessage'}
119+
120+
setup(
121+
document.getElementById('enableContent'),
122+
document.getElementById('removeContent'),
123+
);
94124
});
95-
96-
new WCF.Moderation.Activation.Management({@$queue->queueID}, '{link controller='ModerationList' encode=false}{/link}');
97-
});
125+
{/if}
98126
</script>
99127

100128
{include file='footer'}

com.woltlab.wcf/templates/moderationReport.tpl

Lines changed: 65 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,35 @@
33
{capture assign='contentHeader'}
44
<header class="contentHeader">
55
<div class="contentHeaderTitle">
6-
<h1 class="contentTitle">{$__wcf->getActivePage()->getTitle()}</h1>
7-
8-
{if $queue->lastChangeTime}
9-
<dl class="plain inlineDataList">
10-
<dt>{lang}wcf.moderation.lastChangeTime{/lang}</dt>
11-
<dd>{@$queue->lastChangeTime|time}</dd>
12-
</dl>
13-
{/if}
14-
15-
<dl class="plain inlineDataList" id="moderationAssignedUserContainer">
16-
<dt>{lang}wcf.moderation.assignedUser{/lang}</dt>
17-
<dd id="moderationAssignedUser">
18-
{if $queue->assignedUserID}
19-
<a href="{link controller='User' id=$assignedUserID}{/link}" class="userLink" data-object-id="{@$assignedUserID}">{$queue->assignedUsername}</a>
20-
{else}
21-
{lang}wcf.moderation.assignedUser.nobody{/lang}
22-
{/if}
23-
</dd>
24-
</dl>
25-
26-
<dl class="plain inlineDataList" id="moderationStatusContainer">
27-
<dt>{lang}wcf.moderation.status{/lang}</dt>
28-
<dd id="moderationQueueStatus">{$queue->getStatus()}</dd>
29-
</dl>
6+
<h1 class="contentTitle">{$__wcf->getActivePage()->getTitle()}: {$queue->getTitle()}</h1>
7+
<ul class="inlineList contentHeaderMetaData">
8+
{event name='beforeMetaData'}
9+
10+
{if $queue->lastChangeTime}
11+
<li title="{lang}wcf.moderation.lastChangeTime{/lang}">
12+
{icon name='clock'}
13+
{time time=$queue->lastChangeTime}
14+
</li>
15+
{/if}
16+
17+
<li title="{lang}wcf.moderation.assignedUser{/lang}">
18+
{icon name='user'}
19+
<span id="moderationAssignedUser">
20+
{if $queue->assignedUserID}
21+
<a href="{link controller='User' id=$assignedUserID}{/link}" class="userLink" data-object-id="{$assignedUserID}">{$queue->assignedUsername}</a>
22+
{else}
23+
{lang}wcf.moderation.assignedUser.nobody{/lang}
24+
{/if}
25+
</span>
26+
</li>
27+
28+
<li title="{lang}wcf.moderation.status{/lang}">
29+
{icon name='arrows-rotate'}
30+
<span id="moderationQueueStatus">{$queue->getStatus()}</span>
31+
</li>
32+
33+
{event name='afterMetaData'}
34+
</ul>
3035
</div>
3136

3237
{hascontent}
@@ -54,12 +59,32 @@
5459
</button>
5560
{if !$queue->isDone()}
5661
{if $queueManager->canRemoveContent($queue->getDecoratedObject())}
57-
<button type="button" id="removeContent" class="contentInteractionButton button small jsOnly">{icon name='xmark'} <span>{lang}wcf.moderation.activation.removeContent{/lang}</span></button>
62+
<button
63+
type="button"
64+
id="removeContent"
65+
class="contentInteractionButton button small jsOnly"
66+
data-object-id="{$queue->queueID}"
67+
data-object-name="{$queue->getTitle()}"
68+
data-redirect-url="{link controller='ModerationList'}{/link}"
69+
>{icon name='xmark'} <span>{lang}wcf.moderation.activation.removeContent{/lang}</span></button>
5870
{/if}
59-
<button type="button" id="removeReport" class="contentInteractionButton button small jsOnly">{icon name='square-check'} <span>{lang}wcf.moderation.report.removeReport{/lang}</span></button>
71+
<button
72+
type="button"
73+
id="removeReport"
74+
class="contentInteractionButton button small jsOnly"
75+
data-object-id="{$queue->queueID}"
76+
data-redirect-url="{link controller='ModerationList'}{/link}"
77+
>{icon name='square-check'} <span>{lang}wcf.moderation.report.removeReport{/lang}</span></button>
6078
{/if}
6179
{if $queue->canChangeJustifiedStatus()}
62-
<button type="button" id="changeJustifiedStatus" class="contentInteractionButton button small jsOnly">{icon name='arrows-rotate'} <span>{lang}wcf.moderation.report.changeJustifiedStatus{/lang}</span></button>
80+
<button
81+
type="button"
82+
id="changeJustifiedStatus"
83+
class="contentInteractionButton button small jsOnly"
84+
data-object-id="{$queue->queueID}"
85+
data-redirect-url="{link controller='ModerationReport' object=$queue}{/link}"
86+
data-justified="{if $queue->markAsJustified}true{else}false{/if}"
87+
>{icon name='arrows-rotate'} <span>{lang}wcf.moderation.report.changeJustifiedStatus{/lang}</span></button>
6388
{/if}
6489
{/capture}
6590

@@ -81,22 +106,22 @@
81106
{else}
82107
{lang}wcf.user.guest{/lang}
83108
{/if}
84-
<small class="separatorLeft">{@$queue->time|time}</small>
109+
<small class="separatorLeft">{time time=$queue->time}</small>
85110
</h3>
86111
</div>
87112

88-
<div class="containerContent">{@$queue->getFormattedMessage()}</div>
113+
<div class="containerContent">{unsafe:$queue->getFormattedMessage()}</div>
89114
</div>
90115
</div>
91116
</section>
92117

93118
<section class="section">
94119
<header class="sectionHeader">
95120
<h2 class="sectionTitle">{lang}wcf.moderation.report.reportedContent{/lang}</h2>
96-
<p class="sectionDescription">{lang}wcf.moderation.type.{@$queue->getObjectTypeName()}{/lang}</p>
121+
<p class="sectionDescription">{lang}wcf.moderation.type.{$queue->getObjectTypeName()}{/lang}</p>
97122
</header>
98123

99-
{@$reportedContent}
124+
{unsafe:$reportedContent}
100125
</section>
101126

102127
<section id="comments" class="section sectionContainerList moderationComments">
@@ -115,21 +140,16 @@
115140
setup(document.getElementById('moderationAssignUser'));
116141
});
117142
118-
$(function() {
119-
WCF.Language.addObject({
120-
'wcf.moderation.report.removeContent.confirmMessage': '{jslang}wcf.moderation.report.removeContent.confirmMessage{/jslang}',
121-
'wcf.moderation.report.removeContent.reason': '{jslang}wcf.moderation.report.removeContent.reason{/jslang}',
122-
'wcf.moderation.report.removeReport.confirmMessage': '{jslang}wcf.moderation.report.removeReport.confirmMessage{/jslang}',
123-
'wcf.moderation.report.removeReport.markAsJustified': '{jslang}wcf.moderation.report.removeReport.markAsJustified{/jslang}',
124-
'wcf.moderation.report.removeReport.confirmMessage': '{jslang}wcf.moderation.report.removeReport.confirmMessage{/jslang}',
125-
'wcf.moderation.report.changeJustifiedStatus.markAsJustified': '{jslang}wcf.moderation.report.changeJustifiedStatus.markAsJustified{/jslang}',
126-
'wcf.moderation.report.changeJustifiedStatus.confirmMessage': '{jslang}wcf.moderation.report.changeJustifiedStatus.confirmMessage{/jslang}',
127-
});
143+
require(['WoltLabSuite/Core/Controller/Moderation/Report'], ({ setup }) => {
144+
{jsphrase name='wcf.moderation.report.removeReport.confirmMessage'}
145+
{jsphrase name='wcf.moderation.report.removeReport.markAsJustified'}
146+
{jsphrase name='wcf.moderation.report.changeJustifiedStatus.confirmMessage'}
147+
{jsphrase name='wcf.moderation.report.changeJustifiedStatus.markAsJustified'}
128148
129-
new WCF.Moderation.Report.Management(
130-
{@$queue->queueID},
131-
'{link controller='ModerationList' encode=false}{/link}',
132-
{if $queue->markAsJustified}true{else}false{/if}
149+
setup(
150+
document.getElementById('removeContent'),
151+
document.getElementById('removeReport'),
152+
document.getElementById('changeJustifiedStatus')
133153
);
134154
});
135155
</script>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Changes the justified status of a report.
3+
*
4+
* @author Marcel Werk
5+
* @copyright 2001-2024 WoltLab GmbH
6+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
7+
* @since 6.2
8+
* @woltlabExcludeBundle tiny
9+
*/
10+
11+
import { prepareRequest } from "WoltLabSuite/Core/Ajax/Backend";
12+
import { ApiResult, apiResultFromError, apiResultFromValue } from "../Result";
13+
14+
export async function changeJustifiedStatus(queueId: number, markAsJustified: boolean): Promise<ApiResult<[]>> {
15+
try {
16+
await prepareRequest(`${window.WSC_RPC_API_URL}core/moderation-queues/${queueId}/change-justified-status`)
17+
.post({
18+
markAsJustified,
19+
})
20+
.fetchAsJson();
21+
} catch (e) {
22+
return apiResultFromError(e);
23+
}
24+
25+
return apiResultFromValue([]);
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Closes a report by marking it as done without further processing.
3+
*
4+
* @author Marcel Werk
5+
* @copyright 2001-2024 WoltLab GmbH
6+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
7+
* @since 6.2
8+
* @woltlabExcludeBundle tiny
9+
*/
10+
11+
import { prepareRequest } from "WoltLabSuite/Core/Ajax/Backend";
12+
import { ApiResult, apiResultFromError, apiResultFromValue } from "../Result";
13+
14+
export async function closeReport(queueId: number, markAsJustified: boolean): Promise<ApiResult<[]>> {
15+
try {
16+
await prepareRequest(`${window.WSC_RPC_API_URL}core/moderation-queues/${queueId}/close`)
17+
.post({
18+
markAsJustified,
19+
})
20+
.fetchAsJson();
21+
} catch (e) {
22+
return apiResultFromError(e);
23+
}
24+
25+
return apiResultFromValue([]);
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Deletes the content associated with a moderation queue entry.
3+
*
4+
* @author Marcel Werk
5+
* @copyright 2001-2024 WoltLab GmbH
6+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
7+
* @since 6.2
8+
* @woltlabExcludeBundle tiny
9+
*/
10+
11+
import { prepareRequest } from "WoltLabSuite/Core/Ajax/Backend";
12+
import { ApiResult, apiResultFromError, apiResultFromValue } from "../Result";
13+
14+
export async function deleteContent(queueId: number, message: string): Promise<ApiResult<[]>> {
15+
try {
16+
await prepareRequest(`${window.WSC_RPC_API_URL}core/moderation-queues/${queueId}/delete-content`)
17+
.post({
18+
message,
19+
})
20+
.fetchAsJson();
21+
} catch (e) {
22+
return apiResultFromError(e);
23+
}
24+
25+
return apiResultFromValue([]);
26+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Enables the content associated with a moderation queue entry.
3+
*
4+
* @author Marcel Werk
5+
* @copyright 2001-2024 WoltLab GmbH
6+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
7+
* @since 6.2
8+
* @woltlabExcludeBundle tiny
9+
*/
10+
11+
import { prepareRequest } from "WoltLabSuite/Core/Ajax/Backend";
12+
import { ApiResult, apiResultFromError, apiResultFromValue } from "../Result";
13+
14+
export async function enableContent(queueId: number): Promise<ApiResult<[]>> {
15+
try {
16+
await prepareRequest(`${window.WSC_RPC_API_URL}core/moderation-queues/${queueId}/enable-content`)
17+
.post()
18+
.fetchAsJson();
19+
} catch (e) {
20+
return apiResultFromError(e);
21+
}
22+
23+
return apiResultFromValue([]);
24+
}

0 commit comments

Comments
 (0)