app-detail was a separate sibling component but is really the apps feature's detail view (shares the apps controllers + apps-unified-layout). Merge it in: the apps feature now owns /apps*, /app, /app* and its mount() dispatches grid vs detail by path (checks /apps first for wildcard precedence). Removed the components/app-detail/ folder + its manifest entry. (The 1-level feature scan means a feature must be a direct components/<id>/ child — folding the routes into apps is the correct way to express the relationship.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: librelad <librelad@digitalangels.vip>
119 lines
2.6 KiB
JSON
119 lines
2.6 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*",
|
|
"/app",
|
|
"/app*"
|
|
],
|
|
"module": "/components/apps/index.js",
|
|
"handler": "handleApps",
|
|
"navId": "nav-app-center",
|
|
"nav": {
|
|
"label": "App Center",
|
|
"order": 20
|
|
}
|
|
},
|
|
{
|
|
"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"
|
|
}
|
|
]
|
|
}
|