From bbf96805dd7d91dbcdd0c828f639c7dfa85a0cc4 Mon Sep 17 00:00:00 2001 From: "Joseph.Rawlings" Date: Tue, 2 Dec 2025 16:37:00 -0500 Subject: [PATCH] refactor: implement firewall logs loading via API on page load, enhancing performance and user experience --- .../Database/Seeders/UptimeServerSeeder.php | 74 +++++++ .../Servers/Proxmox/Livewire/Firewall.php | 23 +- .../Servers/Proxmox/views/firewall.blade.php | 199 ++++++++++-------- 3 files changed, 208 insertions(+), 88 deletions(-) create mode 100644 extensions/Others/UptimeLab/Database/Seeders/UptimeServerSeeder.php diff --git a/extensions/Others/UptimeLab/Database/Seeders/UptimeServerSeeder.php b/extensions/Others/UptimeLab/Database/Seeders/UptimeServerSeeder.php new file mode 100644 index 000000000..13dde1a70 --- /dev/null +++ b/extensions/Others/UptimeLab/Database/Seeders/UptimeServerSeeder.php @@ -0,0 +1,74 @@ + 'Web Server 01', + 'ip_address' => '192.168.1.10', + 'server_type' => 'ip', + 'location' => 'Jakarta, Indonesia', + 'is_active' => true, + 'status' => 'online', + 'uptime_percentage' => 99.8, + 'last_online' => now(), + 'last_offline' => now()->subHours(6), + 'last_check' => now(), + 'response_time' => 15, + ], + [ + 'name' => 'Main Database Server', + 'ip_address' => '192.168.1.20', + 'server_type' => 'ip', + 'location' => 'Surabaya, Indonesia', + 'is_active' => true, + 'status' => 'offline', + 'uptime_percentage' => 100.0, + 'last_online' => now()->subHours(5), + 'last_offline' => now(), + 'last_check' => now(), + 'response_time' => null, + ], + [ + 'name' => 'API Gateway', + 'ip_address' => 'api.example.com', + 'server_type' => 'subdomain', + 'location' => 'Bandung, Indonesia', + 'is_active' => true, + 'status' => 'online', + 'uptime_percentage' => 99.9, + 'last_online' => now()->subHours(6), + 'last_offline' => now()->subHours(5), + 'last_check' => now(), + 'response_time' => 25, + ], + [ + 'name' => 'Load Balancer', + 'ip_address' => '192.168.1.40', + 'server_type' => 'ip', + 'location' => 'Jakarta, Indonesia', + 'is_active' => true, + 'status' => 'online', + 'uptime_percentage' => 99.99, + 'last_online' => now(), + 'last_offline' => now()->subHours(6), + 'last_check' => now(), + 'response_time' => 8, + ], + ]; + + foreach ($servers as $serverData) { + UptimeServer::create($serverData); + } + } +} diff --git a/extensions/Servers/Proxmox/Livewire/Firewall.php b/extensions/Servers/Proxmox/Livewire/Firewall.php index 3db741fe9..d6dc9e701 100644 --- a/extensions/Servers/Proxmox/Livewire/Firewall.php +++ b/extensions/Servers/Proxmox/Livewire/Firewall.php @@ -58,7 +58,7 @@ class Firewall extends Component $this->loadFirewallOptions(); $this->loadFirewallRules(); $this->loadNetworkAdapters(); - $this->loadFirewallLogs(); + // Note: loadFirewallLogs() is now called only once via API on page load } protected function loadAvailableIps(): void @@ -797,6 +797,27 @@ class Firewall extends Component } } + /** + * Public method to load firewall logs - called only once on page load via API + */ + #[\Livewire\Attributes\Computed] + public function firewallLogs() + { + return $this->loadFirewallLogs(); + } + + /** + * Fetch firewall logs via API call - returns logs as JSON + */ + public function fetchFirewallLogs(): array + { + $this->loadFirewallLogs(); + return [ + 'logs' => $this->firewallLogs, + 'error' => $this->logError, + ]; + } + public function loadFirewallLogs(): void { $this->logError = ''; diff --git a/extensions/Servers/Proxmox/views/firewall.blade.php b/extensions/Servers/Proxmox/views/firewall.blade.php index c4077ea2a..dd2dc889b 100644 --- a/extensions/Servers/Proxmox/views/firewall.blade.php +++ b/extensions/Servers/Proxmox/views/firewall.blade.php @@ -303,94 +303,116 @@ - @if(!empty($logError)) -
-
- -
-

{{ $logError }}

-
-
-
- @endif +
{ - return Object.values(log).some((value) => { - if (value === null || value === undefined) { - return false; - } - return String(value).toLowerCase().includes(term); - }); + if (term) { + entries = entries.filter((log) => { + return Object.values(log).some((value) => { + if (value === null || value === undefined) { + return false; + } + return String(value).toLowerCase().includes(term); }); + }); + } + + const dir = this.sortDirection === 'asc' ? 1 : -1; + const field = this.sortField; + + return entries.slice().sort((a, b) => { + let aVal = a[field] ?? ''; + let bVal = b[field] ?? ''; + + if (field === 'timestamp_iso') { + const aTime = aVal ? new Date(aVal).getTime() : 0; + const bTime = bVal ? new Date(bVal).getTime() : 0; + return (aTime - bTime) * dir; } - const dir = this.sortDirection === 'asc' ? 1 : -1; - const field = this.sortField; + if (!Number.isNaN(parseFloat(aVal)) && !Number.isNaN(parseFloat(bVal))) { + return (parseFloat(aVal) - parseFloat(bVal)) * dir; + } - return entries.slice().sort((a, b) => { - let aVal = a[field] ?? ''; - let bVal = b[field] ?? ''; - - if (field === 'timestamp_iso') { - const aTime = aVal ? new Date(aVal).getTime() : 0; - const bTime = bVal ? new Date(bVal).getTime() : 0; - return (aTime - bTime) * dir; - } - - if (!Number.isNaN(parseFloat(aVal)) && !Number.isNaN(parseFloat(bVal))) { - return (parseFloat(aVal) - parseFloat(bVal)) * dir; - } - - return String(aVal).localeCompare(String(bVal)) * dir; - }); - }, - }" - class="space-y-4" - > -
-
- - + return String(aVal).localeCompare(String(bVal)) * dir; + }); + }, + }" + @load="initializeLogs()" + > +
+
+
-
- +

Loading firewall logs...

+
+ +
+
+ +
+

+
+ + + +
@else