"use client"; import React, { useState, useEffect } from "react"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { Trash2 } from "lucide-react"; import { RepeaterColumnConfig } from "./types"; import { cn } from "@/lib/utils"; interface RepeaterTableProps { columns: RepeaterColumnConfig[]; data: any[]; onDataChange: (newData: any[]) => void; onRowChange: (index: number, newRow: any) => void; onRowDelete: (index: number) => void; } export function RepeaterTable({ columns, data, onDataChange, onRowChange, onRowDelete, }: RepeaterTableProps) { const [editingCell, setEditingCell] = useState<{ rowIndex: number; field: string; } | null>(null); // 데이터 변경 감지 (필요시 활성화) // useEffect(() => { // console.log("📊 RepeaterTable 데이터 업데이트:", data.length, "개 행"); // }, [data]); const handleCellEdit = (rowIndex: number, field: string, value: any) => { const newRow = { ...data[rowIndex], [field]: value }; onRowChange(rowIndex, newRow); }; const renderCell = ( row: any, column: RepeaterColumnConfig, rowIndex: number ) => { const isEditing = editingCell?.rowIndex === rowIndex && editingCell?.field === column.field; const value = row[column.field]; // 계산 필드는 편집 불가 if (column.calculated || !column.editable) { return (
{column.type === "number" ? typeof value === "number" ? value.toLocaleString() : value || "0" : value || "-"}
); } // 편집 가능한 필드 switch (column.type) { case "number": return ( handleCellEdit(rowIndex, column.field, parseFloat(e.target.value) || 0) } className="h-7 text-xs" /> ); case "date": // ISO 형식(2025-11-23T00:00:00.000Z)을 yyyy-mm-dd로 변환 const formatDateValue = (val: any): string => { if (!val) return ""; // 이미 yyyy-mm-dd 형식이면 그대로 반환 if (typeof val === "string" && /^\d{4}-\d{2}-\d{2}$/.test(val)) { return val; } // ISO 형식이면 날짜 부분만 추출 if (typeof val === "string" && val.includes("T")) { return val.split("T")[0]; } // Date 객체이면 변환 if (val instanceof Date) { return val.toISOString().split("T")[0]; } return String(val); }; return ( handleCellEdit(rowIndex, column.field, e.target.value)} className="h-7 text-xs" /> ); case "select": return ( ); default: // text return ( handleCellEdit(rowIndex, column.field, e.target.value)} className="h-7 text-xs" /> ); } }; return (
{columns.map((col) => ( ))} {data.length === 0 ? ( ) : ( data.map((row, rowIndex) => ( {columns.map((col) => ( ))} )) )}
# {col.label} {col.required && *} 삭제
추가된 항목이 없습니다
{rowIndex + 1} {renderCell(row, col, rowIndex)}
); }