All checks were successful
Deploy bericht / deploy (push) Successful in 13s
Anhaenge-Spalte: Kachelraster mit Server-Thumbnails statt Dateinamen-Liste (Bilder per GD, PDFs per PDF.js), Grossansicht per Klick, Auswahlreihenfolge sichtbar, Sortierung/Filter (Aufnahmezeit per eigenem EXIF-Parser, da im Prod-Container ohne exif-Modul), ziehbare Spaltenbreite, Kachelgroesse, Drag & Drop auf Seitenliste/Arbeitsflaeche/Raster-Plaetze. Arbeitstisch zeigt jetzt Kopf-, Inhalts- und Fussbereich passend zur echten Seitengeometrie (bericht_page_geometry()) - Editor und PDF-Erzeugung rechnen mit denselben Werten, das PDF setzt die Arbeitsflaeche 1:1 statt sie ein zweites Mal einzupassen. Neu: Bild einer Seite austauschen (auch einzelne Raster-Plaetze), Seiten mehrfach markieren und sammeln loeschen/duplizieren, Autosave mit Verlassen-Warnung, Tastenkuerzel, kein location.reload() mehr nach Hinzufuegen/Loeschen/Hochladen (ajax/fragments.php). Nebenbei behoben: dol_dir_list() ohne mode=1 (Dateigroesse leer), PDF.js-Worker-Pfad ohne /custom-Praefix, PDFs liefen als Download statt inline, Groessen-Select blieb leer, Mehrfach-Upload nahm nur die erste Datei, Race-Condition bei schnellem Seitenwechsel. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
66 lines
2.7 KiB
PHP
66 lines
2.7 KiB
PHP
<?php
|
|
/* Tauscht das Quellbild einer bestehenden Seite aus.
|
|
*
|
|
* POST: pageid, relpath, mime, token
|
|
* slot (optional) — bei Grid-Layouts der zu ersetzende Slot (0-basiert)
|
|
*
|
|
* Seitenreihenfolge, Notiz und Annotationen bleiben erhalten; nur die Quelle
|
|
* wird ersetzt. Damit muss man eine falsch gewaehlte Seite nicht loeschen und
|
|
* hinten neu anhaengen.
|
|
*/
|
|
require_once __DIR__.'/_inc.php';
|
|
|
|
global $db, $user;
|
|
if (!$user->hasRight('bericht', 'write')) bericht_ajax_fail('Permission denied', 403);
|
|
|
|
$pageid = (int) ($_POST['pageid'] ?? 0);
|
|
$relpath = (string) ($_POST['relpath'] ?? '');
|
|
$mime = (string) ($_POST['mime'] ?? '');
|
|
$slot = isset($_POST['slot']) && $_POST['slot'] !== '' ? (int) $_POST['slot'] : null;
|
|
|
|
if (!$pageid || $relpath === '') bericht_ajax_fail('Parameter fehlen');
|
|
|
|
$full = bericht_resolve_data_path($relpath);
|
|
if (!$full || !file_exists($full)) bericht_ajax_fail('Datei nicht gefunden', 404);
|
|
|
|
$res = $db->query("SELECT rowid, fk_bericht, COALESCE(layout,'single') AS layout"
|
|
." FROM ".$db->prefix()."bericht_page WHERE rowid = ".((int) $pageid));
|
|
if (!$res || !($row = $db->fetch_object($res))) bericht_ajax_fail('Seite nicht gefunden', 404);
|
|
|
|
// Bericht darf nicht finalisiert sein
|
|
$b = new Bericht($db);
|
|
if ($b->fetch((int) $row->fk_bericht) <= 0) bericht_ajax_fail('Bericht nicht gefunden', 404);
|
|
if ((int) $b->status === Bericht::STATUS_FINAL) {
|
|
bericht_ajax_fail('Der Bericht ist finalisiert und kann nicht mehr geändert werden', 403);
|
|
}
|
|
|
|
if ($row->layout !== 'single' && $slot !== null) {
|
|
// Grid: nur den einen Slot ersetzen
|
|
if (strpos($mime, 'image') !== 0 && $mime !== '') {
|
|
bericht_ajax_fail('In Raster-Layouts sind nur Bilder möglich');
|
|
}
|
|
$slots = BerichtPage::slotCountForLayout($row->layout);
|
|
if ($slot < 0 || $slot >= $slots) bericht_ajax_fail('Ungültiger Slot');
|
|
|
|
$p = new BerichtPage($db);
|
|
$p->id = (int) $row->rowid;
|
|
$p->fk_bericht = (int) $row->fk_bericht;
|
|
$p->layout = $row->layout;
|
|
if ($p->setSlotImage($slot, $relpath, 0) > 0) {
|
|
bericht_ajax_ok(array('slot' => $slot));
|
|
}
|
|
bericht_ajax_fail('DB-Fehler beim Ersetzen des Slots');
|
|
}
|
|
|
|
// Single: source_path/source_type der Seite ersetzen
|
|
$source_type = (strpos($mime, 'pdf') !== false || preg_match('/\.pdf$/i', $relpath)) ? 'pdf' : 'image';
|
|
$sql = "UPDATE ".$db->prefix()."bericht_page SET"
|
|
." source_path = '".$db->escape($relpath)."',"
|
|
." source_type = '".$db->escape($source_type)."',"
|
|
." source_page = 1,"
|
|
." rotation = 0"
|
|
." WHERE rowid = ".((int) $pageid);
|
|
if ($db->query($sql)) {
|
|
bericht_ajax_ok(array('source_type' => $source_type));
|
|
}
|
|
bericht_ajax_fail('DB-Fehler beim Ersetzen der Seite');
|