inogen/app/components/dashboard/interactive-bar-chart.tsx
mahmoodsht a6b6185f95 تغییرات جدید برای نوری
برای تغییر بیلد برای شرکت های مختلف باید اسم شرکت را در پروژه جستجو کرد و سپس بر  اساس هر بخش همون بخش رو فعال  نمود
2026-02-10 13:10:46 +03:30

176 lines
4.8 KiB
TypeScript

import {
Bar,
BarChart,
CartesianGrid,
XAxis,
YAxis,
LabelList,
} from "recharts";
import { Card, CardContent } from "~/components/ui/card";
import {
type ChartConfig,
ChartContainer,
} from "~/components/ui/chart";
import { formatNumber } from "~/lib/utils";
export type CompanyChartDatum = {
category: string; // related_company
capacity: number; // percentage
revenue: number; // percentage
cost: number; // percentage
};
const chartConfig = {
capacity: {
label: "افزایش ظرفیت",
color: "#69C8EA",
},
revenue: {
label: "افزایش درآمد",
color: "#4ADE80",
},
cost: {
// آپادانا بندرامام
//label: "کاهش هزینه",
label: "هزینه عملیاتی", // نوری
color: "#F87171",
},
} satisfies ChartConfig;
export function InteractiveBarChart({
data,
showRevenue = "نوری"!="نوری", // آپادانا بندرامام
}: {
data: CompanyChartDatum[];
showRevenue?: boolean;
}) {
return (
<Card className="py-0 bg-transparent mt-8 border-none h-full">
<CardContent className="p-2 bg-transparent">
<ChartContainer config={chartConfig} className="aspect-auto h-96">
<BarChart
accessibilityLayer
data={data}
margin={{ left: 12, right: 12 }}
barGap={25}
barSize={9}
>
<CartesianGrid vertical={false} stroke="#475569" />
<XAxis
dataKey="category"
tickLine={false}
axisLine={false}
tickMargin={8}
minTickGap={32}
style={{ fill: "#ffffff", fontSize: 16 }}
/>
<YAxis
tickLine={false}
axisLine={false}
tickMargin={25}
style={{ fill: "#ACACAC", fontSize: 11 }}
tickFormatter={(value) =>
`${formatNumber(Math.round(value))}%`
}
/>
<Bar
dataKey="capacity"
fill={chartConfig.capacity.color}
radius={[8, 8, 0, 0]}
>
<LabelList
dataKey="capacity"
position="top"
offset={15}
style={{
fill: "#ffffff",
fontSize: "16px",
fontWeight: "bold",
}}
formatter={(v: number) =>
`${formatNumber(Math.round(v))}%`
}
/>
</Bar>
{showRevenue && (
<Bar
dataKey="revenue"
fill={chartConfig.revenue.color}
radius={[8, 8, 0, 0]}
>
<LabelList
dataKey="revenue"
position="top"
style={{
fill: "#ffffff",
fontSize: "16px",
fontWeight: "bold",
}}
formatter={(v: number) =>
`${formatNumber(Math.round(v))}%`
}
/>
</Bar>
)}
<Bar
dataKey="cost"
fill={chartConfig.cost.color}
radius={[8, 8, 0, 0]}
>
<LabelList
dataKey="cost"
position="top"
style={{
fill: "#ffffff",
fontSize: "16px",
fontWeight: "bold",
}}
formatter={(v: number) =>
`${formatNumber(Math.round(v))}%`
}
/>
</Bar>
</BarChart>
</ChartContainer>
{/* Legend below chart */}
<div className="flex justify-center gap-8 mt-10">
<div className="flex items-center gap-2">
<div
className="w-6 h-2 rounded"
style={{ backgroundColor: chartConfig.capacity.color }}
></div>
<span className="text-xs text-white">
{chartConfig.capacity.label}
</span>
</div>
<div className="flex items-center gap-2">
<div
className="w-6 h-2 rounded"
style={{ backgroundColor: chartConfig.cost.color }}
></div>
<span className="text-xs text-white">
{chartConfig.cost.label}
</span>
</div>
{showRevenue && (
<div className="flex items-center gap-2">
<div
className="w-6 h-2 rounded"
style={{ backgroundColor: chartConfig.revenue.color }}
></div>
<span className="text-xs text-white">
{chartConfig.revenue.label}
</span>
</div>
)}
</div>
</CardContent>
</Card>
);
}