import React, { useState, useEffect, useRef } from "react"; import ReactDOM from "react-dom"; import { useParams, useNavigate } from "react-router"; import { toast } from "react-toastify"; import { getWorkOrderById, addComment, changeWorkOrderStatus, fetchUsers, changeWorkOrderAssignment, fetchVendorsDropdown, dispatchToVendor, getDispatchById, updateDispatch, addDispatchComment } from "../api"; import "./WorkOrderViewPage.css"; function AssignDropdown({ value, onAssign }) { const [open, setOpen] = useState(false); const [users, setUsers] = useState([]); const [loaded, setLoaded] = useState(false); const btnRef = useRef(null); const menuRef = useRef(null); const [menuPos, setMenuPos] = useState({ top: 0, left: 0 }); useEffect(() => { const handleClick = (e) => { if (btnRef.current?.contains(e.target)) return; if (menuRef.current?.contains(e.target)) return; setOpen(false); }; document.addEventListener("mousedown", handleClick); return () => document.removeEventListener("mousedown", handleClick); }, []); const handleOpen = async () => { if (!loaded) { try { const data = await fetchUsers(); setUsers(data); setLoaded(true); } catch { return; } } if (btnRef.current) { const rect = btnRef.current.getBoundingClientRect(); setMenuPos({ top: rect.bottom + 4, left: rect.left }); } setOpen(!open); }; const handleSelect = async (userId, userName) => { setOpen(false); onAssign(userId, userName); }; return ( <> {open && ReactDOM.createPortal(
No comments yet.
No changes recorded.
No messages yet.
) : (| Dispatch # | Vendor | NTE | Status | Date |
|---|---|---|---|---|
| {d.dispatchNumber || d.poNumber} | {d.vendorName} | {d.nteAmount != null ? `$${parseFloat(d.nteAmount).toFixed(2)}` : "—"} | {d.status} | {d.dispatchedAt ? formatDateTime(d.dispatchedAt) : "—"} |
No dispatches yet.
)}{wo.description || "No description provided."}