import type { FlowEdge, FlowNode } from '../manifest'; import { KIND_LABELS, STATUS_LABELS, TRIGGER_LABELS } from '../manifest'; import { stageColor } from './nodeShapes'; interface Props { selectedNode: FlowNode | null; selectedEdge: FlowEdge | null; allNodes: FlowNode[]; allEdges: FlowEdge[]; onSelectNode: (id: string) => void; } export function NodeDetailPanel({ selectedNode, selectedEdge, allNodes, allEdges, onSelectNode, }: Props) { if (selectedEdge) { const source = allNodes.find((n) => n.id === selectedEdge.source); const target = allNodes.find((n) => n.id === selectedEdge.target); return (
엣지

{selectedEdge.label || selectedEdge.id}

{selectedEdge.id}
{selectedEdge.kind ?? 'data'}
{selectedEdge.detail && (
설명
{selectedEdge.detail}
)}
Source → Target
{source && ( )} {target && ( )}
); } if (!selectedNode) { return (
노드 또는 엣지를 클릭하면
상세 정보가 표시됩니다.
); } const accent = stageColor(selectedNode.stage); const incoming = allEdges.filter((e) => e.target === selectedNode.id); const outgoing = allEdges.filter((e) => e.source === selectedNode.id); return (
{selectedNode.stage}

{selectedNode.label}

{selectedNode.id}
{KIND_LABELS[selectedNode.kind]} {TRIGGER_LABELS[selectedNode.trigger]} {STATUS_LABELS[selectedNode.status]} {selectedNode.menu && ( 메뉴: {selectedNode.menu} )}
{selectedNode.shortDescription && (
개요
{selectedNode.shortDescription}
)} {selectedNode.notes && (
설명
{selectedNode.notes}
)} {selectedNode.file && (
코드
{selectedNode.file} {selectedNode.symbol && ( {selectedNode.symbol} )}
)} {selectedNode.actor && (
담당자
{selectedNode.actor}
)} {selectedNode.triggers && selectedNode.triggers.length > 0 && (
발화 조건
)} {selectedNode.inputs && selectedNode.inputs.length > 0 && (
입력 (Inputs)
)} {selectedNode.outputs && selectedNode.outputs.length > 0 && (
출력 (Outputs)
)} {selectedNode.params && selectedNode.params.length > 0 && (
파라미터
)} {selectedNode.rules && selectedNode.rules.length > 0 && (
규칙
)} {incoming.length > 0 && (
들어오는 흐름 ({incoming.length})
{incoming.map((e) => { const src = allNodes.find((n) => n.id === e.source); return ( ); })}
)} {outgoing.length > 0 && (
나가는 흐름 ({outgoing.length})
{outgoing.map((e) => { const tgt = allNodes.find((n) => n.id === e.target); return ( ); })}
)} {selectedNode.tags && selectedNode.tags.length > 0 && (
태그
{selectedNode.tags.map((t) => ( {t} ))}
)}
); }