From daa155c2d2f177fdcf6be4c954741aab8215dda9 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 20 May 2026 13:02:49 +0100 Subject: [PATCH] Normalize Docker swarm drawer table --- .../components/Docker/SwarmServicesDrawer.tsx | 91 ++++++++++++++----- .../__tests__/SwarmServicesDrawer.test.tsx | 17 +++- 2 files changed, 82 insertions(+), 26 deletions(-) diff --git a/frontend-modern/src/components/Docker/SwarmServicesDrawer.tsx b/frontend-modern/src/components/Docker/SwarmServicesDrawer.tsx index 39802f5818..20e00528a5 100644 --- a/frontend-modern/src/components/Docker/SwarmServicesDrawer.tsx +++ b/frontend-modern/src/components/Docker/SwarmServicesDrawer.tsx @@ -15,6 +15,12 @@ import { import { EmptyState } from '@/components/shared/EmptyState'; import { getSimpleStatusIndicator } from '@/utils/status'; import { asTrimmedString } from '@/utils/stringUtils'; +import { + PLATFORM_TABLE_BODY_CLASS, + PLATFORM_TABLE_HEADER_ROW_CLASS, + getPlatformTableCellClassForKind, + getPlatformTableHeadClassForKind, +} from '@/features/platformPage/sharedPlatformPage'; import { formatSwarmClusterId, formatSwarmClusterSummary, @@ -176,7 +182,8 @@ export const SwarmServicesDrawer: Component<{ cluster: string; swarm?: SwarmInfo const swarm = createMemo(() => props.swarm); const clusterName = createMemo( - () => asTrimmedString(swarm()?.clusterName) || asTrimmedString(swarm()?.clusterId) || clusterKey(), + () => + asTrimmedString(swarm()?.clusterName) || asTrimmedString(swarm()?.clusterId) || clusterKey(), ); const clusterId = createMemo(() => asTrimmedString(swarm()?.clusterId) ?? ''); @@ -258,36 +265,40 @@ export const SwarmServicesDrawer: Component<{ cluster: string; swarm?: SwarmInfo } > - - - - +
+ + + {drawerPresentation.serviceColumnLabel} - + {drawerPresentation.stackColumnLabel} - + {drawerPresentation.imageColumnLabel} - + {drawerPresentation.modeColumnLabel} - + {drawerPresentation.desiredColumnLabel} - + {drawerPresentation.runningColumnLabel} - + {drawerPresentation.updateColumnLabel} - + {drawerPresentation.portsColumnLabel} - + {(svc) => { const name = () => asTrimmedString(svc.name) || svc.id; @@ -301,8 +312,8 @@ export const SwarmServicesDrawer: Component<{ cluster: string; swarm?: SwarmInfo const status = () => getSimpleStatusIndicator(svc.status); return ( - - + +
- {stack()} - - {image()} + + + {stack()} + - {mode()} - {desired()} - {running()} - - {update()} + + + {image()} + - - {ports()} + + {mode()} + + + {desired()} + + + {running()} + + + + {update()} + + + + + {ports()} +
); diff --git a/frontend-modern/src/components/Docker/__tests__/SwarmServicesDrawer.test.tsx b/frontend-modern/src/components/Docker/__tests__/SwarmServicesDrawer.test.tsx index 190db57731..7e38d3d0df 100644 --- a/frontend-modern/src/components/Docker/__tests__/SwarmServicesDrawer.test.tsx +++ b/frontend-modern/src/components/Docker/__tests__/SwarmServicesDrawer.test.tsx @@ -27,7 +27,7 @@ vi.mock('@/components/shared/Table', () => ({ {props.children}
), - TableHeader: (props: any) => {props.children}, + TableHeader: (props: any) => {props.children}, TableBody: (props: any) => {props.children}, TableRow: (props: any) => {props.children}, TableHead: (props: any) => {props.children}, @@ -299,6 +299,21 @@ describe('SwarmServicesDrawer', () => { expect(screen.getByText('2')).toBeInTheDocument(); }); + it('uses the shared platform table spacing and divider contract', async () => { + mockApiResponse([makeService({ id: 'svc-1', name: 'web-frontend' })]); + const { container } = render(() => ); + + await waitFor(() => { + expect(screen.getByText('web-frontend')).toBeInTheDocument(); + }); + + expect(screen.getByTestId('table')).toHaveClass('table-fixed'); + expect(container.querySelector('thead tr')).toHaveClass('bg-surface-alt'); + expect(container.querySelector('tbody')).toHaveClass('divide-y', 'divide-border'); + expect(container.querySelector('tbody')).not.toHaveClass('divide-border-subtle'); + expect(container.querySelector('th')).toHaveClass('px-1.5', 'py-0.5'); + }); + it('uses service id as name when name is empty', async () => { const svc = makeService({ id: 'svc-abc', name: '' }); mockApiResponse([svc]);