diff --git a/bericht_card.php b/bericht_card.php index d0c1cfb..96fccbc 100644 --- a/bericht_card.php +++ b/bericht_card.php @@ -402,14 +402,17 @@ if (!$bericht) { } print ''; } - print ''; - print '
'; - print 'Mehrere Bilder als Grid:
'; - print ' '; - print ' '; - print ' '; - print ''; - print ' '; + print '
'; + print ''; + print ''; + print ''; print '
'; } print '
'; diff --git a/js/editor.js b/js/editor.js index a70aec9..a8419b2 100644 --- a/js/editor.js +++ b/js/editor.js @@ -814,51 +814,56 @@ /* ---------- Anhänge & Thumbs ---------- */ function bindAttachments() { const btn = document.getElementById('btn-add-selected'); + const layoutSel = document.getElementById('add-selected-layout'); if (btn) { btn.addEventListener('click', async () => { - const checks = document.querySelectorAll('.att-check:checked'); - for (const c of checks) { - const fd = new FormData(); - fd.append('token', cfg.token); - fd.append('berichtid', cfg.berichtid); - fd.append('relpath', c.dataset.relpath); - fd.append('mime', c.dataset.mime); - await fetch(cfg.urls.add_attachment, { method: 'POST', body: fd }); - c.checked = false; - } - location.reload(); - }); - } - - // Grid-Buttons: ausgewählte Bilder als eine Multi-Image-Seite hinzufügen - document.querySelectorAll('.btn-add-grid').forEach(b => { - b.addEventListener('click', async () => { - const layout = b.dataset.layout; const checks = document.querySelectorAll('.att-check:checked'); if (!checks.length) { alert('Bitte zuerst Bilder ankreuzen'); return; } - const slotCount = { grid_2: 2, grid_2v: 2, grid_4: 4, grid_6: 6 }[layout] || 4; - const relpaths = Array.from(checks) - .filter(c => c.dataset.mime.startsWith('image')) - .slice(0, slotCount) - .map(c => c.dataset.relpath); - if (!relpaths.length) { - alert('Bitte mindestens ein Bild ankreuzen (PDFs sind in Grids nicht unterstützt)'); + const layout = layoutSel ? layoutSel.value : 'single'; + + if (layout === 'single') { + // Wie bisher: jedes Bild als eigene Seite + for (const c of checks) { + const fd = new FormData(); + fd.append('token', cfg.token); + fd.append('berichtid', cfg.berichtid); + fd.append('relpath', c.dataset.relpath); + fd.append('mime', c.dataset.mime); + await fetch(cfg.urls.add_attachment, { method: 'POST', body: fd }); + c.checked = false; + } + location.reload(); return; } - const fd = new FormData(); - fd.append('token', cfg.token); - fd.append('berichtid', cfg.berichtid); - fd.append('layout', layout); - fd.append('relpaths', JSON.stringify(relpaths)); - const r = await fetch(cfg.urls.create_grid_page, { method: 'POST', body: fd }); - const data = await r.json().catch(() => ({})); - if (data.success) location.reload(); - else alert('Fehler: ' + (data.error || 'unbekannt')); + + // Grid-Layout: in Gruppen aufteilen + const slotCount = { grid_2: 2, grid_2v: 2, grid_4: 4, grid_6: 6, before_after: 2 }[layout] || 4; + const imageChecks = Array.from(checks).filter(c => c.dataset.mime.startsWith('image')); + if (!imageChecks.length) { + alert('Bitte mindestens ein Bild ankreuzen (PDFs nicht in Grids unterstützt)'); + return; + } + // In Gruppen à slotCount aufteilen + for (let i = 0; i < imageChecks.length; i += slotCount) { + const group = imageChecks.slice(i, i + slotCount).map(c => c.dataset.relpath); + const fd = new FormData(); + fd.append('token', cfg.token); + fd.append('berichtid', cfg.berichtid); + fd.append('layout', layout); + fd.append('relpaths', JSON.stringify(group)); + const r = await fetch(cfg.urls.create_grid_page, { method: 'POST', body: fd }); + const data = await r.json().catch(() => ({})); + if (!data.success) { + alert('Fehler bei Gruppe '+(Math.floor(i/slotCount)+1)+': '+(data.error || 'unbekannt')); + return; + } + } + location.reload(); }); - }); + } // Lösch-Buttons in der Anhänge-Liste document.querySelectorAll('.att-delete').forEach(btn => {