From 58a9adee75fcd6adac44c3cfbcd87b7bb3bde195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Tue, 24 Mar 2026 09:13:11 +0100 Subject: [PATCH] fix: remove node with edge instances --- src/panel_reactflow/base.py | 11 ++++++++--- tests/test_api.py | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/panel_reactflow/base.py b/src/panel_reactflow/base.py index 9baf0d6..ea0731e 100644 --- a/src/panel_reactflow/base.py +++ b/src/panel_reactflow/base.py @@ -2219,7 +2219,12 @@ def remove_node(self, node_id: str) -> None: """ removed_node = next((node for node in self.nodes if self._node_id(node) == node_id), None) nodes = [node for node in self.nodes if self._node_id(node) != node_id] - removed_edges = [edge for edge in self.edges if edge.get("source") == node_id or edge.get("target") == node_id] + removed_edges = [ + edge + for edge in self.edges + if (edge.source if isinstance(edge, Edge) else edge.get("source")) == node_id + or (edge.target if isinstance(edge, Edge) else edge.get("target")) == node_id + ] self.nodes = nodes if removed_edges: remaining_edges = [edge for edge in self.edges if edge not in removed_edges] @@ -2229,7 +2234,7 @@ def remove_node(self, node_id: str) -> None: { "type": "node_deleted", "node_id": node_id, - "deleted_edges": [edge.get("id") for edge in removed_edges], + "deleted_edges": [self._edge_id(edge) for edge in removed_edges], }, ) if isinstance(removed_node, Node): @@ -2237,7 +2242,7 @@ def remove_node(self, node_id: str) -> None: payload = { "type": "node_deleted", "node_id": node_id, - "deleted_edges": [edge.get("id") for edge in removed_edges], + "deleted_edges": [self._edge_id(edge) for edge in removed_edges], } self._invoke_node_hook(removed_node, "on_delete", payload) self._invoke_node_hook(removed_node, "on_event", payload) diff --git a/tests/test_api.py b/tests/test_api.py index 99ca30e..d27a5af 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -847,3 +847,22 @@ def test_mixed_edgespec_and_dict() -> None: assert isinstance(flow.edges[1], dict) assert flow.edges[0]["id"] == "e1" assert flow.edges[1]["id"] == "e2" + + +def test_remove_node_with_edge_instances() -> None: + nodes = [ + Node(id="a", position={"x": 0, "y": 0}, label="Node A"), + Node(id="b", position={"x": 250, "y": 0}, label="Node B"), + Node(id="c", position={"x": 125, "y": 150}, label="Node C"), + ] + edges = [ + Edge(id="e1", source="a", target="c"), + Edge(id="e2", source="b", target="c"), + ] + flow = ReactFlow(nodes=nodes, edges=edges) + + flow.remove_node("a") + assert len(flow.nodes) == 2 + assert all(n.id != "a" for n in flow.nodes) + assert len(flow.edges) == 1 + assert flow.edges[0].id == "e2"