+
Your Dispatches
+
+ View and manage work orders assigned to your company.
+
+
+ {FILTERS.map((f) => (
+
+ ))}
+
+
+
+ {loading && No dispatches in this view.
+ )}
+
+ No checklist items for this dispatch.
;
+ }
+
+ return (
+
+ {items.map((item) => (
+
+ toggle(item)}
+ disabled={locked}
+ />
+
+ {item.isCompleted && item.completedAt && (
+ {formatDateTime(item.completedAt)}
+ )}
+
+ ))}
+
+ );
+}
+
+function CommentsSection({ token, dispatchId, comments, onAdded }) {
+ const [text, setText] = useState("");
+ const [submitting, setSubmitting] = useState(false);
+
+ async function submit(e) {
+ e.preventDefault();
+ if (!text.trim()) return;
+ setSubmitting(true);
+ try {
+ const added = await vendorPortalApi.addComment(token, dispatchId, text.trim());
+ onAdded(added);
+ setText("");
+ } catch (err) {
+ alert(err.message);
+ } finally {
+ setSubmitting(false);
+ }
+ }
+
+ return (
+ <>
+ {comments.length === 0 && No comments yet.
}
+ {comments.map((c) => (
+
+
Signed by{existingSignoff.name}
+
Method{existingSignoff.signatureMethod}
+
Signed at{formatDateTime(existingSignoff.signedAt)}
+
+ );
+ }
+
+ async function submit(e) {
+ e.preventDefault();
+ const signature = method === "drawn" ? drawnSig : typedSig;
+ if (!name.trim() || !signature) {
+ alert("Name and signature are required");
+ return;
+ }
+ setSubmitting(true);
+ try {
+ const added = await vendorPortalApi.addSignoff(token, dispatchId, {
+ name: name.trim(),
+ signature,
+ signatureMethod: method,
+ signoffType,
+ });
+ onAdded(added);
+ } catch (err) {
+ alert(err.message);
+ } finally {
+ setSubmitting(false);
+ }
+ }
+
+ return (
+
+
+
+
{data.dispatchNumber}
+
{data.workOrder?.workerOrderTitle}
+
+
{data.status}
+
+
+
+ {data.workOrder?.internalWONumber &&
WO #{data.workOrder.internalWONumber}
}
+ {data.poNumber &&
PO #{data.poNumber}
}
+ {data.nteAmount != null &&
NTE${Number(data.nteAmount).toFixed(2)}
}
+ {data.workOrder?.priority &&
Priority{data.workOrder.priority}
}
+ {data.workOrder?.trade &&
Trade{data.workOrder.trade}{data.workOrder.subTrade ? ` / ${data.workOrder.subTrade}` : ""}
}
+ {data.workOrder?.problem &&
Problem{data.workOrder.problem}
}
+ {data.scheduledDate &&
Scheduled{formatDateTime(data.scheduledDate)}
}
+ {data.acknowledgedAt &&
Acknowledged{formatDateTime(data.acknowledgedAt)}
}
+ {data.completedDate &&
Completed{formatDateTime(data.completedDate)}
}
+
+
+ {data.location && (
+ <>
+
Location
+
{data.location.name}
+
+ {[data.location.address, data.location.city, data.location.state, data.location.zipCode].filter(Boolean).join(", ")}
+
+ >
+ )}
+
+ {(data.description || data.workOrder?.description) && (
+ <>
+
Description
+
{data.description || data.workOrder?.description}
+ >
+ )}
+
+
+ {data.status === "Sent" && (
+
+ )}
+ {data.status === "Acknowledged" && (
+
+ )}
+ {data.status === "In Progress" && (
+
+ )}
+ {!locked && data.status !== "Sent" && (
+
+ )}
+
+
+
+