Browse Source

feat: transform operation in transaction builder

Vincent Chan 2 years ago
parent
commit
033410aacd

+ 5 - 1
frontend/app_flowy/packages/flowy_editor/lib/document/node.dart

@@ -31,7 +31,11 @@ class Node extends ChangeNotifier with LinkedListEntry<Node> {
     required this.children,
     required this.attributes,
     this.parent,
-  });
+  }) {
+    for (final child in children) {
+      child.parent = this;
+    }
+  }
 
   factory Node.fromJson(Map<String, Object> json) {
     assert(json['type'] is String);

+ 1 - 0
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;
 }

+ 3 - 0
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);
   }
 

+ 33 - 0
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]);
+  });
 }