appflowy-editor
appflowy-editor copied to clipboard
[Bug] deleteNodes and insertNodes in the same transactions leads to incorrect item order
Bug Description
Clearing a document with deleteNode and then adding replacing the content with insertNodes messes up the order of the nodes inserted if done in the same transaction.
How to Reproduce
I added two tests in transaction_test.dart, which show the error. The first works as expected, the second fails because items are added in the wrong order:
test('insertNodes', () async {
final n1 = Node(type: 'paragraph-1');
final n2 = Node(type: 'paragraph-2');
final n3 = Node(type: 'paragraph-3');
final editorState = EditorState(document: Document.blank());
expect(editorState.document.root.children.length, 0);
final transaction = editorState.transaction;
transaction.insertNodes([0], [n1, n2, n3]);
await editorState.apply(transaction);
expect(editorState.document.root.children.length, 3);
expect(editorState.document.root.children[0].type, 'paragraph-1');
expect(editorState.document.root.children[1].type, 'paragraph-2');
expect(editorState.document.root.children[2].type, 'paragraph-3');
});
test('replacing Nodes', () async {
final n1 = Node(type: 'paragraph-1');
final n2 = Node(type: 'paragraph-2');
final n3 = Node(type: 'paragraph-3');
final start = Document.blank()
..insert([0], [paragraphNode(text: 'Initial content')]);
final editorState = EditorState(document: start);
expect(editorState.document.root.children.length, 1);
final transaction = editorState.transaction;
transaction.deleteNode(editorState.document.root.children.first);
transaction.insertNodes([0], [n1, n2, n3]);
await editorState.apply(transaction);
expect(editorState.document.root.children.length, 3);
expect(editorState.document.root.children[0].type, 'paragraph-1');
expect(editorState.document.root.children[1].type, 'paragraph-2');
expect(editorState.document.root.children[2].type, 'paragraph-3');
});
Expected Behavior
The items should have the correct order.
Operating System
Linux
AppFlowy Editor Version(s)
5.2.0 / main
Screenshots
n/a
Additional Context
just applying them as two separate transactions seems to work fine.