diff --git a/app.js b/app.js
index 8f47933..3738078 100644
--- a/app.js
+++ b/app.js
@@ -2403,7 +2403,16 @@ async function openPageActionsModal(berichtId, pageId, relpath, note, title) {
/* ============================================================
* PDF-VORSCHAU MODAL
* ============================================================ */
-function openPdfModal(blobUrl, filename) {
+/**
+ * Der EINE PDF-Betrachter der App — Berichtsvorschau, Lieferschein und Dokumente am Auftrag.
+ * Bis 15.10.2026 gab es zwei: die Dokumente öffneten einen älteren ohne Zoom (eine Seite,
+ * nur Vor/Zurück), deshalb ging „Finger auseinanderziehen" dort nicht.
+ *
+ * @param {string} blobUrl
+ * @param {string} filename
+ * @param {Function} [beiDownload] eigener Download-Weg (z. B. Originaldatei vom Server)
+ */
+function openPdfModal(blobUrl, filename, beiDownload) {
const fname = filename || 'bericht.pdf';
const modal = document.createElement('div');
modal.className = 'fullscreen-modal pdfv-modal';
@@ -2432,6 +2441,9 @@ function openPdfModal(blobUrl, filename) {
await shareFile(blob, fname, 'application/pdf', fname);
} catch (e) { showToast('Teilen fehlgeschlagen: ' + e.message, 'error'); }
};
+ if (typeof beiDownload === 'function') {
+ modal.querySelector('#pdf-download').onclick = (e) => { e.preventDefault(); beiDownload(); };
+ }
const scroller = modal.querySelector('#pdfv-scroll');
const stack = modal.querySelector('#pdfv-stack');
@@ -3268,86 +3280,17 @@ function openFileViewer({ url, blob, mime }, filename, relpath) {
}
async function openPdfViewer(blob, filename, relpath) {
- console.log('[PDF] Opening:', filename, 'size:', blob.size, 'type:', blob.type);
-
- if (blob.size === 0) {
+ if (!blob || blob.size === 0) {
showToast('❌ PDF-Datei ist leer oder nicht gefunden', 'error');
return;
}
-
- const modal = document.createElement('div');
- modal.className = 'fullscreen-modal pdf-viewer-modal';
- modal.innerHTML = `
-
-
-
-
- `;
- document.body.appendChild(modal);
- pushModal(modal);
-
- const canvas = modal.querySelector('#pdf-canvas');
- const ctx = canvas.getContext('2d');
- const pageInfo = modal.querySelector('#pdf-page-info');
- let pdf, currentPage = 1;
-
- try {
- const arrayBuffer = await blob.arrayBuffer();
- console.log('[PDF] ArrayBuffer size:', arrayBuffer.byteLength);
-
- if (arrayBuffer.byteLength === 0) {
- throw new Error('PDF-Datei ist leer');
- }
-
- pdf = await pdfjs.getDocument(new Uint8Array(arrayBuffer)).promise;
- console.log('[PDF] Loaded:', pdf.numPages, 'pages');
- pageInfo.textContent = `1 / ${pdf.numPages}`;
-
- async function renderPage(num) {
- if (num < 1 || num > pdf.numPages) return;
- currentPage = num;
- try {
- const page = await pdf.getPage(num);
- const viewport = page.getViewport({ scale: window.devicePixelRatio });
- canvas.width = viewport.width;
- canvas.height = viewport.height;
- await page.render({ canvasContext: ctx, viewport }).promise;
- pageInfo.textContent = `${num} / ${pdf.numPages}`;
- } catch (e) {
- console.error('[PDF] Render error on page', num, e);
- pageInfo.textContent = `❌ Seite ${num} Fehler`;
- }
- }
-
- await renderPage(1);
- modal.querySelector('#pdf-prev').onclick = () => renderPage(currentPage - 1);
- modal.querySelector('#pdf-next').onclick = () => renderPage(currentPage + 1);
- modal.querySelector('#pdf-download').onclick = async () => {
- const params = new URLSearchParams({ relpath, download: 1 });
- window.location.href = window.location.origin + '/custom/bericht/api/photo.php?' + params.toString();
- };
- modal.querySelector('#pdf-share').onclick = () => {
- shareFile(blob, filename || 'dokument.pdf', 'application/pdf', filename);
- };
- modal.querySelector('#pdf-prev').disabled = false;
- modal.querySelector('#pdf-next').disabled = pdf.numPages === 1;
- } catch (err) {
- pageInfo.textContent = '❌ ' + (err.message || 'PDF-Fehler');
- console.error('[PDF] Load error:', err);
- showToast('PDF-Fehler: ' + err.message, 'error');
- }
-
- modal.querySelector('#pdf-close').onclick = () => {
- closeModal(modal);
- };
+ // Derselbe Betrachter wie überall (Zoom per Knopf, Zwei-Finger, Doppeltipp, Strg+Rad).
+ // Download wie bisher als Originaldatei vom Server, nicht aus dem Zwischenspeicher.
+ const url = URL.createObjectURL(blob);
+ openPdfModal(url, filename || 'dokument.pdf', relpath ? () => {
+ const params = new URLSearchParams({ relpath, download: 1 });
+ window.location.href = window.location.origin + '/custom/bericht/api/photo.php?' + params.toString();
+ } : null);
}
/* ============================================================