"use client"; import React from "react"; import { Badge } from "@/components/ui/badge"; import { Database, Type, Hash, Calendar, CheckSquare, List, AlignLeft, Code, Building, File } 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; placedColumns?: Set; // 이미 배치된 컬럼명 집합 (tableName.columnName 형식) } // 위젯 타입별 아이콘 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, onDragStart, placedColumns = new Set(), }) => { // 이미 배치된 컬럼을 제외한 테이블 정보 생성 const tablesWithAvailableColumns = tables.map((table) => ({ ...table, columns: table.columns.filter((col) => { const columnKey = `${table.tableName}.${col.columnName}`; return !placedColumns.has(columnKey); }), })); // 검색어가 있으면 컬럼 필터링 const filteredTables = tablesWithAvailableColumns .map((table) => { if (!searchTerm) { return table; } const searchLower = searchTerm.toLowerCase(); // 테이블명이 검색어와 일치하면 모든 컬럼 표시 if ( table.tableName.toLowerCase().includes(searchLower) || (table.tableLabel && table.tableLabel.toLowerCase().includes(searchLower)) ) { return table; } // 그렇지 않으면 컬럼명/라벨이 검색어와 일치하는 컬럼만 필터링 const filteredColumns = table.columns.filter( (col) => col.columnName.toLowerCase().includes(searchLower) || (col.columnLabel && col.columnLabel.toLowerCase().includes(searchLower)), ); return { ...table, columns: filteredColumns, }; }) .filter((table) => table.columns.length > 0); // 컬럼이 있는 테이블만 표시 return (
{/* 테이블과 컬럼 평면 목록 */}
{filteredTables.map((table) => (
{/* 테이블 헤더 */}
{table.tableLabel || table.tableName} {table.columns.length}개
{/* 컬럼 목록 (항상 표시) */}
{table.columns.map((column) => (
onDragStart(e, table, column)} >
{getWidgetIcon(column.widgetType)}
{column.columnLabel || column.columnName}
{column.dataType}
{column.widgetType} {column.required && ( 필수 )}
))}
))}
); }; export default TablesPanel;