"use client"; import { useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { CategoryIcon } from "@/components/ui/category-icon"; import { PieChart, Pie, Cell, Tooltip, ResponsiveContainer, } from "recharts"; import { Layers, List, ChevronDown, ChevronUp } from "lucide-react"; import type { Category } from "@/lib/types"; export interface CategoryChartData { name: string; value: number; color: string; icon: string; [key: string]: string | number; } interface CategoryPieChartProps { data: CategoryChartData[]; dataByParent?: CategoryChartData[]; categories?: Category[]; formatCurrency: (amount: number) => string; title?: string; height?: number; innerRadius?: number; outerRadius?: number; emptyMessage?: string; } export function CategoryPieChart({ data, dataByParent, categories: _categories = [], formatCurrency, title = "Répartition par catégorie", height = 300, innerRadius = 60, outerRadius = 100, emptyMessage = "Pas de données pour cette période", }: CategoryPieChartProps) { const [groupByParent, setGroupByParent] = useState(true); const [isExpanded, setIsExpanded] = useState(false); const hasParentData = dataByParent && dataByParent.length > 0; const baseData = (groupByParent && hasParentData) ? dataByParent : data; // Limit to top 8 by default, show all if expanded const maxItems = 8; const currentData = isExpanded ? baseData : baseData.slice(0, maxItems); return ( {title}
{hasParentData && ( )} {baseData.length > maxItems && ( )}
{currentData.length > 0 ? (
{/* Graphique */}
{currentData.map((entry, index) => ( ))} { if (!active || !payload?.length) return null; const item = payload[0].payload as CategoryChartData; return (
{item.name}
{formatCurrency(item.value)}
); }} />
{/* Légende */}
Légende
{currentData.map((item, index) => (
{item.name} {formatCurrency(item.value)}
))}
) : (
{emptyMessage}
)}
); }