"use client"; import React, { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { Switch } from "@/components/ui/switch"; import { Badge } from "@/components/ui/badge"; import { Database, ChevronDown, ChevronRight, Eye, EyeOff } from "lucide-react"; import { toast } from "sonner"; import { ExternalDbConnectionAPI, ExternalDbConnection, DB_TYPE_OPTIONS, DB_TYPE_DEFAULTS, } from "@/lib/api/externalDbConnection"; interface ExternalDbConnectionModalProps { isOpen: boolean; onClose: () => void; onSave: () => void; editingConnection?: ExternalDbConnection | null; } export function ExternalDbConnectionModal({ isOpen, onClose, onSave, editingConnection, }: ExternalDbConnectionModalProps) { const [formData, setFormData] = useState>({ connection_name: "", description: "", db_type: "mysql", host: "", port: 3306, database_name: "", username: "", password: "", connection_timeout: 30, query_timeout: 60, max_connections: 10, ssl_enabled: "N", ssl_cert_path: "", company_code: "*", is_active: "Y", }); const [loading, setLoading] = useState(false); const [showAdvancedSettings, setShowAdvancedSettings] = useState(false); const [showPassword, setShowPassword] = useState(false); // 편집 모드일 때 기존 데이터 로드 useEffect(() => { if (isOpen) { if (editingConnection) { setFormData({ ...editingConnection, password: "", // 보안상 비밀번호는 빈 값으로 시작 }); setShowAdvancedSettings(true); // 편집 시 고급 설정 펼치기 } else { // 새 연결 생성 시 기본값 설정 setFormData({ connection_name: "", description: "", db_type: "mysql", host: "", port: 3306, database_name: "", username: "", password: "", connection_timeout: 30, query_timeout: 60, max_connections: 10, ssl_enabled: "N", ssl_cert_path: "", company_code: "*", is_active: "Y", }); setShowAdvancedSettings(false); } setShowPassword(false); } }, [isOpen, editingConnection]); // DB 타입 변경 시 기본 포트 설정 const handleDbTypeChange = (dbType: string) => { const defaultPort = DB_TYPE_DEFAULTS[dbType as keyof typeof DB_TYPE_DEFAULTS]?.port || 3306; setFormData((prev) => ({ ...prev, db_type: dbType as ExternalDbConnection["db_type"], port: defaultPort, })); }; // 폼 데이터 변경 핸들러 const handleInputChange = (field: keyof ExternalDbConnection, value: string | number) => { setFormData((prev) => ({ ...prev, [field]: value, })); }; // 저장 const handleSave = async () => { // 필수 필드 검증 if ( !formData.connection_name || !formData.db_type || !formData.host || !formData.port || !formData.database_name || !formData.username ) { toast.error("필수 필드를 모두 입력해주세요."); return; } // 편집 모드에서 비밀번호가 비어있으면 기존 비밀번호 유지 if (editingConnection && !formData.password) { formData.password = "***ENCRYPTED***"; // 서버에서 기존 비밀번호 유지하도록 표시 } else if (!editingConnection && !formData.password) { toast.error("새 연결 생성 시 비밀번호는 필수입니다."); return; } try { setLoading(true); const connectionData = { ...formData, port: Number(formData.port), connection_timeout: Number(formData.connection_timeout), query_timeout: Number(formData.query_timeout), max_connections: Number(formData.max_connections), } as ExternalDbConnection; let response; if (editingConnection?.id) { response = await ExternalDbConnectionAPI.updateConnection(editingConnection.id, connectionData); } else { response = await ExternalDbConnectionAPI.createConnection(connectionData); } if (response.success) { toast.success(editingConnection ? "연결이 수정되었습니다." : "연결이 생성되었습니다."); onSave(); } else { toast.error(response.message || "저장 중 오류가 발생했습니다."); } } catch (error) { console.error("저장 오류:", error); toast.error("저장 중 오류가 발생했습니다."); } finally { setLoading(false); } }; // 취소 const handleCancel = () => { onClose(); }; // 저장 버튼 비활성화 조건 const isSaveDisabled = () => { return ( loading || !formData.connection_name || !formData.host || !formData.port || !formData.database_name || !formData.username || (!editingConnection && !formData.password) ); }; return ( {editingConnection ? "외부 DB 연결 수정" : "새 외부 DB 연결 추가"}
{/* 기본 정보 */}

기본 정보

handleInputChange("connection_name", e.target.value)} placeholder="예: 영업팀 MySQL" />