File size: 2,650 Bytes
6aaff3e eb17fc6 6aaff3e eb17fc6 6aaff3e eb17fc6 6aaff3e 32e1a9b 6aaff3e 32e1a9b 6aaff3e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
"use client"
import { Cell, LabelList, Pie, PieChart } from "recharts"
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card"
import {
ChartConfig,
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from "@/components/ui/chart"
interface PieChartProps {
title: string
description?: string
data: Array<{ name: string; value: number; fill: string }>
dataKey: string
}
const chartConfig: ChartConfig = {
value: {
label: "Value",
},
}
export function CustomPieChart({
title,
description,
data,
dataKey,
}: PieChartProps) {
const chartColors = [
"hsl(var(--chart-5))",
"hsl(var(--chart-4))",
"hsl(var(--chart-3))",
"hsl(var(--chart-2))",
"hsl(var(--chart-1))",
]
const sortedData = [...data].sort((a, b) => b.value - a.value)
const topItems = sortedData.slice(0, 4)
const otherValue = sortedData
.slice(4)
.reduce((sum, item) => sum + item.value, 0)
const chartData =
otherValue > 0
? [
...topItems,
{ name: "Other", value: otherValue, fill: chartColors[4] },
]
: topItems
return (
<Card className="bg-[var(--card-background)]">
<CardHeader className="items-center pb-0">
<CardTitle className="text-[var(--card-text)]">{title}</CardTitle>
{description && (
<CardDescription className="text-[var(--card-text)]">
{description}
</CardDescription>
)}
</CardHeader>
<CardContent className="flex-1 pb-0">
{data.length > 0 ? (
<ChartContainer
config={chartConfig}
className="mx-auto aspect-square max-h-[500px]"
>
<PieChart>
<ChartTooltip
cursor={false}
content={<ChartTooltipContent hideIndicator hideLabel />}
/>
<Pie data={chartData} dataKey={dataKey} nameKey="name">
{chartData.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={chartColors[index % chartColors.length]}
/>
))}
<LabelList
dataKey="name"
className="fill-background"
stroke="none"
fontSize={12}
/>
</Pie>
</PieChart>
</ChartContainer>
) : (
<div className="flex items-center justify-center h-[300px] text-[var(--card-text)]">
Loading...
</div>
)}
</CardContent>
</Card>
)
}
|