columns([ ImageColumn::make('picture') ->visibleFrom('lg') ->label('') ->circular() ->alignCenter() ->defaultImageUrl(fn (User $user) => Filament::getUserAvatarUrl($user)), TextColumn::make('username') ->label(trans('admin/user.username')), TextColumn::make('email') ->label(trans('admin/user.email')) ->icon('tabler-mail'), IconColumn::make('use_totp') ->label('2FA') ->visibleFrom('lg') ->icon(fn (User $user) => $user->use_totp ? 'tabler-lock' : 'tabler-lock-open-off') ->boolean(), TextColumn::make('roles.name') ->label(trans('admin/user.roles')) ->badge() ->icon('tabler-users-group') ->placeholder(trans('admin/user.no_roles')), TextColumn::make('servers_count') ->counts('servers') ->icon('tabler-server') ->label(trans('admin/user.servers')), TextColumn::make('subusers_count') ->visibleFrom('sm') ->label(trans('admin/user.subusers')) ->counts('subusers') ->icon('tabler-users'), ]) ->actions([ ViewAction::make() ->hidden(fn ($record) => static::canEdit($record)), EditAction::make(), ]) ->checkIfRecordIsSelectableUsing(fn (User $user) => auth()->user()->id !== $user->id && !$user->servers_count) ->groupedBulkActions([ DeleteBulkAction::make(), ]); } public static function form(Form $form): Form { return $form ->columns(['default' => 1, 'lg' => 3]) ->schema([ TextInput::make('username') ->label(trans('admin/user.username')) ->alphaNum() ->required() ->unique(ignoreRecord: true) ->minLength(3) ->maxLength(255), TextInput::make('email') ->label(trans('admin/user.email')) ->email() ->required() ->unique(ignoreRecord: true) ->maxLength(255), TextInput::make('password') ->label(trans('admin/user.password')) ->hintIcon(fn ($operation) => $operation === 'create' ? 'tabler-question-mark' : null) ->hintIconTooltip(fn ($operation) => $operation === 'create' ? trans('admin/user.password_help') : null) ->password(), CheckboxList::make('roles') ->hidden(fn (User $user) => $user->isRootAdmin()) ->relationship('roles', 'name', fn (Builder $query) => $query->whereNot('id', Role::getRootAdmin()->id)) ->saveRelationshipsUsing(fn (User $user, array $state) => $user->syncRoles(collect($state)->map(fn ($role) => Role::findById($role)))) ->dehydrated() ->label(trans('admin/user.admin_roles')) ->columnSpanFull() ->bulkToggleable(false), CheckboxList::make('root_admin_role') ->visible(fn (User $user) => $user->isRootAdmin()) ->disabled() ->options([ 'root_admin' => Role::ROOT_ADMIN, ]) ->descriptions([ 'root_admin' => trans('admin/role.root_admin', ['role' => Role::ROOT_ADMIN]), ]) ->formatStateUsing(fn () => ['root_admin']) ->dehydrated(false) ->label(trans('admin/user.admin_roles')) ->columnSpanFull(), ]); } public static function getRelations(): array { return [ RelationManagers\ServersRelationManager::class, ]; } public static function getPages(): array { return [ 'index' => Pages\ListUsers::route('/'), 'create' => Pages\CreateUser::route('/create'), 'view' => Pages\ViewUser::route('/{record}'), 'edit' => Pages\EditUser::route('/{record}/edit'), ]; } }