"use client"; import React, { useState } from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Database, ChevronDown, ChevronRight, Type, Hash, Calendar, CheckSquare, List, AlignLeft, Code, Building, File, Search, } from "lucide-react"; import { TableInfo, WebType } from "@/types/screen"; interface TablesPanelProps { tables: TableInfo[]; searchTerm: string; onSearchChange: (term: string) => void; onDragStart: (e: React.DragEvent, table: TableInfo, column?: any) => void; selectedTableName?: string; } // 위젯 타입별 아이콘 const getWidgetIcon = (widgetType: WebType) => { switch (widgetType) { case "text": case "email": case "tel": return ; case "number": case "decimal": return ; case "date": case "datetime": return ; case "select": case "dropdown": return ; case "textarea": case "text_area": return ; case "boolean": case "checkbox": return ; case "code": return ; case "entity": return ; case "file": return ; default: return ; } }; export const TablesPanel: React.FC = ({ tables, searchTerm, onSearchChange, onDragStart, selectedTableName, }) => { const [expandedTables, setExpandedTables] = useState>(new Set()); const toggleTable = (tableName: string) => { const newExpanded = new Set(expandedTables); if (newExpanded.has(tableName)) { newExpanded.delete(tableName); } else { newExpanded.add(tableName); } setExpandedTables(newExpanded); }; const filteredTables = tables.filter( (table) => table.tableName.toLowerCase().includes(searchTerm.toLowerCase()) || table.columns.some((col) => col.columnName.toLowerCase().includes(searchTerm.toLowerCase())), ); return (
{/* 헤더 */}
{selectedTableName && (
선택된 테이블
{selectedTableName}
)} {/* 검색 */}
onSearchChange(e.target.value)} className="border-input bg-background focus-visible:ring-ring h-8 w-full rounded-md border px-3 pl-8 text-xs focus-visible:ring-1 focus-visible:outline-none" />
총 {filteredTables.length}개
{/* 테이블 목록 */}
{filteredTables.map((table) => { const isExpanded = expandedTables.has(table.tableName); return (
{/* 테이블 헤더 */}
toggleTable(table.tableName)} >
{isExpanded ? ( ) : ( )}
{table.tableLabel || table.tableName}
{table.columns.length}개
{/* 컬럼 목록 */} {isExpanded && (
8 ? "max-h-64 overflow-y-auto" : ""}`}> {table.columns.map((column, index) => (
onDragStart(e, table, column)} >
{getWidgetIcon(column.widgetType)}
{column.columnLabel || column.columnName}
{column.dataType}
{column.widgetType} {column.required && ( 필수 )}
))} {/* 컬럼 수가 많을 때 안내 메시지 */} {table.columns.length > 8 && (
📜 총 {table.columns.length}개 컬럼 (스크롤하여 더 보기)
)}
)}
); })}
{/* 푸터 */}
💡 테이블이나 컬럼을 캔버스로 드래그하세요
); }; export default TablesPanel;