|
|
|
@@ -42,6 +42,8 @@ let debugPhpLoaded = false;
|
|
|
|
let debugPhpLoading = false;
|
|
|
|
let debugPhpLoading = false;
|
|
|
|
let debugLogsLoaded = false;
|
|
|
|
let debugLogsLoaded = false;
|
|
|
|
let debugActiveTab = 'php';
|
|
|
|
let debugActiveTab = 'php';
|
|
|
|
|
|
|
|
let debugLogsRefreshTimer = null;
|
|
|
|
|
|
|
|
let debugSelectedLogName = '';
|
|
|
|
let phpInfoContainer;
|
|
|
|
let phpInfoContainer;
|
|
|
|
let consoleContainer;
|
|
|
|
let consoleContainer;
|
|
|
|
let logsListContainer;
|
|
|
|
let logsListContainer;
|
|
|
|
@@ -949,6 +951,9 @@ function ensureDebugDialog() {
|
|
|
|
<div class="debug-logs-list" id="debugLogsList">Keine Logs geladen.</div>
|
|
|
|
<div class="debug-logs-list" id="debugLogsList">Keine Logs geladen.</div>
|
|
|
|
<div class="debug-logs-detail" id="debugLogDetail">Bitte Log auswaehlen.</div>
|
|
|
|
<div class="debug-logs-detail" id="debugLogDetail">Bitte Log auswaehlen.</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="mt-3 flex justify-end">
|
|
|
|
|
|
|
|
<button type="button" class="btn" id="debugLogsRefresh">Logs aktualisieren</button>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>`;
|
|
|
|
</div>`;
|
|
|
|
document.body.appendChild(debugDialog);
|
|
|
|
document.body.appendChild(debugDialog);
|
|
|
|
@@ -956,6 +961,7 @@ function ensureDebugDialog() {
|
|
|
|
consoleContainer = debugDialog.querySelector('#debugConsoleContent');
|
|
|
|
consoleContainer = debugDialog.querySelector('#debugConsoleContent');
|
|
|
|
logsListContainer = debugDialog.querySelector('#debugLogsList');
|
|
|
|
logsListContainer = debugDialog.querySelector('#debugLogsList');
|
|
|
|
logDetailContainer = debugDialog.querySelector('#debugLogDetail');
|
|
|
|
logDetailContainer = debugDialog.querySelector('#debugLogDetail');
|
|
|
|
|
|
|
|
debugDialog.querySelector('#debugLogsRefresh')?.addEventListener('click', () => loadDebugLogs(true));
|
|
|
|
debugDialog.querySelector('[data-debug-close]')?.addEventListener('click', () => closeDebugDialog());
|
|
|
|
debugDialog.querySelector('[data-debug-close]')?.addEventListener('click', () => closeDebugDialog());
|
|
|
|
debugDialog.addEventListener('close', () => setDebugTab('php'));
|
|
|
|
debugDialog.addEventListener('close', () => setDebugTab('php'));
|
|
|
|
debugDialog.querySelectorAll('[data-debug-tab]').forEach(btn => {
|
|
|
|
debugDialog.querySelectorAll('[data-debug-tab]').forEach(btn => {
|
|
|
|
@@ -975,6 +981,10 @@ function openDebugDialog(tab = 'php') {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function closeDebugDialog() {
|
|
|
|
function closeDebugDialog() {
|
|
|
|
|
|
|
|
if (debugLogsRefreshTimer) {
|
|
|
|
|
|
|
|
clearInterval(debugLogsRefreshTimer);
|
|
|
|
|
|
|
|
debugLogsRefreshTimer = null;
|
|
|
|
|
|
|
|
}
|
|
|
|
if (debugDialog?.open) debugDialog.close();
|
|
|
|
if (debugDialog?.open) debugDialog.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -993,7 +1003,19 @@ function setDebugTab(tab) {
|
|
|
|
} else if (debugActiveTab === 'console') {
|
|
|
|
} else if (debugActiveTab === 'console') {
|
|
|
|
renderConsolePanel();
|
|
|
|
renderConsolePanel();
|
|
|
|
} else if (debugActiveTab === 'logs') {
|
|
|
|
} 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('');
|
|
|
|
consoleContainer.innerHTML = lines.join('');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function loadDebugLogs() {
|
|
|
|
async function loadDebugLogs(force = false) {
|
|
|
|
if (debugLogsLoaded || !logsListContainer || !logDetailContainer) return;
|
|
|
|
if ((!force && debugLogsLoaded) || !logsListContainer || !logDetailContainer) return;
|
|
|
|
logsListContainer.textContent = 'Lade Logs…';
|
|
|
|
logsListContainer.textContent = 'Lade Logs…';
|
|
|
|
|
|
|
|
if (!debugSelectedLogName) {
|
|
|
|
logDetailContainer.textContent = 'Bitte Log auswaehlen.';
|
|
|
|
logDetailContainer.textContent = 'Bitte Log auswaehlen.';
|
|
|
|
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const res = await apiAction('debug.logs.list', { method: 'GET' });
|
|
|
|
const res = await apiAction('debug.logs.list', { method: 'GET' });
|
|
|
|
if (!res?.ok) throw new Error(res?.error || 'Logs konnten nicht geladen werden');
|
|
|
|
if (!res?.ok) throw new Error(res?.error || 'Logs konnten nicht geladen werden');
|
|
|
|
@@ -1047,17 +1071,31 @@ async function loadDebugLogs() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
logsListContainer.innerHTML = '';
|
|
|
|
logsListContainer.innerHTML = '';
|
|
|
|
items.forEach((item, idx) => {
|
|
|
|
items.forEach((item, idx) => {
|
|
|
|
|
|
|
|
const name = item.name || item.file || `Log ${idx + 1}`;
|
|
|
|
const btn = document.createElement('button');
|
|
|
|
const btn = document.createElement('button');
|
|
|
|
btn.type = 'button';
|
|
|
|
btn.type = 'button';
|
|
|
|
btn.textContent = item.name || item.file || `Log ${idx + 1}`;
|
|
|
|
btn.textContent = name;
|
|
|
|
btn.addEventListener('click', () => {
|
|
|
|
btn.addEventListener('click', () => {
|
|
|
|
logsListContainer.querySelectorAll('button').forEach(b => b.classList.remove('active'));
|
|
|
|
logsListContainer.querySelectorAll('button').forEach(b => b.classList.remove('active'));
|
|
|
|
btn.classList.add('active');
|
|
|
|
btn.classList.add('active');
|
|
|
|
loadDebugLogFile(item.name || item.file || '');
|
|
|
|
debugSelectedLogName = name;
|
|
|
|
|
|
|
|
loadDebugLogFile(name);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
logsListContainer.appendChild(btn);
|
|
|
|
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;
|
|
|
|
debugLogsLoaded = true;
|
|
|
|
} catch (err) {
|
|
|
|
} catch (err) {
|
|
|
|
logsListContainer.textContent = err.message || 'Logs konnten nicht geladen werden';
|
|
|
|
logsListContainer.textContent = err.message || 'Logs konnten nicht geladen werden';
|
|
|
|
|