From 3c6e4bf4bdae92ac54f43283755a337e75185341 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 15 May 2026 11:52:31 +0000 Subject: [PATCH] feat: add delete confirmation modal for ConnectionProviders - Introduced a Livewire-powered confirmation modal for deleting connection providers. - Updated `delete` method to support selected provider deletion and modal interaction. - Added `connectedApps` relationship to `ConnectionProvider` model for mass soft-deletes. - Refactored delete logic to handle associated connected apps during provider deletion. - Updated UI to include modal trigger and actions for enhanced user safety. --- app/Models/ConnectedApp.php | 6 +-- app/Models/ConnectionProvider.php | 7 +++- app/Services/ConnectionProviderService.php | 21 ++++++++--- .../connecton-providers/⚡index.blade.php | 37 ++++++++++++++++--- 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/app/Models/ConnectedApp.php b/app/Models/ConnectedApp.php index 0e98f18..c06bc5f 100644 --- a/app/Models/ConnectedApp.php +++ b/app/Models/ConnectedApp.php @@ -4,8 +4,8 @@ namespace App\Models; +use Illuminate\Database\Eloquent\{Model, Relations\BelongsTo, SoftDeletes}; use Illuminate\Database\Eloquent\Attributes\Fillable; -use Illuminate\Database\Eloquent\{Model, SoftDeletes}; use Illuminate\Database\Eloquent\Relations\HasOne; #[Fillable([ @@ -24,9 +24,9 @@ public function protocol(): HasOne return $this->hasOne(ConnectionProtocol::class, 'id', 'connection_protocol_id'); } - public function provider(): HasOne + public function provider(): BelongsTo { - return $this->hasOne(ConnectionProvider::class, 'id', 'connection_provider_id'); + return $this->belongsTo(ConnectionProvider::class, 'connection_provider_id'); } public function status(): HasOne diff --git a/app/Models/ConnectionProvider.php b/app/Models/ConnectionProvider.php index 3fe6596..a2516cb 100644 --- a/app/Models/ConnectionProvider.php +++ b/app/Models/ConnectionProvider.php @@ -4,11 +4,16 @@ namespace App\Models; +use Illuminate\Database\Eloquent\{Model, Relations\HasMany, SoftDeletes}; use Illuminate\Database\Eloquent\Attributes\Fillable; -use Illuminate\Database\Eloquent\{Model, SoftDeletes}; #[Fillable(['name', 'slug'])] final class ConnectionProvider extends Model { use SoftDeletes; + + public function connectedApps(): HasMany + { + return $this->hasMany(ConnectedApp::class); + } } diff --git a/app/Services/ConnectionProviderService.php b/app/Services/ConnectionProviderService.php index e10f1c5..71d4bef 100644 --- a/app/Services/ConnectionProviderService.php +++ b/app/Services/ConnectionProviderService.php @@ -58,22 +58,31 @@ public function getAll(): PaginatedDataCollection public function update(string $slug, StoreConnectionProviderRequestData $data): void { DB::transaction( - fn () => ConnectionProvider::query() + fn() => ConnectionProvider::query() ->where('slug', $slug) ->update($data->toArray()) ); } /** - * @throws Throwable when an error occurs during the deletion. - * @throws InvalidArgumentException when id is invalid + * Delete the connection provider and associated connected apps. + * @throws ModelNotFoundException when the connection provider is not found. + * @throws Throwable when an error occurs during the deletion. */ public function delete(string $slug): void { DB::transaction( - fn () => ConnectionProvider::query() - ->where('slug', $slug) - ->delete() + function () use ($slug): void { + $provider = ConnectionProvider::query() + ->where('slug', $slug) + ->firstOrFail(); + + // Note: This performs a mass soft-delete query. + // Model events for ConnectedApp will NOT fire. + $provider->connectedApps()->delete(); + + $provider->delete(); + } ); } diff --git a/resources/views/pages/connecton-providers/⚡index.blade.php b/resources/views/pages/connecton-providers/⚡index.blade.php index 5a6d30d..931453b 100644 --- a/resources/views/pages/connecton-providers/⚡index.blade.php +++ b/resources/views/pages/connecton-providers/⚡index.blade.php @@ -17,6 +17,9 @@ #[DataCollectionOf(TableHeader::class)] public DataCollection $headers; + public bool $cnfModal = false; + public string $selectedProvider = ''; + public function boot(ConnectionProviderService $service): void { $this->service = $service; @@ -45,13 +48,26 @@ public function edit(string $providerSlug): void $this->redirectRoute('apps.connectionProviders.edit', ['slug' => $providerSlug]); } - public function delete(string $providerSlug): void + public function delete(): void { + $this->cnfModal = false; $this->attempt( - action: fn() => $this->service->delete($providerSlug), - successMessage: "Connection Provider deleted!" + action: function () { + $this->service->delete($this->selectedProvider); + } ); + } + public function showModal(string $providerSlug): void + { + $this->selectedProvider = $providerSlug; + $this->cnfModal = true; + } + + public function cancelModal(): void + { + $this->selectedProvider = ''; + $this->cnfModal = false; } }; ?> @@ -68,12 +84,23 @@ public function delete(string $providerSlug): void
-
@endscope + + + + + + + +