Skip to content

Commit fb0ca9e

Browse files
author
FolderView Plus Test
committed
Add isolated Docker Orbit view
1 parent b1b39b3 commit fb0ca9e

17 files changed

Lines changed: 1565 additions & 19 deletions

archive/folderview.plus-2026.04.15.22.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+
a8c075df5fb3dee6b934d72ca50f32de15d81a842e1ab8b88255796d9f4724e1 folderview.plus-2026.04.17.05.txz

folderview.plus.plg

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,26 @@
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.17.04">
10-
<!ENTITY md5 "d65daa489f9be7b880db9414ceb52a9c">
9+
<!ENTITY version "2026.04.17.05">
10+
<!ENTITY md5 "e386a9b65c23d7270be1efc998727a66">
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.17.05
17+
- Fix: Docker support-bundle snapshots, trace storage caps, and rendered-state diagnostics.
18+
- Fix: Docker runtime rows, folder state, and container interactions.
19+
- UX: Settings workspace layout, section flows, and table behavior.
20+
- Feature: Setup Assistant, rules, smart-detect, and starter-template workflows.
21+
- Refactor: Shared runtime contracts, request plumbing, and cross-page foundations.
22+
- Fix: Server endpoints, runtime payloads, and persistence or validation paths.
23+
24+
25+
###2026.04.17.05
26+
- Feature: Added Docker Orbit view as a new isolated page-view mode with a centered folder hub, orbiting direct members, child-folder navigation, and an inspector panel for practical actions.
27+
- UX: Orbit view is wired as its own removable runtime module and stylesheet, with settings/runtime normalization and privacy masking support aligned to the other isolated Docker views.
28+
1629
###2026.04.17.04
1730
- Fix: Docker support-bundle snapshots, trace storage caps, and rendered-state diagnostics.
1831

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/FolderViewPlus.page

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ if (!empty($fvplusRuntimeConflicts)) {
217217
<option value="host">No FolderView (host list only)</option>
218218
<option value="command">Command view</option>
219219
<option value="tree-explorer">Tree explorer</option>
220+
<option value="orbit">Orbit view</option>
220221
</select>
221222
</label>
222223
<label class="setting-toggle"><input id="docker-live-refresh-enabled" type="checkbox" onchange="changeRuntimePref('docker', 'liveRefreshEnabled', this.checked)"> Live auto-refresh</label>
@@ -1521,4 +1522,3 @@ if (!empty($fvplusRuntimeConflicts)) {
15211522
<script src="<?=fvplus_asset('/plugins/folderview.plus/scripts/folderviewplus.js')?>"></script>
15221523

15231524

1524-

src/folderview.plus/usr/local/emhttp/plugins/folderview.plus/folderview.plus.Docker.page

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,12 @@ $fvplusRuntimePreflightHasFatal = runtimePreflightHasFatal($fvplusRuntimePreflig
6969
<script src="<?php fvplus_asset('/plugins/folderview.plus/scripts/docker.runtime.reconcile.js')?>"></script>
7070
<script src="<?php fvplus_asset('/plugins/folderview.plus/scripts/docker.runtime.command-view.js')?>"></script>
7171
<script src="<?php fvplus_asset('/plugins/folderview.plus/scripts/docker.runtime.tree-explorer.js')?>"></script>
72+
<script src="<?php fvplus_asset('/plugins/folderview.plus/scripts/docker.runtime.orbit-view.js')?>"></script>
7273
<script defer src="<?php fvplus_asset('/plugins/folderview.plus/scripts/docker.js')?>"></script>
7374

7475
<link rel="stylesheet" href="<?php fvplus_asset('/plugins/folderview.plus/styles/runtime.shared.css')?>">
7576
<link rel="stylesheet" href="<?php fvplus_asset('/plugins/folderview.plus/styles/docker.command-view.css')?>">
7677
<link rel="stylesheet" href="<?php fvplus_asset('/plugins/folderview.plus/styles/docker.tree-explorer.css')?>">
78+
<link rel="stylesheet" href="<?php fvplus_asset('/plugins/folderview.plus/styles/docker.orbit-view.css')?>">
7779
<link rel="stylesheet" href="<?php fvplus_asset('/plugins/folderview.plus/styles/docker.css')?>">
7880
<?php require_once('/usr/local/emhttp/plugins/folderview.plus/styles/custom.php') ?>

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

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const dockerRuntimeDiagnosticsModule = window.FolderViewPlusDockerRuntimeDiagnos
1515
const dockerRuntimeReconcileModule = window.FolderViewPlusDockerRuntimeReconcile || null;
1616
const dockerCommandViewModule = window.FolderViewPlusDockerCommandView || null;
1717
const dockerTreeExplorerModule = window.FolderViewPlusDockerTreeExplorer || null;
18+
const dockerOrbitViewModule = window.FolderViewPlusDockerOrbitView || null;
1819
const applyDockerThemeResolverTokens = (reason = 'docker-runtime:initial', options = {}) => (
1920
themeResolver && typeof themeResolver.applyResolvedThemeTokens === 'function'
2021
? themeResolver.applyResolvedThemeTokens(reason, options)
@@ -756,7 +757,19 @@ const getDockerTreeExplorerApi = () => {
756757
dockerTreeExplorerApi = dockerTreeExplorerModule.createApi(buildDockerIsolatedViewDeps());
757758
}
758759
return dockerTreeExplorerApi;
759-
};const buildDockerDiagnosticsCorrelationContext = () => ({
760+
};
761+
const getDockerOrbitViewApi = () => {
762+
if (
763+
!dockerOrbitViewApi
764+
&& dockerOrbitViewModule
765+
&& window.FolderViewPlusDockerOrbitViewModuleLoaded === true
766+
&& typeof dockerOrbitViewModule.createApi === 'function'
767+
) {
768+
dockerOrbitViewApi = dockerOrbitViewModule.createApi(buildDockerIsolatedViewDeps());
769+
}
770+
return dockerOrbitViewApi;
771+
};
772+
const buildDockerDiagnosticsCorrelationContext = () => ({
760773
currentPage: String(location?.pathname || ''),
761774
listViewMode: readDockerListViewMode(),
762775
renderGeneration: dockerRuntimeLastRenderGeneration,
@@ -3025,7 +3038,7 @@ const scheduleDockerPostRenderPolish = (folderIds = []) => {
30253038
const normalizeDockerPageViewMode = (value) => (
30263039
typeof utils.normalizeRuntimePageViewMode === 'function'
30273040
? utils.normalizeRuntimePageViewMode(value)
3028-
: (['host', 'command', 'tree-explorer'].includes(String(value || '').trim().toLowerCase()) ? String(value || '').trim().toLowerCase() : 'folderview')
3041+
: (['host', 'command', 'tree-explorer', 'orbit'].includes(String(value || '').trim().toLowerCase()) ? String(value || '').trim().toLowerCase() : 'folderview')
30293042
);
30303043

30313044
const resolveDockerPageViewMode = (prefs = folderTypePrefs) => normalizeDockerPageViewMode(
@@ -3099,13 +3112,23 @@ const unmountDockerTreeExplorer = () => {
30993112
}
31003113
};
31013114

3115+
const unmountDockerOrbitView = () => {
3116+
const orbitViewApi = getDockerOrbitViewApi();
3117+
if (orbitViewApi && typeof orbitViewApi.unmount === 'function') {
3118+
orbitViewApi.unmount();
3119+
}
3120+
};
3121+
31023122
const unmountDockerIsolatedViews = (exceptMode = '') => {
31033123
if (exceptMode !== 'command') {
31043124
unmountDockerCommandView();
31053125
}
31063126
if (exceptMode !== 'tree-explorer') {
31073127
unmountDockerTreeExplorer();
31083128
}
3129+
if (exceptMode !== 'orbit') {
3130+
unmountDockerOrbitView();
3131+
}
31093132
};
31103133

31113134
const queueDockerRuntimeRenderForPageViewMode = () => {
@@ -3143,6 +3166,19 @@ const queueDockerRuntimeRenderForPageViewMode = () => {
31433166
markDockerFatalBannerStep('Docker tree explorer unavailable, falling back to host list');
31443167
recordDockerFatalBannerAction('Docker tree explorer unavailable');
31453168
return;
3169+
} else if (mode === 'orbit') {
3170+
unmountDockerIsolatedViews('orbit');
3171+
markDockerFatalBannerStep('Docker orbit view active');
3172+
recordDockerFatalBannerAction('Docker orbit view active');
3173+
const orbitViewApi = getDockerOrbitViewApi();
3174+
if (orbitViewApi && typeof orbitViewApi.mount === 'function') {
3175+
return orbitViewApi.mount({
3176+
suppressLoadingUi: isDockerHostUpdateSyncSuspended()
3177+
});
3178+
}
3179+
markDockerFatalBannerStep('Docker orbit view unavailable, falling back to host list');
3180+
recordDockerFatalBannerAction('Docker orbit view unavailable');
3181+
return;
31463182
}
31473183
unmountDockerIsolatedViews();
31483184
if (!folderReq || !Array.isArray(folderReq.render) || folderReq.render.length === 0) {
@@ -3168,11 +3204,13 @@ window.FolderViewPlusDockerRuntimeInternals = Object.assign(window.FolderViewPlu
31683204
buildDockerIsolatedViewDeps,
31693205
getDockerCommandViewApi,
31703206
getDockerTreeExplorerApi,
3207+
getDockerOrbitViewApi,
31713208
fetchDockerBootstrapPrefs,
31723209
ensureDockerBootstrapPrefs,
31733210
unmountDockerIsolatedViews,
31743211
queueDockerRuntimeRenderForPageViewMode
3175-
});const syncDockerVisibleFoldersFromRuntimeCache = () => {
3212+
});
3213+
const syncDockerVisibleFoldersFromRuntimeCache = () => {
31763214
Object.entries(globalFolders || {}).forEach(([id, folder]) => {
31773215
if (!folder || typeof folder !== 'object') {
31783216
return;
@@ -5978,6 +6016,7 @@ let liveRefreshMs = 0;
59786016
let liveRefreshInFlight = false;
59796017
let dockerCommandViewApi = null;
59806018
let dockerTreeExplorerApi = null;
6019+
let dockerOrbitViewApi = null;
59816020
let dockerBootstrapPrefsPromise = null;
59826021
let queuedLoadlistTimer = null;
59836022
let queuedLoadlistOptions = null;
@@ -6431,4 +6470,3 @@ addEventListener("keydown", (e) => {
64316470
if (FOLDER_VIEW_DEBUG_MODE) console.log('[FV3_DEBUG] docker.js: End of script execution.');
64326471
})(window, window.jQuery || window.$);
64336472

6434-

0 commit comments

Comments
 (0)