import { useId, useState, type ReactNode } from 'react'; import { Button } from '@/components/ui/Button'; import { Select } from '@/components/ui/Select'; type QueryPanelProps = { title: ReactNode; summary?: ReactNode; children: ReactNode; }; type PaginationProps = { total?: number; page?: number; totalPages?: number; previousDisabled?: boolean; nextDisabled?: boolean; onPrevious?: () => void; onNext?: () => void; onPageChange?: (page: number) => void; pageSize?: number; pageSizeOptions?: number[]; onPageSizeChange?: (pageSize: number) => void; }; type InlineTextPreviewProps = { label: ReactNode; leading?: ReactNode; children: ReactNode; }; export function QueryPanel({ title, summary, children }: QueryPanelProps) { return (

{title}

{children}
{summary ?

{summary}

: null}
); } function PaginationJump({ page, pages, onPageChange, }: { page: number; pages: number; onPageChange: (page: number) => void; }) { const [targetPage, setTargetPage] = useState(String(page)); return ( ); } export function Pagination({ total, page = 1, totalPages, previousDisabled = true, nextDisabled = true, onPrevious, onNext, onPageChange, pageSize, pageSizeOptions = [10, 25, 50, 100], onPageSizeChange, }: PaginationProps) { const pageSizeId = useId(); const pages = Math.max(1, totalPages ?? (typeof total === 'number' ? Math.ceil(total / (pageSize ?? 10)) : page)); function changePage(nextPage: number) { onPageChange?.(Math.min(pages, Math.max(1, nextPage))); } return (
{typeof total === 'number' ? 显示 {total} 条记录 : }
{typeof pageSize === 'number' && onPageSizeChange ? ( <>