components([ Section::make() ->schema([ Select::make('range') ->label(__('admin.join_token_analytics.filters.range')) ->options(trans('admin.join_token_analytics.filters.range_options')) ->default('24h') ->native(false), Select::make('event_id') ->label(__('admin.join_token_analytics.filters.event')) ->placeholder(__('admin.join_token_analytics.filters.event_placeholder')) ->searchable() ->getSearchResultsUsing(fn (string $search): array => $this->searchEvents($search)) ->getOptionLabelUsing(fn ($value): ?string => $this->resolveEventLabel($value)) ->native(false), ]) ->columns(2), ]); } private function searchEvents(string $search): array { return Event::query() ->with('tenant') ->when($search !== '', function ($query) use ($search) { $query->where('slug', 'like', "%{$search}%") ->orWhere('name->de', 'like', "%{$search}%") ->orWhere('name->en', 'like', "%{$search}%"); }) ->orderByDesc('date') ->limit(25) ->get() ->mapWithKeys(fn (Event $event) => [$event->id => $this->formatEventLabel($event)]) ->all(); } private function resolveEventLabel(mixed $value): ?string { if (! is_numeric($value)) { return null; } $event = Event::query() ->with('tenant') ->find((int) $value); return $event ? $this->formatEventLabel($event) : null; } private function formatEventLabel(Event $event): string { $locale = app()->getLocale(); $name = $event->name[$locale] ?? $event->name['de'] ?? $event->name['en'] ?? $event->slug ?? __('admin.common.unnamed'); $tenant = $event->tenant?->name ?? __('admin.common.unnamed'); $date = $event->date?->format('Y-m-d'); return $date ? "{$name} ({$tenant}) {$date}" : "{$name} ({$tenant})"; } }