import { Fragment, useEffect, useMemo, useState } from 'react'; import { Alert, Badge, Button, Checkbox, Group, Loader, Modal, NumberInput, Select, Stack, Table, Tabs, Text, Textarea, TextInput, } from '@mantine/core'; import { ChevronDown, ChevronRight, ClipboardCheck, Info, PackageSearch, Train, Truck } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; import { useAutoUnloadArrivedBookings, useBulkDispatchExport, useBulkMarkInspected, useBulkReceive, useEligibleBookings, useImportArriveQueue, useImportTrainItems, useImportUnloadedQueue, useLoadPassedExport, useLoadedExport, useReadyToLoadExport, useReceiveInventory, useWarehouseInventory, useWarehouseYards, useWarehouseZones, useWarehouses, } from '@/hooks/useWarehouses'; import type { AutoUnloadArrivedResult, BulkDispatchResult, BulkInspectResult, BulkReceiveResult, ImportTrain, ImportTrainItem, ImportUnloadedItem, LoadPassedExportResult, ReadyToLoadRow, ReceiveInventoryPayload, } from '@/types/warehouse'; import { BookingSelect } from './BookingSelect'; import { InspectionReportModal } from './InspectionReportModal'; import { InventoryWorkbench } from './InventoryWorkbench'; import { extractErrorMessage, formatDate, formatNumber } from './options'; interface ReceiveInventoryModalProps { opened: boolean; onClose: () => void; /** When supplied the modal locks to a single booking (legacy single-receive). */ bookingId?: string; bookingLabel?: string; onReceived?: () => void; } interface Location { warehouseId: string; yardId: string; zoneId: string; } /** Cascading Warehouse → Yard → Zone selectors (ACTIVE only). */ function LocationSelects({ value, onChange, }: { value: Location; onChange: (next: Location) => void; }) { const warehousesQuery = useWarehouses({ status: 'ACTIVE' }); const yardsQuery = useWarehouseYards(value.warehouseId || undefined); const zonesQuery = useWarehouseZones(value.yardId || undefined); const warehouseOptions = useMemo( () => (warehousesQuery.data ?? []).map((w) => ({ value: w.id, label: `${w.name} (${w.code})` })), [warehousesQuery.data], ); const yardOptions = useMemo( () => (yardsQuery.data ?? []) .filter((y) => y.status === 'ACTIVE') .map((y) => ({ value: y.id, label: `${y.name} (${y.code})` })), [yardsQuery.data], ); const zoneOptions = useMemo( () => (zonesQuery.data ?? []) .filter((z) => z.status === 'ACTIVE') .map((z) => ({ value: z.id, label: `${z.name} (${z.code})` })), [zonesQuery.data], ); return ( onChange({ ...value, yardId: v ?? '', zoneId: '' })} />