From 068973ab9b2344dd5fa8844dfa306e938475d8f9 Mon Sep 17 00:00:00 2001 From: Mikei386 <44135113+Mikei386@users.noreply.github.com> Date: Tue, 23 Jun 2026 06:56:26 +0200 Subject: [PATCH] Add frontend debug tracing --- build-plugin.sh | 2 +- packages/u-navigator-2026.06.23.r004.tgz | Bin 13696 -> 0 bytes packages/u-navigator-2026.06.23.r005.tgz | Bin 0 -> 14801 bytes server/public/app.js | 180 ++++++++++++++++++++--- server/public/styles.css | 37 +++++ u-navigator.plg | 4 +- 6 files changed, 197 insertions(+), 26 deletions(-) delete mode 100644 packages/u-navigator-2026.06.23.r004.tgz create mode 100644 packages/u-navigator-2026.06.23.r005.tgz diff --git a/build-plugin.sh b/build-plugin.sh index 13200c8..7ff10d0 100755 --- a/build-plugin.sh +++ b/build-plugin.sh @@ -2,7 +2,7 @@ set -eu PLUGIN="u-navigator" -VERSION="2026.06.23.r004" +VERSION="2026.06.23.r005" PKG_DIR="packages" WORK_DIR=".plugin-build" PKG_NAME="${PLUGIN}-${VERSION}.tgz" diff --git a/packages/u-navigator-2026.06.23.r004.tgz b/packages/u-navigator-2026.06.23.r004.tgz deleted file mode 100644 index d729826baba4410879369476026dacb1895b0822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13696 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 b%jjk3$ECJ!mHm?`0Encl1xNz10|og%`a3~g diff --git a/packages/u-navigator-2026.06.23.r005.tgz b/packages/u-navigator-2026.06.23.r005.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f44e4ab43e3ee6d6fde16f096a041f90042d4a4b GIT binary patch literal 14801 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 literal 0 HcmV?d00001 diff --git a/server/public/app.js b/server/public/app.js index 6880894..451c2d5 100644 --- a/server/public/app.js +++ b/server/public/app.js @@ -10,6 +10,8 @@ const state = { draggedEntry: null, pointerDrag: null, suppressClickPath: null, + debug: [], + nextDebugId: 1, jobs: new Map(), nextWindowId: 1, zIndex: 20 @@ -25,6 +27,18 @@ const icons = { document.querySelector('#newExplorerButton').addEventListener('click', () => openExplorer()); document.querySelector('#newPropertiesButton').addEventListener('click', () => openProperties()); document.querySelector('#newQueueButton').addEventListener('click', () => openQueue()); +window.addEventListener('error', (event) => { + recordDebug('window.error', { + message: event.message, + source: event.filename, + line: event.lineno, + column: event.colno, + error: serializeError(event.error) + }); +}); +window.addEventListener('unhandledrejection', (event) => { + recordDebug('window.unhandledrejection', { reason: serializeError(event.reason) }); +}); init(); @@ -300,18 +314,35 @@ function renderProperties(body) { function renderQueue(body) { const jobs = [...state.jobs.values()].reverse(); - if (!jobs.length) { - body.innerHTML = '

Keine Transfers.

'; - return; - } - - body.innerHTML = `
${jobs.map((job) => ` + const jobMarkup = jobs.length ? jobs.map((job) => `
${escapeHtml(job.type)} #${escapeHtml(job.id)}
${escapeHtml(job.status)} · ${escapeHtml(job.message || '')}
- `).join('')}
`; + `).join('') : '

Keine Transfers.

'; + const debugMarkup = state.debug.length ? state.debug.slice(-12).reverse().map((item) => ` +
+ #${item.id} ${escapeHtml(item.label)} + +
${escapeHtml(JSON.stringify(item.data, null, 2))}
+
+ `).join('') : '

Noch keine Debug-Einträge.

'; + + body.innerHTML = ` +
${jobMarkup}
+
+
+ Debug + +
+ ${debugMarkup} +
+ `; + body.querySelector('[data-action="clear-debug"]')?.addEventListener('click', () => { + state.debug = []; + render(); + }); } async function loadExplorer(win, targetPath) { @@ -332,8 +363,13 @@ async function loadExplorer(win, targetPath) { } async function handleDrop(event, win, targetPath) { + recordDebug('html.drop', { + targetPath, + types: dataTransferTypes(event), + files: getDroppedFiles(event).map((file) => ({ name: file.name, size: file.size })) + }); if (state.config.readOnly) { - alert('Read-only mode ist aktiv.'); + showError(new Error('Read-only mode ist aktiv.')); return; } @@ -352,11 +388,13 @@ async function handleDrop(event, win, targetPath) { } async function createJob(type, source, destination) { + recordDebug('job.create.request', { type, source, destination }); const job = await api(apiUrl(`job.php?action=${encodeURIComponent(type)}`), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ source, destination }) }); + recordDebug('job.create.response', job); state.jobs.set(job.id, job); pollJob(job.id); render(); @@ -369,13 +407,15 @@ async function reloadExplorerWindows(ids) { } function hasDropPayload(event) { - const types = [...(event.dataTransfer?.types || [])]; + const types = dataTransferTypes(event); return types.includes('Files') || getDroppedFiles(event).length > 0; } function showError(error) { + const debug = recordDebug('error.shown', serializeError(error)); const message = error?.message || String(error); - alert(message); + const detail = debug ? `\n\nDebug #${debug.id}: ${debug.label}` : ''; + alert(`${message}${detail}`); } function getDroppedFiles(event) { @@ -386,17 +426,28 @@ function getDroppedFiles(event) { } } +function dataTransferTypes(event) { + try { + return [...(event.dataTransfer?.types || [])]; + } catch (error) { + recordDebug('dataTransfer.types.error', serializeError(error)); + return []; + } +} + function setEffectAllowed(event) { try { event.dataTransfer.effectAllowed = 'copyMove'; - } catch {} + } catch (error) { + recordDebug('dataTransfer.effectAllowed.error', serializeError(error)); + } } function setDropEffect(event, effect) { try { event.dataTransfer.dropEffect = effect; } catch { - // Browser rejected the requested cursor hint; the app-state drop still works. + recordDebug('dataTransfer.dropEffect.error', { effect }); } } @@ -406,7 +457,7 @@ async function renameEntry(win, entry) { return; } if (nextName.includes('/')) { - alert('Der Name darf keinen Slash enthalten.'); + showError(new Error('Der Name darf keinen Slash enthalten.')); return; } await createJob('move', entry.path, `${dirname(entry.path)}/${nextName}`); @@ -464,7 +515,7 @@ function renderContextMenu() { try { await action(); } catch (error) { - alert(error.message); + showError(error); } }); menu.appendChild(button); @@ -488,11 +539,16 @@ function renderContextMenu() { } async function pollJob(id) { - const job = await api(apiUrl(`job.php?id=${encodeURIComponent(id)}`)); - state.jobs.set(id, job); - render(); - if (['queued', 'running', 'cancel_requested'].includes(job.status)) { - setTimeout(() => pollJob(id), 700); + try { + const job = await api(apiUrl(`job.php?id=${encodeURIComponent(id)}`)); + state.jobs.set(id, job); + render(); + if (['queued', 'running', 'cancel_requested'].includes(job.status)) { + setTimeout(() => pollJob(id), 700); + } + } catch (error) { + recordDebug('job.poll.error', { id, error: serializeError(error) }); + showError(error); } } @@ -540,6 +596,13 @@ function updatePropertiesWindows() { function startItemPointerDrag(event, win, entry) { if (event.button !== 0 || !entry) return; + recordDebug('pointer.start', { + windowId: win.id, + path: entry.path, + type: entry.type, + x: event.clientX, + y: event.clientY + }); state.pointerDrag = { sourceWindowId: win.id, path: entry.path, @@ -595,6 +658,13 @@ async function finishItemPointerDrag(event, move, up) { event.preventDefault(); state.suppressClickPath = drag.path; const target = findPointerDropTarget(event); + recordDebug('pointer.finish', { + source: drag.path, + target: target ? { windowId: target.windowId, path: target.path, rowPath: target.row?.dataset?.path || null } : null, + copy: event.altKey, + x: event.clientX, + y: event.clientY + }); if (!target) { return; } @@ -635,14 +705,35 @@ function clearPointerDropTarget() { } function findPointerDropTarget(event) { - const element = document.elementFromPoint(event.clientX, event.clientY); - const windowEl = element?.closest?.('.window'); + let element; + try { + element = document.elementFromPoint(event.clientX, event.clientY); + } catch (error) { + recordDebug('elementFromPoint.error', { + x: event.clientX, + y: event.clientY, + error: serializeError(error) + }); + return null; + } + let windowEl; + try { + windowEl = element?.closest?.('.window'); + } catch (error) { + recordDebug('closest.window.error', { error: serializeError(error), element: element?.tagName }); + return null; + } if (!windowEl) return null; const win = state.windows.find((item) => item.id === windowEl.dataset.windowId); if (!win || win.kind !== 'explorer') return null; - const row = element.closest?.('.file-row'); + let row; + try { + row = element.closest?.('.file-row'); + } catch (error) { + recordDebug('closest.row.error', { error: serializeError(error), element: element?.tagName }); + } if (row?.dataset.type === 'directory') { return { windowId: win.id, path: row.dataset.path, row }; } @@ -734,11 +825,18 @@ function startResizeWindow(event, win) { async function api(url, options) { const response = await fetchChecked(url, options); - return response.json(); + try { + return await response.json(); + } catch (error) { + recordDebug('api.json.error', { url, error: serializeError(error) }); + throw error; + } } async function fetchChecked(url, options) { + recordDebug('fetch.request', { url, method: options?.method || 'GET' }); const response = await fetch(url, options); + recordDebug('fetch.response', { url, status: response.status, ok: response.ok }); if (!response.ok) { let message = `${response.status} ${response.statusText}`; try { @@ -797,3 +895,39 @@ function clamp(value, min, max) { function apiUrl(path) { return `${API_BASE.replace(/\/$/, '')}/${path.replace(/^\//, '')}`; } + +function recordDebug(label, data = {}) { + const item = { + id: state.nextDebugId++, + time: new Date().toLocaleTimeString(), + label, + data + }; + state.debug.push(item); + if (state.debug.length > 80) { + state.debug.splice(0, state.debug.length - 80); + } + updateQueueWindows(); + return item; +} + +function updateQueueWindows() { + for (const win of state.windows.filter((item) => item.kind === 'queue')) { + const body = workspace.querySelector(`.window[data-window-id="${win.id}"] .window-body`); + if (body) { + renderQueue(body); + } + } +} + +function serializeError(error) { + if (!error) return null; + if (error instanceof Error || typeof error === 'object') { + return { + name: error.name, + message: error.message || String(error), + stack: error.stack + }; + } + return { message: String(error) }; +} diff --git a/server/public/styles.css b/server/public/styles.css index eee438f..2dc191d 100644 --- a/server/public/styles.css +++ b/server/public/styles.css @@ -306,6 +306,43 @@ gap: 10px; } +.u-nav .debug-log { + border-top: 1px solid var(--line); + display: grid; + gap: 8px; + margin-top: 14px; + padding-top: 12px; +} + +.u-nav .debug-log header { + align-items: center; + display: flex; + justify-content: space-between; +} + +.u-nav .debug-entry { + background: var(--surface-2); + border: 1px solid var(--line); + border-radius: 6px; + padding: 8px; +} + +.u-nav .debug-entry time { + color: var(--muted); + display: block; + font-size: 12px; +} + +.u-nav .debug-entry pre { + color: var(--text); + font: 12px/1.35 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + margin: 6px 0 0; + max-height: 140px; + overflow: auto; + white-space: pre-wrap; + word-break: break-word; +} + .u-nav .job { border: 1px solid var(--line); border-radius: 8px; diff --git a/u-navigator.plg b/u-navigator.plg index 0b08b0f..2bf3a14 100644 --- a/u-navigator.plg +++ b/u-navigator.plg @@ -1,7 +1,7 @@ - + ]> @@ -14,7 +14,7 @@ https://git.casaderoll.de/michael/Unraid-Navigator/raw/branch/main/packages/&package; -da98c5f068d4f12dfddb0e7143a7aaa0 +1e5eb8df508f7a4e46a4c13336302d16