diff --git a/app/Enums/PressReleaseStatus.php b/app/Enums/PressReleaseStatus.php index c037e497..9d391862 100644 --- a/app/Enums/PressReleaseStatus.php +++ b/app/Enums/PressReleaseStatus.php @@ -20,4 +20,19 @@ enum PressReleaseStatus: string self::Archived => 'Archiviert', }; } + + /** + * CSS-Badge-Modifier für die Status-Darstellung (siehe `.badge`-Klassen im + * Hub-CSS). Neutrale Zustände (Entwurf/Archiviert) werden bewusst grau + * abgesetzt (`muted`), aktive Zustände farblich hervorgehoben. + */ + public function badgeClass(): string + { + return match ($this) { + self::Published => 'ok', + self::Review => 'warn', + self::Rejected => 'err', + self::Draft, self::Archived => 'muted', + }; + } } diff --git a/resources/views/livewire/admin/press-releases/edit.blade.php b/resources/views/livewire/admin/press-releases/edit.blade.php index 97a5745d..69cb3e44 100644 --- a/resources/views/livewire/admin/press-releases/edit.blade.php +++ b/resources/views/livewire/admin/press-releases/edit.blade.php @@ -397,12 +397,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl
@php - $statusClass = match ($currentStatus) { - 'published' => 'ok', - 'review' => 'warn', - 'rejected' => 'err', - default => 'hub', - }; + $statusClass = $statusEnum?->badgeClass() ?? 'muted'; @endphp {{-- Flash-Banner ersetzt durch im Layout. --}} diff --git a/resources/views/livewire/admin/press-releases/index.blade.php b/resources/views/livewire/admin/press-releases/index.blade.php index 0cd3ad29..6a943bc1 100644 --- a/resources/views/livewire/admin/press-releases/index.blade.php +++ b/resources/views/livewire/admin/press-releases/index.blade.php @@ -820,13 +820,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten 'rejected' => 'is-row-err', default => '', }; - $badgeClass = match ($status) { - 'published' => 'ok', - 'review' => 'warn', - 'rejected' => 'err', - 'archived', 'draft' => 'muted', - default => 'hub', - }; + $badgeClass = $pr->status->badgeClass(); $portal = $pr->portal?->value ?? 'both'; $showPe = in_array($portal, ['presseecho', 'both'], true); $showBp = in_array($portal, ['businessportal24', 'both'], true); diff --git a/resources/views/livewire/admin/press-releases/show.blade.php b/resources/views/livewire/admin/press-releases/show.blade.php index 46b19083..b624c27c 100644 --- a/resources/views/livewire/admin/press-releases/show.blade.php +++ b/resources/views/livewire/admin/press-releases/show.blade.php @@ -116,12 +116,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
@php - $statusClass = match ($pr->status->value) { - 'published' => 'ok', - 'review' => 'warn', - 'rejected' => 'err', - default => 'hub', - }; + $statusClass = $pr->status->badgeClass(); @endphp {{-- Flash-Banner ersetzt durch im Layout. --}} @@ -429,12 +424,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
  • @php - $logClass = match ($log->to_status?->value) { - 'published' => 'ok', - 'review' => 'warn', - 'rejected' => 'err', - default => 'hub', - }; + $logClass = $log->to_status?->badgeClass() ?? 'muted'; @endphp {{ $log->to_status?->label() ?? $log->to_status }} @if ($log->from_status) diff --git a/resources/views/livewire/customer/dashboard.blade.php b/resources/views/livewire/customer/dashboard.blade.php index 7c9b7955..0725c9eb 100644 --- a/resources/views/livewire/customer/dashboard.blade.php +++ b/resources/views/livewire/customer/dashboard.blade.php @@ -323,13 +323,7 @@ new #[Layout('components.layouts.app'), Title('Mein Dashboard')] class extends C @forelse ($recent as $pr) @php - $badgeClass = match ($pr->status->value) { - 'published' => 'ok', - 'review' => 'warn', - 'rejected' => 'err', - 'archived', 'draft' => 'muted', - default => 'hub', - }; + $badgeClass = $pr->status->badgeClass(); $portal = $pr->portal?->value ?? 'both'; $showPe = in_array($portal, ['presseecho', 'both'], true); $showBp = in_array($portal, ['businessportal24', 'both'], true); diff --git a/resources/views/livewire/customer/press-releases/index.blade.php b/resources/views/livewire/customer/press-releases/index.blade.php index 03e43522..dd2df8a0 100644 --- a/resources/views/livewire/customer/press-releases/index.blade.php +++ b/resources/views/livewire/customer/press-releases/index.blade.php @@ -432,13 +432,7 @@ new #[Layout('components.layouts.app'), Title('Meine Pressemitteilungen')] class 'rejected' => 'is-row-err', default => '', }; - $badgeClass = match ($status) { - 'published' => 'ok', - 'review' => 'warn', - 'rejected' => 'err', - 'archived', 'draft' => 'muted', - default => 'hub', - }; + $badgeClass = $pr->status->badgeClass(); $portal = $pr->portal?->value ?? 'both'; $showPe = in_array($portal, ['presseecho', 'both'], true); $showBp = in_array($portal, ['businessportal24', 'both'], true); diff --git a/resources/views/livewire/customer/press-releases/show.blade.php b/resources/views/livewire/customer/press-releases/show.blade.php index 7a356508..c7b675d4 100644 --- a/resources/views/livewire/customer/press-releases/show.blade.php +++ b/resources/views/livewire/customer/press-releases/show.blade.php @@ -189,13 +189,6 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends 'latestRejection' => $latestRejection, 'contacts' => $pr->contacts, 'statusLogs' => $pr->statusLogs, - 'statusColor' => match($pr->status->value) { - 'published' => 'green', - 'review' => 'yellow', - 'rejected' => 'red', - 'archived' => 'blue', - default => 'zinc', - }, ]; } @@ -273,12 +266,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
    @php - $statusClass = match ($pr->status->value) { - 'published' => 'ok', - 'review' => 'warn', - 'rejected' => 'err', - default => 'hub', - }; + $statusClass = $pr->status->badgeClass(); @endphp {{-- Flash-Banner ersetzt durch im Layout. --}} @@ -741,12 +729,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
  • @php - $logClass = match ($log->to_status?->value) { - 'published' => 'ok', - 'review' => 'warn', - 'rejected' => 'err', - default => 'hub', - }; + $logClass = $log->to_status?->badgeClass() ?? 'muted'; @endphp {{ $log->to_status?->label() }} diff --git a/tests/Unit/PressReleaseStatusBadgeClassTest.php b/tests/Unit/PressReleaseStatusBadgeClassTest.php new file mode 100644 index 00000000..bceffcaf --- /dev/null +++ b/tests/Unit/PressReleaseStatusBadgeClassTest.php @@ -0,0 +1,20 @@ +badgeClass())->toBe('ok') + ->and(PressReleaseStatus::Review->badgeClass())->toBe('warn') + ->and(PressReleaseStatus::Rejected->badgeClass())->toBe('err'); +}); + +test('neutral statuses are muted', function () { + expect(PressReleaseStatus::Draft->badgeClass())->toBe('muted') + ->and(PressReleaseStatus::Archived->badgeClass())->toBe('muted'); +}); + +test('every status resolves to a badge class', function () { + foreach (PressReleaseStatus::cases() as $status) { + expect($status->badgeClass())->toBeIn(['ok', 'warn', 'err', 'muted']); + } +});