Skip to content

Commit 85cda97

Browse files
committed
Add new page to manage the conversation labels
1 parent 65c84c5 commit 85cda97

File tree

15 files changed

+352
-174
lines changed

15 files changed

+352
-174
lines changed

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

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

files/lib/action/ConversationLabelFormAction.class.php

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,14 @@
1010
use wcf\data\conversation\label\ConversationLabelAction;
1111
use wcf\data\IStorableObject;
1212
use wcf\http\Helper;
13+
use wcf\system\exception\NamedUserException;
1314
use wcf\system\exception\PermissionDeniedException;
1415
use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
1516
use wcf\system\form\builder\field\BadgeColorFormField;
16-
use wcf\system\form\builder\field\CheckboxFormField;
17-
use wcf\system\form\builder\field\dependency\EmptyFormFieldDependency;
1817
use wcf\system\form\builder\field\TextFormField;
1918
use wcf\system\form\builder\IFormDocument;
2019
use wcf\system\form\builder\Psr15DialogForm;
2120
use wcf\system\WCF;
22-
use wcf\util\StringUtil;
2321

2422
/**
2523
* Action for adding/editing conversation labels.
@@ -60,7 +58,7 @@ public function handle(ServerRequestInterface $request): ResponseInterface
6058
\count(ConversationLabel::getLabelsByUser())
6159
>= WCF::getSession()->getPermission('user.conversation.maxLabels')
6260
) {
63-
throw new PermissionDeniedException();
61+
throw new NamedUserException(WCF::getLanguage()->get('wcf.conversation.label.management.addLabel.maxLabels'));
6462
}
6563

6664
$form = $this->getForm($label);
@@ -74,36 +72,21 @@ public function handle(ServerRequestInterface $request): ResponseInterface
7472
}
7573

7674
$data = $form->getData()['data'];
77-
$deleteLabel = $label && ($data['deleteLabel'] ?? false);
78-
unset($data['deleteLabel']);
79-
80-
if ($deleteLabel) {
81-
(new ConversationLabelAction([$label], 'delete'))->executeAction();
8275

83-
$labelID = $label->labelID;
84-
} elseif ($label) {
76+
if ($label) {
8577
(new ConversationLabelAction([$label], 'update', [
8678
'data' => $data,
8779
]))->executeAction();
88-
89-
$labelID = $label->labelID;
9080
} else {
91-
$returnValues = (new ConversationLabelAction([], 'create', [
81+
(new ConversationLabelAction([], 'create', [
9282
'data' => \array_merge($data, [
9383
'userID' => WCF::getUser()->userID,
9484
]),
9585
]))->executeAction();
96-
97-
$labelID = $returnValues['returnValues']->labelID;
9886
}
9987

10088
return new JsonResponse([
101-
'result' => [
102-
'deleteLabel' => $deleteLabel,
103-
'label' => $deleteLabel ? '' : StringUtil::encodeHTML($data['label']),
104-
'cssClassName' => $deleteLabel ? '' : $data['cssClassName'],
105-
'labelID' => $labelID,
106-
],
89+
'result' => [],
10790
]);
10891
} else {
10992
throw new \LogicException('Unreachable');
@@ -118,10 +101,6 @@ private function getForm(?ConversationLabel $label): Psr15DialogForm
118101
'labelName' => $label->label,
119102
]) : WCF::getLanguage()->get('wcf.conversation.label.management.addLabel')
120103
);
121-
$deleteLabel = CheckboxFormField::create('deleteLabel')
122-
->label('wcf.conversation.label.management.deleteLabel')
123-
->available($label !== null)
124-
->value(false);
125104
$labelFormField = TextFormField::create('label')
126105
->label('wcf.conversation.label.labelName')
127106
->required();
@@ -134,20 +113,7 @@ private function getForm(?ConversationLabel $label): Psr15DialogForm
134113
->value('none')
135114
->required();
136115

137-
if ($label !== null) {
138-
$cssClassNameFormField
139-
->addDependency(
140-
EmptyFormFieldDependency::create('deleteDependency')
141-
->fieldId('deleteLabel')
142-
);
143-
$labelFormField->addDependency(
144-
EmptyFormFieldDependency::create('deleteDependency')
145-
->fieldId('deleteLabel')
146-
);
147-
}
148-
149116
$form->appendChildren([
150-
$deleteLabel,
151117
$labelFormField,
152118
$cssClassNameFormField,
153119
]);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ static function (\wcf\event\endpoint\ControllerCollecting $event) {
4949
$event->register(new \wcf\system\endpoint\controller\core\conversations\RemoveConversationParticipant());
5050
$event->register(new \wcf\system\endpoint\controller\core\conversations\GetConversationParticipantList());
5151
$event->register(new \wcf\system\endpoint\controller\core\conversations\GetConversationLabelManager());
52+
$event->register(new \wcf\system\endpoint\controller\core\conversations\labels\DeleteConversationLabel());
5253
}
5354
);
5455
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace wcf\event\gridView\user;
4+
5+
use wcf\event\IPsr14Event;
6+
use wcf\system\gridView\user\ConversationLabelGridView;
7+
8+
/**
9+
* Indicates that the conversation label grid view has been initialized.
10+
*
11+
* @author Olaf Braun
12+
* @copyright 2001-2025 WoltLab GmbH
13+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14+
* @since 6.2
15+
*/
16+
final class ConversationLabelGridViewInitialized implements IPsr14Event
17+
{
18+
public function __construct(public readonly ConversationLabelGridView $param)
19+
{
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace wcf\event\interaction\user;
4+
5+
use wcf\event\IPsr14Event;
6+
use wcf\system\interaction\user\ConversationLabelInteractions;
7+
8+
/**
9+
* Indicates that the provider for conversation label interactions is collecting interactions.
10+
*
11+
* @author Olaf Braun
12+
* @copyright 2001-2025 WoltLab GmbH
13+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14+
* @since 6.2
15+
*/
16+
final class ConversationLabelInteractionCollecting implements IPsr14Event
17+
{
18+
public function __construct(public readonly ConversationLabelInteractions $param)
19+
{
20+
}
21+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace wcf\page;
4+
5+
use wcf\system\gridView\user\ConversationLabelGridView;
6+
7+
/**
8+
* @author Olaf Braun
9+
* @copyright 2001-2025 WoltLab GmbH
10+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
11+
* @since 6.2
12+
*
13+
* @extends AbstractGridViewPage<ConversationLabelGridView>
14+
*/
15+
final class ConversationLabelListPage extends AbstractGridViewPage
16+
{
17+
/**
18+
* @inheritDoc
19+
*/
20+
public $loginRequired = true;
21+
22+
#[\Override]
23+
protected function createGridView(): ConversationLabelGridView
24+
{
25+
return new ConversationLabelGridView();
26+
}
27+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace wcf\system\endpoint\controller\core\conversations\labels;
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\data\conversation\label\ConversationLabelAction;
10+
use wcf\http\Helper;
11+
use wcf\system\endpoint\DeleteRequest;
12+
use wcf\system\endpoint\IController;
13+
use wcf\system\exception\PermissionDeniedException;
14+
use wcf\system\WCF;
15+
16+
/**
17+
* API endpoint for delete a conversation label.
18+
*
19+
* @author Olaf Braun
20+
* @copyright 2001-2025 WoltLab GmbH
21+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
22+
* @since 6.2
23+
*/
24+
#[DeleteRequest('/core/conversations/labels/{id:\d+}')]
25+
final class DeleteConversationLabel implements IController
26+
{
27+
#[\Override]
28+
public function __invoke(ServerRequestInterface $request, array $variables): ResponseInterface
29+
{
30+
$label = Helper::fetchObjectFromRequestParameter($variables['id'], ConversationLabel::class);
31+
$this->assertLabelCanBeDeleted($label);
32+
33+
(new ConversationLabelAction([$label], 'delete'))->executeAction();
34+
35+
return new JsonResponse([]);
36+
}
37+
38+
private function assertLabelCanBeDeleted(ConversationLabel $label): void
39+
{
40+
if ($label->userID !== WCF::getUser()->userID) {
41+
throw new PermissionDeniedException();
42+
}
43+
}
44+
}

0 commit comments

Comments
 (0)