diff --git a/containers/libreportal/frontend/components/admin/config/js/config-manager.js b/containers/libreportal/frontend/components/admin/config/js/config-manager.js index 1f9c683..ba04ad4 100755 --- a/containers/libreportal/frontend/components/admin/config/js/config-manager.js +++ b/containers/libreportal/frontend/components/admin/config/js/config-manager.js @@ -42,14 +42,14 @@ if (typeof window.ConfigManager === 'undefined') { // Overview is the Admin landing — an ops/health board, not a config form. if (category === 'overview') { try { this.sidebar.populateSidebar(); } catch (e) {} - // charts.js is the chart-rendering helper admin-overview pulls in. + // charts.js is the chart-rendering helper overview-page pulls in. await Promise.all([ - lazyLoad('/components/admin/overview/js/admin-overview.js'), + lazyLoad('/components/admin/overview/js/overview-page.js'), lazyLoad('/components/admin/system/js/charts.js') ]); - if (typeof AdminOverview !== 'undefined') { - window.adminOverview = new AdminOverview('config-section'); - await window.adminOverview.init(); + if (typeof OverviewPage !== 'undefined') { + window.overviewPage = new OverviewPage('config-section'); + await window.overviewPage.init(); } else { configSection.innerHTML = '
Admin overview failed to load.
'; } @@ -101,13 +101,13 @@ if (typeof window.ConfigManager === 'undefined') { try { this.sidebar.populateSidebar(); } catch (e) {} await Promise.all([ lazyLoad('/components/admin/system/js/charts.js'), - lazyLoad('/components/admin/system/js/admin-system.js'), + lazyLoad('/components/admin/system/js/system-page.js'), lazyLoad('/components/admin/system/js/system-metric-page.js'), lazyLoad('/components/admin/system/js/system-storage-page.js') ]); - if (typeof AdminSystem !== 'undefined') { - window.adminSystem = new AdminSystem('config-section'); - await window.adminSystem.init(); + if (typeof SystemPage !== 'undefined') { + window.systemPage = new SystemPage('config-section'); + await window.systemPage.init(); } else { configSection.innerHTML = '
System page failed to load.
'; } diff --git a/containers/libreportal/frontend/components/admin/index.js b/containers/libreportal/frontend/components/admin/index.js index 5ac9c03..af103ce 100644 --- a/containers/libreportal/frontend/components/admin/index.js +++ b/containers/libreportal/frontend/components/admin/index.js @@ -33,10 +33,10 @@ LP.features.register({ async unmount(ctx) { // Release only this view's leaks; never destroy the configManager singleton. // The sub-controllers renderConfig() spawns are re-created on each visit, so - // null them; AdminSystem additionally holds a live SSE sub + a 30s interval + // null them; SystemPage additionally holds a live SSE sub + a 30s interval // we can stop cleanly. try { - const as = window.adminSystem; + const as = window.systemPage; if (as) { if (typeof as._stopLive === 'function') as._stopLive(); if (as._timer) { clearInterval(as._timer); as._timer = null; } @@ -46,11 +46,11 @@ LP.features.register({ as._subview = null; } } catch (_) {} - // Drop AdminOverview's task-refresh registration so a finished verify/update + // Drop OverviewPage's task-refresh registration so a finished verify/update // task doesn't repaint a torn-down board. - try { ctx.services.tasks.refresh && ctx.services.tasks.refresh.unregister('admin-overview'); } catch (_) {} - window.adminOverview = null; - window.adminSystem = null; + try { ctx.services.tasks.refresh && ctx.services.tasks.refresh.unregister('overview-page'); } catch (_) {} + window.overviewPage = null; + window.systemPage = null; window.sshPage = null; window.peersPage = null; // configManager (+ its inner managers) intentionally left intact. diff --git a/containers/libreportal/frontend/components/admin/overview/js/admin-overview.js b/containers/libreportal/frontend/components/admin/overview/js/overview-page.js similarity index 99% rename from containers/libreportal/frontend/components/admin/overview/js/admin-overview.js rename to containers/libreportal/frontend/components/admin/overview/js/overview-page.js index 10722b5..ada47ee 100644 --- a/containers/libreportal/frontend/components/admin/overview/js/admin-overview.js +++ b/containers/libreportal/frontend/components/admin/overview/js/overview-page.js @@ -2,7 +2,7 @@ // from the user Dashboard, which is app-centric): it summarises updates, // backups, SSH/security and system health from data we already generate, and // each card links to where you act on it. Renders into #config-section. -class AdminOverview { +class OverviewPage { constructor(rootId = 'config-section') { this.rootId = rootId; this.taskManager = (typeof TaskManager !== 'undefined') ? new TaskManager() : null; @@ -57,7 +57,7 @@ class AdminOverview { // and re-render so the badge reflects reality without a manual reload. // Registered with the task-refresh coordinator (single source of truth). window.taskRefresh?.register({ - id: 'admin-overview', + id: 'overview-page', match: (d) => ['verify', 'update', 'system_update'].includes(d.action) || /^libreportal (verify|update)\b/.test((d.task && d.task.command) || d.command || ''), run: () => this.refreshVerify(), @@ -274,4 +274,4 @@ class AdminOverview { } } -window.AdminOverview = AdminOverview; +window.OverviewPage = OverviewPage; diff --git a/containers/libreportal/frontend/components/admin/system/js/system-metric-page.js b/containers/libreportal/frontend/components/admin/system/js/system-metric-page.js index 4908749..75f2d1b 100644 --- a/containers/libreportal/frontend/components/admin/system/js/system-metric-page.js +++ b/containers/libreportal/frontend/components/admin/system/js/system-metric-page.js @@ -122,7 +122,7 @@ class SystemMetricPage { // Metric registry — keys map to label, unit, formatter, accent. Mirrors // the same list the index view exposes; lives here so the metric page - // can mount cleanly without AdminSystem present (direct URL load). + // can mount cleanly without SystemPage present (direct URL load). _metricDef(key) { const fmt = window.SystemFmt || { bytes: (n) => `${n}`, rate: (n) => `${n}/s`, rgbVar: () => '0, 212, 255' }; const pct = (v) => `${(v ?? 0).toFixed(1)}%`; diff --git a/containers/libreportal/frontend/components/admin/system/js/admin-system.js b/containers/libreportal/frontend/components/admin/system/js/system-page.js similarity index 98% rename from containers/libreportal/frontend/components/admin/system/js/admin-system.js rename to containers/libreportal/frontend/components/admin/system/js/system-page.js index a1ac16a..c17d200 100644 --- a/containers/libreportal/frontend/components/admin/system/js/admin-system.js +++ b/containers/libreportal/frontend/components/admin/system/js/system-page.js @@ -1,6 +1,6 @@ // Admin → System — orchestrator + index view. // -// One AdminSystem instance per page mount. Reads the URL path on init and +// One SystemPage instance per page mount. Reads the URL path on init and // dispatches to one of four sub-views: // // /admin/system → index (gauges + trends + per-app table) @@ -12,14 +12,14 @@ // each own their own DOM + lifecycle inside #config-section. We mount one // at a time; switching means tearing down the active renderer and starting // a fresh one. The SPA re-runs handleAdmin() on every navigation, which -// re-runs ConfigManager.renderConfig('system') → AdminSystem.init, so the +// re-runs ConfigManager.renderConfig('system') → SystemPage.init, so the // dispatch happens organically with the router. // // Live (1 Hz, via LiveSystem SSE) data flows directly to whichever sub-view // is mounted. The index view ticks gauges in place; the metric page splices // the live value into its chart's tail. -class AdminSystem { +class SystemPage { constructor(rootId = 'config-section') { this.rootId = rootId; this.range = 60; // minutes of history to chart @@ -134,7 +134,7 @@ class AdminSystem { return; } // Expand a metric → navigate to its detail page. The SPA picks up - // the new URL, ConfigManager re-renders, AdminSystem.init mounts + // the new URL, ConfigManager re-renders, SystemPage.init mounts // the metric page. const ex = e.target.closest('[data-sys-expand]'); if (ex) { @@ -440,7 +440,7 @@ class AdminSystem { // Lightweight formatter helpers shared with sub-pages so they don't each // reimplement bytes()/rate(). Attached as a global so a sub-page that mounts -// before AdminSystem still has them. +// before SystemPage still has them. window.SystemFmt = window.SystemFmt || { escape(s) { return String(s ?? '').replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c])); }, bytes(n) { @@ -468,4 +468,4 @@ window.SystemFmt = window.SystemFmt || { }, }; -window.AdminSystem = AdminSystem; +window.SystemPage = SystemPage; diff --git a/containers/libreportal/frontend/components/tasks/js/tasks-logs-modal.js b/containers/libreportal/frontend/components/tasks/js/tasks-log-modal.js similarity index 100% rename from containers/libreportal/frontend/components/tasks/js/tasks-logs-modal.js rename to containers/libreportal/frontend/components/tasks/js/tasks-log-modal.js diff --git a/containers/libreportal/frontend/core/boot/js/system-loader.js b/containers/libreportal/frontend/core/boot/js/system-loader.js index bb740b6..b3f18f6 100755 --- a/containers/libreportal/frontend/core/boot/js/system-loader.js +++ b/containers/libreportal/frontend/core/boot/js/system-loader.js @@ -177,7 +177,7 @@ class SystemLoader { '/components/tasks/js/tasks-row-expand.js', '/components/tasks/js/tasks-actions.js', '/components/tasks/js/tasks-modals.js', - '/components/tasks/js/tasks-logs-modal.js' + '/components/tasks/js/tasks-log-modal.js' ] }); diff --git a/containers/libreportal/frontend/core/kernel/js/services.js b/containers/libreportal/frontend/core/kernel/js/services.js index 8a6eef2..ef5fd87 100644 --- a/containers/libreportal/frontend/core/kernel/js/services.js +++ b/containers/libreportal/frontend/core/kernel/js/services.js @@ -9,7 +9,7 @@ // feature's module top level, so the lazy getters always resolve. // // NOTE: page-owned controllers (appsManager, appTabbedManager, configManager, -// backupPage, adminSystem, …) are NOT services — they belong to their feature — +// backupPage, systemPage, …) are NOT services — they belong to their feature — // so they are deliberately absent here. Slot names + globals were verified // against the real code (the design doc's §4 list had several wrong names). (function () {