"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 { Switch } from "@/components/ui/switch"; import { Plus, X, Check, ChevronsUpDown } from "lucide-react"; import { ModalRepeaterTableProps } from "./types"; import { tableManagementApi } from "@/lib/api/tableManagement"; import { cn } from "@/lib/utils"; interface ModalRepeaterTableConfigPanelProps { config: Partial; onConfigChange: (config: Partial) => void; } export function ModalRepeaterTableConfigPanel({ config, onConfigChange, }: ModalRepeaterTableConfigPanelProps) { const [localConfig, setLocalConfig] = useState(config); const [allTables, setAllTables] = useState([]); const [tableColumns, setTableColumns] = useState([]); const [isLoadingTables, setIsLoadingTables] = useState(false); const [isLoadingColumns, setIsLoadingColumns] = useState(false); const [openTableCombo, setOpenTableCombo] = useState(false); const [openUniqueFieldCombo, setOpenUniqueFieldCombo] = useState(false); // 전체 테이블 목록 로드 useEffect(() => { const loadTables = async () => { setIsLoadingTables(true); try { const response = await tableManagementApi.getTableList(); if (response.success && response.data) { setAllTables(response.data); } } catch (error) { console.error("테이블 목록 로드 실패:", error); } finally { setIsLoadingTables(false); } }; loadTables(); }, []); // 선택된 테이블의 컬럼 목록 로드 useEffect(() => { const loadColumns = async () => { if (!localConfig.sourceTable) { setTableColumns([]); return; } setIsLoadingColumns(true); try { const response = await tableManagementApi.getColumnList(localConfig.sourceTable); if (response.success && response.data) { setTableColumns(response.data.columns); } } catch (error) { console.error("컬럼 목록 로드 실패:", error); setTableColumns([]); } finally { setIsLoadingColumns(false); } }; loadColumns(); }, [localConfig.sourceTable]); useEffect(() => { setLocalConfig(config); }, [config]); const updateConfig = (updates: Partial) => { const newConfig = { ...localConfig, ...updates }; setLocalConfig(newConfig); onConfigChange(newConfig); }; const addSourceColumn = () => { const columns = localConfig.sourceColumns || []; updateConfig({ sourceColumns: [...columns, ""] }); }; const updateSourceColumn = (index: number, value: string) => { const columns = [...(localConfig.sourceColumns || [])]; columns[index] = value; updateConfig({ sourceColumns: columns }); }; const removeSourceColumn = (index: number) => { const columns = [...(localConfig.sourceColumns || [])]; columns.splice(index, 1); updateConfig({ sourceColumns: columns }); }; const addSearchField = () => { const fields = localConfig.sourceSearchFields || []; updateConfig({ sourceSearchFields: [...fields, ""] }); }; const updateSearchField = (index: number, value: string) => { const fields = [...(localConfig.sourceSearchFields || [])]; fields[index] = value; updateConfig({ sourceSearchFields: fields }); }; const removeSearchField = (index: number) => { const fields = [...(localConfig.sourceSearchFields || [])]; fields.splice(index, 1); updateConfig({ sourceSearchFields: fields }); }; return (
테이블을 찾을 수 없습니다. {allTables.map((table) => ( { updateConfig({ sourceTable: table.tableName }); setOpenTableCombo(false); }} className="text-xs sm:text-sm" >
{table.displayName || table.tableName} {table.displayName && {table.tableName}}
))}
updateConfig({ modalTitle: e.target.value })} placeholder="항목 검색 및 선택" className="h-8 text-xs sm:h-10 sm:text-sm" />
updateConfig({ modalButtonText: e.target.value })} placeholder="항목 검색" className="h-8 text-xs sm:h-10 sm:text-sm" />
필드를 찾을 수 없습니다. {tableColumns.map((column) => ( { updateConfig({ uniqueField: column.columnName }); setOpenUniqueFieldCombo(false); }} className="text-xs sm:text-sm" >
{column.displayName || column.columnName} {column.displayName && {column.columnName}}
))}
updateConfig({ multiSelect: checked }) } />
{(localConfig.sourceColumns || []).map((column, index) => (
))}
{(localConfig.sourceSearchFields || []).map((field, index) => (
))}

💡 참고사항:

  • 컬럼 설정은 별도 설정 패널에서 관리
  • 계산 규칙도 별도 설정 패널에서 관리
  • 여기서는 기본 설정만 구성
); }