mirror of
https://github.com/prowler-cloud/prowler.git
synced 2025-12-19 05:17:47 +00:00
97 lines
2.6 KiB
TypeScript
97 lines
2.6 KiB
TypeScript
"use client";
|
|
|
|
import { useRouter, useSearchParams } from "next/navigation";
|
|
|
|
import { HorizontalBarChart } from "@/components/graphs/horizontal-bar-chart";
|
|
import { BarDataPoint } from "@/components/graphs/types";
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/shadcn";
|
|
import { mapProviderFiltersForFindings } from "@/lib/provider-helpers";
|
|
import { calculatePercentage } from "@/lib/utils";
|
|
import { SEVERITY_FILTER_MAP } from "@/types/severities";
|
|
|
|
interface RiskSeverityChartProps {
|
|
critical: number;
|
|
high: number;
|
|
medium: number;
|
|
low: number;
|
|
informational: number;
|
|
}
|
|
|
|
export const RiskSeverityChart = ({
|
|
critical,
|
|
high,
|
|
medium,
|
|
low,
|
|
informational,
|
|
}: RiskSeverityChartProps) => {
|
|
const router = useRouter();
|
|
const searchParams = useSearchParams();
|
|
|
|
const handleBarClick = (dataPoint: BarDataPoint) => {
|
|
// Build the URL with current filters plus severity and muted
|
|
const params = new URLSearchParams(searchParams.toString());
|
|
|
|
mapProviderFiltersForFindings(params);
|
|
|
|
const severity = SEVERITY_FILTER_MAP[dataPoint.name];
|
|
if (severity) {
|
|
params.set("filter[severity__in]", severity);
|
|
}
|
|
|
|
// Add exclude muted findings filter
|
|
params.set("filter[muted]", "false");
|
|
|
|
// Filter by FAIL findings
|
|
params.set("filter[status__in]", "FAIL");
|
|
|
|
// Navigate to findings page
|
|
router.push(`/findings?${params.toString()}`);
|
|
};
|
|
// Calculate total findings
|
|
const totalFindings = critical + high + medium + low + informational;
|
|
|
|
// Transform data to BarDataPoint format
|
|
const chartData: BarDataPoint[] = [
|
|
{
|
|
name: "Critical",
|
|
value: critical,
|
|
percentage: calculatePercentage(critical, totalFindings),
|
|
},
|
|
{
|
|
name: "High",
|
|
value: high,
|
|
percentage: calculatePercentage(high, totalFindings),
|
|
},
|
|
{
|
|
name: "Medium",
|
|
value: medium,
|
|
percentage: calculatePercentage(medium, totalFindings),
|
|
},
|
|
{
|
|
name: "Low",
|
|
value: low,
|
|
percentage: calculatePercentage(low, totalFindings),
|
|
},
|
|
{
|
|
name: "Info",
|
|
value: informational,
|
|
percentage: calculatePercentage(informational, totalFindings),
|
|
},
|
|
];
|
|
|
|
return (
|
|
<Card
|
|
variant="base"
|
|
className="flex min-h-[372px] min-w-[312px] flex-1 flex-col md:min-w-[380px]"
|
|
>
|
|
<CardHeader>
|
|
<CardTitle>Risk Severity</CardTitle>
|
|
</CardHeader>
|
|
|
|
<CardContent className="flex flex-1 items-center justify-start px-6">
|
|
<HorizontalBarChart data={chartData} onBarClick={handleBarClick} />
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
};
|