components([ TextInput::make('name') ->label('Nom') ->required(), TextInput::make('email') ->label('Email') ->email() ->required(), DateTimePicker::make('email_verified_at') ->label('Email vérifié le'), // Requis à la création, laissé vide à l'édition pour ne pas écraser le mot de passe // existant (le cast 'hashed' du modèle User se charge du hachage à la sauvegarde). TextInput::make('password') ->label('Mot de passe') ->password() ->revealable() ->required(fn (string $operation): bool => $operation === 'create') ->dehydrated(fn (?string $state): bool => filled($state)) ->dehydrateStateUsing(fn (?string $state): ?string => filled($state) ? $state : null), TextInput::make('locale') ->label('Langue') ->required() ->default('fr'), Select::make('units') ->label('Unités') ->options(Units::class) ->default('metric') ->required(), TextInput::make('timezone') ->label('Fuseau horaire'), TextInput::make('avatar_path') ->label('Avatar (chemin)'), TextInput::make('oidc_sub') ->label('Identifiant OIDC'), // Assignation des rôles Spatie (guard 'web') : pilote l'accès au back-office. Select::make('roles') ->label('Rôles') ->relationship('roles', 'name') ->multiple() ->preload() ->searchable() ->columnSpanFull(), ]); } }