| 
					
				 | 
			
			
				@@ -14,12 +14,15 @@ import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/disclosure_button.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/filter_menu_item.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_cell_action_sheet.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_list.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_option_editor.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/toolbar/filter_button.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/toolbar/grid_layout.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import 'package:appflowy/plugins/database_view/widgets/row/cells/checklist_cell/checklist_progress_bar.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/widgets/row/cells/select_option_cell/extension.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import 'package:appflowy/plugins/database_view/widgets/row/cells/select_option_cell/select_option_editor.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import 'package:appflowy/plugins/database_view/widgets/row/cells/select_option_cell/text_field.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import 'package:appflowy/plugins/database_view/widgets/row/cells/checklist_cell/checklist_progress_bar.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/widgets/row/row_document.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/widgets/row/cells/date_cell/date_editor.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/widgets/setting/database_setting.dart'; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -37,7 +40,6 @@ import 'package:appflowy/plugins/database_view/grid/presentation/grid_page.dart' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/footer/grid_footer.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_cell.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_editor.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/row/row.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/widgets/row/accessory/cell_accessory.dart'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import 'package:appflowy/plugins/database_view/widgets/row/cells/cells.dart'; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -255,7 +257,7 @@ extension AppFlowyDatabaseTest on WidgetTester { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       matching: find.byWidgetPredicate( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         (widget) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           if (widget is FlowyText) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return widget.title == content; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return widget.text == content; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -279,6 +281,59 @@ extension AppFlowyDatabaseTest on WidgetTester { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     await tapButton(finder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Future<void> tapSelectOptionCellInGrid({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    required int rowIndex, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    required FieldType fieldType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }) async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      fieldType == FieldType.SingleSelect || fieldType == FieldType.MultiSelect, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final findRow = find.byType(GridRow); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final findCell = finderForFieldType(fieldType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final cell = find.descendant( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      of: findRow.at(rowIndex), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      matching: findCell, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await tapButton(cell); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /// The [SelectOptionCellEditor] must be opened first. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Future<void> createOption({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    required String name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }) async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final findEditor = find.byType(SelectOptionCellEditor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expect(findEditor, findsOneWidget); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final findTextField = find.byType(SelectOptionTextField); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expect(findTextField, findsOneWidget); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await enterText(findTextField, name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await pump(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await testTextInput.receiveAction(TextInputAction.done); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await pumpAndSettle(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Future<void> findSelectOptionWithNameInGrid({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    required int rowIndex, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    required String name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }) async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final findRow = find.byType(GridRow); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final option = find.byWidgetPredicate( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (widget) => widget is SelectOptionTag && widget.name == name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final cell = find.descendant( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      of: findRow.at(rowIndex), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      matching: option, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expect(cell, findsOneWidget); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Future<void> openFirstRowDetailPage() async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     await hoverOnFirstRowOfGrid(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -410,11 +465,10 @@ extension AppFlowyDatabaseTest on WidgetTester { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /// Must call [tapTypeOptionButton] first. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Future<void> selectFieldType(FieldType fieldType) async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     final fieldTypeCell = find.byType(FieldTypeCell); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     final fieldTypeButton = find.descendant( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       of: fieldTypeCell, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       matching: find.byWidgetPredicate( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        (widget) => widget is FlowyText && widget.title == fieldType.title(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        (widget) => widget is FlowyText && widget.text == fieldType.title(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     await tapButton(fieldTypeButton); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -493,6 +547,16 @@ extension AppFlowyDatabaseTest on WidgetTester { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     expect(finder, matcher); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Future<void> findSelectOptionEditor(dynamic matcher) async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    final finder = find.byType(SelectOptionCellEditor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expect(finder, matcher); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Future<void> dismissSelectOptionEditor() async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await sendKeyEvent(LogicalKeyboardKey.escape); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await pumpAndSettle(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Future<void> tapCreateRowButtonInGrid() async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     await tapButton(find.byType(GridAddRowButton)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -512,7 +576,7 @@ extension AppFlowyDatabaseTest on WidgetTester { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Future<void> assertRowCountInGridPage(int num) async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     final text = find.byWidgetPredicate( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (widget) => widget is FlowyText && widget.title == rowCountString(num), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (widget) => widget is FlowyText && widget.text == rowCountString(num), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     expect(text, findsOneWidget); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -653,7 +717,7 @@ extension AppFlowyDatabaseTest on WidgetTester { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     final findLayoutButton = find.byWidgetPredicate( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (widget) => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           widget is FlowyText && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          widget.title == DatabaseSettingAction.showLayout.title(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          widget.text == DatabaseSettingAction.showLayout.title(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     final button = find.descendant( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -667,7 +731,7 @@ extension AppFlowyDatabaseTest on WidgetTester { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Future<void> selectDatabaseLayoutType(DatabaseLayoutPB layout) async { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     final findLayoutCell = find.byType(DatabaseViewLayoutCell); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     final findText = find.byWidgetPredicate( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (widget) => widget is FlowyText && widget.title == layout.layoutName(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (widget) => widget is FlowyText && widget.text == layout.layoutName(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     final button = find.descendant( 
			 |