import { useExecutionDetail } from '../../api/queries/executions'; import type { ProcessorNode as ProcessorNodeType } from '../../api/schema'; import styles from './ProcessorTree.module.css'; const ICON_MAP: Record = { from: { label: 'EP', className: styles.iconEndpoint }, to: { label: 'EP', className: styles.iconEndpoint }, toD: { label: 'EP', className: styles.iconEndpoint }, choice: { label: 'CB', className: styles.iconEip }, when: { label: 'CB', className: styles.iconEip }, otherwise: { label: 'CB', className: styles.iconEip }, split: { label: 'CB', className: styles.iconEip }, aggregate: { label: 'CB', className: styles.iconEip }, filter: { label: 'CB', className: styles.iconEip }, multicast: { label: 'CB', className: styles.iconEip }, recipientList: { label: 'CB', className: styles.iconEip }, routingSlip: { label: 'CB', className: styles.iconEip }, dynamicRouter: { label: 'CB', className: styles.iconEip }, exception: { label: '!!', className: styles.iconError }, onException: { label: '!!', className: styles.iconError }, }; function getIcon(type: string, status: string) { if (status === 'FAILED') return { label: '!!', className: styles.iconError }; const key = type.toLowerCase(); return ICON_MAP[key] ?? { label: 'PR', className: styles.iconProcessor }; } export function ProcessorTree({ executionId }: { executionId: string }) { const { data, isLoading } = useExecutionDetail(executionId); if (isLoading) return
Loading processor tree...
; if (!data) return null; return (

Processor Execution Tree

{data.processors.map((proc, i) => ( ))}
); } function ProcessorNodeView({ node }: { node: ProcessorNodeType }) { const icon = getIcon(node.processorType, node.status); return (
{icon.label}
{node.processorType}
{node.durationMs}ms
{node.children.length > 0 && (
{node.children.map((child, i) => ( ))}
)}
); }