"use client"; import React, { useState, useCallback } from "react"; import { ReactFlow, Node, Edge, Controls, Background, MiniMap, useNodesState, useEdgesState, addEdge, Connection, } from "@xyflow/react"; import "@xyflow/react/dist/style.css"; import { ScreenNode } from "./ScreenNode"; import { CustomEdge } from "./CustomEdge"; // 노드 및 엣지 타입 정의 const nodeTypes = { screenNode: ScreenNode, }; const edgeTypes = { customEdge: CustomEdge, }; interface DataFlowDesignerProps { companyCode: string; onSave?: (relationships: any[]) => void; } export const DataFlowDesigner: React.FC = ({ companyCode, onSave }) => { const [nodes, setNodes, onNodesChange] = useNodesState([]); const [edges, setEdges, onEdgesChange] = useEdgesState([]); const [selectedField, setSelectedField] = useState<{ screenId: string; fieldName: string; } | null>(null); // 노드 연결 처리 const onConnect = useCallback( (params: Connection) => { const newEdge = { ...params, type: "customEdge", data: { relationshipType: "one-to-one", connectionType: "simple-key", label: "1:1 연결", }, }; setEdges((eds) => addEdge(newEdge, eds)); }, [setEdges], ); // 필드 클릭 처리 const handleFieldClick = useCallback((screenId: string, fieldName: string) => { setSelectedField({ screenId, fieldName }); }, []); // 샘플 화면 노드 추가 const addSampleNode = useCallback(() => { const newNode: Node = { id: `screen-${Date.now()}`, type: "screenNode", position: { x: Math.random() * 300, y: Math.random() * 200 }, data: { screen: { screenId: `screen-${Date.now()}`, screenName: `샘플 화면 ${nodes.length + 1}`, screenCode: `SCREEN${nodes.length + 1}`, tableName: `table_${nodes.length + 1}`, fields: [ { name: "id", type: "INTEGER", description: "고유 식별자" }, { name: "name", type: "VARCHAR(100)", description: "이름" }, { name: "code", type: "VARCHAR(50)", description: "코드" }, { name: "created_date", type: "TIMESTAMP", description: "생성일시" }, ], }, onFieldClick: handleFieldClick, }, }; setNodes((nds) => nds.concat(newNode)); }, [nodes.length, handleFieldClick, setNodes]); // 노드 전체 삭제 const clearNodes = useCallback(() => { setNodes([]); setEdges([]); }, [setNodes, setEdges]); return (
{/* 사이드바 */}

데이터 흐름 관리

{/* 회사 정보 */}
회사 코드
{companyCode}
{/* 컨트롤 버튼들 */}
{/* 통계 정보 */}
통계
화면 노드: {nodes.length}개
연결: {edges.length}개
{/* 선택된 필드 정보 */} {selectedField && (
선택된 필드
화면: {selectedField.screenId}
필드: {selectedField.fieldName}
)}
{/* React Flow 캔버스 */}
{ switch (node.type) { case "screenNode": return "#3B82F6"; default: return "#6B7280"; } }} /> {/* 안내 메시지 */} {nodes.length === 0 && (
📊
데이터 흐름 설계를 시작하세요
왼쪽 사이드바에서 "샘플 화면 추가" 버튼을 클릭하세요
)}
); };