diff --git a/frontend/app_flowy/packages/flowy_editor/lib/document/node.dart b/frontend/app_flowy/packages/flowy_editor/lib/document/node.dart index 8b80fd0b51..9871bf24ee 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/document/node.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/document/node.dart @@ -31,7 +31,11 @@ class Node extends ChangeNotifier with LinkedListEntry { required this.children, required this.attributes, this.parent, - }); + }) { + for (final child in children) { + child.parent = this; + } + } factory Node.fromJson(Map json) { assert(json['type'] is String); diff --git a/frontend/app_flowy/packages/flowy_editor/lib/operation/operation.dart b/frontend/app_flowy/packages/flowy_editor/lib/operation/operation.dart index 7534b03427..487844af14 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/operation/operation.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/operation/operation.dart @@ -141,5 +141,6 @@ Operation transformOperation(Operation a, Operation b) { final newPath = transformPath(a.path, b.path, -1); return b.copyWithPath(newPath); } + // TODO: transform update and textedit return b; } diff --git a/frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart b/frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart index 6fca48f230..b7ae2ac878 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/operation/transaction_builder.dart @@ -96,6 +96,9 @@ class TransactionBuilder { return; } } + for (var i = 0; i < operations.length; i++) { + op = transformOperation(operations[i], op); + } operations.add(op); } diff --git a/frontend/app_flowy/packages/flowy_editor/test/operation_test.dart b/frontend/app_flowy/packages/flowy_editor/test/operation_test.dart index 53c2a243b9..683b6df58e 100644 --- a/frontend/app_flowy/packages/flowy_editor/test/operation_test.dart +++ b/frontend/app_flowy/packages/flowy_editor/test/operation_test.dart @@ -3,6 +3,10 @@ import 'dart:collection'; import 'package:flowy_editor/document/node.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flowy_editor/operation/operation.dart'; +import 'package:flowy_editor/operation/transaction_builder.dart'; +import 'package:flowy_editor/editor_state.dart'; +import 'package:flowy_editor/document/state_tree.dart'; +import 'package:flowy_editor/render/render_plugins.dart'; void main() { group('transform path', () { @@ -46,4 +50,33 @@ void main() { expect(t.path, [0, 1]); }); }); + test('transform transaction builder', () { + final item1 = Node(type: "node", attributes: {}, children: LinkedList()); + final item2 = Node(type: "node", attributes: {}, children: LinkedList()); + final item3 = Node(type: "node", attributes: {}, children: LinkedList()); + final root = Node( + type: "root", + attributes: {}, + children: LinkedList() + ..addAll([ + item1, + item2, + item3, + ])); + final state = EditorState( + document: StateTree(root: root), renderPlugins: RenderPlugins()); + + expect(item1.path, [0]); + expect(item2.path, [1]); + expect(item3.path, [2]); + + final tb = TransactionBuilder(state); + tb.deleteNode(item1); + tb.deleteNode(item2); + tb.deleteNode(item3); + final transaction = tb.finish(); + expect(transaction.operations[0].path, [0]); + expect(transaction.operations[1].path, [0]); + expect(transaction.operations[2].path, [0]); + }); }