diff --git a/app.css b/app.css index 52222e4..20fd0c6 100644 --- a/app.css +++ b/app.css @@ -568,6 +568,18 @@ body { border-radius: 10px; font-weight: 600; } +.report-page-thumb .page-title-badge { + position: absolute; + bottom: 0; left: 0; right: 0; + background: rgba(0,0,0,0.75); + color: #fff; + font-size: 10px; + padding: 3px 6px; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} /* Unterschrift-Modal */ .signature-modal .signature-meta { diff --git a/app.js b/app.js index 59b7322..bf586ce 100644 --- a/app.js +++ b/app.js @@ -630,9 +630,10 @@ router.on('/reports/:id', async (args) => { ${hasPages ? `
${data.pages.map((p, i) => ` -
+
${i + 1}
+ ${p.title ? `
${escapeHtml(p.title)}
` : ''}
`).join('')}
` : '
📭
Dieser Bericht hat noch keine Seiten. Fotos aufnehmen, um Seiten hinzuzufügen.
'} @@ -785,7 +786,7 @@ function bindReportPageInteractions(reportId) { // Click/Tap → Aktion-Modal (nur wenn nicht gedraggt wurde) t.addEventListener('click', (e) => { if (dragging) { e.preventDefault(); return; } - openPageActionsModal(reportId, t.dataset.pageId, t.dataset.relpath, t.dataset.note || ''); + openPageActionsModal(reportId, t.dataset.pageId, t.dataset.relpath, t.dataset.note || '', t.dataset.title || ''); }); // Long-Press → Drag-Modus @@ -939,7 +940,7 @@ async function openNewReportModal(orderId) { /* ============================================================ * SEITEN-AKTIONEN MODAL (Notiz, Löschen, Vollbild) * ============================================================ */ -async function openPageActionsModal(berichtId, pageId, relpath, note) { +async function openPageActionsModal(berichtId, pageId, relpath, note, title) { const url = await api.getPhotoBlobUrl(relpath); const modal = document.createElement('div'); modal.className = 'fullscreen-modal'; @@ -950,22 +951,37 @@ async function openPageActionsModal(berichtId, pageId, relpath, note) {
- ${url ? `` : '
'} - - - + ${url ? `` : '
'} + + + + +
`; document.body.appendChild(modal); modal.querySelector('#pa-close').onclick = () => modal.remove(); - modal.querySelector('#pa-save-note').onclick = async () => { + modal.querySelector('#pa-save').onclick = async () => { try { - await api.updatePageNote(pageId, modal.querySelector('#pa-note').value); - showToast('✓ Notiz gespeichert'); + const note = modal.querySelector('#pa-note').value; + const title = modal.querySelector('#pa-title').value; + await api.request('/pages.php?id=' + pageId, { + method: 'POST', + body: JSON.stringify({ note, title }), + }); + showToast('✓ Gespeichert'); modal.remove(); router.navigate(); - } catch (e) { showToast('Fehler: ' + e.message, 'error'); } + } catch (e) { + // Fallback falls api.request nicht exposed ist + try { + await api.updatePageNote(pageId, modal.querySelector('#pa-note').value); + showToast('✓ Notiz gespeichert'); + modal.remove(); + router.navigate(); + } catch (er) { showToast('Fehler: ' + er.message, 'error'); } + } }; modal.querySelector('#pa-delete').onclick = async () => { if (!confirm('Diese Seite aus dem Bericht entfernen?')) return; diff --git a/lib/api.js b/lib/api.js index 3521a8b..c9559e5 100644 --- a/lib/api.js +++ b/lib/api.js @@ -221,7 +221,9 @@ blobUrlCache.clear(); } + // Low-level request-Funktion auch exposen für Spezialfälle window.api = { + request, getToken, setToken, clearToken, login, logout, listOrders, getOrder, listOrderPhotos, uploadOrderPhoto,