'use client' /** * SDK Flow Visualization * * Interaktive React Flow Darstellung aller SDK-Steps: * - Farblich nach Package gruppiert (5 Packages) * - Prerequisite-Edges zeigen den sequenziellen Flow * - DB-Tabellen und RAG-Collections als optionale Nodes * - Detail-Panel bei Klick auf einen Step */ import { useCallback, useState, useMemo, useEffect } from 'react' import { Node, useNodesState, useEdgesState, } from 'reactflow' import 'reactflow/dist/style.css' import { SDK_FLOW_STEPS, getAllDbTables, getAllRagCollections, type SDKFlowStep, } from './flow-data' import { BetriebOverviewPanel } from './_components/BetriebOverviewPanel' import { FlowToolbar } from './_components/FlowToolbar' import { FlowCanvas } from './_components/FlowCanvas' import { StepTable } from './_components/StepTable' import { useFlowGraph } from './_components/useFlowGraph' import { type PackageFilter } from './_components/helpers' export default function SDKFlowPage() { const [selectedStep, setSelectedStep] = useState(null) const [packageFilter, setPackageFilter] = useState('alle') const [showDb, setShowDb] = useState(false) const [showRag, setShowRag] = useState(false) const allDbTables = useMemo(() => getAllDbTables(), []) const allRagCollections = useMemo(() => getAllRagCollections(), []) // ========================================================================= // Build Nodes // ========================================================================= const { nodes: initialNodes, edges: initialEdges } = useFlowGraph( packageFilter, showDb, showRag, selectedStep, ) // ========================================================================= // React Flow State // ========================================================================= const [nodes, setNodes, onNodesChange] = useNodesState([]) const [edges, setEdges, onEdgesChange] = useEdgesState([]) useEffect(() => { setNodes(initialNodes) setEdges(initialEdges) }, [initialNodes, initialEdges, setNodes, setEdges]) const onNodeClick = useCallback((_event: React.MouseEvent, node: Node) => { const step = SDK_FLOW_STEPS.find(s => s.id === node.id) if (step) { setSelectedStep(prev => (prev?.id === step.id ? null : step)) } }, []) const onPaneClick = useCallback(() => { setSelectedStep(null) }, []) // ========================================================================= // Stats // ========================================================================= const stats = useMemo(() => { const visible = packageFilter === 'alle' ? SDK_FLOW_STEPS : SDK_FLOW_STEPS.filter(s => s.package === packageFilter) return { total: SDK_FLOW_STEPS.length, visible: visible.length, checkpoints: visible.filter(s => s.checkpointId).length, dbTables: allDbTables.length, ragCollections: allRagCollections.length, } }, [packageFilter, allDbTables, allRagCollections]) // ========================================================================= // Render // ========================================================================= return (
{/* Header */}
SDK

SDK Flow Visualization

{stats.total} Steps in 5 Packages | {stats.checkpoints} Checkpoints |{' '} {stats.dbTables} DB-Tabellen | {stats.ragCollections} RAG-Collections

{/* Toolbar */} {/* Flow Canvas + Detail Panel */} {/* Betrieb Fertigstellungsgrad Übersicht */} {packageFilter === 'betrieb' && } {/* Step Table (below flow) */}
) }