modal() ->color('gray') ->modalHeading(__('filament::resources.actions.send_notifications')) ->icon('heroicon-o-bell') ->schema([ Select::make('users') ->label(__('filament::resources.inputs.users')) ->searchable() ->getSearchResultsUsing(fn (string $search): array => User::query()->where('username', 'like', "%{$search}%")->limit(50)->pluck('username', 'id')->toArray()) ->multiple() ->native(false) ->nullable(), TextInput::make('message') ->label(__('filament::resources.inputs.message')) ->maxLength(100) ->required(), TextInput::make('url') ->label(__('filament::resources.inputs.url')) ->nullable(), Toggle::make('as_staff') ->label(__('filament::resources.inputs.as_staff')) ->default(false), ]) ->action(function (array $data) { $users = collect($data['users'] ?? [])->values(); $senderId = $data['as_staff'] ? null : auth()->id(); if ($users->isEmpty()) { $users = User::pluck('id'); } $notifications = $users->map(fn ($id) => [ 'sender_id' => $senderId, 'recipient_id' => $id, 'type' => NotificationType::HousekeepingCustomMessage, 'message' => $data['message'], 'url' => $data['url'] ?? null, 'created_at' => now(), 'updated_at' => now(), ]); UserNotification::insert($notifications->toArray()); Notification::make()->body('Notification sent successfully.')->icon('heroicon-o-check-circle')->iconColor('success')->send(); }), CreateAction::make(), ]; } }