5.3: PressReleaseStatus::badgeClass() zentralisiert + toten statusColor-Code entfernt
Status-Badge-Farblogik (ok/warn/err/muted) aus 7 divergenten match-Bloecken in eine Enum-Methode gezogen. Archiviert/Entwurf jetzt konsistent 'muted' (grau) auch auf Detail-/Edit-/Log-Seiten (vorher dort 'hub'-Akzent). Toter statusColor-Block (Flux-Farben, nie referenziert) in customer/show entfernt. flux:badge :color in admin/users bleibt bewusst separat (eigenes Farbvokabular, Einzel-Call-Site). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
0e08d8acc4
commit
55d0804917
8 changed files with 43 additions and 58 deletions
|
|
@ -20,4 +20,19 @@ enum PressReleaseStatus: string
|
||||||
self::Archived => 'Archiviert',
|
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',
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -397,12 +397,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl
|
||||||
|
|
||||||
<div class="space-y-8 pr-editor-shell" x-data="{ tagInput: '' }">
|
<div class="space-y-8 pr-editor-shell" x-data="{ tagInput: '' }">
|
||||||
@php
|
@php
|
||||||
$statusClass = match ($currentStatus) {
|
$statusClass = $statusEnum?->badgeClass() ?? 'muted';
|
||||||
'published' => 'ok',
|
|
||||||
'review' => 'warn',
|
|
||||||
'rejected' => 'err',
|
|
||||||
default => 'hub',
|
|
||||||
};
|
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
{{-- Flash-Banner ersetzt durch <flux:toast /> im Layout. --}}
|
{{-- Flash-Banner ersetzt durch <flux:toast /> im Layout. --}}
|
||||||
|
|
|
||||||
|
|
@ -820,13 +820,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten
|
||||||
'rejected' => 'is-row-err',
|
'rejected' => 'is-row-err',
|
||||||
default => '',
|
default => '',
|
||||||
};
|
};
|
||||||
$badgeClass = match ($status) {
|
$badgeClass = $pr->status->badgeClass();
|
||||||
'published' => 'ok',
|
|
||||||
'review' => 'warn',
|
|
||||||
'rejected' => 'err',
|
|
||||||
'archived', 'draft' => 'muted',
|
|
||||||
default => 'hub',
|
|
||||||
};
|
|
||||||
$portal = $pr->portal?->value ?? 'both';
|
$portal = $pr->portal?->value ?? 'both';
|
||||||
$showPe = in_array($portal, ['presseecho', 'both'], true);
|
$showPe = in_array($portal, ['presseecho', 'both'], true);
|
||||||
$showBp = in_array($portal, ['businessportal24', 'both'], true);
|
$showBp = in_array($portal, ['businessportal24', 'both'], true);
|
||||||
|
|
|
||||||
|
|
@ -116,12 +116,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
|
||||||
|
|
||||||
<div class="space-y-8">
|
<div class="space-y-8">
|
||||||
@php
|
@php
|
||||||
$statusClass = match ($pr->status->value) {
|
$statusClass = $pr->status->badgeClass();
|
||||||
'published' => 'ok',
|
|
||||||
'review' => 'warn',
|
|
||||||
'rejected' => 'err',
|
|
||||||
default => 'hub',
|
|
||||||
};
|
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
{{-- Flash-Banner ersetzt durch <flux:toast /> im Layout. --}}
|
{{-- Flash-Banner ersetzt durch <flux:toast /> im Layout. --}}
|
||||||
|
|
@ -429,12 +424,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
|
||||||
<li class="text-[12.5px]">
|
<li class="text-[12.5px]">
|
||||||
<div class="flex flex-wrap items-center gap-2">
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
@php
|
@php
|
||||||
$logClass = match ($log->to_status?->value) {
|
$logClass = $log->to_status?->badgeClass() ?? 'muted';
|
||||||
'published' => 'ok',
|
|
||||||
'review' => 'warn',
|
|
||||||
'rejected' => 'err',
|
|
||||||
default => 'hub',
|
|
||||||
};
|
|
||||||
@endphp
|
@endphp
|
||||||
<span @class(['badge', $logClass])>{{ $log->to_status?->label() ?? $log->to_status }}</span>
|
<span @class(['badge', $logClass])>{{ $log->to_status?->label() ?? $log->to_status }}</span>
|
||||||
@if ($log->from_status)
|
@if ($log->from_status)
|
||||||
|
|
|
||||||
|
|
@ -323,13 +323,7 @@ new #[Layout('components.layouts.app'), Title('Mein Dashboard')] class extends C
|
||||||
|
|
||||||
@forelse ($recent as $pr)
|
@forelse ($recent as $pr)
|
||||||
@php
|
@php
|
||||||
$badgeClass = match ($pr->status->value) {
|
$badgeClass = $pr->status->badgeClass();
|
||||||
'published' => 'ok',
|
|
||||||
'review' => 'warn',
|
|
||||||
'rejected' => 'err',
|
|
||||||
'archived', 'draft' => 'muted',
|
|
||||||
default => 'hub',
|
|
||||||
};
|
|
||||||
$portal = $pr->portal?->value ?? 'both';
|
$portal = $pr->portal?->value ?? 'both';
|
||||||
$showPe = in_array($portal, ['presseecho', 'both'], true);
|
$showPe = in_array($portal, ['presseecho', 'both'], true);
|
||||||
$showBp = in_array($portal, ['businessportal24', 'both'], true);
|
$showBp = in_array($portal, ['businessportal24', 'both'], true);
|
||||||
|
|
|
||||||
|
|
@ -432,13 +432,7 @@ new #[Layout('components.layouts.app'), Title('Meine Pressemitteilungen')] class
|
||||||
'rejected' => 'is-row-err',
|
'rejected' => 'is-row-err',
|
||||||
default => '',
|
default => '',
|
||||||
};
|
};
|
||||||
$badgeClass = match ($status) {
|
$badgeClass = $pr->status->badgeClass();
|
||||||
'published' => 'ok',
|
|
||||||
'review' => 'warn',
|
|
||||||
'rejected' => 'err',
|
|
||||||
'archived', 'draft' => 'muted',
|
|
||||||
default => 'hub',
|
|
||||||
};
|
|
||||||
$portal = $pr->portal?->value ?? 'both';
|
$portal = $pr->portal?->value ?? 'both';
|
||||||
$showPe = in_array($portal, ['presseecho', 'both'], true);
|
$showPe = in_array($portal, ['presseecho', 'both'], true);
|
||||||
$showBp = in_array($portal, ['businessportal24', 'both'], true);
|
$showBp = in_array($portal, ['businessportal24', 'both'], true);
|
||||||
|
|
|
||||||
|
|
@ -189,13 +189,6 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
|
||||||
'latestRejection' => $latestRejection,
|
'latestRejection' => $latestRejection,
|
||||||
'contacts' => $pr->contacts,
|
'contacts' => $pr->contacts,
|
||||||
'statusLogs' => $pr->statusLogs,
|
'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
|
||||||
|
|
||||||
<div class="space-y-8">
|
<div class="space-y-8">
|
||||||
@php
|
@php
|
||||||
$statusClass = match ($pr->status->value) {
|
$statusClass = $pr->status->badgeClass();
|
||||||
'published' => 'ok',
|
|
||||||
'review' => 'warn',
|
|
||||||
'rejected' => 'err',
|
|
||||||
default => 'hub',
|
|
||||||
};
|
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
{{-- Flash-Banner ersetzt durch <flux:toast /> im Layout. --}}
|
{{-- Flash-Banner ersetzt durch <flux:toast /> im Layout. --}}
|
||||||
|
|
@ -741,12 +729,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
|
||||||
<li class="text-[12.5px]">
|
<li class="text-[12.5px]">
|
||||||
<div class="flex flex-wrap items-center gap-2">
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
@php
|
@php
|
||||||
$logClass = match ($log->to_status?->value) {
|
$logClass = $log->to_status?->badgeClass() ?? 'muted';
|
||||||
'published' => 'ok',
|
|
||||||
'review' => 'warn',
|
|
||||||
'rejected' => 'err',
|
|
||||||
default => 'hub',
|
|
||||||
};
|
|
||||||
@endphp
|
@endphp
|
||||||
<span @class(['badge', $logClass])>{{ $log->to_status?->label() }}</span>
|
<span @class(['badge', $logClass])>{{ $log->to_status?->label() }}</span>
|
||||||
<span class="text-[11.5px] text-[color:var(--color-ink-3)]">
|
<span class="text-[11.5px] text-[color:var(--color-ink-3)]">
|
||||||
|
|
|
||||||
20
tests/Unit/PressReleaseStatusBadgeClassTest.php
Normal file
20
tests/Unit/PressReleaseStatusBadgeClassTest.php
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Enums\PressReleaseStatus;
|
||||||
|
|
||||||
|
test('active statuses map to their accent badge class', function () {
|
||||||
|
expect(PressReleaseStatus::Published->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']);
|
||||||
|
}
|
||||||
|
});
|
||||||
Loading…
Add table
Add a link
Reference in a new issue