Skip to content

Commit 907f700

Browse files
committed
phpstan9 und css fixes
1 parent a49eecb commit 907f700

File tree

6 files changed

+102
-33
lines changed

6 files changed

+102
-33
lines changed

assets/css/bloecks.css

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
border: 1px solid #ddd;
1010
border-radius: 4px;
1111
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
12-
z-index: 1000;
12+
z-index: 1030;
1313
min-width: 300px;
1414
max-width: 500px;
1515
max-height: 400px;
@@ -53,6 +53,12 @@
5353
color: #333;
5454
outline: none;
5555
transition: border-color 0.2s ease;
56+
/* Remove default browser styling for Safari */
57+
-webkit-appearance: none;
58+
-moz-appearance: none;
59+
appearance: none;
60+
/* Simple text-based dropdown indicator */
61+
padding-right: 25px;
5662
}
5763

5864
.bloecks-clipboard-dropdown .bloecks-position-select:focus {
@@ -138,6 +144,30 @@
138144
color: #e2e8f0;
139145
}
140146

147+
.bloecks-clipboard-dropdown .dropdown-position-toggle {
148+
background: #2d3748;
149+
border-bottom-color: #4a5568;
150+
}
151+
152+
.bloecks-clipboard-dropdown .dropdown-position-toggle label {
153+
color: #e2e8f0;
154+
}
155+
156+
.bloecks-clipboard-dropdown .bloecks-position-select {
157+
background: #4a5568;
158+
border-color: #718096;
159+
color: #e2e8f0;
160+
}
161+
162+
.bloecks-clipboard-dropdown .bloecks-position-select:focus {
163+
border-color: #63b3ed;
164+
box-shadow: 0 0 0 1px rgba(99, 179, 237, 0.2);
165+
}
166+
167+
.bloecks-clipboard-dropdown .bloecks-position-select:hover {
168+
border-color: #a0aec0;
169+
}
170+
141171
.bloecks-clipboard-dropdown .dropdown-actions {
142172
background: #2d3748;
143173
border-bottom-color: #4a5568;
@@ -176,6 +206,35 @@ html[data-bs-theme="dark"] .bloecks-clipboard-dropdown .dropdown-header {
176206
color: #e2e8f0;
177207
}
178208

209+
body.rex-theme-dark .bloecks-clipboard-dropdown .dropdown-position-toggle,
210+
html[data-bs-theme="dark"] .bloecks-clipboard-dropdown .dropdown-position-toggle {
211+
background: #2d3748;
212+
border-bottom-color: #4a5568;
213+
}
214+
215+
body.rex-theme-dark .bloecks-clipboard-dropdown .dropdown-position-toggle label,
216+
html[data-bs-theme="dark"] .bloecks-clipboard-dropdown .dropdown-position-toggle label {
217+
color: #e2e8f0;
218+
}
219+
220+
body.rex-theme-dark .bloecks-clipboard-dropdown .bloecks-position-select,
221+
html[data-bs-theme="dark"] .bloecks-clipboard-dropdown .bloecks-position-select {
222+
background: #4a5568;
223+
border-color: #718096;
224+
color: #e2e8f0;
225+
}
226+
227+
body.rex-theme-dark .bloecks-clipboard-dropdown .bloecks-position-select:focus,
228+
html[data-bs-theme="dark"] .bloecks-clipboard-dropdown .bloecks-position-select:focus {
229+
border-color: #63b3ed;
230+
box-shadow: 0 0 0 1px rgba(99, 179, 237, 0.2);
231+
}
232+
233+
body.rex-theme-dark .bloecks-clipboard-dropdown .bloecks-position-select:hover,
234+
html[data-bs-theme="dark"] .bloecks-clipboard-dropdown .bloecks-position-select:hover {
235+
border-color: #a0aec0;
236+
}
237+
179238
body.rex-theme-dark .bloecks-clipboard-dropdown .dropdown-actions,
180239
html[data-bs-theme="dark"] .bloecks-clipboard-dropdown .dropdown-actions {
181240
background: #2d3748;

lib/bloecks_api.php

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ private function handleCopyOrCut(string $action): void
135135

136136
$sql = rex_sql::factory();
137137
$result = $sql->getArray('SELECT * FROM ' . rex::getTablePrefix() . 'article_slice WHERE id=?', [$sliceId]);
138-
$row = is_array($result) && !empty($result) ? $result[0] : null;
138+
$row = !empty($result) ? $result[0] : null;
139139

140140
if (!is_array($row)) {
141141
echo json_encode(['success' => false, 'message' => rex_i18n::msg('bloecks_error_slice_not_found')]);
@@ -145,16 +145,16 @@ private function handleCopyOrCut(string $action): void
145145
$user = rex::getUser();
146146

147147
$modulePerm = $user ? $user->getComplexPerm('modules') : null;
148-
$moduleId = is_numeric($row['module_id']) ? (int) $row['module_id'] : 0;
148+
$moduleId = (int) $row['module_id'];
149149

150150
if (!$user || !$modulePerm || !method_exists($modulePerm, 'hasPerm') || !$modulePerm->hasPerm($moduleId)) {
151151
echo json_encode(['success' => false, 'message' => rex_i18n::msg('bloecks_error_no_module_permission')]);
152152
return;
153153
}
154154

155155
// Check if user has content edit permissions for this slice
156-
$articleId = is_numeric($row['article_id']) ? (int) $row['article_id'] : 0;
157-
$clangId = is_numeric($row['clang_id']) ? (int) $row['clang_id'] : 0;
156+
$articleId = (int) $row['article_id'];
157+
$clangId = (int) $row['clang_id'];
158158

159159
if (!PermissionUtility::hasContentEditPermission($articleId, $clangId, $moduleId)) {
160160
echo json_encode(['success' => false, 'message' => rex_i18n::msg('bloecks_error_no_content_permission')]);
@@ -186,13 +186,13 @@ private function handleCopyOrCut(string $action): void
186186
// Get module name
187187
$moduleSql = rex_sql::factory();
188188
$moduleResult = $moduleSql->getArray('SELECT name FROM ' . rex::getTablePrefix() . 'module WHERE id=?', [$moduleId]);
189-
$moduleRow = is_array($moduleResult) && !empty($moduleResult) ? $moduleResult[0] : null;
190-
$moduleName = (is_array($moduleRow) && isset($moduleRow['name']) && is_string($moduleRow['name']))
189+
$moduleRow = !empty($moduleResult) ? $moduleResult[0] : null;
190+
$moduleName = $moduleRow
191191
? $moduleRow['name']
192192
: rex_i18n::msg('bloecks_error_unknown_module');
193193

194194
// Create clipboard item
195-
$sourceRevision = is_numeric($row['revision']) ? (int) $row['revision'] : 0;
195+
$sourceRevision = (int) $row['revision'];
196196
$clipboardItem = [
197197
'data' => $data,
198198
'source_slice_id' => $sliceId,
@@ -212,9 +212,6 @@ private function handleCopyOrCut(string $action): void
212212

213213
// Always use multi-clipboard system now
214214
$multiClipboard = rex_session('bloecks_multi_clipboard', 'array', []);
215-
if (!is_array($multiClipboard)) {
216-
$multiClipboard = [];
217-
}
218215

219216
// Check if item already exists (by slice_id)
220217
$existingIndex = -1;
@@ -446,7 +443,7 @@ private function handleMultiPaste(): void
446443
$selectedIndices = array_reverse($selectedIndices);
447444
}
448445

449-
$currentTargetSlice = $targetSlice;
446+
$currentTargetSlice = (int) $targetSlice;
450447

451448
try {
452449
foreach ($selectedIndices as $index) {
@@ -461,10 +458,11 @@ private function handleMultiPaste(): void
461458

462459
if ($result['success']) {
463460
++$insertedCount;
464-
$newSliceIds[] = $result['new_slice_id'];
461+
$newSliceId = is_numeric($result['new_slice_id']) ? (int) $result['new_slice_id'] : 0;
462+
$newSliceIds[] = $newSliceId;
465463

466464
// Update target slice to the newly inserted slice for proper stacking
467-
$currentTargetSlice = $result['new_slice_id'];
465+
$currentTargetSlice = $newSliceId;
468466

469467
// If cut, remove from multi-clipboard
470468
if ('cut' === $clipboard['action']) {
@@ -496,11 +494,12 @@ private function handleMultiPaste(): void
496494
*/
497495
private function pasteSingleItem(array $clipboard, int $targetSlice, int $articleId, int $clang, int $ctype, ?string $pastePosition = null): array
498496
{
497+
/** @var array<string, mixed> $data */
499498
$data = $clipboard['data'];
500499
$user = rex::getUser();
501500

502501
// Check permissions
503-
$moduleId = isset($data['module_id']) && is_numeric($data['module_id']) ? (int) $data['module_id'] : null;
502+
$moduleId = (isset($data['module_id']) && is_numeric($data['module_id'])) ? (int) $data['module_id'] : null;
504503
if (!PermissionUtility::hasContentEditPermission($articleId, $clang, $moduleId)) {
505504
return ['success' => false, 'message' => rex_i18n::msg('bloecks_error_no_content_permission')];
506505
}
@@ -565,11 +564,9 @@ private function pasteSingleItem(array $clipboard, int $targetSlice, int $articl
565564
$ins->setValue('priority', $priority);
566565
$ins->setValue('revision', $revision);
567566

568-
if (is_array($data)) {
569-
foreach ($data as $k => $v) {
570-
if (is_string($k)) {
571-
$ins->setValue($k, $v);
572-
}
567+
foreach ($data as $k => $v) {
568+
if (is_string($v) || is_int($v) || is_float($v) || is_bool($v) || is_null($v)) {
569+
$ins->setValue($k, $v);
573570
}
574571
}
575572

@@ -581,7 +578,7 @@ private function pasteSingleItem(array $clipboard, int $targetSlice, int $articl
581578

582579
// If cut, delete original slice
583580
if ('cut' === $clipboard['action']) {
584-
$srcId = isset($clipboard['source_slice_id']) && is_numeric($clipboard['source_slice_id']) ? (int) $clipboard['source_slice_id'] : 0;
581+
$srcId = (isset($clipboard['source_slice_id']) && is_numeric($clipboard['source_slice_id'])) ? (int) $clipboard['source_slice_id'] : 0;
585582
if ($srcId) {
586583
rex_content_service::deleteSlice($srcId);
587584
}

lib/bloecks_backend.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ private static function processCopyOrCut(string $action): string
294294

295295
$sql = rex_sql::factory();
296296
$result = $sql->getArray('SELECT * FROM ' . rex::getTablePrefix() . 'article_slice WHERE id=?', [$sliceId]);
297-
$row = is_array($result) && !empty($result) ? $result[0] : null;
297+
$row = !empty($result) ? $result[0] : null;
298298

299299
if (!is_array($row)) {
300300
return rex_view::warning(rex_i18n::msg('bloecks_error_slice_not_found'));
@@ -365,7 +365,8 @@ private static function processPaste(): string
365365
return rex_view::warning(rex_i18n::msg('bloecks_error_no_content_permission'));
366366
}
367367

368-
$dataArray = is_array($data) ? $data : [];
368+
/** @var array<string, mixed> $dataArray */
369+
$dataArray = $data;
369370
return self::insertSlice($targetSlice, $articleId, $clang, $ctype, $dataArray, $clipboard);
370371
}
371372

@@ -387,7 +388,7 @@ private static function insertSlice(int $targetSlice, int $articleId, int $clang
387388
$ins->setValue('revision', 0); // Default revision (LIVE)
388389

389390
foreach ($data as $k => $v) {
390-
if (is_string($k)) {
391+
if ((is_string($v) || is_int($v) || is_float($v) || is_bool($v) || is_null($v))) {
391392
$ins->setValue($k, $v);
392393
}
393394
}
@@ -430,6 +431,7 @@ public static function outputJavaScriptConfig(): void
430431
/**
431432
* Clear clipboard at session start for security.
432433
* Delegated to ClipboardUtility.
434+
* @api
433435
*/
434436
public static function clearClipboardOnSessionStart(): void
435437
{

lib/bloecks_wrapper.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ public static function addDragDropWrapper(rex_extension_point $ep): string
4242
}
4343

4444
// Check for exclusions using the permission utility
45-
if (PermissionUtility::isExcluded($article_id, $clang_id, $module_id)) {
45+
$articleIdInt = is_numeric($article_id) ? (int) $article_id : 0;
46+
$clangIdInt = is_numeric($clang_id) ? (int) $clang_id : 1;
47+
$moduleIdInt = (is_numeric($module_id)) ? (int) $module_id : null;
48+
49+
if (PermissionUtility::isExcluded($articleIdInt, $clangIdInt, $moduleIdInt)) {
4650
$subject = $ep->getSubject();
4751
return is_string($subject) ? $subject : '';
4852
}

lib/utility/bloecks_button_utility.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,23 @@ public static function createModuleSelectPasteButton(int $articleId, int $clang,
156156
);
157157
} else {
158158
// Fallback: Get module name from clipboard data
159-
$moduleId = isset($clipboard['data']['module_id']) && is_numeric($clipboard['data']['module_id']) ? (int) $clipboard['data']['module_id'] : null;
159+
$clipboardData = $clipboard['data'] ?? [];
160+
$moduleId = null;
161+
if (is_array($clipboardData) && isset($clipboardData['module_id']) && is_numeric($clipboardData['module_id'])) {
162+
$moduleId = (int) $clipboardData['module_id'];
163+
}
160164
if ($moduleId) {
161165
$moduleSql = rex_sql::factory();
162166
$moduleResult = $moduleSql->getArray('SELECT name FROM ' . rex::getTablePrefix() . 'module WHERE id=?', [$moduleId]);
163-
$moduleRow = is_array($moduleResult) && !empty($moduleResult) ? $moduleResult[0] : null;
164-
$moduleName = (is_array($moduleRow) && isset($moduleRow['name']) && is_string($moduleRow['name'])) ? $moduleRow['name'] : rex_i18n::msg('bloecks_error_unknown_module');
167+
$moduleRow = !empty($moduleResult) ? $moduleResult[0] : null;
168+
$moduleName = $moduleRow ? $moduleRow['name'] : rex_i18n::msg('bloecks_error_unknown_module');
165169
}
166-
$tooltipText = rex_i18n::msg('bloecks_paste_from_clipboard', is_string($moduleName) ? $moduleName : '');
170+
$displayName = !empty($moduleName) ? $moduleName : '-noname-';
171+
$tooltipText = rex_i18n::msg('bloecks_paste_from_clipboard', $displayName);
167172
}
168173

169174
// Button text with REDAXO language system
170-
if (!empty($moduleName)) {
175+
if (!empty($moduleName) && is_string($moduleName)) {
171176
$buttonText = rex_i18n::msg('bloecks_paste_module', $moduleName);
172177
} else {
173178
$buttonText = rex_i18n::msg('bloecks_action_paste');

lib/utility/bloecks_clipboard_utility.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ public static function getSourceInfo(array $sliceData): array
9494
$moduleSql = rex_sql::factory();
9595
$moduleId = isset($sliceData['module_id']) && is_numeric($sliceData['module_id']) ? (int) $sliceData['module_id'] : 0;
9696
$moduleResult = $moduleSql->getArray('SELECT name FROM ' . rex::getTablePrefix() . 'module WHERE id=?', [$moduleId]);
97-
$moduleRow = is_array($moduleResult) && !empty($moduleResult) ? $moduleResult[0] : null;
98-
$moduleName = (is_array($moduleRow) && isset($moduleRow['name']) && is_string($moduleRow['name']))
97+
$moduleRow = !empty($moduleResult) ? $moduleResult[0] : null;
98+
$moduleName = $moduleRow
9999
? $moduleRow['name']
100100
: rex_i18n::msg('bloecks_error_unknown_module');
101101

@@ -168,7 +168,9 @@ public static function getClipboardSourceInfo(): ?array
168168
{
169169
$clipboard = self::getClipboard();
170170
if (is_array($clipboard) && isset($clipboard['source_info']) && is_array($clipboard['source_info'])) {
171-
return $clipboard['source_info'];
171+
/** @var array<string, mixed> $sourceInfo */
172+
$sourceInfo = $clipboard['source_info'];
173+
return $sourceInfo;
172174
}
173175
return null;
174176
}

0 commit comments

Comments
 (0)