-
Notifications
You must be signed in to change notification settings - Fork 148
Expand file tree
/
Copy pathBulkInteractionContextMenuComponent.class.php
More file actions
112 lines (94 loc) · 3.23 KB
/
BulkInteractionContextMenuComponent.class.php
File metadata and controls
112 lines (94 loc) · 3.23 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
<?php
namespace wcf\system\interaction\bulk;
use wcf\data\DatabaseObject;
use wcf\system\interaction\Divider;
use wcf\system\WCF;
/**
* Represents the component of an bulk interaction content menu.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.2
*/
class BulkInteractionContextMenuComponent
{
public function __construct(
protected readonly IBulkInteractionProvider $provider
) {}
/**
* @param DatabaseObject[] $objects
*/
public function renderContextMenuOptions(array $objects): string
{
$html = '';
$interactions = $this->getInteractionsForObjects($objects);
foreach ($interactions as $interaction) {
if ($interaction instanceof Divider) {
$html .= '<li class="dropdownDivider"></li>';
} else {
$availableForObjects = \array_filter(
$objects,
static fn(DatabaseObject $object) => $interaction->isAvailable($object)
);
$html .= '<li>' . $interaction->render($availableForObjects) . '</li>';
}
}
if ($html === '') {
$html = '<li class="disabled"><span>'
. WCF::getLanguage()->get('wcf.clipboard.button.noInteractionsAvailable')
. '</span></li>';
}
return $html;
}
/**
* @param DatabaseObject[] $objects
* @return (IBulkInteraction|Divider)[]
*/
public function getInteractionsForObjects(array $objects): array
{
$interactions = [];
foreach ($this->provider->getInteractions() as $interaction) {
if ($interaction instanceof Divider) {
$interactions[] = $interaction;
continue;
}
$availableForObjects = \array_filter(
$objects,
static fn(DatabaseObject $object) => $interaction->isAvailable($object)
);
if ($availableForObjects === []) {
continue;
}
$interactions[] = $interaction;
}
return $this->removeObsoleteDividers($interactions);
}
/**
* @param (IBulkInteraction|Divider)[] $interactions
* @return (IBulkInteraction|Divider)[]
*/
private function removeObsoleteDividers(array $interactions): array
{
$previousElementIsDivider = true;
$interactions = \array_filter(
$interactions,
static function (IBulkInteraction|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;
}
}