feat: transform operation in transaction builder

This commit is contained in:
Vincent Chan 2022-07-27 13:54:46 +08:00
parent c72fead19c
commit 033410aacd
4 changed files with 42 additions and 1 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -96,6 +96,9 @@ class TransactionBuilder {
return;
}
}
for (var i = 0; i < operations.length; i++) {
op = transformOperation(operations[i], op);
}
operations.add(op);
}

View File

@ -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]);
});
}