dsh-config-manager 0.1.49 → 0.1.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.d.ts +35 -0
- package/lib/client.js +384 -130
- package/lib/client.js.map +1 -1
- package/lib/core/cache-cleaner.d.ts +6 -0
- package/lib/core/cache-cleaner.js +5 -1
- package/lib/core/cache-cleaner.js.map +1 -1
- package/lib/index.js +49 -1
- package/lib/index.js.map +1 -1
- package/lib/sync/backup-files.d.ts +42 -0
- package/lib/sync/backup-files.js +113 -0
- package/lib/sync/backup-files.js.map +1 -0
- package/lib/sync/backup-scheduler.d.ts +3 -0
- package/lib/sync/backup-scheduler.js +16 -1
- package/lib/sync/backup-scheduler.js.map +1 -1
- package/package.json +1 -1
- package/src/client/CLIENT_DEPENDENCIES.md +2 -0
- package/src/client/api.ts +23 -0
- package/src/client/config-manager.module.css +36 -0
- package/src/client/import/ImportWizardView.tsx +40 -0
- package/src/client/locales.ts +24 -0
- package/src/client/run-store.test.ts +17 -5
- package/src/client/run-store.ts +9 -0
- package/src/client/snapshots/SnapshotsPanel.tsx +180 -14
- package/src/core/cache-cleaner.test.ts +29 -0
- package/src/core/cache-cleaner.ts +10 -1
- package/src/index.ts +45 -1
- package/src/sync/backup-files.test.ts +154 -0
- package/src/sync/backup-files.ts +127 -0
- package/src/sync/backup-scheduler.test.ts +86 -1
- package/src/sync/backup-scheduler.ts +17 -1
package/lib/client.js
CHANGED
|
@@ -541,6 +541,8 @@ const CONFIG_MANAGER_API = {
|
|
|
541
541
|
restore: "/api/dsh-config-manager/restore",
|
|
542
542
|
backupSchedule: "/api/dsh-config-manager/backup-schedule",
|
|
543
543
|
backupScheduleRun: "/api/dsh-config-manager/backup-schedule/run",
|
|
544
|
+
backupFiles: "/api/dsh-config-manager/backup-files",
|
|
545
|
+
backupFilesDelete: "/api/dsh-config-manager/backup-files/delete",
|
|
544
546
|
starPrompt: "/api/dsh-config-manager/star-prompt"
|
|
545
547
|
};
|
|
546
548
|
/** 导出请求超时(ms):与 Host 半 ROUTE_TIMEOUT_MS 对齐,防止宿主卡死时 UI 无限等待 */
|
|
@@ -806,6 +808,18 @@ var ConfigManagerApi = class {
|
|
|
806
808
|
body: JSON.stringify({})
|
|
807
809
|
}), this.t);
|
|
808
810
|
}
|
|
811
|
+
/** 列出导出目录(exports/*.zip)下的全部备份文件(时间倒序;含来源 auto/manual)。 */
|
|
812
|
+
async listBackupFiles() {
|
|
813
|
+
return (await readJson$3(await fetch(CONFIG_MANAGER_API.backupFiles), this.t)).files;
|
|
814
|
+
}
|
|
815
|
+
/** 删除一个备份文件(危险操作:不可恢复;仅限 exports 目录内 .zip)。 */
|
|
816
|
+
async deleteBackupFile(name) {
|
|
817
|
+
return readJson$3(await fetch(CONFIG_MANAGER_API.backupFilesDelete, {
|
|
818
|
+
method: "POST",
|
|
819
|
+
headers: { "content-type": "application/json" },
|
|
820
|
+
body: JSON.stringify({ name })
|
|
821
|
+
}), this.t);
|
|
822
|
+
}
|
|
809
823
|
};
|
|
810
824
|
//#endregion
|
|
811
825
|
//#region src/ui/conflict-view.ts
|
|
@@ -2326,7 +2340,8 @@ function defaultSnapshotsState() {
|
|
|
2326
2340
|
report: null,
|
|
2327
2341
|
actionError: null,
|
|
2328
2342
|
error: null,
|
|
2329
|
-
backupDraft: null
|
|
2343
|
+
backupDraft: null,
|
|
2344
|
+
importBackup: null
|
|
2330
2345
|
};
|
|
2331
2346
|
}
|
|
2332
2347
|
function defaultState() {
|
|
@@ -2407,7 +2422,8 @@ function toSnapshotsStoreSlice(s) {
|
|
|
2407
2422
|
report: s.report,
|
|
2408
2423
|
actionError: s.actionError,
|
|
2409
2424
|
error: s.error,
|
|
2410
|
-
backupDraft: s.backupDraft
|
|
2425
|
+
backupDraft: s.backupDraft,
|
|
2426
|
+
importBackup: s.importBackup
|
|
2411
2427
|
};
|
|
2412
2428
|
}
|
|
2413
2429
|
/**
|
|
@@ -2444,7 +2460,8 @@ function toPersistedState(state) {
|
|
|
2444
2460
|
market: state.market,
|
|
2445
2461
|
snapshots: {
|
|
2446
2462
|
...state.snapshots,
|
|
2447
|
-
running: false
|
|
2463
|
+
running: false,
|
|
2464
|
+
importBackup: null
|
|
2448
2465
|
}
|
|
2449
2466
|
};
|
|
2450
2467
|
}
|
|
@@ -2731,7 +2748,8 @@ var RunStore = class {
|
|
|
2731
2748
|
snapshots: {
|
|
2732
2749
|
...defaultSnapshotsState(),
|
|
2733
2750
|
...parsed.snapshots,
|
|
2734
|
-
running: false
|
|
2751
|
+
running: false,
|
|
2752
|
+
importBackup: null
|
|
2735
2753
|
}
|
|
2736
2754
|
};
|
|
2737
2755
|
if (this.state.import.containerEncrypted && this.state.import.phase !== "preview" && this.state.import.phase !== "decrypt-archive") this.state.import.phase = "decrypt-archive";
|
|
@@ -3042,7 +3060,7 @@ var RunStore = class {
|
|
|
3042
3060
|
const runStore = new RunStore();
|
|
3043
3061
|
//#endregion
|
|
3044
3062
|
//#region \0config-manager-css:/home/runner/work/dsh-config-manager/dsh-config-manager/src/client/config-manager.module.css.js
|
|
3045
|
-
const css = "._367UGW_section{height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:10px;font-size:13px;display:flex}._367UGW_sectionHeader{flex:none;align-items:center;gap:10px;display:flex}._367UGW_viewTabs{border-bottom:1px solid var(--dsw-alias-border-l1);flex:1;gap:2px;display:flex}._367UGW_viewTab{color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;border-radius:6px 6px 0 0;padding:7px 14px;font-size:13px}._367UGW_viewTab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_viewTab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}._367UGW_sectionBody{flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}._367UGW_viewBody{flex-direction:column;gap:12px;padding:4px 2px 16px;display:flex}._367UGW_sectionTitleBlock{flex-direction:column;gap:2px;display:flex}._367UGW_sectionTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:15px;font-weight:700}._367UGW_sectionSubtitle{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:1.5}._367UGW_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-info-fill);cursor:pointer;white-space:nowrap;border:none;border-radius:8px;align-items:center;gap:6px;padding:6px 14px;font-size:13px;font-weight:600;display:inline-flex}._367UGW_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}._367UGW_primaryButton:disabled{opacity:.5;cursor:default}._367UGW_ghostButton{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;align-items:center;gap:6px;padding:5px 12px;font-size:12px;display:inline-flex}._367UGW_ghostButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._367UGW_ghostButton:disabled{opacity:.45;cursor:default}._367UGW_dangerButton{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:5px 12px;font-size:12px}._367UGW_dangerButton:hover:not(:disabled){background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-foreground)}._367UGW_dangerButton:disabled{opacity:.45;cursor:default}._367UGW_badge{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;line-height:1.6;display:inline-block}._367UGW_badgeInfo{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}._367UGW_badgeOk{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}._367UGW_badgeWarn{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}._367UGW_badgeError{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}._367UGW_banner{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;border-radius:8px;padding:8px 12px;font-size:12.5px;line-height:1.5}._367UGW_banner[data-kind=ok]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}._367UGW_banner[data-kind=error]{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}._367UGW_banner[data-kind=info]{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}._367UGW_banner[data-kind=warn]{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}._367UGW_card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;flex-direction:column;flex:none;gap:10px;padding:12px;display:flex}._367UGW_wizardCard{gap:14px}._367UGW_wizardCard ._367UGW_field{gap:8px}._367UGW_field{flex-direction:column;gap:5px;display:flex}._367UGW_fieldLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}._367UGW_input{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);resize:vertical;border-radius:8px;outline:none;padding:7px 10px;font-family:inherit;font-size:13px}._367UGW_input:focus{border-color:var(--dsw-alias-state-business-primary)}._367UGW_input::placeholder{color:var(--dsw-alias-label-tertiary)}._367UGW_input:disabled{opacity:.55}._367UGW_select{-webkit-appearance:none;appearance:none;color:var(--dsw-alias-label-primary);background-color:var(--dsw-specific-input-major);background-image:linear-gradient(45deg, transparent 50%, var(--dsw-alias-label-secondary) 50%), linear-gradient(135deg, var(--dsw-alias-label-secondary) 50%, transparent 50%);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background-position:calc(100% - 17px) calc(50% - 1px),calc(100% - 12px) calc(50% - 1px);background-repeat:no-repeat;background-size:5px 5px,5px 5px;border-radius:8px;outline:none;max-width:100%;padding:7px 30px 7px 10px;font-family:inherit;font-size:13px}._367UGW_select:hover:not(:disabled){border-color:var(--dsw-alias-border-l1)}._367UGW_select:focus{border-color:var(--dsw-alias-state-business-primary)}._367UGW_select:disabled{opacity:.55;cursor:default}._367UGW_select option{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}._367UGW_hint{color:var(--dsw-alias-label-tertiary);font-size:11.5px;line-height:1.5}._367UGW_formError{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px}._367UGW_checkboxRow{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:flex-start;gap:8px;font-size:13px;display:flex}._367UGW_checkboxRow input{flex:none;margin-top:2px}._367UGW_radioLabel{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:center;gap:6px;font-size:13px;display:inline-flex}._367UGW_secretFields{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px 12px;padding-top:4px;display:grid}._367UGW_hiddenFile{display:none}._367UGW_modeTabs{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:2px;display:flex}._367UGW_modeTab{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;padding:6px 12px;font-size:12.5px}._367UGW_modeTab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_modeTab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}._367UGW_modeHint{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}._367UGW_groupList{flex-direction:column;gap:10px;display:flex}._367UGW_groupCard{gap:8px}._367UGW_groupHeader{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}._367UGW_groupLabel{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:700}._367UGW_groupNote{color:var(--dsw-alias-label-tertiary);font-size:11.5px}._367UGW_groupItems{flex-direction:column;gap:6px;display:flex}._367UGW_categoryItem{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}._367UGW_categoryName{font-weight:500}._367UGW_categoryDesc{color:var(--dsw-alias-label-tertiary);font-size:11.5px}._367UGW_optionsCard{gap:8px}._367UGW_optionsHeader{color:var(--dsw-alias-label-primary);letter-spacing:.02em;margin-bottom:2px;font-size:12px;font-weight:600}._367UGW_warnList{margin:4px 0 0;padding-left:18px}._367UGW_actionRow{flex-wrap:wrap;align-items:center;gap:10px;display:flex}._367UGW_progressBlock{flex-direction:column;flex:none;gap:6px;display:flex}._367UGW_progressMeta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:12px;font-size:12px;display:flex}._367UGW_progressLabel{font-weight:600}._367UGW_progressDetail{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:320px;overflow:hidden}._367UGW_progressBadge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;align-items:center;gap:2px;padding:1px 8px;font-size:11px;line-height:18px;display:inline-flex}._367UGW_progressBadgeSection{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 14%, transparent);color:var(--dsw-alias-state-business-primary)}._367UGW_progressBadgeCount{background:color-mix(in srgb, var(--dsw-alias-state-info-primary) 14%, transparent);color:var(--dsw-alias-state-info-primary)}._367UGW_progressPercent{font-variant-numeric:tabular-nums;margin-left:auto}._367UGW_progressTrack{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;height:8px;overflow:hidden}._367UGW_progressBar{background:var(--dsw-alias-state-business-primary);border-radius:999px;height:100%;transition:width .12s linear}._367UGW_progressBarDone{background:var(--dsw-alias-state-success-primary)}._367UGW_progressIndeterminate{width:40%;animation:1s ease-in-out infinite _367UGW_dshCmIndeterminate}._367UGW_logPanel{flex-direction:column;flex:none;gap:6px;display:flex}._367UGW_logHeader{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:12.5px;font-weight:600;display:flex}._367UGW_logJumpButton{font-family:var(--dsw-font-family);color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:999px;padding:3px 8px;font-size:11px;line-height:1}._367UGW_logJumpButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_logScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:200px;padding:2px 10px 6px;overflow-y:auto}._367UGW_logLine{white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);padding:1px 0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.6}._367UGW_logEmpty{color:var(--dsw-alias-label-tertiary);padding:6px 0;font-size:11.5px}@keyframes _367UGW_dshCmIndeterminate{0%{margin-left:-40%}to{margin-left:100%}}._367UGW_reportView{flex-direction:column;gap:10px;display:flex}._367UGW_statRow{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_reportText{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;max-height:260px;color:var(--dsw-alias-label-primary);border-radius:8px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.6;overflow:auto}._367UGW_reportFooter{justify-content:flex-end;gap:8px;display:flex}._367UGW_rollbackBox{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_rollbackBox ._367UGW_reportText{border-color:var(--dsw-alias-border-l2)}._367UGW_errorBanner{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_errorTitle{color:var(--dsw-alias-state-error-primary);font-size:13px;font-weight:700}._367UGW_errorReason{white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}._367UGW_errorAction{color:var(--dsw-alias-label-secondary);font-size:12.5px}._367UGW_errorActionLabel{color:var(--dsw-alias-state-business-primary)}._367UGW_errorItem{color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}._367UGW_errorFooter{justify-content:flex-end;display:flex}._367UGW_errorList{flex-direction:column;gap:4px;display:flex}._367UGW_errorLine{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-state-error-primary);border-radius:6px;margin:0;padding:6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictList{flex-direction:column;gap:10px;display:flex}._367UGW_conflictItem{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_conflictHead{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_conflictId{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:600}._367UGW_severityError{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);border-radius:999px;padding:0 6px;font-size:10.5px}._367UGW_conflictDetail{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);border-radius:6px;margin:0;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictOptions{flex-wrap:wrap;gap:14px;display:flex}._367UGW_pathMappingList{flex-direction:column;gap:8px;display:flex}._367UGW_pathRow{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;padding:10px 12px;display:grid}._367UGW_pathOld,._367UGW_pathNew{flex-direction:column;gap:4px;min-width:0;display:flex}._367UGW_pathValue{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;overflow:hidden}._367UGW_pathIssueKind{color:var(--dsw-alias-state-warn-primary);font-size:10.5px}._367UGW_secretsList{flex-direction:column;gap:10px;display:flex}._367UGW_empty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:22px 12px;font-size:12.5px}._367UGW_spinnerWrap{align-items:center;gap:6px;display:inline-flex}._367UGW_spinner{border:2px solid var(--dsw-alias-state-business-primary);vertical-align:-1px;border-top-color:#0000;border-radius:50%;flex:none;width:11px;height:11px;animation:.8s linear infinite _367UGW_dshCmSpin;display:inline-block}._367UGW_spinnerLabel{color:var(--dsw-alias-label-secondary);font-size:12px}@keyframes _367UGW_dshCmSpin{to{transform:rotate(360deg)}}._367UGW_snapshotList{flex-direction:column;gap:2px;display:flex}._367UGW_snapshotRowHeader,._367UGW_snapshotRow{grid-template-columns:minmax(120px,1.2fr) minmax(140px,1.6fr) 90px 56px 56px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:grid}._367UGW_snapshotRowHeader{color:var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-border-l1);font-size:11px}._367UGW_snapshotRow{text-align:left;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px}._367UGW_snapshotRow:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_snapshotRow[data-active]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent)}._367UGW_warnText{color:var(--dsw-alias-state-warn-primary)}._367UGW_reportList{color:var(--dsw-alias-label-primary);flex-direction:column;gap:3px;margin:8px 0 4px;padding-left:18px;font-size:12px;display:flex}._367UGW_kindTag{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 6px;font-size:10.5px;display:inline-block}._367UGW_planScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;height:280px;padding:2px 10px 8px;overflow-y:auto}._367UGW_planScroll ._367UGW_reportList{margin-top:6px}._367UGW_reportScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:220px;padding:2px 10px 6px;overflow-y:auto}._367UGW_reportScroll ._367UGW_reportList{margin-top:4px}._367UGW_confirmScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:280px;padding:2px 10px 6px;overflow-y:auto}._367UGW_confirmScroll ._367UGW_reportList{margin-top:4px;margin-bottom:0}._367UGW_pullScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;height:280px;padding:2px 10px 6px;overflow-y:auto}._367UGW_pullScroll ._367UGW_reportList{margin-top:4px;margin-bottom:0}._367UGW_rowActions{gap:8px;margin-top:10px;display:flex}._367UGW_diffScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;max-height:240px;color:var(--dsw-alias-label-primary);border-radius:8px;margin:0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.6;overflow:auto}._367UGW_aboutLinkRow{flex-wrap:wrap;align-items:center;gap:10px;display:flex}._367UGW_aboutAuthor{color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:6px;padding:4px 8px;font-size:13px;text-decoration:none;display:inline-flex}._367UGW_aboutAuthor:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_dialogMask{z-index:100;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._367UGW_dialogCard{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:min(420px,100%);max-height:80vh;box-shadow:0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);border-radius:10px;flex-direction:column;gap:10px;padding:14px;display:flex}._367UGW_dialogHeader{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:600}._367UGW_dialogBody{overscroll-behavior:contain;max-height:240px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;flex-direction:column;gap:10px;font-size:13px;line-height:1.6;display:flex;overflow-y:auto}._367UGW_dialogWide{width:min(560px,100%)}._367UGW_dialogBodyScroll{overscroll-behavior:contain;max-height:70vh;color:var(--dsw-alias-label-primary);white-space:normal;flex-direction:column;gap:10px;font-size:13px;line-height:1.6;display:flex;overflow-y:auto}._367UGW_dialogHeaderRow{justify-content:space-between;align-items:center;gap:10px;display:flex}._367UGW_dialogClose{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:16px;line-height:1}._367UGW_dialogClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-hover)}";
|
|
3063
|
+
const css = "._367UGW_section{height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:10px;font-size:13px;display:flex}._367UGW_sectionHeader{flex:none;align-items:center;gap:10px;display:flex}._367UGW_viewTabs{border-bottom:1px solid var(--dsw-alias-border-l1);flex:1;gap:2px;display:flex}._367UGW_viewTab{color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;border-radius:6px 6px 0 0;padding:7px 14px;font-size:13px}._367UGW_viewTab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_viewTab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}._367UGW_sectionBody{flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}._367UGW_viewBody{flex-direction:column;gap:12px;padding:4px 2px 16px;display:flex}._367UGW_sectionTitleBlock{flex-direction:column;gap:2px;display:flex}._367UGW_sectionTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:15px;font-weight:700}._367UGW_sectionSubtitle{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:1.5}._367UGW_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-info-fill);cursor:pointer;white-space:nowrap;border:none;border-radius:8px;align-items:center;gap:6px;padding:6px 14px;font-size:13px;font-weight:600;display:inline-flex}._367UGW_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}._367UGW_primaryButton:disabled{opacity:.5;cursor:default}._367UGW_ghostButton{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;align-items:center;gap:6px;padding:5px 12px;font-size:12px;display:inline-flex}._367UGW_ghostButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._367UGW_ghostButton:disabled{opacity:.45;cursor:default}._367UGW_dangerButton{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:5px 12px;font-size:12px}._367UGW_dangerButton:hover:not(:disabled){background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-foreground)}._367UGW_dangerButton:disabled{opacity:.45;cursor:default}._367UGW_badge{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;line-height:1.6;display:inline-block}._367UGW_badgeInfo{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}._367UGW_badgeOk{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}._367UGW_badgeWarn{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}._367UGW_badgeError{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}._367UGW_banner{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;border-radius:8px;padding:8px 12px;font-size:12.5px;line-height:1.5}._367UGW_banner[data-kind=ok]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}._367UGW_banner[data-kind=error]{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}._367UGW_banner[data-kind=info]{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}._367UGW_banner[data-kind=warn]{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}._367UGW_card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;flex-direction:column;flex:none;gap:10px;padding:12px;display:flex}._367UGW_wizardCard{gap:14px}._367UGW_wizardCard ._367UGW_field{gap:8px}._367UGW_field{flex-direction:column;gap:5px;display:flex}._367UGW_fieldLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}._367UGW_input{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);resize:vertical;border-radius:8px;outline:none;padding:7px 10px;font-family:inherit;font-size:13px}._367UGW_input:focus{border-color:var(--dsw-alias-state-business-primary)}._367UGW_input::placeholder{color:var(--dsw-alias-label-tertiary)}._367UGW_input:disabled{opacity:.55}._367UGW_select{-webkit-appearance:none;appearance:none;color:var(--dsw-alias-label-primary);background-color:var(--dsw-specific-input-major);background-image:linear-gradient(45deg, transparent 50%, var(--dsw-alias-label-secondary) 50%), linear-gradient(135deg, var(--dsw-alias-label-secondary) 50%, transparent 50%);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background-position:calc(100% - 17px) calc(50% - 1px),calc(100% - 12px) calc(50% - 1px);background-repeat:no-repeat;background-size:5px 5px,5px 5px;border-radius:8px;outline:none;max-width:100%;padding:7px 30px 7px 10px;font-family:inherit;font-size:13px}._367UGW_select:hover:not(:disabled){border-color:var(--dsw-alias-border-l1)}._367UGW_select:focus{border-color:var(--dsw-alias-state-business-primary)}._367UGW_select:disabled{opacity:.55;cursor:default}._367UGW_select option{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}._367UGW_hint{color:var(--dsw-alias-label-tertiary);font-size:11.5px;line-height:1.5}._367UGW_formError{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px}._367UGW_checkboxRow{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:flex-start;gap:8px;font-size:13px;display:flex}._367UGW_checkboxRow input{flex:none;margin-top:2px}._367UGW_radioLabel{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:center;gap:6px;font-size:13px;display:inline-flex}._367UGW_secretFields{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px 12px;padding-top:4px;display:grid}._367UGW_hiddenFile{display:none}._367UGW_modeTabs{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:2px;display:flex}._367UGW_modeTab{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;padding:6px 12px;font-size:12.5px}._367UGW_modeTab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_modeTab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}._367UGW_modeHint{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}._367UGW_groupList{flex-direction:column;gap:10px;display:flex}._367UGW_groupCard{gap:8px}._367UGW_groupHeader{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}._367UGW_groupLabel{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:700}._367UGW_groupNote{color:var(--dsw-alias-label-tertiary);font-size:11.5px}._367UGW_groupItems{flex-direction:column;gap:6px;display:flex}._367UGW_categoryItem{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}._367UGW_categoryName{font-weight:500}._367UGW_categoryDesc{color:var(--dsw-alias-label-tertiary);font-size:11.5px}._367UGW_optionsCard{gap:8px}._367UGW_optionsHeader{color:var(--dsw-alias-label-primary);letter-spacing:.02em;margin-bottom:2px;font-size:12px;font-weight:600}._367UGW_warnList{margin:4px 0 0;padding-left:18px}._367UGW_actionRow{flex-wrap:wrap;align-items:center;gap:10px;display:flex}._367UGW_progressBlock{flex-direction:column;flex:none;gap:6px;display:flex}._367UGW_progressMeta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:12px;font-size:12px;display:flex}._367UGW_progressLabel{font-weight:600}._367UGW_progressDetail{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:320px;overflow:hidden}._367UGW_progressBadge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;align-items:center;gap:2px;padding:1px 8px;font-size:11px;line-height:18px;display:inline-flex}._367UGW_progressBadgeSection{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 14%, transparent);color:var(--dsw-alias-state-business-primary)}._367UGW_progressBadgeCount{background:color-mix(in srgb, var(--dsw-alias-state-info-primary) 14%, transparent);color:var(--dsw-alias-state-info-primary)}._367UGW_progressPercent{font-variant-numeric:tabular-nums;margin-left:auto}._367UGW_progressTrack{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;height:8px;overflow:hidden}._367UGW_progressBar{background:var(--dsw-alias-state-business-primary);border-radius:999px;height:100%;transition:width .12s linear}._367UGW_progressBarDone{background:var(--dsw-alias-state-success-primary)}._367UGW_progressIndeterminate{width:40%;animation:1s ease-in-out infinite _367UGW_dshCmIndeterminate}._367UGW_logPanel{flex-direction:column;flex:none;gap:6px;display:flex}._367UGW_logHeader{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:12.5px;font-weight:600;display:flex}._367UGW_logJumpButton{font-family:var(--dsw-font-family);color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:999px;padding:3px 8px;font-size:11px;line-height:1}._367UGW_logJumpButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_logScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:200px;padding:2px 10px 6px;overflow-y:auto}._367UGW_logLine{white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);padding:1px 0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.6}._367UGW_logEmpty{color:var(--dsw-alias-label-tertiary);padding:6px 0;font-size:11.5px}@keyframes _367UGW_dshCmIndeterminate{0%{margin-left:-40%}to{margin-left:100%}}._367UGW_reportView{flex-direction:column;gap:10px;display:flex}._367UGW_statRow{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_reportText{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;max-height:260px;color:var(--dsw-alias-label-primary);border-radius:8px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.6;overflow:auto}._367UGW_reportFooter{justify-content:flex-end;gap:8px;display:flex}._367UGW_rollbackBox{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_rollbackBox ._367UGW_reportText{border-color:var(--dsw-alias-border-l2)}._367UGW_errorBanner{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_errorTitle{color:var(--dsw-alias-state-error-primary);font-size:13px;font-weight:700}._367UGW_errorReason{white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}._367UGW_errorAction{color:var(--dsw-alias-label-secondary);font-size:12.5px}._367UGW_errorActionLabel{color:var(--dsw-alias-state-business-primary)}._367UGW_errorItem{color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}._367UGW_errorFooter{justify-content:flex-end;display:flex}._367UGW_errorList{flex-direction:column;gap:4px;display:flex}._367UGW_errorLine{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-state-error-primary);border-radius:6px;margin:0;padding:6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictList{flex-direction:column;gap:10px;display:flex}._367UGW_conflictItem{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_conflictHead{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_conflictId{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:600}._367UGW_severityError{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);border-radius:999px;padding:0 6px;font-size:10.5px}._367UGW_conflictDetail{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);border-radius:6px;margin:0;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictOptions{flex-wrap:wrap;gap:14px;display:flex}._367UGW_pathMappingList{flex-direction:column;gap:8px;display:flex}._367UGW_pathRow{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;padding:10px 12px;display:grid}._367UGW_pathOld,._367UGW_pathNew{flex-direction:column;gap:4px;min-width:0;display:flex}._367UGW_pathValue{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;overflow:hidden}._367UGW_pathIssueKind{color:var(--dsw-alias-state-warn-primary);font-size:10.5px}._367UGW_secretsList{flex-direction:column;gap:10px;display:flex}._367UGW_empty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:22px 12px;font-size:12.5px}._367UGW_spinnerWrap{align-items:center;gap:6px;display:inline-flex}._367UGW_spinner{border:2px solid var(--dsw-alias-state-business-primary);vertical-align:-1px;border-top-color:#0000;border-radius:50%;flex:none;width:11px;height:11px;animation:.8s linear infinite _367UGW_dshCmSpin;display:inline-block}._367UGW_spinnerLabel{color:var(--dsw-alias-label-secondary);font-size:12px}@keyframes _367UGW_dshCmSpin{to{transform:rotate(360deg)}}._367UGW_snapshotList{flex-direction:column;gap:2px;display:flex}._367UGW_snapshotRowHeader,._367UGW_snapshotRow{grid-template-columns:minmax(120px,1.2fr) minmax(140px,1.6fr) 90px 56px 56px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:grid}._367UGW_snapshotRowHeader{color:var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-border-l1);font-size:11px}._367UGW_snapshotRow{text-align:left;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px}._367UGW_snapshotRow:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_snapshotRow[data-active]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent)}._367UGW_backupFileList{flex-direction:column;gap:4px;display:flex}._367UGW_backupFileRow{border:1px solid var(--dsw-alias-border-l1);border-radius:6px;flex-wrap:wrap;align-items:center;gap:10px;padding:6px 10px;display:flex}._367UGW_backupFileName{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);flex:180px;font-size:12px;overflow:hidden}._367UGW_backupFileMeta{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}._367UGW_warnText{color:var(--dsw-alias-state-warn-primary)}._367UGW_reportList{color:var(--dsw-alias-label-primary);flex-direction:column;gap:3px;margin:8px 0 4px;padding-left:18px;font-size:12px;display:flex}._367UGW_kindTag{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 6px;font-size:10.5px;display:inline-block}._367UGW_planScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;height:280px;padding:2px 10px 8px;overflow-y:auto}._367UGW_planScroll ._367UGW_reportList{margin-top:6px}._367UGW_reportScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:220px;padding:2px 10px 6px;overflow-y:auto}._367UGW_reportScroll ._367UGW_reportList{margin-top:4px}._367UGW_confirmScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:280px;padding:2px 10px 6px;overflow-y:auto}._367UGW_confirmScroll ._367UGW_reportList{margin-top:4px;margin-bottom:0}._367UGW_pullScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;height:280px;padding:2px 10px 6px;overflow-y:auto}._367UGW_pullScroll ._367UGW_reportList{margin-top:4px;margin-bottom:0}._367UGW_rowActions{gap:8px;margin-top:10px;display:flex}._367UGW_diffScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;max-height:240px;color:var(--dsw-alias-label-primary);border-radius:8px;margin:0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.6;overflow:auto}._367UGW_aboutLinkRow{flex-wrap:wrap;align-items:center;gap:10px;display:flex}._367UGW_aboutAuthor{color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:6px;padding:4px 8px;font-size:13px;text-decoration:none;display:inline-flex}._367UGW_aboutAuthor:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_dialogMask{z-index:100;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._367UGW_dialogCard{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:min(420px,100%);max-height:80vh;box-shadow:0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);border-radius:10px;flex-direction:column;gap:10px;padding:14px;display:flex}._367UGW_dialogHeader{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:600}._367UGW_dialogBody{overscroll-behavior:contain;max-height:240px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;flex-direction:column;gap:10px;font-size:13px;line-height:1.6;display:flex;overflow-y:auto}._367UGW_dialogWide{width:min(560px,100%)}._367UGW_dialogBodyScroll{overscroll-behavior:contain;max-height:70vh;color:var(--dsw-alias-label-primary);white-space:normal;flex-direction:column;gap:10px;font-size:13px;line-height:1.6;display:flex;overflow-y:auto}._367UGW_dialogHeaderRow{justify-content:space-between;align-items:center;gap:10px;display:flex}._367UGW_dialogClose{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:16px;line-height:1}._367UGW_dialogClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-hover)}";
|
|
3046
3064
|
const tagId = "dsh-config-manager/config-manager.module.css";
|
|
3047
3065
|
if (typeof document !== "undefined" && document.querySelector("style[data-tag=\"dsh-config-manager/config-manager.module.css\"]") === null) {
|
|
3048
3066
|
const tag = document.createElement("style");
|
|
@@ -3052,126 +3070,130 @@ if (typeof document !== "undefined" && document.querySelector("style[data-tag=\"
|
|
|
3052
3070
|
document.head.appendChild(tag);
|
|
3053
3071
|
}
|
|
3054
3072
|
var config_manager_module_css_default = {
|
|
3055
|
-
"
|
|
3056
|
-
"
|
|
3057
|
-
"
|
|
3058
|
-
"
|
|
3059
|
-
"
|
|
3060
|
-
"
|
|
3073
|
+
"snapshotRow": "_367UGW_snapshotRow",
|
|
3074
|
+
"badgeOk": "_367UGW_badgeOk",
|
|
3075
|
+
"checkboxRow": "_367UGW_checkboxRow",
|
|
3076
|
+
"section": "_367UGW_section",
|
|
3077
|
+
"errorReason": "_367UGW_errorReason",
|
|
3078
|
+
"dialogCard": "_367UGW_dialogCard",
|
|
3079
|
+
"warnText": "_367UGW_warnText",
|
|
3080
|
+
"dialogWide": "_367UGW_dialogWide",
|
|
3081
|
+
"sectionTitleBlock": "_367UGW_sectionTitleBlock",
|
|
3082
|
+
"wizardCard": "_367UGW_wizardCard",
|
|
3083
|
+
"spinnerWrap": "_367UGW_spinnerWrap",
|
|
3084
|
+
"backupFileRow": "_367UGW_backupFileRow",
|
|
3061
3085
|
"progressMeta": "_367UGW_progressMeta",
|
|
3086
|
+
"pathValue": "_367UGW_pathValue",
|
|
3087
|
+
"spinnerLabel": "_367UGW_spinnerLabel",
|
|
3062
3088
|
"snapshotRowHeader": "_367UGW_snapshotRowHeader",
|
|
3063
|
-
"
|
|
3064
|
-
"
|
|
3065
|
-
"
|
|
3066
|
-
"reportView": "_367UGW_reportView",
|
|
3067
|
-
"reportScroll": "_367UGW_reportScroll",
|
|
3089
|
+
"errorAction": "_367UGW_errorAction",
|
|
3090
|
+
"field": "_367UGW_field",
|
|
3091
|
+
"dialogClose": "_367UGW_dialogClose",
|
|
3068
3092
|
"errorItem": "_367UGW_errorItem",
|
|
3069
|
-
"
|
|
3070
|
-
"errorTitle": "_367UGW_errorTitle",
|
|
3071
|
-
"rowActions": "_367UGW_rowActions",
|
|
3072
|
-
"actionRow": "_367UGW_actionRow",
|
|
3073
|
-
"spinnerWrap": "_367UGW_spinnerWrap",
|
|
3074
|
-
"badgeWarn": "_367UGW_badgeWarn",
|
|
3075
|
-
"errorList": "_367UGW_errorList",
|
|
3076
|
-
"groupCard": "_367UGW_groupCard",
|
|
3077
|
-
"progressIndeterminate": "_367UGW_progressIndeterminate",
|
|
3078
|
-
"groupNote": "_367UGW_groupNote",
|
|
3079
|
-
"pathOld": "_367UGW_pathOld",
|
|
3080
|
-
"hint": "_367UGW_hint",
|
|
3081
|
-
"modeHint": "_367UGW_modeHint",
|
|
3082
|
-
"pathMappingList": "_367UGW_pathMappingList",
|
|
3083
|
-
"progressBar": "_367UGW_progressBar",
|
|
3084
|
-
"reportFooter": "_367UGW_reportFooter",
|
|
3085
|
-
"spinner": "_367UGW_spinner",
|
|
3093
|
+
"aboutLinkRow": "_367UGW_aboutLinkRow",
|
|
3086
3094
|
"dshCmSpin": "_367UGW_dshCmSpin",
|
|
3087
|
-
"
|
|
3095
|
+
"viewBody": "_367UGW_viewBody",
|
|
3096
|
+
"progressBadgeCount": "_367UGW_progressBadgeCount",
|
|
3097
|
+
"progressBadge": "_367UGW_progressBadge",
|
|
3098
|
+
"select": "_367UGW_select",
|
|
3099
|
+
"modeHint": "_367UGW_modeHint",
|
|
3088
3100
|
"logLine": "_367UGW_logLine",
|
|
3089
|
-
"
|
|
3090
|
-
"
|
|
3091
|
-
"
|
|
3101
|
+
"backupFileList": "_367UGW_backupFileList",
|
|
3102
|
+
"diffScroll": "_367UGW_diffScroll",
|
|
3103
|
+
"sectionBody": "_367UGW_sectionBody",
|
|
3092
3104
|
"empty": "_367UGW_empty",
|
|
3093
|
-
"dialogWide": "_367UGW_dialogWide",
|
|
3094
|
-
"logPanel": "_367UGW_logPanel",
|
|
3095
|
-
"dialogHeader": "_367UGW_dialogHeader",
|
|
3096
|
-
"badge": "_367UGW_badge",
|
|
3097
|
-
"pathRow": "_367UGW_pathRow",
|
|
3098
|
-
"aboutLinkRow": "_367UGW_aboutLinkRow",
|
|
3099
|
-
"snapshotList": "_367UGW_snapshotList",
|
|
3100
|
-
"modeTab": "_367UGW_modeTab",
|
|
3101
|
-
"logScroll": "_367UGW_logScroll",
|
|
3102
|
-
"groupHeader": "_367UGW_groupHeader",
|
|
3103
|
-
"progressBadge": "_367UGW_progressBadge",
|
|
3104
3105
|
"modeTabs": "_367UGW_modeTabs",
|
|
3105
|
-
"
|
|
3106
|
-
"statRow": "_367UGW_statRow",
|
|
3107
|
-
"field": "_367UGW_field",
|
|
3108
|
-
"dialogBodyScroll": "_367UGW_dialogBodyScroll",
|
|
3106
|
+
"progressDetail": "_367UGW_progressDetail",
|
|
3109
3107
|
"radioLabel": "_367UGW_radioLabel",
|
|
3110
|
-
"
|
|
3111
|
-
"
|
|
3108
|
+
"groupHeader": "_367UGW_groupHeader",
|
|
3109
|
+
"errorFooter": "_367UGW_errorFooter",
|
|
3110
|
+
"progressIndeterminate": "_367UGW_progressIndeterminate",
|
|
3111
|
+
"reportText": "_367UGW_reportText",
|
|
3112
3112
|
"dangerButton": "_367UGW_dangerButton",
|
|
3113
|
-
"
|
|
3114
|
-
"
|
|
3113
|
+
"backupFileName": "_367UGW_backupFileName",
|
|
3114
|
+
"errorList": "_367UGW_errorList",
|
|
3115
|
+
"logPanel": "_367UGW_logPanel",
|
|
3116
|
+
"logScroll": "_367UGW_logScroll",
|
|
3117
|
+
"sectionHeader": "_367UGW_sectionHeader",
|
|
3118
|
+
"kindTag": "_367UGW_kindTag",
|
|
3119
|
+
"primaryButton": "_367UGW_primaryButton",
|
|
3120
|
+
"input": "_367UGW_input",
|
|
3121
|
+
"viewTabs": "_367UGW_viewTabs",
|
|
3122
|
+
"pathRow": "_367UGW_pathRow",
|
|
3123
|
+
"groupList": "_367UGW_groupList",
|
|
3124
|
+
"conflictList": "_367UGW_conflictList",
|
|
3125
|
+
"aboutAuthor": "_367UGW_aboutAuthor",
|
|
3126
|
+
"hint": "_367UGW_hint",
|
|
3127
|
+
"progressLabel": "_367UGW_progressLabel",
|
|
3128
|
+
"planScroll": "_367UGW_planScroll",
|
|
3129
|
+
"card": "_367UGW_card",
|
|
3130
|
+
"hiddenFile": "_367UGW_hiddenFile",
|
|
3115
3131
|
"conflictId": "_367UGW_conflictId",
|
|
3116
|
-
"
|
|
3117
|
-
"
|
|
3118
|
-
"dialogClose": "_367UGW_dialogClose",
|
|
3119
|
-
"dialogCard": "_367UGW_dialogCard",
|
|
3120
|
-
"snapshotRow": "_367UGW_snapshotRow",
|
|
3121
|
-
"conflictOptions": "_367UGW_conflictOptions",
|
|
3122
|
-
"dshCmIndeterminate": "_367UGW_dshCmIndeterminate",
|
|
3123
|
-
"optionsHeader": "_367UGW_optionsHeader",
|
|
3124
|
-
"fieldLabel": "_367UGW_fieldLabel",
|
|
3125
|
-
"formError": "_367UGW_formError",
|
|
3126
|
-
"logEmpty": "_367UGW_logEmpty",
|
|
3127
|
-
"errorBanner": "_367UGW_errorBanner",
|
|
3132
|
+
"groupNote": "_367UGW_groupNote",
|
|
3133
|
+
"sectionSubtitle": "_367UGW_sectionSubtitle",
|
|
3128
3134
|
"conflictDetail": "_367UGW_conflictDetail",
|
|
3129
|
-
"
|
|
3130
|
-
"
|
|
3131
|
-
"errorReason": "_367UGW_errorReason",
|
|
3132
|
-
"badgeOk": "_367UGW_badgeOk",
|
|
3133
|
-
"wizardCard": "_367UGW_wizardCard",
|
|
3135
|
+
"optionsCard": "_367UGW_optionsCard",
|
|
3136
|
+
"badgeInfo": "_367UGW_badgeInfo",
|
|
3134
3137
|
"groupLabel": "_367UGW_groupLabel",
|
|
3135
|
-
"
|
|
3136
|
-
"
|
|
3137
|
-
"
|
|
3138
|
-
"
|
|
3139
|
-
"
|
|
3140
|
-
"
|
|
3141
|
-
"
|
|
3142
|
-
"errorAction": "_367UGW_errorAction",
|
|
3143
|
-
"badgeError": "_367UGW_badgeError",
|
|
3144
|
-
"progressBarDone": "_367UGW_progressBarDone",
|
|
3145
|
-
"sectionBody": "_367UGW_sectionBody",
|
|
3138
|
+
"pathNew": "_367UGW_pathNew",
|
|
3139
|
+
"secretsList": "_367UGW_secretsList",
|
|
3140
|
+
"dialogHeader": "_367UGW_dialogHeader",
|
|
3141
|
+
"progressPercent": "_367UGW_progressPercent",
|
|
3142
|
+
"conflictOptions": "_367UGW_conflictOptions",
|
|
3143
|
+
"conflictItem": "_367UGW_conflictItem",
|
|
3144
|
+
"pathMappingList": "_367UGW_pathMappingList",
|
|
3146
3145
|
"progressTrack": "_367UGW_progressTrack",
|
|
3147
|
-
"
|
|
3148
|
-
"
|
|
3149
|
-
"checkboxRow": "_367UGW_checkboxRow",
|
|
3150
|
-
"progressDetail": "_367UGW_progressDetail",
|
|
3151
|
-
"primaryButton": "_367UGW_primaryButton",
|
|
3152
|
-
"errorActionLabel": "_367UGW_errorActionLabel",
|
|
3153
|
-
"input": "_367UGW_input",
|
|
3154
|
-
"warnText": "_367UGW_warnText",
|
|
3146
|
+
"snapshotList": "_367UGW_snapshotList",
|
|
3147
|
+
"fieldLabel": "_367UGW_fieldLabel",
|
|
3155
3148
|
"logHeader": "_367UGW_logHeader",
|
|
3149
|
+
"statRow": "_367UGW_statRow",
|
|
3150
|
+
"backupFileMeta": "_367UGW_backupFileMeta",
|
|
3151
|
+
"progressBadgeSection": "_367UGW_progressBadgeSection",
|
|
3152
|
+
"actionRow": "_367UGW_actionRow",
|
|
3153
|
+
"banner": "_367UGW_banner",
|
|
3154
|
+
"dialogHeaderRow": "_367UGW_dialogHeaderRow",
|
|
3155
|
+
"categoryDesc": "_367UGW_categoryDesc",
|
|
3156
|
+
"categoryItem": "_367UGW_categoryItem",
|
|
3157
|
+
"groupCard": "_367UGW_groupCard",
|
|
3158
|
+
"badgeError": "_367UGW_badgeError",
|
|
3159
|
+
"pathOld": "_367UGW_pathOld",
|
|
3160
|
+
"dshCmIndeterminate": "_367UGW_dshCmIndeterminate",
|
|
3161
|
+
"reportView": "_367UGW_reportView",
|
|
3162
|
+
"warnList": "_367UGW_warnList",
|
|
3163
|
+
"badge": "_367UGW_badge",
|
|
3164
|
+
"sectionTitle": "_367UGW_sectionTitle",
|
|
3156
3165
|
"progressBlock": "_367UGW_progressBlock",
|
|
3166
|
+
"reportList": "_367UGW_reportList",
|
|
3167
|
+
"dialogBody": "_367UGW_dialogBody",
|
|
3157
3168
|
"confirmScroll": "_367UGW_confirmScroll",
|
|
3158
|
-
"
|
|
3159
|
-
"
|
|
3160
|
-
"section": "_367UGW_section",
|
|
3161
|
-
"errorLine": "_367UGW_errorLine",
|
|
3162
|
-
"hiddenFile": "_367UGW_hiddenFile",
|
|
3163
|
-
"warnList": "_367UGW_warnList",
|
|
3164
|
-
"rollbackBox": "_367UGW_rollbackBox",
|
|
3169
|
+
"optionsHeader": "_367UGW_optionsHeader",
|
|
3170
|
+
"conflictHead": "_367UGW_conflictHead",
|
|
3165
3171
|
"pullScroll": "_367UGW_pullScroll",
|
|
3166
|
-
"
|
|
3167
|
-
"pathIssueKind": "_367UGW_pathIssueKind",
|
|
3168
|
-
"spinnerLabel": "_367UGW_spinnerLabel",
|
|
3169
|
-
"conflictItem": "_367UGW_conflictItem",
|
|
3172
|
+
"reportFooter": "_367UGW_reportFooter",
|
|
3170
3173
|
"severityError": "_367UGW_severityError",
|
|
3171
|
-
"
|
|
3172
|
-
"
|
|
3173
|
-
"
|
|
3174
|
-
"
|
|
3174
|
+
"logEmpty": "_367UGW_logEmpty",
|
|
3175
|
+
"progressBar": "_367UGW_progressBar",
|
|
3176
|
+
"rowActions": "_367UGW_rowActions",
|
|
3177
|
+
"rollbackBox": "_367UGW_rollbackBox",
|
|
3178
|
+
"formError": "_367UGW_formError",
|
|
3179
|
+
"errorBanner": "_367UGW_errorBanner",
|
|
3180
|
+
"dialogMask": "_367UGW_dialogMask",
|
|
3181
|
+
"logJumpButton": "_367UGW_logJumpButton",
|
|
3182
|
+
"pathIssueKind": "_367UGW_pathIssueKind",
|
|
3183
|
+
"ghostButton": "_367UGW_ghostButton",
|
|
3184
|
+
"modeTab": "_367UGW_modeTab",
|
|
3185
|
+
"groupItems": "_367UGW_groupItems",
|
|
3186
|
+
"errorLine": "_367UGW_errorLine",
|
|
3187
|
+
"progressBarDone": "_367UGW_progressBarDone",
|
|
3188
|
+
"errorActionLabel": "_367UGW_errorActionLabel",
|
|
3189
|
+
"reportScroll": "_367UGW_reportScroll",
|
|
3190
|
+
"categoryName": "_367UGW_categoryName",
|
|
3191
|
+
"viewTab": "_367UGW_viewTab",
|
|
3192
|
+
"dialogBodyScroll": "_367UGW_dialogBodyScroll",
|
|
3193
|
+
"errorTitle": "_367UGW_errorTitle",
|
|
3194
|
+
"badgeWarn": "_367UGW_badgeWarn",
|
|
3195
|
+
"spinner": "_367UGW_spinner",
|
|
3196
|
+
"secretFields": "_367UGW_secretFields"
|
|
3175
3197
|
};
|
|
3176
3198
|
//#endregion
|
|
3177
3199
|
//#region src/client/common/ui.tsx
|
|
@@ -4432,6 +4454,37 @@ function ImportWizardView({ api, t }) {
|
|
|
4432
4454
|
} });
|
|
4433
4455
|
if (fileInput.current !== null) fileInput.current.value = "";
|
|
4434
4456
|
};
|
|
4457
|
+
/**
|
|
4458
|
+
* 一键导入(快照面板「备份文件 → 导入」):消费 runStore.snapshots.importBackup,
|
|
4459
|
+
* 跳过上传直接对宿主 exports 目录的 zipPath 执行 selectZip(analyze 零写入)。
|
|
4460
|
+
* 一次性瞬态:消费后立即清空,刷新/重挂载不会重放;与 onPickFile 共用
|
|
4461
|
+
* pickGeneration 竞态守卫(用户取消选择后晚到的分析结果丢弃)。
|
|
4462
|
+
*/
|
|
4463
|
+
(0, react.useEffect)(() => {
|
|
4464
|
+
const req = runStore.getSnapshot().snapshots.importBackup;
|
|
4465
|
+
if (req === null) return;
|
|
4466
|
+
runStore.patch({ snapshots: { importBackup: null } });
|
|
4467
|
+
const generation = pickGeneration.current;
|
|
4468
|
+
runStore.patch({ import: {
|
|
4469
|
+
selectedFileName: req.name,
|
|
4470
|
+
uploading: true,
|
|
4471
|
+
error: null,
|
|
4472
|
+
decryptPassword: "",
|
|
4473
|
+
decryptRefs: [],
|
|
4474
|
+
archiveUnlocked: false,
|
|
4475
|
+
containerEncrypted: false
|
|
4476
|
+
} });
|
|
4477
|
+
wizard.selectZip(req.zipPath).then(() => {
|
|
4478
|
+
if (generation !== pickGeneration.current) return;
|
|
4479
|
+
runStore.syncWizard();
|
|
4480
|
+
}).catch((err) => {
|
|
4481
|
+
if (generation !== pickGeneration.current) return;
|
|
4482
|
+
runStore.patch({ import: { error: err instanceof Error ? err.message : String(err) } });
|
|
4483
|
+
runStore.syncWizard();
|
|
4484
|
+
}).finally(() => {
|
|
4485
|
+
if (generation === pickGeneration.current) runStore.patch({ import: { uploading: false } });
|
|
4486
|
+
});
|
|
4487
|
+
}, [api]);
|
|
4435
4488
|
/** Compatibility → Preview */
|
|
4436
4489
|
const goPreview = async () => {
|
|
4437
4490
|
runStore.patch({ import: { error: null } });
|
|
@@ -5297,6 +5350,8 @@ function SnapshotsPanel({ api, t }) {
|
|
|
5297
5350
|
const planGeneration = (0, react.useRef)(0);
|
|
5298
5351
|
/** 执行恢复的二次确认弹窗开关(危险操作,DESIGN.md §8.11 场景) */
|
|
5299
5352
|
const [confirmOpen, setConfirmOpen] = (0, react.useState)(false);
|
|
5353
|
+
/** 备份文件列表刷新信号:BackupScheduleCard「立即备份」完成后递增触发重载 */
|
|
5354
|
+
const [backupFilesTick, setBackupFilesTick] = (0, react.useState)(0);
|
|
5300
5355
|
/**
|
|
5301
5356
|
* 统一提交入口:更新 stateRef → 挂载时 setState → **总是**镜像进 runStore。
|
|
5302
5357
|
* 关键:镜像不依赖 effect flush —— 异步操作(dry-run 计划/执行恢复)完成回调
|
|
@@ -5306,14 +5361,12 @@ function SnapshotsPanel({ api, t }) {
|
|
|
5306
5361
|
const commit = (next) => {
|
|
5307
5362
|
stateRef.current = next;
|
|
5308
5363
|
if (mountedRef.current) setState(next);
|
|
5309
|
-
const
|
|
5310
|
-
runStore.patch({ snapshots: {
|
|
5311
|
-
...
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
|
|
5315
|
-
backupDraft
|
|
5316
|
-
} });
|
|
5364
|
+
const store = runStore.getSnapshot().snapshots;
|
|
5365
|
+
runStore.patch({ snapshots: toSnapshotsStoreSlice({
|
|
5366
|
+
...next,
|
|
5367
|
+
backupDraft: store.backupDraft,
|
|
5368
|
+
importBackup: store.importBackup
|
|
5369
|
+
}) });
|
|
5317
5370
|
};
|
|
5318
5371
|
const patch = (p) => commit({
|
|
5319
5372
|
...stateRef.current,
|
|
@@ -5322,14 +5375,12 @@ function SnapshotsPanel({ api, t }) {
|
|
|
5322
5375
|
/** 卸载时置挂载守卫 + 最后镜像一次(防止「最后一次改动后立即切 tab」时丢状态)。 */
|
|
5323
5376
|
(0, react.useEffect)(() => () => {
|
|
5324
5377
|
mountedRef.current = false;
|
|
5325
|
-
const
|
|
5326
|
-
runStore.patch({ snapshots: {
|
|
5327
|
-
...
|
|
5328
|
-
|
|
5329
|
-
|
|
5330
|
-
|
|
5331
|
-
backupDraft
|
|
5332
|
-
} });
|
|
5378
|
+
const store = runStore.getSnapshot().snapshots;
|
|
5379
|
+
runStore.patch({ snapshots: toSnapshotsStoreSlice({
|
|
5380
|
+
...stateRef.current,
|
|
5381
|
+
backupDraft: store.backupDraft,
|
|
5382
|
+
importBackup: store.importBackup
|
|
5383
|
+
}) });
|
|
5333
5384
|
}, []);
|
|
5334
5385
|
const load = () => {
|
|
5335
5386
|
patch({
|
|
@@ -5537,9 +5588,17 @@ function SnapshotsPanel({ api, t }) {
|
|
|
5537
5588
|
reportLine(t("snapshots.skipped"), state.report.skipped, false)
|
|
5538
5589
|
] })
|
|
5539
5590
|
] }),
|
|
5591
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(BackupFilesCard, {
|
|
5592
|
+
api,
|
|
5593
|
+
t,
|
|
5594
|
+
refreshTick: backupFilesTick
|
|
5595
|
+
}),
|
|
5540
5596
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(BackupScheduleCard, {
|
|
5541
5597
|
api,
|
|
5542
|
-
t
|
|
5598
|
+
t,
|
|
5599
|
+
onBackupDone: () => {
|
|
5600
|
+
setBackupFilesTick((n) => n + 1);
|
|
5601
|
+
}
|
|
5543
5602
|
}),
|
|
5544
5603
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmDialog, {
|
|
5545
5604
|
open: confirmOpen,
|
|
@@ -5585,7 +5644,7 @@ function formatRunTime(iso) {
|
|
|
5585
5644
|
* 状态自持;草稿镜像 runStore.snapshots.backupDraft(未保存修改切 tab/刷新保留),
|
|
5586
5645
|
* 保存成功清草稿(宿主配置为权威)。
|
|
5587
5646
|
*/
|
|
5588
|
-
function BackupScheduleCard({ api, t }) {
|
|
5647
|
+
function BackupScheduleCard({ api, t, onBackupDone }) {
|
|
5589
5648
|
const [status, setStatus] = (0, react.useState)("loading");
|
|
5590
5649
|
const [error, setError] = (0, react.useState)(null);
|
|
5591
5650
|
const [draft, setDraft] = (0, react.useState)({
|
|
@@ -5662,11 +5721,13 @@ function BackupScheduleCard({ api, t }) {
|
|
|
5662
5721
|
setFlash(null);
|
|
5663
5722
|
setActionError(null);
|
|
5664
5723
|
api.runBackupNow().then((res) => {
|
|
5665
|
-
if (
|
|
5666
|
-
|
|
5667
|
-
|
|
5668
|
-
|
|
5669
|
-
|
|
5724
|
+
if (mountedRef.current) {
|
|
5725
|
+
setSaved(res.schedule);
|
|
5726
|
+
setLastRun(res.run.status);
|
|
5727
|
+
setLastRunDetail(res.run.zip !== void 0 && res.run.zip !== "" ? res.run.zip : res.run.skipReason !== void 0 ? res.run.skipReason : formatRunTime(res.schedule.lastRunAt));
|
|
5728
|
+
setRunning(false);
|
|
5729
|
+
}
|
|
5730
|
+
onBackupDone?.();
|
|
5670
5731
|
}, (err) => {
|
|
5671
5732
|
if (!mountedRef.current) return;
|
|
5672
5733
|
setRunning(false);
|
|
@@ -5771,6 +5832,175 @@ function BackupScheduleCard({ api, t }) {
|
|
|
5771
5832
|
]
|
|
5772
5833
|
});
|
|
5773
5834
|
}
|
|
5835
|
+
/**
|
|
5836
|
+
* 备份文件管理卡(m-backup-files):列出 exports/ 下的导出 ZIP(手动导出 + 定时备份),
|
|
5837
|
+
* 提供下载(复用 /download)/ 一键导入(切 Import tab + 注入 zipPath,向导直接分析)/
|
|
5838
|
+
* 删除(危险操作二次确认)。
|
|
5839
|
+
*
|
|
5840
|
+
* 状态组件自持(列表可随时重载,不持久化;与快照列表同级)。refreshTick 由父组件在
|
|
5841
|
+
* 「立即备份」完成后递增触发重载。安全:文件路径来自宿主受控 exports 目录;删除按钮
|
|
5842
|
+
* 恒走 ConfirmDialog(danger);导入 = 把 zipPath 交给现有导入向导(analyze 零写入,
|
|
5843
|
+
* 不经过上传)。
|
|
5844
|
+
*/
|
|
5845
|
+
function BackupFilesCard({ api, t, refreshTick }) {
|
|
5846
|
+
const [status, setStatus] = (0, react.useState)("loading");
|
|
5847
|
+
const [error, setError] = (0, react.useState)(null);
|
|
5848
|
+
const [files, setFiles] = (0, react.useState)([]);
|
|
5849
|
+
const [deleting, setDeleting] = (0, react.useState)(false);
|
|
5850
|
+
const [confirmDelete, setConfirmDelete] = (0, react.useState)(null);
|
|
5851
|
+
const [actionError, setActionError] = (0, react.useState)(null);
|
|
5852
|
+
const mountedRef = (0, react.useRef)(true);
|
|
5853
|
+
const initialTick = (0, react.useRef)(refreshTick);
|
|
5854
|
+
(0, react.useEffect)(() => () => {
|
|
5855
|
+
mountedRef.current = false;
|
|
5856
|
+
}, []);
|
|
5857
|
+
const load = () => {
|
|
5858
|
+
setStatus("loading");
|
|
5859
|
+
setError(null);
|
|
5860
|
+
api.listBackupFiles().then((list) => {
|
|
5861
|
+
if (!mountedRef.current) return;
|
|
5862
|
+
setFiles(list);
|
|
5863
|
+
setStatus("ready");
|
|
5864
|
+
}, (err) => {
|
|
5865
|
+
if (!mountedRef.current) return;
|
|
5866
|
+
setStatus("error");
|
|
5867
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
5868
|
+
});
|
|
5869
|
+
};
|
|
5870
|
+
(0, react.useEffect)(load, [api]);
|
|
5871
|
+
(0, react.useEffect)(() => {
|
|
5872
|
+
if (refreshTick === initialTick.current) return;
|
|
5873
|
+
load();
|
|
5874
|
+
}, [refreshTick]);
|
|
5875
|
+
const download = (file) => {
|
|
5876
|
+
setActionError(null);
|
|
5877
|
+
api.download(file.path, { saveDialog: true }).catch((err) => {
|
|
5878
|
+
if (!mountedRef.current) return;
|
|
5879
|
+
setActionError(err instanceof Error ? err.message : String(err));
|
|
5880
|
+
});
|
|
5881
|
+
};
|
|
5882
|
+
/** 一键导入:把备份文件 zipPath 交给现有导入向导(切 Import tab;向导挂载即分析) */
|
|
5883
|
+
const importBackup = (file) => {
|
|
5884
|
+
runStore.patch({
|
|
5885
|
+
view: "import",
|
|
5886
|
+
panel: null,
|
|
5887
|
+
snapshots: { importBackup: {
|
|
5888
|
+
zipPath: file.path,
|
|
5889
|
+
name: file.name
|
|
5890
|
+
} }
|
|
5891
|
+
});
|
|
5892
|
+
};
|
|
5893
|
+
const doDelete = () => {
|
|
5894
|
+
const file = confirmDelete;
|
|
5895
|
+
if (file === null || deleting) return;
|
|
5896
|
+
setDeleting(true);
|
|
5897
|
+
setActionError(null);
|
|
5898
|
+
api.deleteBackupFile(file.name).then(() => {
|
|
5899
|
+
setDeleting(false);
|
|
5900
|
+
setConfirmDelete(null);
|
|
5901
|
+
load();
|
|
5902
|
+
}, (err) => {
|
|
5903
|
+
setDeleting(false);
|
|
5904
|
+
setConfirmDelete(null);
|
|
5905
|
+
setActionError(err instanceof Error ? err.message : String(err));
|
|
5906
|
+
});
|
|
5907
|
+
};
|
|
5908
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Card, {
|
|
5909
|
+
className: config_manager_module_css_default.card,
|
|
5910
|
+
children: [
|
|
5911
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5912
|
+
className: config_manager_module_css_default.groupLabel,
|
|
5913
|
+
children: t("backupFiles.title")
|
|
5914
|
+
}),
|
|
5915
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5916
|
+
className: config_manager_module_css_default.hint,
|
|
5917
|
+
children: t("backupFiles.hint")
|
|
5918
|
+
}),
|
|
5919
|
+
status === "loading" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Spinner, { label: t("backupFiles.loading") }),
|
|
5920
|
+
status === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Banner, {
|
|
5921
|
+
kind: "error",
|
|
5922
|
+
children: [error ?? t("common.unknownError"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
|
|
5923
|
+
variant: "primary",
|
|
5924
|
+
onClick: load,
|
|
5925
|
+
children: t("common.retry")
|
|
5926
|
+
})]
|
|
5927
|
+
}),
|
|
5928
|
+
status === "ready" && files.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Empty, { children: t("backupFiles.empty") }),
|
|
5929
|
+
status === "ready" && files.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5930
|
+
className: config_manager_module_css_default.backupFileList,
|
|
5931
|
+
role: "list",
|
|
5932
|
+
"aria-label": t("backupFiles.title"),
|
|
5933
|
+
children: files.map((file) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5934
|
+
className: config_manager_module_css_default.backupFileRow,
|
|
5935
|
+
role: "listitem",
|
|
5936
|
+
children: [
|
|
5937
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5938
|
+
className: config_manager_module_css_default.backupFileName,
|
|
5939
|
+
title: file.name,
|
|
5940
|
+
children: file.name
|
|
5941
|
+
}),
|
|
5942
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
|
|
5943
|
+
kind: "info",
|
|
5944
|
+
children: file.source === "auto" ? t("backupFiles.source.auto") : t("backupFiles.source.manual")
|
|
5945
|
+
}),
|
|
5946
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5947
|
+
className: config_manager_module_css_default.backupFileMeta,
|
|
5948
|
+
children: formatBytes(file.sizeBytes)
|
|
5949
|
+
}),
|
|
5950
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5951
|
+
className: config_manager_module_css_default.backupFileMeta,
|
|
5952
|
+
children: new Date(file.mtimeMs).toLocaleString()
|
|
5953
|
+
}),
|
|
5954
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5955
|
+
className: config_manager_module_css_default.actionRow,
|
|
5956
|
+
children: [
|
|
5957
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
|
|
5958
|
+
disabled: deleting,
|
|
5959
|
+
onClick: () => {
|
|
5960
|
+
download(file);
|
|
5961
|
+
},
|
|
5962
|
+
children: t("backupFiles.download")
|
|
5963
|
+
}),
|
|
5964
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
|
|
5965
|
+
disabled: deleting,
|
|
5966
|
+
onClick: () => {
|
|
5967
|
+
importBackup(file);
|
|
5968
|
+
},
|
|
5969
|
+
children: t("backupFiles.import")
|
|
5970
|
+
}),
|
|
5971
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
|
|
5972
|
+
variant: "danger",
|
|
5973
|
+
disabled: deleting,
|
|
5974
|
+
onClick: () => {
|
|
5975
|
+
setConfirmDelete(file);
|
|
5976
|
+
},
|
|
5977
|
+
children: t("backupFiles.delete")
|
|
5978
|
+
})
|
|
5979
|
+
]
|
|
5980
|
+
})
|
|
5981
|
+
]
|
|
5982
|
+
}, file.name))
|
|
5983
|
+
}),
|
|
5984
|
+
actionError !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
|
|
5985
|
+
kind: "error",
|
|
5986
|
+
children: actionError
|
|
5987
|
+
}),
|
|
5988
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmDialog, {
|
|
5989
|
+
open: confirmDelete !== null,
|
|
5990
|
+
title: t("backupFiles.deleteConfirmTitle"),
|
|
5991
|
+
message: confirmDelete !== null ? t("backupFiles.deleteConfirm", { name: confirmDelete.name }) : void 0,
|
|
5992
|
+
confirmLabel: t("backupFiles.delete"),
|
|
5993
|
+
cancelLabel: t("common.cancel"),
|
|
5994
|
+
danger: true,
|
|
5995
|
+
busy: deleting,
|
|
5996
|
+
onConfirm: doDelete,
|
|
5997
|
+
onCancel: () => {
|
|
5998
|
+
setConfirmDelete(null);
|
|
5999
|
+
}
|
|
6000
|
+
})
|
|
6001
|
+
]
|
|
6002
|
+
});
|
|
6003
|
+
}
|
|
5774
6004
|
//#endregion
|
|
5775
6005
|
//#region src/client/sync/sync-api.ts
|
|
5776
6006
|
/** 同步端点常量(与 Host 半 src/index.ts API 常量保持一致) */
|
|
@@ -11213,6 +11443,18 @@ const zh$2 = {
|
|
|
11213
11443
|
"backupSchedule.status.failed": "失败",
|
|
11214
11444
|
"backupSchedule.loading": "加载定时备份设置…",
|
|
11215
11445
|
"backupSchedule.error": "定时备份设置加载失败",
|
|
11446
|
+
"backupFiles.title": "备份文件",
|
|
11447
|
+
"backupFiles.hint": "导出产物(手动导出与定时备份)统一在此管理:可下载到本机、直接导入恢复,或删除。定时备份自动保留最近 10 个。",
|
|
11448
|
+
"backupFiles.empty": "暂无备份文件。手动导出或启用定时备份后此处会列出。",
|
|
11449
|
+
"backupFiles.loading": "加载备份文件…",
|
|
11450
|
+
"backupFiles.error": "备份文件加载失败",
|
|
11451
|
+
"backupFiles.source.auto": "定时备份",
|
|
11452
|
+
"backupFiles.source.manual": "手动导出",
|
|
11453
|
+
"backupFiles.download": "下载",
|
|
11454
|
+
"backupFiles.import": "导入",
|
|
11455
|
+
"backupFiles.delete": "删除",
|
|
11456
|
+
"backupFiles.deleteConfirmTitle": "删除备份文件",
|
|
11457
|
+
"backupFiles.deleteConfirm": "确认删除备份文件「{name}」?此操作不可恢复。",
|
|
11216
11458
|
"report.export.title": "导出完成",
|
|
11217
11459
|
"report.import.title": "导入结果",
|
|
11218
11460
|
"report.rollback.title": "回滚报告",
|
|
@@ -11384,6 +11626,18 @@ const en$2 = {
|
|
|
11384
11626
|
"backupSchedule.status.failed": "Failed",
|
|
11385
11627
|
"backupSchedule.loading": "Loading scheduled backup settings…",
|
|
11386
11628
|
"backupSchedule.error": "Failed to load scheduled backup settings",
|
|
11629
|
+
"backupFiles.title": "Backup Files",
|
|
11630
|
+
"backupFiles.hint": "All export artifacts (manual exports and scheduled backups) are managed here: download to your machine, import to restore, or delete. Scheduled backups auto-keep the latest 10.",
|
|
11631
|
+
"backupFiles.empty": "No backup files yet. They appear here after a manual export or once scheduled backups are enabled.",
|
|
11632
|
+
"backupFiles.loading": "Loading backup files…",
|
|
11633
|
+
"backupFiles.error": "Failed to load backup files",
|
|
11634
|
+
"backupFiles.source.auto": "Scheduled",
|
|
11635
|
+
"backupFiles.source.manual": "Manual",
|
|
11636
|
+
"backupFiles.download": "Download",
|
|
11637
|
+
"backupFiles.import": "Import",
|
|
11638
|
+
"backupFiles.delete": "Delete",
|
|
11639
|
+
"backupFiles.deleteConfirmTitle": "Delete backup file",
|
|
11640
|
+
"backupFiles.deleteConfirm": "Delete backup file \"{name}\"? This cannot be undone.",
|
|
11387
11641
|
"report.export.title": "Export Complete",
|
|
11388
11642
|
"report.import.title": "Import Result",
|
|
11389
11643
|
"report.rollback.title": "Rollback Report",
|