From 27f2038dab13f6998128f6305d8e5209ae8ee3f8 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 5 Nov 2025 14:11:53 +0000 Subject: [PATCH] Add per-node temperature monitoring and fix critical config update bug This commit implements per-node temperature monitoring control and fixes a critical bug where partial node updates were destroying existing configuration. Backend changes: - Add TemperatureMonitoringEnabled field (*bool) to PVEInstance, PBSInstance, and PMGInstance - Update monitor.go to check per-node temperature setting with global fallback - Convert all NodeConfigRequest boolean fields to *bool pointers - Add nil checks in HandleUpdateNode to prevent overwriting unmodified fields - Fix critical bug where partial updates zeroed out MonitorVMs, MonitorContainers, etc. - Update NodeResponse, NodeFrontend, and StateSnapshot to include temperature setting - Fix HandleAddNode and test connection handlers to use pointer-based boolean fields Frontend changes: - Add temperatureMonitoringEnabled to Node interface and config types - Create per-node temperature monitoring toggle handler with optimistic updates - Update NodeModal to wire up per-node temperature toggle - Add isTemperatureMonitoringEnabled helper to check effective monitoring state - Update ConfiguredNodeTables to show/hide temperature badge based on monitoring state - Update NodeSummaryTable to conditionally show temperature column - Pass globalTemperatureMonitoringEnabled prop through component tree The critical bug fix ensures that when updating a single field (like temperature monitoring), the backend only modifies that specific field instead of zeroing out all other boolean configuration fields. --- .../src/components/Backups/UnifiedBackups.tsx | 1 + .../src/components/Dashboard/Dashboard.tsx | 1 + .../src/components/Docker/DockerHosts.tsx | 2 +- .../Settings/ConfiguredNodeTables.tsx | 36 +- .../src/components/Settings/NodeModal.tsx | 4 +- .../src/components/Settings/Settings.tsx | 96 ++- .../src/components/Storage/Storage.tsx | 1 + .../components/shared/NodeSummaryTable.tsx | 21 +- .../components/shared/UnifiedNodeSelector.tsx | 2 + frontend-modern/src/types/api.ts | 2 + frontend-modern/src/types/nodes.ts | 3 + internal/api/config_handlers.go | 561 ++++++++++++------ internal/api/types.go | 23 +- internal/config/config.go | 67 ++- internal/models/converters.go | 43 +- internal/models/models.go | 16 +- internal/models/models_frontend.go | 14 +- internal/models/state_snapshot.go | 25 +- internal/monitoring/monitor.go | 17 +- 19 files changed, 655 insertions(+), 280 deletions(-) diff --git a/frontend-modern/src/components/Backups/UnifiedBackups.tsx b/frontend-modern/src/components/Backups/UnifiedBackups.tsx index e9dd169..e2fb97e 100644 --- a/frontend-modern/src/components/Backups/UnifiedBackups.tsx +++ b/frontend-modern/src/components/Backups/UnifiedBackups.tsx @@ -1076,6 +1076,7 @@ const UnifiedBackups: Component = () => { {/* Unified Node Selector */} { setSelectedNode(nodeId); }} diff --git a/frontend-modern/src/components/Dashboard/Dashboard.tsx b/frontend-modern/src/components/Dashboard/Dashboard.tsx index c416b13..aa83aa7 100644 --- a/frontend-modern/src/components/Dashboard/Dashboard.tsx +++ b/frontend-modern/src/components/Dashboard/Dashboard.tsx @@ -762,6 +762,7 @@ export function Dashboard(props: DashboardProps) { {/* Unified Node Selector */} g.type === 'qemu')} diff --git a/frontend-modern/src/components/Docker/DockerHosts.tsx b/frontend-modern/src/components/Docker/DockerHosts.tsx index 35db880..97a0ea4 100644 --- a/frontend-modern/src/components/Docker/DockerHosts.tsx +++ b/frontend-modern/src/components/Docker/DockerHosts.tsx @@ -322,7 +322,7 @@ export const DockerHosts: Component = (props) => { actions={