diff --git a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php index 11ae0aea6..f2139a0b9 100644 --- a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php @@ -8,10 +8,12 @@ use App\Filament\Admin\Resources\ServerResource\RelationManagers\AllocationsRela use App\Filament\Components\Forms\Actions\PreviewStartupAction; use App\Filament\Components\Forms\Actions\RotateDatabasePasswordAction; use App\Filament\Server\Pages\Console; +use App\Models\Allocation; use App\Models\Database; use App\Models\DatabaseHost; use App\Models\Egg; use App\Models\Mount; +use App\Models\Node; use App\Models\Server; use App\Models\ServerVariable; use App\Models\User; @@ -52,6 +54,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Client\ConnectionException; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\HtmlString; use LogicException; use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; @@ -858,34 +861,53 @@ class EditServer extends EditRecord Forms\Components\Actions::make([ Action::make('transfer') ->label(trans('admin/server.transfer')) - // ->action(fn (TransferServerService $transfer, Server $server) => $transfer->handle($server, [])) - ->disabled() //TODO! - ->form([ //TODO! - Select::make('newNode') - ->label('New Node') + ->disabled(fn (Server $server) => Node::count() <= 1 || $server->isInConflictState()) + ->modalheading(trans('admin/server.transfer')) + ->action(function (TransferServerService $transfer, Server $server, $data) { + try { + $transfer->handle($server, $data); + + Notification::make() + ->title('Transfer started') + ->success() + ->send(); + } catch (Exception $exception) { + Notification::make() + ->title('Transfer failed') + ->body($exception->getMessage()) + ->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() - ->options([ - true => 'on', - false => 'off', - ]), - Select::make('newMainAllocation') - ->label('New Main Allocation') + ->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() - ->options([ - true => 'on', - false => 'off', - ]), - Select::make('newAdditionalAllocation') - ->label('New Additional Allocations') - ->options([ - true => 'on', - false => 'off', - ]), - ]) - ->modalheading(trans('admin/server.transfer')), + ->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(trans('admin/server.transfer_help')), + ->hint(new HtmlString(trans('admin/server.transfer_help'))), ]), Grid::make() ->columnSpan(3) diff --git a/lang/en/admin/server.php b/lang/en/admin/server.php index 893979f46..383c2ed89 100644 --- a/lang/en/admin/server.php +++ b/lang/en/admin/server.php @@ -70,7 +70,7 @@ return [ '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.', 'transfer' => 'Transfer', - 'transfer_help' => 'Transfer this server to another node connected to this panel. Warning! This feature has not been fully tested and may have bugs.', + 'transfer_help' => 'Transfer this server to another node connected to this panel.
Warning! This feature is still experimental. Consider manually making a backup first to avoid data loss!', 'condition' => 'Condition', 'suspend_all' => 'Suspend All Servers', 'unsuspend_all' => 'Unsuspend All Servers',