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}