Merge pull request #4603 from xyflow/refactor/setnodes-order
fix(setNodes): use correct index when using setNodes for inserting #4455
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
---
|
||||
'@xyflow/react': patch
|
||||
'@xyflow/system': patch
|
||||
---
|
||||
|
||||
use correct index when using setNodes for inserting
|
||||
@@ -19,10 +19,11 @@ function applyChanges(changes: any[], elements: any[]): any[] {
|
||||
// By storing a map of changes for each element, we can a quick lookup as we
|
||||
// iterate over the elements array!
|
||||
const changesMap = new Map<any, any[]>();
|
||||
const addItemChanges: any[] = [];
|
||||
|
||||
for (const change of changes) {
|
||||
if (change.type === 'add') {
|
||||
updatedElements.push(change.item);
|
||||
addItemChanges.push(change);
|
||||
continue;
|
||||
} else if (change.type === 'remove' || change.type === 'replace') {
|
||||
// For a 'remove' change we can safely ignore any other changes queued for
|
||||
@@ -73,6 +74,18 @@ function applyChanges(changes: any[], elements: any[]): any[] {
|
||||
updatedElements.push(updatedElement);
|
||||
}
|
||||
|
||||
// we need to wait for all changes to be applied before adding new items
|
||||
// to be able to add them at the correct index
|
||||
if (addItemChanges.length) {
|
||||
addItemChanges.forEach((change) => {
|
||||
if (change.index !== undefined) {
|
||||
updatedElements.splice(change.index, 0, { ...change.item });
|
||||
} else {
|
||||
updatedElements.push({ ...change.item });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return updatedElements;
|
||||
}
|
||||
|
||||
@@ -237,7 +250,7 @@ export function getElementsDiffChanges({
|
||||
const changes: any[] = [];
|
||||
const itemsLookup = new Map<string, any>(items.map((item) => [item.id, item]));
|
||||
|
||||
for (const item of items) {
|
||||
for (const [index, item] of items.entries()) {
|
||||
const lookupItem = lookup.get(item.id);
|
||||
const storeItem = lookupItem?.internals?.userNode ?? lookupItem;
|
||||
|
||||
@@ -246,7 +259,7 @@ export function getElementsDiffChanges({
|
||||
}
|
||||
|
||||
if (storeItem === undefined) {
|
||||
changes.push({ item: item, type: 'add' });
|
||||
changes.push({ item: item, type: 'add', index });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ export type NodeRemoveChange = {
|
||||
export type NodeAddChange<NodeType extends NodeBase = NodeBase> = {
|
||||
item: NodeType;
|
||||
type: 'add';
|
||||
index?: number;
|
||||
};
|
||||
|
||||
export type NodeReplaceChange<NodeType extends NodeBase = NodeBase> = {
|
||||
@@ -57,6 +58,7 @@ export type EdgeRemoveChange = NodeRemoveChange;
|
||||
export type EdgeAddChange<EdgeType extends EdgeBase = EdgeBase> = {
|
||||
item: EdgeType;
|
||||
type: 'add';
|
||||
index?: number;
|
||||
};
|
||||
|
||||
export type EdgeReplaceChange<EdgeType extends EdgeBase = EdgeBase> = {
|
||||
|
||||
Reference in New Issue
Block a user