-
Notifications
You must be signed in to change notification settings - Fork 148
Expand file tree
/
Copy pathInteractionContextMenuComponent.class.php
More file actions
122 lines (104 loc) · 3.38 KB
/
InteractionContextMenuComponent.class.php
File metadata and controls
122 lines (104 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
namespace wcf\system\interaction;
use wcf\data\DatabaseObject;
use wcf\system\WCF;
/**
* Represents the component of an interaction content menu.
*
* @author Marcel Werk
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
class InteractionContextMenuComponent
{
public function __construct(
protected readonly IInteractionProvider $provider
) {}
public function renderContextMenuOptions(DatabaseObject $object): string
{
$html = '';
$interactions = $this->getInteractionsForObject($object);
foreach ($interactions as $interaction) {
if ($interaction instanceof Divider) {
$html .= '<li class="dropdownDivider"></li>';
} else {
$html .= '<li>' . $interaction->render($object) . '</li>';
}
}
return $html;
}
public function renderButton(DatabaseObject $object): string
{
$options = $this->renderContextMenuOptions($object);
if (!$options) {
return '';
}
return WCF::getTPL()->render(
'wcf',
'shared_interactionButton',
['contextMenuOptions' => $this->renderContextMenuOptions($object)]
);
}
/**
* Renders the initialization code for the interactions.
*/
public function renderInitialization(string $containerId): string
{
return implode(
"\n",
\array_map(
fn($interaction) => $interaction->renderInitialization($containerId),
\array_filter(
$this->getInteractions(),
fn(IInteraction|Divider $interaction) => $interaction instanceof IInteraction
)
)
);
}
/**
* @return (IInteraction|Divider)[]
*/
public function getInteractionsForObject(DatabaseObject $object): array
{
$interactions = \array_filter(
$this->getInteractions(),
fn(IInteraction|Divider $interaction) => $interaction instanceof Divider || $interaction->isAvailable($object)
);
return $this->removeObsoleteDividers($interactions);
}
/**
* @return (IInteraction|Divider)[]
*/
public function getInteractions(): array
{
return $this->provider->getInteractions();
}
/**
* @param (IInteraction|Divider)[] $interactions
* @return (IInteraction|Divider)[]
*/
private function removeObsoleteDividers(array $interactions): array
{
$previousElementIsDivider = true;
$interactions = \array_filter(
$interactions,
static function (IInteraction|Divider $interaction) use (&$previousElementIsDivider) {
if ($interaction instanceof Divider) {
if ($previousElementIsDivider) {
return false;
}
$previousElementIsDivider = true;
} else {
$previousElementIsDivider = false;
}
return true;
}
);
$lastKey = \array_key_last($interactions);
if ($lastKey !== null && $interactions[$lastKey] instanceof Divider) {
\array_pop($interactions);
}
return $interactions;
}
}