diff --git a/extensions/Servers/Proxmox/Livewire/Firewall.php b/extensions/Servers/Proxmox/Livewire/Firewall.php index 7bbaec570..d6c0ea6d0 100644 --- a/extensions/Servers/Proxmox/Livewire/Firewall.php +++ b/extensions/Servers/Proxmox/Livewire/Firewall.php @@ -15,6 +15,7 @@ class Firewall extends Component public array $ipsets = []; public bool $loading = false; public string $error = ''; + public bool $showErrorModal = false; // Rule creation/editing public ?int $editingRulePos = null; @@ -88,7 +89,18 @@ class Firewall extends Component $this->firewallEnabled = isset($data['enable']) && $data['enable'] == 1; $this->error = ''; } catch (\Exception $e) { - $this->error = 'Failed to load firewall options: ' . $e->getMessage(); + $errorMessage = $e->getMessage(); + // Try to extract more detailed error from response if available + if (method_exists($e, 'response') && $e->response()) { + $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']; + } + } + $this->error = 'Failed to load firewall options: ' . $errorMessage; + $this->showErrorModal = true; $this->firewallEnabled = false; } } @@ -130,11 +142,13 @@ class Firewall extends Component $errorMessage = $errorData['message']; } } - $this->notify('Failed to toggle firewall: ' . $errorMessage, 'error'); + $this->error = 'Failed to toggle firewall: ' . $errorMessage; + $this->showErrorModal = true; // Reload to ensure UI matches actual state $this->loadFirewallOptions(); } catch (\Exception $e) { - $this->notify('Failed to toggle firewall: ' . $e->getMessage(), 'error'); + $this->error = 'Failed to toggle firewall: ' . $e->getMessage(); + $this->showErrorModal = true; // Reload to ensure UI matches actual state $this->loadFirewallOptions(); } finally { @@ -152,7 +166,18 @@ class Firewall extends Component $this->rules = is_array($data) ? $data : []; $this->error = ''; } catch (\Exception $e) { - $this->error = 'Failed to load firewall rules: ' . $e->getMessage(); + $errorMessage = $e->getMessage(); + // Try to extract more detailed error from response if available + if (method_exists($e, 'response') && $e->response()) { + $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']; + } + } + $this->error = 'Failed to load firewall rules: ' . $errorMessage; + $this->showErrorModal = true; $this->rules = []; } } @@ -238,10 +263,21 @@ class Firewall extends Component $this->loadFirewallRules(); } else { $message = $response->json()['errors'][0]['message'] ?? 'Unknown error'; - $this->notify('Failed to save rule: ' . $message, 'error'); + $this->error = 'Failed to save rule: ' . $message; + $this->showErrorModal = true; } } catch (\Exception $e) { - $this->notify('Failed to save rule: ' . $e->getMessage(), 'error'); + $errorMessage = $e->getMessage(); + if (method_exists($e, 'response') && $e->response()) { + $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']; + } + } + $this->error = 'Failed to save rule: ' . $errorMessage; + $this->showErrorModal = true; } finally { $this->loading = false; } @@ -261,10 +297,21 @@ class Firewall extends Component $this->loadFirewallRules(); } else { $message = $response->json()['errors'][0]['message'] ?? 'Unknown error'; - $this->notify('Failed to delete rule: ' . $message, 'error'); + $this->error = 'Failed to delete rule: ' . $message; + $this->showErrorModal = true; } } catch (\Exception $e) { - $this->notify('Failed to delete rule: ' . $e->getMessage(), 'error'); + $errorMessage = $e->getMessage(); + if (method_exists($e, 'response') && $e->response()) { + $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']; + } + } + $this->error = 'Failed to delete rule: ' . $errorMessage; + $this->showErrorModal = true; } finally { $this->loading = false; } @@ -286,7 +333,8 @@ class Firewall extends Component public function createAlias(): void { if (empty($this->aliasName) || empty($this->aliasCidr)) { - $this->notify('Name and CIDR are required', 'error'); + $this->error = 'Name and CIDR are required'; + $this->showErrorModal = true; return; } @@ -314,10 +362,21 @@ class Firewall extends Component $this->loadAliases(); } else { $message = $response->json()['errors'][0]['message'] ?? 'Unknown error'; - $this->notify('Failed to create alias: ' . $message, 'error'); + $this->error = 'Failed to create alias: ' . $message; + $this->showErrorModal = true; } } catch (\Exception $e) { - $this->notify('Failed to create alias: ' . $e->getMessage(), 'error'); + $errorMessage = $e->getMessage(); + if (method_exists($e, 'response') && $e->response()) { + $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']; + } + } + $this->error = 'Failed to create alias: ' . $errorMessage; + $this->showErrorModal = true; } finally { $this->loading = false; } @@ -337,10 +396,21 @@ class Firewall extends Component $this->loadAliases(); } else { $message = $response->json()['errors'][0]['message'] ?? 'Unknown error'; - $this->notify('Failed to delete alias: ' . $message, 'error'); + $this->error = 'Failed to delete alias: ' . $message; + $this->showErrorModal = true; } } catch (\Exception $e) { - $this->notify('Failed to delete alias: ' . $e->getMessage(), 'error'); + $errorMessage = $e->getMessage(); + if (method_exists($e, 'response') && $e->response()) { + $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']; + } + } + $this->error = 'Failed to delete alias: ' . $errorMessage; + $this->showErrorModal = true; } finally { $this->loading = false; } @@ -362,7 +432,8 @@ class Firewall extends Component public function createIpset(): void { if (empty($this->ipsetName)) { - $this->notify('Name is required', 'error'); + $this->error = 'Name is required'; + $this->showErrorModal = true; return; } @@ -388,10 +459,21 @@ class Firewall extends Component $this->loadIpsets(); } else { $message = $response->json()['errors'][0]['message'] ?? 'Unknown error'; - $this->notify('Failed to create IP set: ' . $message, 'error'); + $this->error = 'Failed to create IP set: ' . $message; + $this->showErrorModal = true; } } catch (\Exception $e) { - $this->notify('Failed to create IP set: ' . $e->getMessage(), 'error'); + $errorMessage = $e->getMessage(); + if (method_exists($e, 'response') && $e->response()) { + $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']; + } + } + $this->error = 'Failed to create IP set: ' . $errorMessage; + $this->showErrorModal = true; } finally { $this->loading = false; } @@ -411,10 +493,21 @@ class Firewall extends Component $this->loadIpsets(); } else { $message = $response->json()['errors'][0]['message'] ?? 'Unknown error'; - $this->notify('Failed to delete IP set: ' . $message, 'error'); + $this->error = 'Failed to delete IP set: ' . $message; + $this->showErrorModal = true; } } catch (\Exception $e) { - $this->notify('Failed to delete IP set: ' . $e->getMessage(), 'error'); + $errorMessage = $e->getMessage(); + if (method_exists($e, 'response') && $e->response()) { + $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']; + } + } + $this->error = 'Failed to delete IP set: ' . $errorMessage; + $this->showErrorModal = true; } finally { $this->loading = false; } diff --git a/extensions/Servers/Proxmox/views/firewall.blade.php b/extensions/Servers/Proxmox/views/firewall.blade.php index fcadc826d..d8ffc4cc0 100644 --- a/extensions/Servers/Proxmox/views/firewall.blade.php +++ b/extensions/Servers/Proxmox/views/firewall.blade.php @@ -51,18 +51,20 @@
{{ $error }}
+{{ $error }}
+