components([ Section::make(__('admin.users.sections.account')) ->columns(2) ->schema([ TextInput::make('name') ->label(__('admin.users.fields.name')) ->required() ->maxLength(255), TextInput::make('email') ->label(__('admin.users.fields.email')) ->email() ->required() ->unique(ignoreRecord: true) ->maxLength(255), Select::make('locale') ->label(__('admin.users.fields.locale')) ->options(self::localeOptions()) ->default('en') ->required(), Select::make('role') ->label(__('admin.users.fields.role')) ->options(UserRole::class) ->default(UserRole::USER->value) ->required(), FileUpload::make('avatar_url') ->label(__('admin.users.fields.avatar')) ->image() ->directory('avatars') ->visibility('public') ->maxSize(2048), TextInput::make('password') ->label(__('admin.users.fields.password')) ->password() ->revealable() ->rule(Password::default()) ->required(fn (string $operation): bool => $operation === 'create') ->formatStateUsing(fn (): ?string => null) ->dehydrated(fn ($state): bool => filled($state)) ->autocomplete('new-password'), DateTimePicker::make('email_verified_at') ->label(__('admin.users.fields.email_verified_at')), ]), Section::make(__('admin.users.sections.profile')) ->schema([ Textarea::make('bio') ->label(__('admin.users.fields.bio')) ->rows(4) ->columnSpanFull(), ]), ]); } /** * @return array */ private static function localeOptions(): array { $labels = __('admin.users.locales'); return collect(config('app.supported_locales', ['fr', 'en'])) ->mapWithKeys(fn (string $locale): array => [ $locale => is_array($labels) ? ($labels[$locale] ?? $locale) : $locale, ]) ->all(); } }