mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 16:19:01 +00:00
fix(work-orders): 0-based WO search page and stale duplicate guard
This commit is contained in:
parent
b3a4f31db1
commit
f31a301dbf
3 changed files with 12 additions and 9 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
import { useEffect, useMemo, useState } from "react";
|
import { useEffect, useMemo, useRef, useState } from "react";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
import { isWoWizardMockEnabled } from "@/domain/work-orders/mocks/is-wo-wizard-mock-enabled";
|
import { isWoWizardMockEnabled } from "@/domain/work-orders/mocks/is-wo-wizard-mock-enabled";
|
||||||
import {
|
import {
|
||||||
|
|
@ -46,6 +46,8 @@ export function useNewWoWizardState({
|
||||||
const [pocAutoFilledFor, setPocAutoFilledFor] = useState("");
|
const [pocAutoFilledFor, setPocAutoFilledFor] = useState("");
|
||||||
const [duplicateRow, setDuplicateRow] = useState<WorkOrderTableRow | null>(null);
|
const [duplicateRow, setDuplicateRow] = useState<WorkOrderTableRow | null>(null);
|
||||||
const [isCheckingDuplicate, setIsCheckingDuplicate] = useState(false);
|
const [isCheckingDuplicate, setIsCheckingDuplicate] = useState(false);
|
||||||
|
const draftWoNumberRef = useRef(draft.woNumber);
|
||||||
|
draftWoNumberRef.current = draft.woNumber;
|
||||||
|
|
||||||
const { data: apiLocations = [] } = useWorkOrderLocations();
|
const { data: apiLocations = [] } = useWorkOrderLocations();
|
||||||
const { data: apiProblems = [] } = useDropdownOptionsByCategory("Problem");
|
const { data: apiProblems = [] } = useDropdownOptionsByCategory("Problem");
|
||||||
|
|
@ -125,7 +127,8 @@ export function useNewWoWizardState({
|
||||||
|
|
||||||
const handleDuplicateFound = (woNumber: string) => {
|
const handleDuplicateFound = (woNumber: string) => {
|
||||||
void resolveDuplicate(woNumber).then((duplicate) => {
|
void resolveDuplicate(woNumber).then((duplicate) => {
|
||||||
if (duplicate && woNumber === draft.woNumber) {
|
// Compare against the latest draft — ignore stale lookups after the user edits.
|
||||||
|
if (duplicate && woNumber === draftWoNumberRef.current) {
|
||||||
setDuplicateRow(duplicate);
|
setDuplicateRow(duplicate);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -197,9 +197,9 @@ export const workOrdersApi = {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
// `board/search` is fuzzy and paginated; exhaust pages until an exact WO# match appears.
|
// `board/search` is fuzzy and paginated (0-based); exhaust pages until an exact WO# match.
|
||||||
const pageSize = 100;
|
const pageSize = 100;
|
||||||
let page = 1;
|
let page = 0;
|
||||||
let scanned = 0;
|
let scanned = 0;
|
||||||
let totalCount = Number.POSITIVE_INFINITY;
|
let totalCount = Number.POSITIVE_INFINITY;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -306,7 +306,7 @@ describe("workOrdersApi.findByWoNumber", () => {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
totalCount: 1,
|
totalCount: 1,
|
||||||
page: 1,
|
page: 0,
|
||||||
pageSize: 100,
|
pageSize: 100,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -321,7 +321,7 @@ describe("workOrdersApi.findByWoNumber", () => {
|
||||||
const searchParams = apiGet.mock.calls[0]?.[1]?.searchParams as URLSearchParams;
|
const searchParams = apiGet.mock.calls[0]?.[1]?.searchParams as URLSearchParams;
|
||||||
expect(Object.fromEntries(searchParams)).toEqual({
|
expect(Object.fromEntries(searchParams)).toEqual({
|
||||||
search: "10000001235",
|
search: "10000001235",
|
||||||
page: "1",
|
page: "0",
|
||||||
pageSize: "100",
|
pageSize: "100",
|
||||||
});
|
});
|
||||||
expect(result).toMatchObject({ id: 505, woNumber: "10000001235" });
|
expect(result).toMatchObject({ id: 505, woNumber: "10000001235" });
|
||||||
|
|
@ -336,7 +336,7 @@ describe("workOrdersApi.findByWoNumber", () => {
|
||||||
lifecycleStatusLabel: "Incomplete",
|
lifecycleStatusLabel: "Incomplete",
|
||||||
})),
|
})),
|
||||||
totalCount: 101,
|
totalCount: 101,
|
||||||
page: 1,
|
page: 0,
|
||||||
pageSize: 100,
|
pageSize: 100,
|
||||||
})
|
})
|
||||||
.mockResolvedValueOnce({
|
.mockResolvedValueOnce({
|
||||||
|
|
@ -348,7 +348,7 @@ describe("workOrdersApi.findByWoNumber", () => {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
totalCount: 101,
|
totalCount: 101,
|
||||||
page: 2,
|
page: 1,
|
||||||
pageSize: 100,
|
pageSize: 100,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -358,7 +358,7 @@ describe("workOrdersApi.findByWoNumber", () => {
|
||||||
const secondParams = apiGet.mock.calls[1]?.[1]?.searchParams as URLSearchParams;
|
const secondParams = apiGet.mock.calls[1]?.[1]?.searchParams as URLSearchParams;
|
||||||
expect(Object.fromEntries(secondParams)).toMatchObject({
|
expect(Object.fromEntries(secondParams)).toMatchObject({
|
||||||
search: "10000009999",
|
search: "10000009999",
|
||||||
page: "2",
|
page: "1",
|
||||||
pageSize: "100",
|
pageSize: "100",
|
||||||
});
|
});
|
||||||
expect(result).toMatchObject({ id: 999, woNumber: "10000009999" });
|
expect(result).toMatchObject({ id: 999, woNumber: "10000009999" });
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue