From 1fa18178fb732ee13f06b164efeff561da276880 Mon Sep 17 00:00:00 2001 From: Steve Williamson Date: Wed, 2 Apr 2025 07:04:28 -0400 Subject: [PATCH 1/3] ds_store --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 1 + 2 files changed, 1 insertion(+) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index d4b01b1ad16a438b27ec792e24e19720629b5c57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5S?v{M(UwQZw67kc*$8PvBVFM9z7^EK@W*3O7)tn_znJ!e^byu@XgN9 zCdL-Lh{_DizRm2+X7UzxGDPG?vos}+B9LU^6EB^|Z!qVs!PP(dZ7G^4!b zZHC{-0H579-TG6@sD6GK-RIZQ_^K?XKJoeSaGh^aCdni(C-4al501L$(d)^2|MXk_ z)0<^3ZurJ2ZO{W{$UQ~&clBI1U(Oysuh;W?df%PzJ^TC`dlcm|r&T`nJo@`W4JTt_ z3>X8(z#n1&HJc^q3)*N57z4(@f&soCLMUUbSPA;81A}h?fIXPKV9vb+$ApTpVkL+b zh?7vDggR|8oP@(3s$Z;F2}(FQZ9bg7*=dL3{M)gA=-tW1f;Jih#z2#St~?I7{-3Vy z|C>SfWDFPs|B3JKlL+B-xh5ahQMF=Lo6vLNG@eb4r>>*Epv0^0% Q3&ef|JPkG&13${Z2a!ot82|tP diff --git a/.gitignore b/.gitignore index a7f372d..e26945a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ phpstan.neon testbench.yaml vendor node_modules +.DS_Store From 039b5b625c2b4b10f9f364423ce6fc2e81797bc4 Mon Sep 17 00:00:00 2001 From: Steve Williamson Date: Wed, 2 Apr 2025 08:21:11 -0400 Subject: [PATCH 2/3] confirmation, and eent --- README.md | 42 +++++++++++++++++ src/Events/FilamentFormForceDeletingEvent.php | 19 ++++++++ .../Resources/FilamentFormResource.php | 46 +++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 src/Events/FilamentFormForceDeletingEvent.php diff --git a/README.md b/README.md index cf551f3..90a84d2 100644 --- a/README.md +++ b/README.md @@ -95,3 +95,45 @@ class ParentComponent extends Component } ``` + +## Handling Form Deletion with Custom Relations + +If your project has custom relations to the `FilamentForm` model (like tests, surveys, etc.), you can handle their deletion by listening to the `FilamentFormForceDeletingEvent` event. This event is fired before a form is force deleted. + +```php +namespace App\Listeners; + +use Tapp\FilamentFormBuilder\Events\FilamentFormForceDeletingEvent; + +class HandleCustomFormDeletion +{ + public function handle(FilamentFormForceDeletingEvent $event): void + { + // Access the form being deleted + $form = $event->form; + + // Delete your custom relations + $form->tests()->delete(); + $form->surveys()->delete(); + // ... etc + } +} +``` + +Register the listener in your `EventServiceProvider`: + +```php +protected $listen = [ + \Tapp\FilamentFormBuilder\Events\FilamentFormForceDeletingEvent::class => [ + \App\Listeners\HandleCustomFormDeletion::class, + ], +]; +``` + +This way, when a form is force deleted: +1. The package will fire the `FilamentFormForceDeletingEvent` +2. Your listener will handle the deletion of custom relations +3. The package will then delete its own relations (form fields and form users) +4. Finally, the form itself will be deleted + +This approach keeps the package clean and project-agnostic while allowing you to handle custom relations in your project. diff --git a/src/Events/FilamentFormForceDeletingEvent.php b/src/Events/FilamentFormForceDeletingEvent.php new file mode 100644 index 0000000..abc0e2d --- /dev/null +++ b/src/Events/FilamentFormForceDeletingEvent.php @@ -0,0 +1,19 @@ +id.'/edit'); }), + Action::make('delete') + ->requiresConfirmation() + ->form([ + Forms\Components\Checkbox::make('force_delete') + ->label('Force delete') + ->helperText('This will delete the form and all related records. This action cannot be undone.'), + ]) + ->action(function (FilamentForm $record, array $data) { + try { + DB::beginTransaction(); + + // Fire a "before delete" event that projects can listen to + if ($data['force_delete'] ?? false) { + event(new \Tapp\FilamentFormBuilder\Events\FilamentFormForceDeletingEvent($record)); + + // Only delete relations that are part of the package + $record->filamentFormFields()->delete(); + $record->filamentFormUsers()->delete(); + } + + $record->delete(); + + DB::commit(); + + Notification::make() + ->success() + ->title('Form deleted') + ->send(); + } catch (QueryException $e) { + DB::rollBack(); + + if (!($data['force_delete'] ?? false) && str_contains($e->getMessage(), 'foreign key constraint fails')) { + Notification::make() + ->warning() + ->title('Cannot delete form') + ->body('This form has related records. Use force delete to remove all related records.') + ->persistent() + ->send(); + return; + } + + throw $e; + } + }), ]) ->bulkActions([ BulkActionGroup::make([ From b1e5ca9797102872465558c2d1420f9996d5a3c9 Mon Sep 17 00:00:00 2001 From: swilla <304159+swilla@users.noreply.github.com> Date: Wed, 2 Apr 2025 12:54:38 +0000 Subject: [PATCH 3/3] Fix styling --- src/Events/FilamentFormForceDeletingEvent.php | 4 +--- src/Filament/Resources/FilamentFormResource.php | 7 ++++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Events/FilamentFormForceDeletingEvent.php b/src/Events/FilamentFormForceDeletingEvent.php index abc0e2d..b246cbb 100644 --- a/src/Events/FilamentFormForceDeletingEvent.php +++ b/src/Events/FilamentFormForceDeletingEvent.php @@ -13,7 +13,5 @@ class FilamentFormForceDeletingEvent /** * Create a new event instance. */ - public function __construct(public FilamentForm $form) - { - } + public function __construct(public FilamentForm $form) {} } diff --git a/src/Filament/Resources/FilamentFormResource.php b/src/Filament/Resources/FilamentFormResource.php index a2d2773..63b3156 100644 --- a/src/Filament/Resources/FilamentFormResource.php +++ b/src/Filament/Resources/FilamentFormResource.php @@ -14,6 +14,8 @@ use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; +use Illuminate\Database\QueryException; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Redirect; use Tapp\FilamentFormBuilder\Filament\Resources\FilamentFormResource\Pages\CreateFilamentForm; use Tapp\FilamentFormBuilder\Filament\Resources\FilamentFormResource\Pages\EditFilamentForm; @@ -22,8 +24,6 @@ use Tapp\FilamentFormBuilder\Filament\Resources\FilamentFormResource\RelationManagers\FilamentFormUsersRelationManager; use Tapp\FilamentFormBuilder\Models\FilamentForm; use Tapp\FilamentFormBuilder\Models\FilamentFormField; -use Illuminate\Support\Facades\DB; -use Illuminate\Database\QueryException; class FilamentFormResource extends Resource { @@ -167,13 +167,14 @@ public static function table(Table $table): Table } catch (QueryException $e) { DB::rollBack(); - if (!($data['force_delete'] ?? false) && str_contains($e->getMessage(), 'foreign key constraint fails')) { + if (! ($data['force_delete'] ?? false) && str_contains($e->getMessage(), 'foreign key constraint fails')) { Notification::make() ->warning() ->title('Cannot delete form') ->body('This form has related records. Use force delete to remove all related records.') ->persistent() ->send(); + return; }