From 2985e68fc23592963a4a54052dff61f64fa2442a Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Thu, 9 Oct 2025 19:14:49 +0800 Subject: [PATCH] add job order planStart --- src/app/api/jo/actions.ts | 3 +- src/app/api/jo/index.ts | 1 + src/components/JoSearch/JoCreateFormModal.tsx | 1 + src/components/JoSearch/JoSearch.tsx | 19 +++-- src/components/JoSearch/JoSearchWrapper.tsx | 2 +- src/components/SearchBox/SearchBox.tsx | 76 ++++++++++++++++++- 6 files changed, 90 insertions(+), 12 deletions(-) diff --git a/src/app/api/jo/actions.ts b/src/app/api/jo/actions.ts index 76a38d8..2957b50 100644 --- a/src/app/api/jo/actions.ts +++ b/src/app/api/jo/actions.ts @@ -22,7 +22,8 @@ export interface SaveJoResponse { export interface SearchJoResultRequest extends Pageable { code: string; itemName?: string; - + planStart?: string; + planStartTo?: string; } diff --git a/src/app/api/jo/index.ts b/src/app/api/jo/index.ts index 3a1d60b..568783b 100644 --- a/src/app/api/jo/index.ts +++ b/src/app/api/jo/index.ts @@ -25,6 +25,7 @@ export interface JobOrder { pickLines?: JoDetailPickLine[]; status: JoStatus; planStart?: number[]; + planStartTo?: string; planEnd?: number[]; type: string; // TODO pack below into StockInLineInfo diff --git a/src/components/JoSearch/JoCreateFormModal.tsx b/src/components/JoSearch/JoCreateFormModal.tsx index 96b6ad9..fe2cae6 100644 --- a/src/components/JoSearch/JoCreateFormModal.tsx +++ b/src/components/JoSearch/JoCreateFormModal.tsx @@ -181,6 +181,7 @@ const JoCreateFormModal: React.FC = ({ render={({ field, fieldState: { error } }) => ( { handleDateTimePickerChange(newValue, field.onChange) diff --git a/src/components/JoSearch/JoSearch.tsx b/src/components/JoSearch/JoSearch.tsx index 44bb8ee..9568ac3 100644 --- a/src/components/JoSearch/JoSearch.tsx +++ b/src/components/JoSearch/JoSearch.tsx @@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next"; import { Criterion } from "../SearchBox"; import SearchResults, { Column, defaultPagingController } from "../SearchResults/SearchResults"; import { EditNote } from "@mui/icons-material"; -import { arrayToDateString, integerFormatter } from "@/app/utils/formatUtil"; +import { arrayToDateString, arrayToDateTimeString, integerFormatter } from "@/app/utils/formatUtil"; import { orderBy, uniqBy, upperFirst } from "lodash"; import SearchBox from "../SearchBox/SearchBox"; import { useRouter } from "next/navigation"; @@ -31,10 +31,7 @@ interface Props { bomCombo: BomCombo[] } -type SearchQuery = Partial> & { - planStartFrom?: string; - planStartTo?: string; -}; +type SearchQuery = Partial>; type SearchParamNames = keyof SearchQuery; @@ -49,6 +46,7 @@ const JoSearch: React.FC = ({ defaultInputs, bomCombo }) => { const [totalCount, setTotalCount] = useState(0) const [isCreateJoModalOpen, setIsCreateJoModalOpen] = useState(false) + console.log(inputs) const [inventoryData, setInventoryData] = useState([]); const [detailedJos, setDetailedJos] = useState>(new Map()); @@ -138,7 +136,8 @@ const JoSearch: React.FC = ({ defaultInputs, bomCombo }) => { const searchCriteria: Criterion[] = useMemo(() => [ { label: t("Code"), paramName: "code", type: "text" }, - { label: t("Item Name"), paramName: "itemName", type: "text" }, + { label: t("Item Name"), paramName: "itemName", type: "text" }, + { label: t("Plan Start From"), label2: t("Plan Start To"), paramName: "planStart", type: "datetimeRange" }, ], [t]) const columns = useMemo[]>( @@ -194,7 +193,7 @@ const JoSearch: React.FC = ({ defaultInputs, bomCombo }) => { align: "left", headerAlign: "left", renderCell: (row) => { - return row.planStart ? arrayToDateString(row.planStart, "output") : '-' + return row.planStart ? arrayToDateTimeString(row.planStart) : '-' } }, { @@ -273,6 +272,8 @@ const JoSearch: React.FC = ({ defaultInputs, bomCombo }) => { const params: SearchJoResultRequest = { code: query.code, itemName: query.itemName, + planStart: query.planStart, + planStartTo: query.planStartTo, pageNum: pagingController.pageNum - 1, pageSize: pagingController.pageSize, } @@ -364,7 +365,9 @@ const JoSearch: React.FC = ({ defaultInputs, bomCombo }) => { const onSearch = useCallback((query: Record) => { setInputs(() => ({ code: query.code, - itemName: query.itemName + itemName: query.itemName, + planStart: query.planStart, + planStartTo: query.planStartTo })) refetchData(query, "search"); }, []) diff --git a/src/components/JoSearch/JoSearchWrapper.tsx b/src/components/JoSearch/JoSearchWrapper.tsx index b44345c..7972d56 100644 --- a/src/components/JoSearch/JoSearchWrapper.tsx +++ b/src/components/JoSearch/JoSearchWrapper.tsx @@ -11,7 +11,7 @@ interface SubComponents { const JoSearchWrapper: React.FC & SubComponents = async () => { const defaultInputs: SearchJoResultRequest = { code: "", - name: "", + itemName: "", } const [ diff --git a/src/components/SearchBox/SearchBox.tsx b/src/components/SearchBox/SearchBox.tsx index a6a1ff1..233e363 100644 --- a/src/components/SearchBox/SearchBox.tsx +++ b/src/components/SearchBox/SearchBox.tsx @@ -15,7 +15,7 @@ import CardActions from "@mui/material/CardActions"; import Button from "@mui/material/Button"; import RestartAlt from "@mui/icons-material/RestartAlt"; import Search from "@mui/icons-material/Search"; -import dayjs from "dayjs"; +import dayjs, { Dayjs } from "dayjs"; import "dayjs/locale/zh-hk"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; @@ -29,6 +29,8 @@ import { } from "@mui/material"; import MultiSelect from "@/components/SearchBox/MultiSelect"; import { intersectionWith } from "lodash"; +import { INPUT_DATE_FORMAT, INPUT_TIME_FORMAT, OUTPUT_DATE_FORMAT, OUTPUT_TIME_FORMAT, dayjsToDateTimeString } from "@/app/utils/formatUtil"; +import { DateTimePicker } from "@mui/x-date-pickers"; interface BaseCriterion { label: string; @@ -86,6 +88,10 @@ interface DateRangeCriterion extends BaseCriterion { type: "dateRange"; } +interface DatetimeRangeCriterion extends BaseCriterion { + type: "datetimeRange"; +} + interface DateCriterion extends BaseCriterion { type: "date"; } @@ -95,6 +101,7 @@ export type Criterion = | SelectCriterion | SelectWithLabelCriterion | DateRangeCriterion + | DatetimeRangeCriterion | DateCriterion | MultiSelectCriterion | AutocompleteCriterion; @@ -135,7 +142,7 @@ function SearchBox({ : "", }; - if (c.type === "dateRange") { + if (c.type === "dateRange" || c.type === "datetimeRange") { tempCriteria = { ...tempCriteria, [c.paramName]: c.defaultValue ?? "", @@ -216,6 +223,24 @@ function SearchBox({ }; }, []); + const makeDatetimeChangeHandler = useCallback((paramName: T) => { + return (value: Dayjs | null) => { + setInputs((i) => ({ + ...i, + [paramName]: value ? dayjsToDateTimeString(value) : null + })); + }; + }, []); + + const makeDatetimeToChangeHandler = useCallback((paramName: T) => { + return (value: Dayjs | null) => { + setInputs((i) => ({ + ...i, + [paramName + "To"]: value ? dayjsToDateTimeString(value) : null + })); + }; + }, []); + const handleReset = () => { setInputs(defaultInputs); onReset?.(); @@ -397,6 +422,7 @@ function SearchBox({ ({ ({ )} + {c.type === "datetimeRange" && ( + + + + + + + {"-"} + + + + + + + )} {c.type === "date" && ( ({