From 2976beb476d3ca5a948772158e6a468736fc54e7 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 12 Feb 2026 20:26:15 +0000 Subject: [PATCH 1/2] Ensure edge and node editors render without nodes --- src/panel_reactflow/models/reactflow.jsx | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/panel_reactflow/models/reactflow.jsx b/src/panel_reactflow/models/reactflow.jsx index e0dbb66..ad642d8 100644 --- a/src/panel_reactflow/models/reactflow.jsx +++ b/src/panel_reactflow/models/reactflow.jsx @@ -48,10 +48,12 @@ function makeNodeComponent(typeName, typeSpec, editorMode) { toggleToolbar((v) => !v); }; + console.log(data) + return (
- {showToolbar ? ( - + {showGear ? ( + {data.editor} ) : null} @@ -137,6 +139,8 @@ function FlowInner({ onPaneClick, defaultEdgeOptions, nodeTypes, + nodeEditors, + edgeEditors, editable, enableConnect, enableDelete, @@ -201,11 +205,13 @@ function FlowInner({ useEffect(() => { const nodesSig = signature(pyNodes); const viewsSig = signature((views || []).map((view) => view?.props?.id ?? null)); - if (nodesSig === lastHydrated.current.nodesSig && viewsSig === lastHydrated.current.viewsRef) { + const editorsSig = signature((nodeEditors || []).map((editor) => editor?.props?.id ?? null)); + if (nodesSig === lastHydrated.current.nodesSig && viewsSig === lastHydrated.current.viewsRef && editorsSig === lastHydrated.current.editorsRef) { return; } lastHydrated.current.nodesSig = nodesSig; lastHydrated.current.viewsRef = viewsSig; + lastHydrated.current.editorsRef = editorsSig; setNodes((curr) => { const nextById = new Map(hydratedNodes.map((n) => [n.id, n])); @@ -221,15 +227,17 @@ function FlowInner({ }); return merged; }); - }, [hydratedNodes, pyNodes, setNodes, views]); + }, [hydratedNodes, pyNodes, setNodes, views, nodeEditors]); useEffect(() => { const edgesSig = signature(hydratedEdges); - if (edgesSig !== lastHydrated.current.edgesSig) { + const editorsSig = signature((edgeEditors || []).map((editor) => editor?.props?.id ?? null)); + if (edgesSig !== lastHydrated.current.edgesSig || editorsSig !== lastHydrated.current.edgeEditorsSig) { lastHydrated.current.edgesSig = edgesSig; + lastHydrated.current.edgeEditorsSig = editorsSig; setEdges(hydratedEdges); } - }, [hydratedEdges, setEdges]); + }, [hydratedEdges, setEdges, edgeEditors]); useEffect(() => { if (viewport) { @@ -446,6 +454,7 @@ export function render({ model, view }) { const viewIndex = data.view_idx; const baseView = views[viewIndex]; const editorView = nodeEditors[idx]; + console.log(editorView) const typeSpec = allNodeTypes[node.type] || {}; const realKeys = Object.keys(data).filter((k) => k !== "view_idx"); const hasEditor = realKeys.length > 0 || !!typeSpec.schema; @@ -495,6 +504,8 @@ export function render({ model, view }) { viewportSetter={setViewport} defaultEdgeOptions={defaultEdgeOptions} nodeTypes={hydratedNodeTypes} + nodeEditors={nodeEditors} + edgeEditors={edgeEditors} editable={editable} enableConnect={enableConnect} enableDelete={enableDelete} From b04edab20dd39dc16ae3a3491226cee988c86773 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 12 Feb 2026 20:28:33 +0000 Subject: [PATCH 2/2] remove console.log --- src/panel_reactflow/models/reactflow.jsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/panel_reactflow/models/reactflow.jsx b/src/panel_reactflow/models/reactflow.jsx index ad642d8..2e28dd7 100644 --- a/src/panel_reactflow/models/reactflow.jsx +++ b/src/panel_reactflow/models/reactflow.jsx @@ -48,8 +48,6 @@ function makeNodeComponent(typeName, typeSpec, editorMode) { toggleToolbar((v) => !v); }; - console.log(data) - return (
{showGear ? ( @@ -454,7 +452,6 @@ export function render({ model, view }) { const viewIndex = data.view_idx; const baseView = views[viewIndex]; const editorView = nodeEditors[idx]; - console.log(editorView) const typeSpec = allNodeTypes[node.type] || {}; const realKeys = Object.keys(data).filter((k) => k !== "view_idx"); const hasEditor = realKeys.length > 0 || !!typeSpec.schema;