From d73a8d9a6ddb3a94b005a8d8d900540681e47e21 Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 18 Dec 2025 14:50:14 +0100 Subject: [PATCH 1/5] added AsyncButton --- .../projects/[projectSlug]/overview/page.tsx | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx index cb133f6d..b6b63f55 100644 --- a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx +++ b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx @@ -14,7 +14,7 @@ import CVERainbowBadge from "../../../../../../components/CVERainbowBadge"; import Page from "../../../../../../components/Page"; import { RiskHistoryDistributionDiagram } from "../../../../../../components/RiskHistoryDistributionDiagram"; import SeverityCard from "../../../../../../components/SeverityCard"; -import { Button } from "../../../../../../components/ui/button"; +import { AsyncButton, Button } from "../../../../../../components/ui/button"; import { Card, CardContent, @@ -282,10 +282,21 @@ const OverviewPage = () => { return ( }> -
- r.name) || []} - /> +
+
+ r.name) || []} + /> +
+
+ console.log("Test")} + variant={"secondary"} + > + Download PDF-Report + +
Date: Thu, 18 Dec 2025 15:19:21 +0100 Subject: [PATCH 2/5] onclick button# Please enter the commit message for your changes. Lines starting --- .../projects/[projectSlug]/overview/page.tsx | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx index b6b63f55..54edbbe8 100644 --- a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx +++ b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx @@ -1,7 +1,8 @@ "use client"; +import { usePathname, useSearchParams } from "next/navigation"; import { groupBy, shuffle } from "lodash"; -import { useRouter, useSearchParams } from "next/navigation"; +import { useRouter } from "next/navigation"; import { useEffect, useMemo } from "react"; import useSWR from "swr"; import { QueryArtifactSelector } from "../../../../../../components/ArtifactSelector"; @@ -54,6 +55,7 @@ import { } from "../../../../../../utils/view"; import useRouterQuery from "../../../../../../hooks/useRouterQuery"; import Link from "next/link"; +import { toast } from "sonner"; const OverviewPage = () => { const search = useSearchParams(); @@ -258,6 +260,38 @@ const OverviewPage = () => { return latestRiskHistory.sort(sorter).slice(0, 7); }, [completeRiskHistory, mode]); + const selectedArtifact = useSearchParams()?.get("artifact") || undefined; + const pathname = usePathname(); + + const downloadSBOMReport = async () => { + // try { + // const response = await fetch( + // `${pathname}/releases/ ${} /sbom.json`, + // { + // signal: AbortSignal.timeout(60 * 8 * 1000), // 8 minutes timeout + // method: "GET", + // }, + // ); + // if (!response.ok) { + // toast.error( + // "Failed to download Vulnerability Report PDF. Please try again later.", + // ); + // return; + // } + // const blob = await response.blob(); + // const url = window.URL.createObjectURL(blob); + // const link = document.createElement("a"); + // link.href = url; + // // add download attribute to the link + // link.download = `vulnerability-report.pdf`; + // document.body.appendChild(link); + // link.click(); + // document.body.removeChild(link); + // } catch (error) { + // toast.error("Failed to download SBOM PDF. Please try again later."); + // } + }; + if (releases?.data.length === 0) { return ( }> @@ -290,11 +324,11 @@ const OverviewPage = () => {
console.log("Test")} + disabled={selectedArtifact === undefined} + onClick={downloadSBOMReport} variant={"secondary"} > - Download PDF-Report + Download SBOM-Report
From f1868aa762a9032633f635bb84ea36322baa620f Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 18 Dec 2025 18:43:06 +0100 Subject: [PATCH 3/5] use tunnel api --- .../projects/[projectSlug]/overview/page.tsx | 55 ++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx index 54edbbe8..e81997a7 100644 --- a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx +++ b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx @@ -56,6 +56,10 @@ import { import useRouterQuery from "../../../../../../hooks/useRouterQuery"; import Link from "next/link"; import { toast } from "sonner"; +import { useActiveProject } from "@/hooks/useActiveProject"; +import { useActiveAsset } from "@/hooks/useActiveAsset"; +import { useActiveAssetVersion } from "@/hooks/useActiveAssetVersion"; +import { browserApiClient } from "../../../../../../services/devGuardApi"; const OverviewPage = () => { const search = useSearchParams(); @@ -187,6 +191,8 @@ const OverviewPage = () => { const [mode, setMode] = useViewMode("devguard-view-mode"); const activeOrg = useActiveOrg(); const projectMenu = useProjectMenu(); + const asset = useActiveAsset(); + const assetVersion = useActiveAssetVersion(); const router = useRouter(); const contentTree = useOrganization().contentTree; @@ -264,32 +270,29 @@ const OverviewPage = () => { const pathname = usePathname(); const downloadSBOMReport = async () => { - // try { - // const response = await fetch( - // `${pathname}/releases/ ${} /sbom.json`, - // { - // signal: AbortSignal.timeout(60 * 8 * 1000), // 8 minutes timeout - // method: "GET", - // }, - // ); - // if (!response.ok) { - // toast.error( - // "Failed to download Vulnerability Report PDF. Please try again later.", - // ); - // return; - // } - // const blob = await response.blob(); - // const url = window.URL.createObjectURL(blob); - // const link = document.createElement("a"); - // link.href = url; - // // add download attribute to the link - // link.download = `vulnerability-report.pdf`; - // document.body.appendChild(link); - // link.click(); - // document.body.removeChild(link); - // } catch (error) { - // toast.error("Failed to download SBOM PDF. Please try again later."); - // } + try { + const response = await browserApiClient( + `/organizations/${organizationSlug}/projects/${projectSlug}/releases/${releaseId}/sbom.json/`, + { method: "GET", signal: AbortSignal.timeout(60 * 8 * 1000) }, + ); + if (!response.ok) { + toast.error( + "Failed to download SBOM Report PDF. Please try again later.", + ); + return; + } + const blob = await response.blob(); + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + // add download attribute to the link + link.download = `${releaseId}.json`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } catch (error) { + toast.error("Failed to download SBOM. Please try again later."); + } }; if (releases?.data.length === 0) { From 392f36a39bd1d47e6c510f074b55f976ca2bee51 Mon Sep 17 00:00:00 2001 From: Tim Bastin <38261809+timbastin@users.noreply.github.com> Date: Fri, 19 Dec 2025 16:58:17 +0100 Subject: [PATCH 4/5] Update src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx Signed-off-by: Tim Bastin <38261809+timbastin@users.noreply.github.com> --- .../[organizationSlug]/projects/[projectSlug]/overview/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx index e81997a7..c596f8d6 100644 --- a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx +++ b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx @@ -331,7 +331,7 @@ const OverviewPage = () => { onClick={downloadSBOMReport} variant={"secondary"} > - Download SBOM-Report + Download SBOM From 39e54802efd2d1bc186f2d8024e644ab227e9374 Mon Sep 17 00:00:00 2001 From: Tim Bastin <38261809+timbastin@users.noreply.github.com> Date: Fri, 19 Dec 2025 16:58:48 +0100 Subject: [PATCH 5/5] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Tim Bastin <38261809+timbastin@users.noreply.github.com> --- .../[organizationSlug]/projects/[projectSlug]/overview/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx index c596f8d6..2b2649d8 100644 --- a/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx +++ b/src/app/(loading-group)/[organizationSlug]/projects/[projectSlug]/overview/page.tsx @@ -277,7 +277,7 @@ const OverviewPage = () => { ); if (!response.ok) { toast.error( - "Failed to download SBOM Report PDF. Please try again later.", + "Failed to download SBOM report. Please try again later.", ); return; }