diff --git a/src/pages/workorders/view/WorkOrderViewPage.css b/src/pages/workorders/view/WorkOrderViewPage.css index addb6fe5..a35b0068 100644 --- a/src/pages/workorders/view/WorkOrderViewPage.css +++ b/src/pages/workorders/view/WorkOrderViewPage.css @@ -443,6 +443,59 @@ color: #333; } +.woDispatchSearch { + width: 100%; + height: 36px; + padding: 6px 12px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 13px; + margin-bottom: 8px; + box-sizing: border-box; +} + +.woDispatchSearch:focus { + border-color: #66afe9; + outline: none; +} + +.woDispatchSelected { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-top: 8px; +} + +.woDispatchSelectedChip { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 3px 10px; + background: #e6f0ff; + border-radius: 12px; + font-size: 12px; + color: #007bff; +} + +.woDispatchSelectedChip button { + background: none; + border: none; + color: #007bff; + cursor: pointer; + font-size: 14px; + padding: 0; + line-height: 1; +} + +.woDispatchFieldRow { + display: flex; + gap: 12px; +} + +.woDispatchFieldHalf { + flex: 1; +} + .woDispatchVendorList { max-height: 200px; overflow-y: auto; diff --git a/src/pages/workorders/view/WorkOrderViewPage.js b/src/pages/workorders/view/WorkOrderViewPage.js index cb14aae4..c3aad2d4 100644 --- a/src/pages/workorders/view/WorkOrderViewPage.js +++ b/src/pages/workorders/view/WorkOrderViewPage.js @@ -164,7 +164,9 @@ function DispatchModal({ wo, onClose, onDispatched }) { const [vendors, setVendors] = useState([]); const [selectedIds, setSelectedIds] = useState([]); const [nteAmount, setNteAmount] = useState(wo.vendorNTE || ""); + const [scheduledDate, setScheduledDate] = useState(""); const [description, setDescription] = useState(wo.description || ""); + const [vendorSearch, setVendorSearch] = useState(""); const [sending, setSending] = useState(false); const [loaded, setLoaded] = useState(false); @@ -179,6 +181,11 @@ function DispatchModal({ wo, onClose, onDispatched }) { setSelectedIds(prev => prev.includes(id) ? prev.filter(v => v !== id) : [...prev, id]); }; + const filteredVendors = vendors.filter((v) => + (v.companyName || "").toLowerCase().includes(vendorSearch.toLowerCase()) || + (v.tradeSpecialties || "").toLowerCase().includes(vendorSearch.toLowerCase()) + ); + const handleSubmit = async () => { if (selectedIds.length === 0) { toast.error("Select at least one vendor"); return; } setSending(true); @@ -186,6 +193,7 @@ function DispatchModal({ wo, onClose, onDispatched }) { await dispatchToVendor(wo.id, { VendorIds: selectedIds, NTEAmount: nteAmount ? parseFloat(nteAmount) : null, + ScheduledDate: scheduledDate || null, Description: description, }); toast.success(`Dispatched to ${selectedIds.length} vendor(s)`); @@ -208,9 +216,16 @@ function DispatchModal({ wo, onClose, onDispatched }) {