From 330f9f1acd517b72091ee33df3b7c208691a49e5 Mon Sep 17 00:00:00 2001 From: Anso Date: Wed, 24 Jun 2026 20:06:04 -0400 Subject: [PATCH] fix(security): fix Security page table layouts and exploit-risk pagination (#1434) Image scan sheet: make the finding table the single bounded scroll region (SystemSheet noScroll + flex-fill) so it no longer clips at the bottom on shorter viewports, and give the tables a phone min-width so they scroll horizontally instead of cutting off the right-hand columns. Scan history table: add the same horizontal scroll on phones. Overview "Top exploit-risk findings": render as a paginated table with column headers and top-right pagination, modeled on the dashboard stack-health table. Key the rows by rank position so recurring CVE/scan pairs no longer collide and duplicate rows when paging through. Overview severity-by-exploitability chart: label the axes (EPSS exploitability and CVSS severity) and stop the card from stretching to a taller neighbour, removing the dead space beneath the chart. --- .../src/components/VulnerabilityScanSheet.tsx | 28 +-- .../src/components/security/HistoryTab.tsx | 4 +- .../src/components/security/OverviewTab.tsx | 9 +- .../security/SecurityCharts.test.tsx | 68 +++++++- .../components/security/SecurityCharts.tsx | 163 ++++++++++++------ 5 files changed, 199 insertions(+), 73 deletions(-) diff --git a/frontend/src/components/VulnerabilityScanSheet.tsx b/frontend/src/components/VulnerabilityScanSheet.tsx index e4a061e5..142dec44 100644 --- a/frontend/src/components/VulnerabilityScanSheet.tsx +++ b/frontend/src/components/VulnerabilityScanSheet.tsx @@ -579,6 +579,7 @@ export function VulnerabilityScanSheet({ onTabChange={(id) => setTab(id as FindingTab)} footerContext={footerContext} size="lg" + noScroll > {loading && !scan && (
@@ -587,8 +588,11 @@ export function VulnerabilityScanSheet({ )} {scan && ( - <> - + // noScroll skips SystemSheet's default px-6 py-5 wrapper, so supply it + // here; SheetSection's -mx-6 bleed depends on this px-6. The column lets + // the active finding section flex to fill the sheet (single scroll box). +
+ {scan.policy_evaluation?.violated && (
{tab === 'vulns' && ( - +
{(['ALL', 'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'] as SeverityFilter[]).map((s) => (