import { fmtAmount, fmtDate, statusLabel } from "../../shared/utils.js"; export function DashboardSection({ dashboardData, token, status, apiCall, onOpenRequest, DataTableComponent, StatusLineComponent, UserAvatarComponent, }) { const { useMemo, useState } = React; const DataTable = DataTableComponent; const StatusLine = StatusLineComponent; const UserAvatar = UserAvatarComponent; const [lawyerModal, setLawyerModal] = useState({ open: false, loading: false, error: "", lawyer: null, rows: [], totals: { amount: 0, salary: 0 }, }); const statusCards = useMemo(() => { return Object.entries(dashboardData?.byStatus || {}) .map(([label, value]) => ({ label, value })) .sort((a, b) => String(a.label).localeCompare(String(b.label), "ru")); }, [dashboardData?.byStatus]); const fmtThousandsCompact = (value) => { const amount = Number(value || 0); if (!Number.isFinite(amount)) return "0"; return new Intl.NumberFormat("ru-RU", { minimumFractionDigits: 0, maximumFractionDigits: 1, }).format(amount / 1000); }; const openLawyerModal = async (lawyerRow) => { if (!lawyerRow?.lawyer_id || typeof apiCall !== "function") return; setLawyerModal({ open: true, loading: true, error: "", lawyer: lawyerRow, rows: [], totals: { amount: 0, salary: 0 }, }); try { const data = await apiCall("/api/admin/metrics/lawyers/" + encodeURIComponent(String(lawyerRow.lawyer_id)) + "/active-requests"); setLawyerModal((prev) => ({ ...prev, loading: false, error: "", rows: Array.isArray(data?.rows) ? data.rows : [], totals: { amount: Number(data?.totals?.amount || 0), salary: Number(data?.totals?.salary || 0), }, })); } catch (error) { setLawyerModal((prev) => ({ ...prev, loading: false, error: error.message || "Ошибка загрузки" })); } }; const closeLawyerModal = () => { setLawyerModal({ open: false, loading: false, error: "", lawyer: null, rows: [], totals: { amount: 0, salary: 0 } }); }; const isLawyerScope = dashboardData?.scope === "LAWYER"; const lawyerCards = Array.isArray(dashboardData?.lawyerLoads) ? dashboardData.lawyerLoads : []; const currentLawyer = lawyerCards[0] || null; const lawyerMetrics = currentLawyer ? [ { label: "В работе", value: String(currentLawyer.active_load ?? 0) }, { label: "Новые", value: String(currentLawyer.monthly_assigned_count ?? 0) }, { label: "Закрыто", value: String(currentLawyer.monthly_completed_count ?? 0) }, { label: "ЗП, тыс.", value: fmtThousandsCompact(currentLawyer.monthly_salary) }, ] : []; return ( <>
{isLawyerScope ? "Состояние заявок и персональная загрузка." : "Состояние заявок, финансы месяца и загрузка юристов."}
{card.label}
{card.value}Текущая раскладка по всем статусам.
{card.label}
{String(card.value ?? 0)}{metric.label}
{metric.value}Моя загрузка
Нет данныхЮристы
Нет данных{(lawyerModal.lawyer.primary_topic_code || "Тема не указана") + " • " + (lawyerModal.lawyer.email || "")}
) : null}Загрузка активных заявок...
: null} {lawyerModal.error ?{lawyerModal.error}
: null} {!lawyerModal.loading ? ( <>