From e5c24fe8b60670868aec615fb7033fc344ca18b1 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Sun, 21 Sep 2025 00:37:42 +0200 Subject: [PATCH] Remove username rules and allow to change it in profile (#1702) --- .../Admin/Resources/Users/UserResource.php | 2 - app/Filament/Pages/Auth/EditProfile.php | 16 ++-- app/Models/User.php | 2 - app/Rules/Username.php | 45 ------------ tests/Unit/Rules/UsernameTest.php | 73 ------------------- 5 files changed, 7 insertions(+), 131 deletions(-) delete mode 100644 app/Rules/Username.php delete mode 100644 tests/Unit/Rules/UsernameTest.php diff --git a/app/Filament/Admin/Resources/Users/UserResource.php b/app/Filament/Admin/Resources/Users/UserResource.php index 1d5ce49a6..5c19dd85e 100644 --- a/app/Filament/Admin/Resources/Users/UserResource.php +++ b/app/Filament/Admin/Resources/Users/UserResource.php @@ -123,10 +123,8 @@ class UserResource extends Resource ->components([ TextInput::make('username') ->label(trans('admin/user.username')) - ->alphaNum() ->required() ->unique() - ->minLength(3) ->maxLength(255), TextInput::make('email') ->label(trans('admin/user.email')) diff --git a/app/Filament/Pages/Auth/EditProfile.php b/app/Filament/Pages/Auth/EditProfile.php index b7f1d61f5..5592f9b28 100644 --- a/app/Filament/Pages/Auth/EditProfile.php +++ b/app/Filament/Pages/Auth/EditProfile.php @@ -90,16 +90,14 @@ class EditProfile extends BaseEditProfile ->schema([ Tab::make('account') ->label(trans('profile.tabs.account')) - ->icon('tabler-user') + ->icon('tabler-user-cog') ->schema([ TextInput::make('username') + ->prefixIcon('tabler-user') ->label(trans('profile.username')) - ->disabled() - ->readOnly() - ->dehydrated(false) + ->required() ->maxLength(255) - ->unique() - ->autofocus(), + ->unique(), TextInput::make('email') ->prefixIcon('tabler-mail') ->label(trans('profile.email')) @@ -114,8 +112,8 @@ class EditProfile extends BaseEditProfile ->revealable(filament()->arePasswordsRevealable()) ->rule(Password::default()) ->autocomplete('new-password') - ->dehydrated(fn ($state): bool => filled($state)) - ->dehydrateStateUsing(fn ($state): string => Hash::make($state)) + ->dehydrated(fn ($state) => filled($state)) + ->dehydrateStateUsing(fn ($state) => Hash::make($state)) ->live(debounce: 500) ->same('passwordConfirmation'), TextInput::make('passwordConfirmation') @@ -124,7 +122,7 @@ class EditProfile extends BaseEditProfile ->prefixIcon('tabler-password-fingerprint') ->revealable(filament()->arePasswordsRevealable()) ->required() - ->visible(fn (Get $get): bool => filled($get('password'))) + ->visible(fn (Get $get) => filled($get('password'))) ->dehydrated(false), Select::make('timezone') ->label(trans('profile.timezone')) diff --git a/app/Models/User.php b/app/Models/User.php index 1073a9cb5..bc627b241 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -11,7 +11,6 @@ use App\Contracts\Validatable; use App\Enums\CustomizationKey; use App\Exceptions\DisplayException; use App\Extensions\Avatar\AvatarService; -use App\Rules\Username; use App\Traits\HasValidation; use DateTimeZone; use Filament\Models\Contracts\FilamentUser; @@ -213,7 +212,6 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac $rules['language'][] = new In(array_values(array_filter(ResourceBundle::getLocales(''), fn ($lang) => preg_match('/^[a-z]{2}$/', $lang)))); $rules['timezone'][] = new In(DateTimeZone::listIdentifiers()); - $rules['username'][] = new Username(); return $rules; } diff --git a/app/Rules/Username.php b/app/Rules/Username.php deleted file mode 100644 index f888da103..000000000 --- a/app/Rules/Username.php +++ /dev/null @@ -1,45 +0,0 @@ -assertSame('p_username', (string) new Username()); - } - - /** - * Test valid usernames. - */ - #[DataProvider('validUsernameDataProvider')] - public function test_valid_usernames(string $username): void - { - $this->assertTrue((new Username())->passes('test', $username), 'Assert username is valid.'); - } - - /** - * Test invalid usernames return false. - */ - #[DataProvider('invalidUsernameDataProvider')] - public function test_invalid_usernames(string $username): void - { - $this->assertFalse((new Username())->passes('test', $username), 'Assert username is not valid.'); - } - - /** - * Provide valid usernames. - */ - public static function validUsernameDataProvider(): array - { - return [ - ['username'], - ['user_name'], - ['user.name'], - ['user-name'], - ['123username123'], - ['123-user.name'], - ['123456'], - ]; - } - - /** - * Provide invalid usernames. - */ - public static function invalidUsernameDataProvider(): array - { - return [ - ['_username'], - ['username_'], - ['_username_'], - ['-username'], - ['.username'], - ['username-'], - ['username.'], - ['user*name'], - ['user^name'], - ['user#name'], - ['user+name'], - ['1234_'], - ]; - } -}