Final modularization layout (user-chosen): every page is a self-contained folder under components/<id>/ (controllers + CSS + its html fragment), and all shared/framework code folds into core/: core/kernel (feature-registry, lifecycle, services, spa) core/boot (auth, system-loader/orchestrator, setup, loaders) core/lib (data-loader, router, helpers, the task kernel, shared modules) core/ui (topbar, modal, notifications, … + topbar.html) core/css (all shared stylesheets) core/icons Top level is now just: components/, core/, themes/, index.html (+ runtime data/). Every path reference rewritten (index.html, scripts arrays, fetch()/ loadFragment()/loadScript() literals, system-loader + config-manager controller paths, kernel manifest URL, feature.json, backend FEATURES_DIR). The /api/features/list endpoint NAME is unchanged (it now scans components/). Deleted 3 dead files (app-content.html, apps-content.html, html-cache.js). Verified: 0 stale prefixes, 0 double-rewrites, all JS/JSON valid. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: librelad <librelad@digitalangels.vip>
79 lines
2.4 KiB
JSON
79 lines
2.4 KiB
JSON
{
|
|
"version": 1,
|
|
"note": "Phase-0 hand-committed manifest (to be replaced by the generated /data/webui/generated/features.json once the scan generator lands — see docs/frontend-modularization.md). 'module' is the feature's self-registering index.js; the kernel loads these from here so they no longer need <script> tags in index.html. 'handler' names the LibrePortalSPAClean method kept as the fallback during the strangler migration; 'navId' is the topbar element id for active-state highlighting.",
|
|
"features": [
|
|
{
|
|
"id": "dashboard",
|
|
"routes": ["/", "/dashboard"],
|
|
"module": "/components/dashboard/index.js",
|
|
"handler": "handleDashboard",
|
|
"navId": "nav-dashboard",
|
|
"nav": { "label": "Dashboard", "order": 10 }
|
|
},
|
|
{
|
|
"id": "apps",
|
|
"routes": ["/apps", "/apps*"],
|
|
"module": "/components/apps/index.js",
|
|
"handler": "handleApps",
|
|
"navId": "nav-app-center",
|
|
"nav": { "label": "App Center", "order": 20 }
|
|
},
|
|
{
|
|
"id": "app-detail",
|
|
"routes": ["/app", "/app*"],
|
|
"module": "/components/app-detail/index.js",
|
|
"handler": "handleAppDetail",
|
|
"navId": "nav-app-center"
|
|
},
|
|
{
|
|
"id": "admin",
|
|
"routes": ["/admin", "/admin*"],
|
|
"module": "/components/admin/index.js",
|
|
"handler": "handleAdmin",
|
|
"navId": "nav-config",
|
|
"nav": { "label": "Admin", "order": 40 }
|
|
},
|
|
{
|
|
"id": "config-redirect",
|
|
"routes": ["/config", "/config*"],
|
|
"handler": "handleConfigRedirect",
|
|
"navId": "nav-config"
|
|
},
|
|
{
|
|
"id": "tasks",
|
|
"routes": ["/tasks", "/tasks*"],
|
|
"module": "/components/tasks/index.js",
|
|
"handler": "handleTasks",
|
|
"navId": "nav-tasks",
|
|
"nav": { "label": "Tasks", "order": 60 }
|
|
},
|
|
{
|
|
"id": "updater",
|
|
"routes": ["/updater", "/updater*"],
|
|
"module": "/components/updater/index.js",
|
|
"navId": "nav-updater",
|
|
"nav": { "label": "Updates", "order": 30 }
|
|
},
|
|
{
|
|
"id": "backup",
|
|
"routes": ["/backup", "/backup*"],
|
|
"module": "/components/backup/index.js",
|
|
"handler": "handleBackup",
|
|
"navId": "nav-backup",
|
|
"nav": { "label": "Backups", "order": 50 }
|
|
},
|
|
{
|
|
"id": "peers",
|
|
"routes": ["/peers", "/peers*"],
|
|
"handler": "handlePeers",
|
|
"navId": "nav-config"
|
|
},
|
|
{
|
|
"id": "ssh",
|
|
"routes": ["/ssh", "/ssh*"],
|
|
"handler": "handleSsh",
|
|
"navId": "nav-config"
|
|
}
|
|
]
|
|
}
|