defaultSort('name') ->columns([ ImageColumn::make('avatar_url') ->label('') ->circular() ->defaultImageUrl(fn (User $record) => 'https://ui-avatars.com/api/?name='.urlencode($record->name)), TextColumn::make('name') ->label(__('panel.users.fields.name')) ->description(fn (User $record) => $record->email) ->searchable(['name', 'email']) ->sortable(), TextColumn::make('roles.name') ->label(__('panel.users.fields.roles')) ->badge() ->color(fn (string $state) => $state === 'super_admin' ? 'danger' : 'primary') ->placeholder('—'), TextColumn::make('locale') ->label(__('panel.users.fields.locale')) ->formatStateUsing(fn (?string $state) => $state ? (config("locales.supported.{$state}.native") ?? $state) : '—') ->toggleable(), IconColumn::make('is_active') ->label(__('panel.users.fields.is_active')) ->boolean() ->sortable(), TextColumn::make('last_login_at') ->label(__('panel.users.fields.last_login_at')) ->dateTime() ->since() ->placeholder(__('panel.users.fields.never')) ->sortable(), ]) ->filters([ SelectFilter::make('roles') ->label(__('panel.users.fields.roles')) ->relationship('roles', 'name') ->multiple() ->preload(), TernaryFilter::make('is_active') ->label(__('panel.users.fields.is_active')), ]) ->recordActions([ Action::make('toggleActive') ->label(fn (User $record) => $record->is_active ? __('panel.users.actions.deactivate') : __('panel.users.actions.activate')) ->icon(fn (User $record) => $record->is_active ? 'heroicon-o-lock-closed' : 'heroicon-o-lock-open') ->color(fn (User $record) => $record->is_active ? 'danger' : 'success') ->requiresConfirmation() // Locking yourself out mid-session is never the intent. ->visible(fn (User $record) => $record->id !== Auth::id() && Auth::user()?->can('update', $record)) ->action(fn (User $record) => $record->update(['is_active' => ! $record->is_active])), EditAction::make(), ]); } }