Skip to content

Commit 4b8b012

Browse files
author
Alexander Phillips
committed
Add environment snapshot recovery flow
1 parent 35a5c87 commit 4b8b012

14 files changed

Lines changed: 657 additions & 5 deletions

archive/folderview.plus-2026.04.12.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+
e92d52062172fb5ee5cde6b3a96262dc73eef5e6b9f8a2cca380d009432a00e3 folderview.plus-2026.04.15.05.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.15.04">
10-
<!ENTITY md5 "d26cbe9201671730aed58f25643fa9eb">
9+
<!ENTITY version "2026.04.15.05">
10+
<!ENTITY md5 "e0b2b75e3180de66729cc39269742db9">
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.15.05
17+
- UX: Settings workspace layout, section flows, and table behavior.
18+
- Fix: Server endpoints, runtime payloads, and persistence or validation paths.
19+
- Quality: Release automation, CI smoke coverage, and packaging guards.
20+
21+
1622
###2026.04.15.04
1723
- Fix: Theme workspace action buttons in the Appearance tab now use the shared settings button system, so import, update, save, disable, and theme-entry actions match the rest of the plugin chrome.
1824
- Quality: `pkg_build.sh` now tolerates GNU tar warning exits when the produced archive is still readable, which hardens Windows worktree packaging against false-negative tar failures.

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,23 @@ if (!empty($fvplusRuntimeConflicts)) {
12701270
</div>
12711271
</section>
12721272

1273+
<section class="fv-recovery-stage fv-recovery-environment-stage">
1274+
<div class="fv-recovery-stage-head">
1275+
<strong>Environment export and import</strong>
1276+
<span class="rules-help">Move the full plugin environment between installs in one JSON file. This includes Docker folders, VM folders, preferences, folder defaults, and Theme Workspace customization.</span>
1277+
</div>
1278+
<div class="backup-actions fv-recovery-environment-actions">
1279+
<button type="button" onclick="exportEnvironmentSnapshot()"><i class="fa fa-download"></i> Export environment</button>
1280+
<button type="button" onclick="importEnvironmentSnapshot()"><i class="fa fa-upload"></i> Import environment</button>
1281+
</div>
1282+
<div id="fv-recovery-environment-summary" class="fv-recovery-history-list">
1283+
<div class="fv-recovery-empty-state">
1284+
<strong>Portable environment snapshots are ready.</strong>
1285+
<span>Export everything to one JSON file or import a snapshot from another FolderView Plus install.</span>
1286+
</div>
1287+
</div>
1288+
</section>
1289+
12731290
<div class="fv-recovery-hidden-helpers" hidden aria-hidden="true">
12741291
<select id="docker-backup-compare-left"></select>
12751292
<select id="docker-backup-compare-right"></select>

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3186,6 +3186,7 @@ const getSettingsWorkspacesApi = (() => {
31863186
$,
31873187
utils,
31883188
escapeHtml,
3189+
swal,
31893190
getFolderMap: (type) => getFolderMap(type),
31903191
getFolderNameForId: (type, id) => folderNameForId(type, id),
31913192
getSortedBackupsForType: (type) => getSortedBackupsForType(type),
@@ -3225,9 +3226,22 @@ const getSettingsWorkspacesApi = (() => {
32253226
},
32263227
templatesByType,
32273228
selectedOperationsTemplateIdByType,
3229+
apiGetJson,
3230+
apiPostJson,
3231+
selectJsonFile,
32283232
downloadFile,
32293233
toPrettyJson,
3230-
showError
3234+
showError,
3235+
showToastMessage,
3236+
claimAdvancedOperationLock,
3237+
releaseAdvancedOperationLock,
3238+
refreshType,
3239+
refreshBackups,
3240+
refreshThemeWorkspace: () => getThemeWorkspaceApi().readWorkspace(),
3241+
openImportApplyProgressDialog,
3242+
updateImportApplyProgressDialog,
3243+
closeImportApplyProgressDialog,
3244+
ensureRuntimeConflictActionAllowed
32313245
});
32323246
return cachedApi;
32333247
};
@@ -4042,6 +4056,8 @@ const restoreLatestActiveRecoveryBackup = (...args) => getSettingsWorkspacesApi(
40424056
const restoreSelectedActiveRecoveryBackup = (...args) => getSettingsWorkspacesApi().restoreSelectedActiveRecoveryBackup(...args);
40434057
const downloadSelectedActiveRecoveryBackup = (...args) => getSettingsWorkspacesApi().downloadSelectedActiveRecoveryBackup(...args);
40444058
const deleteSelectedActiveRecoveryBackup = (...args) => getSettingsWorkspacesApi().deleteSelectedActiveRecoveryBackup(...args);
4059+
const exportEnvironmentSnapshot = (...args) => getSettingsWorkspacesApi().exportEnvironmentSnapshot(...args);
4060+
const importEnvironmentSnapshot = (...args) => getSettingsWorkspacesApi().importEnvironmentSnapshot(...args);
40454061
const runActiveRecoveryScheduler = (...args) => getSettingsWorkspacesApi().runActiveRecoveryScheduler(...args);
40464062
const compareActiveRecoverySnapshots = (...args) => getSettingsWorkspacesApi().compareActiveRecoverySnapshots(...args);
40474063
const changeActiveBackupSchedulePref = (...args) => getSettingsWorkspacesApi().changeActiveBackupSchedulePref(...args);
@@ -9050,6 +9066,8 @@ settingsActionSupportModule.registerWindowActions(window, {
90509066
refreshBackups,
90519067
runScheduledBackupNow,
90529068
runActiveRecoveryScheduler,
9069+
exportEnvironmentSnapshot,
9070+
importEnvironmentSnapshot,
90539071
restoreLatestBackup,
90549072
restoreLatestActiveRecoveryBackup,
90559073
selectActiveRecoveryBackup,

0 commit comments

Comments
 (0)