// LogQueryToolbar.tsx — 查询工具栏(统计条 + 分页 + 操作)// Logan.Li import { ArrowUpDown, Bell, Download, Copy, ChevronLeft, ChevronRight } from 'lucide-react'; import { useState } from 'react'; interface Props { total: number; queryTime?: number; status?: 'precise' | 'partial' | 'failed'; perPage: number; onPerPageChange: (n: number) => void; page: number; totalPages: number; onPageChange: (p: number) => void; sortDirection?: 'asc' | 'desc'; onSortToggle?: () => void; onExport?: () => void; onCopy?: () => void; onBellClick?: () => void; hasAlertRule?: boolean; } const STATUS_LABEL: Record = { precise: { text: '结果精确', color: '#22c55e' }, partial: { text: '部分命中', color: '#f59e0b' }, failed: { text: '查询失败', color: '#ef4444' }, }; export function LogQueryToolbar({ total, queryTime, status = 'precise', perPage, onPerPageChange, page, totalPages, onPageChange, sortDirection, onSortToggle, onExport, onCopy, onBellClick, hasAlertRule, }: Props) { const [jumpPage, setJumpPage] = useState(''); const st = STATUS_LABEL[status] || STATUS_LABEL.precise; const handleJump = () => { const p = parseInt(jumpPage, 10); if (p >= 1 && p <= totalPages) onPageChange(p); setJumpPage(''); }; return (
{/* 左侧统计 */}
日志条数: {total.toLocaleString()} {st.text} {queryTime !== undefined && ( 耗时: {queryTime}ms )}
{/* 分页 */}
总数: {total.toLocaleString()} 条 {/* 页码 */} {Array.from({ length: Math.min(5, totalPages) }, (_, i) => { let p: number; if (totalPages <= 5) p = i + 1; else if (page <= 3) p = i + 1; else if (page >= totalPages - 2) p = totalPages - 4 + i; else p = page - 2 + i; return ( ); })} {totalPages > 5 && page < totalPages - 2 && ( ... )}
到第 setJumpPage(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleJump()} className="h-7 w-10 text-center text-[11px] rounded dg-input" style={{ background: 'var(--dg-bg-tertiary)', border: '1px solid var(--dg-border)', color: 'var(--dg-text-primary)' }} /> 页
{/* 右侧操作 */}
); }