"use client"; import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Search, Database } from "lucide-react"; import { DataFlowAPI, TableDefinition, TableInfo } from "@/lib/api/dataflow"; interface TableSelectorProps { companyCode: string; onTableAdd: (table: TableDefinition) => void; selectedTables?: string[]; // 이미 추가된 테이블들의 이름 } export const TableSelector: React.FC = ({ companyCode, onTableAdd, selectedTables = [] }) => { const [tables, setTables] = useState([]); const [filteredTables, setFilteredTables] = useState([]); const [searchTerm, setSearchTerm] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); // 테이블 목록 로드 useEffect(() => { loadTables(); }, []); // 검색 필터링 useEffect(() => { if (searchTerm.trim() === "") { setFilteredTables(tables); } else { const filtered = tables.filter( (table) => table.tableName.toLowerCase().includes(searchTerm.toLowerCase()) || table.displayName.toLowerCase().includes(searchTerm.toLowerCase()) || (table.description && table.description.toLowerCase().includes(searchTerm.toLowerCase())), ); setFilteredTables(filtered); } }, [tables, searchTerm]); const loadTables = async () => { try { setLoading(true); setError(null); const tableList = await DataFlowAPI.getTables(); setTables(tableList); } catch (error) { console.error("테이블 목록 로드 실패:", error); setError("테이블 목록을 불러오는데 실패했습니다."); } finally { setLoading(false); } }; const handleAddTable = async (tableInfo: TableInfo) => { try { // 테이블 상세 정보 (컬럼 포함) 조회 const tableWithColumns = await DataFlowAPI.getTableWithColumns(tableInfo.tableName); if (tableWithColumns) { onTableAdd(tableWithColumns); } } catch (error) { console.error("테이블 추가 실패:", error); setError("테이블을 추가하는데 실패했습니다."); } }; const isTableSelected = (tableName: string) => { return selectedTables.includes(tableName); }; return (

테이블 선택

{/* 검색 입력 */}
setSearchTerm(e.target.value)} className="pl-10" disabled={loading} />
{/* 오류 메시지 */} {error &&
{error}
} {/* 테이블 목록 */}
{loading ? (
테이블 목록을 불러오는 중...
) : filteredTables.length === 0 ? (
{searchTerm ? "검색 결과가 없습니다." : "등록된 테이블이 없습니다."}
) : ( filteredTables.map((table) => { const isSelected = isTableSelected(table.tableName); return ( !isSelected && handleAddTable(table)} >
{table.displayName}
{table.columnCount}개 컬럼
{table.tableName} {isSelected && (추가됨)}
{table.description &&

{table.description}

}
); }) )}
{/* 통계 정보 */}
전체 테이블: {tables.length}개 {searchTerm && 검색 결과: {filteredTables.length}개}
{selectedTables.length > 0 &&
캔버스에 추가된 테이블: {selectedTables.length}개
}
); };