Add some refreshs & notifications to EditServer action buttons (#1174)

* add some refreshs & notifications to EditServer action buttons

* reinstall server when trying to toggle failed state

* don't show modal on normal toggle install

* don't print raw exception on reinstall & suspension
This commit is contained in:
Boy132 2025-04-01 08:36:19 +02:00 committed by GitHub
parent 2c00f90ba6
commit 630031e1c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 96 additions and 19 deletions

View File

@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\ServerResource\Pages;
use App\Enums\ServerState;
use App\Enums\SuspendAction;
use App\Filament\Admin\Resources\ServerResource;
use App\Filament\Admin\Resources\ServerResource\RelationManagers\AllocationsRelationManager;
@ -30,6 +31,7 @@ use Closure;
use Exception;
use Filament\Actions;
use Filament\Forms;
use Filament\Forms\Components\Actions as FormActions;
use Filament\Forms\Components\Actions\Action;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\Fieldset;
@ -736,7 +738,7 @@ class EditServer extends EditRecord
->deletable(false)
->addable(false)
->columnSpan(4),
Forms\Components\Actions::make([
FormActions::make([
Action::make('createDatabase')
->authorize(fn () => auth()->user()->can('create database'))
->disabled(fn () => DatabaseHost::query()->count() < 1)
@ -804,14 +806,50 @@ class EditServer extends EditRecord
Grid::make()
->columnSpan(3)
->schema([
Forms\Components\Actions::make([
FormActions::make([
Action::make('toggleInstall')
->label(trans('admin/server.toggle_install'))
->disabled(fn (Server $server) => $server->isSuspended())
->action(function (ToggleInstallService $service, Server $server) {
$service->handle($server);
->modal(fn (Server $server) => $server->status === ServerState::InstallFailed)
->modalHeading(trans('admin/server.toggle_install_failed_header'))
->modalDescription(trans('admin/server.toggle_install_failed_desc'))
->modalSubmitActionLabel(trans('admin/server.reinstall'))
->action(function (ToggleInstallService $toggleService, ReinstallServerService $reinstallService, Server $server) {
if ($server->status === ServerState::InstallFailed) {
try {
$reinstallService->handle($server);
$this->refreshFormData(['status', 'docker']);
Notification::make()
->title(trans('admin/server.notifications.reinstall_started'))
->success()
->send();
$this->refreshFormData(['status', 'docker']);
} catch (Exception) {
Notification::make()
->title(trans('admin/server.notifications.reinstall_failed'))
->body(trans('admin/server.error_connecting', ['node' => $server->node->name]))
->danger()
->send();
}
} else {
try {
$toggleService->handle($server);
Notification::make()
->title(trans('admin/server.notifications.install_toggled'))
->success()
->send();
$this->refreshFormData(['status', 'docker']);
} catch (Exception $exception) {
Notification::make()
->title(trans('admin/server.notifications.install_toggle_failed'))
->body($exception->getMessage())
->danger()
->send();
}
}
}),
])->fullWidth(),
ToggleButtons::make('')
@ -820,7 +858,7 @@ class EditServer extends EditRecord
Grid::make()
->columnSpan(3)
->schema([
Forms\Components\Actions::make([
FormActions::make([
Action::make('toggleSuspend')
->label(trans('admin/server.suspend'))
->color('warning')
@ -828,12 +866,20 @@ class EditServer extends EditRecord
->action(function (SuspensionService $suspensionService, Server $server) {
try {
$suspensionService->handle($server, SuspendAction::Suspend);
} catch (\Exception $exception) {
Notification::make()->warning()->title(trans('admin/server.notifications.server_suspension'))->body($exception->getMessage())->send();
}
Notification::make()->success()->title(trans('admin/server.notifications.server_suspended'))->send();
$this->refreshFormData(['status', 'docker']);
Notification::make()
->success()
->title(trans('admin/server.notifications.server_suspended'))
->send();
$this->refreshFormData(['status', 'docker']);
} catch (Exception) {
Notification::make()
->warning()
->title(trans('admin/server.notifications.server_suspension'))
->body(trans('admin/server.error_connecting', ['node' => $server->node->name]))
->send();
}
}),
Action::make('toggleUnsuspend')
->label(trans('admin/server.unsuspend'))
@ -842,12 +888,20 @@ class EditServer extends EditRecord
->action(function (SuspensionService $suspensionService, Server $server) {
try {
$suspensionService->handle($server, SuspendAction::Unsuspend);
} catch (\Exception $exception) {
Notification::make()->warning()->title(trans('admin/server.notifications.server_suspension'))->body($exception->getMessage())->send();
}
Notification::make()->success()->title(trans('admin/server.notifications.server_unsuspended'))->send();
$this->refreshFormData(['status', 'docker']);
Notification::make()
->success()
->title(trans('admin/server.notifications.server_unsuspended'))
->send();
$this->refreshFormData(['status', 'docker']);
} catch (Exception) {
Notification::make()
->warning()
->title(trans('admin/server.notifications.server_suspension'))
->body(trans('admin/server.error_connecting', ['node' => $server->node->name]))
->send();
}
}),
])->fullWidth(),
ToggleButtons::make('')
@ -860,7 +914,7 @@ class EditServer extends EditRecord
Grid::make()
->columnSpan(3)
->schema([
Forms\Components\Actions::make([
FormActions::make([
Action::make('transfer')
->label(trans('admin/server.transfer'))
->disabled(fn (Server $server) => Node::count() <= 1 || $server->isInConflictState())
@ -914,7 +968,7 @@ class EditServer extends EditRecord
Grid::make()
->columnSpan(3)
->schema([
Forms\Components\Actions::make([
FormActions::make([
Action::make('reinstall')
->label(trans('admin/server.reinstall'))
->color('danger')
@ -922,7 +976,24 @@ class EditServer extends EditRecord
->modalHeading(trans('admin/server.reinstall_modal_heading'))
->modalDescription(trans('admin/server.reinstall_modal_description'))
->disabled(fn (Server $server) => $server->isSuspended())
->action(fn (ReinstallServerService $service, Server $server) => $service->handle($server)),
->action(function (ReinstallServerService $service, Server $server) {
try {
$service->handle($server);
Notification::make()
->title(trans('admin/server.notifications.reinstall_started'))
->success()
->send();
$this->refreshFormData(['status', 'docker']);
} catch (Exception) {
Notification::make()
->title(trans('admin/server.notifications.reinstall_failed'))
->body(trans('admin/server.error_connecting', ['node' => $server->node->name]))
->danger()
->send();
}
}),
])->fullWidth(),
ToggleButtons::make('')
->hint(trans('admin/server.reinstall_help')),

View File

@ -69,6 +69,8 @@ return [
'short_uuid' => 'Short UUID',
'toggle_install' => 'Toggle Install Status',
'toggle_install_help' => 'If you need to change the install status from uninstalled to installed, or vice versa, you may do so with this button.',
'toggle_install_failed_header' => 'Server is in failed state',
'toggle_install_failed_desc' => 'Do you want to reinstall the server to fix this?',
'transfer' => 'Transfer',
'transfer_help' => 'Transfer this server to another node connected to this panel.<br/><b>Warning!</b> This feature is still experimental. Consider manually making a backup first to avoid data loss!',
'condition' => 'Condition',
@ -122,5 +124,9 @@ return [
'already_exists_body' => ':i is already with an allocation',
'error_connecting' => 'Error connecting to :node',
'error_connecting_description' => 'The configuration could not be automatically synced on Wings, you will need to manually restart the server.',
'install_toggled' => 'Install status toggled',
'install_toggle_failed' => 'Could not toggle install status',
'reinstall_started' => 'Reinstall started',
'reinstall_failed' => 'Could not start reinstall',
],
];