From 7b1bfe8b23ca9c8107007e228cc2ddc20eb5a78b Mon Sep 17 00:00:00 2001 From: "Joseph.Rawlings" Date: Thu, 4 Dec 2025 11:25:35 -0500 Subject: [PATCH] feat: implement drag-and-drop functionality for reordering firewall rules in Proxmox view --- .../Servers/Proxmox/Livewire/Firewall.php | 48 +++++ .../Servers/Proxmox/views/firewall.blade.php | 166 ++++++++++++++---- 2 files changed, 182 insertions(+), 32 deletions(-) diff --git a/extensions/Servers/Proxmox/Livewire/Firewall.php b/extensions/Servers/Proxmox/Livewire/Firewall.php index 69b04275b..dc1c3209e 100644 --- a/extensions/Servers/Proxmox/Livewire/Firewall.php +++ b/extensions/Servers/Proxmox/Livewire/Firewall.php @@ -481,6 +481,54 @@ class Firewall extends Component } } + public function reorderRules(int $fromPos, int $toPos): void + { + try { + // Proxmox API uses PUT with moveto parameter to reorder rules + $response = $this->firewallRequest( + '/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules/' . $fromPos, + 'put', + ['moveto' => $toPos] + ); + + if ($response->successful()) { + $this->notify('Rule reordered successfully', 'success'); + $this->loadFirewallRules(); + } else { + $message = $response->json()['errors'][0]['message'] ?? 'Unknown error'; + $this->error = 'Failed to reorder rule: ' . $message; + $this->showErrorModal = true; + \Log::error('Failed to reorder firewall rule', [ + 'from' => $fromPos, + 'to' => $toPos, + 'response' => $response->json() + ]); + } + } catch (\Exception $e) { + $errorMessage = $e->getMessage(); + if (method_exists($e, 'response') && $e->response()) { + try { + $errorData = $e->response()->json(); + if (isset($errorData['errors']) && is_array($errorData['errors']) && !empty($errorData['errors'])) { + $errorMessage = $errorData['errors'][0]['message'] ?? $errorMessage; + } elseif (isset($errorData['message'])) { + $errorMessage = $errorData['message']; + } + } catch (\Exception $jsonError) { + // Response might not be JSON + } + } + $this->error = 'Failed to reorder rule: ' . $errorMessage; + $this->showErrorModal = true; + \Log::error('Exception reordering firewall rule', [ + 'from' => $fromPos, + 'to' => $toPos, + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + } + } + public function loadAliases(): void { try { diff --git a/extensions/Servers/Proxmox/views/firewall.blade.php b/extensions/Servers/Proxmox/views/firewall.blade.php index 38cc2ee21..7726d51df 100644 --- a/extensions/Servers/Proxmox/views/firewall.blade.php +++ b/extensions/Servers/Proxmox/views/firewall.blade.php @@ -92,6 +92,36 @@ padding-left: 2.75rem !important; } + /* Drag and Drop Styles */ + .rule-row { + transition: all 0.2s ease; + cursor: move; + } + .rule-row.dragging { + opacity: 0.5; + background-color: rgba(var(--color-primary), 0.1); + } + .rule-row.drag-over { + border-top: 3px solid rgba(var(--color-primary), 1); + } + .drag-handle { + cursor: grab; + color: rgba(var(--color-base), 0.4); + transition: color 0.2s; + display: flex; + align-items: center; + padding: 0.5rem; + } + .drag-handle:hover { + color: rgba(var(--color-primary), 1); + } + .drag-handle:active { + cursor: grabbing; + } + .rule-row:hover .drag-handle { + color: rgba(var(--color-base), 0.7); + } + /* Firewall Log Filter Buttons */ .firewall-filter-label { font-size: 0.65rem; @@ -517,10 +547,79 @@ @if(count($rules) > 0) -
+
+ @@ -532,50 +631,53 @@ - @foreach($rules as $rule) - - -
Position Action Source
{{ $rule['pos'] ?? '-' }} - - {{ $rule['action'] ?? '-' }} - +