Pressing tab on a todo creates a sub-todo (#1847)

* feat: add tab for lists

* test: tab for lists
This commit is contained in:
Mayur Mahajan 2023-02-13 12:17:52 +05:30 committed by GitHub
parent 9c8753b191
commit 91b942d319
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 121 additions and 2 deletions

View File

@ -14,7 +14,8 @@ ShortcutEventHandler tabHandler = (editorState, event) {
final textNode = textNodes.first;
final previous = textNode.previous;
if (textNode.subtype != BuiltInAttributeKey.bulletedList) {
if (textNode.subtype != BuiltInAttributeKey.bulletedList &&
textNode.subtype != BuiltInAttributeKey.checkbox) {
final transaction = editorState.transaction
..insertText(textNode, selection.end.offset, ' ' * 4);
editorState.apply(transaction);
@ -22,7 +23,8 @@ ShortcutEventHandler tabHandler = (editorState, event) {
}
if (previous == null ||
previous.subtype != BuiltInAttributeKey.bulletedList) {
(previous.subtype != BuiltInAttributeKey.bulletedList &&
previous.subtype != BuiltInAttributeKey.checkbox)) {
return KeyEventResult.ignored;
}

View File

@ -152,4 +152,121 @@ void main() async {
);
});
});
testWidgets('press tab in checkbox/todo list', (tester) async {
const text = 'Welcome to Appflowy 😁';
final editor = tester.editor
..insertTextNode(
text,
attributes: {
BuiltInAttributeKey.subtype: BuiltInAttributeKey.checkbox,
BuiltInAttributeKey.checkbox: false,
},
)
..insertTextNode(
text,
attributes: {
BuiltInAttributeKey.subtype: BuiltInAttributeKey.checkbox,
BuiltInAttributeKey.checkbox: false,
},
)
..insertTextNode(
text,
attributes: {
BuiltInAttributeKey.subtype: BuiltInAttributeKey.checkbox,
BuiltInAttributeKey.checkbox: false,
},
);
await editor.startTesting();
var document = editor.document;
var selection = Selection.single(path: [0], startOffset: 0);
await editor.updateSelection(selection);
await editor.pressLogicKey(LogicalKeyboardKey.tab);
// nothing happens
expect(
editor.documentSelection,
Selection.single(path: [0], startOffset: 0),
);
expect(editor.document.toJson(), document.toJson());
// Before
// [] Welcome to Appflowy 😁
// [] Welcome to Appflowy 😁
// [] Welcome to Appflowy 😁
// After
// [] Welcome to Appflowy 😁
// [] Welcome to Appflowy 😁
// [] Welcome to Appflowy 😁
selection = Selection.single(path: [1], startOffset: 0);
await editor.updateSelection(selection);
await editor.pressLogicKey(LogicalKeyboardKey.tab);
expect(
editor.documentSelection,
Selection.single(path: [0, 0], startOffset: 0),
);
expect(editor.nodeAtPath([0])!.subtype, BuiltInAttributeKey.checkbox);
expect(editor.nodeAtPath([1])!.subtype, BuiltInAttributeKey.checkbox);
expect(editor.nodeAtPath([2]), null);
expect(editor.nodeAtPath([0, 0])!.subtype, BuiltInAttributeKey.checkbox);
selection = Selection.single(path: [1], startOffset: 0);
await editor.updateSelection(selection);
await editor.pressLogicKey(LogicalKeyboardKey.tab);
expect(
editor.documentSelection,
Selection.single(path: [0, 1], startOffset: 0),
);
expect(editor.nodeAtPath([0])!.subtype, BuiltInAttributeKey.checkbox);
expect(editor.nodeAtPath([1]), null);
expect(editor.nodeAtPath([2]), null);
expect(editor.nodeAtPath([0, 0])!.subtype, BuiltInAttributeKey.checkbox);
expect(editor.nodeAtPath([0, 1])!.subtype, BuiltInAttributeKey.checkbox);
// Before
// [] Welcome to Appflowy 😁
// [] Welcome to Appflowy 😁
// [] Welcome to Appflowy 😁
// After
// [] Welcome to Appflowy 😁
// [] Welcome to Appflowy 😁
// [] Welcome to Appflowy 😁
document = editor.document;
selection = Selection.single(path: [0, 0], startOffset: 0);
await editor.updateSelection(selection);
await editor.pressLogicKey(LogicalKeyboardKey.tab);
expect(
editor.documentSelection,
Selection.single(path: [0, 0], startOffset: 0),
);
expect(editor.document.toJson(), document.toJson());
selection = Selection.single(path: [0, 1], startOffset: 0);
await editor.updateSelection(selection);
await editor.pressLogicKey(LogicalKeyboardKey.tab);
expect(
editor.documentSelection,
Selection.single(path: [0, 0, 0], startOffset: 0),
);
expect(
editor.nodeAtPath([0])!.subtype,
BuiltInAttributeKey.checkbox,
);
expect(
editor.nodeAtPath([0, 0])!.subtype,
BuiltInAttributeKey.checkbox,
);
expect(editor.nodeAtPath([0, 1]), null);
expect(
editor.nodeAtPath([0, 0, 0])!.subtype,
BuiltInAttributeKey.checkbox,
);
});
}