Introduce a per-fleet Overview area inside the apps shell, reachable from a new 'Overview' entry pinned above the apps sidebar search. Selecting it renders a top-tabbed view in the main pane — Overview · Updates · Improvements · Backups — mirroring the per-app tabbed layout, with the apps sidebar persistent. - TabController: generic root-scoped show/hide tab host (core/ui-state). - OverviewManager: drives the 4 tabs. Reuses a headless UpdaterPage for all update/CVE/improvement data + rendering (its renderX() are pure HTML producers) and reads backup/dashboard.json directly for backup health. - Overview tab: combined update + backup health cards. - Updates tab: per-app expander table (CVEs/recovery/history inline via the new UpdaterPage.renderAppDetail) + All/Updates/Security filter chips. - Improvements tab: reuses the updater's signed-hotfix renderer. - Backups tab: fleet backup-health tiles; actions deep-link per app. - Additive only: /overview* routes on the apps feature; old /updater and /backup pages untouched. Cleanup (redirects, nav, Admin config move) is next. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
100 lines
2.4 KiB
JSON
100 lines
2.4 KiB
JSON
{
|
|
"version": 1,
|
|
"note": "Hand-committed page manifest — the authoritative source of pages (feature-registry tries /api/features/list first, then falls back here; that live scan endpoint is deferred — see docs/architecture/webui-architecture.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
|
|
},
|
|
"order": 10
|
|
},
|
|
{
|
|
"id": "apps",
|
|
"routes": [
|
|
"/apps",
|
|
"/apps*",
|
|
"/app",
|
|
"/app*",
|
|
"/overview",
|
|
"/overview*"
|
|
],
|
|
"module": "/components/apps/index.js",
|
|
"handler": "handleApps",
|
|
"navId": "nav-app-center",
|
|
"nav": {
|
|
"label": "App Center",
|
|
"order": 20
|
|
},
|
|
"order": 20
|
|
},
|
|
{
|
|
"id": "admin",
|
|
"routes": [
|
|
"/admin",
|
|
"/admin*"
|
|
],
|
|
"module": "/components/admin/index.js",
|
|
"handler": "handleAdmin",
|
|
"navId": "nav-config",
|
|
"nav": {
|
|
"label": "Admin",
|
|
"order": 40
|
|
},
|
|
"order": 40
|
|
},
|
|
{
|
|
"id": "tasks",
|
|
"routes": [
|
|
"/tasks",
|
|
"/tasks*"
|
|
],
|
|
"module": "/components/tasks/index.js",
|
|
"handler": "handleTasks",
|
|
"navId": "nav-tasks",
|
|
"nav": {
|
|
"label": "Tasks",
|
|
"order": 60
|
|
},
|
|
"order": 60
|
|
},
|
|
{
|
|
"id": "updater",
|
|
"routes": [
|
|
"/updater",
|
|
"/updater*"
|
|
],
|
|
"module": "/components/updater/index.js",
|
|
"navId": "nav-updater",
|
|
"nav": {
|
|
"label": "Updates",
|
|
"order": 30
|
|
},
|
|
"order": 30
|
|
},
|
|
{
|
|
"id": "backup",
|
|
"routes": [
|
|
"/backup",
|
|
"/backup*"
|
|
],
|
|
"module": "/components/backup/index.js",
|
|
"handler": "handleBackup",
|
|
"navId": "nav-backup",
|
|
"nav": {
|
|
"label": "Backups",
|
|
"order": 50
|
|
},
|
|
"order": 50
|
|
}
|
|
]
|
|
}
|