From 4855b85e826759635cd12bb7b6cc9fc08038ca07 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Thu, 26 Mar 2026 12:27:17 +0000 Subject: [PATCH] refactor(recovery): remove legacy runtime column aliases --- .../v6/internal/subsystems/frontend-primitives.md | 5 +++++ .../v6/internal/subsystems/storage-recovery.md | 4 +++- .../src/components/Recovery/RecoveryHistoryTable.tsx | 4 +--- .../src/components/Recovery/__tests__/Recovery.test.tsx | 2 ++ .../src/utils/__tests__/recoveryTablePresentation.test.ts | 8 +++----- frontend-modern/src/utils/recoveryTablePresentation.ts | 4 ---- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index 4330f0722..172b2b39a 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -703,6 +703,11 @@ shape. `frontend-modern/src/utils/recoveryPlatformModel.ts`, transport display aliases like `subjectLabel` and `subjectType` into canonical runtime `itemLabel` and `itemType` fields before recovery presenters consume the model. +The same shared recovery-column boundary must keep legacy `subject` and +`source` column ids at migration-only scope once +`frontend-modern/src/hooks/useColumnVisibility.ts` owns alias rewrites. +Recovery table runtime helpers and render switches should operate on canonical +`item` and `platform` ids rather than carrying the deleted ids as live cases. That same shared recovery state owner now also keeps `platform` as the canonical route and transport filter name for operator-facing recovery links, while any accepted legacy `provider` aliases remain parser compatibility only. diff --git a/docs/release-control/v6/internal/subsystems/storage-recovery.md b/docs/release-control/v6/internal/subsystems/storage-recovery.md index 029d02ae1..cbb3bd124 100644 --- a/docs/release-control/v6/internal/subsystems/storage-recovery.md +++ b/docs/release-control/v6/internal/subsystems/storage-recovery.md @@ -180,7 +180,9 @@ canonical as well. Recovery inventory and event-history columns should use `item` and `platform` identities rather than preserving `subject` and `source` as the primary runtime model, and any saved legacy column IDs must migrate at the shared column-visibility boundary instead of forcing recovery renderers to -carry deleted column identities indefinitely. +carry deleted column identities indefinitely. Once that migration exists, +recovery tables and shared table presenters should not continue accepting +legacy `subject` and `source` ids in the live runtime path. That same runtime-helper contract should prefer `item` terminology in shared recovery presenters too. Helper exports that resolve labels or item-type badges should expose canonical item-facing names, while any retained `subject` aliases diff --git a/frontend-modern/src/components/Recovery/RecoveryHistoryTable.tsx b/frontend-modern/src/components/Recovery/RecoveryHistoryTable.tsx index f901c1620..866343f39 100644 --- a/frontend-modern/src/components/Recovery/RecoveryHistoryTable.tsx +++ b/frontend-modern/src/components/Recovery/RecoveryHistoryTable.tsx @@ -225,7 +225,6 @@ export const RecoveryHistoryTable: Component = (props ); case 'item': - case 'subject': return ( = (props {namespace || '—'} ); - case 'platform': - case 'source': { + case 'platform': { const badge = getSourcePlatformBadge(platform); return ( diff --git a/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx b/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx index 6b0ff43e4..0f38c4d06 100644 --- a/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx +++ b/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx @@ -402,6 +402,8 @@ describe('Recovery', () => { const historyTable = tables[tables.length - 1]; expect(within(historyTable).getByText('Item')).toBeInTheDocument(); expect(within(historyTable).getByText('Platform')).toBeInTheDocument(); + expect(within(historyTable).queryByText('Subject')).not.toBeInTheDocument(); + expect(within(historyTable).queryByText('Source')).not.toBeInTheDocument(); expect(within(historyTable).queryByText('Cluster / Site')).not.toBeInTheDocument(); }); diff --git a/frontend-modern/src/utils/__tests__/recoveryTablePresentation.test.ts b/frontend-modern/src/utils/__tests__/recoveryTablePresentation.test.ts index 023351422..489207e6d 100644 --- a/frontend-modern/src/utils/__tests__/recoveryTablePresentation.test.ts +++ b/frontend-modern/src/utils/__tests__/recoveryTablePresentation.test.ts @@ -43,20 +43,18 @@ describe('recoveryTablePresentation', () => { expect(RECOVERY_ARTIFACT_COLUMN_LABELS.type).toBe('Item Type'); expect(RECOVERY_ARTIFACT_COLUMN_LABELS.item).toBe('Item'); expect(RECOVERY_ARTIFACT_COLUMN_LABELS.platform).toBe('Platform'); - expect(RECOVERY_ARTIFACT_COLUMN_LABELS.subject).toBe('Item'); - expect(RECOVERY_ARTIFACT_COLUMN_LABELS.source).toBe('Platform'); expect(RECOVERY_ARTIFACT_COLUMN_LABELS.cluster).toBe('Cluster / Site'); expect(RECOVERY_ARTIFACT_COLUMN_LABELS.nodeAgent).toBe('Host / Agent'); expect(RECOVERY_ARTIFACT_COLUMN_LABELS.namespace).toBe('Namespace / Group'); expect(getRecoveryArtifactColumnLabel('type', 'Type')).toBe('Item Type'); expect(getRecoveryArtifactColumnLabel('item', 'Item')).toBe('Item'); expect(getRecoveryArtifactColumnLabel('platform', 'Platform')).toBe('Platform'); - expect(getRecoveryArtifactColumnLabel('subject', 'Subject')).toBe('Item'); - expect(getRecoveryArtifactColumnLabel('source', 'Source')).toBe('Platform'); expect(getRecoveryArtifactColumnLabel('cluster', 'Cluster')).toBe('Cluster / Site'); expect(getRecoveryArtifactColumnLabel('nodeAgent', 'Node')).toBe('Host / Agent'); expect(getRecoveryArtifactColumnLabel('namespace', 'Namespace')).toBe('Namespace / Group'); expect(getRecoveryArtifactColumnLabel('outcome', 'Outcome')).toBe('Outcome'); + expect(getRecoveryArtifactColumnLabel('subject', 'Subject')).toBe('Subject'); + expect(getRecoveryArtifactColumnLabel('source', 'Source')).toBe('Source'); }); it('derives time text classes from event recency', () => { @@ -111,7 +109,7 @@ describe('recoveryTablePresentation', () => { expect(getRecoveryArtifactColumnHeaderClass('time')).toContain('text-right'); expect(getRecoveryArtifactColumnHeaderClass('type')).toContain('w-[96px]'); expect(getRecoveryArtifactColumnHeaderClass('item')).toContain('w-[248px]'); - expect(getRecoveryArtifactColumnHeaderClass('subject')).toContain('w-[248px]'); + expect(getRecoveryArtifactColumnHeaderClass('subject')).toBe(''); expect(getRecoveryArtifactTableMinWidth(['time', 'item', 'outcome'])).toBe('980px'); expect( getRecoveryArtifactTableMinWidth([ diff --git a/frontend-modern/src/utils/recoveryTablePresentation.ts b/frontend-modern/src/utils/recoveryTablePresentation.ts index dbe77d385..7bcc2c007 100644 --- a/frontend-modern/src/utils/recoveryTablePresentation.ts +++ b/frontend-modern/src/utils/recoveryTablePresentation.ts @@ -28,8 +28,6 @@ export const RECOVERY_ARTIFACT_COLUMN_LABELS: Record = { type: 'Item Type', item: 'Item', platform: 'Platform', - subject: 'Item', - source: 'Platform', }; const RECOVERY_ARTIFACT_COLUMN_SPECS: Record = { @@ -37,12 +35,10 @@ const RECOVERY_ARTIFACT_COLUMN_SPECS: Record