feat(alerts): add UI toggle to disable container update alerts
Some checks failed
Build and Test / Secret Scan (push) Waiting to run
Build and Test / Frontend & Backend (push) Waiting to run
Core E2E Tests / Playwright Core E2E (push) Waiting to run
Helm CI / Lint and Render Chart (push) Has been cancelled

Backend already supported updateAlertDelayHours: -1 to suppress update
alerts but there was no way to configure it from the UI. Adds a toggle
in Settings → Alerts → Docker tab that maps to that backend field.
This commit is contained in:
rcourtman 2026-03-15 12:13:26 +00:00
parent 24856ed7b2
commit da928cd9d3
3 changed files with 27 additions and 0 deletions

View file

@ -221,6 +221,8 @@ interface ThresholdsTableProps {
setDockerDisableConnectivity: (value: boolean) => void;
dockerPoweredOffSeverity: () => 'warning' | 'critical';
setDockerPoweredOffSeverity: (value: 'warning' | 'critical') => void;
containerUpdateAlertsEnabled: () => boolean;
setContainerUpdateAlertsEnabled: (value: boolean) => void;
setDockerDefaults: (
value:
| {
@ -3497,6 +3499,19 @@ export function ThresholdsTable(props: ThresholdsTableProps) {
/>
</Card>
<Card padding="md" tone="glass" class="mb-6">
<Toggle
checked={props.containerUpdateAlertsEnabled()}
onToggle={() => {
props.setContainerUpdateAlertsEnabled(!props.containerUpdateAlertsEnabled());
props.setHasUnsavedChanges(true);
}}
label={<span class="text-sm font-semibold text-gray-900 dark:text-gray-100">Container update alerts</span>}
description={<span class="text-xs text-gray-500 dark:text-gray-400">Alert when container images have updates available</span>}
size="sm"
/>
</Card>
<Card padding="md" tone="glass" class="mb-6">
<div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
<div>

View file

@ -1115,10 +1115,12 @@ export function Alerts() {
setDockerPoweredOffSeverity(
config.dockerDefaults.statePoweredOffSeverity === 'critical' ? 'critical' : 'warning',
);
setContainerUpdateAlertsEnabled(config.dockerDefaults.updateAlertDelayHours !== -1);
} else {
setDockerDefaults({ ...FACTORY_DOCKER_DEFAULTS });
setDockerDisableConnectivity(FACTORY_DOCKER_STATE_DISABLE_CONNECTIVITY);
setDockerPoweredOffSeverity(FACTORY_DOCKER_STATE_SEVERITY);
setContainerUpdateAlertsEnabled(true);
}
setDockerIgnoredPrefixes(config.dockerIgnoredContainerPrefixes ?? []);
setIgnoredGuestPrefixes(config.ignoredGuestPrefixes ?? []);
@ -1558,6 +1560,7 @@ export function Alerts() {
const [dockerPoweredOffSeverity, setDockerPoweredOffSeverity] = createSignal<'warning' | 'critical'>(
FACTORY_DOCKER_STATE_SEVERITY,
);
const [containerUpdateAlertsEnabled, setContainerUpdateAlertsEnabled] = createSignal(true);
const [dockerIgnoredPrefixes, setDockerIgnoredPrefixes] = createSignal<string[]>([]);
const [ignoredGuestPrefixes, setIgnoredGuestPrefixes] = createSignal<string[]>([]);
const [guestTagWhitelist, setGuestTagWhitelist] = createSignal<string[]>([]);
@ -1592,6 +1595,7 @@ export function Alerts() {
setDockerDefaults({ ...FACTORY_DOCKER_DEFAULTS });
setDockerDisableConnectivity(FACTORY_DOCKER_STATE_DISABLE_CONNECTIVITY);
setDockerPoweredOffSeverity(FACTORY_DOCKER_STATE_SEVERITY);
setContainerUpdateAlertsEnabled(true);
setHasUnsavedChanges(true);
};
@ -1882,6 +1886,7 @@ export function Alerts() {
serviceCriticalGapPercent: dockerDefaultsValue.serviceCriticalGapPercent,
stateDisableConnectivity: dockerDisableConnectivity(),
statePoweredOffSeverity: dockerPoweredOffSeverity(),
updateAlertDelayHours: containerUpdateAlertsEnabled() ? 24 : -1,
},
dockerIgnoredContainerPrefixes: dockerIgnoredPrefixes()
.map((prefix) => prefix.trim())
@ -2176,6 +2181,8 @@ export function Alerts() {
setDockerDisableConnectivity={setDockerDisableConnectivity}
dockerPoweredOffSeverity={dockerPoweredOffSeverity}
setDockerPoweredOffSeverity={setDockerPoweredOffSeverity}
containerUpdateAlertsEnabled={containerUpdateAlertsEnabled}
setContainerUpdateAlertsEnabled={setContainerUpdateAlertsEnabled}
setDockerDefaults={setDockerDefaults}
dockerIgnoredPrefixes={dockerIgnoredPrefixes}
setDockerIgnoredPrefixes={setDockerIgnoredPrefixes}
@ -2911,6 +2918,7 @@ interface ThresholdsTabProps {
};
dockerDisableConnectivity: () => boolean;
dockerPoweredOffSeverity: () => 'warning' | 'critical';
containerUpdateAlertsEnabled: () => boolean;
dockerIgnoredPrefixes: () => string[];
ignoredGuestPrefixes: () => string[];
guestTagWhitelist: () => string[];
@ -2987,6 +2995,7 @@ interface ThresholdsTabProps {
) => void;
setDockerDisableConnectivity: (value: boolean) => void;
setDockerPoweredOffSeverity: (value: 'warning' | 'critical') => void;
setContainerUpdateAlertsEnabled: (value: boolean) => void;
setDockerIgnoredPrefixes: (value: string[] | ((prev: string[]) => string[])) => void;
setIgnoredGuestPrefixes: (value: string[] | ((prev: string[]) => string[])) => void;
setGuestTagWhitelist: (value: string[] | ((prev: string[]) => string[])) => void;
@ -3102,6 +3111,8 @@ function ThresholdsTab(props: ThresholdsTabProps) {
dockerDefaults={props.dockerDefaults()}
dockerDisableConnectivity={props.dockerDisableConnectivity}
dockerPoweredOffSeverity={props.dockerPoweredOffSeverity}
containerUpdateAlertsEnabled={props.containerUpdateAlertsEnabled}
setContainerUpdateAlertsEnabled={props.setContainerUpdateAlertsEnabled}
setDockerDefaults={props.setDockerDefaults}
setDockerDisableConnectivity={props.setDockerDisableConnectivity}
setDockerPoweredOffSeverity={props.setDockerPoweredOffSeverity}

View file

@ -73,6 +73,7 @@ export interface DockerThresholdConfig {
serviceCriticalGapPercent?: number;
stateDisableConnectivity?: boolean;
statePoweredOffSeverity?: 'warning' | 'critical';
updateAlertDelayHours?: number;
}
export interface PMGThresholdDefaults {