Files
prowler/ui/app/(prowler)/_overview/risk-severity/_components/risk-severity-chart.tsx

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>
);
};