diff --git a/src/admin/analytics/charts/AvgTimeChart.jsx b/src/admin/analytics/charts/AvgTimeChart.jsx new file mode 100644 index 0000000..89966e6 --- /dev/null +++ b/src/admin/analytics/charts/AvgTimeChart.jsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, Cell } from 'recharts'; + +const COLORS = ['#f59e0b', '#0ea5e9', '#8b5cf6', '#f97316']; + +const AvgTimeChart = ({ data }) => ( +
+

+ Среднее время в стадии (дни) +

+ {data.every((d) => d.avgDays === 0) ? ( +

+ Недостаточно данных +

+ ) : ( + + + + + [`${v} дней`]} /> + + {data.map((entry, i) => )} + + + + )} +
+); + +export default AvgTimeChart; diff --git a/src/admin/analytics/charts/FunnelChart.jsx b/src/admin/analytics/charts/FunnelChart.jsx new file mode 100644 index 0000000..f47c632 --- /dev/null +++ b/src/admin/analytics/charts/FunnelChart.jsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, Cell } from 'recharts'; + +const COLORS = ['#f59e0b', '#0ea5e9', '#8b5cf6', '#f97316', '#22c55e']; + +const FunnelChart = ({ data }) => ( +
+

+ Воронка по стадиям +

+ {data.every((d) => d.count === 0) ? ( +

Нет данных

+ ) : ( + + + + + [`${v} заказов`]} /> + + {data.map((entry, i) => )} + + + + )} +
+); + +export default FunnelChart; diff --git a/src/admin/analytics/charts/ObjectTypeChart.jsx b/src/admin/analytics/charts/ObjectTypeChart.jsx new file mode 100644 index 0000000..3dcf776 --- /dev/null +++ b/src/admin/analytics/charts/ObjectTypeChart.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { PieChart, Pie, Cell, Tooltip, Legend, ResponsiveContainer } from 'recharts'; + +const COLORS = ['#0ea5e9', '#f59e0b', '#8b5cf6', '#22c55e', '#f97316']; +const TYPE_LABELS = { + industrial: 'Промышленный', commercial: 'Коммерческий', + infrastructure: 'Инфраструктура', residential: 'Частный', other: 'Другое', +}; + +const ObjectTypeChart = ({ data }) => ( +
+

+ Типы объектов +

+ {data.length === 0 ? ( +

Нет данных

+ ) : ( + + + + {data.map((entry, i) => )} + + [v, TYPE_LABELS[name] || name]} /> + TYPE_LABELS[v] || v} iconSize={10} /> + + + )} +
+); + +export default ObjectTypeChart; diff --git a/src/admin/analytics/charts/RevenueChart.jsx b/src/admin/analytics/charts/RevenueChart.jsx new file mode 100644 index 0000000..8831c10 --- /dev/null +++ b/src/admin/analytics/charts/RevenueChart.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { LineChart, Line, XAxis, YAxis, Tooltip, ResponsiveContainer, CartesianGrid } from 'recharts'; + +const RevenueChart = ({ data }) => ( +
+

+ Выручка по месяцам (₽) +

+ {data.length === 0 ? ( +

Нет закрытых заказов

+ ) : ( + + + + + `${(v / 1000).toFixed(0)}к`} /> + [`${v.toLocaleString('ru-RU')} ₽`, 'Выручка']} /> + + + + )} +
+); + +export default RevenueChart;