All checks were successful
Deploy bericht / deploy (push) Successful in 1s
Desktop-Editor Polish:
- Aktives Seiten-Thumbnail deutlich markiert (scale + shadow + blauer
Label-Hintergrund)
- Titel-Feld pro Seite in der DB (llx_bericht_page.title)
Phase 5.2 Vorher/Nachher-Layout:
- Neuer layout-Typ 'before_after' in bericht_render_page_to_pdf
- Zwei Bilder nebeneinander, Labels 'Vorher' / 'Nachher', Titel oben
- 'VN'-Button in der Anhänge-Grid-Leiste
- create_grid_page akzeptiert before_after
- Layout-Dropdown hat before_after + title_only Option
Phase 5.2b Title-Only Seiten:
- Reine Titel/Zwischentitel-Seiten ohne Bild
- 32pt Titel zentriert, optional Notiz darunter
- bericht_render_page_to_pdf behandelt title_only separat
Phase 5.3 Bericht-Versionierung:
- Neue Spalten version + fk_bericht_parent in llx_bericht
- Bericht::duplicateAsNewVersion() kopiert alles inkl. Seiten
- '🔀 Neue Version'-Button im Editor-Footer
- Versions-Links in der Meta-Zeile (v1, v2, v3 …) mit Sprungmöglichkeit
- Alte Versionen bleiben unverändert erhalten
Phase 5.6 Batch-Modus:
- Neue Seite bericht_batch.php mit Filter (Datum von/bis, Suche)
- Checkbox-Liste aller finalisierten Berichte
- 'Ausgewählte als Sammel-PDF herunterladen' → FPDI merged alle
final_pdf_path in ein neues PDF mit Inhaltsverzeichnis-Seite
- Link im Admin-Setup
api/pages.php:
- POST-Update akzeptiert jetzt auch title und layout zusätzlich zu
note und rotation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
49 lines
1.9 KiB
PHP
49 lines
1.9 KiB
PHP
<?php
|
|
/* Erstellt eine neue Multi-Image-Seite mit gewähltem Layout
|
|
* und setzt mehrere Bilder gleich rein.
|
|
* POST: berichtid, layout, relpaths[] (JSON-Array), token
|
|
*/
|
|
require_once __DIR__.'/_inc.php';
|
|
|
|
global $db, $user;
|
|
if (!$user->hasRight('bericht', 'write')) bericht_ajax_fail('Permission denied', 403);
|
|
|
|
$berichtid = (int) ($_POST['berichtid'] ?? 0);
|
|
$layout = (string) ($_POST['layout'] ?? 'grid_4');
|
|
$relpaths_raw = (string) ($_POST['relpaths'] ?? '[]');
|
|
$relpaths = json_decode($relpaths_raw, true);
|
|
if (!is_array($relpaths) || empty($relpaths)) bericht_ajax_fail('Keine Bilder ausgewählt');
|
|
|
|
$valid_layouts = array('grid_2', 'grid_2v', 'grid_4', 'grid_6', 'before_after');
|
|
if (!in_array($layout, $valid_layouts, true)) $layout = 'grid_4';
|
|
|
|
$bericht = new Bericht($db);
|
|
if ($bericht->fetch($berichtid) <= 0) bericht_ajax_fail('Bericht nicht gefunden', 404);
|
|
|
|
// Höchste page_order ermitteln
|
|
$res = $db->query("SELECT COALESCE(MAX(page_order),0) AS m FROM ".$db->prefix()."bericht_page WHERE fk_bericht = ".((int) $berichtid));
|
|
$next_order = ($res && ($o = $db->fetch_object($res))) ? ((int) $o->m) + 1 : 1;
|
|
|
|
// Neue Page anlegen — dummy source_path, da Bilder über page_image kommen
|
|
$page = new BerichtPage($db);
|
|
$page->fk_bericht = $berichtid;
|
|
$page->page_order = $next_order;
|
|
$page->source_type = 'grid';
|
|
$page->source_path = ''; // bei grid leer
|
|
$page->layout = $layout;
|
|
$page->image_scale = 1.0;
|
|
$page->image_align = 'fit';
|
|
if ($page->create() <= 0) bericht_ajax_fail('Page-Insert fehlgeschlagen');
|
|
|
|
// Bilder in Slots verteilen
|
|
$slot_count = BerichtPage::slotCountForLayout($layout);
|
|
$slot = 0;
|
|
foreach ($relpaths as $rel) {
|
|
if ($slot >= $slot_count) break;
|
|
$full = bericht_resolve_data_path($rel);
|
|
if (!$full || !file_exists($full)) continue;
|
|
$page->setSlotImage($slot, $rel, 0);
|
|
$slot++;
|
|
}
|
|
|
|
bericht_ajax_ok(array('pageid' => $page->id, 'created_slots' => $slot));
|