diff --git a/frontend-modern/src/components/Dashboard/GuestRow.tsx b/frontend-modern/src/components/Dashboard/GuestRow.tsx
index 408aa2b..d14b8f5 100644
--- a/frontend-modern/src/components/Dashboard/GuestRow.tsx
+++ b/frontend-modern/src/components/Dashboard/GuestRow.tsx
@@ -5,7 +5,8 @@ import { MetricBar } from './MetricBar';
import { IOMetric } from './IOMetric';
import { TagBadges } from './TagBadges';
import { DiskList } from './DiskList';
-import { isGuestRunning } from '@/utils/status';
+import { StatusDot } from '@/components/shared/StatusDot';
+import { getGuestPowerIndicator, isGuestRunning } from '@/utils/status';
import { GuestMetadataAPI } from '@/api/guestMetadata';
import { showSuccess, showError } from '@/utils/toast';
import { logger } from '@/utils/logger';
@@ -334,6 +335,7 @@ export function GuestRow(props: GuestRowProps) {
const parentOnline = createMemo(() => props.parentNodeOnline !== false);
const isRunning = createMemo(() => isGuestRunning(props.guest, parentOnline()));
+ const guestStatus = createMemo(() => getGuestPowerIndicator(props.guest, parentOnline()));
const lockLabel = createMemo(() => (props.guest.lock || '').trim());
// Get helpful tooltip for disk status
@@ -425,96 +427,106 @@ export function GuestRow(props: GuestRowProps) {
{/* Name - Sticky column */}
-
+
{/* Tag badges - hide when editing URL to save space */}
diff --git a/frontend-modern/src/components/Docker/DockerHostSummaryTable.tsx b/frontend-modern/src/components/Docker/DockerHostSummaryTable.tsx
index 2e3bd18..43b590c 100644
--- a/frontend-modern/src/components/Docker/DockerHostSummaryTable.tsx
+++ b/frontend-modern/src/components/Docker/DockerHostSummaryTable.tsx
@@ -7,6 +7,8 @@ import { resolveHostRuntime } from './runtimeDisplay';
import { formatPercent, formatUptime } from '@/utils/format';
import { ScrollableTable } from '@/components/shared/ScrollableTable';
import { buildMetricKey } from '@/utils/metricsKeys';
+import { StatusDot } from '@/components/shared/StatusDot';
+import { getDockerHostStatusIndicator } from '@/utils/status';
export interface DockerHostSummary {
host: DockerHost;
@@ -243,6 +245,7 @@ export const DockerHostSummaryTable: Component = (p
const runtimeInfo = resolveHostRuntime(summary.host);
const runtimeVersion = summary.host.runtimeVersion || summary.host.dockerVersion;
const metricsKey = buildMetricKey('dockerHost', summary.host.id);
+ const hostStatus = createMemo(() => getDockerHostStatusIndicator(summary.host));
return (
= (p
onClick={() => props.onSelect(summary.host.id)}
>
-
+
+
{getDisplayName(summary.host)}
diff --git a/frontend-modern/src/components/Docker/DockerHosts.tsx b/frontend-modern/src/components/Docker/DockerHosts.tsx
index 62be288..fcda3f5 100644
--- a/frontend-modern/src/components/Docker/DockerHosts.tsx
+++ b/frontend-modern/src/components/Docker/DockerHosts.tsx
@@ -13,16 +13,7 @@ import { formatBytes, formatRelativeTime } from '@/utils/format';
import { DockerMetadataAPI, type DockerMetadata } from '@/api/dockerMetadata';
import { logger } from '@/utils/logger';
import { STORAGE_KEYS } from '@/utils/localStorage';
-
-const OFFLINE_HOST_STATUSES = new Set(['offline', 'error', 'unreachable', 'down', 'disconnected']);
-const DEGRADED_HOST_STATUSES = new Set([
- 'degraded',
- 'warning',
- 'maintenance',
- 'partial',
- 'initializing',
- 'unknown',
-]);
+import { DEGRADED_HEALTH_STATUSES, OFFLINE_HEALTH_STATUSES } from '@/utils/status';
type DockerMetadataRecord = Record ;
@@ -224,10 +215,8 @@ export const DockerHosts: Component = (props) => {
if (status === 'all') return true;
const normalized = host.status?.toLowerCase() ?? '';
if (status === 'online') return normalized === 'online';
- if (status === 'offline') return OFFLINE_HOST_STATUSES.has(normalized);
- if (status === 'degraded') {
- return DEGRADED_HOST_STATUSES.has(normalized) || normalized === 'degraded';
- }
+ if (status === 'offline') return OFFLINE_HEALTH_STATUSES.has(normalized);
+ if (status === 'degraded') return DEGRADED_HEALTH_STATUSES.has(normalized);
return true;
};
diff --git a/frontend-modern/src/components/Docker/DockerUnifiedTable.tsx b/frontend-modern/src/components/Docker/DockerUnifiedTable.tsx
index 40eb474..49f8662 100644
--- a/frontend-modern/src/components/Docker/DockerUnifiedTable.tsx
+++ b/frontend-modern/src/components/Docker/DockerUnifiedTable.tsx
@@ -11,27 +11,16 @@ import { resolveHostRuntime } from './runtimeDisplay';
import { showSuccess, showError } from '@/utils/toast';
import { logger } from '@/utils/logger';
import { buildMetricKey } from '@/utils/metricsKeys';
-
-const OFFLINE_HOST_STATUSES = new Set(['offline', 'error', 'unreachable', 'down', 'disconnected']);
-const DEGRADED_HOST_STATUSES = new Set([
- 'degraded',
- 'warning',
- 'maintenance',
- 'partial',
- 'initializing',
- 'unknown',
-]);
-
-const STOPPED_CONTAINER_STATES = new Set(['exited', 'stopped', 'created', 'paused']);
-const ERROR_CONTAINER_STATES = new Set([
- 'restarting',
- 'dead',
- 'removing',
- 'failed',
- 'error',
- 'oomkilled',
- 'unhealthy',
-]);
+import { StatusDot } from '@/components/shared/StatusDot';
+import {
+ DEGRADED_HEALTH_STATUSES,
+ ERROR_CONTAINER_STATES,
+ OFFLINE_HEALTH_STATUSES,
+ STOPPED_CONTAINER_STATES,
+ getDockerContainerStatusIndicator,
+ getDockerHostStatusIndicator,
+ getDockerServiceStatusIndicator,
+} from '@/utils/status';
const typeBadgeClass = (type: 'container' | 'service' | 'task' | 'unknown') => {
switch (type) {
@@ -347,10 +336,10 @@ const hostMatchesFilter = (filter: StatsFilter, host: DockerHost) => {
if (!filter || filter.type !== 'host-status') return true;
const status = toLower(host.status);
if (filter.value === 'offline') {
- return OFFLINE_HOST_STATUSES.has(status);
+ return OFFLINE_HEALTH_STATUSES.has(status);
}
if (filter.value === 'degraded') {
- return DEGRADED_HOST_STATUSES.has(status) || status === 'degraded';
+ return DEGRADED_HEALTH_STATUSES.has(status);
}
if (filter.value === 'online') {
return status === 'online';
@@ -548,10 +537,21 @@ const GROUPED_RESOURCE_INDENT = 'pl-5 sm:pl-6 lg:pl-8';
const DockerHostGroupHeader: Component<{ host: DockerHost; colspan: number }> = (props) => {
const displayName = props.host.customDisplayName || props.host.displayName || props.host.hostname || props.host.id;
+ const hostStatus = () => getDockerHostStatusIndicator(props.host);
+ const isOnline = () => hostStatus().variant === 'success';
return (
|
- | | |