From 7fd53c1bc3462bf2c8fe3add23cc3efb55804542 Mon Sep 17 00:00:00 2001 From: Pablo Lara Date: Wed, 20 Nov 2024 13:58:45 +0100 Subject: [PATCH] feat: tweaks filters --- app/(prowler)/findings/page.tsx | 86 ++++++++++++++++++- components/compliance/compliance-card.tsx | 32 ++++--- components/filters/data-filters.ts | 11 ++- .../findings/table/data-table-row-actions.tsx | 2 +- .../ui/custom/custom-dropdown-filter.tsx | 6 +- .../ui/table/data-table-filter-custom.tsx | 23 +++-- 6 files changed, 129 insertions(+), 31 deletions(-) diff --git a/app/(prowler)/findings/page.tsx b/app/(prowler)/findings/page.tsx index 505a614a6b..c1da5ffbb9 100644 --- a/app/(prowler)/findings/page.tsx +++ b/app/(prowler)/findings/page.tsx @@ -2,6 +2,8 @@ import { Spacer } from "@nextui-org/react"; import React, { Suspense } from "react"; import { getFindings } from "@/actions/findings"; +import { getProviders } from "@/actions/providers"; +import { getScans } from "@/actions/scans"; import { filterFindings } from "@/components/filters/data-filters"; import { FilterControls } from "@/components/filters/filter-controls"; import { @@ -20,14 +22,94 @@ export default async function Findings({ }) { const searchParamsKey = JSON.stringify(searchParams || {}); + // Get findings data + const findingsData = await getFindings({}); + const providersData = await getProviders({}); + const scansData = await getScans({}); + + // Extract provider UIDs + const providerUIDs = providersData?.data + ?.map((provider: any) => provider.attributes.uid) + .filter(Boolean); + + // Extract scan UUIDs with "completed" state and more than one resource + const completedScans = scansData?.data + ?.filter( + (scan: any) => + scan.attributes.state === "completed" && + scan.attributes.unique_resource_count > 1 && + scan.attributes.name, // Ensure it has a name + ) + .map((scan: any) => ({ + id: scan.id, + name: scan.attributes.name, + })); + + const completedScanIds = completedScans?.map((scan: any) => scan.id) || []; + + // Create resource dictionary + const resourceDict = createDict("resources", findingsData); + + // Get unique regions and services + const allRegionsAndServices = findingsData?.data + ?.flatMap((finding: FindingProps) => { + const resource = + resourceDict[finding.relationships?.resources?.data?.[0]?.id]; + return { + region: resource?.attributes?.region, + service: resource?.attributes?.service, + }; + }) + .filter(Boolean); + + const uniqueRegions = Array.from( + new Set( + allRegionsAndServices + .map((item: { region: string }) => item.region) + .filter(Boolean), + ), + ); + const uniqueServices = Array.from( + new Set( + allRegionsAndServices + .map((item: { service: string }) => item.service) + .filter(Boolean), + ), + ); + return ( <>
- + - + }> diff --git a/components/compliance/compliance-card.tsx b/components/compliance/compliance-card.tsx index 41cd740a73..7fcfdbf5dd 100644 --- a/components/compliance/compliance-card.tsx +++ b/components/compliance/compliance-card.tsx @@ -16,27 +16,25 @@ export const ComplianceCard: React.FC = ({ title, passingRequirements, totalRequirements, - prevPassingRequirements, - prevTotalRequirements, }) => { const ratingPercentage = Math.floor( (passingRequirements / totalRequirements) * 100, ); - const prevRatingPercentage = Math.floor( - (prevPassingRequirements / prevTotalRequirements) * 100, - ); + // const prevRatingPercentage = Math.floor( + // (prevPassingRequirements / prevTotalRequirements) * 100, + // ); - const getScanChange = () => { - const scanDifference = ratingPercentage - prevRatingPercentage; - if (scanDifference < 0 && scanDifference <= -1) { - return `${scanDifference}% from last scan`; - } - if (scanDifference > 0 && scanDifference >= 1) { - return `+${scanDifference}% from last scan`; - } - return "No change from last scan"; - }; + // const getScanChange = () => { + // const scanDifference = ratingPercentage - prevRatingPercentage; + // if (scanDifference < 0 && scanDifference <= -1) { + // return `${scanDifference}% from last scan`; + // } + // if (scanDifference > 0 && scanDifference >= 1) { + // return `+${scanDifference}% from last scan`; + // } + // return "No changes from last scan"; + // }; const getRatingColor = (ratingPercentage: number) => { if (ratingPercentage <= 10) { @@ -50,7 +48,7 @@ export const ComplianceCard: React.FC = ({ return ( - +
= ({ Passing Requirements - {getScanChange()} + {/* {getScanChange()} */}
diff --git a/components/filters/data-filters.ts b/components/filters/data-filters.ts index 91a039605d..e396791b64 100644 --- a/components/filters/data-filters.ts +++ b/components/filters/data-filters.ts @@ -35,20 +35,25 @@ export const filterScans = [ export const filterFindings = [ { - key: "severity", + key: "severity__in", labelCheckboxGroup: "Severity", values: ["critical", "high", "medium", "low", "informational"], }, { - key: "status", + key: "status__in", labelCheckboxGroup: "Status", values: ["PASS", "FAIL", "MANUAL", "MUTED"], }, { - key: "delta", + key: "delta__in", labelCheckboxGroup: "Delta", values: ["new", "changed"], }, + { + key: "provider_type__in", + labelCheckboxGroup: "Provider", + values: ["aws", "azure", "gcp", "kubernetes"], + }, // Add more filter categories as needed ]; diff --git a/components/findings/table/data-table-row-actions.tsx b/components/findings/table/data-table-row-actions.tsx index 287e268ffb..8e15c942a0 100644 --- a/components/findings/table/data-table-row-actions.tsx +++ b/components/findings/table/data-table-row-actions.tsx @@ -31,7 +31,6 @@ export function DataTableRowActions({ row, }: DataTableRowActionsProps) { const findingId = (row.original as { id: string }).id; - console.log(findingId); return ( <> {/* ({ startContent={} // onClick={() => setIsEditOpen(true)} > + {findingId} Send to Jira = ({ filter, @@ -97,9 +97,9 @@ export const CustomDropdownFilter: React.FC = ({