Explorar el Código

fix: using freeze to refactor the FieldInfo class (#3152)

Nathan.fooo hace 1 año
padre
commit
0c9935ccf2
Se han modificado 45 ficheros con 200 adiciones y 173 borrados
  1. 2 2
      frontend/appflowy_flutter/lib/plugins/database_view/application/cell/cell_controller.dart
  2. 5 5
      frontend/appflowy_flutter/lib/plugins/database_view/application/cell/cell_service.dart
  3. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart
  4. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/application/defines.dart
  5. 15 80
      frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_controller.dart
  6. 71 0
      frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_info.dart
  7. 0 1
      frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/type_option_data_controller.dart
  8. 7 7
      frontend/appflowy_flutter/lib/plugins/database_view/application/row/row_cache.dart
  9. 8 7
      frontend/appflowy_flutter/lib/plugins/database_view/application/setting/group_bloc.dart
  10. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/application/setting/property_bloc.dart
  11. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/board/application/board_bloc.dart
  12. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_bloc.dart
  13. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/unschedule_event_bloc.dart
  14. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/filter/filter_create_bloc.dart
  15. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/filter/filter_menu_bloc.dart
  16. 10 9
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_bloc.dart
  17. 2 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_header_bloc.dart
  18. 7 7
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/row/row_bloc.dart
  19. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/sort/sort_create_bloc.dart
  20. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/sort/sort_editor_bloc.dart
  21. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/sort/sort_menu_bloc.dart
  22. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/application/sort/util.dart
  23. 2 2
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/layout/layout.dart
  24. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/checkbox.dart
  25. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/checklist/checklist.dart
  26. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/choicechip.dart
  27. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/select_option/select_option.dart
  28. 2 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/create_filter_list.dart
  29. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/filter_info.dart
  30. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/grid_header.dart
  31. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/builder.dart
  32. 3 3
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/row.dart
  33. 1 0
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/create_sort_list.dart
  34. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_info.dart
  35. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/widgets/card/bloc/date_card_cell_bloc.dart
  36. 3 2
      frontend/appflowy_flutter/lib/plugins/database_view/widgets/field/grid_property.dart
  37. 3 1
      frontend/appflowy_flutter/lib/plugins/database_view/widgets/group/database_group.dart
  38. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/date_cell/date_cell_bloc.dart
  39. 1 1
      frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/row_property.dart
  40. 1 0
      frontend/appflowy_flutter/test/bloc_test/board_test/util.dart
  41. 2 1
      frontend/appflowy_flutter/test/bloc_test/grid_test/util.dart
  42. 7 7
      frontend/appflowy_tauri/src-tauri/Cargo.toml
  43. 10 10
      frontend/rust-lib/Cargo.lock
  44. 13 13
      frontend/rust-lib/Cargo.toml
  45. 3 1
      frontend/rust-lib/flowy-database2/src/services/database/database_editor.rs

+ 2 - 2
frontend/appflowy_flutter/lib/plugins/database_view/application/cell/cell_controller.dart

@@ -1,4 +1,5 @@
 import 'dart:async';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_listener.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_meta_listener.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_service.dart';
@@ -8,7 +9,6 @@ import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
 import 'package:dartz/dartz.dart';
 import 'package:equatable/equatable.dart';
 import 'package:flutter/foundation.dart';
-import '../field/field_controller.dart';
 import '../field/field_service.dart';
 import '../field/type_option/type_option_context.dart';
 import 'cell_listener.dart';
@@ -104,7 +104,7 @@ class CellController<T, D> extends Equatable {
     );
 
     // Only the primary can listen on the row meta changes.
-    if (_cellContext.fieldInfo.isPrimary) {
+    if (_cellContext.fieldInfo.field.isPrimary) {
       _rowMetaListener?.start(
         callback: (newRowMeta) {
           _cellContext = _cellContext.copyWith(rowMeta: newRowMeta);

+ 5 - 5
frontend/appflowy_flutter/lib/plugins/database_view/application/cell/cell_service.dart

@@ -15,7 +15,7 @@ import 'package:flutter/foundation.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';
 import 'dart:convert' show utf8;
 
-import '../field/field_controller.dart';
+import '../field/field_info.dart';
 import '../row/row_service.dart';
 part 'cell_service.freezed.dart';
 part 'cell_data_loader.dart';
@@ -62,14 +62,14 @@ class DatabaseCellContext with _$DatabaseCellContext {
 
   String get rowId => rowMeta.id;
 
-  String get fieldId => fieldInfo.id;
+  String get fieldId => fieldInfo.field.id;
 
-  FieldType get fieldType => fieldInfo.fieldType;
+  FieldType get fieldType => fieldInfo.field.fieldType;
 
   ValueKey key() {
-    return ValueKey("${rowMeta.id}$fieldId${fieldInfo.fieldType}");
+    return ValueKey("${rowMeta.id}$fieldId${fieldInfo.field.fieldType}");
   }
 
   /// Only the primary field can have an emoji.
-  String? get emoji => fieldInfo.isPrimary ? rowMeta.icon : null;
+  String? get emoji => fieldInfo.field.isPrimary ? rowMeta.icon : null;
 }

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart

@@ -16,6 +16,7 @@ import 'package:dartz/dartz.dart';
 import 'package:flutter/material.dart';
 import 'database_view_service.dart';
 import 'defines.dart';
+import 'field/field_info.dart';
 import 'layout/layout_service.dart';
 import 'layout/layout_setting_listener.dart';
 import 'row/row_cache.dart';

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/application/defines.dart

@@ -7,7 +7,7 @@ import 'package:dartz/dartz.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';
 
 import '../grid/presentation/widgets/filter/filter_info.dart';
-import 'field/field_controller.dart';
+import 'field/field_info.dart';
 import 'row/row_cache.dart';
 import 'row/row_service.dart';
 

+ 15 - 80
frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_controller.dart

@@ -19,6 +19,7 @@ import '../setting/setting_listener.dart';
 import '../setting/setting_service.dart';
 import '../sort/sort_listener.dart';
 import '../sort/sort_service.dart';
+import 'field_info.dart';
 import 'field_listener.dart';
 
 class _GridFieldNotifier extends ChangeNotifier {
@@ -438,12 +439,18 @@ class FieldController {
   }
 
   void _updateFieldInfos() {
+    final List<FieldInfo> newFieldInfos = [];
     for (final field in _fieldNotifier.fieldInfos) {
-      field._isGroupField = _groupConfigurationByFieldId[field.id] != null;
-      field._hasFilter = _filterPBByFieldId[field.id] != null;
-      field._hasSort = _sortPBByFieldId[field.id] != null;
+      newFieldInfos.add(
+        field.copyWith(
+          isGroupField: _groupConfigurationByFieldId[field.id] != null,
+          hasFilter: _filterPBByFieldId[field.id] != null,
+          hasSort: _sortPBByFieldId[field.id] != null,
+        ),
+      );
     }
-    _fieldNotifier.notify();
+
+    _fieldNotifier.fieldInfos = newFieldInfos;
   }
 
   Future<void> dispose() async {
@@ -488,7 +495,7 @@ class FieldController {
           }
 
           _fieldNotifier.fieldInfos =
-              newFields.map((field) => FieldInfo(field: field)).toList();
+              newFields.map((field) => FieldInfo.initial(field)).toList();
           _loadFilters();
           _loadSorts();
           _updateFieldInfos();
@@ -652,7 +659,7 @@ class FieldController {
     }
     final List<FieldInfo> newFieldInfos = fieldInfos;
     for (final indexField in insertedFields) {
-      final fieldInfo = FieldInfo(field: indexField.field_1);
+      final fieldInfo = FieldInfo.initial(indexField.field_1);
       if (newFieldInfos.length > indexField.index) {
         newFieldInfos.insert(indexField.index, fieldInfo);
       } else {
@@ -674,7 +681,7 @@ class FieldController {
           newFields.indexWhere((field) => field.id == updatedFieldPB.id);
       if (index != -1) {
         newFields.removeAt(index);
-        final fieldInfo = FieldInfo(field: updatedFieldPB);
+        final fieldInfo = FieldInfo.initial(updatedFieldPB);
         newFields.insert(index, fieldInfo);
         updatedFields.add(fieldInfo);
       }
@@ -693,7 +700,7 @@ class RowCacheDependenciesImpl extends RowFieldsDelegate with RowLifeCycle {
   RowCacheDependenciesImpl(FieldController cache) : _fieldController = cache;
 
   @override
-  UnmodifiableListView<FieldInfo> get fields =>
+  UnmodifiableListView<FieldInfo> get fieldInfos =>
       UnmodifiableListView(_fieldController.fieldInfos);
 
   @override
@@ -729,75 +736,3 @@ FieldInfo? _findFieldInfo({
     return null;
   }
 }
-
-class FieldInfo {
-  final FieldPB _field;
-  bool _isGroupField = false;
-
-  bool _hasFilter = false;
-
-  bool _hasSort = false;
-
-  String get id => _field.id;
-
-  FieldType get fieldType => _field.fieldType;
-
-  bool get visibility => _field.visibility;
-
-  double get width => _field.width.toDouble();
-
-  bool get isPrimary => _field.isPrimary;
-
-  String get name => _field.name;
-
-  FieldPB get field => _field;
-
-  bool get isGroupField => _isGroupField;
-
-  bool get hasFilter => _hasFilter;
-
-  bool get canBeGroup {
-    switch (_field.fieldType) {
-      case FieldType.URL:
-      case FieldType.Checkbox:
-      case FieldType.MultiSelect:
-      case FieldType.SingleSelect:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  bool get canCreateFilter {
-    if (hasFilter) return false;
-
-    switch (_field.fieldType) {
-      case FieldType.Checkbox:
-      case FieldType.MultiSelect:
-      case FieldType.RichText:
-      case FieldType.SingleSelect:
-      case FieldType.Checklist:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  bool get canCreateSort {
-    if (_hasSort) return false;
-
-    switch (_field.fieldType) {
-      case FieldType.RichText:
-      case FieldType.Checkbox:
-      case FieldType.Number:
-      case FieldType.DateTime:
-      case FieldType.SingleSelect:
-      case FieldType.MultiSelect:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  FieldInfo({required FieldPB field}) : _field = field;
-}

+ 71 - 0
frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_info.dart

@@ -0,0 +1,71 @@
+import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
+import 'package:freezed_annotation/freezed_annotation.dart';
+part 'field_info.freezed.dart';
+
+@freezed
+class FieldInfo with _$FieldInfo {
+  const FieldInfo._();
+
+  const factory FieldInfo({
+    required FieldPB field,
+    required bool isGroupField,
+    required bool hasFilter,
+    required bool hasSort,
+  }) = _FieldInfo;
+
+  String get id => field.id;
+
+  FieldType get fieldType => field.fieldType;
+
+  String get name => field.name;
+
+  factory FieldInfo.initial(FieldPB field) => FieldInfo(
+        field: field,
+        hasFilter: false,
+        hasSort: false,
+        isGroupField: false,
+      );
+
+  bool get canBeGroup {
+    switch (field.fieldType) {
+      case FieldType.URL:
+      case FieldType.Checkbox:
+      case FieldType.MultiSelect:
+      case FieldType.SingleSelect:
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  bool get canCreateFilter {
+    if (hasFilter) return false;
+
+    switch (field.fieldType) {
+      case FieldType.Checkbox:
+      case FieldType.MultiSelect:
+      case FieldType.RichText:
+      case FieldType.SingleSelect:
+      case FieldType.Checklist:
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  bool get canCreateSort {
+    if (hasSort) return false;
+
+    switch (field.fieldType) {
+      case FieldType.RichText:
+      case FieldType.Checkbox:
+      case FieldType.Number:
+      case FieldType.DateTime:
+      case FieldType.SingleSelect:
+      case FieldType.MultiSelect:
+        return true;
+      default:
+        return false;
+    }
+  }
+}

+ 0 - 1
frontend/appflowy_flutter/lib/plugins/database_view/application/field/type_option/type_option_data_controller.dart

@@ -1,4 +1,3 @@
-import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
 import 'package:appflowy_backend/dispatch/dispatch.dart';
 import 'package:flowy_infra/notifier.dart';
 import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';

+ 7 - 7
frontend/appflowy_flutter/lib/plugins/database_view/application/row/row_cache.dart

@@ -1,4 +1,5 @@
 import 'dart:collection';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy_backend/dispatch/dispatch.dart';
 import 'package:appflowy_backend/log.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
@@ -6,7 +7,6 @@ import 'package:flutter/foundation.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';
 
 import '../cell/cell_service.dart';
-import '../field/field_controller.dart';
 import 'row_list.dart';
 import 'row_service.dart';
 part 'row_cache.freezed.dart';
@@ -15,7 +15,7 @@ typedef RowUpdateCallback = void Function();
 
 /// A delegate that provides the fields of the row.
 abstract class RowFieldsDelegate {
-  UnmodifiableListView<FieldInfo> get fields;
+  UnmodifiableListView<FieldInfo> get fieldInfos;
   void onFieldsChanged(void Function(List<FieldInfo>) callback);
 }
 
@@ -244,12 +244,12 @@ class RowCache {
   CellContextByFieldId _makeCells(RowMetaPB rowMeta) {
     // ignore: prefer_collection_literals
     final cellContextMap = CellContextByFieldId();
-    for (final field in _fieldDelegate.fields) {
-      if (field.visibility) {
-        cellContextMap[field.id] = DatabaseCellContext(
+    for (final fieldInfo in _fieldDelegate.fieldInfos) {
+      if (fieldInfo.field.visibility) {
+        cellContextMap[fieldInfo.id] = DatabaseCellContext(
           rowMeta: rowMeta,
           viewId: viewId,
-          fieldInfo: field,
+          fieldInfo: fieldInfo,
         );
       }
     }
@@ -259,7 +259,7 @@ class RowCache {
   RowInfo buildGridRow(RowMetaPB rowMetaPB) {
     return RowInfo(
       viewId: viewId,
-      fields: _fieldDelegate.fields,
+      fields: _fieldDelegate.fieldInfos,
       rowId: rowMetaPB.id,
       rowMeta: rowMetaPB,
     );

+ 8 - 7
frontend/appflowy_flutter/lib/plugins/database_view/application/setting/group_bloc.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy_backend/log.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
@@ -26,8 +27,8 @@ class DatabaseGroupBloc extends Bloc<DatabaseGroupEvent, DatabaseGroupState> {
           initial: () {
             _startListening();
           },
-          didReceiveFieldUpdate: (fieldContexts) {
-            emit(state.copyWith(fieldContexts: fieldContexts));
+          didReceiveFieldUpdate: (fieldInfos) {
+            emit(state.copyWith(fieldInfos: fieldInfos));
           },
           setGroupByField: (String fieldId, FieldType fieldType) async {
             final result = await _groupBackendSvc.groupByField(
@@ -50,8 +51,8 @@ class DatabaseGroupBloc extends Bloc<DatabaseGroupEvent, DatabaseGroupState> {
   }
 
   void _startListening() {
-    _onFieldsFn = (fieldContexts) =>
-        add(DatabaseGroupEvent.didReceiveFieldUpdate(fieldContexts));
+    _onFieldsFn = (fieldInfos) =>
+        add(DatabaseGroupEvent.didReceiveFieldUpdate(fieldInfos));
     _fieldController.addListener(
       onReceiveFields: _onFieldsFn,
       listenWhen: () => !isClosed,
@@ -75,15 +76,15 @@ class DatabaseGroupEvent with _$DatabaseGroupEvent {
 class DatabaseGroupState with _$DatabaseGroupState {
   const factory DatabaseGroupState({
     required String viewId,
-    required List<FieldInfo> fieldContexts,
+    required List<FieldInfo> fieldInfos,
   }) = _DatabaseGroupState;
 
   factory DatabaseGroupState.initial(
     String viewId,
-    List<FieldInfo> fieldContexts,
+    List<FieldInfo> fieldInfos,
   ) =>
       DatabaseGroupState(
         viewId: viewId,
-        fieldContexts: fieldContexts,
+        fieldInfos: fieldInfos,
       );
 }

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/application/setting/property_bloc.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy_backend/log.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/board/application/board_bloc.dart

@@ -2,6 +2,7 @@ import 'dart:async';
 import 'dart:collection';
 
 import 'package:appflowy/plugins/database_view/application/defines.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_service.dart';
 import 'package:appflowy_board/appflowy_board.dart';
 import 'package:dartz/dartz.dart';

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/calendar_bloc.dart

@@ -1,6 +1,7 @@
 import 'package:appflowy/plugins/database_view/application/cell/cell_service.dart';
 import 'package:appflowy/plugins/database_view/application/defines.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_service.dart';
 import 'package:appflowy_backend/dispatch/dispatch.dart';
 import 'package:appflowy_backend/log.dart';

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/calendar/application/unschedule_event_bloc.dart

@@ -1,5 +1,6 @@
 import 'package:appflowy/plugins/database_view/application/cell/cell_service.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_service.dart';
 import 'package:appflowy_backend/dispatch/dispatch.dart';
 import 'package:appflowy_backend/log.dart';

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/filter/filter_create_bloc.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/filter/filter_service.dart';
 import 'package:dartz/dartz.dart';
 import 'package:appflowy_backend/protobuf/flowy-error/errors.pbserver.dart';

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/filter/filter_menu_bloc.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/filter_info.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';

+ 10 - 9
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_bloc.dart

@@ -1,5 +1,6 @@
 import 'dart:async';
 import 'package:appflowy/plugins/database_view/application/defines.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_cache.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_service.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/filter_info.dart';
@@ -10,7 +11,6 @@ import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';
-import '../../application/field/field_controller.dart';
 import '../../application/database_controller.dart';
 import 'dart:collection';
 
@@ -200,24 +200,25 @@ class GridState with _$GridState {
 }
 
 class GridFieldEquatable extends Equatable {
-  final List<FieldInfo> _fields;
+  final List<FieldInfo> _fieldInfos;
   const GridFieldEquatable(
-    List<FieldInfo> fields,
-  ) : _fields = fields;
+    List<FieldInfo> fieldInfos,
+  ) : _fieldInfos = fieldInfos;
 
   @override
   List<Object?> get props {
-    if (_fields.isEmpty) {
+    if (_fieldInfos.isEmpty) {
       return [];
     }
 
     return [
-      _fields.length,
-      _fields
-          .map((field) => field.width)
+      _fieldInfos.length,
+      _fieldInfos
+          .map((fieldInfo) => fieldInfo.field.width)
           .reduce((value, element) => value + element),
     ];
   }
 
-  UnmodifiableListView<FieldInfo> get value => UnmodifiableListView(_fields);
+  UnmodifiableListView<FieldInfo> get value =>
+      UnmodifiableListView(_fieldInfos);
 }

+ 2 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/grid_header_bloc.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy_backend/log.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
@@ -26,7 +27,7 @@ class GridHeaderBloc extends Bloc<GridHeaderEvent, GridHeaderState> {
             emit(
               state.copyWith(
                 fields: value.fields
-                    .where((element) => element.visibility)
+                    .where((element) => element.field.visibility)
                     .toList(),
               ),
             );

+ 7 - 7
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/row/row_bloc.dart

@@ -1,4 +1,5 @@
 import 'dart:collection';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_listener.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
 import 'package:equatable/equatable.dart';
@@ -7,7 +8,6 @@ import 'package:freezed_annotation/freezed_annotation.dart';
 import 'dart:async';
 
 import '../../../application/cell/cell_service.dart';
-import '../../../application/field/field_controller.dart';
 import '../../../application/row/row_cache.dart';
 import '../../../application/row/row_controller.dart';
 import '../../../application/row/row_service.dart';
@@ -119,16 +119,16 @@ class RowState with _$RowState {
 }
 
 class GridCellEquatable extends Equatable {
-  final FieldInfo _fieldContext;
+  final FieldInfo _fieldInfo;
 
-  const GridCellEquatable(FieldInfo field) : _fieldContext = field;
+  const GridCellEquatable(FieldInfo field) : _fieldInfo = field;
 
   @override
   List<Object?> get props => [
-        _fieldContext.id,
-        _fieldContext.fieldType,
-        _fieldContext.visibility,
-        _fieldContext.width,
+        _fieldInfo.id,
+        _fieldInfo.fieldType,
+        _fieldInfo.field.visibility,
+        _fieldInfo.field.width,
       ];
 }
 

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/sort/sort_create_bloc.dart

@@ -1,3 +1,4 @@
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:dartz/dartz.dart';
 import 'package:appflowy_backend/protobuf/flowy-error/errors.pbserver.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/sort_entities.pbenum.dart';

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/sort/sort_editor_bloc.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/sort/sort_service.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/sort/sort_info.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/sort_entities.pbenum.dart';

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/sort/sort_menu_bloc.dart

@@ -1,3 +1,4 @@
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';
 import 'dart:async';

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/application/sort/util.dart

@@ -1,4 +1,4 @@
-import '../../../application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 
 List<FieldInfo> getCreatableSorts(List<FieldInfo> fieldInfos) {
   final List<FieldInfo> creatableFields = List.from(fieldInfos);

+ 2 - 2
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/layout/layout.dart

@@ -1,4 +1,4 @@
-import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'sizes.dart';
 
 class GridLayout {
@@ -6,7 +6,7 @@ class GridLayout {
     if (fields.isEmpty) return 0;
 
     final fieldsWidth = fields
-        .map((field) => field.width.toDouble())
+        .map((fieldInfo) => fieldInfo.field.width.toDouble())
         .reduce((value, element) => value + element);
 
     return fieldsWidth +

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/checkbox.dart

@@ -109,7 +109,7 @@ class _CheckboxFilterEditorState extends State<CheckboxFilterEditor> {
         children: [
           Expanded(
             child: FlowyText(
-              state.filterInfo.fieldInfo.name,
+              state.filterInfo.fieldInfo.field.name,
               overflow: TextOverflow.ellipsis,
             ),
           ),

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/checklist/checklist.dart

@@ -93,7 +93,7 @@ class ChecklistState extends State<ChecklistFilterEditor> {
               children: [
                 Expanded(
                   child: FlowyText(
-                    state.filterInfo.fieldInfo.name,
+                    state.filterInfo.fieldInfo.field.name,
                     overflow: TextOverflow.ellipsis,
                   ),
                 ),

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/choicechip.dart

@@ -39,7 +39,7 @@ class ChoiceChipButton extends StatelessWidget {
         decoration: decoration,
         useIntrinsicWidth: true,
         text: FlowyText(
-          filterInfo.fieldInfo.name,
+          filterInfo.fieldInfo.field.name,
           color: AFThemeExtension.of(context).textColor,
         ),
         margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/choicechip/select_option/select_option.dart

@@ -144,7 +144,7 @@ class _SelectOptionFilterEditorState extends State<SelectOptionFilterEditor> {
         children: [
           Expanded(
             child: FlowyText(
-              state.filterInfo.fieldInfo.name,
+              state.filterInfo.fieldInfo.field.name,
               overflow: TextOverflow.ellipsis,
             ),
           ),

+ 2 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/create_filter_list.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/generated/locale_keys.g.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/layout/sizes.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart';
 import 'package:easy_localization/easy_localization.dart';
@@ -161,7 +162,7 @@ class GridFilterPropertyCell extends StatelessWidget {
     return FlowyButton(
       hoverColor: AFThemeExtension.of(context).lightGreyHover,
       text: FlowyText.medium(
-        fieldInfo.name,
+        fieldInfo.field.name,
         color: AFThemeExtension.of(context).textColor,
       ),
       onTap: () => onTap(fieldInfo),

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/filter/filter_info.dart

@@ -1,4 +1,4 @@
-import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/checkbox_filter.pb.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/checklist_filter.pb.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/date_filter.pb.dart';

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/grid_header.dart

@@ -96,7 +96,7 @@ class _GridHeaderState extends State<_GridHeader> {
       buildWhen: (previous, current) => previous.fields != current.fields,
       builder: (context, state) {
         final cells = state.fields
-            .where((field) => field.visibility)
+            .where((fieldInfo) => fieldInfo.field.visibility)
             .map(
               (field) => FieldContext(
                 viewId: widget.viewId,

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/header/type_option/builder.dart

@@ -1,6 +1,6 @@
 import 'dart:typed_data';
 
-import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
 import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_data_controller.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/checkbox_entities.pb.dart';

+ 3 - 3
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/row/row.dart

@@ -276,13 +276,13 @@ class RowContent extends StatelessWidget {
         final GridCellWidget child = builder.build(cellId);
 
         return CellContainer(
-          width: cellId.fieldInfo.width.toDouble(),
-          isPrimary: cellId.fieldInfo.isPrimary,
+          width: cellId.fieldInfo.field.width.toDouble(),
+          isPrimary: cellId.fieldInfo.field.isPrimary,
           cellContainerNotifier: CellContainerNotifier(child),
           accessoryBuilder: (buildContext) {
             final builder = child.accessoryBuilder;
             final List<GridCellAccessoryBuilder> accessories = [];
-            if (cellId.fieldInfo.isPrimary) {
+            if (cellId.fieldInfo.field.isPrimary) {
               accessories.add(
                 GridCellAccessoryBuilder(
                   builder: (key) => PrimaryCellAccessory(

+ 1 - 0
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/create_sort_list.dart

@@ -1,5 +1,6 @@
 import 'package:appflowy/generated/locale_keys.g.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/grid/application/sort/sort_create_bloc.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/layout/sizes.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart';

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/grid/presentation/widgets/sort/sort_info.dart

@@ -1,4 +1,4 @@
-import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/sort_entities.pb.dart';
 
 class SortInfo {

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/widgets/card/bloc/date_card_cell_bloc.dart

@@ -1,10 +1,10 @@
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/date_entities.pb.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';
 import 'dart:async';
 
 import '../../../application/cell/cell_controller_builder.dart';
-import '../../../application/field/field_controller.dart';
 part 'date_card_cell_bloc.freezed.dart';
 
 class DateCardCellBloc extends Bloc<DateCardCellEvent, DateCardCellState> {

+ 3 - 2
frontend/appflowy_flutter/lib/plugins/database_view/widgets/field/grid_property.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
 import 'package:appflowy/plugins/database_view/application/setting/property_bloc.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart';
@@ -95,7 +96,7 @@ class _GridPropertyCellState extends State<_GridPropertyCell> {
   @override
   Widget build(BuildContext context) {
     final checkmark = svgWidget(
-      widget.fieldInfo.visibility ? 'home/show' : 'home/hide',
+      widget.fieldInfo.field.visibility ? 'home/show' : 'home/hide',
       color: Theme.of(context).iconTheme.color,
     );
 
@@ -130,7 +131,7 @@ class _GridPropertyCellState extends State<_GridPropertyCell> {
             context.read<DatabasePropertyBloc>().add(
                   DatabasePropertyEvent.setFieldVisibility(
                     widget.fieldInfo.id,
-                    !widget.fieldInfo.visibility,
+                    !widget.fieldInfo.field.visibility,
                   ),
                 );
           },

+ 3 - 1
frontend/appflowy_flutter/lib/plugins/database_view/widgets/group/database_group.dart

@@ -1,4 +1,5 @@
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/setting/group_bloc.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/layout/sizes.dart';
 import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart';
@@ -30,8 +31,9 @@ class DatabaseGroupList extends StatelessWidget {
         fieldController: fieldController,
       )..add(const DatabaseGroupEvent.initial()),
       child: BlocBuilder<DatabaseGroupBloc, DatabaseGroupState>(
+        buildWhen: (previous, current) => true,
         builder: (context, state) {
-          final cells = state.fieldContexts.map((fieldInfo) {
+          final cells = state.fieldInfos.map((fieldInfo) {
             Widget cell = _GridGroupCell(
               fieldInfo: fieldInfo,
               onSelected: () => onDismissed(),

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/cells/date_cell/date_cell_bloc.dart

@@ -1,7 +1,7 @@
 import 'dart:async';
 
 import 'package:appflowy/plugins/database_view/application/cell/cell_controller_builder.dart';
-import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy_backend/protobuf/flowy-database2/date_entities.pb.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';

+ 1 - 1
frontend/appflowy_flutter/lib/plugins/database_view/widgets/row/row_property.dart

@@ -44,7 +44,7 @@ class RowPropertyList extends StatelessWidget {
             // The rest of the fields are displayed in the order of the field
             // list
             ...state.cells
-                .where((element) => !element.fieldInfo.isPrimary)
+                .where((element) => !element.fieldInfo.field.isPrimary)
                 .map(
                   (cell) => _PropertyCell(
                     cellContext: cell,

+ 1 - 0
frontend/appflowy_flutter/test/bloc_test/board_test/util.dart

@@ -2,6 +2,7 @@ import 'package:appflowy/plugins/database_view/application/cell/cell_controller.
 import 'package:appflowy/plugins/database_view/application/cell/cell_controller_builder.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_editor_bloc.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
 import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
 import 'package:appflowy/plugins/database_view/application/row/row_cache.dart';

+ 2 - 1
frontend/appflowy_flutter/test/bloc_test/grid_test/util.dart

@@ -2,6 +2,7 @@ import 'package:appflowy/plugins/database_view/application/cell/cell_controller.
 import 'package:appflowy/plugins/database_view/application/cell/cell_controller_builder.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_editor_bloc.dart';
+import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
 import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
 import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
 import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_service.dart';
@@ -149,7 +150,7 @@ Future<FieldEditorBloc> createFieldEditor({
         field: data.field_2,
       );
       return FieldEditorBloc(
-        isGroupField: FieldInfo(field: data.field_2).isGroupField,
+        isGroupField: FieldInfo.initial(data.field_2).isGroupField,
         loader: loader,
         field: data.field_2,
       );

+ 7 - 7
frontend/appflowy_tauri/src-tauri/Cargo.toml

@@ -34,13 +34,13 @@ default = ["custom-protocol"]
 custom-protocol = ["tauri/custom-protocol"]
 
 [patch.crates-io]
-collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-persistence = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-appflowy-integrate = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
+collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-persistence = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+appflowy-integrate = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
 
 #collab = { path = "../../../../AppFlowy-Collab/collab" }
 #collab-folder = { path = "../../../../AppFlowy-Collab/collab-folder" }

+ 10 - 10
frontend/rust-lib/Cargo.lock

@@ -96,7 +96,7 @@ checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
 [[package]]
 name = "appflowy-integrate"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "anyhow",
  "collab",
@@ -925,7 +925,7 @@ dependencies = [
 [[package]]
 name = "collab"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "anyhow",
  "bytes",
@@ -943,7 +943,7 @@ dependencies = [
 [[package]]
 name = "collab-client-ws"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "bytes",
  "collab-sync",
@@ -961,7 +961,7 @@ dependencies = [
 [[package]]
 name = "collab-database"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "anyhow",
  "async-trait",
@@ -988,7 +988,7 @@ dependencies = [
 [[package]]
 name = "collab-derive"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1000,7 +1000,7 @@ dependencies = [
 [[package]]
 name = "collab-document"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "anyhow",
  "collab",
@@ -1019,7 +1019,7 @@ dependencies = [
 [[package]]
 name = "collab-folder"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "anyhow",
  "chrono",
@@ -1039,7 +1039,7 @@ dependencies = [
 [[package]]
 name = "collab-persistence"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "bincode",
  "chrono",
@@ -1059,7 +1059,7 @@ dependencies = [
 [[package]]
 name = "collab-plugins"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "anyhow",
  "async-trait",
@@ -1089,7 +1089,7 @@ dependencies = [
 [[package]]
 name = "collab-sync"
 version = "0.1.0"
-source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=aac4e56#aac4e56bdb6a61598697283582d369a7af85d9c8"
+source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=ba963f#ba963fa299d294e5b2cafd940b9eaa8520280b7b"
 dependencies = [
  "bytes",
  "collab",

+ 13 - 13
frontend/rust-lib/Cargo.toml

@@ -38,17 +38,17 @@ opt-level = 3
 incremental = false
 
 [patch.crates-io]
-collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-appflowy-integrate = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "aac4e56" }
-#
-#collab = { path = "../../../AppFlowy-Collab/collab" }
-#collab-folder = { path = "../../../AppFlowy-Collab/collab-folder" }
-#collab-database= { path = "../../../AppFlowy-Collab/collab-database" }
-#collab-document = { path = "../../../AppFlowy-Collab/collab-document" }
-#collab-plugins = { path = "../../../AppFlowy-Collab/collab-plugins" }
-#appflowy-integrate = { path = "../../../AppFlowy-Collab/appflowy-integrate" }
+collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+appflowy-integrate = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "ba963f" }
+
+#collab = { path = "../AppFlowy-Collab/collab" }
+#collab-folder = { path = "../AppFlowy-Collab/collab-folder" }
+#collab-database= { path = "../AppFlowy-Collab/collab-database" }
+#collab-document = { path = "../AppFlowy-Collab/collab-document" }
+#collab-plugins = { path = "../AppFlowy-Collab/collab-plugins" }
+#appflowy-integrate = { path = "../AppFlowy-Collab/appflowy-integrate" }
 

+ 3 - 1
frontend/rust-lib/flowy-database2/src/services/database/database_editor.rs

@@ -134,7 +134,9 @@ impl DatabaseEditor {
       let field = database.fields.get_field(field_id);
       if let Some(field) = field {
         let group_setting = default_group_setting(&field);
-        database.insert_group_setting(view_id, group_setting);
+        database.views.update_database_view(view_id, |view| {
+          view.set_groups(vec![group_setting.into()]);
+        });
       }
     }