Skip to content

Commit d3d929b

Browse files
authored
fix: unable to insert todo list via slash menu (AppFlowy-IO#5980)
* fix: unable to insert todo list via slash menu * fix: unable to insert divider via slash menu * chore: update editor version * chore: update translations * chore: decrease sentry sample rate to 0.1 * fix: integration test
1 parent f7a2d9e commit d3d929b

File tree

7 files changed

+116
-43
lines changed

7 files changed

+116
-43
lines changed

frontend/appflowy_flutter/integration_test/desktop/document/document_with_database_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ Future<void> createInlineDatabase(
176176
await tester.editor.showSlashMenu();
177177
await tester.editor.tapSlashMenuItemWithName(
178178
layout.slashMenuName,
179+
offset: 100,
179180
);
180181
await tester.pumpAndSettle();
181182

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ class _AppFlowyEditorPageState extends State<AppFlowyEditorPage> {
410410
}
411411

412412
List<SelectionMenuItem> _customSlashMenuItems() {
413+
413414
return [
414415
aiWriterSlashMenuItem,
415416
textSlashMenuItem,
@@ -419,7 +420,10 @@ class _AppFlowyEditorPageState extends State<AppFlowyEditorPage> {
419420
imageSlashMenuItem,
420421
bulletedListSlashMenuItem,
421422
numberedListSlashMenuItem,
423+
todoListSlashMenuItem,
424+
dividerSlashMenuItem,
422425
quoteSlashMenuItem,
426+
tableSlashMenuItem,
423427
referencedDocSlashMenuItem,
424428
gridSlashMenuItem(documentBloc),
425429
referencedGridSlashMenuItem,

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/slash_menu/slash_menu_items.dart

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,21 @@ final numberedListSlashMenuItem = SelectionMenuItem(
125125
},
126126
);
127127

128+
// todo list menu item
129+
final todoListSlashMenuItem = SelectionMenuItem(
130+
getName: () => LocaleKeys.document_slashMenu_name_todoList.tr(),
131+
nameBuilder: _slashMenuItemNameBuilder,
132+
icon: (editorState, isSelected, style) => SelectableSvgWidget(
133+
data: FlowySvgs.slash_menu_icon_checkbox_s,
134+
isSelected: isSelected,
135+
style: style,
136+
),
137+
keywords: ['checkbox', 'todo', 'list', 'to-do', 'task'],
138+
handler: (editorState, _, __) {
139+
insertCheckboxAfterSelection(editorState);
140+
},
141+
);
142+
128143
// quote menu item
129144
final quoteSlashMenuItem = SelectionMenuItem(
130145
getName: () => LocaleKeys.document_slashMenu_name_quote.tr(),
@@ -134,12 +149,42 @@ final quoteSlashMenuItem = SelectionMenuItem(
134149
isSelected: isSelected,
135150
style: style,
136151
),
137-
keywords: ['quote', 'refer'],
152+
keywords: ['quote', 'refer', 'blockquote', 'citation'],
138153
handler: (editorState, _, __) {
139154
insertQuoteAfterSelection(editorState);
140155
},
141156
);
142157

158+
// divider menu item
159+
final dividerSlashMenuItem = SelectionMenuItem(
160+
getName: () => LocaleKeys.document_slashMenu_name_divider.tr(),
161+
nameBuilder: _slashMenuItemNameBuilder,
162+
icon: (editorState, isSelected, style) => SelectableSvgWidget(
163+
data: FlowySvgs.slash_menu_icon_divider_s,
164+
isSelected: isSelected,
165+
style: style,
166+
),
167+
keywords: ['divider', 'separator', 'line', 'break', 'horizontal line'],
168+
handler: (editorState, _, __) {
169+
final selection = editorState.selection;
170+
if (selection == null || !selection.isCollapsed) {
171+
return;
172+
}
173+
final path = selection.end.path;
174+
final node = editorState.getNodeAtPath(path);
175+
final delta = node?.delta;
176+
if (node == null || delta == null) {
177+
return;
178+
}
179+
final insertedPath = delta.isEmpty ? path : path.next;
180+
final transaction = editorState.transaction
181+
..insertNode(insertedPath, dividerNode())
182+
..insertNode(insertedPath, paragraphNode())
183+
..afterSelection = Selection.collapsed(Position(path: insertedPath.next));
184+
editorState.apply(transaction);
185+
},
186+
);
187+
143188
// grid & board & calendar menu item
144189
SelectionMenuItem gridSlashMenuItem(DocumentBloc documentBloc) {
145190
return SelectionMenuItem(
@@ -347,7 +392,7 @@ SelectionMenuItem toggleListSlashMenuItem = SelectionMenuItem.node(
347392
isSelected: isSelected,
348393
style: style,
349394
),
350-
keywords: ['collapsed list', 'toggle list', 'list'],
395+
keywords: ['collapsed list', 'toggle list', 'list', 'dropdown'],
351396
nodeBuilder: (editorState, _) => toggleListBlockNode(),
352397
replace: (_, node) => node.delta?.isEmpty ?? false,
353398
);
@@ -361,7 +406,7 @@ SelectionMenuItem emojiSlashMenuItem = SelectionMenuItem(
361406
isSelected: isSelected,
362407
style: style,
363408
),
364-
keywords: ['emoji'],
409+
keywords: ['emoji', 'reaction', 'emoticon'],
365410
handler: (editorState, menuService, context) {
366411
final container = Overlay.of(context);
367412
menuService.dismiss();
@@ -391,6 +436,56 @@ SelectionMenuItem aiWriterSlashMenuItem = SelectionMenuItem.node(
391436
replace: (_, node) => false,
392437
);
393438

439+
// table menu item
440+
SelectionMenuItem tableSlashMenuItem = SelectionMenuItem(
441+
getName: () => LocaleKeys.document_slashMenu_name_table.tr(),
442+
nameBuilder: _slashMenuItemNameBuilder,
443+
icon: (editorState, isSelected, style) => SelectableSvgWidget(
444+
data: FlowySvgs.slash_menu_icon_simple_table_s,
445+
isSelected: isSelected,
446+
style: style,
447+
),
448+
keywords: ['table', 'rows', 'columns', 'data'],
449+
handler: (editorState, _, __) async {
450+
final selection = editorState.selection;
451+
if (selection == null || !selection.isCollapsed) {
452+
return;
453+
}
454+
455+
final currentNode = editorState.getNodeAtPath(selection.end.path);
456+
if (currentNode == null) {
457+
return;
458+
}
459+
460+
final tableNode = TableNode.fromList([
461+
['', ''],
462+
['', ''],
463+
]);
464+
465+
final transaction = editorState.transaction;
466+
final delta = currentNode.delta;
467+
if (delta != null && delta.isEmpty) {
468+
transaction
469+
..insertNode(selection.end.path, tableNode.node)
470+
..deleteNode(currentNode);
471+
transaction.afterSelection = Selection.collapsed(
472+
Position(
473+
path: selection.end.path + [0, 0],
474+
),
475+
);
476+
} else {
477+
transaction.insertNode(selection.end.path.next, tableNode.node);
478+
transaction.afterSelection = Selection.collapsed(
479+
Position(
480+
path: selection.end.path.next + [0, 0],
481+
),
482+
);
483+
}
484+
485+
await editorState.apply(transaction);
486+
},
487+
);
488+
394489
// date or reminder menu item
395490
SelectionMenuItem dateOrReminderSlashMenuItem = SelectionMenuItem(
396491
getName: () => LocaleKeys.document_slashMenu_name_dateOrReminder.tr(),
@@ -400,7 +495,7 @@ SelectionMenuItem dateOrReminderSlashMenuItem = SelectionMenuItem(
400495
isSelected: isSelected,
401496
style: style,
402497
),
403-
keywords: ['insert date', 'date', 'time', 'reminder'],
498+
keywords: ['insert date', 'date', 'time', 'reminder', 'schedule'],
404499
handler: (editorState, menuService, context) =>
405500
insertDateReference(editorState),
406501
);
@@ -439,7 +534,7 @@ SelectionMenuItem fileSlashMenuItem = SelectionMenuItem(
439534
isSelected: isSelected,
440535
style: style,
441536
),
442-
keywords: ['file upload', 'pdf', 'zip', 'archive', 'upload'],
537+
keywords: ['file upload', 'pdf', 'zip', 'archive', 'upload', 'attachment'],
443538
handler: (editorState, _, __) async => editorState.insertEmptyFileBlock(),
444539
);
445540

frontend/appflowy_flutter/lib/startup/tasks/sentry.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class InitSentryTask extends LaunchTask {
2020
await SentryFlutter.init(
2121
(options) {
2222
options.dsn = dsn;
23-
options.tracesSampleRate = 1.0;
24-
options.profilesSampleRate = 1.0;
23+
options.tracesSampleRate = 0.1;
24+
options.profilesSampleRate = 0.1;
2525
},
2626
);
2727
}

frontend/appflowy_flutter/pubspec.lock

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ packages:
5353
dependency: "direct main"
5454
description:
5555
path: "."
56-
ref: "9d3e854"
57-
resolved-ref: "9d3e854f11fd9d732535ce5f5b1c8f41517479a1"
56+
ref: "8e17d14"
57+
resolved-ref: "8e17d1447eea0b57ff92e31dbe88796ce759fb37"
5858
url: "https://github.com/AppFlowy-IO/appflowy-editor.git"
5959
source: git
60-
version: "3.1.0"
60+
version: "3.2.0"
6161
appflowy_editor_plugins:
6262
dependency: "direct main"
6363
description:
@@ -808,7 +808,7 @@ packages:
808808
source: hosted
809809
version: "0.6.5"
810810
flutter_svg:
811-
dependency: "direct main"
811+
dependency: transitive
812812
description:
813813
name: flutter_svg
814814
sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c
@@ -1083,14 +1083,6 @@ packages:
10831083
url: "https://pub.dev"
10841084
source: hosted
10851085
version: "0.19.0"
1086-
intl_utils:
1087-
dependency: transitive
1088-
description:
1089-
name: intl_utils
1090-
sha256: c2b1f5c72c25512cbeef5ab015c008fc50fe7e04813ba5541c25272300484bf4
1091-
url: "https://pub.dev"
1092-
source: hosted
1093-
version: "2.8.7"
10941086
io:
10951087
dependency: transitive
10961088
description:
@@ -1116,7 +1108,7 @@ packages:
11161108
source: hosted
11171109
version: "0.7.0"
11181110
isolates:
1119-
dependency: "direct main"
1111+
dependency: transitive
11201112
description:
11211113
name: isolates
11221114
sha256: ce89e4141b27b877326d3715be2dceac7a7ba89f3229785816d2d318a75ddf28
@@ -1236,7 +1228,7 @@ packages:
12361228
source: hosted
12371229
version: "0.1.5"
12381230
logger:
1239-
dependency: "direct main"
1231+
dependency: transitive
12401232
description:
12411233
name: logger
12421234
sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32"
@@ -1475,14 +1467,6 @@ packages:
14751467
url: "https://pub.dev"
14761468
source: hosted
14771469
version: "3.11.1"
1478-
pdf_widget_wrapper:
1479-
dependency: transitive
1480-
description:
1481-
name: pdf_widget_wrapper
1482-
sha256: c930860d987213a3d58c7ec3b7ecf8085c3897f773e8dc23da9cae60a5d6d0f5
1483-
url: "https://pub.dev"
1484-
source: hosted
1485-
version: "1.0.4"
14861470
percent_indicator:
14871471
dependency: "direct main"
14881472
description:
@@ -1603,14 +1587,6 @@ packages:
16031587
url: "https://pub.dev"
16041588
source: hosted
16051589
version: "2.1.0"
1606-
printing:
1607-
dependency: transitive
1608-
description:
1609-
name: printing
1610-
sha256: cc4b256a5a89d5345488e3318897b595867f5181b8c5ed6fc63bfa5f2044aec3
1611-
url: "https://pub.dev"
1612-
source: hosted
1613-
version: "5.13.1"
16141590
process:
16151591
dependency: transitive
16161592
description:

frontend/appflowy_flutter/pubspec.yaml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ dependencies:
7777
linked_scroll_controller: ^0.2.0
7878
hotkey_manager: ^0.1.7
7979
fixnum: ^1.1.0
80-
flutter_svg: ^2.0.7
8180
protobuf: ^3.1.0
8281
collection: ^1.17.1
8382
bloc: ^8.1.2
@@ -133,10 +132,8 @@ dependencies:
133132
auto_size_text_field: ^2.2.3
134133
reorderable_tabbar: ^1.0.6
135134
shimmer: ^3.0.0
136-
isolates: ^3.0.3+8
137135
markdown_widget: ^2.3.2+6
138136
markdown:
139-
logger: ^2.4.0
140137

141138
# Desktop Drop uses Cross File (XFile) data type
142139
desktop_drop: ^0.4.4
@@ -193,7 +190,7 @@ dependency_overrides:
193190
appflowy_editor:
194191
git:
195192
url: https://github.com/AppFlowy-IO/appflowy-editor.git
196-
ref: "9d3e854"
193+
ref: "8e17d14"
197194

198195
appflowy_editor_plugins:
199196
git:

frontend/resources/translations/en.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,7 @@
13271327
"addOption": "Add option",
13281328
"editProperty": "Edit property",
13291329
"newProperty": "New property",
1330-
"openRowDocument": "Open document",
1330+
"openRowDocument": "Open as a page",
13311331
"deleteFieldPromptMessage": "Are you sure? This property will be deleted",
13321332
"clearFieldPromptMessage": "Are you sure? All cells in this column will be emptied",
13331333
"newColumn": "New Column",
@@ -1471,7 +1471,7 @@
14711471
"image": "Image",
14721472
"bulletedList": "Bulleted List",
14731473
"numberedList": "Numbered List",
1474-
"checkbox": "Checkbox",
1474+
"todoList": "To-do List",
14751475
"doc": "Doc",
14761476
"linkedDoc": "Link to page",
14771477
"grid": "Grid",

0 commit comments

Comments
 (0)