From b69136d7a4f3f03e279ca0cd0e16d1c9f0797ca0 Mon Sep 17 00:00:00 2001 From: MartinOscar <40749467+rmartinoscar@users.noreply.github.com> Date: Sun, 23 Mar 2025 22:08:59 +0100 Subject: [PATCH] Add `Server` `ForceDelete` (#1134) --- .../ServerResource/Pages/EditServer.php | 42 +++++++++++++++++-- lang/en/admin/server.php | 2 + 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php index f2139a0b9..82e1c9855 100644 --- a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php @@ -946,17 +946,51 @@ class EditServer extends EditRecord protected function getHeaderActions(): array { + /** @var Server $server */ + $server = $this->getRecord(); + + $canForceDelete = cache()->get("servers.$server->uuid.canForceDelete", false); + return [ Actions\Action::make('Delete') - ->successRedirectUrl(route('filament.admin.resources.servers.index')) ->color('danger') - ->label(trans('filament-actions::delete.single.modal.actions.delete.label')) + ->label(trans('filament-actions::delete.single.label')) + ->modalHeading(trans('filament-actions::delete.single.modal.heading', ['label' => $this->getRecordTitle()])) + ->modalSubmitActionLabel(trans('filament-actions::delete.single.label')) ->requiresConfirmation() ->action(function (Server $server, ServerDeletionService $service) { - $service->handle($server); + try { + $service->handle($server); + } catch (ConnectionException) { + cache()->put("servers.$server->uuid.canForceDelete", true, now()->addMinutes(5)); - return redirect(ListServers::getUrl(panel: 'admin')); + Notification::make() + ->title(trans('admin/server.notifications.error_server_delete')) + ->body(trans('admin/server.notifications.error_server_delete_body')) + ->color('warning') + ->icon('tabler-database') + ->warning() + ->send(); + } }) + ->hidden(fn () => $canForceDelete) + ->authorize(fn (Server $server) => auth()->user()->can('delete server', $server)), + Actions\Action::make('ForceDelete') + ->color('danger') + ->label(trans('filament-actions::force-delete.single.label')) + ->modalHeading(trans('filament-actions::force-delete.single.modal.heading', ['label' => $this->getRecordTitle()])) + ->modalSubmitActionLabel(trans('filament-actions::force-delete.single.label')) + ->requiresConfirmation() + ->action(function (Server $server, ServerDeletionService $service) { + try { + $service->withForce()->handle($server); + + return redirect(ListServers::getUrl(panel: 'admin')); + } catch (ConnectionException) { + cache()->forget("servers.$server->uuid.canForceDelete"); + } + }) + ->visible(fn () => $canForceDelete) ->authorize(fn (Server $server) => auth()->user()->can('delete server', $server)), Actions\Action::make('console') ->label(trans('admin/server.console')) diff --git a/lang/en/admin/server.php b/lang/en/admin/server.php index 383c2ed89..255fda56d 100644 --- a/lang/en/admin/server.php +++ b/lang/en/admin/server.php @@ -109,6 +109,8 @@ return [ 'server_suspend_help' => 'This will suspend the Server, stop any running processes, and immediately block the user from being able to access their files or otherwise manage the Server through the panel or API.', 'server_unsuspend_help' => 'This will unsuspend the Server and restore normal user access.', 'server_unsuspended' => 'Server has been unsuspended', + 'error_server_delete' => 'Server couldn\'t be safely deleted.', + 'error_server_delete_body' => 'You may Force Delete it.', 'create_failed' => 'Could not create Server', 'invalid_port_range' => 'Invalid Port Range', 'invalid_port_range_body' => 'Your port range are not valid integers: :port',