diff --git a/docs/release-control/v6/internal/subsystems/storage-recovery.md b/docs/release-control/v6/internal/subsystems/storage-recovery.md index 475b88601..cd2f54cd1 100644 --- a/docs/release-control/v6/internal/subsystems/storage-recovery.md +++ b/docs/release-control/v6/internal/subsystems/storage-recovery.md @@ -643,6 +643,11 @@ the shared `SummaryPanel` and `SummaryMetricCard` primitives the way infrastructure and workloads do, and recovery item-type labels should render through canonical workload/resource badge classes instead of adding recovery-only wrapper chrome around VM, container, or other resource badges. +That same summary frame should stay compact and scan-first, not turn into a +recovery-specific mini report. Recovery summary cards should prefer concise +counts, bars, and badge-backed coverage cues over tall explanatory copy blocks +so the protected-item table takes over the page at roughly the same visual +density as the infrastructure and workloads monitoring surfaces. That shared unified-resource dependency now also includes policy-governed resource metadata on the frontend decode path: storage and recovery surfaces that route through `frontend-modern/src/hooks/useUnifiedResources.ts` must diff --git a/frontend-modern/src/components/Recovery/RecoverySummary.test.tsx b/frontend-modern/src/components/Recovery/RecoverySummary.test.tsx index caa4b42b7..7a8640c0e 100644 --- a/frontend-modern/src/components/Recovery/RecoverySummary.test.tsx +++ b/frontend-modern/src/components/Recovery/RecoverySummary.test.tsx @@ -65,9 +65,6 @@ describe('RecoverySummary', () => { expect(screen.getByText('Platform Mix')).toBeInTheDocument(); expect(screen.getByText('2 protected')).toBeInTheDocument(); expect(screen.getByText('1 healthy')).toBeInTheDocument(); - expect( - screen.getByText((_, element) => element?.textContent === '2 item types across 2 platforms.'), - ).toBeInTheDocument(); expect(screen.getByText('Never succeeded')).toBeInTheDocument(); }); }); diff --git a/frontend-modern/src/components/Recovery/RecoverySummary.tsx b/frontend-modern/src/components/Recovery/RecoverySummary.tsx index 3a1b2acc2..7a84701d1 100644 --- a/frontend-modern/src/components/Recovery/RecoverySummary.tsx +++ b/frontend-modern/src/components/Recovery/RecoverySummary.tsx @@ -117,7 +117,7 @@ export const RecoverySummary: Component = (props) => { -
+
{(segment) => (
@@ -137,20 +137,13 @@ export const RecoverySummary: Component = (props) => {
Freshness
-
+
{(bucket) => ( -
- {bucket.label} -
-
0 ? 8 : 0)}%` }} - /> -
- - {bucket.count} - +
+ + {bucket.label} + {bucket.count}
)} @@ -222,12 +215,6 @@ export const RecoverySummary: Component = (props) => {
-
- {itemCoverage().itemTypeCount} item type - {itemCoverage().itemTypeCount === 1 ? '' : 's'} across {platformCoverage().platformCount}{' '} - platform{platformCoverage().platformCount === 1 ? '' : 's'}. -
- 0}>
@@ -252,9 +239,9 @@ export const RecoverySummary: Component = (props) => { Platform Mix
0}> -
- {platformCoverage().multiPlatformCount} protected item - {platformCoverage().multiPlatformCount === 1 ? '' : 's'} span multiple platforms. +
+ {platformCoverage().multiPlatformCount} multi-platform item + {platformCoverage().multiPlatformCount === 1 ? '' : 's'}
@@ -285,7 +272,7 @@ export const RecoverySummary: Component = (props) => { >
-
{recentWindowLabel()}
+
{recentWindowLabel()}
@@ -309,17 +296,14 @@ export const RecoverySummary: Component = (props) => {
{activity().latestLabel ?? 'n/a'}
- -
-
-
Peak Throughput
-
{activity().busiestCount}
-
{activity().busiestLabel ?? 'n/a'}
+
+
+ Peak Throughput + {activity().busiestCount}
-
-
Latest Throughput
-
{activity().latestCount}
-
{activity().latestLabel ?? 'n/a'}
+
+ Latest Throughput + {activity().latestCount}
diff --git a/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx b/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx index c031c1bdc..5f9b1c601 100644 --- a/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx +++ b/frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx @@ -316,11 +316,7 @@ describe('Recovery', () => { it('surfaces item-first recovery coverage in the unified summary', async () => { render(() => ); - expect( - await screen.findByText( - (_, element) => element?.textContent === '2 item types across 2 platforms.', - ), - ).toBeInTheDocument(); + await screen.findByText('Platform Mix'); expect(screen.getByText('Primary Item')).toBeInTheDocument(); expect(screen.getByText('Primary Platform')).toBeInTheDocument(); expect(screen.getByText('Platform Mix')).toBeInTheDocument();