diff --git a/resources/views/components/press-release-submit-modal.blade.php b/resources/views/components/press-release-submit-modal.blade.php
index 77cf5ef..eba4d78 100644
--- a/resources/views/components/press-release-submit-modal.blade.php
+++ b/resources/views/components/press-release-submit-modal.blade.php
@@ -1,6 +1,7 @@
@props([
'name' => 'confirm-submit-review',
'action',
+ 'bookingAction' => null,
'confirmLabel' => null,
'quotaTotal' => null,
'quotaRemaining' => null,
@@ -18,6 +19,11 @@
Submit-Gate (Decision-Update §5.1): Ohne aktive Buchung zeigt das Modal
statt des Prüf-Flows einen Buchungs-Hinweis — der Button konvertiert,
er verschwindet nicht. Serverseitig sichert submitForReview() das Gate ab.
+
+ `booking-action` (optional): Livewire-Methode, die den Entwurf zuerst
+ speichert und dann zur Buchungsseite leitet. ZWINGEND in Erstellen/Bearbeiten
+ setzen — sonst ginge der erfasste Inhalt beim Sprung verloren. Fehlt sie
+ (z. B. Detailansicht, dort ist bereits gespeichert), wird direkt verlinkt.
--}}
@php($bookingRequired = ! (auth()->user()?->hasActiveBooking() ?? true))
@@ -31,7 +37,7 @@
- {{ __('Zum Einreichen einer Pressemitteilung wird eine aktive Buchung benötigt. Ihre Entwürfe bleiben gespeichert und können jederzeit weiter bearbeitet werden.') }}
+ {{ __('Zum Einreichen einer Pressemitteilung wird eine aktive Buchung benötigt. Ihr Entwurf wird dabei gespeichert und bleibt jederzeit bearbeitbar.') }}
{{ __('Nach der Buchung reichen Sie die Pressemitteilung mit einem Klick zur Prüfung ein.') }}
@@ -42,9 +48,17 @@
{{ __('Später') }}
-
- {{ __('Buchung auswählen') }}
-
+ @if ($bookingAction)
+ {{-- Entwurf zuerst speichern, dann zur Buchung — kein Datenverlust. --}}
+
+ {{ __('Speichern & Buchung auswählen') }}
+
+ @else
+
+ {{ __('Buchung auswählen') }}
+
+ @endif
@else
diff --git a/resources/views/livewire/customer/press-releases/create.blade.php b/resources/views/livewire/customer/press-releases/create.blade.php
index 31d7d46..a200eed 100644
--- a/resources/views/livewire/customer/press-releases/create.blade.php
+++ b/resources/views/livewire/customer/press-releases/create.blade.php
@@ -400,7 +400,16 @@ new #[Layout('components.layouts.app'), Title('Neue Pressemitteilung')] class ex
$this->redirect(route('me.press-releases.edit', $pr->id), navigate: true);
}
- public function save(string $submitStatus = 'draft'): void
+ /**
+ * Validiert das Formular und legt die Pressemitteilung als Entwurf an.
+ * Gibt den persistierten Entwurf zurück oder null, wenn Firma/Kontakt nicht
+ * auflösbar sind (Validierungsfehler wirft ValidationException).
+ *
+ * Wichtig: Dies ist der einzige Persistenz-Pfad. Jede Aktion (Speichern,
+ * Einreichen, „Buchung auswählen") MUSS zuerst hierüber speichern, bevor
+ * navigiert wird — sonst geht der erfasste Inhalt verloren.
+ */
+ private function persistDraft(): ?PressRelease
{
$this->syncScheduledAt();
$this->useEmbargo = false;
@@ -421,7 +430,7 @@ new #[Layout('components.layouts.app'), Title('Neue Pressemitteilung')] class ex
$this->addError('companyId', __('Die gewählte Firma ist nicht Ihrem Account zugeordnet.'));
$this->notifyValidationError();
- return;
+ return null;
}
$contact = null;
@@ -433,7 +442,7 @@ new #[Layout('components.layouts.app'), Title('Neue Pressemitteilung')] class ex
$this->addError('contactId', __('Der gewählte Pressekontakt gehört nicht zu dieser Firma.'));
$this->notifyValidationError();
- return;
+ return null;
}
}
@@ -457,6 +466,39 @@ new #[Layout('components.layouts.app'), Title('Neue Pressemitteilung')] class ex
$pr->contacts()->sync([$contact->id]);
}
+ return $pr;
+ }
+
+ /**
+ * Speichert den Entwurf und leitet anschließend zur Buchungsseite — wird
+ * vom Submit-Modal genutzt, wenn keine Buchung vorliegt. So bleibt der
+ * erfasste Inhalt erhalten (kein Sprung ohne Speichern).
+ */
+ public function saveDraftAndChooseBooking(): void
+ {
+ $pr = $this->persistDraft();
+
+ if (! $pr) {
+ return;
+ }
+
+ Flux::toast(
+ heading: __('Entwurf gespeichert'),
+ text: __('Ihr Entwurf ist gesichert. Wählen Sie eine Buchung, um ihn anschließend einzureichen.'),
+ variant: 'success',
+ );
+
+ $this->redirect(route('me.bookings.index'), navigate: true);
+ }
+
+ public function save(string $submitStatus = 'draft'): void
+ {
+ $pr = $this->persistDraft();
+
+ if (! $pr) {
+ return;
+ }
+
if ($submitStatus === 'review') {
$this->authorize('submitForReview', $pr);
@@ -1374,6 +1416,7 @@ new #[Layout('components.layouts.app'), Title('Neue Pressemitteilung')] class ex