Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions src/panel_reactflow/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -2229,15 +2234,15 @@ 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):
removed_node.flow = 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)
Expand Down
19 changes: 19 additions & 0 deletions tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Loading