From 783db5c3dcd4e5c565df875710d8890674deedf8 Mon Sep 17 00:00:00 2001 From: Pablo Lara Date: Mon, 18 Nov 2024 08:21:54 +0100 Subject: [PATCH] feat: allow compliance data selection by choosing a scan --- app/(prowler)/compliance/page.tsx | 23 +++++--- ...ComplianceCard.tsx => compliance-card.tsx} | 0 ...nGrid.tsx => compliance-skeleton-grid.tsx} | 0 .../data-compliance/data-compliance.tsx | 31 +++++++++++ .../compliance/data-compliance/index.ts | 2 + .../select-scan-compliance-data.tsx | 52 +++++++++++++++++++ components/compliance/index.ts | 4 +- 7 files changed, 103 insertions(+), 9 deletions(-) rename components/compliance/{ComplianceCard.tsx => compliance-card.tsx} (100%) rename components/compliance/{ComplianceSkeletonGrid.tsx => compliance-skeleton-grid.tsx} (100%) create mode 100644 components/compliance/data-compliance/data-compliance.tsx create mode 100644 components/compliance/data-compliance/index.ts create mode 100644 components/compliance/data-compliance/select-scan-compliance-data.tsx diff --git a/app/(prowler)/compliance/page.tsx b/app/(prowler)/compliance/page.tsx index 7e47723441..8d3f8315f1 100644 --- a/app/(prowler)/compliance/page.tsx +++ b/app/(prowler)/compliance/page.tsx @@ -2,10 +2,12 @@ import { Spacer } from "@nextui-org/react"; import { Suspense } from "react"; import { getCompliancesOverview } from "@/actions/compliances"; +import { getScans } from "@/actions/scans"; import { ComplianceCard, ComplianceSkeletonGrid, } from "@/components/compliance"; +import { DataCompliance } from "@/components/compliance/data-compliance"; import { FilterControls } from "@/components/filters"; import { Header } from "@/components/ui"; import { ComplianceOverviewData, SearchParamsProps } from "@/types"; @@ -15,26 +17,33 @@ export default async function Compliance({ }: { searchParams: SearchParamsProps; }) { - const searchParamsKey = JSON.stringify(searchParams || {}); + const scansData = await getScans({}); + const scanList = scansData?.data.map((scan: any) => ({ + id: scan.id, + name: scan.attributes.name || "Unnamed Scan", + state: scan.attributes.state, + progress: scan.attributes.progress, + })); + const selectedScanId = searchParams.scanId || scanList[0]?.id; return ( <>
+
+ +
- }> - + }> + ); } -const SSRComplianceGrid = async () => { - // const scanId = "01929f57-c0ee-7553-be0b-cbde006fb6f7"; - const scanId = "0193358c-bd7f-7eec-b13a-2d4a648b8df"; +const SSRComplianceGrid = async ({ scanId }: { scanId: string }) => { const compliancesData = await getCompliancesOverview({ scanId }); - console.log(compliancesData, "compliancesData"); if (compliancesData?.errors?.length > 0) { return ( diff --git a/components/compliance/ComplianceCard.tsx b/components/compliance/compliance-card.tsx similarity index 100% rename from components/compliance/ComplianceCard.tsx rename to components/compliance/compliance-card.tsx diff --git a/components/compliance/ComplianceSkeletonGrid.tsx b/components/compliance/compliance-skeleton-grid.tsx similarity index 100% rename from components/compliance/ComplianceSkeletonGrid.tsx rename to components/compliance/compliance-skeleton-grid.tsx diff --git a/components/compliance/data-compliance/data-compliance.tsx b/components/compliance/data-compliance/data-compliance.tsx new file mode 100644 index 0000000000..52484f6bd7 --- /dev/null +++ b/components/compliance/data-compliance/data-compliance.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { useRouter, useSearchParams } from "next/navigation"; + +import { SelectScanComplianceData } from "@/components/compliance/data-compliance"; + +interface DataComplianceProps { + scans: { id: string; name: string; state: string; progress: number }[]; +} + +export const DataCompliance = ({ scans }: DataComplianceProps) => { + const router = useRouter(); + const searchParams = useSearchParams(); + const selectedScanId = searchParams.get("scanId") || scans[0]?.id; + + const handleSelectionChange = (selectedKey: string) => { + router.push(`?scanId=${selectedKey}`); + }; + + return ( +
+
+ +
+
+ ); +}; diff --git a/components/compliance/data-compliance/index.ts b/components/compliance/data-compliance/index.ts new file mode 100644 index 0000000000..14f430df04 --- /dev/null +++ b/components/compliance/data-compliance/index.ts @@ -0,0 +1,2 @@ +export * from "./data-compliance"; +export * from "./select-scan-compliance-data"; diff --git a/components/compliance/data-compliance/select-scan-compliance-data.tsx b/components/compliance/data-compliance/select-scan-compliance-data.tsx new file mode 100644 index 0000000000..fb1189019c --- /dev/null +++ b/components/compliance/data-compliance/select-scan-compliance-data.tsx @@ -0,0 +1,52 @@ +"use client"; + +import { Select, SelectItem } from "@nextui-org/react"; + +interface SelectScanComplianceDataProps { + scans: { id: string; name: string; state: string; progress: number }[]; + selectedScanId: string; + onSelectionChange: (selectedKey: string) => void; +} + +export const SelectScanComplianceData = ({ + scans, + selectedScanId, + onSelectionChange, +}: SelectScanComplianceDataProps) => { + return ( + + ); +}; diff --git a/components/compliance/index.ts b/components/compliance/index.ts index 6f025f2ca5..bb1b06d995 100644 --- a/components/compliance/index.ts +++ b/components/compliance/index.ts @@ -1,2 +1,2 @@ -export * from "./ComplianceCard"; -export * from "./ComplianceSkeletonGrid"; +export * from "./compliance-card"; +export * from "./compliance-skeleton-grid";