fix(selection): deselect nodes when select edge and vice versa closes #1899
This commit is contained in:
+41
-8
@@ -123,16 +123,25 @@ const createStore = () =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// @TODO: can we unify addSelectedNodes and addSelectedEdges somehow?
|
||||||
addSelectedNodes: (selectedNodeIds: string[]) => {
|
addSelectedNodes: (selectedNodeIds: string[]) => {
|
||||||
const { multiSelectionActive, onNodesChange, nodeInternals, hasDefaultNodes } = get();
|
const {
|
||||||
// @TODO: work with nodeInternals instead of converting it to an array
|
multiSelectionActive,
|
||||||
const nodes = Array.from(nodeInternals).map(([_, node]) => node);
|
onNodesChange,
|
||||||
|
nodeInternals,
|
||||||
|
hasDefaultNodes,
|
||||||
|
onEdgesChange,
|
||||||
|
hasDefaultEdges,
|
||||||
|
edges,
|
||||||
|
} = get();
|
||||||
let changedNodes: NodeSelectionChange[];
|
let changedNodes: NodeSelectionChange[];
|
||||||
|
let changedEdges: EdgeSelectionChange[] | null = null;
|
||||||
|
|
||||||
if (multiSelectionActive) {
|
if (multiSelectionActive) {
|
||||||
changedNodes = selectedNodeIds.map((nodeId) => createSelectionChange(nodeId, true)) as NodeSelectionChange[];
|
changedNodes = selectedNodeIds.map((nodeId) => createSelectionChange(nodeId, true)) as NodeSelectionChange[];
|
||||||
} else {
|
} else {
|
||||||
changedNodes = getSelectionChanges(nodes, selectedNodeIds);
|
changedNodes = getSelectionChanges(Array.from(nodeInternals.values()), selectedNodeIds);
|
||||||
|
changedEdges = getSelectionChanges(edges, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changedNodes.length) {
|
if (changedNodes.length) {
|
||||||
@@ -142,16 +151,33 @@ const createStore = () =>
|
|||||||
|
|
||||||
onNodesChange?.(changedNodes);
|
onNodesChange?.(changedNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (changedEdges?.length) {
|
||||||
|
if (hasDefaultEdges) {
|
||||||
|
set({ edges: handleControlledEdgeSelectionChange(changedEdges, edges) });
|
||||||
|
}
|
||||||
|
|
||||||
|
onEdgesChange?.(changedEdges);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
addSelectedEdges: (selectedEdgeIds: string[]) => {
|
addSelectedEdges: (selectedEdgeIds: string[]) => {
|
||||||
const { multiSelectionActive, onEdgesChange, edges, hasDefaultEdges } = get();
|
const {
|
||||||
|
multiSelectionActive,
|
||||||
|
onEdgesChange,
|
||||||
|
edges,
|
||||||
|
hasDefaultEdges,
|
||||||
|
nodeInternals,
|
||||||
|
hasDefaultNodes,
|
||||||
|
onNodesChange,
|
||||||
|
} = get();
|
||||||
let changedEdges: EdgeSelectionChange[];
|
let changedEdges: EdgeSelectionChange[];
|
||||||
|
let changedNodes: NodeSelectionChange[] | null = null;
|
||||||
|
|
||||||
if (multiSelectionActive) {
|
if (multiSelectionActive) {
|
||||||
changedEdges = selectedEdgeIds.map((edgeId) => createSelectionChange(edgeId, true)) as EdgeSelectionChange[];
|
changedEdges = selectedEdgeIds.map((edgeId) => createSelectionChange(edgeId, true)) as EdgeSelectionChange[];
|
||||||
} else {
|
} else {
|
||||||
changedEdges = getSelectionChanges(edges, selectedEdgeIds);
|
changedEdges = getSelectionChanges(edges, selectedEdgeIds);
|
||||||
|
changedNodes = getSelectionChanges(Array.from(nodeInternals.values()), []);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changedEdges.length) {
|
if (changedEdges.length) {
|
||||||
@@ -162,11 +188,18 @@ const createStore = () =>
|
|||||||
}
|
}
|
||||||
onEdgesChange?.(changedEdges);
|
onEdgesChange?.(changedEdges);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (changedNodes?.length) {
|
||||||
|
if (hasDefaultNodes) {
|
||||||
|
set({ nodeInternals: handleControlledNodeSelectionChange(changedNodes, nodeInternals) });
|
||||||
|
}
|
||||||
|
|
||||||
|
onNodesChange?.(changedNodes);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
unselectNodesAndEdges: () => {
|
unselectNodesAndEdges: () => {
|
||||||
const { nodeInternals, edges, onNodesChange, onEdgesChange, hasDefaultNodes, hasDefaultEdges } = get();
|
const { nodeInternals, edges, onNodesChange, onEdgesChange, hasDefaultNodes, hasDefaultEdges } = get();
|
||||||
// @TODO: work with nodeInternals instead of converting it to an array
|
const nodes = Array.from(nodeInternals.values());
|
||||||
const nodes = Array.from(nodeInternals).map(([_, node]) => node);
|
|
||||||
|
|
||||||
const nodesToUnselect = nodes.map((n) => {
|
const nodesToUnselect = nodes.map((n) => {
|
||||||
n.selected = false;
|
n.selected = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user