diff --git a/app/ui/src/app/edit/utils/vroomToRoutes.ts b/app/ui/src/app/edit/utils/vroomToRoutes.ts index 8eee8170..d4c76880 100644 --- a/app/ui/src/app/edit/utils/vroomToRoutes.ts +++ b/app/ui/src/app/edit/utils/vroomToRoutes.ts @@ -57,6 +57,9 @@ export function vroomToRoutes( // arrival is in seconds; % 86400 extracts the within-day portion for display const arrivalTimeStr = secondsToTimeString(step.arrival % 86400); + const winStart = address?.deliveryTimeStart?.trim(); + const winEnd = address?.deliveryTimeEnd?.trim(); + return { id: step.job_external_id!, address: @@ -66,15 +69,15 @@ export function vroomToRoutes( sequence: idx + 1, capacityUsed: step.load?.[0] ?? 0, timeWindow: { - kind: inferTimeWindowKind( - address?.deliveryTimeStart, - address?.deliveryTimeEnd, - ), + kind: inferTimeWindowKind(winStart, winEnd), time: arrivalTimeStr, }, note: address?.notes ?? "", - addresseeName: address?.recipientName || undefined, - phoneNumber: address?.phoneNumber || undefined, + addresseeName: address?.recipientName?.trim() || undefined, + phoneNumber: address?.phoneNumber?.trim() || undefined, + ...(winStart && winEnd + ? { deliveryWindow: { start: winStart, end: winEnd } } + : {}), }; }); diff --git a/app/ui/src/app/results/components/EditableStopItem.tsx b/app/ui/src/app/results/components/EditableStopItem.tsx index 7deeb1e6..588194c1 100644 --- a/app/ui/src/app/results/components/EditableStopItem.tsx +++ b/app/ui/src/app/results/components/EditableStopItem.tsx @@ -36,11 +36,19 @@ export default function EditableStopItem({
- - Name of addressed to: - {" "} + Addressee:{" "} {stop.addresseeName ?? "—"}
+
+ Phone:{" "} + {stop.phoneNumber ?? "—"} +
+ {stop.deliveryWindow ? ( +
+ Delivery window:{" "} + {stop.deliveryWindow.start} – {stop.deliveryWindow.end} +
+ ) : null}
Est time of arrival: diff --git a/app/ui/src/app/results/types.ts b/app/ui/src/app/results/types.ts index aee38956..15bf739e 100644 --- a/app/ui/src/app/results/types.ts +++ b/app/ui/src/app/results/types.ts @@ -23,6 +23,8 @@ export interface Stop { note: string; // driver notes for the stop addresseeName?: string; // name of person at address phoneNumber?: string; // phone number of person at address + /** Delivery window from edit form; start and end are always set together */ + deliveryWindow?: { start: string; end: string }; } // Data that a single route contains (one driver, their stops in order, and the path to draw for the route) diff --git a/app/ui/src/tests/vroomToRoutes.test.ts b/app/ui/src/tests/vroomToRoutes.test.ts index 7c5b01e5..4960090e 100644 --- a/app/ui/src/tests/vroomToRoutes.test.ts +++ b/app/ui/src/tests/vroomToRoutes.test.ts @@ -181,6 +181,47 @@ describe("vroomToRoutes", () => { expect(route.stops[1].sequence).toBe(2); }); + it("maps recipient, phone, and delivery window from address card", () => { + const [route] = vroomToRoutes( + SINGLE_STOP, + [makeVehicle(1)], + [ + makeAddress(1, { + recipientName: " Jane Doe ", + phoneNumber: "555-123-4567", + deliveryTimeStart: "9:00 AM", + deliveryTimeEnd: "11:00 AM", + }), + ], + ); + const stop = route.stops[0]; + expect(stop.addresseeName).toBe("Jane Doe"); + expect(stop.phoneNumber).toBe("555-123-4567"); + expect(stop.deliveryWindow).toEqual({ + start: "9:00 AM", + end: "11:00 AM", + }); + }); + + it("trims delivery window fields for kind and deliveryWindow", () => { + const [route] = vroomToRoutes( + SINGLE_STOP, + [makeVehicle(1)], + [ + makeAddress(1, { + deliveryTimeStart: " 9:00 AM", + deliveryTimeEnd: "11:00 AM ", + }), + ], + ); + const stop = route.stops[0]; + expect(stop.timeWindow.kind).toBe("at"); + expect(stop.deliveryWindow).toEqual({ + start: "9:00 AM", + end: "11:00 AM", + }); + }); + it("arrival wraps via % 86400 — 86400 + 32400 still shows 9:00 AM", () => { const response: VroomResponse = { routes: [