From dfe06a1077dcc40ab77e3bdbcf646e493e0dbb81 Mon Sep 17 00:00:00 2001 From: Josema Camacho Date: Wed, 1 Apr 2026 11:08:34 +0200 Subject: [PATCH] fix(ui): allow selecting failed scans when graph data is available (#10531) --- .../_components/scan-list-table.test.tsx | 41 +++++++++++++++++++ .../_components/scan-list-table.tsx | 6 +-- .../_components/scan-status-badge.tsx | 2 +- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-list-table.test.tsx b/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-list-table.test.tsx index 83cea30326..a029481e7a 100644 --- a/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-list-table.test.tsx +++ b/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-list-table.test.tsx @@ -162,4 +162,45 @@ describe("ScanListTable", () => { "/attack-paths?scanPage=1&scanPageSize=5&scanId=scan-1", ); }); + + it("enables the select button for a failed scan when graph data is ready", async () => { + const user = userEvent.setup(); + const failedScan: AttackPathScan = { + ...createScan(1), + attributes: { + ...createScan(1).attributes, + state: "failed", + graph_data_ready: true, + }, + }; + + render(); + + const button = screen.getByRole("button", { name: "Select scan" }); + expect(button).toBeEnabled(); + expect(button).toHaveTextContent("Select"); + + await user.click(button); + + expect(pushMock).toHaveBeenCalledWith( + "/attack-paths?scanPage=1&scanPageSize=5&scanId=scan-1", + ); + }); + + it("disables the select button for a failed scan when graph data is not ready", () => { + const failedScan: AttackPathScan = { + ...createScan(1), + attributes: { + ...createScan(1).attributes, + state: "failed", + graph_data_ready: false, + }, + }; + + render(); + + const button = screen.getByRole("button", { name: "Select scan" }); + expect(button).toBeDisabled(); + expect(button).toHaveTextContent("Failed"); + }); }); diff --git a/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-list-table.tsx b/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-list-table.tsx index aeb8b897f5..b5bd240cf0 100644 --- a/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-list-table.tsx +++ b/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-list-table.tsx @@ -42,11 +42,7 @@ const isSelectDisabled = ( scan: AttackPathScan, selectedScanId: string | null, ) => { - return ( - !scan.attributes.graph_data_ready || - scan.attributes.state === SCAN_STATES.FAILED || - selectedScanId === scan.id - ); + return !scan.attributes.graph_data_ready || selectedScanId === scan.id; }; const getSelectButtonLabel = ( diff --git a/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-status-badge.tsx b/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-status-badge.tsx index 71c8488e00..de8833749e 100644 --- a/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-status-badge.tsx +++ b/ui/app/(prowler)/attack-paths/(workflow)/query-builder/_components/scan-status-badge.tsx @@ -38,7 +38,7 @@ const BADGE_CONFIG: Record< [SCAN_STATES.FAILED]: { className: "bg-bg-fail-secondary text-text-error-primary", label: "Failed", - showGraphDot: false, + showGraphDot: true, }, };