Use shared grouped rows in settings infrastructure table

This commit is contained in:
rcourtman 2026-04-29 01:19:43 +01:00
parent 6b95532044
commit 6b2516648d
5 changed files with 19 additions and 3 deletions

View file

@ -139,6 +139,11 @@ those facts into source-strategy copy, but it must not turn an admitted
`first-lab-ready` platform such as VMware into a product-level supported
claim, invent platform-local projections, or classify assistant control beyond
the manifest's support-floor row.
The lifecycle-owned infrastructure source manager also owns platform/system
grouping as source-management content, but not its table band presentation:
`frontend-modern/src/components/Settings/InfrastructureSourceManager.tsx` must
route table-level product/system group rows through the shared grouped table row
helper instead of carrying lifecycle-local background or hover classes.
## Extension Points

View file

@ -181,8 +181,9 @@ work extends shared components instead of creating new local variants.
helper and `.grouped-table-row` CSS token contract instead of local
`bg-surface-alt` or page-specific hover fills. This applies to grouped
rows across Infrastructure, Workloads, Storage, Recovery, alert history,
and alert threshold tables; feature owners may own group content and
behavior, but not duplicate the subgroup band styling.
alert threshold tables, and Infrastructure Settings source-manager tables;
feature owners may own group content and behavior, but not duplicate the
subgroup band styling.
Shared monitored-system warning primitives under that path must stay compact
app-shell pointers into the owned Pulse Pro billing surface. The shared
banner may announce posture and route to the relevant billing tab, but
@ -358,6 +359,10 @@ work extends shared components instead of creating new local variants.
Pulse Agent`, or `via platform API and Pulse Agent`), with fuller detail in
the edit dialog, instead of duplicating the same machine across multiple
peer groups or forcing operators to decode badge jargon.
The table-level product/system group rows in
`InfrastructureSourceManager.tsx` must also use the shared grouped table row
presentation helper, not local table-background classes, so source-manager
grouping stays visually consistent with the product tables.
That same shared shell boundary owns the landing taxonomy too: the primary
grouping labels in the infrastructure manager must describe real
platform/system owners, not collection methods. Agent-only machines belong

View file

@ -18,6 +18,7 @@ import {
TableHeader,
TableRow,
} from '@/components/shared/Table';
import { getGroupedTableRowClass } from '@/components/shared/groupedTableRowPresentation';
import {
connectionAgentVersionPresentation,
fleetSignalClassName,
@ -617,7 +618,7 @@ export const InfrastructureSourceManager: Component<InfrastructureSourceManagerP
const configuredRows = () => groupedConfiguredRows().get(product.type) ?? [];
const discoveredRows = () => groupedDiscoveredRows().get(product.type) ?? [];
const groupRowClass = () =>
'border-b border-border-subtle bg-base hover:bg-base';
getGroupedTableRowClass('border-b border-border-subtle');
const groupLabelClass = () => 'text-[15px] font-semibold text-base-content';
return (

View file

@ -256,6 +256,8 @@ describe('settings architecture guardrails', () => {
expect(infrastructureSourceManagerSource).toContain('Discovered');
expect(infrastructureSourceManagerSource).toContain('getInfrastructureSourceManagerProducts');
expect(infrastructureSourceManagerSource).toContain('TableHeader');
expect(infrastructureSourceManagerSource).toContain('getGroupedTableRowClass');
expect(infrastructureSourceManagerSource).not.toContain('bg-base hover:bg-base');
expect(infrastructureSourceManagerSource).toContain('aria-label={product.actionLabel}');
expect(infrastructureSourceManagerSource).toContain('Review');
expect(infrastructureSourceManagerSource).toContain('Manage');

View file

@ -67,6 +67,7 @@ import summaryTableCardHeaderSource from '@/components/shared/SummaryTableCardHe
import summaryTableFocusSource from '@/components/shared/summaryTableFocus.ts?raw';
import tableCardSource from '@/components/shared/TableCard.tsx?raw';
import groupedTableRowPresentationSource from '@/components/shared/groupedTableRowPresentation.ts?raw';
import infrastructureSourceManagerSource from '@/components/Settings/InfrastructureSourceManager.tsx?raw';
import infrastructureSummaryTableSource from '@/components/shared/InfrastructureSummaryTable.tsx?raw';
import infrastructureSummaryTableRowSource from '@/components/shared/InfrastructureSummaryTableRow.tsx?raw';
import infrastructureSelectorModelSource from '@/components/shared/infrastructureSelectorModel.ts?raw';
@ -469,6 +470,8 @@ describe('shared primitive guardrails', () => {
expect(alertHistoryTableGroupRowSource).toContain('getGroupedTableRowClass');
expect(alertHistoryTableGroupRowSource).not.toContain('class="bg-surface-alt"');
expect(alertResourceTableDesktopSource).toContain('getGroupedTableRowClass');
expect(infrastructureSourceManagerSource).toContain('getGroupedTableRowClass');
expect(infrastructureSourceManagerSource).not.toContain('bg-base hover:bg-base');
expect(unifiedResourceHostTableCardSource).toContain('data-summary-group-member-active');
});