"use client"; /** * 데이터 변환 노드 */ import { memo } from "react"; import { Handle, Position, NodeProps } from "reactflow"; import { Wand2, ArrowRight } from "lucide-react"; import type { DataTransformNodeData } from "@/types/node-editor"; export const DataTransformNode = memo(({ data, selected }: NodeProps) => { return (
{/* 헤더 */}
{data.displayName || "데이터 변환"}
{data.transformations?.length || 0}개 변환
{/* 본문 */}
{data.transformations && data.transformations.length > 0 ? (
{data.transformations.slice(0, 3).map((transform, idx) => { const sourceLabel = transform.sourceFieldLabel || transform.sourceField || "소스"; const targetField = transform.targetField || transform.sourceField; const targetLabel = transform.targetFieldLabel || targetField; const isInPlace = !transform.targetField || transform.targetField === transform.sourceField; return (
{transform.type}
{sourceLabel} {isInPlace ? ( (자기자신) ) : ( {targetLabel} )}
{/* 타입별 추가 정보 */} {transform.type === "EXPLODE" && transform.delimiter && (
구분자: {transform.delimiter}
)} {transform.type === "CONCAT" && transform.separator && (
구분자: {transform.separator}
)} {transform.type === "REPLACE" && (
"{transform.searchValue}" → "{transform.replaceValue}"
)} {transform.expression && (
{transform.expression}
)}
); })} {data.transformations.length > 3 && (
... 외 {data.transformations.length - 3}개
)}
) : (
변환 규칙 없음
)}
{/* 핸들 */}
); }); DataTransformNode.displayName = "DataTransformNode";