"use client"; import React, { useState, useEffect } from "react"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; import { Plus, X, Check, ChevronsUpDown } from "lucide-react"; import { AutocompleteSearchInputConfig } from "./types"; import { tableManagementApi } from "@/lib/api/tableManagement"; import { cn } from "@/lib/utils"; interface AutocompleteSearchInputConfigPanelProps { config: AutocompleteSearchInputConfig; onConfigChange: (config: AutocompleteSearchInputConfig) => void; } export function AutocompleteSearchInputConfigPanel({ config, onConfigChange, }: AutocompleteSearchInputConfigPanelProps) { const [localConfig, setLocalConfig] = useState(config); const [allTables, setAllTables] = useState([]); const [sourceTableColumns, setSourceTableColumns] = useState([]); const [targetTableColumns, setTargetTableColumns] = useState([]); const [isLoadingTables, setIsLoadingTables] = useState(false); const [isLoadingSourceColumns, setIsLoadingSourceColumns] = useState(false); const [isLoadingTargetColumns, setIsLoadingTargetColumns] = useState(false); const [openSourceTableCombo, setOpenSourceTableCombo] = useState(false); const [openTargetTableCombo, setOpenTargetTableCombo] = useState(false); const [openDisplayFieldCombo, setOpenDisplayFieldCombo] = useState(false); useEffect(() => { setLocalConfig(config); }, [config]); const updateConfig = (updates: Partial) => { const newConfig = { ...localConfig, ...updates }; setLocalConfig(newConfig); onConfigChange(newConfig); }; // 테이블 목록 로드 useEffect(() => { const loadTables = async () => { setIsLoadingTables(true); try { const response = await tableManagementApi.getTableList(); if (response.success && response.data) { setAllTables(response.data); } } catch (error) { setAllTables([]); } finally { setIsLoadingTables(false); } }; loadTables(); }, []); // 외부 테이블 컬럼 로드 useEffect(() => { const loadColumns = async () => { if (!localConfig.tableName) { setSourceTableColumns([]); return; } setIsLoadingSourceColumns(true); try { const response = await tableManagementApi.getColumnList(localConfig.tableName); if (response.success && response.data) { setSourceTableColumns(response.data.columns); } } catch (error) { setSourceTableColumns([]); } finally { setIsLoadingSourceColumns(false); } }; loadColumns(); }, [localConfig.tableName]); // 저장 테이블 컬럼 로드 useEffect(() => { const loadTargetColumns = async () => { if (!localConfig.targetTable) { setTargetTableColumns([]); return; } setIsLoadingTargetColumns(true); try { const response = await tableManagementApi.getColumnList(localConfig.targetTable); if (response.success && response.data) { setTargetTableColumns(response.data.columns); } } catch (error) { setTargetTableColumns([]); } finally { setIsLoadingTargetColumns(false); } }; loadTargetColumns(); }, [localConfig.targetTable]); const addFieldMapping = () => { const mappings = localConfig.fieldMappings || []; updateConfig({ fieldMappings: [...mappings, { sourceField: "", targetField: "", label: "" }], }); }; const updateFieldMapping = (index: number, updates: any) => { const mappings = [...(localConfig.fieldMappings || [])]; mappings[index] = { ...mappings[index], ...updates }; updateConfig({ fieldMappings: mappings }); }; const removeFieldMapping = (index: number) => { const mappings = [...(localConfig.fieldMappings || [])]; mappings.splice(index, 1); updateConfig({ fieldMappings: mappings }); }; return (
{/* 1. 외부 테이블 선택 */}
테이블을 찾을 수 없습니다. {allTables.map((table) => ( { updateConfig({ tableName: table.tableName }); setOpenSourceTableCombo(false); }} className="text-xs sm:text-sm" >
{table.displayName || table.tableName} {table.displayName && {table.tableName}}
))}
{/* 2. 표시 필드 선택 */}
필드를 찾을 수 없습니다. {sourceTableColumns.map((column) => ( { updateConfig({ displayField: column.columnName }); setOpenDisplayFieldCombo(false); }} className="text-xs sm:text-sm" >
{column.displayName || column.columnName} {column.displayName && {column.columnName}}
))}
{/* 3. 저장 대상 테이블 선택 */}
테이블을 찾을 수 없습니다. {allTables.map((table) => ( { updateConfig({ targetTable: table.tableName }); setOpenTargetTableCombo(false); }} className="text-xs sm:text-sm" >
{table.displayName || table.tableName} {table.displayName && {table.tableName}}
))}
{/* 4. 필드 매핑 */}
{(localConfig.fieldMappings || []).length === 0 && (

매핑 추가 버튼을 눌러 필드 매핑을 설정하세요

)}
{(localConfig.fieldMappings || []).map((mapping, index) => (
매핑 #{index + 1}
updateFieldMapping(index, { label: e.target.value }) } placeholder="예: 거래처 코드" className="h-8 text-xs sm:h-10 sm:text-sm" />
{mapping.sourceField && mapping.targetField && (

{localConfig.tableName}.{mapping.sourceField} {" → "} {localConfig.targetTable}.{mapping.targetField}

)}
))}
{/* 플레이스홀더 */}
updateConfig({ placeholder: e.target.value })} placeholder="검색..." className="h-8 text-xs sm:h-10 sm:text-sm" />
{/* 설정 요약 */} {localConfig.tableName && localConfig.targetTable && (localConfig.fieldMappings || []).length > 0 && (

설정 요약

외부 테이블: {localConfig.tableName}

표시 필드: {localConfig.displayField}

저장 테이블: {localConfig.targetTable}

매핑 개수: {(localConfig.fieldMappings || []).length}개

)}
); }