diff --git a/src/panel_reactflow/models/reactflow.jsx b/src/panel_reactflow/models/reactflow.jsx index e0dbb66..2e28dd7 100644 --- a/src/panel_reactflow/models/reactflow.jsx +++ b/src/panel_reactflow/models/reactflow.jsx @@ -50,8 +50,8 @@ function makeNodeComponent(typeName, typeSpec, editorMode) { return (
- {showToolbar ? ( - + {showGear ? ( + {data.editor} ) : null} @@ -137,6 +137,8 @@ function FlowInner({ onPaneClick, defaultEdgeOptions, nodeTypes, + nodeEditors, + edgeEditors, editable, enableConnect, enableDelete, @@ -201,11 +203,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 +225,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) { @@ -495,6 +501,8 @@ export function render({ model, view }) { viewportSetter={setViewport} defaultEdgeOptions={defaultEdgeOptions} nodeTypes={hydratedNodeTypes} + nodeEditors={nodeEditors} + edgeEditors={edgeEditors} editable={editable} enableConnect={enableConnect} enableDelete={enableDelete}