/** * Automation2 Flow Editor - Data Picker for selecting node output references. */ import React, { useState } from 'react'; import { createRef, type DataRef } from './dataRef'; import styles from '../../editor/Automation2FlowEditor.module.css'; interface DataPickerProps { open: boolean; onClose: () => void; onPick: (ref: DataRef) => void; availableSourceIds: string[]; nodes: Array<{ id: string; title?: string; type?: string }>; nodeOutputsPreview: Record; getNodeLabel: (node: { id: string; title?: string }) => string; } /** Collect all pickable paths (each leads to a value the user can reference) */ function buildPickablePaths(obj: unknown, basePath: (string | number)[] = []): Array<{ path: (string | number)[]; label: string }> { const pathLabel = basePath.length ? basePath.map(String).join(' → ') : '(ganze Ausgabe)'; if (obj == null || typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') { return [{ path: [...basePath], label: pathLabel }]; } if (Array.isArray(obj)) { const result: Array<{ path: (string | number)[]; label: string }> = [{ path: [...basePath], label: pathLabel }]; for (let i = 0; i < Math.min(obj.length, 10); i++) { result.push(...buildPickablePaths(obj[i], [...basePath, i])); } return result; } if (typeof obj === 'object') { const result: Array<{ path: (string | number)[]; label: string }> = [{ path: [...basePath], label: pathLabel }]; for (const [k, v] of Object.entries(obj as Record)) { result.push(...buildPickablePaths(v, [...basePath, k])); } return result; } return [{ path: [...basePath], label: pathLabel }]; } export const DataPicker: React.FC = ({ open, onClose, onPick, availableSourceIds, nodes, nodeOutputsPreview, getNodeLabel, }) => { const [expandedNodes, setExpandedNodes] = useState>(new Set()); if (!open) return null; const toggleExpand = (nodeId: string) => { setExpandedNodes((prev) => { const next = new Set(prev); if (next.has(nodeId)) next.delete(nodeId); else next.add(nodeId); return next; }); }; const handlePick = (nodeId: string, path: (string | number)[]) => { onPick(createRef(nodeId, path)); onClose(); }; return (
e.stopPropagation()}>

Datenquelle wählen

{(() => { const filteredIds = availableSourceIds.filter((nodeId) => { const node = nodes.find((n) => n.id === nodeId); return node?.type !== 'trigger.manual'; }); if (filteredIds.length === 0) { return

Keine vorherigen Nodes verfügbar.

; } return filteredIds.map((nodeId) => { const node = nodes.find((n) => n.id === nodeId); const preview = nodeOutputsPreview[nodeId]; const label = node ? getNodeLabel(node) : nodeId; const paths = buildPickablePaths(preview); const isExpanded = expandedNodes.has(nodeId); return (
{isExpanded && (
{paths.map((p, i) => ( ))}
)}
); }); })()}
); };