86 lines
3.4 KiB
PHP
86 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\Users\Schemas;
|
|
|
|
use App\Enums\UserRole;
|
|
use Filament\Forms\Components\DateTimePicker;
|
|
use Filament\Forms\Components\FileUpload;
|
|
use Filament\Forms\Components\Select;
|
|
use Filament\Forms\Components\Textarea;
|
|
use Filament\Forms\Components\TextInput;
|
|
use Filament\Schemas\Components\Section;
|
|
use Filament\Schemas\Schema;
|
|
use Illuminate\Validation\Rules\Password;
|
|
|
|
class UserForm
|
|
{
|
|
public static function configure(Schema $schema): Schema
|
|
{
|
|
return $schema
|
|
->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<string, string>
|
|
*/
|
|
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();
|
|
}
|
|
}
|