import { useMemo, useState } from "react"; import { Box, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, MenuItem, Radio, Stack, TextField, Typography, } from "@mui/material"; import CloseIcon from "@mui/icons-material/Close"; import { useWorkOrdersList } from "@/domain/work-orders/use-cases/use-work-orders-list"; import { useTaskListTemplates, useWorkOrderVendors, } from "@/domain/work-orders/use-cases/use-work-order-detail"; import { useDispatchToVendor } from "@/domain/work-orders/use-cases/use-work-order-mutations"; import type { WorkOrderDetail } from "@/domain/work-orders/types/work-order"; interface SelectedWorkOrder { id: string | number; number: string; title: string; } interface DispatchCreateModalProps { workOrder: WorkOrderDetail; onClose: () => void; onDispatched: () => void; } export function DispatchCreateModal({ workOrder, onClose, onDispatched, }: DispatchCreateModalProps) { const [selectedVendorId, setSelectedVendorId] = useState(null); const [nteAmount, setNteAmount] = useState(workOrder.vendorNTE || ""); const [scheduledDate, setScheduledDate] = useState(""); const [description, setDescription] = useState(workOrder.description || ""); const [vendorSearch, setVendorSearch] = useState(""); const [selectedTemplateId, setSelectedTemplateId] = useState(""); const [customItems, setCustomItems] = useState([]); const [newCustomItem, setNewCustomItem] = useState(""); const [selectedWOs, setSelectedWOs] = useState([ { id: workOrder.id, number: workOrder.internalWONumber, title: workOrder.title, }, ]); const [woSearch, setWoSearch] = useState(""); const { data: vendors = [], isLoading: isLoadingVendors } = useWorkOrderVendors( workOrder.trade, workOrder.locationZip, ); const { data: taskTemplates = [] } = useTaskListTemplates(); const dispatchMutation = useDispatchToVendor(workOrder.id); const { data: siteWorkOrdersData } = useWorkOrdersList({ search: "", page: 1, pageSize: 500, sortBy: "number", sortDir: "asc", locationId: workOrder.locationId, }); const siteWorkOrders = useMemo( () => (siteWorkOrdersData?.items ?? []).filter((item) => String(item.id) !== String(workOrder.id)), [siteWorkOrdersData?.items, workOrder.id], ); const filteredVendors = useMemo( () => vendors.filter( (vendor) => vendor.companyName.toLowerCase().includes(vendorSearch.toLowerCase()) || vendor.tradeSpecialties.toLowerCase().includes(vendorSearch.toLowerCase()), ), [vendors, vendorSearch], ); const filteredSiteWOs = useMemo( () => siteWorkOrders .filter((item) => !selectedWOs.some((selected) => String(selected.id) === String(item.id))) .filter( (item) => !woSearch || item.woNumber.includes(woSearch) || item.title.toLowerCase().includes(woSearch.toLowerCase()), ) .slice(0, 10), [siteWorkOrders, selectedWOs, woSearch], ); const handleSubmit = () => { if (!selectedVendorId) { return; } dispatchMutation.mutate( { workOrderIds: selectedWOs.map((wo) => wo.id), vendorIds: [selectedVendorId], nteAmount: nteAmount ? parseFloat(nteAmount) : null, scheduledDate: scheduledDate || null, description, taskListTemplateId: selectedTemplateId ? parseInt(selectedTemplateId, 10) : null, customChecklistItems: customItems.length > 0 ? customItems : null, }, { onSuccess: () => { onDispatched(); onClose(); }, }, ); }; return ( Dispatch{" "} {selectedWOs.length > 1 ? `${selectedWOs.length} Work Orders` : `Work Order ${workOrder.internalWONumber}`} Work Orders ({selectedWOs.length}) {selectedWOs.map((wo) => ( setSelectedWOs((prev) => prev.filter((item) => item.id !== wo.id)) : undefined } /> ))} {siteWorkOrders.length > 0 && ( setWoSearch(event.target.value)} placeholder="Search to filter..." fullWidth className="mb-2" /> {filteredSiteWOs.map((item) => ( { setSelectedWOs((prev) => [ ...prev, { id: item.id, number: item.woNumber, title: item.title }, ]); setWoSearch(""); }} > {item.woNumber} — {item.title} ))} )} Select Vendor setVendorSearch(event.target.value)} placeholder="Search vendors..." fullWidth className="mb-2" /> {isLoadingVendors ? ( Loading vendors... ) : filteredVendors.length === 0 ? ( No vendors found ) : ( {filteredVendors.map((vendor) => ( setSelectedVendorId((current) => (current === vendor.id ? null : vendor.id)) } > {vendor.companyName} {vendor.tradeSpecialties && ( {vendor.tradeSpecialties} )} {vendor.address && ( {vendor.address} )} {vendor.distanceMiles != null && ( {vendor.distanceMiles} miles )} ))} )} setNteAmount(event.target.value)} fullWidth slotProps={{ htmlInput: { step: "0.01", min: 0 }, }} /> setScheduledDate(event.target.value)} slotProps={{ inputLabel: { shrink: true } }} fullWidth /> setSelectedTemplateId(event.target.value)} fullWidth > No checklist template {taskTemplates.map((template) => ( {template.name} ({template.items?.length ?? 0} items) ))} {customItems.length > 0 && ( {customItems.map((item, index) => ( setCustomItems((prev) => prev.filter((_, i) => i !== index))} /> ))} )} setNewCustomItem(event.target.value)} onKeyDown={(event) => { if (event.key === "Enter" && newCustomItem.trim()) { event.preventDefault(); setCustomItems((prev) => [...prev, newCustomItem.trim()]); setNewCustomItem(""); } }} placeholder="Add custom checklist item..." fullWidth size="small" /> setDescription(event.target.value)} fullWidth /> ); } function PaperList({ children }: { children: React.ReactNode }) { return ( {children} ); }