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 => {