diff --git a/composer.json b/composer.json index 679d03f..9a465ab 100644 --- a/composer.json +++ b/composer.json @@ -26,10 +26,10 @@ "minimum-stability": "dev", "require": { "php": "^8.1", - "bezhansalleh/filament-shield": "^2.3", - "filament/filament": "^2.16", + "bezhansalleh/filament-shield": "^3.0@beta", + "filament/filament": "^3.0.0", "spatie/laravel-package-tools": "^1.14", - "stechstudio/filament-impersonate": "^2.11", + "stechstudio/filament-impersonate": "^3.2", "queents/console-helpers": "^1.0" }, "config": { diff --git a/src/FilamentUserProvider.php b/src/FilamentUserProvider.php index cdb9c9d..fb56d74 100644 --- a/src/FilamentUserProvider.php +++ b/src/FilamentUserProvider.php @@ -2,13 +2,13 @@ namespace io3x1\FilamentUser; -use Filament\PluginServiceProvider; -use io3x1\FilamentUser\Console\PublishUserResourceCommand; -use io3x1\FilamentUser\Resources\UserResource; use Spatie\LaravelPackageTools\Package; +use io3x1\FilamentUser\Resources\UserResource; +use Spatie\LaravelPackageTools\PackageServiceProvider; +use io3x1\FilamentUser\Console\PublishUserResourceCommand; -class FilamentUserProvider extends PluginServiceProvider +class FilamentUserProvider extends PackageServiceProvider { /** * @var string diff --git a/src/Resources/UserResource.php b/src/Resources/UserResource.php index 6ed59a7..cbeb876 100644 --- a/src/Resources/UserResource.php +++ b/src/Resources/UserResource.php @@ -5,16 +5,20 @@ use Filament\Forms; use App\Models\User; use Filament\Tables; -use Filament\Resources\Form; -use Filament\Resources\Table; +use Filament\Forms\Form; +use Filament\Tables\Table; use Filament\Resources\Resource; use Illuminate\Support\Facades\Hash; +use Filament\Tables\Actions\EditAction; +use Filament\Tables\Actions\ViewAction; +use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Forms\Components\TextInput; -use Filament\Tables\Columns\BooleanColumn; +use Filament\Tables\Actions\ActionGroup; +use Filament\Tables\Actions\DeleteAction; use Illuminate\Database\Eloquent\Builder; use io3x1\FilamentUser\Resources\UserResource\Pages; -use STS\FilamentImpersonate\Impersonate; +use STS\FilamentImpersonate\Tables\Actions\Impersonate; class UserResource extends Resource { @@ -24,7 +28,7 @@ class UserResource extends Resource protected static ?string $navigationIcon = 'heroicon-o-lock-closed'; - protected static function getNavigationLabel(): string + public static function getNavigationLabel(): string { return trans('filament-user::user.resource.label'); } @@ -39,12 +43,12 @@ public static function getLabel(): string return trans('filament-user::user.resource.single'); } - protected static function getNavigationGroup(): ?string + public static function getNavigationGroup(): ?string { return config('filament-user.group'); } - protected function getTitle(): string + public function getTitle(): string { return trans('filament-user::user.resource.title.resource'); } @@ -52,25 +56,31 @@ protected function getTitle(): string public static function form(Form $form): Form { $rows = [ - TextInput::make('name')->required()->label(trans('filament-user::user.resource.name')), - TextInput::make('email')->email()->required()->label(trans('filament-user::user.resource.email')), - Forms\Components\TextInput::make('password')->label(trans('filament-user::user.resource.password')) + TextInput::make('name') + ->required() + ->label(trans('filament-user::user.resource.name')), + TextInput::make('email') + ->email() + ->required() + ->label(trans('filament-user::user.resource.email')), + TextInput::make('password') + ->label(trans('filament-user::user.resource.password')) ->password() ->maxLength(255) - ->dehydrateStateUsing(static function ($state) use ($form){ - if(!empty($state)){ - return Hash::make($state); - } + ->dehydrateStateUsing(static function ($state) use ($form) { + return !empty($state) ? Hash::make($state) : null; $user = User::find($form->getColumns()); - if($user){ - return $user->password; - } + return $user ? $user->password : null; }), ]; - if(config('filament-user.shield')){ - $rows[] = Forms\Components\MultiSelect::make('roles')->relationship('roles', 'name')->label(trans('filament-user::user.resource.roles')); + if (config('filament-user.shield')) { + $rows[] = Forms\Components\Select::make('roles') + ->multiple() + ->preload() + ->relationship('roles', 'name') + ->label(trans('filament-user::user.resource.roles')); } $form->schema($rows); @@ -80,34 +90,49 @@ public static function form(Form $form): Form public static function table(Table $table): Table { - $table + return $table ->columns([ - TextColumn::make('id')->sortable()->label(trans('filament-user::user.resource.id')), - TextColumn::make('name')->sortable()->searchable()->label(trans('filament-user::user.resource.name')), - TextColumn::make('email')->sortable()->searchable()->label(trans('filament-user::user.resource.email')), - BooleanColumn::make('email_verified_at')->sortable()->searchable()->label(trans('filament-user::user.resource.email_verified_at')), - Tables\Columns\TextColumn::make('created_at')->label(trans('filament-user::user.resource.created_at')) - ->dateTime('M j, Y')->sortable(), - Tables\Columns\TextColumn::make('updated_at')->label(trans('filament-user::user.resource.updated_at')) - ->dateTime('M j, Y')->sortable(), - + TextColumn::make('id') + ->sortable() + ->label(trans('filament-user::user.resource.id')), + TextColumn::make('name') + ->sortable() + ->searchable() + ->label(trans('filament-user::user.resource.name')), + TextColumn::make('email') + ->sortable() + ->searchable() + ->label(trans('filament-user::user.resource.email')), + IconColumn::make('email_verified_at') + ->boolean() + ->sortable() + ->searchable() + ->label(trans('filament-user::user.resource.email_verified_at')), + TextColumn::make('created_at') + ->label(trans('filament-user::user.resource.created_at')) + ->dateTime('M j, Y') + ->sortable(), + TextColumn::make('updated_at') + ->label(trans('filament-user::user.resource.updated_at')) + ->dateTime('M j, Y') + ->sortable(), ]) ->filters([ Tables\Filters\Filter::make('verified') ->label(trans('filament-user::user.resource.verified')) - ->query(fn (Builder $query): Builder => $query->whereNotNull('email_verified_at')), + ->query(fn(Builder $query): Builder => $query->whereNotNull('email_verified_at')), Tables\Filters\Filter::make('unverified') ->label(trans('filament-user::user.resource.unverified')) - ->query(fn (Builder $query): Builder => $query->whereNull('email_verified_at')), - ]); - - if(config('filament-user.impersonate')){ - $table->prependActions([ + ->query(fn(Builder $query): Builder => $query->whereNull('email_verified_at')), + ]) + ->actions([ Impersonate::make('impersonate'), + ActionGroup::make([ + ViewAction::make(), + EditAction::make(), + DeleteAction::make() + ]), ]); - } - - return $table; } public static function getPages(): array diff --git a/src/Resources/UserResource/Pages/CreateUser.php b/src/Resources/UserResource/Pages/CreateUser.php index 024c721..98472ba 100644 --- a/src/Resources/UserResource/Pages/CreateUser.php +++ b/src/Resources/UserResource/Pages/CreateUser.php @@ -9,7 +9,7 @@ class CreateUser extends CreateRecord { protected static string $resource = UserResource::class; - protected function getTitle(): string + public function getTitle(): string { return trans('filament-user::user.resource.title.create'); } diff --git a/src/Resources/UserResource/Pages/EditUser.php b/src/Resources/UserResource/Pages/EditUser.php index 7b98ef2..39810ae 100644 --- a/src/Resources/UserResource/Pages/EditUser.php +++ b/src/Resources/UserResource/Pages/EditUser.php @@ -10,7 +10,7 @@ class EditUser extends EditRecord { protected static string $resource = UserResource::class; - protected function mutateFormDataBeforeSave(array $data): array + public function mutateFormDataBeforeSave(array $data): array { $getUser = User::where('email', $data['email'])->first(); if ($getUser) { @@ -21,7 +21,7 @@ protected function mutateFormDataBeforeSave(array $data): array return $data; } - protected function getTitle(): string + public function getTitle(): string { return trans('filament-user::user.resource.title.edit'); } diff --git a/src/Resources/UserResource/Pages/ListUsers.php b/src/Resources/UserResource/Pages/ListUsers.php index 146f1f7..6a718e2 100644 --- a/src/Resources/UserResource/Pages/ListUsers.php +++ b/src/Resources/UserResource/Pages/ListUsers.php @@ -9,7 +9,7 @@ class ListUsers extends ListRecords { protected static string $resource = UserResource::class; - protected function getTitle(): string + public function getTitle(): string { return trans('filament-user::user.resource.title.list'); } diff --git a/stubs/CreateUser.stub b/stubs/CreateUser.stub index 9654227..3098d83 100644 --- a/stubs/CreateUser.stub +++ b/stubs/CreateUser.stub @@ -9,7 +9,7 @@ class CreateUser extends CreateRecord { protected static string $resource = UserResource::class; - protected function getTitle(): string + public function getTitle(): string { return trans('filament-user::user.resource.title.create'); } diff --git a/stubs/EditUser.stub b/stubs/EditUser.stub index 42ed4a6..f9de3ad 100644 --- a/stubs/EditUser.stub +++ b/stubs/EditUser.stub @@ -10,7 +10,7 @@ class EditUser extends EditRecord { protected static string $resource = UserResource::class; - protected function mutateFormDataBeforeSave(array $data): array + public function mutateFormDataBeforeSave(array $data): array { $getUser = User::where('email', $data['email'])->first(); if ($getUser) { @@ -21,7 +21,7 @@ class EditUser extends EditRecord return $data; } - protected function getTitle(): string + public function getTitle(): string { return trans('filament-user::user.resource.title.edit'); } diff --git a/stubs/ListUsers.stub b/stubs/ListUsers.stub index c57bb87..dd654ca 100644 --- a/stubs/ListUsers.stub +++ b/stubs/ListUsers.stub @@ -9,7 +9,7 @@ class ListUsers extends ListRecords { protected static string $resource = UserResource::class; - protected function getTitle(): string + public function getTitle(): string { return trans('filament-user::user.resource.title.list'); } diff --git a/stubs/UserResource.stub b/stubs/UserResource.stub index a4d6f16..de223ea 100644 --- a/stubs/UserResource.stub +++ b/stubs/UserResource.stub @@ -5,16 +5,20 @@ namespace App\Filament\Resources; use Filament\Forms; use App\Models\User; use Filament\Tables; -use Filament\Resources\Form; -use Filament\Resources\Table; +use Filament\Forms\Form; +use Filament\Tables\Table; use Filament\Resources\Resource; use Illuminate\Support\Facades\Hash; +use Filament\Tables\Actions\EditAction; +use Filament\Tables\Actions\ViewAction; +use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Forms\Components\TextInput; -use Filament\Tables\Columns\BooleanColumn; +use Filament\Tables\Actions\ActionGroup; +use Filament\Tables\Actions\DeleteAction; use Illuminate\Database\Eloquent\Builder; use App\Filament\Resources\UserResource\Pages; -use STS\FilamentImpersonate\Impersonate; +use STS\FilamentImpersonate\Tables\Actions\Impersonate; class UserResource extends Resource { @@ -24,7 +28,7 @@ class UserResource extends Resource protected static ?string $navigationIcon = 'heroicon-o-lock-closed'; - protected static function getNavigationLabel(): string + public static function getNavigationLabel(): string { return trans('filament-user::user.resource.label'); } @@ -39,12 +43,12 @@ class UserResource extends Resource return trans('filament-user::user.resource.single'); } - protected static function getNavigationGroup(): ?string + public static function getNavigationGroup(): ?string { return config('filament-user.group'); } - protected function getTitle(): string + public function getTitle(): string { return trans('filament-user::user.resource.title.resource'); } @@ -52,25 +56,30 @@ class UserResource extends Resource public static function form(Form $form): Form { $rows = [ - TextInput::make('name')->required()->label(trans('filament-user::user.resource.name')), - TextInput::make('email')->email()->required()->label(trans('filament-user::user.resource.email')), - Forms\Components\TextInput::make('password')->label(trans('filament-user::user.resource.password')) + TextInput::make('name') + ->required() + ->label(trans('filament-user::user.resource.name')), + TextInput::make('email') + ->email() + ->required() + ->label(trans('filament-user::user.resource.email')), + TextInput::make('password') + ->label(trans('filament-user::user.resource.password')) ->password() ->maxLength(255) - ->dehydrateStateUsing(static function ($state) use ($form){ - if(!empty($state)){ - return Hash::make($state); - } + ->dehydrateStateUsing(static function ($state) use ($form) { + return !empty($state) ? Hash::make($state) : null; $user = User::find($form->getColumns()); - if($user){ - return $user->password; - } - }), + return $user ? $user->password : null; + }), ]; - if(config('filament-user.shield')){ - $rows[] = Forms\Components\MultiSelect::make('roles')->relationship('roles', 'name')->label(trans('filament-user::user.resource.roles')); + if (config('filament-user.shield')) { + $rows[] = Forms\Components\Select::make('roles') + ->multiple() + ->relationship('roles', 'name') + ->label(trans('filament-user::user.resource.roles')); } $form->schema($rows); @@ -82,23 +91,45 @@ class UserResource extends Resource { $table ->columns([ - TextColumn::make('id')->sortable()->label(trans('filament-user::user.resource.id')), - TextColumn::make('name')->sortable()->searchable()->label(trans('filament-user::user.resource.name')), - TextColumn::make('email')->sortable()->searchable()->label(trans('filament-user::user.resource.email')), - BooleanColumn::make('email_verified_at')->sortable()->searchable()->label(trans('filament-user::user.resource.email_verified_at')), - Tables\Columns\TextColumn::make('created_at')->label(trans('filament-user::user.resource.created_at')) - ->dateTime('M j, Y')->sortable(), - Tables\Columns\TextColumn::make('updated_at')->label(trans('filament-user::user.resource.updated_at')) - ->dateTime('M j, Y')->sortable(), - + TextColumn::make('id') + ->sortable() + ->label(trans('filament-user::user.resource.id')), + TextColumn::make('name') + ->sortable() + ->searchable() + ->label(trans('filament-user::user.resource.name')), + TextColumn::make('email') + ->sortable() + ->searchable() + ->label(trans('filament-user::user.resource.email')), + IconColumn::make('email_verified_at') + ->boolean() + ->sortable() + ->searchable() + ->label(trans('filament-user::user.resource.email_verified_at')), + TextColumn::make('created_at') + ->label(trans('filament-user::user.resource.created_at')) + ->dateTime('M j, Y') + ->sortable(), + TextColumn::make('updated_at') + ->label(trans('filament-user::user.resource.updated_at')) + ->dateTime('M j, Y') + ->sortable(), ]) ->filters([ Tables\Filters\Filter::make('verified') ->label(trans('filament-user::user.resource.verified')) - ->query(fn (Builder $query): Builder => $query->whereNotNull('email_verified_at')), + ->query(fn(Builder $query): Builder => $query->whereNotNull('email_verified_at')), Tables\Filters\Filter::make('unverified') ->label(trans('filament-user::user.resource.unverified')) - ->query(fn (Builder $query): Builder => $query->whereNull('email_verified_at')), + ->query(fn(Builder $query): Builder => $query->whereNull('email_verified_at')), + ]) + ->actions([ + ActionGroup::make([ + ViewAction::make(), + EditAction::make(), + DeleteAction::make() + ]), ]); if(config('filament-user.impersonate')){