diff --git a/src/pages/workorders/view/WorkOrderViewPage.css b/src/pages/workorders/view/WorkOrderViewPage.css index 0a1f86b7..7747a645 100644 --- a/src/pages/workorders/view/WorkOrderViewPage.css +++ b/src/pages/workorders/view/WorkOrderViewPage.css @@ -749,6 +749,60 @@ font-weight: 600; } +.dispatchWOChips { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.dispatchWOChip { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 4px 10px; + background: #e9ecef; + border-radius: 4px; + font-size: 12px; + color: #333; +} + +.dispatchWOChip button { + background: none; + border: none; + color: #999; + cursor: pointer; + font-size: 14px; + padding: 0; + line-height: 1; +} + +.dispatchWOChip button:hover { + color: #dc3545; +} + +.dispatchWODropdown { + border: 1px solid #ddd; + border-radius: 4px; + max-height: 160px; + overflow-y: auto; + margin-top: 4px; +} + +.dispatchWOOption { + padding: 8px 12px; + font-size: 12px; + cursor: pointer; + border-bottom: 1px solid #f0f0f0; +} + +.dispatchWOOption:hover { + background: #f0f7ff; +} + +.dispatchWOOption:last-child { + border-bottom: none; +} + .dispatchVerifiedBanner { padding: 12px 20px; background: #d4edda; diff --git a/src/pages/workorders/view/WorkOrderViewPage.js b/src/pages/workorders/view/WorkOrderViewPage.js index 456b07ac..ac053183 100644 --- a/src/pages/workorders/view/WorkOrderViewPage.js +++ b/src/pages/workorders/view/WorkOrderViewPage.js @@ -529,6 +529,9 @@ function DispatchModal({ wo, onClose, onDispatched }) { const [taskTemplates, setTaskTemplates] = useState([]); const [selectedTemplateId, setSelectedTemplateId] = useState(""); const [loaded, setLoaded] = useState(false); + const [selectedWOs, setSelectedWOs] = useState([{ id: wo.id, number: wo.internalWONumber, title: wo.title }]); + const [siteWOs, setSiteWOs] = useState([]); + const [woSearch, setWoSearch] = useState(""); useEffect(() => { fetchVendorsDropdown(wo.trade, wo.locationZip).then((data) => { @@ -536,6 +539,13 @@ function DispatchModal({ wo, onClose, onDispatched }) { setLoaded(true); }).catch(() => setLoaded(true)); fetchTaskTemplates().then(setTaskTemplates).catch(() => {}); + if (wo.locationId) { + const { get: apiGet } = require("../../../apiUtil"); + const { API_URL } = require("../../../constants"); + apiGet(`${API_URL}/WorkOrder/GetWorkOrderList?search=&page=1&pageSize=500&sortBy=number&sortDir=asc&locationId=${wo.locationId}`).then((res) => { + setSiteWOs((res?.data || []).filter(w => w.id !== wo.id)); + }).catch(() => {}); + } }, [wo.trade]); const selectVendor = (id) => { @@ -552,7 +562,7 @@ function DispatchModal({ wo, onClose, onDispatched }) { setSending(true); try { await dispatchToVendor({ - WorkOrderIds: [wo.id], + WorkOrderIds: selectedWOs.map(w => w.id), VendorIds: [selectedId], NTEAmount: nteAmount ? parseFloat(nteAmount) : null, ScheduledDate: scheduledDate || null, @@ -573,10 +583,50 @@ function DispatchModal({ wo, onClose, onDispatched }) {