/** * CardView - DataView의 카드 뷰 * - 카드 그리드 레이아웃 * - Phase A: 기본 카드 렌더링만 구현 */ "use client"; import React from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { cn } from "@/lib/utils"; interface CardViewProps { data: any[]; columns: string[]; tableName: string; loading?: boolean; onCardClick?: (row: any) => void; } export function CardView({ data, columns, tableName, loading = false, onCardClick }: CardViewProps) { // 로딩 스켈레톤 if (loading) { return (
{Array.from({ length: 6 }).map((_, i) => ( ))}
); } // 데이터 없음 if (data.length === 0) { return (
데이터가 없습니다

아직 등록된 항목이 없습니다

); } return (
{data.map((row, index) => { const rowId = row.id || String(index); const titleColumn = columns[0]; // 첫 번째 컬럼을 제목으로 사용 return ( onCardClick?.(row)} > {row[titleColumn] || "(제목 없음)"} {columns.slice(1).map((column) => (
{column}: {formatValue(row[column])}
))}
); })}
); } // 값 포맷팅 function formatValue(value: any): string { if (value === null || value === undefined) { return "-"; } if (typeof value === "boolean") { return value ? "O" : "X"; } if (value instanceof Date) { return value.toLocaleDateString("ko-KR"); } if (typeof value === "object") { return JSON.stringify(value); } return String(value); }