From 95ebc7778df18e4dc7b5eab3dbb5fd0f8bd76914 Mon Sep 17 00:00:00 2001 From: tracer Date: Tue, 10 Feb 2026 19:52:24 +0100 Subject: [PATCH] Update ACP system navigation --- CHANGELOG.md | 4 + resources/js/pages/Acp.jsx | 579 ++++++++++++++++++++++--------------- 2 files changed, 343 insertions(+), 240 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd45bf6..3ec16a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 2026-02-10 +- Reshaped ACP System tab with left navigation and dedicated views (Overview, Live Update, CLI, CI/CD). +- Moved system requirements table into the CI/CD view with refresh controls. + ## 2026-02-08 - Achieved 100% test coverage across the backend. - Added comprehensive Feature and Unit tests for controllers, models, services, and console commands. diff --git a/resources/js/pages/Acp.jsx b/resources/js/pages/Acp.jsx index 44af204..eec859a 100644 --- a/resources/js/pages/Acp.jsx +++ b/resources/js/pages/Acp.jsx @@ -96,6 +96,7 @@ function Acp({ isAdmin }) { const [systemStatus, setSystemStatus] = useState(null) const [systemLoading, setSystemLoading] = useState(false) const [systemError, setSystemError] = useState('') + const [systemSection, setSystemSection] = useState('info') const [usersPage, setUsersPage] = useState(1) const [usersPerPage, setUsersPerPage] = useState(10) const [userSort, setUserSort] = useState({ columnId: 'name', direction: 'asc' }) @@ -3507,254 +3508,352 @@ function Acp({ isAdmin }) { {systemError &&

{systemError}

} {systemLoading &&

{t('acp.loading')}

} - {!systemLoading && systemStatus && ( -
-
-
-
{t('system.requirements')}
- + {!systemLoading && ( + + +
+
+
{t('acp.system')}
+
+ + + + +
+
-
-
- - - - - - - - - - - - - - - - - - - + {systemSection === 'info' && ( +
+
+
System overview
+
+
+

+ Placeholder: summary, upgrade guidance, and environment health notes will + live here. +

+
+
+ )} + {systemSection === 'insite' && ( +
+
+
Live Update
+
+
+

+ Placeholder: run a live update from inside the forum, with safety checks + and status details. +

+
+
+ )} + {systemSection === 'cli' && ( +
+
+
CLI
+
+
+

+ Placeholder: CLI upgrade commands and automation helpers will live here. +

+
+
+ )} + {systemSection === 'ci' && ( +
+
+
+
{t('system.requirements')}
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{t('system.check')}{t('system.path')}{t('system.min_version')}{t('system.current_version')}{t('system.status')}{t('system.recheck')}
PHP{systemStatus.php_selected_path || '—'} - {systemStatus.min_versions?.php || '—'} - - {systemStatus.php_selected_version || '—'} - - - + +
Composer - {systemStatus.composer || t('system.not_found')} - - {systemStatus.min_versions?.composer || '—'} - - {systemStatus.composer_version || '—'} - - - - -
Node - {systemStatus.node || t('system.not_found')} - - {systemStatus.min_versions?.node || '—'} - - {systemStatus.node_version || '—'} - - - - -
npm - {systemStatus.npm || t('system.not_found')} - - {systemStatus.min_versions?.npm || '—'} - - {systemStatus.npm_version || '—'} - - - - -
tar - {systemStatus.tar || t('system.not_found')} - - {systemStatus.tar_version || '—'} - - - - -
rsync - {systemStatus.rsync || t('system.not_found')} - - {systemStatus.rsync_version || '—'} - - - - -
proc_* functions - {systemStatus.proc_functions - ? Object.entries(systemStatus.proc_functions) - .filter(([, ok]) => !ok) - .map(([name]) => name) - .join(', ') - : '—'} - - - - -
{t('system.storage_writable')}storage/ - - - -
{t('system.updates_writable')}storage/app/updates - - - -
-
-
+
+ +
+ {!systemStatus && ( +

+ {t('system.not_found')} +

+ )} + {systemStatus && ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{t('system.check')}{t('system.path')}{t('system.min_version')}{t('system.current_version')}{t('system.status')}{t('system.recheck')}
PHP + {systemStatus.php_selected_path || '—'} + + {systemStatus.min_versions?.php || '—'} + + {systemStatus.php_selected_version || '—'} + + + + +
Composer + {systemStatus.composer || t('system.not_found')} + + {systemStatus.min_versions?.composer || '—'} + + {systemStatus.composer_version || '—'} + + + + +
Node + {systemStatus.node || t('system.not_found')} + + {systemStatus.min_versions?.node || '—'} + + {systemStatus.node_version || '—'} + + + + +
npm + {systemStatus.npm || t('system.not_found')} + + {systemStatus.min_versions?.npm || '—'} + + {systemStatus.npm_version || '—'} + + + + +
tar + {systemStatus.tar || t('system.not_found')} + + {systemStatus.tar_version || '—'} + + + + +
rsync + {systemStatus.rsync || t('system.not_found')} + + {systemStatus.rsync_version || '—'} + + + + +
proc_* functions + {systemStatus.proc_functions + ? Object.entries(systemStatus.proc_functions) + .filter(([, ok]) => !ok) + .map(([name]) => name) + .join(', ') + : '—'} + + + + +
{t('system.storage_writable')}storage/ + + + +
{t('system.updates_writable')}storage/app/updates + + + +
+ )} +
+ + )} + + )}