import type { ReactNode } from "react"; import { Badge, Center, Group, Loader, Modal, Text, Timeline } from "@mantine/core"; import { useQuery } from "@tanstack/react-query"; import { ArrowRight, PackageCheck, TrainFront, Wrench } from "lucide-react"; import { api } from "@/services/api"; import type { FleetRecord } from "@/services/fleet/fleet.service"; import type { WagonMovementRecord } from "@/services/wagon.service"; export interface WagonMovementHistoryModalProps { opened: boolean; onClose: () => void; record: FleetRecord | null; } const asObj = (r: FleetRecord | null) => (r ?? {}) as Record; /** Chip style per wagon_movements ledger kind. */ const KIND_META: Record = { LOADED: { label: "Loaded leg", color: "edr-green", icon: , }, EMPTY_REPOSITION: { label: "Empty reposition", color: "blue", icon: , }, MANUAL: { label: "Manual move", color: "orange", icon: , }, MAINTENANCE: { label: "Sent to maintenance", color: "red", icon: , }, }; const yardLabel = ( yard: { label?: string; code?: string } | null | undefined, yardId: string | null, ) => yard?.label ?? yard?.code ?? yardId ?? "Unknown"; const fmt = (iso: string) => { const d = new Date(iso); return Number.isNaN(d.getTime()) ? iso : d.toLocaleString(); }; /** * Movement ledger for one wagon: every relocation between yards — booking legs, * empty reposition rides, and manual staff corrections — newest first. */ const WagonMovementHistoryModal = ({ opened, onClose, record, }: WagonMovementHistoryModalProps) => { const r = asObj(record); const id = r.id ? String(r.id) : ""; const wagonNumber = r.wagonNumber ? String(r.wagonNumber) : ""; const { data, isLoading } = useQuery( api.wagons.movements.queryOptions({ input: { id }, enabled: opened && Boolean(id), }), ); const movements: WagonMovementRecord[] = data ?? []; return ( {`Wagon history — ${wagonNumber}`.trim()}} radius="lg" size="lg" centered > {isLoading ? (
) : movements.length === 0 ? ( No movements recorded yet. Every yard-to-yard move appears here — a booking's loaded leg, an empty reposition ride, or a manual correction. ) : ( {movements.map((movement) => { const meta = KIND_META[movement.kind] ?? { label: movement.kind, color: "gray", icon: , }; const from = yardLabel(movement.fromYard, movement.fromYardId); const to = yardLabel(movement.toYard, movement.toYardId); return ( {from} {/* Status events (maintenance) sit in one yard — an arrow pointing at the same yard reads as a broken row. */} {movement.fromYardId !== movement.toYardId && ( <> {to} )} {meta.label} } > {movement.note && ( {movement.note} )} {fmt(movement.occurredAt)} ); })} )}
); }; export default WagonMovementHistoryModal;