diff --git a/frontend-modern/src/components/Alerts/ResourceTable.tsx b/frontend-modern/src/components/Alerts/ResourceTable.tsx index 5b6af9706..25ec7af33 100644 --- a/frontend-modern/src/components/Alerts/ResourceTable.tsx +++ b/frontend-modern/src/components/Alerts/ResourceTable.tsx @@ -1,4 +1,4 @@ -import { For, Show, createSignal } from 'solid-js'; +import { For, Show, createSignal, createEffect } from 'solid-js'; import { TogglePrimitive } from '@/components/shared/Toggle'; import { StatusBadge } from '@/components/shared/StatusBadge'; import type { Alert } from '@/types/api'; @@ -138,14 +138,38 @@ export function ResourceTable(props: ResourceTableProps) { const [activeMetricInput, setActiveMetricInput] = createSignal<{ resourceId: string; metric: string } | null>(null); const [showDelayRow, setShowDelayRow] = createSignal(false); + // Track changes to global defaults and factory defaults for debugging + createEffect(() => { + console.log('[ResourceTable] createEffect triggered - props changed:', { + title: props.title, + globalDefaults: props.globalDefaults, + factoryDefaults: props.factoryDefaults, + onResetDefaults: !!props.onResetDefaults, + }); + }); + // Check if global defaults have been customized from factory defaults const hasCustomGlobalDefaults = () => { - if (!props.globalDefaults || !props.factoryDefaults) return false; - return Object.keys(props.factoryDefaults).some(key => { + console.log('[ResourceTable] hasCustomGlobalDefaults check:', { + globalDefaults: props.globalDefaults, + factoryDefaults: props.factoryDefaults, + title: props.title, + }); + if (!props.globalDefaults || !props.factoryDefaults) { + console.log('[ResourceTable] Missing props, returning false'); + return false; + } + const result = Object.keys(props.factoryDefaults).some(key => { const current = props.globalDefaults?.[key]; const factory = props.factoryDefaults?.[key]; - return current !== undefined && current !== factory; + const differs = current !== undefined && current !== factory; + if (differs) { + console.log(`[ResourceTable] Difference found: ${key} current=${current} factory=${factory}`); + } + return differs; }); + console.log(`[ResourceTable] hasCustomGlobalDefaults result: ${result}`); + return result; }; const normalizeMetricKey = (column: string): string => { diff --git a/frontend-modern/src/components/Alerts/ThresholdsTable.tsx b/frontend-modern/src/components/Alerts/ThresholdsTable.tsx index 0d8eed136..12f54150c 100644 --- a/frontend-modern/src/components/Alerts/ThresholdsTable.tsx +++ b/frontend-modern/src/components/Alerts/ThresholdsTable.tsx @@ -1681,7 +1681,7 @@ const dockerContainersGroupedByHost = createMemo>((pr
- Quick tips: Set any threshold to -1 to disable alerts for that metric. Click on disabled thresholds showing Off to re-enable them. Resources with custom settings show a Custom badge. + Quick tips: Set any threshold to 0 to disable alerts for that metric. Click on disabled thresholds showing Off to re-enable them. Resources with custom settings show a Custom badge.
@@ -1764,6 +1764,50 @@ const dockerContainersGroupedByHost = createMemo>((pr + +
+ { + if (typeof value === 'function') { + const newValue = value({ cpu: props.nodeDefaults.cpu, memory: props.nodeDefaults.memory }); + props.setNodeDefaults((prev) => ({ ...prev, cpu: newValue.cpu ?? prev.cpu, memory: newValue.memory ?? prev.memory })); + } else { + props.setNodeDefaults((prev) => ({ ...prev, cpu: value.cpu ?? prev.cpu, memory: value.memory ?? prev.memory })); + } + }} + setHasUnsavedChanges={props.setHasUnsavedChanges} + globalDisableFlag={props.disableAllPBS} + onToggleGlobalDisable={() => props.setDisableAllPBS(!props.disableAllPBS())} + globalDisableOfflineFlag={props.disableAllPBSOffline} + onToggleGlobalDisableOffline={() => props.setDisableAllPBSOffline(!props.disableAllPBSOffline())} + showDelayColumn={true} + globalDelaySeconds={props.timeThresholds().pbs} + metricDelaySeconds={props.metricTimeThresholds().pbs ?? {}} + onMetricDelayChange={(metric, value) => updateMetricDelay('pbs', metric, value)} + factoryDefaults={props.factoryNodeDefaults ? { cpu: props.factoryNodeDefaults.cpu, memory: props.factoryNodeDefaults.memory } : undefined} + onResetDefaults={props.resetNodeDefaults} + /> +
+
+
>((pr
- -
- { - if (typeof value === 'function') { - const newValue = value({ cpu: props.nodeDefaults.cpu, memory: props.nodeDefaults.memory }); - props.setNodeDefaults((prev) => ({ ...prev, cpu: newValue.cpu ?? prev.cpu, memory: newValue.memory ?? prev.memory })); - } else { - props.setNodeDefaults((prev) => ({ ...prev, cpu: value.cpu ?? prev.cpu, memory: value.memory ?? prev.memory })); - } - }} - setHasUnsavedChanges={props.setHasUnsavedChanges} - globalDisableFlag={props.disableAllPBS} - onToggleGlobalDisable={() => props.setDisableAllPBS(!props.disableAllPBS())} - globalDisableOfflineFlag={props.disableAllPBSOffline} - onToggleGlobalDisableOffline={() => props.setDisableAllPBSOffline(!props.disableAllPBSOffline())} - showDelayColumn={true} - globalDelaySeconds={props.timeThresholds().pbs} - metricDelaySeconds={props.metricTimeThresholds().pbs ?? {}} - onMetricDelayChange={(metric, value) => updateMetricDelay('pbs', metric, value)} - /> -
-
- diff --git a/frontend-modern/src/pages/Alerts.tsx b/frontend-modern/src/pages/Alerts.tsx index a50a5b5bb..3db36a322 100644 --- a/frontend-modern/src/pages/Alerts.tsx +++ b/frontend-modern/src/pages/Alerts.tsx @@ -1895,6 +1895,15 @@ interface ThresholdsTabProps { setDisableAllPMGOffline: (value: boolean) => void; disableAllDockerHostsOffline: () => boolean; setDisableAllDockerHostsOffline: (value: boolean) => void; + // Reset functions and factory defaults + resetGuestDefaults?: () => void; + resetNodeDefaults?: () => void; + resetDockerDefaults?: () => void; + resetStorageDefault?: () => void; + factoryGuestDefaults?: Record; + factoryNodeDefaults?: Record; + factoryDockerDefaults?: Record; + factoryStorageDefault?: number; } function ThresholdsTab(props: ThresholdsTabProps) { @@ -1955,6 +1964,14 @@ function ThresholdsTab(props: ThresholdsTabProps) { setDisableAllPMGOffline={props.setDisableAllPMGOffline} disableAllDockerHostsOffline={props.disableAllDockerHostsOffline} setDisableAllDockerHostsOffline={props.setDisableAllDockerHostsOffline} + resetGuestDefaults={props.resetGuestDefaults} + resetNodeDefaults={props.resetNodeDefaults} + resetDockerDefaults={props.resetDockerDefaults} + resetStorageDefault={props.resetStorageDefault} + factoryGuestDefaults={props.factoryGuestDefaults} + factoryNodeDefaults={props.factoryNodeDefaults} + factoryDockerDefaults={props.factoryDockerDefaults} + factoryStorageDefault={props.factoryStorageDefault} /> ); }