feat: implement rule toggling functionality in Proxmox Firewall component, allowing users to enable or disable firewall rules directly from the interface for improved management
This commit is contained in:
@@ -358,6 +358,55 @@ class Firewall extends Component
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function toggleRule(int $pos): void
|
||||||
|
{
|
||||||
|
$this->loading = true;
|
||||||
|
try {
|
||||||
|
// Find the rule to get its current enable state
|
||||||
|
$rule = collect($this->rules)->firstWhere('pos', $pos);
|
||||||
|
if (!$rule) {
|
||||||
|
$this->error = 'Rule not found';
|
||||||
|
$this->showErrorModal = true;
|
||||||
|
$this->loading = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggle the enable state (0 = disabled, 1 = enabled)
|
||||||
|
$currentEnable = isset($rule['enable']) ? (int)$rule['enable'] : 1;
|
||||||
|
$newEnable = $currentEnable == 0 ? 1 : 0;
|
||||||
|
|
||||||
|
// Update only the enable field
|
||||||
|
$response = $this->firewallRequest(
|
||||||
|
'/nodes/' . $this->server->node->name . '/qemu/' . $this->server->vm_id . '/firewall/rules/' . $pos,
|
||||||
|
'put',
|
||||||
|
['enable' => $newEnable]
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($response->successful()) {
|
||||||
|
$this->notify('Rule ' . ($newEnable == 1 ? 'enabled' : 'disabled') . ' successfully', 'success');
|
||||||
|
$this->loadFirewallRules();
|
||||||
|
} else {
|
||||||
|
$message = $response->json()['errors'][0]['message'] ?? 'Unknown error';
|
||||||
|
$this->error = 'Failed to toggle rule: ' . $message;
|
||||||
|
$this->showErrorModal = true;
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$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 toggle rule: ' . $errorMessage;
|
||||||
|
$this->showErrorModal = true;
|
||||||
|
} finally {
|
||||||
|
$this->loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function deleteRule(int $pos): void
|
public function deleteRule(int $pos): void
|
||||||
{
|
{
|
||||||
$this->loading = true;
|
$this->loading = true;
|
||||||
|
|||||||
@@ -374,15 +374,29 @@
|
|||||||
</td>
|
</td>
|
||||||
<td class="py-3 px-4 text-sm">
|
<td class="py-3 px-4 text-sm">
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
|
<button
|
||||||
|
wire:click="toggleRule({{ $rule['pos'] ?? 0 }})"
|
||||||
|
wire:loading.attr="disabled"
|
||||||
|
class="transition-colors
|
||||||
|
{{ (isset($rule['enable']) && $rule['enable'] == 0) ? 'text-warning hover:text-warning/80' : 'text-success hover:text-success/80' }}"
|
||||||
|
title="{{ (isset($rule['enable']) && $rule['enable'] == 0) ? 'Enable rule' : 'Disable rule' }}">
|
||||||
|
@if(isset($rule['enable']) && $rule['enable'] == 0)
|
||||||
|
<x-ri-toggle-line class="size-4" />
|
||||||
|
@else
|
||||||
|
<x-ri-toggle-fill class="size-4" />
|
||||||
|
@endif
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
wire:click="startEditRule({{ $rule['pos'] ?? 0 }})"
|
wire:click="startEditRule({{ $rule['pos'] ?? 0 }})"
|
||||||
class="text-primary hover:text-primary/80 transition-colors">
|
class="text-primary hover:text-primary/80 transition-colors"
|
||||||
|
title="Edit rule">
|
||||||
<x-ri-edit-line class="size-4" />
|
<x-ri-edit-line class="size-4" />
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
wire:click="deleteRule({{ $rule['pos'] ?? 0 }})"
|
wire:click="deleteRule({{ $rule['pos'] ?? 0 }})"
|
||||||
wire:confirm="Are you sure you want to delete this rule?"
|
wire:confirm="Are you sure you want to delete this rule?"
|
||||||
class="text-error hover:text-error/80 transition-colors">
|
class="text-error hover:text-error/80 transition-colors"
|
||||||
|
title="Delete rule">
|
||||||
<x-ri-delete-bin-line class="size-4" />
|
<x-ri-delete-bin-line class="size-4" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user