import React, { useEffect, useState } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "~/components/ui/dialog"; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, LabelList, Cell, } from "recharts"; import apiService from "~/lib/api"; import { Skeleton } from "~/components/ui/skeleton"; import { formatNumber } from "~/lib/utils"; import { ChartContainer } from "../ui/chart"; import { TruncatedText } from "../ui/truncatedText"; interface StrategicAlignmentData { strategic_theme: string; operational_fee_sum: number; percentage?: number; } interface StrategicAlignmentPopupProps { open: boolean; onOpenChange: (open: boolean) => void; } // ✅ Chart config for shadcn/ui const chartConfig = { percentage: { label: "", color: "#3AEA83", }, }; const maxHeight = 150; const barHeights = () => Math.floor(Math.random() * maxHeight); const ChartSkeleton = () => (
{/* Chart bars */}
{[...Array(9)].map((_, i) => (
))}
{/* Left space for Y-axis label */}
); export function StrategicAlignmentPopup({ open, onOpenChange, }: StrategicAlignmentPopupProps) { const [data, setData] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (open) { fetchData(); } }, [open]); const fetchData = async () => { setLoading(true); try { const response = await apiService.select({ ProcessName: "project", OutputFields: [ "strategic_theme", "sum(operational_fee) as operational_fee_sum", ], GroupBy: ["strategic_theme"], }); const responseData = typeof response.data === "string" ? JSON.parse(response.data) : response.data; const processedData = responseData .map((item: any) => ({ strategic_theme: item.strategic_theme || "N/A", operational_fee_sum: Math.max(0, Number(item.operational_fee_sum)), })) .filter((item: StrategicAlignmentData) => item.strategic_theme !== ""); const total = processedData.reduce( (acc: number, item: StrategicAlignmentData) => acc + item.operational_fee_sum, 0 ); const dataWithPercentage = processedData.map( (item: StrategicAlignmentData) => ({ ...item, percentage: total > 0 ? Math.round((item.operational_fee_sum / total) * 100) : 0, }) ); setData(dataWithPercentage || []); } catch (error) { console.error("Error fetching strategic alignment data:", error); } finally { setLoading(false); } }; return ( میزان انطباق راهبردی {loading ? ( ) : ( <> { const { x, y, payload } = props; return ( ); }} /> `${formatNumber(Math.round(value))}` } label={{ value: "تعداد برنامه ها" , angle: -90, position: "insideLeft", fill: "#94a3b8", fontSize: 11, offset: 0, dy: 0, style: { textAnchor: "middle" }, }} /> {data.map((entry, index) => ( ))} `${formatNumber(Math.round(v))}`} /> )} ); }