// File: components/custom/responsive-data-table.tsx import React from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { cn } from "@/lib/utils"; /** * Interface สำหรับ Column Definition */ export interface ColumnDef { key: string; header: string; /** ฟังก์ชันสำหรับ render cell content (optional) */ cell?: (item: T) => React.ReactNode; /** คลาส CSS เพิ่มเติมสำหรับ cell */ className?: string; } /** * Props สำหรับ ResponsiveDataTable */ interface ResponsiveDataTableProps { /** ข้อมูลที่จะแสดงในตาราง */ data: T[]; /** นิยามของคอลัมน์ */ columns: ColumnDef[]; /** Key ที่เป็น Unique ID ของข้อมูล (เช่น 'id', 'user_id') */ keyExtractor: (item: T) => string | number; /** ฟังก์ชันสำหรับ Render Card View บน Mobile (ถ้าไม่ใส่จะ Render แบบ Default Key-Value) */ renderMobileCard?: (item: T) => React.ReactNode; /** ข้อความเมื่อไม่มีข้อมูล */ emptyMessage?: string; /** คลาส CSS เพิ่มเติมสำหรับ Container */ className?: string; } /** * ResponsiveDataTable Component * * แสดงผลเป็น Table ปกติในหน้าจอขนาด md ขึ้นไป * และแสดงผลเป็น Card List ในหน้าจอขนาดเล็กกว่า md */ export function ResponsiveDataTable({ data, columns, keyExtractor, renderMobileCard, emptyMessage = "ไม่พบข้อมูล", className, }: ResponsiveDataTableProps) { if (!data || data.length === 0) { return (
{emptyMessage}
); } return (
{/* --- Desktop View (Table) --- */}
{columns.map((col) => ( {col.header} ))} {data.map((item) => ( {columns.map((col) => ( {col.cell ? col.cell(item) : (item as any)[col.key]} ))} ))}
{/* --- Mobile View (Cards) --- */}
{data.map((item) => (
{renderMobileCard ? ( // Custom Mobile Render renderMobileCard(item) ) : ( // Default Mobile Render (Key-Value Pairs) # {keyExtractor(item)} {columns.map((col) => (
{col.header}: {col.cell ? col.cell(item) : (item as any)[col.key]}
))}
)}
))}
); }