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:
2025-12-01 14:14:19 -05:00
parent 51b9997c28
commit 51ff95ccea
2 changed files with 65 additions and 2 deletions

View File

@@ -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
{
$this->loading = true;

View File

@@ -374,15 +374,29 @@
</td>
<td class="py-3 px-4 text-sm">
<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
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" />
</button>
<button
wire:click="deleteRule({{ $rule['pos'] ?? 0 }})"
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" />
</button>
</div>