From 69e489cd45e4a437be745d02c1e970881eb35928 Mon Sep 17 00:00:00 2001 From: zhangheng Date: Wed, 8 Apr 2026 16:41:13 +0800 Subject: [PATCH] feat(table): custom pagesize --- app/project/detail/TaskTableContainer.tsx | 104 +++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/app/project/detail/TaskTableContainer.tsx b/app/project/detail/TaskTableContainer.tsx index b1256e0..096744d 100644 --- a/app/project/detail/TaskTableContainer.tsx +++ b/app/project/detail/TaskTableContainer.tsx @@ -24,6 +24,7 @@ import { Collapse, Flex, Group, + Modal, MultiSelect, Select, SimpleGrid, @@ -73,6 +74,8 @@ function createInitialFilters(): FilterFormRecord { } } +const DEFAULT_RECORDS_PER_PAGE_OPTIONS = [10, 15, 20] + export interface selectedDataProps { status: number uid: number | null @@ -148,6 +151,12 @@ export default function TaskTableContainer(props: { const [pageNumber, setPageNumber] = useState(1) const [pageSize, setPageSize] = useState(15) + const [recordsPerPageOptions, setRecordsPerPageOptions] = useState( + () => [...DEFAULT_RECORDS_PER_PAGE_OPTIONS] + ) + const [customPageSizeInput, setCustomPageSizeInput] = useState("") + const [customPageSizeModalOpened, setCustomPageSizeModalOpened] = + useState(false) const [searchExpanded, setSearchExpanded] = useState(false) @@ -259,6 +268,53 @@ export default function TaskTableContainer(props: { }) }, []) + const openCustomPageSizeModal = useCallback(() => { + setCustomPageSizeModalOpened(true) + }, []) + + const closeCustomPageSizeModal = useCallback(() => { + setCustomPageSizeModalOpened(false) + setCustomPageSizeInput("") + }, []) + + const handleAddCustomPageSize = useCallback(() => { + const rawValue = customPageSizeInput.trim() + if (!rawValue) return + const size = Number(rawValue) + if (!Number.isInteger(size) || size <= 0) { + notifications.show({ + color: "red", + title: "输入无效", + message: "请填写大于 0 的整数条数", + }) + return + } + if (recordsPerPageOptions.includes(size)) { + notifications.show({ + color: "blue", + title: "已存在", + message: `每页 ${size} 条已在可选项中`, + }) + return + } + setRecordsPerPageOptions((prev) => [...prev, size].sort((a, b) => a - b)) + closeCustomPageSizeModal() + notifications.show({ + color: "green", + title: "添加成功", + message: `已新增每页 ${size} 条`, + }) + }, [closeCustomPageSizeModal, customPageSizeInput, recordsPerPageOptions]) + + const handleCustomPageSizeEnter = useCallback( + (event: React.KeyboardEvent) => { + if (event.key !== "Enter") return + event.preventDefault() + handleAddCustomPageSize() + }, + [handleAddCustomPageSize] + ) + const clickDispatchTask = () => { if (!selectedRecords.length) { notifications.show({ @@ -992,12 +1048,58 @@ export default function TaskTableContainer(props: { }} selectedRecords={selectedRecords} onSelectedRecordsChange={setSelectedRecords} - recordsPerPageOptions={[10, 15, 20]} + recordsPerPageOptions={recordsPerPageOptions} + renderPagination={({ Controls }) => ( + + + + + + + + + )} /> + + + + setCustomPageSizeInput(event.currentTarget.value) + } + onKeyDown={handleCustomPageSizeEnter} + /> + + + + + + +