Skip to content

Commit 65c84c5

Browse files
committed
Add label management to ConversationListPage
1 parent 2502436 commit 65c84c5

File tree

12 files changed

+334
-10
lines changed

12 files changed

+334
-10
lines changed

fileDelete.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,12 @@
2424
<file>style/conversation.less</file>
2525
<file>lib/system/clipboard/action/ConversationClipboardAction.class.php</file>
2626
<file>js/WoltLabSuite/Core/Api/Conversations/AssignConversationLabels.js</file>
27-
<file>js/WoltLabSuite/Core/Api/Conversations/GetConversationLabelManager.js</file>
2827
<file>js/WoltLabSuite/Core/Api/Conversations/GetConversationLabels.js</file>
2928
<file>js/WoltLabSuite/Core/Api/Conversations/GetConversationLeaveDialog.js</file>
3029
<file>js/WoltLabSuite/Core/Api/Conversations/LeaveConversation.js</file>
3130
<file>js/WoltLabSuite/Core/Conversation/Component/EditorHandler.js</file>
3231
<file>js/WoltLabSuite/Core/Conversation/Component/Leave.js</file>
3332
<file>js/WoltLabSuite/Core/Conversation/Component/Label/Editor.js</file>
34-
<file>js/WoltLabSuite/Core/Conversation/Component/Label/Manager.js</file>
3533
<file>js/WoltLabSuite/Core/Conversation/Component/Subject/Editor.js</file>
3634
<file>js/WoltLabSuite/Core/Conversation/Clipboard.js</file>
3735
<file>js/WoltLabSuite/Core/Conversation/Ui/Participant/Add.js</file>

files/js/WoltLabSuite/Core/Api/Conversations/GetConversationLabelManager.js

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

files/js/WoltLabSuite/Core/Conversation/Component/Label/Manager.js

Lines changed: 78 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

files/lib/action/AssignConversationLabelDialogAction.class.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use wcf\data\conversation\label\ConversationLabelList;
1212
use wcf\http\Helper;
1313
use wcf\system\conversation\command\AssignConversationLabel;
14+
use wcf\system\database\util\PreparedStatementConditionBuilder;
1415
use wcf\system\exception\IllegalLinkException;
1516
use wcf\system\exception\PermissionDeniedException;
1617
use wcf\system\form\builder\field\MultipleSelectionFormField;
@@ -93,7 +94,7 @@ private function getForm(array $conversationIDs, ConversationLabelList $labelLis
9394
->options(
9495
\array_map(static fn (ConversationLabel $label) => $label->render(), $labelList->getObjects())
9596
)
96-
->value($this->getSelectedLabelIDs($conversationIDs)),
97+
->value($this->getSelectedLabelIDs($conversationIDs, $labelList)),
9798
]);
9899

99100
$form->markRequiredFields(false);
@@ -107,17 +108,21 @@ private function getForm(array $conversationIDs, ConversationLabelList $labelLis
107108
*
108109
* @return int[]
109110
*/
110-
private function getSelectedLabelIDs(array $conversationIDs): array
111+
private function getSelectedLabelIDs(array $conversationIDs, ConversationLabelList $labelList): array
111112
{
112113
if (\count($conversationIDs) !== 1) {
113114
return [];
114115
}
115116

117+
$conditionBuilder = new PreparedStatementConditionBuilder();
118+
$conditionBuilder->add('conversationID = ?', [\reset($conversationIDs)]);
119+
$conditionBuilder->add('labelID IN (?)', [$labelList->getObjectIDs()]);
120+
116121
$sql = "SELECT labelID
117122
FROM wcf1_conversation_label_to_object
118-
WHERE conversationID = ?";
123+
{$conditionBuilder}";
119124
$statement = WCF::getDB()->prepare($sql);
120-
$statement->execute([\reset($conversationIDs)]);
125+
$statement->execute($conditionBuilder->getParameters());
121126

122127
return $statement->fetchAll(\PDO::FETCH_COLUMN) ?: [];
123128
}

files/lib/bootstrap/com.woltlab.wcf.conversation.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
4848
$event->register(new \wcf\system\endpoint\controller\core\conversations\GetConversationHeaderTitle());
4949
$event->register(new \wcf\system\endpoint\controller\core\conversations\RemoveConversationParticipant());
5050
$event->register(new \wcf\system\endpoint\controller\core\conversations\GetConversationParticipantList());
51+
$event->register(new \wcf\system\endpoint\controller\core\conversations\GetConversationLabelManager());
5152
}
5253
);
5354
};
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace wcf\system\endpoint\controller\core\conversations;
4+
5+
use Laminas\Diactoros\Response\JsonResponse;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\ServerRequestInterface;
8+
use wcf\data\conversation\label\ConversationLabel;
9+
use wcf\system\endpoint\GetRequest;
10+
use wcf\system\endpoint\IController;
11+
use wcf\system\exception\PermissionDeniedException;
12+
use wcf\system\WCF;
13+
14+
/**
15+
* API endpoint for rendering the label manager dialog.
16+
*
17+
* @author Olaf Braun
18+
* @copyright 2001-2025 WoltLab GmbH
19+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
20+
* @since 6.2
21+
*/
22+
#[GetRequest('/core/conversations/label-manager')]
23+
final class GetConversationLabelManager implements IController
24+
{
25+
#[\Override]
26+
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
27+
{
28+
if (!WCF::getUser()->userID) {
29+
throw new PermissionDeniedException();
30+
}
31+
32+
if (!WCF::getSession()->getPermission('user.conversation.canUseConversation')) {
33+
throw new PermissionDeniedException();
34+
}
35+
36+
return new JsonResponse([
37+
'template' => WCF::getTPL()->render('wcf', 'conversationLabelManagement', [
38+
'cssClassNames' => ConversationLabel::getLabelCssClassNames(),
39+
'labelList' => ConversationLabel::getLabelsByUser(),
40+
]),
41+
'maxLabels' => WCF::getSession()->getPermission('user.conversation.maxLabels'),
42+
'labelCount' => \count(ConversationLabel::getLabelsByUser()),
43+
]);
44+
}
45+
}

files/lib/system/listView/user/ConversationListView.class.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ public function applyFilter(DatabaseObjectList $list, string $value): void
120120
#[\Override]
121121
public function renderValue(string $value): string
122122
{
123-
return $this->labelList->search((int)$value)->label;
123+
$label = $this->labelList->search((int)$value);
124+
125+
return $label ? $label->label : '';
124126
}
125127
};
126128
}

templateDelete.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
<template>conversationListUserPanel</template>
55
<template>conversationLabelAssignment</template>
66
<template>conversationLeave</template>
7-
<template>conversationLabelManagement</template>
87
<template>conversationAddParticipants</template>
98
</delete>
109
</data>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{hascontent}
2+
<section class="section">
3+
<header class="sectionHeader">
4+
<h2 class="sectionTitle">{lang}wcf.conversation.label.management.existingLabels{/lang}</h2>
5+
<p class="sectionDescription">{lang}wcf.conversation.label.management.edit.description{/lang}</p>
6+
</header>
7+
<ul class="conversationLabelList">
8+
{content}
9+
{foreach from=$labelList item=label}
10+
<li>
11+
<button type="button" class="badge label{if $label->cssClassName} {$label->cssClassName}{/if}" data-label-id="{$label->labelID}" data-css-class-name="{if $label->cssClassName}{$label->cssClassName}{else}none{/if}">{$label->label}</button>
12+
</li>
13+
{/foreach}
14+
{/content}
15+
</ul>
16+
</section>
17+
{/hascontent}
18+
19+
<section class="section">
20+
<button type="button" class="button addLabel buttonPrimary">{lang}wcf.conversation.label.management.addLabel{/lang}</button>
21+
</section>

templates/conversationList.tpl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@
8080
{if $__wcf->user->userID}
8181
<button type="button" class="markAllAsReadButton contentInteractionButton button small jsOnly">{icon name='check'} <span>{lang}wcf.global.button.markAllAsRead{/lang}</span></button>
8282
{/if}
83+
84+
<button type="button" id="manageLabel" class="button contentInteractionButton small">{lang}wcf.conversation.label.management{/lang}</button>
8385
{/capture}
8486

8587
{capture assign='contentInteractionDropdownItems'}
@@ -92,12 +94,18 @@
9294
{unsafe:$listView->render()}
9395
</div>
9496

95-
9697
{if $__wcf->user->userID}
9798
<script data-relocate="true">
98-
require(['WoltLabSuite/Core/Conversation/Ui/MarkAllAsRead', 'WoltLabSuite/Core/Conversation/Ui/MarkAsRead'], (MarkAllAsRead, MarkAsRead) => {
99+
{jsphrase name='wcf.conversation.label.management'}
100+
require([
101+
'WoltLabSuite/Core/Conversation/Ui/MarkAllAsRead',
102+
'WoltLabSuite/Core/Conversation/Ui/MarkAsRead',
103+
'WoltLabSuite/Core/Conversation/Component/Label/Manager'
104+
], (MarkAllAsRead, MarkAsRead, { LabelManager }) => {
99105
MarkAllAsRead.setup();
100106
MarkAsRead.setup();
107+
108+
new LabelManager('{unsafe:$listView->getID()|encodeJS}', '{link controller='ConversationLabelForm'}{/link}');
101109
});
102110
</script>
103111
{/if}

0 commit comments

Comments
 (0)