diff --git a/config/current.ver b/config/current.ver index f37ae4a..b830554 100644 --- a/config/current.ver +++ b/config/current.ver @@ -1 +1 @@ -1.2.19 \ No newline at end of file +1.2.20 \ No newline at end of file diff --git a/debug/current.ver b/debug/current.ver deleted file mode 100644 index 62b1047..0000000 --- a/debug/current.ver +++ /dev/null @@ -1 +0,0 @@ -1.2.1sss \ No newline at end of file diff --git a/public/assets/js/ui-user.js b/public/assets/js/ui-user.js index e9b15fa..354b942 100644 --- a/public/assets/js/ui-user.js +++ b/public/assets/js/ui-user.js @@ -42,6 +42,8 @@ let debugPhpLoaded = false; let debugPhpLoading = false; let debugLogsLoaded = false; let debugActiveTab = 'php'; +let debugLogsRefreshTimer = null; +let debugSelectedLogName = ''; let phpInfoContainer; let consoleContainer; let logsListContainer; @@ -949,6 +951,9 @@ function ensureDebugDialog() {
Keine Logs geladen.
Bitte Log auswaehlen.
+
+ +
`; document.body.appendChild(debugDialog); @@ -956,6 +961,7 @@ function ensureDebugDialog() { consoleContainer = debugDialog.querySelector('#debugConsoleContent'); logsListContainer = debugDialog.querySelector('#debugLogsList'); logDetailContainer = debugDialog.querySelector('#debugLogDetail'); + debugDialog.querySelector('#debugLogsRefresh')?.addEventListener('click', () => loadDebugLogs(true)); debugDialog.querySelector('[data-debug-close]')?.addEventListener('click', () => closeDebugDialog()); debugDialog.addEventListener('close', () => setDebugTab('php')); debugDialog.querySelectorAll('[data-debug-tab]').forEach(btn => { @@ -975,6 +981,10 @@ function openDebugDialog(tab = 'php') { } function closeDebugDialog() { + if (debugLogsRefreshTimer) { + clearInterval(debugLogsRefreshTimer); + debugLogsRefreshTimer = null; + } if (debugDialog?.open) debugDialog.close(); } @@ -993,7 +1003,19 @@ function setDebugTab(tab) { } else if (debugActiveTab === 'console') { renderConsolePanel(); } else if (debugActiveTab === 'logs') { - loadDebugLogs(); + loadDebugLogs(true); + if (!debugLogsRefreshTimer) { + debugLogsRefreshTimer = setInterval(() => { + if (debugDialog?.open && debugActiveTab === 'logs') { + loadDebugLogs(true); + } + }, 5000); + } + } else { + if (debugLogsRefreshTimer) { + clearInterval(debugLogsRefreshTimer); + debugLogsRefreshTimer = null; + } } } @@ -1033,10 +1055,12 @@ function renderConsolePanel() { consoleContainer.innerHTML = lines.join(''); } -async function loadDebugLogs() { - if (debugLogsLoaded || !logsListContainer || !logDetailContainer) return; +async function loadDebugLogs(force = false) { + if ((!force && debugLogsLoaded) || !logsListContainer || !logDetailContainer) return; logsListContainer.textContent = 'Lade Logs…'; - logDetailContainer.textContent = 'Bitte Log auswaehlen.'; + if (!debugSelectedLogName) { + logDetailContainer.textContent = 'Bitte Log auswaehlen.'; + } try { const res = await apiAction('debug.logs.list', { method: 'GET' }); if (!res?.ok) throw new Error(res?.error || 'Logs konnten nicht geladen werden'); @@ -1047,17 +1071,31 @@ async function loadDebugLogs() { } logsListContainer.innerHTML = ''; items.forEach((item, idx) => { + const name = item.name || item.file || `Log ${idx + 1}`; const btn = document.createElement('button'); btn.type = 'button'; - btn.textContent = item.name || item.file || `Log ${idx + 1}`; + btn.textContent = name; btn.addEventListener('click', () => { logsListContainer.querySelectorAll('button').forEach(b => b.classList.remove('active')); btn.classList.add('active'); - loadDebugLogFile(item.name || item.file || ''); + debugSelectedLogName = name; + loadDebugLogFile(name); }); logsListContainer.appendChild(btn); - if (idx === 0) btn.click(); + if (debugSelectedLogName && debugSelectedLogName === name) { + btn.classList.add('active'); + } }); + if (!debugSelectedLogName) { + const first = logsListContainer.querySelector('button'); + if (first) first.click(); + } else { + const active = logsListContainer.querySelector('button.active'); + if (!active) { + const first = logsListContainer.querySelector('button'); + if (first) first.click(); + } + } debugLogsLoaded = true; } catch (err) { logsListContainer.textContent = err.message || 'Logs konnten nicht geladen werden'; diff --git a/public/index.php b/public/index.php index 59e058e..08a9f17 100644 --- a/public/index.php +++ b/public/index.php @@ -17,8 +17,12 @@ if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $clientIp = (string)($_SERVER['REMOTE_ADDR'] ?? ''); } $clientIp = trim($clientIp); -$accessLine = date(DATE_ATOM) . ' | ' . ($clientIp !== '' ? $clientIp : 'unknown') . "\n"; -@file_put_contents($debugDir . '/last_access.log', $accessLine); +$version = $GLOBALS['app_version'] ?? ''; +$versionLabel = $version ? (' | v' . $version) : ''; +$accessLine = date(DATE_ATOM) . ' | ' . ($clientIp !== '' ? $clientIp : 'unknown') . $versionLabel . "\n"; +$logFile = $debugDir . '/last_access.log'; +$existing = is_file($logFile) ? (string)@file_get_contents($logFile) : ''; +@file_put_contents($logFile, $accessLine . $existing); $pageTitle = 'Email Template System – Admin'; $pageId = 'home';