Skip to content

Commit 9dd05fc

Browse files
author
FolderView Plus Test
committed
Sync Docker order after sort preference changes
1 parent 0b6a8f1 commit 9dd05fc

8 files changed

Lines changed: 39 additions & 10 deletions

File tree

archive/folderview.plus-2026.04.05.03.txz.sha256

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bac31f4034bc2facdf47d51c71d0fb3078f56735b807b5ff06b17c851e3ee4a6 folderview.plus-2026.04.06.14.txz

folderview.plus.plg

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@
66
<!ENTITY launch "Settings/FolderViewPlus">
77
<!ENTITY plugdir "/usr/local/emhttp/plugins/&name;">
88
<!ENTITY pluginURL "https://raw.githubusercontent.com/&github;/dev/folderview.plus.plg">
9-
<!ENTITY version "2026.04.06.13">
10-
<!ENTITY md5 "7e2d4646de359a5ed8e089fa77d2bc09">
9+
<!ENTITY version "2026.04.06.14">
10+
<!ENTITY md5 "9c500e0ccf32fadb3200ad864b7ba84a">
1111
]>
1212

1313
<PLUGIN name="&name;" author="&author;" version="&version;" launch="&launch;" pluginURL="&pluginURL;" icon="folder-icon.png" support="https://forums.unraid.net/topic/197631-plugin-folderview-plus/" min="7.0.0">
1414
<CHANGES>
1515

16+
###2026.04.06.14
17+
- Fix: Docker runtime rows, folder state, and container interactions.
18+
- UX: Folder editor flows, previews, and bootstrap behavior.
19+
- Fix: Server endpoints, runtime payloads, and persistence or validation paths.
20+
21+
1622
###2026.04.06.13
1723
- Fix: Docker runtime rows, folder state, and container interactions.
1824

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/server/lib.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3490,9 +3490,10 @@ function syncContainerOrderUnlocked(): void {
34903490
$labelTargetByName[$name] = getFolderLabelValueFromLabels($labels);
34913491
}
34923492

3493+
$orderedFolders = reorderFolderMapByPrefs('docker', $folders);
34933494
$folderContainers = [];
34943495
$assignedContainers = [];
3495-
foreach ($folders as $folderId => $folder) {
3496+
foreach ($orderedFolders as $folderId => $folder) {
34963497
$members = normalizeFolderMembers($folder['containers'] ?? []);
34973498
if (!empty($folder['regex'])) {
34983499
$regex = '/' . str_replace('/', '\/', $folder['regex']) . '/';
@@ -3525,11 +3526,14 @@ function syncContainerOrderUnlocked(): void {
35253526
$newOrder = [];
35263527
$seen = [];
35273528
$folderPlaceholders = array_keys($folderContainers);
3529+
$sortMode = (string)($prefs['sortMode'] ?? 'created');
3530+
$pinnedIds = normalizeStringIdList($prefs['pinnedFolderIds'] ?? []);
3531+
$preserveCurrentPlaceholderOrder = $sortMode === 'created' && count($pinnedIds) === 0;
35283532
$orderedFolderPlaceholders = [];
35293533

35303534
foreach ($currentOrder as $item) {
35313535
if (in_array($item, $folderPlaceholders, true)) {
3532-
if (!in_array($item, $orderedFolderPlaceholders, true)) {
3536+
if ($preserveCurrentPlaceholderOrder && !in_array($item, $orderedFolderPlaceholders, true)) {
35333537
$orderedFolderPlaceholders[] = $item;
35343538
}
35353539
continue;
@@ -3550,10 +3554,14 @@ function syncContainerOrderUnlocked(): void {
35503554
}
35513555
}
35523556

3553-
foreach ($folderPlaceholders as $placeholder) {
3554-
if (!in_array($placeholder, $orderedFolderPlaceholders, true)) {
3555-
$orderedFolderPlaceholders[] = $placeholder;
3557+
if ($preserveCurrentPlaceholderOrder) {
3558+
foreach ($folderPlaceholders as $placeholder) {
3559+
if (!in_array($placeholder, $orderedFolderPlaceholders, true)) {
3560+
$orderedFolderPlaceholders[] = $placeholder;
3561+
}
35563562
}
3563+
} else {
3564+
$orderedFolderPlaceholders = $folderPlaceholders;
35573565
}
35583566

35593567
// Preserve existing folder placeholder order from userprefs and only

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/server/prefs.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@
3636

3737
$saved = writeTypePrefs($type, $next);
3838
syncManualOrderWithFolders($type, readRawFolderMap($type));
39+
$dockerOrderChanged = $type === 'docker' && (
40+
(string)($current['sortMode'] ?? 'created') !== (string)($saved['sortMode'] ?? 'created')
41+
|| normalizeStringIdList($current['manualOrder'] ?? []) !== normalizeStringIdList($saved['manualOrder'] ?? [])
42+
|| normalizeStringIdList($current['pinnedFolderIds'] ?? []) !== normalizeStringIdList($saved['pinnedFolderIds'] ?? [])
43+
);
44+
if ($dockerOrderChanged) {
45+
syncContainerOrder('docker');
46+
}
3947
try {
4048
appendDiagnosticsHistoryEvent('prefs_update', $type, [
4149
'traceId' => getRequestTraceId(),

tests/docker-runtime-order-regression.test.mjs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,16 @@ test('docker runtime only backfills missing folder placeholders when sort mode r
109109
test('docker order sync preserves current folder placeholder sequence before appending missing placeholders', () => {
110110
assert.match(
111111
libPhp,
112-
/\$orderedFolderPlaceholders = \[\];[\s\S]*?foreach \(\$currentOrder as \$item\) \{[\s\S]*?if \(in_array\(\$item, \$folderPlaceholders, true\)\) \{[\s\S]*?\$orderedFolderPlaceholders\[\] = \$item;[\s\S]*?continue;[\s\S]*?\}/
112+
/\$preserveCurrentPlaceholderOrder = \$sortMode === 'created' && count\(\$pinnedIds\) === 0;/
113113
);
114114
assert.match(
115115
libPhp,
116-
/foreach \(\$folderPlaceholders as \$placeholder\) \{[\s\S]*?if \(!in_array\(\$placeholder, \$orderedFolderPlaceholders, true\)\) \{[\s\S]*?\$orderedFolderPlaceholders\[\] = \$placeholder;[\s\S]*?\}[\s\S]*?\}/
116+
/if \(\$preserveCurrentPlaceholderOrder\) \{[\s\S]*?foreach \(\$folderPlaceholders as \$placeholder\) \{[\s\S]*?\$orderedFolderPlaceholders\[\] = \$placeholder;[\s\S]*?\}[\s\S]*?\} else \{[\s\S]*?\$orderedFolderPlaceholders = \$folderPlaceholders;[\s\S]*?\}/
117117
);
118118
assert.match(libPhp, /foreach \(\$orderedFolderPlaceholders as \$placeholder\) \{/);
119119
});
120+
121+
test('docker order sync uses prefs-ordered folders when explicit sort or pinning is active', () => {
122+
assert.match(libPhp, /\$orderedFolders = reorderFolderMapByPrefs\('docker', \$folders\);/);
123+
assert.match(libPhp, /foreach \(\$orderedFolders as \$folderId => \$folder\) \{/);
124+
});

tests/ui-smoke-layout.test.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,8 @@ test('prefs endpoint no longer rewrites retired folder editor mode flags', () =>
671671
);
672672
assert.doesNotMatch(prefsPhp, /array_key_exists\('folderEditorMode', \$decoded\)/);
673673
assert.doesNotMatch(prefsPhp, /\$decoded\['folderEditorModeExplicit'\] = true;/);
674+
assert.match(prefsPhp, /\$dockerOrderChanged = \$type === 'docker' && \(/);
675+
assert.match(prefsPhp, /if \(\$dockerOrderChanged\) \{\s*syncContainerOrder\('docker'\);\s*\}/);
674676
});
675677

676678
test('runtime folder editor routes defer editor mode resolution to Folder.page server prefs', () => {

0 commit comments

Comments
 (0)