librelad fe5cc18827 refactor(webui): give every core/ subsystem the js/css/html convention
Brings core/ in line with components/ — each subsystem now sorts its files into
js/ css/ html/ subfolders (and the nested auth/ + controls/ groups keep theirs):

  core/topbar/{js/{topbar,mobile-menu}.js, css/{topbar,sidebar}.css, html/topbar.html}
  core/theme/{js/theme-registry.js, css/{tokens,themes,base,aurora-background}.css}
  core/forms/{css/{forms,config}.css, controls/js/{custom-number,custom-select}.js}
  core/boot/{js/{system-loader,system-orchestrator}.js, auth/{js/auth-manager.js,css/login.css}}
  core/{config,tasks,kernel}/js/…  core/overlays/{js,css}/…  core/setup/{js,css}/…
  core/{app-meta,backup-card,data-loader,dom,live,notifications,ui-mode,ui-state}/js/…
  core/{loading,update-notifier}/{js,css}/…

50 files relocated (pure git mv). All path literals rewritten from a generated
old→new map across index.html, system-loader.js bundles, topbar.js's internal
fetch (/core/topbar/html/topbar.html), and the three backup-app-card loaders. No
OLD path contained a js/css/html segment, so no double-prefixing was possible.
core/icons/ left as-is (shared asset tree). All 50 /core asset refs verified to
resolve; full node --check sweep clean.

Signed-off-by: librelad <librelad@digitalangels.vip>
2026-05-31 00:00:52 +01:00

58 lines
2.9 KiB
JavaScript

// features/backup/index.js — Backup Center as a self-contained feature module.
//
// FIRST page migrated to the feature-module contract (docs/frontend-modularization.md).
// The kernel drives mount()/unmount() for the /backup route instead of
// spa.js's handleBackup(). The heavy controller (backup-page.js, ~129KB) is
// still lazy-loaded on first mount, so cold-load cost is unchanged.
//
// Snap-out demo: deleting this folder removes the backup route's module
// registration; the manifest entry then falls back to the legacy handler
// (and, once handleBackup is retired, to the kernel's not-found route). The
// full decomposition of backup-page.js into per-tab modules is Phase 5.
LP.features.register({
id: 'backup',
routes: ['/backup', '/backup*'],
// Controllers the feature needs; lazy-loaded on first mount (idempotent).
// Controllers, organised by sub-system (tabs). core/ first: schema + base
// class + the shared data/cron, then each tab's prototype-augment clusters.
scripts: [
'/components/backup/core/js/backup-schema.js',
'/components/backup/core/js/backup-page.js', // base: class + constructor + init/switchTab/render
'/components/backup/core/js/backup-fetch-client.js',
'/components/backup/core/js/backup-cron-schedule.js',
'/components/backup/dashboard/js/backup-dashboard.js',
'/components/backup/snapshots/js/backup-snapshots.js',
'/components/backup/snapshots/js/backup-snapshot-actions.js',
'/components/backup/locations/js/backup-locations.js',
'/components/backup/locations/js/backup-location-fields.js',
'/components/backup/locations/js/backup-location-modal.js',
'/components/backup/locations/js/backup-ssh-key.js',
'/components/backup/migrate/js/backup-migrate.js',
'/components/backup/configuration/js/backup-configuration.js',
'/components/backup/configuration/js/backup-retention-presets.js',
'/components/backup/configuration/js/backup-engine-details.js',
'/core/backup-card/js/backup-app-card.js',
],
async mount(ctx) {
await ctx.loadScripts(this.scripts);
const html = await ctx.loadFragment('/components/backup/core/html/backup-content.html');
ctx.setContent(html, 'Backups');
if (typeof BackupPage === 'undefined') {
throw new Error('BackupPage controller failed to load');
}
window.backupPage = new BackupPage();
await window.backupPage.init();
},
async unmount(ctx) {
// Best-effort teardown. BackupPage self-guards stale work via
// (window.backupPage === this), so nulling the global neutralises any
// pending task-refresh repaint; we also drop its coordinator registration.
// A proper dispose() (removing the leaked document listeners) lands with
// the Phase 5 backup decomposition.
try { ctx.services.tasks.refresh && ctx.services.tasks.refresh.unregister('backups'); } catch (_) {}
window.backupPage = null;
},
});