Просмотр исходного кода

proudctionprocesslist efficnet import and tab 0 no limit date

MergeProblem1
CANCERYS\kw093 6 часов назад
Родитель
Сommit
5eb62bffe0
2 измененных файлов: 30 добавлений и 24 удалений
  1. +29
    -24
      src/components/ProductionProcess/ProductionProcessList.tsx
  2. +1
    -0
      src/components/ProductionProcess/ProductionProcessPage.tsx

+ 29
- 24
src/components/ProductionProcess/ProductionProcessList.tsx Просмотреть файл

@@ -63,6 +63,7 @@ interface ProductProcessListProps {
includePutaway?: boolean | null; includePutaway?: boolean | null;
/** all | completed | notCompleted */ /** all | completed | notCompleted */
putawayStatus?: string | null; putawayStatus?: string | null;
disableDateFilter?: boolean;
listPersistedState: ProductionProcessListPersistedState; listPersistedState: ProductionProcessListPersistedState;
onListPersistedStateChange: React.Dispatch< onListPersistedStateChange: React.Dispatch<
React.SetStateAction<ProductionProcessListPersistedState> React.SetStateAction<ProductionProcessListPersistedState>
@@ -98,6 +99,7 @@ const ProductProcessList: React.FC<ProductProcessListProps> = ({
qcReady, qcReady,
includePutaway, includePutaway,
putawayStatus, putawayStatus,
disableDateFilter = false,
listPersistedState, listPersistedState,
onListPersistedStateChange, onListPersistedStateChange,
}) => { }) => {
@@ -225,33 +227,30 @@ const ProductProcessList: React.FC<ProductProcessListProps> = ({
const handleApplySearch = useCallback( const handleApplySearch = useCallback(
(inputs: Record<SearchParam | `${SearchParam}To`, string>) => { (inputs: Record<SearchParam | `${SearchParam}To`, string>) => {
const selectedProcessType = (inputs.processType || "all") as ProcessFilter; const selectedProcessType = (inputs.processType || "all") as ProcessFilter;
const fallback = defaultPlanStartRange();
const selectedDate = (inputs.date || "").trim() || fallback.from;
onListPersistedStateChange((prev) => ({ onListPersistedStateChange((prev) => ({
...prev, ...prev,
filter: selectedProcessType, filter: selectedProcessType,
date: selectedDate,
date: disableDateFilter ? "" : (inputs.date || "").trim(),
itemCode: inputs.itemCode?.trim() ? inputs.itemCode.trim() : null, itemCode: inputs.itemCode?.trim() ? inputs.itemCode.trim() : null,
jobOrderCode: inputs.jobOrderCode?.trim() ? inputs.jobOrderCode.trim() : null, jobOrderCode: inputs.jobOrderCode?.trim() ? inputs.jobOrderCode.trim() : null,
selectedItemCodes: [], selectedItemCodes: [],
page: 0, page: 0,
})); }));
}, },
[onListPersistedStateChange],
[disableDateFilter, onListPersistedStateChange],
); );


const handleResetSearch = useCallback(() => { const handleResetSearch = useCallback(() => {
const r = defaultPlanStartRange();
onListPersistedStateChange((prev) => ({ onListPersistedStateChange((prev) => ({
...prev, ...prev,
filter: "all", filter: "all",
date: r.from,
date: disableDateFilter ? "" : defaultPlanStartRange().from,
itemCode: null, itemCode: null,
jobOrderCode: null, jobOrderCode: null,
selectedItemCodes: [], selectedItemCodes: [],
page: 0, page: 0,
})); }));
}, [onListPersistedStateChange]);
}, [disableDateFilter, onListPersistedStateChange]);


const fetchProcesses = useCallback(async () => { const fetchProcesses = useCallback(async () => {
setLoading(true); setLoading(true);
@@ -259,7 +258,7 @@ const ProductProcessList: React.FC<ProductProcessListProps> = ({
const typeParam = filter === "all" ? undefined : filter; const typeParam = filter === "all" ? undefined : filter;


const data = await fetchJoborderProductProcessesPage({ const data = await fetchJoborderProductProcessesPage({
date: appliedSearch.date,
date: disableDateFilter ? undefined : appliedSearch.date,
itemCode: appliedSearch.itemCode, itemCode: appliedSearch.itemCode,
jobOrderCode: appliedSearch.jobOrderCode, jobOrderCode: appliedSearch.jobOrderCode,
qcReady, qcReady,
@@ -279,7 +278,7 @@ const ProductProcessList: React.FC<ProductProcessListProps> = ({
} finally { } finally {
setLoading(false); setLoading(false);
} }
}, [listPersistedState, qcReady, includePutaway, putawayStatus]);
}, [appliedSearch, disableDateFilter, filter, qcReady, includePutaway, putawayStatus, page]);


useEffect(() => { useEffect(() => {
fetchProcesses(); fetchProcesses();
@@ -370,15 +369,16 @@ const ProductProcessList: React.FC<ProductProcessListProps> = ({


/** Reset 用 ±3 天;preFilled 用目前已套用的條件(與列表查詢一致) */ /** Reset 用 ±3 天;preFilled 用目前已套用的條件(與列表查詢一致) */
const searchCriteria: Criterion<SearchParam>[] = useMemo(() => { const searchCriteria: Criterion<SearchParam>[] = useMemo(() => {
const r = defaultPlanStartRange();
return [
{
const base: Criterion<SearchParam>[] = [
...(disableDateFilter
? []
: [{
type: "date", type: "date",
label: t("Search date"), label: t("Search date"),
paramName: "date", paramName: "date",
defaultValue: appliedSearch.date, defaultValue: appliedSearch.date,
preFilledValue: appliedSearch.date, preFilledValue: appliedSearch.date,
},
} as Criterion<SearchParam>]),
{ {
type: "text", type: "text",
label: "Item Code", label: "Item Code",
@@ -399,18 +399,19 @@ const ProductProcessList: React.FC<ProductProcessListProps> = ({
preFilledValue: filter, preFilledValue: filter,
}, },
]; ];
}, [appliedSearch, filter, t]);
return base;
}, [appliedSearch, disableDateFilter, filter, t]);


/** SearchBox 內部 state 只在掛載時讀 preFilled;套用搜尋後需 remount 才會與 appliedSearch 一致 */ /** SearchBox 內部 state 只在掛載時讀 preFilled;套用搜尋後需 remount 才會與 appliedSearch 一致 */
const searchBoxKey = useMemo( const searchBoxKey = useMemo(
() => () =>
[ [
appliedSearch.date,
disableDateFilter ? "" : appliedSearch.date,
appliedSearch.itemCode ?? "", appliedSearch.itemCode ?? "",
appliedSearch.jobOrderCode ?? "", appliedSearch.jobOrderCode ?? "",
filter, filter,
].join("|"), ].join("|"),
[appliedSearch, filter],
[appliedSearch, disableDateFilter, filter],
); );


const handleSelectedItemCodesChange = useCallback( const handleSelectedItemCodesChange = useCallback(
@@ -458,14 +459,18 @@ const ProductProcessList: React.FC<ProductProcessListProps> = ({
} }
/> />
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}> <Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
{t("Search date") /* 或在 zh/common.json 加鍵,例如「搜尋日期」 */}:{" "}
{appliedSearch.date && dayjs(appliedSearch.date).isValid()
? dayjs(appliedSearch.date).format(OUTPUT_DATE_FORMAT)
: "-"}
{" | "}
{t("Total job orders")}: {totalJobOrders}
{selectedItemCodes.length > 0 ? ` | ${t("Filtered")}: ${paged.length}` : ""}
</Typography>
{!disableDateFilter && (
<>
{t("Search date")}:{" "}
{appliedSearch.date && dayjs(appliedSearch.date).isValid()
? dayjs(appliedSearch.date).format(OUTPUT_DATE_FORMAT)
: "-"}
{" | "}
</>
)}
{t("Total job orders")}: {totalJobOrders}
{selectedItemCodes.length > 0 ? ` | ${t("Filtered")}: ${paged.length}` : ""}
</Typography>


<Grid container spacing={2}> <Grid container spacing={2}>
{paged.map((process) => { {paged.map((process) => {


+ 1
- 0
src/components/ProductionProcess/ProductionProcessPage.tsx Просмотреть файл

@@ -213,6 +213,7 @@ const ProductionProcessPage: React.FC<ProductionProcessPageProps> = ({ printerCo
<ProductionProcessList <ProductionProcessList
printerCombo={printerCombo} printerCombo={printerCombo}
qcReady={false} qcReady={false}
disableDateFilter={true}
listPersistedState={productionListState} listPersistedState={productionListState}
onListPersistedStateChange={setProductionListState} onListPersistedStateChange={setProductionListState}
onSelectProcess={(jobOrderId) => { onSelectProcess={(jobOrderId) => {


Загрузка…
Отмена
Сохранить