diff --git a/examples/nextjs/pages/Overview/index.tsx b/examples/nextjs/pages/Overview/index.tsx
index 8104fc3e..d5336726 100644
--- a/examples/nextjs/pages/Overview/index.tsx
+++ b/examples/nextjs/pages/Overview/index.tsx
@@ -121,11 +121,12 @@ const initialNodes: Node[] = [
data: {
label: (
<>
- An output node
+ An output node (not deletable)
>
),
},
position: { x: 100, y: 480 },
+ deletable: false,
},
{
id: '7',
@@ -151,7 +152,8 @@ const initialEdges: Edge[] = [
source: '5',
target: '6',
type: 'smoothstep',
- label: 'smooth step edge',
+ deletable: false,
+ label: 'smooth step edge (not deletable)',
},
{
id: 'e5-7',
diff --git a/packages/core/src/hooks/useGlobalKeyHandler.ts b/packages/core/src/hooks/useGlobalKeyHandler.ts
index 742c9cee..01474a5d 100644
--- a/packages/core/src/hooks/useGlobalKeyHandler.ts
+++ b/packages/core/src/hooks/useGlobalKeyHandler.ts
@@ -34,16 +34,18 @@ export default ({ deleteKeyCode, multiSelectionKeyCode }: HookParams): void => {
const nodes = Array.from(nodeInternals.values());
const nodesToRemove = nodes.reduce((res, node) => {
const parentSelected = !node.selected && node.parentNode && res.find((n) => n.id === node.parentNode);
- if (node.selected || parentSelected) {
+ const deletable = typeof node.deletable === 'boolean' ? node.deletable : true;
+ if (deletable && (node.selected || parentSelected)) {
res.push(node);
}
return res;
}, []);
- const selectedEdges = edges.filter((e) => e.selected);
+ const deletableEdges = edges.filter((e) => (typeof e.deletable === 'boolean' ? e.deletable : true));
+ const selectedEdges = deletableEdges.filter((e) => e.selected);
if (nodesToRemove || selectedEdges) {
- const connectedEdges = getConnectedEdges(nodesToRemove, edges);
+ const connectedEdges = getConnectedEdges(nodesToRemove, deletableEdges);
const edgesToRemove = [...selectedEdges, ...connectedEdges];
const edgeIdsToRemove = edgesToRemove.reduce((res, edge) => {
if (!res.includes(edge.id)) {
diff --git a/packages/core/src/types/edges.ts b/packages/core/src/types/edges.ts
index ede7cc35..16e98499 100644
--- a/packages/core/src/types/edges.ts
+++ b/packages/core/src/types/edges.ts
@@ -22,6 +22,7 @@ export interface Edge {
style?: CSSProperties;
animated?: boolean;
hidden?: boolean;
+ deletable?: boolean;
data?: T;
className?: string;
sourceNode?: Node;
diff --git a/packages/core/src/types/nodes.ts b/packages/core/src/types/nodes.ts
index db59a288..c9dbb65c 100644
--- a/packages/core/src/types/nodes.ts
+++ b/packages/core/src/types/nodes.ts
@@ -21,6 +21,7 @@ export interface Node {
draggable?: boolean;
selectable?: boolean;
connectable?: boolean;
+ deletable?: boolean;
dragHandle?: string;
width?: number | null;
height?: number | null;