From 99724f831c4526d383636a5c6d0697922986c8a6 Mon Sep 17 00:00:00 2001 From: "arthur.bassi" Date: Tue, 11 Aug 2026 15:42:29 -0300 Subject: [PATCH] fix(work-orders): adapt Add-On indicator unstack onto independently approvable base Extract inline schedule cell for the maintainability gate, drop completedDate patch coverage that is not on WorkOrderTableRow on dev, and align range create expectations with assignWizardScheduleFields. --- .../list/table/wo-table-inline-row-cells.tsx | 64 +++++++++++-------- .../wo-table-unscheduled-highlight.test.tsx | 1 + .../mappers/work-order-board-mapper.test.ts | 5 +- .../use-work-order-table-mutations.test.tsx | 51 --------------- 4 files changed, 43 insertions(+), 78 deletions(-) diff --git a/src/app/(protected)/workorders/_components/list/table/wo-table-inline-row-cells.tsx b/src/app/(protected)/workorders/_components/list/table/wo-table-inline-row-cells.tsx index 0d76d00d..ffc1afeb 100644 --- a/src/app/(protected)/workorders/_components/list/table/wo-table-inline-row-cells.tsx +++ b/src/app/(protected)/workorders/_components/list/table/wo-table-inline-row-cells.tsx @@ -28,6 +28,44 @@ type WoTableInlineRowCellsProps = { onPatch: (patch: Partial) => void; }; +function InlineScheduleOnCell({ + draft, + weekDefault, + onPatch, +}: { + draft: WorkOrderTableDraft; + weekDefault: boolean; + onPatch: (patch: Partial) => void; +}) { + return ( + + + onPatch({ + scheduledOn: date, + scheduleWeekOnly: false, + targetWeek: "", + isAddOnOverride: false, + }) + } + onSaveWeek={(week) => + onPatch({ + scheduledOn: "", + targetWeek: week, + scheduleWeekOnly: true, + isAddOnOverride: false, + }) + } + /> + + ); +} + export function WoTableInlineRowCells({ draft, weekDefault, @@ -84,31 +122,7 @@ export function WoTableInlineRowCells({ /> - - - onPatch({ - scheduledOn: date, - scheduleWeekOnly: false, - targetWeek: "", - isAddOnOverride: false, - }) - } - onSaveWeek={(week) => - onPatch({ - scheduledOn: "", - targetWeek: week, - scheduleWeekOnly: true, - isAddOnOverride: false, - }) - } - /> - + { expect(payload.isAddOn).toBe(true); }); - it("derives isAddOn from range start via cutoff (range persists scheduledDate)", () => { + it("derives isAddOn from range start via cutoff (range omits scheduledDate on create)", () => { const payload = mapWizardDraftToBoardCreatePayload({ ...EMPTY_WIZARD_DRAFT, type: "PM", @@ -96,7 +96,8 @@ describe("mapWizardDraftToBoardCreatePayload", () => { isAddOnOverride: false, }); - expect(payload.scheduledDate).toBe("2026-07-08"); + // On create, range mode does not persist scheduledDate (notes carry the range). + expect(payload.scheduledDate).toBeUndefined(); // createdAt defaults to now; after prior-Saturday 2026-07-04 for that week → true expect(payload.isAddOn).toBe(true); }); diff --git a/src/test/domain/work-orders/use-cases/use-work-order-table-mutations.test.tsx b/src/test/domain/work-orders/use-cases/use-work-order-table-mutations.test.tsx index 6ce07630..275f7b79 100644 --- a/src/test/domain/work-orders/use-cases/use-work-order-table-mutations.test.tsx +++ b/src/test/domain/work-orders/use-cases/use-work-order-table-mutations.test.tsx @@ -42,14 +42,12 @@ function makeWrapper() { type ServerState = { status: string; scheduledDate: string; - completedDate: string; docStatus: CompletionDocStatus; }; const BASE_SERVER: ServerState = { status: "Open", scheduledDate: "2026-06-01", - completedDate: "", docStatus: "No", }; @@ -61,7 +59,6 @@ const BASE_ROW = { dispatcherId: "d1", dispatcherName: "Dispatcher", scheduledOn: "2026-06-01", - completedDate: "", targetWeek: "", dayGroup: "", dayLabel: "", @@ -129,14 +126,6 @@ describe("useWorkOrderTableMutations completion-doc persistence", () => { rowVersion: `${payload.workOrderVersion}-next`, }; } - if (payload.field === "completedDate" && typeof payload.value === "string") { - serverState = { ...serverState, completedDate: payload.value }; - rowState = { - ...rowState, - completedDate: payload.value, - rowVersion: `${payload.workOrderVersion}-date`, - }; - } events.push(`boardPatch:${payload.field}:end`); return { ...rowState }; }, @@ -170,46 +159,6 @@ describe("useWorkOrderTableMutations completion-doc persistence", () => { expect(getById).not.toHaveBeenCalled(); expect(serverState.docStatus).toBe("NN"); }); - - it("serializes board docStatus and completedDate via PATCH without racing or EditWorkorder", async () => { - const onPatch = vi.fn(); - const { result } = renderHook( - () => - useWorkOrderTableMutations({ - onPatch, - clearPatch: () => undefined, - getRow: () => rowState, - }), - { wrapper: makeWrapper() }, - ); - - act(() => { - result.current.patchField(42, { docStatus: "Yes" }); - result.current.patchField(42, { completedDate: "2026-07-20" }); - }); - - await waitFor(() => expect(events).toContain("boardPatch:completedDate:end")); - await waitFor(() => expect(events).toContain("boardPatch:docStatus:end")); - - expect(events).toEqual([ - "boardPatch:docStatus:start", - "boardPatch:docStatus:end", - "boardPatch:completedDate:start", - "boardPatch:completedDate:end", - ]); - - expect(getById).not.toHaveBeenCalled(); - expect(update).not.toHaveBeenCalled(); - expect(patchBoardField).toHaveBeenCalledWith( - 42, - expect.objectContaining({ field: "completedDate", value: "2026-07-20" }), - ); - - expect(serverState.docStatus).toBe("Yes"); - expect(serverState.completedDate).toBe("2026-07-20"); - expect(serverState.scheduledDate).toBe(BASE_SERVER.scheduledDate); - expect(serverState.status).toBe(BASE_SERVER.status); - }); }); describe("applySchedulePatch isAddOn optimistic clear", () => {