|
|
|
@@ -1,7 +1,7 @@ |
|
|
|
"use client"; |
|
|
|
|
|
|
|
import SearchBox, { Criterion } from "../SearchBox"; |
|
|
|
import { useCallback, useMemo, useState, useEffect, useRef } from "react"; |
|
|
|
import { useCallback, useMemo, useState, useRef, useEffect } from "react"; |
|
|
|
import { useTranslation } from "react-i18next"; |
|
|
|
import SearchResults, { Column } from "../SearchResults/index"; |
|
|
|
import { StockTransactionResponse, SearchStockTransactionRequest } from "@/app/api/stockTake/actions"; |
|
|
|
@@ -38,10 +38,7 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => { |
|
|
|
const [filterArgs, setFilterArgs] = useState<Record<string, any>>({}); |
|
|
|
const isInitialMount = useRef(true); |
|
|
|
const [searchTrigger, setSearchTrigger] = useState(0); |
|
|
|
// 添加分页状态 |
|
|
|
const [page, setPage] = useState(0); |
|
|
|
const [pageSize, setPageSize] = useState<number | string>(10); |
|
|
|
const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 100 }); |
|
|
|
const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 10 }); |
|
|
|
const [hasSearchQuery, setHasSearchQuery] = useState(false); |
|
|
|
const [totalCount, setTotalCount] = useState(initialDataList.length); |
|
|
|
|
|
|
|
@@ -128,21 +125,7 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => { |
|
|
|
|
|
|
|
return processed; |
|
|
|
}, [dataList]); |
|
|
|
// 修复:使用 processedData 初始化 filteredList |
|
|
|
const [filteredList, setFilteredList] = useState<ExtendedStockTransaction[]>(processedData); |
|
|
|
|
|
|
|
// 当 processedData 变化时更新 filteredList(不更新 pagingController,避免循环) |
|
|
|
useEffect(() => { |
|
|
|
setFilteredList(processedData); |
|
|
|
|
|
|
|
// 只在初始加载时设置 pageSize |
|
|
|
if (isInitialMount.current && processedData.length > 0) { |
|
|
|
setPageSize("all"); |
|
|
|
setPagingController(prev => ({ ...prev, pageSize: processedData.length })); |
|
|
|
setPage(0); |
|
|
|
isInitialMount.current = false; |
|
|
|
} |
|
|
|
}, [processedData]); |
|
|
|
const filteredList = processedData; |
|
|
|
|
|
|
|
// API 调用函数(参考 PoSearch 的实现) |
|
|
|
// API 调用函数(参考 PoSearch 的实现) |
|
|
|
@@ -172,7 +155,7 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => { |
|
|
|
startDate: filterArgs.startDate || null, |
|
|
|
endDate: filterArgs.endDate || null, |
|
|
|
pageNum: pagingController.pageNum - 1 || 0, |
|
|
|
pageSize: pagingController.pageSize || 100, |
|
|
|
pageSize: pagingController.pageSize || 10, |
|
|
|
}; |
|
|
|
|
|
|
|
const res = await searchStockTransactions(params); |
|
|
|
@@ -230,24 +213,6 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => { |
|
|
|
} |
|
|
|
}, [newPageFetch, pagingController, filterArgs, searchTrigger]); |
|
|
|
|
|
|
|
// 分页处理函数 |
|
|
|
const handleChangePage = useCallback((event: unknown, newPage: number) => { |
|
|
|
setPage(newPage); |
|
|
|
setPagingController(prev => ({ ...prev, pageNum: newPage + 1 })); |
|
|
|
}, []); |
|
|
|
|
|
|
|
const handleChangeRowsPerPage = useCallback((event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => { |
|
|
|
const newSize = parseInt(event.target.value, 10); |
|
|
|
if (newSize === -1) { |
|
|
|
setPageSize("all"); |
|
|
|
setPagingController(prev => ({ ...prev, pageSize: 100, pageNum: 1 })); // 用 100 觸發後端回傳全部 |
|
|
|
} else if (!isNaN(newSize)) { |
|
|
|
setPageSize(newSize); |
|
|
|
setPagingController(prev => ({ ...prev, pageSize: newSize, pageNum: 1 })); |
|
|
|
} |
|
|
|
setPage(0); |
|
|
|
}, []); |
|
|
|
|
|
|
|
const searchCriteria: Criterion<string>[] = useMemo( |
|
|
|
() => [ |
|
|
|
{ |
|
|
|
@@ -313,6 +278,12 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => { |
|
|
|
</Box> |
|
|
|
), |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "uomDesc" as keyof ExtendedStockTransaction, |
|
|
|
label: t("UOM"), |
|
|
|
align: "left", |
|
|
|
renderCell: (item) => <>{item.uomDesc || "-"}</>, |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "inQty" as keyof ExtendedStockTransaction, |
|
|
|
label: t("In Qty"), |
|
|
|
@@ -387,7 +358,6 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => { |
|
|
|
}); |
|
|
|
setSearchTrigger(prev => prev + 1); |
|
|
|
// 重置分页 |
|
|
|
setPage(0); |
|
|
|
setPagingController(prev => ({ ...prev, pageNum: 1 })); |
|
|
|
}, []); |
|
|
|
|
|
|
|
@@ -395,31 +365,9 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => { |
|
|
|
setHasSearchQuery(false); |
|
|
|
// 重置 filterArgs,触发 useEffect 调用 API |
|
|
|
setFilterArgs({}); |
|
|
|
setPage(0); |
|
|
|
setPagingController(prev => ({ ...prev, pageNum: 1 })); |
|
|
|
}, []); |
|
|
|
|
|
|
|
const paginatedItems = useMemo(() => { |
|
|
|
if (pageSize === "all") { |
|
|
|
return filteredList; |
|
|
|
} |
|
|
|
const size = typeof pageSize === 'number' ? pageSize : 10; |
|
|
|
const start = page * size; |
|
|
|
return filteredList.slice(start, start + size); |
|
|
|
}, [filteredList, pageSize, page]); |
|
|
|
|
|
|
|
// 计算传递给 SearchResults 的 pageSize(确保在选项中) |
|
|
|
const actualPageSizeForTable = useMemo(() => { |
|
|
|
if (pageSize === "all") { |
|
|
|
return totalCount > 0 ? totalCount : filteredList.length; |
|
|
|
} |
|
|
|
const size = typeof pageSize === 'number' ? pageSize : 10; |
|
|
|
if (![10, 25, 100].includes(size)) { |
|
|
|
return size; |
|
|
|
} |
|
|
|
return size; |
|
|
|
}, [pageSize, filteredList.length, totalCount]); |
|
|
|
|
|
|
|
return ( |
|
|
|
<> |
|
|
|
<SearchBox |
|
|
|
@@ -429,9 +377,9 @@ const SearchPage: React.FC<Props> = ({ dataList: initialDataList }) => { |
|
|
|
/> |
|
|
|
{loading && <Box sx={{ p: 2 }}>{t("Loading...")}</Box>} |
|
|
|
<SearchResults<ExtendedStockTransaction> |
|
|
|
items={paginatedItems} |
|
|
|
items={filteredList} |
|
|
|
columns={columns} |
|
|
|
pagingController={{ ...pagingController, pageSize: actualPageSizeForTable }} |
|
|
|
pagingController={pagingController} |
|
|
|
setPagingController={setPagingController} |
|
|
|
totalCount={totalCount} |
|
|
|
isAutoPaging={false} |
|
|
|
|