import React from "react"; import { filterOrderGroups, getOrderGroupDisplayStatusLabel, getOrderGroupDisplayStatusValue, getOrderGroupStatusTone, ORDER_GROUP_DISPLAY_STATUS_OPTIONS, } from "../../services/orderGroupViews"; import { Badge } from "../UI/Badge"; import { Panel } from "../UI/Panel"; import { SkeletonPage } from "../UI/Loading"; import { OrderFilters } from "../orders/OrderFilters"; import { formatDateTime } from "../../utils/formatters"; export const LogisticsReadinessBoard = ({ orderGroups = [], onSelectSet, statusOptions = ORDER_GROUP_DISPLAY_STATUS_OPTIONS, isLoading = false }) => { const [filters, setFilters] = React.useState({ query: "", displayStatus: "all", city: "" }); const [collapsedSections, setCollapsedSections] = React.useState(new Set()); const cities = React.useMemo(() => { const set = new Set(); for (const g of orderGroups) { if (g.city) set.add(g.city); } return [...set].sort(); }, [orderGroups]); const filteredGroups = React.useMemo( () => filterOrderGroups(orderGroups, filters), [filters, orderGroups], ); const statusGroups = React.useMemo(() => { const map = new Map(); for (const group of filteredGroups) { const statusValue = getOrderGroupDisplayStatusValue(group); if (!map.has(statusValue)) { const label = getOrderGroupDisplayStatusLabel(group); map.set(statusValue, { label, groups: [] }); } map.get(statusValue).groups.push(group); } return map; }, [filteredGroups]); const FUNNEL_ORDER = [ "status:ready_for_notification", "delivery:pending_confirmation", "status:manual_required", "status:first_sms_sent", "status:second_sms_sent", "delivery:agreed", "delivery:driver_assigned", "delivery:loaded", "delivery:on_route", "delivery:delivered", "delivery:paid_storage", "delivery:problem", "delivery:cancelled", ]; const totalGroups = filteredGroups.length; const TableHeader = () => ( Клиент Город Дата доставки Водитель Статус Обновлён ); if (isLoading) { return ; } return (

Наборы доставки

{totalGroups} групп
{!totalGroups ? (
По этому поиску ничего не найдено.
) : (
{Array.from(statusGroups.entries()).sort(([a], [b]) => { const idxA = FUNNEL_ORDER.indexOf(a); const idxB = FUNNEL_ORDER.indexOf(b); if (idxA === -1 && idxB === -1) return a.localeCompare(b); if (idxA === -1) return 1; if (idxB === -1) return -1; return idxA - idxB; }).map(([statusValue, { label, groups }]) => { const isCollapsed = collapsedSections.has(statusValue); return ( {!isCollapsed && (
{groups.map((group) => ( { if (onSelectSet) onSelectSet(group.id); }} > ))}
{group.displayTitle || group.customerName || group.groupKey}
{group.customerPhone || "—"}
{group.deliveryDate || "—"}
{group.city || group.customerAddress || "—"} {group.deliveryDate ? {group.deliveryDate}{group.deliveryTime ? · {group.deliveryTime} : ""} : } {group.assignedDriverName || } {getOrderGroupDisplayStatusLabel(group)} {formatDateTime(group.updatedAt)}
)}
); })}
)}
); };