"use client"; import React, { useState } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Calendar } from "@/components/ui/calendar"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Checkbox } from "@/components/ui/checkbox"; import { Switch } from "@/components/ui/switch"; import { cn } from "@/lib/utils"; import { format } from "date-fns"; import { ru } from "date-fns/locale"; import { CalendarIcon, X, TrendingUp, BarChart3, LineChart } from "lucide-react"; import type { TargetChannel, AnalyticsMetric, DateGrouping, } from "@/lib/types/api"; import { AnalyticsChart } from "./analytics-chart"; import type { SpendingAnalytics } from "@/lib/types/api"; interface ChartConfigPanelProps { channels: TargetChannel[]; data: SpendingAnalytics | null; loading: boolean; onBuild: (config: { targetChannelIds: string[]; metrics: AnalyticsMetric[]; dateFrom: Date | null; dateTo: Date | null; grouping: DateGrouping; }) => void; onRemove?: () => void; showRemoveButton?: boolean; chartNumber?: number; } const METRICS: { value: AnalyticsMetric; label: string }[] = [ { value: "cost", label: "Расходы" }, { value: "subscriptions", label: "Подписки" }, { value: "views", label: "Просмотры" }, { value: "cpf", label: "CPF (Cost Per Follow)" }, { value: "cpm", label: "CPM (Cost Per Mille)" }, ]; const GROUPINGS: { value: DateGrouping; label: string }[] = [ { value: "day", label: "По дням" }, { value: "week", label: "По неделям" }, { value: "month", label: "По месяцам" }, { value: "quarter", label: "По кварталам" }, { value: "year", label: "По годам" }, ]; export const ChartConfigPanel: React.FC = ({ channels, data, loading, onBuild, onRemove, showRemoveButton = false, chartNumber = 1, }) => { const [selectedChannelIds, setSelectedChannelIds] = useState([]); const [selectedMetrics, setSelectedMetrics] = useState([]); const [dateFrom, setDateFrom] = useState(); const [dateTo, setDateTo] = useState(); const [grouping, setGrouping] = useState("day"); const [chartType, setChartType] = useState<"line" | "bar">("line"); const [showDataLabels, setShowDataLabels] = useState(false); // Отслеживание изменений настроек const [lastBuiltConfig, setLastBuiltConfig] = useState(null); const [isBuilt, setIsBuilt] = useState(false); // Текущая конфигурация как строка для сравнения const currentConfigString = JSON.stringify({ selectedChannelIds, selectedMetrics, dateFrom: dateFrom?.toISOString(), dateTo: dateTo?.toISOString(), grouping, }); // Проверяем, изменились ли настройки const hasChanges = isBuilt && lastBuiltConfig !== currentConfigString; const toggleChannel = (channelId: string) => { setSelectedChannelIds((prev) => prev.includes(channelId) ? prev.filter((id) => id !== channelId) : [...prev, channelId] ); }; const toggleMetric = (metric: AnalyticsMetric) => { setSelectedMetrics((prev) => prev.includes(metric) ? prev.filter((m) => m !== metric) : [...prev, metric] ); }; const handleBuild = () => { if (selectedChannelIds.length === 0 || selectedMetrics.length === 0) { alert("Выберите хотя бы один канал и одну метрику"); return; } onBuild({ targetChannelIds: selectedChannelIds, metrics: selectedMetrics, dateFrom: dateFrom || null, dateTo: dateTo || null, grouping, }); setLastBuiltConfig(currentConfigString); setIsBuilt(true); }; const getButtonText = () => { if (loading) return "Загрузка..."; if (!isBuilt) return "Построить график"; if (hasChanges) return "Обновить график"; return "График построен"; }; const isButtonDisabled = loading || (isBuilt && !hasChanges); return (
График #{chartNumber} Настройте параметры и постройте график
{showRemoveButton && onRemove && ( )}
{/* Настройки */}
{/* Выбор каналов */}
{channels.map((channel) => (
toggleChannel(channel.id)} />
))}
{/* Выбор метрик */}
{METRICS.map((metric) => (
toggleMetric(metric.value)} />
))}
{/* Период от */}
{/* Период до */}
{/* Группировка */}
{/* Тип графика */}
{/* Подписи значений */}
{/* Кнопка построения */}
{/* График */} {data && ( )}
); };