From 69395efa53388d66d6ba061cb56a57b70c9c1aaa Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Fri, 19 Jun 2026 13:15:38 +0000 Subject: [PATCH] Optimierung 5.3 (Teil 1): Contact::displayName() Anzeigename eines Kontakts (Vor-/Nachname mit Fallback) als Model-Methode. Ersetzt die identische Inline-Logik an 6 eindeutigen Relation-$contact-Stellen (Admin: Benutzer-/PM-/Firmen-Detail; Kunde: Press-Kit-/PM-Detail). Bewusst noch offen: Select-/toBase-Varianten ($contactOption/$contactResult/ $lookupContact, stdClass-Risiko) sowie web/release-detail (User-Frontend). Test: ContactDisplayNameTest. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/Models/Contact.php | 11 ++++++++++ .../livewire/admin/companies/show.blade.php | 2 +- .../admin/press-releases/show.blade.php | 2 +- .../views/livewire/admin/users.blade.php | 2 +- .../views/livewire/admin/users/show.blade.php | 2 +- .../customer/press-kits/show.blade.php | 2 +- .../customer/press-releases/show.blade.php | 2 +- tests/Feature/ContactDisplayNameTest.php | 21 +++++++++++++++++++ 8 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 tests/Feature/ContactDisplayNameTest.php diff --git a/app/Models/Contact.php b/app/Models/Contact.php index a4294034..1493fa87 100644 --- a/app/Models/Contact.php +++ b/app/Models/Contact.php @@ -63,6 +63,17 @@ class Contact extends Model return $this->belongsTo(Company::class); } + /** + * Anzeigename eines Kontakts (Vor- + Nachname), mit Fallback, wenn beides + * leer ist. Single Source of Truth für die Listen-/Detail-Ansichten. + */ + public function displayName(): string + { + $name = trim(($this->first_name ?? '').' '.($this->last_name ?? '')); + + return $name !== '' ? $name : __('Kontakt ohne Name'); + } + public function pressReleases(): BelongsToMany { return $this->belongsToMany(PressRelease::class, 'press_release_contact'); diff --git a/resources/views/livewire/admin/companies/show.blade.php b/resources/views/livewire/admin/companies/show.blade.php index 9c5c1c7b..ef4ed68f 100644 --- a/resources/views/livewire/admin/companies/show.blade.php +++ b/resources/views/livewire/admin/companies/show.blade.php @@ -434,7 +434,7 @@ new #[Layout('components.layouts.app'), Title('Firma anzeigen')] class extends C
- {{ trim(($contact->first_name ?? '').' '.($contact->last_name ?? '')) ?: __('Kontakt ohne Name') }} + {{ $contact->displayName() }} {{ $contact->portal?->label() ?? __('Unbekannt') }}
diff --git a/resources/views/livewire/admin/press-releases/show.blade.php b/resources/views/livewire/admin/press-releases/show.blade.php index ca26e667..46b19083 100644 --- a/resources/views/livewire/admin/press-releases/show.blade.php +++ b/resources/views/livewire/admin/press-releases/show.blade.php @@ -339,7 +339,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends @forelse ($contacts as $contact)
- {{ trim(($contact->first_name ?? '').' '.($contact->last_name ?? '')) ?: __('Kontakt ohne Name') }} + {{ $contact->displayName() }}
{{ $contact->responsibility ?: __('Keine Rolle hinterlegt') }} diff --git a/resources/views/livewire/admin/users.blade.php b/resources/views/livewire/admin/users.blade.php index 11c1f222..12ba72ef 100644 --- a/resources/views/livewire/admin/users.blade.php +++ b/resources/views/livewire/admin/users.blade.php @@ -865,7 +865,7 @@ new #[Layout('components.layouts.app'), Title('Benutzer')] class extends Compone
- {{ trim(($contact->first_name ?? '').' '.($contact->last_name ?? '')) ?: __('Kontakt ohne Name') }} + {{ $contact->displayName() }} {{ $contact->responsibility ?? __('Keine Rolle hinterlegt') }} diff --git a/resources/views/livewire/admin/users/show.blade.php b/resources/views/livewire/admin/users/show.blade.php index 8bfead6c..3c5a4731 100644 --- a/resources/views/livewire/admin/users/show.blade.php +++ b/resources/views/livewire/admin/users/show.blade.php @@ -203,7 +203,7 @@ new #[Layout('components.layouts.app'), Title('Benutzer anzeigen')] class extend
- {{ trim(($contact->first_name ?? '').' '.($contact->last_name ?? '')) ?: __('Kontakt ohne Name') }} + {{ $contact->displayName() }}
{{ $contact->responsibility ?? __('Keine Rolle hinterlegt') }} diff --git a/resources/views/livewire/customer/press-kits/show.blade.php b/resources/views/livewire/customer/press-kits/show.blade.php index d6f24bec..bea80360 100644 --- a/resources/views/livewire/customer/press-kits/show.blade.php +++ b/resources/views/livewire/customer/press-kits/show.blade.php @@ -584,7 +584,7 @@ new #[Layout('components.layouts.app'), Title('Firma')] class extends Component
- {{ trim(($contact->first_name ?? '').' '.($contact->last_name ?? '')) ?: __('Kontakt ohne Name') }} + {{ $contact->displayName() }}
{{ $contact->responsibility ?: __('Keine Rolle hinterlegt') }} diff --git a/resources/views/livewire/customer/press-releases/show.blade.php b/resources/views/livewire/customer/press-releases/show.blade.php index 1cbd5da6..7a356508 100644 --- a/resources/views/livewire/customer/press-releases/show.blade.php +++ b/resources/views/livewire/customer/press-releases/show.blade.php @@ -611,7 +611,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends @forelse ($contacts as $contact)
- {{ trim(($contact->first_name ?? '').' '.($contact->last_name ?? '')) ?: __('Kontakt ohne Name') }} + {{ $contact->displayName() }}
{{ $contact->responsibility ?: __('Keine Rolle hinterlegt') }} diff --git a/tests/Feature/ContactDisplayNameTest.php b/tests/Feature/ContactDisplayNameTest.php new file mode 100644 index 00000000..44d226de --- /dev/null +++ b/tests/Feature/ContactDisplayNameTest.php @@ -0,0 +1,21 @@ +make(['first_name' => 'Erika', 'last_name' => 'Mustermann']); + + expect($contact->displayName())->toBe('Erika Mustermann'); +}); + +test('displayName trims a missing part', function () { + $contact = Contact::factory()->make(['first_name' => null, 'last_name' => 'Mustermann']); + + expect($contact->displayName())->toBe('Mustermann'); +}); + +test('displayName falls back when both names are empty', function () { + $contact = Contact::factory()->make(['first_name' => null, 'last_name' => null]); + + expect($contact->displayName())->toBe(__('Kontakt ohne Name')); +});