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.
+
+ Logs aktualisieren
+
`;
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';