/** * 数据表格族:DataTable / MobileCardList / ResponsiveTable。 * 原位于 admin/components.tsx。 * * ResponsiveTable 按断点二选一渲染:桌面表格 / 移动卡片。 */ import type { ReactNode } from 'react' import { EmptyState } from './Feedback' // eslint-disable-next-line @typescript-eslint/no-explicit-any export function DataTable({ columns, data, rowKey, emptyText = '暂无数据', }: { columns: { key: string; label: string; render?: (row: T) => ReactNode; width?: string }[] data: T[] rowKey: (row: T) => string | number emptyText?: string }) { if (data.length === 0) { return } return (
{columns.map(col => ( ))} {data.map(row => ( {columns.map(col => ( ))} ))}
{col.label}
{col.render ? col.render(row) : row != null && typeof row === 'object' && col.key in row ? String((row as Record)[col.key] ?? '—') : '—'}
) } // ── 移动端卡片列表 (替代桌面端表格) ──────────────────────────── // eslint-disable-next-line @typescript-eslint/no-explicit-any export function MobileCardList({ data, renderCard, emptyText = '暂无数据', }: { data: T[] renderCard: (row: T, index: number) => ReactNode emptyText?: string }) { if (data.length === 0) { return } return (
{data.map((row, idx) => (
{renderCard(row, idx)}
))}
) } // ── 响应式表格容器 ────────────────────────────────────────────── // eslint-disable-next-line @typescript-eslint/no-explicit-any export function ResponsiveTable({ columns, data, rowKey, cardRender, emptyText = '暂无数据', }: { columns: { key: string; label: string; render?: (row: T) => ReactNode; width?: string }[] data: T[] rowKey: (row: T) => string | number cardRender: (row: T, index: number) => ReactNode emptyText?: string }) { if (data.length === 0) { return } return ( <> {/* 桌面端表格 */}
{/* 移动端卡片 */} ) }