From ee6fb7a5bb0f5183888119ddac0065778a781648 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Fri, 23 Jan 2026 17:13:10 +0100 Subject: [PATCH] Fix event naming and checklist labels --- app/Filament/Resources/EventResource.php | 27 +++++++++- .../Api/Tenant/EventController.php | 53 +++++++++++++++++-- .../js/admin/i18n/locales/de/management.json | 2 +- .../js/admin/i18n/locales/en/management.json | 2 +- tests/Feature/EventControllerTest.php | 3 +- 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/app/Filament/Resources/EventResource.php b/app/Filament/Resources/EventResource.php index 8dbecc1..af266ca 100644 --- a/app/Filament/Resources/EventResource.php +++ b/app/Filament/Resources/EventResource.php @@ -109,8 +109,9 @@ class EventResource extends Resource ->columns([ Tables\Columns\TextColumn::make('id')->sortable(), Tables\Columns\TextColumn::make('tenant.name')->label(__('admin.events.table.tenant'))->searchable(), - Tables\Columns\TextColumn::make('name.de') + Tables\Columns\TextColumn::make('name') ->label(__('admin.events.fields.name')) + ->formatStateUsing(fn (mixed $state): string => static::formatEventName($state)) ->limit(30), Tables\Columns\TextColumn::make('slug')->searchable(), Tables\Columns\TextColumn::make('date')->date(), @@ -278,6 +279,30 @@ class EventResource extends Resource ]; } + /** + * @param array|string|null $name + */ + private static function formatEventName(mixed $name): string + { + if (is_array($name)) { + $candidates = [ + $name['de'] ?? null, + $name['en'] ?? null, + reset($name) ?: null, + ]; + + foreach ($candidates as $candidate) { + if (is_string($candidate) && $candidate !== '') { + return $candidate; + } + } + + return ''; + } + + return is_string($name) ? $name : ''; + } + public static function getPages(): array { return [ diff --git a/app/Http/Controllers/Api/Tenant/EventController.php b/app/Http/Controllers/Api/Tenant/EventController.php index 48400b6..83d6717 100644 --- a/app/Http/Controllers/Api/Tenant/EventController.php +++ b/app/Http/Controllers/Api/Tenant/EventController.php @@ -161,11 +161,13 @@ class EventController extends Controller ]); } + $resolvedName = $this->resolveEventNameString($validated['name']); $eventData = array_merge($validated, [ 'tenant_id' => $tenantId, 'status' => $validated['status'] ?? 'draft', - 'slug' => $this->generateUniqueSlug($validated['name'], $tenantId), + 'slug' => $this->generateUniqueSlug($resolvedName, $tenantId), ]); + $eventData['name'] = $this->normalizeEventName($validated['name']); if (isset($eventData['event_date'])) { $eventData['date'] = $eventData['event_date']; @@ -228,7 +230,7 @@ class EventController extends Controller ]); if ($billingIsReseller && ! $isSuperAdmin) { - $note = sprintf('Event #%d created (%s)', $event->id, $event->name); + $note = sprintf('Event #%d created (%s)', $event->id, $this->resolveEventNameString($event->name)); if (! $tenant->consumeEventAllowanceFor($eventServicePackage->slug, 1, 'event.create', $note)) { throw new HttpException(402, 'Insufficient package allowance.'); @@ -404,9 +406,13 @@ class EventController extends Controller unset($validated['event_date']); } - if ($nameProvided && $validated['name'] !== $event->name) { - $validated['slug'] = $this->generateUniqueSlug($validated['name'], $tenantId, $event->id); + $currentName = $this->resolveEventNameString($event->name); + $nextName = $this->resolveEventNameString($validated['name']); + + if ($nameProvided && $nextName !== $currentName) { + $validated['slug'] = $this->generateUniqueSlug($nextName, $tenantId, $event->id); } + $validated['name'] = $this->normalizeEventName($validated['name']); foreach (['password', 'password_confirmation', 'password_protected'] as $unused) { unset($validated[$unused]); @@ -935,6 +941,45 @@ class EventController extends Controller return $slug; } + /** + * @param array|string|null $name + * @return array + */ + private function normalizeEventName(mixed $name): array + { + if (is_array($name)) { + return $name; + } + + $value = is_string($name) ? trim($name) : ''; + + return ['de' => $value]; + } + + /** + * @param array|string|null $name + */ + private function resolveEventNameString(mixed $name): string + { + if (is_array($name)) { + $candidates = [ + $name['de'] ?? null, + $name['en'] ?? null, + reset($name) ?: null, + ]; + + foreach ($candidates as $candidate) { + if (is_string($candidate) && $candidate !== '') { + return $candidate; + } + } + + return ''; + } + + return is_string($name) ? $name : ''; + } + public function search(Request $request): AnonymousResourceCollection { $tenantId = $request->attributes->get('tenant_id'); diff --git a/resources/js/admin/i18n/locales/de/management.json b/resources/js/admin/i18n/locales/de/management.json index a3400a3..2fa4174 100644 --- a/resources/js/admin/i18n/locales/de/management.json +++ b/resources/js/admin/i18n/locales/de/management.json @@ -445,7 +445,7 @@ "editTitle": "Event bearbeiten", "createTitle": "Neues Event erstellen", "name": "Eventname", - "date": "Datum & Uhrzeit", + "date": "Datum & Ort", "description": "Optionale Details", "descriptionPlaceholder": "Beschreibung", "location": "Ort", diff --git a/resources/js/admin/i18n/locales/en/management.json b/resources/js/admin/i18n/locales/en/management.json index dbbcec0..6a1dcee 100644 --- a/resources/js/admin/i18n/locales/en/management.json +++ b/resources/js/admin/i18n/locales/en/management.json @@ -441,7 +441,7 @@ "editTitle": "Edit event", "createTitle": "Create new event", "name": "Event name", - "date": "Date & time", + "date": "Date & location", "description": "Optional details", "descriptionPlaceholder": "Description", "location": "Location", diff --git a/tests/Feature/EventControllerTest.php b/tests/Feature/EventControllerTest.php index 0f82f72..8c54530 100644 --- a/tests/Feature/EventControllerTest.php +++ b/tests/Feature/EventControllerTest.php @@ -48,7 +48,7 @@ class EventControllerTest extends TenantTestCase $this->assertDatabaseHas('events', [ 'tenant_id' => $tenant->id, - 'name' => json_encode('Test Event'), + 'name' => json_encode(['de' => 'Test Event']), 'slug' => 'test-event', 'event_type_id' => $eventType->id, ]); @@ -293,6 +293,7 @@ class EventControllerTest extends TenantTestCase $event->refresh(); $settings = $event->settings; + $this->assertSame(['de' => 'Live Show Event'], $event->name); $this->assertSame('manual', data_get($settings, 'live_show.moderation_mode')); $this->assertSame(12, data_get($settings, 'live_show.retention_window_hours')); $this->assertSame('balanced', data_get($settings, 'live_show.playback_mode'));