Skip to content

Commit 62a3dc2

Browse files
author
FolderView Plus Test
committed
Re-sync docker member rows after folder expand
1 parent 1b945e5 commit 62a3dc2

8 files changed

Lines changed: 23 additions & 3 deletions

File tree

archive/folderview.plus-2026.04.06.02.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+
04bc791295316880f6e226a160da74c869d0268f518afdfe30e9cc550c6e3dab folderview.plus-2026.04.08.08.txz

docs/releases/2026.04.08.08.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Fix: Docker folder expand now re-syncs direct member rows from cached runtime state after moving them out of hidden storage, so collapsed folders no longer make every child row show `apply update` after refresh or expand.

folderview.plus.plg

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
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.08.07">
10-
<!ENTITY md5 "5a1860e2829f71d7d1035a2ce8f3b1e7">
9+
<!ENTITY version "2026.04.08.08">
10+
<!ENTITY md5 "25ea8e560468d72949eacd3f337f3c7a">
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.08.08
17+
- Fix: Docker folder expand now re-syncs direct member rows from cached runtime state after moving them out of hidden storage, so collapsed folders no longer make every child row show `apply update` after refresh or expand.
18+
19+
1620
###2026.04.08.07
1721
- Fix: Docker runtime rows, folder state, and container interactions.
1822

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/scripts/docker.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ const getDockerRuntimeHierarchyApi = () => {
566566
scheduleRuntimeWidthReflow: (reason, delayMs) => scheduleDockerRuntimeWidthReflow(reason, delayMs),
567567
buildRuntimeContainerMapForFolder: (folderId, includeDescendants = false) =>
568568
buildRuntimeContainerMapForFolder(folderId, includeDescendants),
569+
syncDockerFolderMemberRows: (id, runtimeContainers) => syncDockerFolderMemberRows(id, runtimeContainers),
569570
applyFolderStatusColorOverrides: ($row, settings) => applyFolderStatusColorOverrides($row, settings),
570571
applyFolderAccentStyle: ($row, settings) => applyFolderAccentStyle($row, settings),
571572
applyFolderDropdownStyle: ($row, settings) => applyFolderDropdownStyle($row, settings),

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/scripts/docker.runtime.hierarchy.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@
7171
const buildRuntimeContainerMapForFolder = typeof deps.buildRuntimeContainerMapForFolder === 'function'
7272
? deps.buildRuntimeContainerMapForFolder
7373
: (() => ({}));
74+
const syncDockerFolderMemberRows = typeof deps.syncDockerFolderMemberRows === 'function'
75+
? deps.syncDockerFolderMemberRows
76+
: (() => {});
7477
const applyFolderStatusColorOverrides = typeof deps.applyFolderStatusColorOverrides === 'function'
7578
? deps.applyFolderStatusColorOverrides
7679
: (() => {});
@@ -454,11 +457,13 @@
454457
if (hasChildren) {
455458
const $folderRow = jq(`tr.folder-id-${id}`);
456459
const $directMemberRows = getDirectMemberRowsForFolder(id);
460+
const directRuntimeContainers = buildRuntimeContainerMapForFolder(id, false);
457461
let $childAnchor = $folderRow;
458462
if ($directMemberRows.length) {
459463
$folderRow.after($directMemberRows);
460464
$directMemberRows.removeClass('fv-nested-hidden').show();
461465
jq(`.folder-${id}-element > td > i.fa-arrows-v`).remove();
466+
syncDockerFolderMemberRows(id, directRuntimeContainers);
462467
$childAnchor = $directMemberRows.last();
463468
} else {
464469
$folderRow.find('.folder-storage').append($directMemberRows);
@@ -471,9 +476,11 @@
471476
const $directMemberRows = getDirectMemberRowsForFolder(id);
472477
const $fallbackRows = jq(`.folder-${id}-element`);
473478
const $rowsToShow = $directMemberRows.length ? $directMemberRows : $fallbackRows;
479+
const directRuntimeContainers = buildRuntimeContainerMapForFolder(id, false);
474480
jq(`tr.folder-id-${id}`).after($rowsToShow);
475481
$rowsToShow.removeClass('fv-nested-hidden').show();
476482
$rowsToShow.children('td').children('i.fa-arrows-v').remove();
483+
syncDockerFolderMemberRows(id, directRuntimeContainers);
477484
debugLog(`[FV3_DEBUG] dropDownButton (id: ${id}): Expanded leaf folder. Moved elements after folder row.`);
478485
}
479486
element.attr('active', 'true');

tests/docker-update-status-regression.test.mjs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,10 @@ test('docker runtime re-syncs folder rows when the Docker basic or advanced cook
187187
assert.match(dockerJs, /const startDockerListViewModeObserver = \(\) => \{[\s\S]*dockerListViewModeObserverTimer = window\.setInterval\(\(\) => \{[\s\S]*syncDockerListViewModeFromCookie\(\);[\s\S]*\}, 500\);[\s\S]*document\.addEventListener\('visibilitychange', syncDockerListViewModeFromCookie\);[\s\S]*window\.addEventListener\('focus', syncDockerListViewModeFromCookie\);/);
188188
assert.match(dockerJs, /markDockerFatalBannerStep\('Docker request bundle primed'\);\s*startDockerListViewModeObserver\(\);/);
189189
});
190+
191+
test('docker folder expand path re-syncs direct member rows from runtime state after moving them out of storage', () => {
192+
assert.match(dockerJs, /syncDockerFolderMemberRows: \(id,\s*runtimeContainers\) => syncDockerFolderMemberRows\(id,\s*runtimeContainers\),/);
193+
assert.match(dockerRuntimeHierarchyJs, /const syncDockerFolderMemberRows = typeof deps\.syncDockerFolderMemberRows === 'function'[\s\S]*:\s*\(\(\) => \{\}\);/);
194+
assert.match(dockerRuntimeHierarchyJs, /const \$directMemberRows = getDirectMemberRowsForFolder\(id\);[\s\S]*const directRuntimeContainers = buildRuntimeContainerMapForFolder\(id,\s*false\);[\s\S]*\$folderRow\.after\(\$directMemberRows\);[\s\S]*syncDockerFolderMemberRows\(id,\s*directRuntimeContainers\);/);
195+
assert.match(dockerRuntimeHierarchyJs, /const \$rowsToShow = \$directMemberRows\.length \? \$directMemberRows : \$fallbackRows;[\s\S]*const directRuntimeContainers = buildRuntimeContainerMapForFolder\(id,\s*false\);[\s\S]*jq\(`tr\.folder-id-\$\{id\}`\)\.after\(\$rowsToShow\);[\s\S]*syncDockerFolderMemberRows\(id,\s*directRuntimeContainers\);/);
196+
});

0 commit comments

Comments
 (0)