import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { Search } from 'lucide-react' import { ScrollArea } from '@/components/ui/scroll-area' import { Input } from '@/components/ui/input' interface DataPreviewTableProps { data: Record[] columns?: string[] } export function DataPreviewTable({ data, columns: propColumns }: DataPreviewTableProps) { const { t } = useTranslation('data') const [searchTerm, setSearchTerm] = useState('') // 自动获取列名(JSON 可能没有 columns) const columns = useMemo(() => { if (propColumns && propColumns.length > 0) return propColumns if (data.length === 0) return [] return Object.keys(data[0]) }, [data, propColumns]) // 过滤数据 const filteredData = useMemo(() => { if (!searchTerm) return data const term = searchTerm.toLowerCase() return data.filter(row => Object.values(row).some(value => String(value ?? '').toLowerCase().includes(term) ) ) }, [data, searchTerm]) // 格式化单元格值 const formatCellValue = (value: unknown): string => { if (value === null || value === undefined) return '-' if (typeof value === 'object') return JSON.stringify(value) return String(value) } return (
{/* 搜索栏 */}
setSearchTerm(e.target.value)} className="pl-9 h-9 text-xs font-mono" />
{/* 表格 */}
{columns.map((col) => ( ))} {filteredData.map((row, idx) => ( {columns.map((col) => ( ))} ))}
# {col}
{idx + 1} {formatCellValue(row[col])}
{/* 过滤结果提示 */} {searchTerm && (
{t('preview.showing', { filtered: filteredData.length, total: data.length })}
)}
) }