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
|
||||
{
|
||||
$this->loading = true;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user