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 ? (
<>
);
}
export function InlineTextPreview({ label, leading, children }: InlineTextPreviewProps) {
return (
{label}
{leading}
{children}
);
}