Display CMS Optimierungen 29-05-2026

- Mediathek: Video-Vorschaubilder statt Icons (FFmpeg-Thumbnails + Backfill-Command), Kategorie "Sonstiges"
- B2in Media-Picker zeigt alle Medientypen, Typ wird automatisch erkannt; Thumbnail-Preview vor allen Medien-URL-Feldern
- B2in Marke/Footer: Footer ein/aus, Logo+Claim frei positionierbar (Ecken) mit Constraints, separate Anzeige-Schalter
- Angebote-Modul dynamisch: kein Slide-Typ mehr, einheitliches Detail-Layout mit ein-/ausblendbaren Bloecken, Logo/Brand pro Slide, Streichpreis-Option
- Player: leere Module stoppen Endlosschleife, dynamische Layout-Anpassung bei verstecktem Footer/Header
- Fix: Script-Ladereihenfolge (Livewire vor Flux), entfernte stale public/flux/flux.js, Modal-Crash beim Aktualisieren behoben

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin Adametz 2026-05-29 15:57:33 +00:00
parent 9262132325
commit 6c6d683b9a
42 changed files with 2267 additions and 13905 deletions

View file

@ -30,6 +30,9 @@ class DisplayList extends Component
public $addVersionSelect = null;
/** @var array<int> */
public $versionsToAdd = [];
public $editingPlaylistStatus = DisplayPlaylist::STATUS_PUBLISHED;
public ?string $draftPreviewToken = null;
@ -75,6 +78,20 @@ class DisplayList extends Component
$this->persistDraftPreviewIfNeeded();
}
public function addSelectedVersions(): void
{
foreach ($this->versionsToAdd as $versionId) {
$id = (int) $versionId;
if ($id && ! in_array($id, $this->selectedVersionIds, true)) {
$this->selectedVersionIds[] = $id;
}
}
$this->versionsToAdd = [];
$this->persistDraftPreviewIfNeeded();
}
private function firstAvailableVersionId(): ?int
{
return DisplayVersion::active()
@ -175,10 +192,31 @@ class DisplayList extends Component
}
$display->draftPlaylist->delete();
$display->clearPreviewToken();
session()->flash('success', 'Entwurf wurde verworfen.');
}
public function rotatePreviewToken(int $displayId): void
{
$display = Display::with('draftPlaylist')->findOrFail($displayId);
if (! $display->draftPlaylist) {
session()->flash('success', 'Für dieses Display gibt es keinen Entwurf.');
return;
}
$display->rotatePreviewToken();
if ($this->displayId === $display->id && $this->editingPlaylistStatus === DisplayPlaylist::STATUS_DRAFT) {
$this->draftPreviewToken = $display->preview_token;
$this->previewFrameRefreshCounter++;
}
session()->flash('success', 'Vorschau-Link wurde neu erzeugt. Der alte Link ist jetzt ungültig.');
}
public function publishDraft(int $displayId): void
{
$display = Display::with(['draftPlaylist.modules'])->findOrFail($displayId);
@ -201,6 +239,8 @@ class DisplayList extends Component
return $display->draftPlaylist->fresh('modules');
});
$display->clearPreviewToken();
session()->flash('success', 'Entwurf wurde veröffentlicht.');
}
@ -314,6 +354,7 @@ class DisplayList extends Component
$this->displayIsActive = true;
$this->displayIsTest = false;
$this->addVersionSelect = null;
$this->versionsToAdd = [];
$this->editingPlaylistStatus = DisplayPlaylist::STATUS_PUBLISHED;
$this->draftPreviewToken = null;
$this->previewFrameRefreshCounter = 0;