Skip to content

Commit d2ecde0

Browse files
authored
feat: adds soft delete functionality
1 parent 1e3e710 commit d2ecde0

File tree

3 files changed

+60
-8
lines changed

3 files changed

+60
-8
lines changed

src/FilamentAuthentication.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Closure;
66
use Filament\Panel;
77
use App\Models\User;
8+
use Illuminate\Support\Arr;
89
use Filament\Contracts\Plugin;
910
use Spatie\Permission\Models\Role;
1011
use Filament\Tables\Columns\TextColumn;
@@ -21,6 +22,7 @@ class FilamentAuthentication implements Plugin
2122
protected bool $impersonate = false;
2223
protected string $impersonateGuard = 'web';
2324
protected string|Closure $impersonateRedirect = '/';
25+
protected bool $softDeletes = false;
2426

2527
/**
2628
* @var array<string, class-string>
@@ -136,12 +138,24 @@ public function getModel(string $model): string
136138
*/
137139
public function overrideResources(array $overrides): self
138140
{
139-
$this->resources = array_merge($this->resources, $overrides);
141+
$resources = array_merge($this->resources, $overrides);
142+
$this->resources = Arr::whereNotNull($resources);
140143
return $this;
141144
}
142145

143146
public function getResource(string $resource): string
144147
{
145148
return $this->resources[$resource];
146149
}
150+
151+
public function withSoftDeletes(bool $enabled = true): self
152+
{
153+
$this->softDeletes = $enabled;
154+
return $this;
155+
}
156+
157+
public function usesSoftDeletes(): bool
158+
{
159+
return $this->softDeletes;
160+
}
147161
}

src/Resources/UserResource.php

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,22 @@
44

55
use Filament\Forms\Form;
66
use Filament\Tables\Table;
7+
use Illuminate\Support\Arr;
78
use Filament\Resources\Resource;
89
use Illuminate\Support\Facades\Hash;
910
use Filament\Forms\Components\Select;
1011
use Filament\Tables\Actions\EditAction;
1112
use Filament\Tables\Actions\ViewAction;
13+
use Filament\Tables\Actions\RestoreAction;
14+
use Filament\Tables\Actions\RestoreBulkAction;
15+
use Illuminate\Database\Eloquent\Builder;
1216
use Filament\Tables\Columns\IconColumn;
1317
use Filament\Tables\Columns\TagsColumn;
1418
use Filament\Tables\Columns\TextColumn;
1519
use Filament\Forms\Components\TextInput;
1620
use Filament\Tables\Actions\DeleteAction;
21+
use Filament\Tables\Actions\ForceDeleteAction;
22+
use Filament\Tables\Actions\ForceDeleteBulkAction;
1723
use Filament\Tables\Filters\TernaryFilter;
1824
use Filament\Tables\Actions\DeleteBulkAction;
1925
use Filament\Forms\Components\Section as Card;
@@ -87,7 +93,7 @@ public static function form(Form $form): Form
8793

8894
public static function table(Table $table): Table
8995
{
90-
return $table
96+
$table = $table
9197
->columns([
9298
TextColumn::make('id')
9399
->sortable()
@@ -115,16 +121,36 @@ public static function table(Table $table): Table
115121
TernaryFilter::make('email_verified_at')
116122
->label(strval(__('filament-authentication::filament-authentication.filter.verified')))
117123
->nullable(),
118-
])
119-
->actions([
124+
]);
125+
126+
$actions = [
120127
ViewAction::make(),
121128
EditAction::make(),
129+
FilamentAuthentication::getPlugin()->impersonateEnabled() ? ImpersonateLink::make() : null,
122130
DeleteAction::make(),
123-
ImpersonateLink::make(),
124-
])
125-
->bulkActions([
131+
FilamentAuthentication::getPlugin()->usesSoftDeletes() ? ForceDeleteAction::make() : null,
132+
FilamentAuthentication::getPlugin()->usesSoftDeletes() ? RestoreAction::make() : null,
133+
];
134+
135+
$bulkActions = [
126136
DeleteBulkAction::make(),
127-
]);
137+
FilamentAuthentication::getPlugin()->usesSoftDeletes() ? RestoreBulkAction::make() : null,
138+
FilamentAuthentication::getPlugin()->usesSoftDeletes() ? ForceDeleteBulkAction::make() : null,
139+
];
140+
141+
142+
$table->actions(Arr::whereNotNull($actions));
143+
$table->bulkActions(Arr::whereNotNull($bulkActions));
144+
145+
if(FilamentAuthentication::getPlugin()->usesSoftDeletes()) {
146+
$table->pushFilters([
147+
\Filament\Tables\Filters\TrashedFilter::make()
148+
]);
149+
}
150+
151+
return $table;
152+
153+
128154
}
129155

130156
public static function getRelations(): array
@@ -143,4 +169,14 @@ public static function getPages(): array
143169
'view' => ViewUser::route('/{record}'),
144170
];
145171
}
172+
173+
174+
public static function getEloquentQuery(): Builder
175+
{
176+
return parent::getEloquentQuery()
177+
->when(
178+
FilamentAuthentication::getPlugin()->usesSoftDeletes(),
179+
fn(Builder $builder) => $builder->withTrashed()
180+
);
181+
}
146182
}

src/Resources/UserResource/Pages/EditUser.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Filament\Actions\ViewAction;
66
use Filament\Actions\DeleteAction;
7+
use Filament\Actions\RestoreAction;
78
use Illuminate\Support\Facades\Event;
89
use Illuminate\Support\Facades\Config;
910
use Filament\Resources\Pages\EditRecord;
@@ -36,6 +37,7 @@ protected function getHeaderActions(): array
3637
return [
3738
ViewAction::make(),
3839
DeleteAction::make(),
40+
RestoreAction::make(),
3941
];
4042
}
4143
}

0 commit comments

Comments
 (0)