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;
}
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;
}
$this->newCopyright = filled($this->newLicenseDetail)
? __('Bild: KI-generiert (:tool)', ['tool' => trim($this->newLicenseDetail)])
: __('Bild: KI-generiert');
$this->newCopyright = filled($this->newLicenseDetail) ? __('Bild: KI-generiert (:tool)', ['tool' => trim($this->newLicenseDetail)]) : __('Bild: KI-generiert');
}
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.'),
'newAuthor.required' => $isAiGenerated
? __('Bitte angeben, wer für die Erstellung verantwortlich ist (Person oder Firma).')
: __('Bitte Urheber, Fotograf oder Rechteinhaber angeben.'),
'newAuthor.required' => $isAiGenerated ? __('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.'),
'newLicenseDetail.required' => $isAiGenerated
? __('Bitte das verwendete KI-Tool angeben, z. B. Midjourney v7.')
: __('Bitte die Lizenz genauer angeben.'),
'newLicenseDetail.required' => $isAiGenerated ? __('Bitte das verwendete KI-Tool angeben, z. B. Midjourney, Gemini, ChatGPT, DALL·E, Adobe Firefly.') : __('Bitte die Lizenz genauer angeben.'),
'newLicenseUrl.required' => __('Für diesen Lizenztyp ist eine Nachweis-URL erforderlich.'),
'newPeopleRightsStatus.required' => __('Bitte angeben, ob erkennbare Personen abgebildet sind.'),
'newPropertyRightsStatus.required' => __('Bitte angeben, ob Marken, Kunstwerke oder private Orte sichtbar sind.'),
@ -476,7 +470,8 @@ new class extends Component {
</div>
<div class="grid gap-3 sm:grid-cols-2">
<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.')"
required />
</div>
@ -492,7 +487,8 @@ new class extends Component {
</div>
<div class="grid gap-3 sm:grid-cols-2">
<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 />
<flux:select wire:model.live="newLicenseType" :label="__('Lizenztyp')" :badge="__('Pflicht')"
required>
@ -504,8 +500,9 @@ new class extends Component {
</div>
@if ($showsAiSection)
<flux:input wire:model.live.debounce.400ms="newLicenseDetail" :label="__('Verwendetes KI-Tool')"
:badge="__('Pflicht')" placeholder="{{ __('z. B. Midjourney v7, DALL·E 3, Adobe Firefly') }}"
<flux:input wire:model.live.debounce.400ms="newLicenseDetail"
:label="__('Verwendetes KI-Tool')" :badge="__('Pflicht')"
placeholder="{{ __('z. B. Midjourney, Gemini, ChatGPT, DALL·E, Adobe Firefly') }}"
required />
<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">
<article class="panel">
<div class="panel-head">
<span class="section-eyebrow">{{ __('Zugeordnete Pressekontakte') }}</span>
@if ($pr->company)
<flux:button size="sm" variant="filled" icon="building-office" href="{{ route('me.press-kits.show', $pr->company->id) }}" wire:navigate>
{{ __('Firma') }}
</flux:button>
@endif
<span class="section-eyebrow">{{ __('Firma & Pressekontakt') }}</span>
</div>
<div class="p-5">
<p class="text-[12px] text-[color:var(--color-ink-3)] mt-0 mb-4">
{{ __('Kontakte, die dieser Pressemitteilung zugeordnet sind.') }}
</p>
<div class="p-5 space-y-4">
{{-- Firma der Pressemitteilung --}}
@if ($pr->company)
<div class="flex items-start gap-3 rounded-[5px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] p-3">
<div class="flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-[5px]
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
</div>
</div>
<flux:button size="xs" variant="filled" href="{{ route('me.press-kits.show', $pr->company->id) }}" wire:navigate>
{{ __('Firma öffnen') }}
</flux:button>
</div>
@endif
{{-- Pressekontakt(e) direkt darunter --}}
<div class="space-y-2">
@forelse ($contacts as $contact)
<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
<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-[13px] font-semibold text-[color:var(--color-ink)] mt-1">
{{ $pr->portal?->label() ?? '' }}
<div class="mt-1 flex items-center gap-2">
<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 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 }}
</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>
@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])
->assertSee('Alpha Detailmeldung')
->assertSee('Status-Workflow')
->assertSee('Zugeordnete Pressekontakte')
->assertSee('Firma & Pressekontakt')
->assertSee('Alpha GmbH')
->assertSee('Paula Presse')
->assertSee('paula@example.test')
->assertSee('Status & Verlauf')