/**
* 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);
}