Skip to content

Commit c609c4e

Browse files
created user resource with soft deletes
1 parent 796b1e1 commit c609c4e

File tree

9 files changed

+653
-1
lines changed

9 files changed

+653
-1
lines changed

Diff for: app/Filament/Resources/UserResource.php

+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
<?php
2+
3+
namespace App\Filament\Resources;
4+
5+
use Filament\Forms;
6+
use App\Models\User;
7+
use Filament\Tables;
8+
use Filament\Pages\Page;
9+
use Filament\Resources\Form;
10+
use Filament\Resources\Table;
11+
use Filament\Resources\Resource;
12+
use Filament\Forms\Components\Card;
13+
use Illuminate\Support\Facades\Hash;
14+
use Filament\Forms\Components\Toggle;
15+
use Filament\Tables\Actions\EditAction;
16+
use Filament\Tables\Columns\TextColumn;
17+
use Filament\Forms\Components\TextInput;
18+
use Filament\Tables\Actions\DeleteAction;
19+
use Illuminate\Database\Eloquent\Builder;
20+
use Filament\Tables\Columns\BooleanColumn;
21+
use Filament\Tables\Filters\TrashedFilter;
22+
use Filament\Forms\Components\CheckboxList;
23+
use Filament\Tables\Actions\DeleteBulkAction;
24+
use App\Filament\Resources\UserResource\Pages;
25+
use Filament\Tables\Actions\RestoreBulkAction;
26+
use Filament\Tables\Actions\ForceDeleteBulkAction;
27+
use Illuminate\Database\Eloquent\SoftDeletingScope;
28+
use App\Filament\Resources\UserResource\Pages\EditUser;
29+
use App\Filament\Resources\UserResource\Pages\ListUsers;
30+
use App\Filament\Resources\UserResource\Pages\CreateUser;
31+
use App\Filament\Resources\UserResource\RelationManagers;
32+
33+
class UserResource extends Resource
34+
{
35+
protected static ?string $model = User::class;
36+
37+
protected static ?string $navigationIcon = 'heroicon-o-users';
38+
39+
protected static ?string $navigationGroup = 'Admin Management';
40+
41+
public static function form(Form $form): Form {
42+
return $form
43+
->schema([
44+
Card::make()
45+
->schema([
46+
TextInput::make('name')
47+
->required()
48+
->maxLength(255),
49+
Toggle::make('is_admin')
50+
->required(),
51+
TextInput::make('email')
52+
->email()
53+
->unique(ignoreRecord: true)
54+
->required()
55+
->maxLength(255),
56+
TextInput::make('password')
57+
->password()
58+
->maxLength(255)
59+
->dehydrateStateUsing(static fn (null|string $state): null|string =>
60+
filled($state) ? Hash::make($state): null,
61+
)->required(static fn (Page $livewire): bool =>
62+
$livewire instanceof CreateUser,
63+
)->dehydrated(static fn (null|string $state): bool =>
64+
filled($state),
65+
)->label(static fn (Page $livewire): string =>
66+
($livewire instanceof EditUser) ? 'New Password' : 'Password'
67+
),
68+
CheckboxList::make('roles')
69+
->relationship('roles', 'name')
70+
->columns(2)
71+
->helperText('Only Choose One!')
72+
->required()
73+
])
74+
]);
75+
}
76+
77+
public static function table(Table $table): Table {
78+
return $table
79+
->columns([
80+
TextColumn::make('name')->sortable(),
81+
BooleanColumn::make('is_admin')->sortable(),
82+
TextColumn::make('roles.name')->sortable(),
83+
TextColumn::make('email')->sortable(),
84+
TextColumn::make('deleted_at')
85+
->dateTime('d-M-Y')
86+
->sortable()
87+
->searchable(),
88+
TextColumn::make('created_at')
89+
->dateTime('d-M-Y')
90+
->sortable()
91+
->searchable(),
92+
])
93+
->filters([
94+
TrashedFilter::make(),
95+
])
96+
->actions([
97+
EditAction::make(),
98+
DeleteAction::make(),
99+
])
100+
->bulkActions([
101+
DeleteBulkAction::make(),
102+
RestoreBulkAction::make(),
103+
ForceDeleteBulkAction::make(),
104+
]);
105+
}
106+
107+
public static function getRelations(): array
108+
{
109+
return [
110+
RolesRelationManager::class,
111+
];
112+
}
113+
114+
public static function getPages(): array
115+
{
116+
return [
117+
'index' => Pages\ListUsers::route('/'),
118+
'create' => Pages\CreateUser::route('/create'),
119+
'edit' => Pages\EditUser::route('/{record}/edit'),
120+
];
121+
}
122+
}
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\UserResource\Pages;
4+
5+
use App\Filament\Resources\UserResource;
6+
use Filament\Pages\Actions;
7+
use Filament\Resources\Pages\CreateRecord;
8+
9+
class CreateUser extends CreateRecord
10+
{
11+
protected static string $resource = UserResource::class;
12+
13+
protected function getRedirectUrl(): string {
14+
return $this->getResource()::getUrl('index');
15+
}
16+
}
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\UserResource\Pages;
4+
5+
use App\Filament\Resources\UserResource;
6+
use Filament\Pages\Actions;
7+
use Filament\Resources\Pages\EditRecord;
8+
9+
class EditUser extends EditRecord
10+
{
11+
protected static string $resource = UserResource::class;
12+
13+
protected function getActions(): array
14+
{
15+
return [
16+
Actions\DeleteAction::make(),
17+
];
18+
}
19+
20+
protected function getRedirectUrl(): string {
21+
return $this->getResource()::getUrl('index');
22+
}
23+
}
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\UserResource\Pages;
4+
5+
use App\Filament\Resources\UserResource;
6+
use Filament\Pages\Actions;
7+
use Filament\Resources\Pages\ListRecords;
8+
9+
class ListUsers extends ListRecords
10+
{
11+
protected static string $resource = UserResource::class;
12+
13+
protected function getActions(): array
14+
{
15+
return [
16+
Actions\CreateAction::make(),
17+
];
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\UserResource\RelationManagers;
4+
5+
use Filament\Forms;
6+
use Filament\Resources\Form;
7+
use Filament\Resources\RelationManagers\RelationManager;
8+
use Filament\Resources\Table;
9+
use Filament\Tables;
10+
use Illuminate\Database\Eloquent\Builder;
11+
use Illuminate\Database\Eloquent\SoftDeletingScope;
12+
13+
class RolesRelationManager extends RelationManager
14+
{
15+
protected static string $relationship = 'roles';
16+
17+
protected static ?string $recordTitleAttribute = 'name';
18+
19+
public static function form(Form $form): Form
20+
{
21+
return $form
22+
->schema([
23+
Forms\Components\TextInput::make('name')
24+
->required()
25+
->maxLength(255),
26+
]);
27+
}
28+
29+
public static function table(Table $table): Table
30+
{
31+
return $table
32+
->columns([
33+
Tables\Columns\TextColumn::make('name'),
34+
])
35+
->filters([
36+
//
37+
])
38+
->headerActions([
39+
Tables\Actions\CreateAction::make(),
40+
])
41+
->actions([
42+
Tables\Actions\EditAction::make(),
43+
Tables\Actions\DeleteAction::make(),
44+
])
45+
->bulkActions([
46+
Tables\Actions\DeleteBulkAction::make(),
47+
]);
48+
}
49+
}

Diff for: app/Models/User.php

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Contracts\Auth\MustVerifyEmail;
66
use Illuminate\Database\Eloquent\Factories\HasFactory;
7+
use Illuminate\Database\Eloquent\SoftDeletes;
78
use Illuminate\Foundation\Auth\User as Authenticatable;
89
use Illuminate\Notifications\Notifiable;
910
use Laravel\Fortify\TwoFactorAuthenticatable;
@@ -18,6 +19,7 @@ class User extends Authenticatable
1819
use HasProfilePhoto;
1920
use HasRoles;
2021
use Notifiable;
22+
use SoftDeletes;
2123
use TwoFactorAuthenticatable;
2224

2325
/**

Diff for: composer.json

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"license": "MIT",
77
"require": {
88
"php": "^8.0.2",
9+
"doctrine/dbal": "^3.4",
910
"filament/filament": "^2.0",
1011
"guzzlehttp/guzzle": "^7.2",
1112
"laravel/framework": "^9.19",

0 commit comments

Comments
 (0)