mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-04 14:52:06 +00:00
* docs(work-orders): add pending BE contract checklist for design parity gaps * feat(work-orders): add mentions in work-order comments composer * docs(work-orders): align pr description with jira and qa residuals * refactor(workorders): split work order view page into view components * fix(work-orders): export comment assignment vendor input types for view hook * fix(work-orders): drop preferredContact from vendor update payload Align with WorkOrderVendorUpdatePayload on current dev so the mentions branch typechecks. * fix(work-orders): remove Preferred Contact from WO vendor editor (SH-180) EOF * fix(work-orders): harden comment mentions and clear draft on success * fix(work-orders): harden mention highlight boundary and submit catch [SH-217] * fix(work-orders): keep mention cursor sync on current value [SH-217] * fix(work-orders): keep mention menu open after typing @ Pass live text into syncCursor instead of a render-time valueRef. Add a composer interaction regression for @ autocomplete visibility. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Alexandre Brandizzi <alex_brandizzi@hotmail.com>
102 lines
3.5 KiB
TypeScript
102 lines
3.5 KiB
TypeScript
import { useParams } from "react-router";
|
|
import { Alert, Box, CircularProgress } from "@mui/material";
|
|
import { DispatchCreateModal } from "./_components/dispatch-create-modal";
|
|
import { DispatchDetailModal } from "./_components/dispatch-detail-modal";
|
|
import { WorkOrderActivityPanel } from "./_components/view/work-order-activity-panel";
|
|
import { WorkOrderDispatchesAccordion } from "./_components/view/work-order-dispatches-accordion";
|
|
import { WorkOrderVendorEditorDialog } from "./_components/view/work-order-vendor-editor-dialog";
|
|
import { WorkOrderViewAccordions } from "./_components/view/work-order-view-accordions";
|
|
import { WorkOrderViewDetails } from "./_components/view/work-order-view-details";
|
|
import { WorkOrderViewHeader } from "./_components/view/work-order-view-header";
|
|
import { useWorkOrderViewPage } from "./_hooks/use-work-order-view-page";
|
|
|
|
export default function WorkOrderViewPage() {
|
|
const { id } = useParams();
|
|
const workOrderId = id ?? "";
|
|
const view = useWorkOrderViewPage(workOrderId);
|
|
|
|
if (view.isLoading) {
|
|
return (
|
|
<Box className="flex justify-center p-12">
|
|
<CircularProgress />
|
|
</Box>
|
|
);
|
|
}
|
|
|
|
if (view.error || !view.wo) {
|
|
return (
|
|
<Box className="p-4">
|
|
<Alert severity="error">
|
|
{view.error instanceof Error ? view.error.message : "Work order not found."}
|
|
</Alert>
|
|
</Box>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Box className="flex flex-col gap-4 p-4">
|
|
<WorkOrderViewHeader
|
|
wo={view.wo}
|
|
workOrderId={workOrderId}
|
|
statusAnchor={view.statusAnchor}
|
|
onStatusAnchorChange={view.setStatusAnchor}
|
|
onStatusChange={(status) => view.statusMutation.mutate(status)}
|
|
onOpenDispatch={() => view.setDispatchOpen(true)}
|
|
/>
|
|
|
|
<WorkOrderViewDetails
|
|
wo={view.wo}
|
|
users={view.users}
|
|
assignAnchor={view.assignAnchor}
|
|
onAssignAnchorChange={view.setAssignAnchor}
|
|
onAssign={(userId, userName) => view.assignmentMutation.mutate({ userId, userName })}
|
|
onUnassign={() => view.assignmentMutation.mutate({ userId: "", userName: "" })}
|
|
/>
|
|
|
|
<WorkOrderViewAccordions wo={view.wo} />
|
|
|
|
<WorkOrderDispatchesAccordion
|
|
wo={view.wo}
|
|
onOpenDispatchDetail={view.setDispatchDetailId}
|
|
onOpenVendorEditor={view.openVendorEditor}
|
|
/>
|
|
|
|
<WorkOrderActivityPanel
|
|
customerComments={view.customerComments}
|
|
internalComments={view.internalComments}
|
|
auditLog={view.auditLog}
|
|
mentionUsers={view.mentionUsers}
|
|
isSubmitting={view.commentMutation.isPending}
|
|
onSubmitComment={view.submitComment}
|
|
/>
|
|
|
|
{view.dispatchOpen && (
|
|
<DispatchCreateModal
|
|
workOrder={view.wo}
|
|
onClose={() => view.setDispatchOpen(false)}
|
|
onDispatched={() => void view.refetch()}
|
|
/>
|
|
)}
|
|
{view.dispatchDetailId != null && (
|
|
<DispatchDetailModal
|
|
dispatchId={view.dispatchDetailId}
|
|
workOrderId={workOrderId}
|
|
onClose={() => view.setDispatchDetailId(null)}
|
|
onUpdated={() => void view.refetch()}
|
|
/>
|
|
)}
|
|
|
|
<WorkOrderVendorEditorDialog
|
|
editor={view.vendorEditor}
|
|
loading={view.vendorEditorLoading}
|
|
error={view.vendorEditorError}
|
|
isSaving={view.vendorMutation.isPending}
|
|
onClose={() => {
|
|
if (!view.vendorMutation.isPending) view.setVendorEditor(null);
|
|
}}
|
|
onSave={view.saveVendorEditor}
|
|
onEditorChange={view.setVendorEditor}
|
|
/>
|
|
</Box>
|
|
);
|
|
}
|