Skip to content

Commit 1b945e5

Browse files
author
FolderView Plus Test
committed
Refresh docker folder rows when toggling advanced view
1 parent 2bad932 commit 1b945e5

9 files changed

Lines changed: 56 additions & 4 deletions

archive/folderview.plus-2026.04.05.13.txz.sha256

Lines changed: 0 additions & 1 deletion
This file was deleted.

archive/folderview.plus-2026.04.05.14.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+
0c722342eb82b4d9ca65c80928f812cb505b517b8a3f3446da2d8f2330eb43b9 folderview.plus-2026.04.08.06.txz
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3ec2e5c31cf969dfc6711676b899fccedd321d1be62902e8f76eeb923445cf97 folderview.plus-2026.04.08.07.txz

folderview.plus.plg

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,21 @@
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.05">
10-
<!ENTITY md5 "7e071cda88a0e68be4f8f80bf9c1c782">
9+
<!ENTITY version "2026.04.08.07">
10+
<!ENTITY md5 "5a1860e2829f71d7d1035a2ce8f3b1e7">
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.07
17+
- Fix: Docker runtime rows, folder state, and container interactions.
18+
19+
20+
###2026.04.08.06
21+
- Fix: Docker folder rows now live-refresh their update actions when switching between basic and advanced view, so member rows stop showing stale `apply update` or `force update` states until a manual page reload.
22+
23+
1624
###2026.04.08.05
1725
- Fix: Docker runtime rows, folder state, and container interactions.
1826
- UX: Settings workspace layout, section flows, and table behavior.

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2807,6 +2807,39 @@ const syncDockerVisibleFoldersFromRuntimeCache = () => {
28072807
applyDockerFocusedFolderState();
28082808
};
28092809

2810+
const readDockerListViewMode = () => ($.cookie('docker_listview_mode') == 'advanced' ? 'advanced' : 'basic');
2811+
2812+
const syncDockerListViewModeFromCookie = () => {
2813+
const nextMode = readDockerListViewMode();
2814+
if (nextMode === lastDockerListViewMode) {
2815+
return;
2816+
}
2817+
lastDockerListViewMode = nextMode;
2818+
if (!loadedFolder || !globalFolders || Object.keys(globalFolders).length <= 0) {
2819+
return;
2820+
}
2821+
syncDockerVisibleFoldersFromRuntimeCache();
2822+
scheduleDockerRuntimeWidthReflow('listview-mode-change', 12);
2823+
};
2824+
2825+
const startDockerListViewModeObserver = () => {
2826+
if (dockerListViewModeObserverTimer || typeof window.setInterval !== 'function') {
2827+
return;
2828+
}
2829+
dockerListViewModeObserverTimer = window.setInterval(() => {
2830+
if (document.hidden === true) {
2831+
return;
2832+
}
2833+
syncDockerListViewModeFromCookie();
2834+
}, 500);
2835+
if (typeof document.addEventListener === 'function') {
2836+
document.addEventListener('visibilitychange', syncDockerListViewModeFromCookie);
2837+
}
2838+
if (typeof window.addEventListener === 'function') {
2839+
window.addEventListener('focus', syncDockerListViewModeFromCookie);
2840+
}
2841+
};
2842+
28102843
const queueDockerDeferredRuntimeInfoHydration = (generation, stateSignature, fullInfoPromise = null) => {
28112844
const requestPromise = fullInfoPromise && typeof fullInfoPromise.then === 'function'
28122845
? fullInfoPromise
@@ -5209,6 +5242,8 @@ let dockerBootstrapGeneration = 0;
52095242
let dockerHostLoadOwnsLoadingUi = false;
52105243
let nextDockerRenderSuppressLoadingUi = false;
52115244
let activeDockerRenderSuppressLoadingUi = false;
5245+
let dockerListViewModeObserverTimer = null;
5246+
let lastDockerListViewMode = $.cookie('docker_listview_mode') == 'advanced' ? 'advanced' : 'basic';
52125247
const LOADLIST_REFRESH_DEBOUNCE_MS = 90;
52135248
const LOADLIST_REFRESH_MIN_GAP_MS = 420;
52145249
const PERFORMANCE_MODE_MIN_REFRESH_SECONDS = 20;
@@ -5482,6 +5517,7 @@ function buildDockerFolderReq() {
54825517
// Prime requests for environments where loadlist isn't called first.
54835518
folderReq = buildDockerFolderReq();
54845519
markDockerFatalBannerStep('Docker request bundle primed');
5520+
startDockerListViewModeObserver();
54855521

54865522
if (FOLDER_VIEW_DEBUG_MODE) {
54875523
console.log('[FV3_DEBUG] Global variables initialized:', {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,11 @@ test('docker tooltip update action also respects the Docker advanced/basic cooki
179179
assert.match(dockerJs, /const tooltipForceUpdateHtml = tooltipShowAdvanced/);
180180
assert.match(dockerJs, /tooltipForceUpdateHtml/);
181181
});
182+
183+
test('docker runtime re-syncs folder rows when the Docker basic or advanced cookie changes live', () => {
184+
assert.match(dockerJs, /let lastDockerListViewMode = \$\.cookie\('docker_listview_mode'\) == 'advanced' \? 'advanced' : 'basic';/);
185+
assert.match(dockerJs, /const readDockerListViewMode = \(\) => \(\$\.cookie\('docker_listview_mode'\) == 'advanced' \? 'advanced' : 'basic'\);/);
186+
assert.match(dockerJs, /const syncDockerListViewModeFromCookie = \(\) => \{[\s\S]*if \(nextMode === lastDockerListViewMode\) \{\s*return;\s*\}[\s\S]*if \(!loadedFolder \|\| !globalFolders \|\| Object\.keys\(globalFolders\)\.length <= 0\) \{\s*return;\s*\}[\s\S]*syncDockerVisibleFoldersFromRuntimeCache\(\);[\s\S]*scheduleDockerRuntimeWidthReflow\('listview-mode-change', 12\);/);
187+
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\);/);
188+
assert.match(dockerJs, /markDockerFatalBannerStep\('Docker request bundle primed'\);\s*startDockerListViewModeObserver\(\);/);
189+
});

0 commit comments

Comments
 (0)