From d5f278aae232d1b8fbc9f1d07b31812a90576c78 Mon Sep 17 00:00:00 2001 From: Mikei386 <44135113+Mikei386@users.noreply.github.com> Date: Tue, 23 Jun 2026 13:35:46 +0200 Subject: [PATCH] Add text file preview window --- build-plugin.sh | 2 +- packages/u-navigator-2026.06.23.r028.tgz | Bin 21902 -> 0 bytes packages/u-navigator-2026.06.23.r029.tgz | Bin 0 -> 23072 bytes .../plugins/u-navigator/api/preview.php | 39 ++++++++ server/public/app.js | 92 ++++++++++++++++++ server/public/styles.css | 37 +++++++ u-navigator.plg | 4 +- 7 files changed, 171 insertions(+), 3 deletions(-) delete mode 100644 packages/u-navigator-2026.06.23.r028.tgz create mode 100644 packages/u-navigator-2026.06.23.r029.tgz create mode 100644 plugin-root/usr/local/emhttp/plugins/u-navigator/api/preview.php diff --git a/build-plugin.sh b/build-plugin.sh index f618596..9e32399 100755 --- a/build-plugin.sh +++ b/build-plugin.sh @@ -2,7 +2,7 @@ set -eu PLUGIN="u-navigator" -VERSION="2026.06.23.r028" +VERSION="2026.06.23.r029" PKG_DIR="packages" WORK_DIR=".plugin-build" PKG_NAME="${PLUGIN}-${VERSION}.tgz" diff --git a/packages/u-navigator-2026.06.23.r028.tgz b/packages/u-navigator-2026.06.23.r028.tgz deleted file mode 100644 index 8fcb3069ffa8df67c342c74dfd3333a6a1b97b45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21902 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 Hg8b?~tc1I~ diff --git a/packages/u-navigator-2026.06.23.r029.tgz b/packages/u-navigator-2026.06.23.r029.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e060eb6739053bf3e00e95ba40b5ae3627595ee9 GIT binary patch literal 23072 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 literal 0 HcmV?d00001 diff --git a/plugin-root/usr/local/emhttp/plugins/u-navigator/api/preview.php b/plugin-root/usr/local/emhttp/plugins/u-navigator/api/preview.php new file mode 100644 index 0000000..193affd --- /dev/null +++ b/plugin-root/usr/local/emhttp/plugins/u-navigator/api/preview.php @@ -0,0 +1,39 @@ + UNAV_PREVIEW_MAX_BYTES) { + unav_error(413, 'Preview file is larger than 1 MB'); +} + +$content = file_get_contents($resolved['path']); +if ($content === false) { + unav_error(500, 'Could not read file'); +} +if (strpos($content, "\0") !== false) { + unav_error(415, 'Preview is not available for binary files'); +} + +unav_json([ + 'path' => $resolved['path'], + 'name' => basename($resolved['path']), + 'size' => $size, + 'extension' => $extension, + 'content' => $content, +]); diff --git a/server/public/app.js b/server/public/app.js index 1ab5453..b2ee669 100644 --- a/server/public/app.js +++ b/server/public/app.js @@ -35,6 +35,7 @@ const icons = { symlink: 'Link', other: 'Item' }; +const previewExtensions = new Set(['txt', 'log', 'md', 'rd', 'rst', 'yaml', 'yml', 'json', 'xml', 'csv', 'ini', 'cfg', 'conf', 'sh', 'php', 'js', 'css', 'html']); document.querySelector('#newExplorerButton').addEventListener('click', () => openExplorer()); document.querySelector('#newPropertiesButton').addEventListener('click', () => openProperties()); @@ -112,6 +113,40 @@ function openProperties(entry = state.selectedEntry) { }); } +function openPreview(entry) { + if (!entry || !isPreviewable(entry)) { + showError(new Error('Für diesen Dateityp ist keine Vorschau verfügbar.')); + return null; + } + + const existing = state.windows.find((item) => item.kind === 'preview'); + if (existing) { + existing.data.entry = entry; + existing.data.content = ''; + existing.data.loading = true; + existing.data.error = null; + focusWindow(existing); + render(); + loadPreview(existing, entry); + return existing; + } + + const win = createWindow('Vorschau', 'preview', { + width: 620, + height: 460, + x: 190, + y: 110, + data: { + entry, + content: '', + loading: true, + error: null + } + }); + loadPreview(win, entry); + return win; +} + function openQueue() { showTransferPanel(); return null; @@ -187,6 +222,7 @@ function renderWindow(win) { body.className = 'window-body'; if (win.kind === 'explorer') renderExplorer(body, win); if (win.kind === 'properties') renderProperties(body); + if (win.kind === 'preview') renderPreview(body, win); body.addEventListener('scroll', () => { if (win.data.lockScroll) { body.scrollTop = win.data.lockScrollTop || 0; @@ -289,6 +325,8 @@ function renderExplorer(body, win) { if (shouldSuppressItemActivation()) return; if (entry.type === 'directory') { loadExplorer(win, entry.path); + } else if (isPreviewable(entry)) { + openPreview(entry); } }); row.addEventListener('contextmenu', (event) => { @@ -368,6 +406,45 @@ function renderProperties(body) { } } +function renderPreview(body, win) { + const data = win.data; + body.classList.add('preview-body'); + if (data.loading) { + body.innerHTML = '

Lade Vorschau...

'; + return; + } + if (data.error) { + body.innerHTML = `

${escapeHtml(data.error)}

`; + return; + } + const entry = data.entry; + body.innerHTML = ` +
+ ${escapeHtml(entry?.name || data.name || 'Vorschau')} + ${escapeHtml(formatBytes(data.size || entry?.size || 0))} +
+
${escapeHtml(data.content || '')}
+ `; +} + +async function loadPreview(win, entry) { + win.data.loading = true; + win.data.error = null; + render(); + try { + const result = await api(apiUrl(`preview.php?path=${encodeURIComponent(entry.path)}`)); + win.data.entry = entry; + win.data.name = result.name; + win.data.size = result.size; + win.data.content = result.content; + } catch (error) { + win.data.error = error.message; + } finally { + win.data.loading = false; + render(); + } +} + function renderQueue(body) { body.innerHTML = queueMarkup(); bindQueueActions(body); @@ -797,6 +874,8 @@ function renderContextMenu() { if (entry) { if (entry.type === 'directory') { actions.push(['Öffnen', () => loadExplorer(win, entry.path)]); + } else if (isPreviewable(entry)) { + actions.push(['Vorschau', () => openPreview(entry)]); } actions.push(['Eigenschaften', () => showPropertiesForEntry(win, entry)]); if (!isReadOnly()) { @@ -1258,6 +1337,9 @@ function windowTitle(win) { if (win.kind === 'explorer') { return `Explorer · ${win.data.path || ''}`; } + if (win.kind === 'preview') { + return `Vorschau · ${win.data.entry?.name || ''}`; + } return win.title; } @@ -1273,6 +1355,16 @@ function dirname(value) { return `/${parts.slice(0, -1).join('/')}`; } +function extensionOf(name) { + const value = String(name || ''); + const index = value.lastIndexOf('.'); + return index >= 0 ? value.slice(index + 1).toLowerCase() : ''; +} + +function isPreviewable(entry) { + return entry?.type === 'file' && previewExtensions.has(extensionOf(entry.name || entry.path)); +} + function joinPath(parent, name) { return `${String(parent || '').replace(/\/+$/, '')}/${String(name || '').replace(/^\/+/, '')}`; } diff --git a/server/public/styles.css b/server/public/styles.css index 5796fa4..a871671 100644 --- a/server/public/styles.css +++ b/server/public/styles.css @@ -694,6 +694,43 @@ overflow-wrap: anywhere; } +.u-nav .preview-body { + display: grid; + gap: 10px; + grid-template-rows: auto minmax(0, 1fr); +} + +.u-nav .preview-meta { + align-items: center; + border-bottom: 1px solid var(--line); + color: var(--muted); + display: flex; + gap: 10px; + justify-content: space-between; + padding-bottom: 8px; +} + +.u-nav .preview-meta strong { + color: var(--text); + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.u-nav .preview-text { + background: var(--surface-2); + border: 1px solid var(--line); + border-radius: 6px; + color: var(--text); + font: 13px/1.45 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + margin: 0; + min-height: 0; + overflow: auto; + padding: 10px; + white-space: pre; +} + @media (max-width: 720px) { .u-nav .topbar { align-items: flex-start; diff --git a/u-navigator.plg b/u-navigator.plg index ccf5087..f890578 100644 --- a/u-navigator.plg +++ b/u-navigator.plg @@ -1,7 +1,7 @@ - + @@ -24,7 +24,7 @@ https://git.casaderoll.de/michael/Unraid-Navigator/raw/branch/main/packages/&package; -b74c325d1c332768da07a6ab11de7a03 +2c27aa33b2a3be760a518625a0762cac