import { permissions } from "@mrp/shared"; import type { WorkOrderStatus, WorkOrderSummaryDto } from "@mrp/shared"; import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { useAuth } from "../../auth/AuthProvider"; import { api, ApiError } from "../../lib/api"; import { workOrderStatusFilters } from "./config"; import { WorkOrderStatusBadge } from "./WorkOrderStatusBadge"; export function WorkOrderListPage() { const { token, user } = useAuth(); const [workOrders, setWorkOrders] = useState([]); const [query, setQuery] = useState(""); const [statusFilter, setStatusFilter] = useState<"ALL" | WorkOrderStatus>("ALL"); const [status, setStatus] = useState("Loading work orders..."); const canManage = user?.permissions.includes(permissions.manufacturingWrite) ?? false; useEffect(() => { if (!token) { return; } setStatus("Loading work orders..."); api.getWorkOrders(token, { q: query || undefined, status: statusFilter === "ALL" ? undefined : statusFilter }) .then((nextWorkOrders) => { setWorkOrders(nextWorkOrders); setStatus(nextWorkOrders.length === 0 ? "No work orders matched the current filters." : `${nextWorkOrders.length} work order(s) loaded.`); }) .catch((error: unknown) => { const message = error instanceof ApiError ? error.message : "Unable to load work orders."; setStatus(message); }); }, [query, statusFilter, token]); return (

Manufacturing

Work Orders

Release and execute build work against manufactured or assembly inventory items, with project linkage and real inventory posting.

{canManage ? ( New work order ) : null}
{status}
{workOrders.length === 0 ? (
No work orders are available yet.
) : (
{workOrders.map((workOrder) => ( ))}
Work Order Item Project Status Qty Location Ops Due
{workOrder.workOrderNumber}
{workOrder.itemSku}
{workOrder.itemName}
{workOrder.projectNumber ? `${workOrder.projectNumber} - ${workOrder.projectName}` : "Unlinked"} {workOrder.completedQuantity} / {workOrder.quantity} {workOrder.warehouseCode} / {workOrder.locationCode} {workOrder.operationCount} / {Math.round(workOrder.totalPlannedMinutes / 60)}h {workOrder.dueDate ? new Date(workOrder.dueDate).toLocaleDateString() : "Not set"}
)}
); }