diff --git a/AppImage/components/proxmox-dashboard.tsx b/AppImage/components/proxmox-dashboard.tsx index 8e00cfbd..c19eccc4 100644 --- a/AppImage/components/proxmox-dashboard.tsx +++ b/AppImage/components/proxmox-dashboard.tsx @@ -74,7 +74,6 @@ export function ProxmoxDashboard() { serverName: "Loading...", nodeId: "Loading...", }) - const [isInitialLoading, setIsInitialLoading] = useState(true) const [isRefreshing, setIsRefreshing] = useState(false) const [isServerConnected, setIsServerConnected] = useState(true) const [componentKey, setComponentKey] = useState(0) @@ -193,8 +192,8 @@ export function ProxmoxDashboard() { }, []) useEffect(() => { - // Siempre fetch inicial — mark loading done when system data arrives - fetchSystemData().finally(() => setIsInitialLoading(false)) + // Siempre fetch inicial + fetchSystemData() fetchHealthInfoCount() fetchUpdateStatus() @@ -373,21 +372,6 @@ export function ProxmoxDashboard() { } } - if (isInitialLoading) { - return ( -
-
-
-
-
-
-
Loading ProxMenux Monitor...
-

Connecting to server and fetching system status

-
-
- ) - } - return (
diff --git a/AppImage/components/system-overview.tsx b/AppImage/components/system-overview.tsx index 92a4d897..87c50dec 100644 --- a/AppImage/components/system-overview.tsx +++ b/AppImage/components/system-overview.tsx @@ -259,19 +259,13 @@ export function SystemOverview() { if (!hasAttemptedLoad || loadingStates.system) { return ( -
-
- {[...Array(4)].map((_, i) => ( - - -
-
-
-
-
-
- ))} +
+
+
+
+
Loading system overview...
+

Fetching system status and metrics

) } diff --git a/AppImage/scripts/health_persistence.py b/AppImage/scripts/health_persistence.py index b985e185..055d5da1 100644 --- a/AppImage/scripts/health_persistence.py +++ b/AppImage/scripts/health_persistence.py @@ -338,20 +338,25 @@ class HealthPersistence: else: print(f"[HealthPersistence] Database initialized with {len(tables)} tables") - # ─── Startup migration: clean stale looping disk I/O errors ─── - # Previous versions had a bug where journal-based disk errors were + # ─── Startup migration: clean stale errors from previous bug ─── + # Previous versions had a bug where journal-based errors were # re-processed every cycle, causing infinite notification loops. - # On upgrade, clean up any stale disk errors that are stuck in the + # On upgrade, clean up any stale errors that are stuck in the # active state from the old buggy behavior. + # Covers: disk I/O (smart_*, disk_*), VM/CT (vm_*, ct_*, vmct_*), + # and log errors (log_*) — all journal-sourced categories. try: cursor = conn.cursor() - # Delete active (unresolved) disk errors from journal that are - # older than 2 hours — these are leftovers from the feedback loop. - # Real new errors will be re-detected from fresh journal entries. cutoff = (datetime.now() - timedelta(hours=2)).isoformat() cursor.execute(''' DELETE FROM errors - WHERE error_key LIKE 'smart_%' + WHERE ( error_key LIKE 'smart_%' + OR error_key LIKE 'disk_%' + OR error_key LIKE 'vm_%' + OR error_key LIKE 'ct_%' + OR error_key LIKE 'vmct_%' + OR error_key LIKE 'log_%' + ) AND resolved_at IS NULL AND acknowledged = 0 AND last_seen < ? @@ -359,7 +364,7 @@ class HealthPersistence: cleaned = cursor.rowcount if cleaned > 0: conn.commit() - print(f"[HealthPersistence] Startup cleanup: removed {cleaned} stale disk error(s) from previous bug") + print(f"[HealthPersistence] Startup cleanup: removed {cleaned} stale error(s) from previous versions") except Exception as e: print(f"[HealthPersistence] Startup cleanup warning: {e}")