diff --git a/app/Filament/Admin/Resources/NodeResource/Pages/EditNode.php b/app/Filament/Admin/Resources/NodeResource/Pages/EditNode.php index e05d14514..78d5eafdd 100644 --- a/app/Filament/Admin/Resources/NodeResource/Pages/EditNode.php +++ b/app/Filament/Admin/Resources/NodeResource/Pages/EditNode.php @@ -4,6 +4,7 @@ namespace App\Filament\Admin\Resources\NodeResource\Pages; use App\Filament\Admin\Resources\NodeResource; use App\Models\Node; +use App\Repositories\Daemon\DaemonConfigurationRepository; use App\Services\Helpers\SoftwareVersionService; use App\Services\Nodes\NodeAutoDeployService; use App\Services\Nodes\NodeUpdateService; @@ -26,7 +27,7 @@ use Filament\Forms\Set; use Filament\Notifications\Notification; use Filament\Resources\Pages\EditRecord; use Filament\Support\Enums\Alignment; -use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\Client\ConnectionException; use Illuminate\Support\HtmlString; use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; @@ -34,12 +35,13 @@ class EditNode extends EditRecord { protected static string $resource = NodeResource::class; - private bool $errored = false; + private DaemonConfigurationRepository $daemonConfigurationRepository; private NodeUpdateService $nodeUpdateService; - public function boot(NodeUpdateService $nodeUpdateService): void + public function boot(DaemonConfigurationRepository $daemonConfigurationRepository, NodeUpdateService $nodeUpdateService): void { + $this->daemonConfigurationRepository = $daemonConfigurationRepository; $this->nodeUpdateService = $nodeUpdateService; } @@ -597,39 +599,6 @@ class EditNode extends EditRecord return $data; } - protected function handleRecordUpdate(Model $record, array $data): Model - { - if (!$record instanceof Node) { - return $record; - } - - try { - $record = $this->nodeUpdateService->handle($record, $data); - } catch (Exception $exception) { - $this->errored = true; - - Notification::make() - ->title(trans('admin/node.error_connecting', ['node' => $record->name])) - ->body(trans('admin/node.error_connecting_description')) - ->color('warning') - ->icon('tabler-database') - ->warning() - ->send(); - - } - - return parent::handleRecordUpdate($record, $data); - } - - protected function getSavedNotification(): ?Notification - { - if ($this->errored) { - return null; - } - - return parent::getSavedNotification(); - } - protected function getFormActions(): array { return []; @@ -648,6 +617,31 @@ class EditNode extends EditRecord protected function afterSave(): void { $this->fillForm(); + + /** @var Node $node */ + $node = $this->record; + + $changed = collect($node->getChanges())->except(['updated_at', 'name', 'tags', 'public', 'maintenance_mode', 'memory', 'memory_overallocate', 'disk', 'disk_overallocate', 'cpu', 'cpu_overallocate'])->all(); + + try { + if ($changed) { + $this->daemonConfigurationRepository->setNode($node)->update($node); + } + parent::getSavedNotification()?->send(); + } catch (ConnectionException) { + Notification::make() + ->title(trans('admin/node.error_connecting', ['node' => $node->name])) + ->body(trans('admin/node.error_connecting_description')) + ->color('warning') + ->icon('tabler-database') + ->warning() + ->send(); + } + } + + protected function getSavedNotification(): ?Notification + { + return null; } protected function getColumnSpan(): ?int diff --git a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php index 18e6fecc2..87e61954e 100644 --- a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php @@ -34,6 +34,7 @@ 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\Component; use Filament\Forms\Components\Fieldset; use Filament\Forms\Components\Grid; use Filament\Forms\Components\Hidden; @@ -53,7 +54,6 @@ use Filament\Forms\Set; use Filament\Notifications\Notification; use Filament\Resources\Pages\EditRecord; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Client\ConnectionException; use Illuminate\Support\Arr; use Illuminate\Support\Facades\Validator; @@ -65,8 +65,6 @@ class EditServer extends EditRecord { protected static string $resource = ServerResource::class; - private bool $errored = false; - private DaemonServerRepository $daemonServerRepository; public function boot(DaemonServerRepository $daemonServerRepository): void @@ -920,6 +918,7 @@ class EditServer extends EditRecord ->label(trans('admin/server.transfer')) ->disabled(fn (Server $server) => Node::count() <= 1 || $server->isInConflictState()) ->modalheading(trans('admin/server.transfer')) + ->form($this->transferServer()) ->action(function (TransferServerService $transfer, Server $server, $data) { try { $transfer->handle($server, Arr::get($data, 'node_id'), Arr::get($data, 'allocation_id'), Arr::get($data, 'allocation_additional', [])); @@ -935,33 +934,7 @@ class EditServer extends EditRecord ->danger() ->send(); } - }) - ->form([ - Select::make('node_id') - ->label(trans('admin/server.node')) - ->prefixIcon('tabler-server-2') - ->selectablePlaceholder(false) - ->default(fn (Server $server) => Node::whereNot('id', $server->node->id)->first()?->id) - ->required() - ->live() - ->options(fn (Server $server) => Node::whereNot('id', $server->node->id)->pluck('name', 'id')->all()), - Select::make('allocation_id') - ->label(trans('admin/server.primary_allocation')) - ->required() - ->prefixIcon('tabler-network') - ->disabled(fn (Get $get) => !$get('node_id')) - ->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address])) - ->searchable(['ip', 'port', 'ip_alias']) - ->placeholder(trans('admin/server.select_allocation')), - Select::make('allocation_additional') - ->label(trans('admin/server.additional_allocations')) - ->multiple() - ->prefixIcon('tabler-network') - ->disabled(fn (Get $get) => !$get('node_id')) - ->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->when($get('allocation_id'), fn ($query) => $query->whereNot('id', $get('allocation_id')))->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address])) - ->searchable(['ip', 'port', 'ip_alias']) - ->placeholder(trans('admin/server.select_additional')), - ]), + }), ])->fullWidth(), ToggleButtons::make('') ->hint(new HtmlString(trans('admin/server.transfer_help'))), @@ -1005,17 +978,35 @@ class EditServer extends EditRecord ]); } - protected function transferServer(Form $form): Form + /** @return Component[] */ + protected function transferServer(): array { - return $form - ->columns() - ->schema([ - Select::make('toNode') - ->label('New Node'), - TextInput::make('newAllocation') - ->label('Allocation'), - ]); - + return [ + Select::make('node_id') + ->label(trans('admin/server.node')) + ->prefixIcon('tabler-server-2') + ->selectablePlaceholder(false) + ->default(fn (Server $server) => Node::whereNot('id', $server->node->id)->first()?->id) + ->required() + ->live() + ->options(fn (Server $server) => Node::whereNot('id', $server->node->id)->pluck('name', 'id')->all()), + Select::make('allocation_id') + ->label(trans('admin/server.primary_allocation')) + ->required() + ->prefixIcon('tabler-network') + ->disabled(fn (Get $get) => !$get('node_id')) + ->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address])) + ->searchable(['ip', 'port', 'ip_alias']) + ->placeholder(trans('admin/server.select_allocation')), + Select::make('allocation_additional') + ->label(trans('admin/server.additional_allocations')) + ->multiple() + ->prefixIcon('tabler-network') + ->disabled(fn (Get $get) => !$get('node_id')) + ->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->when($get('allocation_id'), fn ($query) => $query->whereNot('id', $get('allocation_id')))->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address])) + ->searchable(['ip', 'port', 'ip_alias']) + ->placeholder(trans('admin/server.select_additional')), + ]; } protected function getHeaderActions(): array @@ -1093,39 +1084,32 @@ class EditServer extends EditRecord return $data; } - protected function handleRecordUpdate(Model $record, array $data): Model + protected function afterSave(): void { - if (!$record instanceof Server) { - return $record; - } + /** @var Server $server */ + $server = $this->record; - /** @var Server $record */ - $record = parent::handleRecordUpdate($record, $data); + $changed = collect($server->getChanges())->except(['updated_at', 'name', 'owner_id', 'condition', 'description', 'external_id', 'tags', 'cpu_pinning', 'allocation_limit', 'database_limit', 'backup_limit', 'skip_scripts'])->all(); try { - $this->daemonServerRepository->setServer($record)->sync(); + if ($changed) { + $this->daemonServerRepository->setServer($server)->sync(); + } + parent::getSavedNotification()?->send(); } catch (ConnectionException) { - $this->errored = true; - Notification::make() - ->title(trans('admin/server.notifications.error_connecting', ['node' => $record->node->name])) + ->title(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name])) ->body(trans('admin/server.notifications.error_connecting_description')) ->color('warning') ->icon('tabler-database') ->warning() ->send(); } - - return $record; } protected function getSavedNotification(): ?Notification { - if ($this->errored) { - return null; - } - - return parent::getSavedNotification(); + return null; } public function getRelationManagers(): array