PM-Vorschau: Firma & Pressekontakt zusammengeführt, Sprache als Badge am Portal

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-06-12 16:11:57 +00:00
parent cc7b3c3379
commit 284d029b29
3 changed files with 43 additions and 33 deletions

View file

@ -91,13 +91,11 @@ new class extends Component {
return; return;
} }
if (filled($this->newCopyright) && ! str_starts_with($this->newCopyright, __('Bild: KI-generiert'))) { if (filled($this->newCopyright) && !str_starts_with($this->newCopyright, __('Bild: KI-generiert'))) {
return; return;
} }
$this->newCopyright = filled($this->newLicenseDetail) $this->newCopyright = filled($this->newLicenseDetail) ? __('Bild: KI-generiert (:tool)', ['tool' => trim($this->newLicenseDetail)]) : __('Bild: KI-generiert');
? __('Bild: KI-generiert (:tool)', ['tool' => trim($this->newLicenseDetail)])
: __('Bild: KI-generiert');
} }
public function closeUploadForm(): void public function closeUploadForm(): void
@ -148,13 +146,9 @@ new class extends Component {
], ],
[ [
'newCopyright.required' => __('Bitte einen öffentlichen Bildnachweis angeben, z. B. Foto: Max Mustermann / Beispiel GmbH.'), 'newCopyright.required' => __('Bitte einen öffentlichen Bildnachweis angeben, z. B. Foto: Max Mustermann / Beispiel GmbH.'),
'newAuthor.required' => $isAiGenerated 'newAuthor.required' => $isAiGenerated ? __('Bitte angeben, wer für die Erstellung verantwortlich ist (Person oder Firma).') : __('Bitte Urheber, Fotograf oder Rechteinhaber angeben.'),
? __('Bitte angeben, wer für die Erstellung verantwortlich ist (Person oder Firma).')
: __('Bitte Urheber, Fotograf oder Rechteinhaber angeben.'),
'newLicenseType.required' => __('Bitte einen Lizenztyp wählen.'), 'newLicenseType.required' => __('Bitte einen Lizenztyp wählen.'),
'newLicenseDetail.required' => $isAiGenerated 'newLicenseDetail.required' => $isAiGenerated ? __('Bitte das verwendete KI-Tool angeben, z. B. Midjourney, Gemini, ChatGPT, DALL·E, Adobe Firefly.') : __('Bitte die Lizenz genauer angeben.'),
? __('Bitte das verwendete KI-Tool angeben, z. B. Midjourney v7.')
: __('Bitte die Lizenz genauer angeben.'),
'newLicenseUrl.required' => __('Für diesen Lizenztyp ist eine Nachweis-URL erforderlich.'), 'newLicenseUrl.required' => __('Für diesen Lizenztyp ist eine Nachweis-URL erforderlich.'),
'newPeopleRightsStatus.required' => __('Bitte angeben, ob erkennbare Personen abgebildet sind.'), 'newPeopleRightsStatus.required' => __('Bitte angeben, ob erkennbare Personen abgebildet sind.'),
'newPropertyRightsStatus.required' => __('Bitte angeben, ob Marken, Kunstwerke oder private Orte sichtbar sind.'), 'newPropertyRightsStatus.required' => __('Bitte angeben, ob Marken, Kunstwerke oder private Orte sichtbar sind.'),
@ -476,7 +470,8 @@ new class extends Component {
</div> </div>
<div class="grid gap-3 sm:grid-cols-2"> <div class="grid gap-3 sm:grid-cols-2">
<flux:input wire:model="newTitle" :label="__('Titel / Alt-Text (optional)')" /> <flux:input wire:model="newTitle" :label="__('Titel / Alt-Text (optional)')" />
<flux:input wire:model="newCopyright" :label="__('Öffentlicher Bildnachweis')" :badge="__('Pflicht')" <flux:input wire:model="newCopyright" :label="__('Öffentlicher Bildnachweis')"
:badge="__('Pflicht')"
:placeholder="__('Wird öffentlich angezeigt, z. B. Foto: Max Mustermann / Beispiel GmbH.')" :placeholder="__('Wird öffentlich angezeigt, z. B. Foto: Max Mustermann / Beispiel GmbH.')"
required /> required />
</div> </div>
@ -492,7 +487,8 @@ new class extends Component {
</div> </div>
<div class="grid gap-3 sm:grid-cols-2"> <div class="grid gap-3 sm:grid-cols-2">
<flux:input wire:model="newAuthor" <flux:input wire:model="newAuthor"
:label="$showsAiSection ? __('Verantwortlich für die Erstellung (Person/Firma)') : __('Urheber / Fotograf / Rechteinhaber')" :label="$showsAiSection ? __('Verantwortlich für die Erstellung (Person/Firma)') : __(
'Urheber / Fotograf / Rechteinhaber')"
:badge="__('Pflicht')" required /> :badge="__('Pflicht')" required />
<flux:select wire:model.live="newLicenseType" :label="__('Lizenztyp')" :badge="__('Pflicht')" <flux:select wire:model.live="newLicenseType" :label="__('Lizenztyp')" :badge="__('Pflicht')"
required> required>
@ -504,8 +500,9 @@ new class extends Component {
</div> </div>
@if ($showsAiSection) @if ($showsAiSection)
<flux:input wire:model.live.debounce.400ms="newLicenseDetail" :label="__('Verwendetes KI-Tool')" <flux:input wire:model.live.debounce.400ms="newLicenseDetail"
:badge="__('Pflicht')" placeholder="{{ __('z. B. Midjourney v7, DALL·E 3, Adobe Firefly') }}" :label="__('Verwendetes KI-Tool')" :badge="__('Pflicht')"
placeholder="{{ __('z. B. Midjourney, Gemini, ChatGPT, DALL·E, Adobe Firefly') }}"
required /> required />
<div <div

View file

@ -311,17 +311,34 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
<div class="grid gap-6 xl:grid-cols-2"> <div class="grid gap-6 xl:grid-cols-2">
<article class="panel"> <article class="panel">
<div class="panel-head"> <div class="panel-head">
<span class="section-eyebrow">{{ __('Zugeordnete Pressekontakte') }}</span> <span class="section-eyebrow">{{ __('Firma & Pressekontakt') }}</span>
</div>
<div class="p-5 space-y-4">
{{-- Firma der Pressemitteilung --}}
@if ($pr->company) @if ($pr->company)
<flux:button size="sm" variant="filled" icon="building-office" href="{{ route('me.press-kits.show', $pr->company->id) }}" wire:navigate> <div class="flex items-start gap-3 rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3">
{{ __('Firma') }} <div class="flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-[5px]
</flux:button> bg-[color:var(--color-hub-soft)] border border-[color:var(--color-hub-soft-2)] text-[color:var(--color-hub)]">
<flux:icon.building-office class="size-5" />
</div>
<div class="min-w-0 flex-1">
<div class="text-[13px] font-semibold text-[color:var(--color-ink)]">{{ $pr->company->name }}</div>
<div class="mt-0.5 flex flex-wrap gap-x-3 gap-y-1 text-[11.5px] text-[color:var(--color-ink-3)]">
@if ($pr->company->email)
<span>{{ $pr->company->email }}</span>
@endif
@if ($pr->company->phone)
<span>{{ $pr->company->phone }}</span>
@endif @endif
</div> </div>
<div class="p-5"> </div>
<p class="text-[12px] text-[color:var(--color-ink-3)] mt-0 mb-4"> <flux:button size="xs" variant="filled" href="{{ route('me.press-kits.show', $pr->company->id) }}" wire:navigate>
{{ __('Kontakte, die dieser Pressemitteilung zugeordnet sind.') }} {{ __('Firma öffnen') }}
</p> </flux:button>
</div>
@endif
{{-- Pressekontakt(e) direkt darunter --}}
<div class="space-y-2"> <div class="space-y-2">
@forelse ($contacts as $contact) @forelse ($contacts as $contact)
<div class="rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3"> <div class="rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3">
@ -407,8 +424,9 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
@endif @endif
<div class="rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3"> <div class="rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3">
<div class="text-[11px] uppercase tracking-[0.6px] text-[color:var(--color-ink-3)] font-semibold">{{ __('Portal') }}</div> <div class="text-[11px] uppercase tracking-[0.6px] text-[color:var(--color-ink-3)] font-semibold">{{ __('Portal') }}</div>
<div class="text-[13px] font-semibold text-[color:var(--color-ink)] mt-1"> <div class="mt-1 flex items-center gap-2">
{{ $pr->portal?->label() ?? '' }} <span class="text-[13px] font-semibold text-[color:var(--color-ink)]">{{ $pr->portal?->label() ?? '' }}</span>
<span class="badge hub">{{ strtoupper($pr->language) }}</span>
</div> </div>
</div> </div>
<div class="rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3"> <div class="rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3">
@ -417,12 +435,6 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
{{ $categoryName }} {{ $categoryName }}
</div> </div>
</div> </div>
<div class="rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3">
<div class="text-[11px] uppercase tracking-[0.6px] text-[color:var(--color-ink-3)] font-semibold">{{ __('Sprache') }}</div>
<div class="text-[13px] font-semibold text-[color:var(--color-ink)] mt-1">
{{ strtoupper($pr->language) }}
</div>
</div>
</div> </div>
@if (filled($pr->keywords)) @if (filled($pr->keywords))

View file

@ -290,7 +290,8 @@ test('customer press release detail shows assigned contacts and status history',
LivewireVolt::test('customer.press-releases.show', ['id' => $pressRelease->id]) LivewireVolt::test('customer.press-releases.show', ['id' => $pressRelease->id])
->assertSee('Alpha Detailmeldung') ->assertSee('Alpha Detailmeldung')
->assertSee('Status-Workflow') ->assertSee('Status-Workflow')
->assertSee('Zugeordnete Pressekontakte') ->assertSee('Firma & Pressekontakt')
->assertSee('Alpha GmbH')
->assertSee('Paula Presse') ->assertSee('Paula Presse')
->assertSee('paula@example.test') ->assertSee('paula@example.test')
->assertSee('Status & Verlauf') ->assertSee('Status & Verlauf')