"use client"; import React, { useState, useEffect } from "react"; import { Plus, X, Settings, ArrowRight } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Badge } from "@/components/ui/badge"; import type { DataTransferField } from "./types"; interface ColumnInfo { column_name: string; column_comment?: string; data_type?: string; } interface DataTransferConfigModalProps { open: boolean; onOpenChange: (open: boolean) => void; dataTransferFields: DataTransferField[]; onChange: (fields: DataTransferField[]) => void; leftColumns: ColumnInfo[]; rightColumns: ColumnInfo[]; leftTableName?: string; rightTableName?: string; } // 컬럼 선택 컴포넌트 const ColumnSelect: React.FC<{ columns: ColumnInfo[]; value: string; onValueChange: (value: string) => void; placeholder: string; disabled?: boolean; }> = ({ columns, value, onValueChange, placeholder, disabled = false }) => { return ( ); }; // 개별 필드 편집 모달 const FieldEditModal: React.FC<{ open: boolean; onOpenChange: (open: boolean) => void; field: DataTransferField | null; onSave: (field: DataTransferField) => void; leftColumns: ColumnInfo[]; rightColumns: ColumnInfo[]; leftTableName?: string; rightTableName?: string; isNew?: boolean; }> = ({ open, onOpenChange, field, onSave, leftColumns, rightColumns, leftTableName, rightTableName, isNew = false, }) => { const [editingField, setEditingField] = useState({ id: "", panel: "left", sourceColumn: "", targetColumn: "", label: "", description: "", }); useEffect(() => { if (field) { setEditingField({ ...field }); } else { setEditingField({ id: `field_${Date.now()}`, panel: "left", sourceColumn: "", targetColumn: "", label: "", description: "", }); } }, [field, open]); const handleSave = () => { if (!editingField.sourceColumn || !editingField.targetColumn) { return; } onSave(editingField); onOpenChange(false); }; const currentColumns = editingField.panel === "left" ? leftColumns : rightColumns; const currentTableName = editingField.panel === "left" ? leftTableName : rightTableName; return ( {isNew ? "데이터 전달 필드 추가" : "데이터 전달 필드 편집"} 선택한 항목의 데이터를 모달에 자동으로 전달합니다.
{/* 패널 선택 */}

데이터를 가져올 패널을 선택합니다.

{/* 소스 컬럼 */}
{ const col = currentColumns.find((c) => c.column_name === value); setEditingField({ ...editingField, sourceColumn: value, // 타겟 컬럼이 비어있으면 소스와 동일하게 설정 targetColumn: editingField.targetColumn || value, // 라벨이 비어있으면 컬럼 코멘트 사용 label: editingField.label || col?.column_comment || "", }); }} placeholder="컬럼 선택..." disabled={currentColumns.length === 0} />
{currentColumns.length === 0 && (

{currentTableName ? "테이블에 컬럼이 없습니다." : "테이블을 먼저 선택해주세요."}

)}
{/* 타겟 컬럼 */}
setEditingField({ ...editingField, targetColumn: e.target.value })} placeholder="모달에서 사용할 필드명" className="mt-1 h-9 text-sm" />

모달 폼에서 이 값을 받을 필드명입니다.

{/* 라벨 (선택) */}
setEditingField({ ...editingField, label: e.target.value })} placeholder="표시용 이름" className="mt-1 h-9 text-sm" />
{/* 설명 (선택) */}
setEditingField({ ...editingField, description: e.target.value })} placeholder="이 필드에 대한 설명" className="mt-1 h-9 text-sm" />
{/* 미리보기 */} {editingField.sourceColumn && editingField.targetColumn && (

미리보기

{editingField.panel === "left" ? "좌측" : "우측"} {editingField.sourceColumn} {editingField.targetColumn}
)}
); }; // 메인 모달 컴포넌트 const DataTransferConfigModal: React.FC = ({ open, onOpenChange, dataTransferFields, onChange, leftColumns, rightColumns, leftTableName, rightTableName, }) => { const [fields, setFields] = useState([]); const [editModalOpen, setEditModalOpen] = useState(false); const [editingField, setEditingField] = useState(null); const [isNewField, setIsNewField] = useState(false); useEffect(() => { if (open) { // 기존 필드에 panel이 없으면 left로 기본 설정 (하위 호환성) const normalizedFields = (dataTransferFields || []).map((field, idx) => ({ ...field, id: field.id || `field_${idx}`, panel: field.panel || ("left" as const), })); setFields(normalizedFields); } }, [open, dataTransferFields]); const handleAddField = () => { setEditingField(null); setIsNewField(true); setEditModalOpen(true); }; const handleEditField = (field: DataTransferField) => { setEditingField(field); setIsNewField(false); setEditModalOpen(true); }; const handleSaveField = (field: DataTransferField) => { if (isNewField) { setFields([...fields, field]); } else { setFields(fields.map((f) => (f.id === field.id ? field : f))); } }; const handleRemoveField = (id: string) => { setFields(fields.filter((f) => f.id !== id)); }; const handleSave = () => { onChange(fields); onOpenChange(false); }; const getColumnLabel = (panel: "left" | "right", columnName: string) => { const columns = panel === "left" ? leftColumns : rightColumns; const col = columns.find((c) => c.column_name === columnName); return col?.column_comment || columnName; }; return ( <> 데이터 전달 설정 버튼 클릭 시 모달에 자동으로 전달할 데이터를 설정합니다.
전달 필드 ({fields.length}개)
{fields.length === 0 ? (

전달할 필드가 없습니다

) : ( fields.map((field) => (
{field.panel === "left" ? "좌측" : "우측"}
{getColumnLabel(field.panel, field.sourceColumn)} {field.targetColumn}
{field.description && (

{field.description}

)}
)) )}

버튼별로 개별 데이터 전달 설정이 있으면 해당 설정이 우선 적용됩니다.

{/* 필드 편집 모달 */} ); }; export default DataTransferConfigModal;