Browse Source

Merge pull request #446 from AppFlowy-IO/fix_data_error

Fix: grid data parser error
Nathan.fooo 3 years ago
parent
commit
6af78641d2
81 changed files with 2176 additions and 5527 deletions
  1. 1 1
      frontend/app_flowy/lib/workspace/application/doc/doc_bloc.dart
  2. 2 3
      frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart
  3. 0 1
      frontend/app_flowy/lib/workspace/application/grid/field/field_service.dart
  4. 10 8
      frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart
  5. 14 4
      frontend/app_flowy/lib/workspace/application/grid/grid_service.dart
  6. 4 6
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart
  7. 1 1
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_builder.dart
  8. 12 5
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/date_cell.dart
  9. 1 1
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart
  10. 13 3
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_cell.dart
  11. 7 0
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_editor.dart
  12. 0 1
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart
  13. 1 2
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_extension.dart
  14. 1 1
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_list.dart
  15. 1 1
      frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/grid_header.dart
  16. 1 1
      frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart
  17. 367 13
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart
  18. 27 0
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbenum.dart
  19. 58 0
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart
  20. 0 1086
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart
  21. 0 34
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbenum.dart
  22. 0 217
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart
  23. 0 9
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbserver.dart
  24. 0 1
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/protobuf.dart
  25. 21 8
      frontend/rust-lib/Cargo.lock
  26. 3 4
      frontend/rust-lib/flowy-folder/src/services/view/controller.rs
  27. 2 1
      frontend/rust-lib/flowy-grid/Cargo.toml
  28. 4 4
      frontend/rust-lib/flowy-grid/src/event_handler.rs
  29. 1 1
      frontend/rust-lib/flowy-grid/src/event_map.rs
  30. 2 2
      frontend/rust-lib/flowy-grid/src/macros.rs
  31. 1 1
      frontend/rust-lib/flowy-grid/src/manager.rs
  32. 2 2
      frontend/rust-lib/flowy-grid/src/services/block_meta_manager.rs
  33. 4 4
      frontend/rust-lib/flowy-grid/src/services/cell/cell_entities.rs
  34. 2 2
      frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs
  35. 3 3
      frontend/rust-lib/flowy-grid/src/services/field/field_entities.rs
  36. 4 1
      frontend/rust-lib/flowy-grid/src/services/field/type_options/checkbox_type_option.rs
  37. 4 1
      frontend/rust-lib/flowy-grid/src/services/field/type_options/date_type_option.rs
  38. 4 1
      frontend/rust-lib/flowy-grid/src/services/field/type_options/number_type_option.rs
  39. 11 11
      frontend/rust-lib/flowy-grid/src/services/field/type_options/selection_type_option.rs
  40. 4 2
      frontend/rust-lib/flowy-grid/src/services/field/type_options/text_type_option.rs
  41. 4 2
      frontend/rust-lib/flowy-grid/src/services/grid_editor.rs
  42. 37 11
      frontend/rust-lib/flowy-grid/src/services/row/cell_data_operation.rs
  43. 5 5
      frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs
  44. 3 3
      frontend/rust-lib/flowy-grid/src/services/row/row_entities.rs
  45. 6 21
      frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs
  46. 1 3
      frontend/rust-lib/flowy-grid/src/services/util.rs
  47. 4 4
      frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs
  48. 6 6
      frontend/rust-lib/flowy-grid/tests/grid/script.rs
  49. 1 0
      frontend/rust-lib/flowy-net/Cargo.toml
  50. 8 5
      frontend/rust-lib/flowy-net/src/local_server/server.rs
  51. 3 1
      frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs
  52. 1 1
      frontend/rust-lib/flowy-sdk/src/lib.rs
  53. 1 0
      frontend/rust-lib/flowy-test/Cargo.toml
  54. 1 2
      frontend/rust-lib/flowy-test/src/helper.rs
  55. 2 2
      frontend/rust-lib/flowy-test/src/lib.rs
  56. 1 0
      frontend/rust-lib/flowy-text-block/src/manager.rs
  57. 1 0
      frontend/rust-lib/flowy-user/Cargo.toml
  58. 3 2
      frontend/rust-lib/flowy-user/tests/event/user_profile_test.rs
  59. 1 1
      frontend/rust-lib/lib-dispatch/Cargo.toml
  60. 2 1
      frontend/rust-lib/lib-dispatch/src/module/module.rs
  61. 29 13
      shared-lib/Cargo.lock
  62. 1 1
      shared-lib/flowy-folder-data-model/Cargo.toml
  63. 4 0
      shared-lib/flowy-folder-data-model/src/entities/app.rs
  64. 6 1
      shared-lib/flowy-folder-data-model/src/entities/view.rs
  65. 4 0
      shared-lib/flowy-folder-data-model/src/entities/workspace.rs
  66. 6 3
      shared-lib/flowy-folder-data-model/src/user_default.rs
  67. 2 2
      shared-lib/flowy-grid-data-model/Cargo.toml
  68. 1 1
      shared-lib/flowy-grid-data-model/Flowy.toml
  69. 180 11
      shared-lib/flowy-grid-data-model/src/entities/grid.rs
  70. 56 252
      shared-lib/flowy-grid-data-model/src/entities/meta.rs
  71. 0 22
      shared-lib/flowy-grid-data-model/src/parser/str_parser.rs
  72. 1163 86
      shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs
  73. 0 3520
      shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs
  74. 0 3
      shared-lib/flowy-grid-data-model/src/protobuf/model/mod.rs
  75. 25 1
      shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto
  76. 0 76
      shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto
  77. 10 6
      shared-lib/flowy-sync/src/client_grid/grid_block_meta_pad.rs
  78. 4 5
      shared-lib/flowy-sync/src/client_grid/grid_meta_pad.rs
  79. 1 1
      shared-lib/flowy-sync/src/server_document/document_manager.rs
  80. 0 1
      shared-lib/lib-infra/Cargo.toml
  81. 0 5
      shared-lib/lib-infra/src/lib.rs

+ 1 - 1
frontend/app_flowy/lib/workspace/application/doc/doc_bloc.dart

@@ -65,7 +65,7 @@ class DocumentBloc extends Bloc<DocumentEvent, DocumentState> {
       await _subscription?.cancel();
     }
 
-    service.closeDocument(docId: view.id);
+    await service.closeDocument(docId: view.id);
     return super.close();
   }
 

+ 2 - 3
frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart

@@ -1,8 +1,7 @@
 import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
 import 'package:dartz/dartz.dart';
 import 'package:flowy_sdk/dispatch/dispatch.dart';
-import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show Cell;
-import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-grid/cell_entities.pb.dart';
 
 class CellService {
@@ -14,7 +13,7 @@ class CellService {
     required String rowId,
     required String data,
   }) {
-    final payload = CellMetaChangeset.create()
+    final payload = CellChangeset.create()
       ..gridId = gridId
       ..fieldId = fieldId
       ..rowId = rowId

+ 0 - 1
frontend/app_flowy/lib/workspace/application/grid/field/field_service.dart

@@ -3,7 +3,6 @@ import 'package:equatable/equatable.dart';
 import 'package:flowy_sdk/dispatch/dispatch.dart';
 import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
-import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
 
 class FieldService {

+ 10 - 8
frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart

@@ -13,16 +13,15 @@ import 'grid_service.dart';
 part 'grid_bloc.freezed.dart';
 
 class GridBloc extends Bloc<GridEvent, GridState> {
-  final View view;
   final GridService _gridService;
   final GridListener _gridListener;
   final GridFieldsListener _fieldListener;
 
-  GridBloc({required this.view})
+  GridBloc({required View view})
       : _fieldListener = GridFieldsListener(gridId: view.id),
-        _gridService = GridService(),
+        _gridService = GridService(gridId: view.id),
         _gridListener = GridListener(gridId: view.id),
-        super(GridState.initial()) {
+        super(GridState.initial(view.id)) {
     on<GridEvent>(
       (event, emit) async {
         await event.map(
@@ -31,7 +30,7 @@ class GridBloc extends Bloc<GridEvent, GridState> {
             _startListening();
           },
           createRow: (_CreateRow value) {
-            _gridService.createRow(gridId: view.id);
+            _gridService.createRow();
           },
           updateDesc: (_Desc value) {},
           didReceiveRowUpdate: (_DidReceiveRowUpdate value) {
@@ -47,6 +46,7 @@ class GridBloc extends Bloc<GridEvent, GridState> {
 
   @override
   Future<void> close() async {
+    await _gridService.closeGrid();
     await _fieldListener.stop();
     await _gridListener.stop();
     return super.close();
@@ -86,7 +86,7 @@ class GridBloc extends Bloc<GridEvent, GridState> {
   }
 
   Future<void> _loadGrid(Emitter<GridState> emit) async {
-    final result = await _gridService.loadGrid(gridId: view.id);
+    final result = await _gridService.loadGrid();
     return Future(
       () => result.fold(
         (grid) async => await _loadFields(grid, emit),
@@ -96,7 +96,7 @@ class GridBloc extends Bloc<GridEvent, GridState> {
   }
 
   Future<void> _loadFields(Grid grid, Emitter<GridState> emit) async {
-    final result = await _gridService.getFields(gridId: grid.id, fieldOrders: grid.fieldOrders);
+    final result = await _gridService.getFields(fieldOrders: grid.fieldOrders);
     return Future(
       () => result.fold(
         (fields) {
@@ -162,17 +162,19 @@ class GridEvent with _$GridEvent {
 @freezed
 class GridState with _$GridState {
   const factory GridState({
+    required String gridId,
     required GridLoadingState loadingState,
     required List<Field> fields,
     required List<RowOrder> rows,
     required Option<Grid> grid,
   }) = _GridState;
 
-  factory GridState.initial() => GridState(
+  factory GridState.initial(String gridId) => GridState(
         loadingState: const _Loading(),
         fields: [],
         rows: [],
         grid: none(),
+        gridId: gridId,
       );
 }
 

+ 14 - 4
frontend/app_flowy/lib/workspace/application/grid/grid_service.dart

@@ -1,27 +1,37 @@
+import 'package:dartz/dartz.dart';
 import 'package:flowy_sdk/dispatch/dispatch.dart';
 import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
-import 'package:dartz/dartz.dart';
 
 class GridService {
-  Future<Either<Grid, FlowyError>> loadGrid({required String gridId}) async {
+  final String gridId;
+  GridService({
+    required this.gridId,
+  });
+
+  Future<Either<Grid, FlowyError>> loadGrid() async {
     await FolderEventSetLatestView(ViewId(value: gridId)).send();
 
     final payload = GridId(value: gridId);
     return GridEventGetGridData(payload).send();
   }
 
-  Future<Either<Row, FlowyError>> createRow({required String gridId, Option<String>? startRowId}) {
+  Future<Either<Row, FlowyError>> createRow({Option<String>? startRowId}) {
     CreateRowPayload payload = CreateRowPayload.create()..gridId = gridId;
     startRowId?.fold(() => null, (id) => payload.startRowId = id);
     return GridEventCreateRow(payload).send();
   }
 
-  Future<Either<RepeatedField, FlowyError>> getFields({required String gridId, required List<FieldOrder> fieldOrders}) {
+  Future<Either<RepeatedField, FlowyError>> getFields({required List<FieldOrder> fieldOrders}) {
     final payload = QueryFieldPayload.create()
       ..gridId = gridId
       ..fieldOrders = RepeatedFieldOrder(items: fieldOrders);
     return GridEventGetFields(payload).send();
   }
+
+  Future<Either<Unit, FlowyError>> closeGrid() {
+    final request = ViewId(value: gridId);
+    return FolderEventCloseView(request).send();
+  }
 }

+ 4 - 6
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart

@@ -73,7 +73,7 @@ class FlowyGrid extends StatefulWidget {
 
 class _FlowyGridState extends State<FlowyGrid> {
   final _scrollController = GridScrollController();
-  // final _key = GlobalKey<SliverAnimatedListState>();
+  final _key = GlobalKey<SliverAnimatedListState>();
 
   @override
   void dispose() {
@@ -83,8 +83,6 @@ class _FlowyGridState extends State<FlowyGrid> {
 
   @override
   Widget build(BuildContext context) {
-    final gridId = context.read<GridBloc>().view.id;
-
     return BlocBuilder<GridBloc, GridState>(
       buildWhen: (previous, current) => previous.fields != current.fields,
       builder: (context, state) {
@@ -103,9 +101,9 @@ class _FlowyGridState extends State<FlowyGrid> {
                   physics: StyledScrollPhysics(),
                   controller: _scrollController.verticalController,
                   slivers: [
-                    _renderToolbar(gridId),
-                    GridHeader(gridId: gridId, fields: List.from(state.fields)),
-                    _renderRows(gridId: gridId, context: context),
+                    _renderToolbar(state.gridId),
+                    GridHeader(gridId: state.gridId, fields: List.from(state.fields)),
+                    _renderRows(gridId: state.gridId, context: context),
                     const GridFooter(),
                   ],
                 ),

+ 1 - 1
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_builder.dart

@@ -1,5 +1,5 @@
 import 'package:app_flowy/workspace/application/grid/row/row_service.dart';
-import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show FieldType;
 import 'package:flutter/widgets.dart';
 import 'checkbox_cell.dart';
 import 'date_cell.dart';

+ 12 - 5
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/date_cell.dart

@@ -1,5 +1,6 @@
 import 'package:app_flowy/startup/startup.dart';
 import 'package:app_flowy/workspace/application/grid/prelude.dart';
+import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/cell/cell_container.dart';
 import 'package:flowy_infra_ui/flowy_infra_ui.dart';
 import 'package:flowy_infra_ui/style_widget/text.dart';
 import 'package:flutter/widgets.dart';
@@ -7,7 +8,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:table_calendar/table_calendar.dart';
 import 'package:window_size/window_size.dart';
 
-class DateCell extends StatefulWidget {
+class DateCell extends GridCell {
   final CellData cellData;
 
   const DateCell({
@@ -37,10 +38,16 @@ class _DateCellState extends State<DateCell> {
           return SizedBox.expand(
             child: GestureDetector(
               behavior: HitTestBehavior.opaque,
-              onTap: () => _CellCalendar.show(
-                context,
-                onSelected: (day) => context.read<DateCellBloc>().add(DateCellEvent.selectDay(day)),
-              ),
+              onTap: () {
+                widget.setFocus(context, true);
+                _CellCalendar.show(
+                  context,
+                  onSelected: (day) {
+                    widget.setFocus(context, false);
+                    context.read<DateCellBloc>().add(DateCellEvent.selectDay(day));
+                  },
+                );
+              },
               child: MouseRegion(
                 opaque: false,
                 cursor: SystemMouseCursors.click,

+ 1 - 1
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart

@@ -6,7 +6,7 @@ import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/cell/c
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 
-class NumberCell extends StatefulWidget {
+class NumberCell extends GridCell {
   final CellData cellData;
 
   const NumberCell({

+ 13 - 3
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_cell.dart

@@ -1,12 +1,13 @@
 import 'package:app_flowy/startup/startup.dart';
 import 'package:app_flowy/workspace/application/grid/prelude.dart';
+import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/cell/cell_container.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 
 import 'extension.dart';
 import 'selection_editor.dart';
 
-class SingleSelectCell extends StatefulWidget {
+class SingleSelectCell extends GridCell {
   final CellData cellData;
 
   const SingleSelectCell({
@@ -37,7 +38,14 @@ class _SingleSelectCellState extends State<SingleSelectCell> {
           return SizedBox.expand(
             child: InkWell(
               onTap: () {
-                SelectOptionCellEditor.show(context, state.cellData, state.options, state.selectedOptions);
+                widget.setFocus(context, true);
+                SelectOptionCellEditor.show(
+                  context,
+                  state.cellData,
+                  state.options,
+                  state.selectedOptions,
+                  () => widget.setFocus(context, false),
+                );
               },
               child: Row(children: children),
             ),
@@ -55,7 +63,7 @@ class _SingleSelectCellState extends State<SingleSelectCell> {
 }
 
 //----------------------------------------------------------------
-class MultiSelectCell extends StatefulWidget {
+class MultiSelectCell extends GridCell {
   final CellData cellData;
 
   const MultiSelectCell({
@@ -86,11 +94,13 @@ class _MultiSelectCellState extends State<MultiSelectCell> {
           return SizedBox.expand(
             child: InkWell(
               onTap: () {
+                widget.setFocus(context, true);
                 SelectOptionCellEditor.show(
                   context,
                   state.cellData,
                   state.options,
                   state.selectedOptions,
+                  () => widget.setFocus(context, false),
                 );
               },
               child: Row(children: children),

+ 7 - 0
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_editor.dart

@@ -28,11 +28,13 @@ class SelectOptionCellEditor extends StatelessWidget with FlowyOverlayDelegate {
   final CellData cellData;
   final List<SelectOption> options;
   final List<SelectOption> selectedOptions;
+  final VoidCallback onDismissed;
 
   const SelectOptionCellEditor({
     required this.cellData,
     required this.options,
     required this.selectedOptions,
+    required this.onDismissed,
     Key? key,
   }) : super(key: key);
 
@@ -67,12 +69,14 @@ class SelectOptionCellEditor extends StatelessWidget with FlowyOverlayDelegate {
     CellData cellData,
     List<SelectOption> options,
     List<SelectOption> selectedOptions,
+    VoidCallback onDismissed,
   ) {
     SelectOptionCellEditor.remove(context);
     final editor = SelectOptionCellEditor(
       cellData: cellData,
       options: options,
       selectedOptions: selectedOptions,
+      onDismissed: onDismissed,
     );
 
     //
@@ -98,6 +102,9 @@ class SelectOptionCellEditor extends StatelessWidget with FlowyOverlayDelegate {
 
   @override
   bool asBarrier() => true;
+
+  @override
+  void didRemove() => onDismissed();
 }
 
 class _OptionList extends StatelessWidget {

+ 0 - 1
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart

@@ -10,7 +10,6 @@ import 'package:flowy_infra_ui/style_widget/text.dart';
 import 'package:flowy_sdk/log.dart';
 import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
-import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_type_option.pbserver.dart';
 import 'package:flowy_sdk/protobuf/flowy-grid/text_type_option.pb.dart';
 import 'package:flutter/material.dart';

+ 1 - 2
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_extension.dart

@@ -1,5 +1,4 @@
-
-import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show FieldType;
 import 'package:app_flowy/generated/locale_keys.g.dart';
 import 'package:easy_localization/easy_localization.dart';
 

+ 1 - 1
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_list.dart

@@ -6,7 +6,7 @@ import 'package:flowy_infra_ui/style_widget/button.dart';
 import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
 import 'package:flowy_infra_ui/style_widget/text.dart';
 import 'package:flowy_infra_ui/widget/spacing.dart';
-import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show FieldType;
 import 'package:flutter/material.dart';
 import 'field_type_extension.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';

+ 1 - 1
frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/grid_header.dart

@@ -46,7 +46,7 @@ class _GridHeaderDelegate extends SliverPersistentHeaderDelegate {
 
   @override
   Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
-    return _GridHeaderWidget(gridId: gridId, fields: fields);
+    return _GridHeaderWidget(gridId: gridId, fields: fields, key: ObjectKey(fields));
   }
 
   @override

+ 1 - 1
frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart

@@ -291,7 +291,7 @@ class GridEventGetCell {
 }
 
 class GridEventUpdateCell {
-     CellMetaChangeset request;
+     CellChangeset request;
      GridEventUpdateCell(this.request);
 
     Future<Either<Unit, FlowyError>> send() {

+ 367 - 13
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart

@@ -9,7 +9,9 @@ import 'dart:core' as $core;
 
 import 'package:protobuf/protobuf.dart' as $pb;
 
-import 'meta.pbenum.dart' as $0;
+import 'grid.pbenum.dart';
+
+export 'grid.pbenum.dart';
 
 class Grid extends $pb.GeneratedMessage {
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Grid', createEmptyInstance: create)
@@ -79,7 +81,7 @@ class Field extends $pb.GeneratedMessage {
     ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
     ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
     ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
-    ..e<$0.FieldType>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: $0.FieldType.RichText, valueOf: $0.FieldType.valueOf, enumValues: $0.FieldType.values)
+    ..e<FieldType>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values)
     ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'frozen')
     ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility')
     ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.O3)
@@ -91,7 +93,7 @@ class Field extends $pb.GeneratedMessage {
     $core.String? id,
     $core.String? name,
     $core.String? desc,
-    $0.FieldType? fieldType,
+    FieldType? fieldType,
     $core.bool? frozen,
     $core.bool? visibility,
     $core.int? width,
@@ -169,9 +171,9 @@ class Field extends $pb.GeneratedMessage {
   void clearDesc() => clearField(3);
 
   @$pb.TagNumber(4)
-  $0.FieldType get fieldType => $_getN(3);
+  FieldType get fieldType => $_getN(3);
   @$pb.TagNumber(4)
-  set fieldType($0.FieldType v) { setField(4, v); }
+  set fieldType(FieldType v) { setField(4, v); }
   @$pb.TagNumber(4)
   $core.bool hasFieldType() => $_has(3);
   @$pb.TagNumber(4)
@@ -266,7 +268,7 @@ class GetEditFieldContextPayload extends $pb.GeneratedMessage {
     ..oo(0, [2])
     ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId')
     ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId')
-    ..e<$0.FieldType>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: $0.FieldType.RichText, valueOf: $0.FieldType.valueOf, enumValues: $0.FieldType.values)
+    ..e<FieldType>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values)
     ..hasRequiredFields = false
   ;
 
@@ -274,7 +276,7 @@ class GetEditFieldContextPayload extends $pb.GeneratedMessage {
   factory GetEditFieldContextPayload({
     $core.String? gridId,
     $core.String? fieldId,
-    $0.FieldType? fieldType,
+    FieldType? fieldType,
   }) {
     final _result = create();
     if (gridId != null) {
@@ -331,9 +333,9 @@ class GetEditFieldContextPayload extends $pb.GeneratedMessage {
   void clearFieldId() => clearField(2);
 
   @$pb.TagNumber(3)
-  $0.FieldType get fieldType => $_getN(2);
+  FieldType get fieldType => $_getN(2);
   @$pb.TagNumber(3)
-  set fieldType($0.FieldType v) { setField(3, v); }
+  set fieldType(FieldType v) { setField(3, v); }
   @$pb.TagNumber(3)
   $core.bool hasFieldType() => $_has(2);
   @$pb.TagNumber(3)
@@ -344,7 +346,7 @@ class EditFieldPayload extends $pb.GeneratedMessage {
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'EditFieldPayload', createEmptyInstance: create)
     ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId')
     ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId')
-    ..e<$0.FieldType>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: $0.FieldType.RichText, valueOf: $0.FieldType.valueOf, enumValues: $0.FieldType.values)
+    ..e<FieldType>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values)
     ..hasRequiredFields = false
   ;
 
@@ -352,7 +354,7 @@ class EditFieldPayload extends $pb.GeneratedMessage {
   factory EditFieldPayload({
     $core.String? gridId,
     $core.String? fieldId,
-    $0.FieldType? fieldType,
+    FieldType? fieldType,
   }) {
     final _result = create();
     if (gridId != null) {
@@ -406,9 +408,9 @@ class EditFieldPayload extends $pb.GeneratedMessage {
   void clearFieldId() => clearField(2);
 
   @$pb.TagNumber(3)
-  $0.FieldType get fieldType => $_getN(2);
+  FieldType get fieldType => $_getN(2);
   @$pb.TagNumber(3)
-  set fieldType($0.FieldType v) { setField(3, v); }
+  set fieldType(FieldType v) { setField(3, v); }
   @$pb.TagNumber(3)
   $core.bool hasFieldType() => $_has(2);
   @$pb.TagNumber(3)
@@ -1698,3 +1700,355 @@ class QueryGridBlocksPayload extends $pb.GeneratedMessage {
   $core.List<GridBlockOrder> get blockOrders => $_getList(1);
 }
 
+enum FieldChangesetPayload_OneOfName {
+  name, 
+  notSet
+}
+
+enum FieldChangesetPayload_OneOfDesc {
+  desc, 
+  notSet
+}
+
+enum FieldChangesetPayload_OneOfFieldType {
+  fieldType, 
+  notSet
+}
+
+enum FieldChangesetPayload_OneOfFrozen {
+  frozen, 
+  notSet
+}
+
+enum FieldChangesetPayload_OneOfVisibility {
+  visibility, 
+  notSet
+}
+
+enum FieldChangesetPayload_OneOfWidth {
+  width, 
+  notSet
+}
+
+enum FieldChangesetPayload_OneOfTypeOptionData {
+  typeOptionData, 
+  notSet
+}
+
+class FieldChangesetPayload extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, FieldChangesetPayload_OneOfName> _FieldChangesetPayload_OneOfNameByTag = {
+    3 : FieldChangesetPayload_OneOfName.name,
+    0 : FieldChangesetPayload_OneOfName.notSet
+  };
+  static const $core.Map<$core.int, FieldChangesetPayload_OneOfDesc> _FieldChangesetPayload_OneOfDescByTag = {
+    4 : FieldChangesetPayload_OneOfDesc.desc,
+    0 : FieldChangesetPayload_OneOfDesc.notSet
+  };
+  static const $core.Map<$core.int, FieldChangesetPayload_OneOfFieldType> _FieldChangesetPayload_OneOfFieldTypeByTag = {
+    5 : FieldChangesetPayload_OneOfFieldType.fieldType,
+    0 : FieldChangesetPayload_OneOfFieldType.notSet
+  };
+  static const $core.Map<$core.int, FieldChangesetPayload_OneOfFrozen> _FieldChangesetPayload_OneOfFrozenByTag = {
+    6 : FieldChangesetPayload_OneOfFrozen.frozen,
+    0 : FieldChangesetPayload_OneOfFrozen.notSet
+  };
+  static const $core.Map<$core.int, FieldChangesetPayload_OneOfVisibility> _FieldChangesetPayload_OneOfVisibilityByTag = {
+    7 : FieldChangesetPayload_OneOfVisibility.visibility,
+    0 : FieldChangesetPayload_OneOfVisibility.notSet
+  };
+  static const $core.Map<$core.int, FieldChangesetPayload_OneOfWidth> _FieldChangesetPayload_OneOfWidthByTag = {
+    8 : FieldChangesetPayload_OneOfWidth.width,
+    0 : FieldChangesetPayload_OneOfWidth.notSet
+  };
+  static const $core.Map<$core.int, FieldChangesetPayload_OneOfTypeOptionData> _FieldChangesetPayload_OneOfTypeOptionDataByTag = {
+    9 : FieldChangesetPayload_OneOfTypeOptionData.typeOptionData,
+    0 : FieldChangesetPayload_OneOfTypeOptionData.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FieldChangesetPayload', createEmptyInstance: create)
+    ..oo(0, [3])
+    ..oo(1, [4])
+    ..oo(2, [5])
+    ..oo(3, [6])
+    ..oo(4, [7])
+    ..oo(5, [8])
+    ..oo(6, [9])
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
+    ..e<FieldType>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values)
+    ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'frozen')
+    ..aOB(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility')
+    ..a<$core.int>(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.O3)
+    ..a<$core.List<$core.int>>(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptionData', $pb.PbFieldType.OY)
+    ..hasRequiredFields = false
+  ;
+
+  FieldChangesetPayload._() : super();
+  factory FieldChangesetPayload({
+    $core.String? fieldId,
+    $core.String? gridId,
+    $core.String? name,
+    $core.String? desc,
+    FieldType? fieldType,
+    $core.bool? frozen,
+    $core.bool? visibility,
+    $core.int? width,
+    $core.List<$core.int>? typeOptionData,
+  }) {
+    final _result = create();
+    if (fieldId != null) {
+      _result.fieldId = fieldId;
+    }
+    if (gridId != null) {
+      _result.gridId = gridId;
+    }
+    if (name != null) {
+      _result.name = name;
+    }
+    if (desc != null) {
+      _result.desc = desc;
+    }
+    if (fieldType != null) {
+      _result.fieldType = fieldType;
+    }
+    if (frozen != null) {
+      _result.frozen = frozen;
+    }
+    if (visibility != null) {
+      _result.visibility = visibility;
+    }
+    if (width != null) {
+      _result.width = width;
+    }
+    if (typeOptionData != null) {
+      _result.typeOptionData = typeOptionData;
+    }
+    return _result;
+  }
+  factory FieldChangesetPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory FieldChangesetPayload.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
+  FieldChangesetPayload clone() => FieldChangesetPayload()..mergeFromMessage(this);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  FieldChangesetPayload copyWith(void Function(FieldChangesetPayload) updates) => super.copyWith((message) => updates(message as FieldChangesetPayload)) as FieldChangesetPayload; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static FieldChangesetPayload create() => FieldChangesetPayload._();
+  FieldChangesetPayload createEmptyInstance() => create();
+  static $pb.PbList<FieldChangesetPayload> createRepeated() => $pb.PbList<FieldChangesetPayload>();
+  @$core.pragma('dart2js:noInline')
+  static FieldChangesetPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FieldChangesetPayload>(create);
+  static FieldChangesetPayload? _defaultInstance;
+
+  FieldChangesetPayload_OneOfName whichOneOfName() => _FieldChangesetPayload_OneOfNameByTag[$_whichOneof(0)]!;
+  void clearOneOfName() => clearField($_whichOneof(0));
+
+  FieldChangesetPayload_OneOfDesc whichOneOfDesc() => _FieldChangesetPayload_OneOfDescByTag[$_whichOneof(1)]!;
+  void clearOneOfDesc() => clearField($_whichOneof(1));
+
+  FieldChangesetPayload_OneOfFieldType whichOneOfFieldType() => _FieldChangesetPayload_OneOfFieldTypeByTag[$_whichOneof(2)]!;
+  void clearOneOfFieldType() => clearField($_whichOneof(2));
+
+  FieldChangesetPayload_OneOfFrozen whichOneOfFrozen() => _FieldChangesetPayload_OneOfFrozenByTag[$_whichOneof(3)]!;
+  void clearOneOfFrozen() => clearField($_whichOneof(3));
+
+  FieldChangesetPayload_OneOfVisibility whichOneOfVisibility() => _FieldChangesetPayload_OneOfVisibilityByTag[$_whichOneof(4)]!;
+  void clearOneOfVisibility() => clearField($_whichOneof(4));
+
+  FieldChangesetPayload_OneOfWidth whichOneOfWidth() => _FieldChangesetPayload_OneOfWidthByTag[$_whichOneof(5)]!;
+  void clearOneOfWidth() => clearField($_whichOneof(5));
+
+  FieldChangesetPayload_OneOfTypeOptionData whichOneOfTypeOptionData() => _FieldChangesetPayload_OneOfTypeOptionDataByTag[$_whichOneof(6)]!;
+  void clearOneOfTypeOptionData() => clearField($_whichOneof(6));
+
+  @$pb.TagNumber(1)
+  $core.String get fieldId => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set fieldId($core.String v) { $_setString(0, v); }
+  @$pb.TagNumber(1)
+  $core.bool hasFieldId() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearFieldId() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get gridId => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set gridId($core.String v) { $_setString(1, v); }
+  @$pb.TagNumber(2)
+  $core.bool hasGridId() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearGridId() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get name => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set name($core.String v) { $_setString(2, v); }
+  @$pb.TagNumber(3)
+  $core.bool hasName() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearName() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.String get desc => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set desc($core.String v) { $_setString(3, v); }
+  @$pb.TagNumber(4)
+  $core.bool hasDesc() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearDesc() => clearField(4);
+
+  @$pb.TagNumber(5)
+  FieldType get fieldType => $_getN(4);
+  @$pb.TagNumber(5)
+  set fieldType(FieldType v) { setField(5, v); }
+  @$pb.TagNumber(5)
+  $core.bool hasFieldType() => $_has(4);
+  @$pb.TagNumber(5)
+  void clearFieldType() => clearField(5);
+
+  @$pb.TagNumber(6)
+  $core.bool get frozen => $_getBF(5);
+  @$pb.TagNumber(6)
+  set frozen($core.bool v) { $_setBool(5, v); }
+  @$pb.TagNumber(6)
+  $core.bool hasFrozen() => $_has(5);
+  @$pb.TagNumber(6)
+  void clearFrozen() => clearField(6);
+
+  @$pb.TagNumber(7)
+  $core.bool get visibility => $_getBF(6);
+  @$pb.TagNumber(7)
+  set visibility($core.bool v) { $_setBool(6, v); }
+  @$pb.TagNumber(7)
+  $core.bool hasVisibility() => $_has(6);
+  @$pb.TagNumber(7)
+  void clearVisibility() => clearField(7);
+
+  @$pb.TagNumber(8)
+  $core.int get width => $_getIZ(7);
+  @$pb.TagNumber(8)
+  set width($core.int v) { $_setSignedInt32(7, v); }
+  @$pb.TagNumber(8)
+  $core.bool hasWidth() => $_has(7);
+  @$pb.TagNumber(8)
+  void clearWidth() => clearField(8);
+
+  @$pb.TagNumber(9)
+  $core.List<$core.int> get typeOptionData => $_getN(8);
+  @$pb.TagNumber(9)
+  set typeOptionData($core.List<$core.int> v) { $_setBytes(8, v); }
+  @$pb.TagNumber(9)
+  $core.bool hasTypeOptionData() => $_has(8);
+  @$pb.TagNumber(9)
+  void clearTypeOptionData() => clearField(9);
+}
+
+enum CellChangeset_OneOfData {
+  data, 
+  notSet
+}
+
+class CellChangeset extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, CellChangeset_OneOfData> _CellChangeset_OneOfDataByTag = {
+    4 : CellChangeset_OneOfData.data,
+    0 : CellChangeset_OneOfData.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CellChangeset', createEmptyInstance: create)
+    ..oo(0, [4])
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data')
+    ..hasRequiredFields = false
+  ;
+
+  CellChangeset._() : super();
+  factory CellChangeset({
+    $core.String? gridId,
+    $core.String? rowId,
+    $core.String? fieldId,
+    $core.String? data,
+  }) {
+    final _result = create();
+    if (gridId != null) {
+      _result.gridId = gridId;
+    }
+    if (rowId != null) {
+      _result.rowId = rowId;
+    }
+    if (fieldId != null) {
+      _result.fieldId = fieldId;
+    }
+    if (data != null) {
+      _result.data = data;
+    }
+    return _result;
+  }
+  factory CellChangeset.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory CellChangeset.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
+  CellChangeset clone() => CellChangeset()..mergeFromMessage(this);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  CellChangeset copyWith(void Function(CellChangeset) updates) => super.copyWith((message) => updates(message as CellChangeset)) as CellChangeset; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static CellChangeset create() => CellChangeset._();
+  CellChangeset createEmptyInstance() => create();
+  static $pb.PbList<CellChangeset> createRepeated() => $pb.PbList<CellChangeset>();
+  @$core.pragma('dart2js:noInline')
+  static CellChangeset getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CellChangeset>(create);
+  static CellChangeset? _defaultInstance;
+
+  CellChangeset_OneOfData whichOneOfData() => _CellChangeset_OneOfDataByTag[$_whichOneof(0)]!;
+  void clearOneOfData() => clearField($_whichOneof(0));
+
+  @$pb.TagNumber(1)
+  $core.String get gridId => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set gridId($core.String v) { $_setString(0, v); }
+  @$pb.TagNumber(1)
+  $core.bool hasGridId() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearGridId() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get rowId => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set rowId($core.String v) { $_setString(1, v); }
+  @$pb.TagNumber(2)
+  $core.bool hasRowId() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearRowId() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get fieldId => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set fieldId($core.String v) { $_setString(2, v); }
+  @$pb.TagNumber(3)
+  $core.bool hasFieldId() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearFieldId() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.String get data => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set data($core.String v) { $_setString(3, v); }
+  @$pb.TagNumber(4)
+  $core.bool hasData() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearData() => clearField(4);
+}
+

+ 27 - 0
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbenum.dart

@@ -5,3 +5,30 @@
 // @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
+// ignore_for_file: UNDEFINED_SHOWN_NAME
+import 'dart:core' as $core;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class FieldType extends $pb.ProtobufEnum {
+  static const FieldType RichText = FieldType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RichText');
+  static const FieldType Number = FieldType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Number');
+  static const FieldType DateTime = FieldType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DateTime');
+  static const FieldType SingleSelect = FieldType._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SingleSelect');
+  static const FieldType MultiSelect = FieldType._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'MultiSelect');
+  static const FieldType Checkbox = FieldType._(5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Checkbox');
+
+  static const $core.List<FieldType> values = <FieldType> [
+    RichText,
+    Number,
+    DateTime,
+    SingleSelect,
+    MultiSelect,
+    Checkbox,
+  ];
+
+  static final $core.Map<$core.int, FieldType> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static FieldType? valueOf($core.int value) => _byValue[value];
+
+  const FieldType._($core.int v, $core.String n) : super(v, n);
+}
+

+ 58 - 0
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart

@@ -8,6 +8,21 @@
 import 'dart:core' as $core;
 import 'dart:convert' as $convert;
 import 'dart:typed_data' as $typed_data;
+@$core.Deprecated('Use fieldTypeDescriptor instead')
+const FieldType$json = const {
+  '1': 'FieldType',
+  '2': const [
+    const {'1': 'RichText', '2': 0},
+    const {'1': 'Number', '2': 1},
+    const {'1': 'DateTime', '2': 2},
+    const {'1': 'SingleSelect', '2': 3},
+    const {'1': 'MultiSelect', '2': 4},
+    const {'1': 'Checkbox', '2': 5},
+  ],
+};
+
+/// Descriptor for `FieldType`. Decode as a `google.protobuf.EnumDescriptorProto`.
+final $typed_data.Uint8List fieldTypeDescriptor = $convert.base64Decode('CglGaWVsZFR5cGUSDAoIUmljaFRleHQQABIKCgZOdW1iZXIQARIMCghEYXRlVGltZRACEhAKDFNpbmdsZVNlbGVjdBADEg8KC011bHRpU2VsZWN0EAQSDAoIQ2hlY2tib3gQBQ==');
 @$core.Deprecated('Use gridDescriptor instead')
 const Grid$json = const {
   '1': 'Grid',
@@ -328,3 +343,46 @@ const QueryGridBlocksPayload$json = const {
 
 /// Descriptor for `QueryGridBlocksPayload`. Decode as a `google.protobuf.DescriptorProto`.
 final $typed_data.Uint8List queryGridBlocksPayloadDescriptor = $convert.base64Decode('ChZRdWVyeUdyaWRCbG9ja3NQYXlsb2FkEhcKB2dyaWRfaWQYASABKAlSBmdyaWRJZBIyCgxibG9ja19vcmRlcnMYAiADKAsyDy5HcmlkQmxvY2tPcmRlclILYmxvY2tPcmRlcnM=');
+@$core.Deprecated('Use fieldChangesetPayloadDescriptor instead')
+const FieldChangesetPayload$json = const {
+  '1': 'FieldChangesetPayload',
+  '2': const [
+    const {'1': 'field_id', '3': 1, '4': 1, '5': 9, '10': 'fieldId'},
+    const {'1': 'grid_id', '3': 2, '4': 1, '5': 9, '10': 'gridId'},
+    const {'1': 'name', '3': 3, '4': 1, '5': 9, '9': 0, '10': 'name'},
+    const {'1': 'desc', '3': 4, '4': 1, '5': 9, '9': 1, '10': 'desc'},
+    const {'1': 'field_type', '3': 5, '4': 1, '5': 14, '6': '.FieldType', '9': 2, '10': 'fieldType'},
+    const {'1': 'frozen', '3': 6, '4': 1, '5': 8, '9': 3, '10': 'frozen'},
+    const {'1': 'visibility', '3': 7, '4': 1, '5': 8, '9': 4, '10': 'visibility'},
+    const {'1': 'width', '3': 8, '4': 1, '5': 5, '9': 5, '10': 'width'},
+    const {'1': 'type_option_data', '3': 9, '4': 1, '5': 12, '9': 6, '10': 'typeOptionData'},
+  ],
+  '8': const [
+    const {'1': 'one_of_name'},
+    const {'1': 'one_of_desc'},
+    const {'1': 'one_of_field_type'},
+    const {'1': 'one_of_frozen'},
+    const {'1': 'one_of_visibility'},
+    const {'1': 'one_of_width'},
+    const {'1': 'one_of_type_option_data'},
+  ],
+};
+
+/// Descriptor for `FieldChangesetPayload`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List fieldChangesetPayloadDescriptor = $convert.base64Decode('ChVGaWVsZENoYW5nZXNldFBheWxvYWQSGQoIZmllbGRfaWQYASABKAlSB2ZpZWxkSWQSFwoHZ3JpZF9pZBgCIAEoCVIGZ3JpZElkEhQKBG5hbWUYAyABKAlIAFIEbmFtZRIUCgRkZXNjGAQgASgJSAFSBGRlc2MSKwoKZmllbGRfdHlwZRgFIAEoDjIKLkZpZWxkVHlwZUgCUglmaWVsZFR5cGUSGAoGZnJvemVuGAYgASgISANSBmZyb3plbhIgCgp2aXNpYmlsaXR5GAcgASgISARSCnZpc2liaWxpdHkSFgoFd2lkdGgYCCABKAVIBVIFd2lkdGgSKgoQdHlwZV9vcHRpb25fZGF0YRgJIAEoDEgGUg50eXBlT3B0aW9uRGF0YUINCgtvbmVfb2ZfbmFtZUINCgtvbmVfb2ZfZGVzY0ITChFvbmVfb2ZfZmllbGRfdHlwZUIPCg1vbmVfb2ZfZnJvemVuQhMKEW9uZV9vZl92aXNpYmlsaXR5Qg4KDG9uZV9vZl93aWR0aEIZChdvbmVfb2ZfdHlwZV9vcHRpb25fZGF0YQ==');
+@$core.Deprecated('Use cellChangesetDescriptor instead')
+const CellChangeset$json = const {
+  '1': 'CellChangeset',
+  '2': const [
+    const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'},
+    const {'1': 'row_id', '3': 2, '4': 1, '5': 9, '10': 'rowId'},
+    const {'1': 'field_id', '3': 3, '4': 1, '5': 9, '10': 'fieldId'},
+    const {'1': 'data', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'data'},
+  ],
+  '8': const [
+    const {'1': 'one_of_data'},
+  ],
+};
+
+/// Descriptor for `CellChangeset`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List cellChangesetDescriptor = $convert.base64Decode('Cg1DZWxsQ2hhbmdlc2V0EhcKB2dyaWRfaWQYASABKAlSBmdyaWRJZBIVCgZyb3dfaWQYAiABKAlSBXJvd0lkEhkKCGZpZWxkX2lkGAMgASgJUgdmaWVsZElkEhQKBGRhdGEYBCABKAlIAFIEZGF0YUINCgtvbmVfb2ZfZGF0YQ==');

+ 0 - 1086
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart

@@ -1,1086 +0,0 @@
-///
-//  Generated code. Do not modify.
-//  source: meta.proto
-//
-// @dart = 2.12
-// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
-
-import 'dart:core' as $core;
-
-import 'package:protobuf/protobuf.dart' as $pb;
-
-import 'meta.pbenum.dart';
-
-export 'meta.pbenum.dart';
-
-class GridMeta extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridMeta', createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId')
-    ..pc<FieldMeta>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fields', $pb.PbFieldType.PM, subBuilder: FieldMeta.create)
-    ..pc<GridBlockMeta>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blocks', $pb.PbFieldType.PM, subBuilder: GridBlockMeta.create)
-    ..hasRequiredFields = false
-  ;
-
-  GridMeta._() : super();
-  factory GridMeta({
-    $core.String? gridId,
-    $core.Iterable<FieldMeta>? fields,
-    $core.Iterable<GridBlockMeta>? blocks,
-  }) {
-    final _result = create();
-    if (gridId != null) {
-      _result.gridId = gridId;
-    }
-    if (fields != null) {
-      _result.fields.addAll(fields);
-    }
-    if (blocks != null) {
-      _result.blocks.addAll(blocks);
-    }
-    return _result;
-  }
-  factory GridMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory GridMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  GridMeta clone() => GridMeta()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  GridMeta copyWith(void Function(GridMeta) updates) => super.copyWith((message) => updates(message as GridMeta)) as GridMeta; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static GridMeta create() => GridMeta._();
-  GridMeta createEmptyInstance() => create();
-  static $pb.PbList<GridMeta> createRepeated() => $pb.PbList<GridMeta>();
-  @$core.pragma('dart2js:noInline')
-  static GridMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GridMeta>(create);
-  static GridMeta? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.String get gridId => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set gridId($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasGridId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearGridId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.List<FieldMeta> get fields => $_getList(1);
-
-  @$pb.TagNumber(3)
-  $core.List<GridBlockMeta> get blocks => $_getList(2);
-}
-
-class GridBlockMeta extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlockMeta', createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId')
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startRowIndex', $pb.PbFieldType.O3)
-    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowCount', $pb.PbFieldType.O3)
-    ..hasRequiredFields = false
-  ;
-
-  GridBlockMeta._() : super();
-  factory GridBlockMeta({
-    $core.String? blockId,
-    $core.int? startRowIndex,
-    $core.int? rowCount,
-  }) {
-    final _result = create();
-    if (blockId != null) {
-      _result.blockId = blockId;
-    }
-    if (startRowIndex != null) {
-      _result.startRowIndex = startRowIndex;
-    }
-    if (rowCount != null) {
-      _result.rowCount = rowCount;
-    }
-    return _result;
-  }
-  factory GridBlockMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory GridBlockMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  GridBlockMeta clone() => GridBlockMeta()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  GridBlockMeta copyWith(void Function(GridBlockMeta) updates) => super.copyWith((message) => updates(message as GridBlockMeta)) as GridBlockMeta; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static GridBlockMeta create() => GridBlockMeta._();
-  GridBlockMeta createEmptyInstance() => create();
-  static $pb.PbList<GridBlockMeta> createRepeated() => $pb.PbList<GridBlockMeta>();
-  @$core.pragma('dart2js:noInline')
-  static GridBlockMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GridBlockMeta>(create);
-  static GridBlockMeta? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.String get blockId => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set blockId($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasBlockId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearBlockId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.int get startRowIndex => $_getIZ(1);
-  @$pb.TagNumber(2)
-  set startRowIndex($core.int v) { $_setSignedInt32(1, v); }
-  @$pb.TagNumber(2)
-  $core.bool hasStartRowIndex() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearStartRowIndex() => clearField(2);
-
-  @$pb.TagNumber(3)
-  $core.int get rowCount => $_getIZ(2);
-  @$pb.TagNumber(3)
-  set rowCount($core.int v) { $_setSignedInt32(2, v); }
-  @$pb.TagNumber(3)
-  $core.bool hasRowCount() => $_has(2);
-  @$pb.TagNumber(3)
-  void clearRowCount() => clearField(3);
-}
-
-class GridBlockMetaData extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlockMetaData', createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId')
-    ..pc<RowMeta>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rows', $pb.PbFieldType.PM, subBuilder: RowMeta.create)
-    ..hasRequiredFields = false
-  ;
-
-  GridBlockMetaData._() : super();
-  factory GridBlockMetaData({
-    $core.String? blockId,
-    $core.Iterable<RowMeta>? rows,
-  }) {
-    final _result = create();
-    if (blockId != null) {
-      _result.blockId = blockId;
-    }
-    if (rows != null) {
-      _result.rows.addAll(rows);
-    }
-    return _result;
-  }
-  factory GridBlockMetaData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory GridBlockMetaData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  GridBlockMetaData clone() => GridBlockMetaData()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  GridBlockMetaData copyWith(void Function(GridBlockMetaData) updates) => super.copyWith((message) => updates(message as GridBlockMetaData)) as GridBlockMetaData; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static GridBlockMetaData create() => GridBlockMetaData._();
-  GridBlockMetaData createEmptyInstance() => create();
-  static $pb.PbList<GridBlockMetaData> createRepeated() => $pb.PbList<GridBlockMetaData>();
-  @$core.pragma('dart2js:noInline')
-  static GridBlockMetaData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GridBlockMetaData>(create);
-  static GridBlockMetaData? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.String get blockId => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set blockId($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasBlockId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearBlockId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.List<RowMeta> get rows => $_getList(1);
-}
-
-class FieldMeta extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FieldMeta', createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
-    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
-    ..e<FieldType>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values)
-    ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'frozen')
-    ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility')
-    ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.O3)
-    ..m<$core.String, $core.String>(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptions', entryClassName: 'FieldMeta.TypeOptionsEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OS)
-    ..hasRequiredFields = false
-  ;
-
-  FieldMeta._() : super();
-  factory FieldMeta({
-    $core.String? id,
-    $core.String? name,
-    $core.String? desc,
-    FieldType? fieldType,
-    $core.bool? frozen,
-    $core.bool? visibility,
-    $core.int? width,
-    $core.Map<$core.String, $core.String>? typeOptions,
-  }) {
-    final _result = create();
-    if (id != null) {
-      _result.id = id;
-    }
-    if (name != null) {
-      _result.name = name;
-    }
-    if (desc != null) {
-      _result.desc = desc;
-    }
-    if (fieldType != null) {
-      _result.fieldType = fieldType;
-    }
-    if (frozen != null) {
-      _result.frozen = frozen;
-    }
-    if (visibility != null) {
-      _result.visibility = visibility;
-    }
-    if (width != null) {
-      _result.width = width;
-    }
-    if (typeOptions != null) {
-      _result.typeOptions.addAll(typeOptions);
-    }
-    return _result;
-  }
-  factory FieldMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory FieldMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  FieldMeta clone() => FieldMeta()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  FieldMeta copyWith(void Function(FieldMeta) updates) => super.copyWith((message) => updates(message as FieldMeta)) as FieldMeta; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static FieldMeta create() => FieldMeta._();
-  FieldMeta createEmptyInstance() => create();
-  static $pb.PbList<FieldMeta> createRepeated() => $pb.PbList<FieldMeta>();
-  @$core.pragma('dart2js:noInline')
-  static FieldMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FieldMeta>(create);
-  static FieldMeta? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.String get id => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set id($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.String get name => $_getSZ(1);
-  @$pb.TagNumber(2)
-  set name($core.String v) { $_setString(1, v); }
-  @$pb.TagNumber(2)
-  $core.bool hasName() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearName() => clearField(2);
-
-  @$pb.TagNumber(3)
-  $core.String get desc => $_getSZ(2);
-  @$pb.TagNumber(3)
-  set desc($core.String v) { $_setString(2, v); }
-  @$pb.TagNumber(3)
-  $core.bool hasDesc() => $_has(2);
-  @$pb.TagNumber(3)
-  void clearDesc() => clearField(3);
-
-  @$pb.TagNumber(4)
-  FieldType get fieldType => $_getN(3);
-  @$pb.TagNumber(4)
-  set fieldType(FieldType v) { setField(4, v); }
-  @$pb.TagNumber(4)
-  $core.bool hasFieldType() => $_has(3);
-  @$pb.TagNumber(4)
-  void clearFieldType() => clearField(4);
-
-  @$pb.TagNumber(5)
-  $core.bool get frozen => $_getBF(4);
-  @$pb.TagNumber(5)
-  set frozen($core.bool v) { $_setBool(4, v); }
-  @$pb.TagNumber(5)
-  $core.bool hasFrozen() => $_has(4);
-  @$pb.TagNumber(5)
-  void clearFrozen() => clearField(5);
-
-  @$pb.TagNumber(6)
-  $core.bool get visibility => $_getBF(5);
-  @$pb.TagNumber(6)
-  set visibility($core.bool v) { $_setBool(5, v); }
-  @$pb.TagNumber(6)
-  $core.bool hasVisibility() => $_has(5);
-  @$pb.TagNumber(6)
-  void clearVisibility() => clearField(6);
-
-  @$pb.TagNumber(7)
-  $core.int get width => $_getIZ(6);
-  @$pb.TagNumber(7)
-  set width($core.int v) { $_setSignedInt32(6, v); }
-  @$pb.TagNumber(7)
-  $core.bool hasWidth() => $_has(6);
-  @$pb.TagNumber(7)
-  void clearWidth() => clearField(7);
-
-  @$pb.TagNumber(8)
-  $core.Map<$core.String, $core.String> get typeOptions => $_getMap(7);
-}
-
-enum FieldChangesetPayload_OneOfName {
-  name, 
-  notSet
-}
-
-enum FieldChangesetPayload_OneOfDesc {
-  desc, 
-  notSet
-}
-
-enum FieldChangesetPayload_OneOfFieldType {
-  fieldType, 
-  notSet
-}
-
-enum FieldChangesetPayload_OneOfFrozen {
-  frozen, 
-  notSet
-}
-
-enum FieldChangesetPayload_OneOfVisibility {
-  visibility, 
-  notSet
-}
-
-enum FieldChangesetPayload_OneOfWidth {
-  width, 
-  notSet
-}
-
-enum FieldChangesetPayload_OneOfTypeOptionData {
-  typeOptionData, 
-  notSet
-}
-
-class FieldChangesetPayload extends $pb.GeneratedMessage {
-  static const $core.Map<$core.int, FieldChangesetPayload_OneOfName> _FieldChangesetPayload_OneOfNameByTag = {
-    3 : FieldChangesetPayload_OneOfName.name,
-    0 : FieldChangesetPayload_OneOfName.notSet
-  };
-  static const $core.Map<$core.int, FieldChangesetPayload_OneOfDesc> _FieldChangesetPayload_OneOfDescByTag = {
-    4 : FieldChangesetPayload_OneOfDesc.desc,
-    0 : FieldChangesetPayload_OneOfDesc.notSet
-  };
-  static const $core.Map<$core.int, FieldChangesetPayload_OneOfFieldType> _FieldChangesetPayload_OneOfFieldTypeByTag = {
-    5 : FieldChangesetPayload_OneOfFieldType.fieldType,
-    0 : FieldChangesetPayload_OneOfFieldType.notSet
-  };
-  static const $core.Map<$core.int, FieldChangesetPayload_OneOfFrozen> _FieldChangesetPayload_OneOfFrozenByTag = {
-    6 : FieldChangesetPayload_OneOfFrozen.frozen,
-    0 : FieldChangesetPayload_OneOfFrozen.notSet
-  };
-  static const $core.Map<$core.int, FieldChangesetPayload_OneOfVisibility> _FieldChangesetPayload_OneOfVisibilityByTag = {
-    7 : FieldChangesetPayload_OneOfVisibility.visibility,
-    0 : FieldChangesetPayload_OneOfVisibility.notSet
-  };
-  static const $core.Map<$core.int, FieldChangesetPayload_OneOfWidth> _FieldChangesetPayload_OneOfWidthByTag = {
-    8 : FieldChangesetPayload_OneOfWidth.width,
-    0 : FieldChangesetPayload_OneOfWidth.notSet
-  };
-  static const $core.Map<$core.int, FieldChangesetPayload_OneOfTypeOptionData> _FieldChangesetPayload_OneOfTypeOptionDataByTag = {
-    9 : FieldChangesetPayload_OneOfTypeOptionData.typeOptionData,
-    0 : FieldChangesetPayload_OneOfTypeOptionData.notSet
-  };
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FieldChangesetPayload', createEmptyInstance: create)
-    ..oo(0, [3])
-    ..oo(1, [4])
-    ..oo(2, [5])
-    ..oo(3, [6])
-    ..oo(4, [7])
-    ..oo(5, [8])
-    ..oo(6, [9])
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId')
-    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
-    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
-    ..e<FieldType>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldType', $pb.PbFieldType.OE, defaultOrMaker: FieldType.RichText, valueOf: FieldType.valueOf, enumValues: FieldType.values)
-    ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'frozen')
-    ..aOB(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility')
-    ..a<$core.int>(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.O3)
-    ..a<$core.List<$core.int>>(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptionData', $pb.PbFieldType.OY)
-    ..hasRequiredFields = false
-  ;
-
-  FieldChangesetPayload._() : super();
-  factory FieldChangesetPayload({
-    $core.String? fieldId,
-    $core.String? gridId,
-    $core.String? name,
-    $core.String? desc,
-    FieldType? fieldType,
-    $core.bool? frozen,
-    $core.bool? visibility,
-    $core.int? width,
-    $core.List<$core.int>? typeOptionData,
-  }) {
-    final _result = create();
-    if (fieldId != null) {
-      _result.fieldId = fieldId;
-    }
-    if (gridId != null) {
-      _result.gridId = gridId;
-    }
-    if (name != null) {
-      _result.name = name;
-    }
-    if (desc != null) {
-      _result.desc = desc;
-    }
-    if (fieldType != null) {
-      _result.fieldType = fieldType;
-    }
-    if (frozen != null) {
-      _result.frozen = frozen;
-    }
-    if (visibility != null) {
-      _result.visibility = visibility;
-    }
-    if (width != null) {
-      _result.width = width;
-    }
-    if (typeOptionData != null) {
-      _result.typeOptionData = typeOptionData;
-    }
-    return _result;
-  }
-  factory FieldChangesetPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory FieldChangesetPayload.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  FieldChangesetPayload clone() => FieldChangesetPayload()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  FieldChangesetPayload copyWith(void Function(FieldChangesetPayload) updates) => super.copyWith((message) => updates(message as FieldChangesetPayload)) as FieldChangesetPayload; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static FieldChangesetPayload create() => FieldChangesetPayload._();
-  FieldChangesetPayload createEmptyInstance() => create();
-  static $pb.PbList<FieldChangesetPayload> createRepeated() => $pb.PbList<FieldChangesetPayload>();
-  @$core.pragma('dart2js:noInline')
-  static FieldChangesetPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FieldChangesetPayload>(create);
-  static FieldChangesetPayload? _defaultInstance;
-
-  FieldChangesetPayload_OneOfName whichOneOfName() => _FieldChangesetPayload_OneOfNameByTag[$_whichOneof(0)]!;
-  void clearOneOfName() => clearField($_whichOneof(0));
-
-  FieldChangesetPayload_OneOfDesc whichOneOfDesc() => _FieldChangesetPayload_OneOfDescByTag[$_whichOneof(1)]!;
-  void clearOneOfDesc() => clearField($_whichOneof(1));
-
-  FieldChangesetPayload_OneOfFieldType whichOneOfFieldType() => _FieldChangesetPayload_OneOfFieldTypeByTag[$_whichOneof(2)]!;
-  void clearOneOfFieldType() => clearField($_whichOneof(2));
-
-  FieldChangesetPayload_OneOfFrozen whichOneOfFrozen() => _FieldChangesetPayload_OneOfFrozenByTag[$_whichOneof(3)]!;
-  void clearOneOfFrozen() => clearField($_whichOneof(3));
-
-  FieldChangesetPayload_OneOfVisibility whichOneOfVisibility() => _FieldChangesetPayload_OneOfVisibilityByTag[$_whichOneof(4)]!;
-  void clearOneOfVisibility() => clearField($_whichOneof(4));
-
-  FieldChangesetPayload_OneOfWidth whichOneOfWidth() => _FieldChangesetPayload_OneOfWidthByTag[$_whichOneof(5)]!;
-  void clearOneOfWidth() => clearField($_whichOneof(5));
-
-  FieldChangesetPayload_OneOfTypeOptionData whichOneOfTypeOptionData() => _FieldChangesetPayload_OneOfTypeOptionDataByTag[$_whichOneof(6)]!;
-  void clearOneOfTypeOptionData() => clearField($_whichOneof(6));
-
-  @$pb.TagNumber(1)
-  $core.String get fieldId => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set fieldId($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasFieldId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearFieldId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.String get gridId => $_getSZ(1);
-  @$pb.TagNumber(2)
-  set gridId($core.String v) { $_setString(1, v); }
-  @$pb.TagNumber(2)
-  $core.bool hasGridId() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearGridId() => clearField(2);
-
-  @$pb.TagNumber(3)
-  $core.String get name => $_getSZ(2);
-  @$pb.TagNumber(3)
-  set name($core.String v) { $_setString(2, v); }
-  @$pb.TagNumber(3)
-  $core.bool hasName() => $_has(2);
-  @$pb.TagNumber(3)
-  void clearName() => clearField(3);
-
-  @$pb.TagNumber(4)
-  $core.String get desc => $_getSZ(3);
-  @$pb.TagNumber(4)
-  set desc($core.String v) { $_setString(3, v); }
-  @$pb.TagNumber(4)
-  $core.bool hasDesc() => $_has(3);
-  @$pb.TagNumber(4)
-  void clearDesc() => clearField(4);
-
-  @$pb.TagNumber(5)
-  FieldType get fieldType => $_getN(4);
-  @$pb.TagNumber(5)
-  set fieldType(FieldType v) { setField(5, v); }
-  @$pb.TagNumber(5)
-  $core.bool hasFieldType() => $_has(4);
-  @$pb.TagNumber(5)
-  void clearFieldType() => clearField(5);
-
-  @$pb.TagNumber(6)
-  $core.bool get frozen => $_getBF(5);
-  @$pb.TagNumber(6)
-  set frozen($core.bool v) { $_setBool(5, v); }
-  @$pb.TagNumber(6)
-  $core.bool hasFrozen() => $_has(5);
-  @$pb.TagNumber(6)
-  void clearFrozen() => clearField(6);
-
-  @$pb.TagNumber(7)
-  $core.bool get visibility => $_getBF(6);
-  @$pb.TagNumber(7)
-  set visibility($core.bool v) { $_setBool(6, v); }
-  @$pb.TagNumber(7)
-  $core.bool hasVisibility() => $_has(6);
-  @$pb.TagNumber(7)
-  void clearVisibility() => clearField(7);
-
-  @$pb.TagNumber(8)
-  $core.int get width => $_getIZ(7);
-  @$pb.TagNumber(8)
-  set width($core.int v) { $_setSignedInt32(7, v); }
-  @$pb.TagNumber(8)
-  $core.bool hasWidth() => $_has(7);
-  @$pb.TagNumber(8)
-  void clearWidth() => clearField(8);
-
-  @$pb.TagNumber(9)
-  $core.List<$core.int> get typeOptionData => $_getN(8);
-  @$pb.TagNumber(9)
-  set typeOptionData($core.List<$core.int> v) { $_setBytes(8, v); }
-  @$pb.TagNumber(9)
-  $core.bool hasTypeOptionData() => $_has(8);
-  @$pb.TagNumber(9)
-  void clearTypeOptionData() => clearField(9);
-}
-
-class AnyData extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AnyData', createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeId')
-    ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY)
-    ..hasRequiredFields = false
-  ;
-
-  AnyData._() : super();
-  factory AnyData({
-    $core.String? typeId,
-    $core.List<$core.int>? value,
-  }) {
-    final _result = create();
-    if (typeId != null) {
-      _result.typeId = typeId;
-    }
-    if (value != null) {
-      _result.value = value;
-    }
-    return _result;
-  }
-  factory AnyData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory AnyData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  AnyData clone() => AnyData()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  AnyData copyWith(void Function(AnyData) updates) => super.copyWith((message) => updates(message as AnyData)) as AnyData; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static AnyData create() => AnyData._();
-  AnyData createEmptyInstance() => create();
-  static $pb.PbList<AnyData> createRepeated() => $pb.PbList<AnyData>();
-  @$core.pragma('dart2js:noInline')
-  static AnyData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AnyData>(create);
-  static AnyData? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.String get typeId => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set typeId($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasTypeId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearTypeId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.List<$core.int> get value => $_getN(1);
-  @$pb.TagNumber(2)
-  set value($core.List<$core.int> v) { $_setBytes(1, v); }
-  @$pb.TagNumber(2)
-  $core.bool hasValue() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearValue() => clearField(2);
-}
-
-class RowMeta extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RowMeta', createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId')
-    ..m<$core.String, CellMeta>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cells', entryClassName: 'RowMeta.CellsEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OM, valueCreator: CellMeta.create)
-    ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.O3)
-    ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility')
-    ..hasRequiredFields = false
-  ;
-
-  RowMeta._() : super();
-  factory RowMeta({
-    $core.String? id,
-    $core.String? blockId,
-    $core.Map<$core.String, CellMeta>? cells,
-    $core.int? height,
-    $core.bool? visibility,
-  }) {
-    final _result = create();
-    if (id != null) {
-      _result.id = id;
-    }
-    if (blockId != null) {
-      _result.blockId = blockId;
-    }
-    if (cells != null) {
-      _result.cells.addAll(cells);
-    }
-    if (height != null) {
-      _result.height = height;
-    }
-    if (visibility != null) {
-      _result.visibility = visibility;
-    }
-    return _result;
-  }
-  factory RowMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory RowMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  RowMeta clone() => RowMeta()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  RowMeta copyWith(void Function(RowMeta) updates) => super.copyWith((message) => updates(message as RowMeta)) as RowMeta; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static RowMeta create() => RowMeta._();
-  RowMeta createEmptyInstance() => create();
-  static $pb.PbList<RowMeta> createRepeated() => $pb.PbList<RowMeta>();
-  @$core.pragma('dart2js:noInline')
-  static RowMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RowMeta>(create);
-  static RowMeta? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.String get id => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set id($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.String get blockId => $_getSZ(1);
-  @$pb.TagNumber(2)
-  set blockId($core.String v) { $_setString(1, v); }
-  @$pb.TagNumber(2)
-  $core.bool hasBlockId() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearBlockId() => clearField(2);
-
-  @$pb.TagNumber(3)
-  $core.Map<$core.String, CellMeta> get cells => $_getMap(2);
-
-  @$pb.TagNumber(4)
-  $core.int get height => $_getIZ(3);
-  @$pb.TagNumber(4)
-  set height($core.int v) { $_setSignedInt32(3, v); }
-  @$pb.TagNumber(4)
-  $core.bool hasHeight() => $_has(3);
-  @$pb.TagNumber(4)
-  void clearHeight() => clearField(4);
-
-  @$pb.TagNumber(5)
-  $core.bool get visibility => $_getBF(4);
-  @$pb.TagNumber(5)
-  set visibility($core.bool v) { $_setBool(4, v); }
-  @$pb.TagNumber(5)
-  $core.bool hasVisibility() => $_has(4);
-  @$pb.TagNumber(5)
-  void clearVisibility() => clearField(5);
-}
-
-enum RowMetaChangeset_OneOfHeight {
-  height, 
-  notSet
-}
-
-enum RowMetaChangeset_OneOfVisibility {
-  visibility, 
-  notSet
-}
-
-class RowMetaChangeset extends $pb.GeneratedMessage {
-  static const $core.Map<$core.int, RowMetaChangeset_OneOfHeight> _RowMetaChangeset_OneOfHeightByTag = {
-    2 : RowMetaChangeset_OneOfHeight.height,
-    0 : RowMetaChangeset_OneOfHeight.notSet
-  };
-  static const $core.Map<$core.int, RowMetaChangeset_OneOfVisibility> _RowMetaChangeset_OneOfVisibilityByTag = {
-    3 : RowMetaChangeset_OneOfVisibility.visibility,
-    0 : RowMetaChangeset_OneOfVisibility.notSet
-  };
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RowMetaChangeset', createEmptyInstance: create)
-    ..oo(0, [2])
-    ..oo(1, [3])
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId')
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.O3)
-    ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'visibility')
-    ..m<$core.String, CellMeta>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cellByFieldId', entryClassName: 'RowMetaChangeset.CellByFieldIdEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OM, valueCreator: CellMeta.create)
-    ..hasRequiredFields = false
-  ;
-
-  RowMetaChangeset._() : super();
-  factory RowMetaChangeset({
-    $core.String? rowId,
-    $core.int? height,
-    $core.bool? visibility,
-    $core.Map<$core.String, CellMeta>? cellByFieldId,
-  }) {
-    final _result = create();
-    if (rowId != null) {
-      _result.rowId = rowId;
-    }
-    if (height != null) {
-      _result.height = height;
-    }
-    if (visibility != null) {
-      _result.visibility = visibility;
-    }
-    if (cellByFieldId != null) {
-      _result.cellByFieldId.addAll(cellByFieldId);
-    }
-    return _result;
-  }
-  factory RowMetaChangeset.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory RowMetaChangeset.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  RowMetaChangeset clone() => RowMetaChangeset()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  RowMetaChangeset copyWith(void Function(RowMetaChangeset) updates) => super.copyWith((message) => updates(message as RowMetaChangeset)) as RowMetaChangeset; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static RowMetaChangeset create() => RowMetaChangeset._();
-  RowMetaChangeset createEmptyInstance() => create();
-  static $pb.PbList<RowMetaChangeset> createRepeated() => $pb.PbList<RowMetaChangeset>();
-  @$core.pragma('dart2js:noInline')
-  static RowMetaChangeset getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RowMetaChangeset>(create);
-  static RowMetaChangeset? _defaultInstance;
-
-  RowMetaChangeset_OneOfHeight whichOneOfHeight() => _RowMetaChangeset_OneOfHeightByTag[$_whichOneof(0)]!;
-  void clearOneOfHeight() => clearField($_whichOneof(0));
-
-  RowMetaChangeset_OneOfVisibility whichOneOfVisibility() => _RowMetaChangeset_OneOfVisibilityByTag[$_whichOneof(1)]!;
-  void clearOneOfVisibility() => clearField($_whichOneof(1));
-
-  @$pb.TagNumber(1)
-  $core.String get rowId => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set rowId($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasRowId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearRowId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.int get height => $_getIZ(1);
-  @$pb.TagNumber(2)
-  set height($core.int v) { $_setSignedInt32(1, v); }
-  @$pb.TagNumber(2)
-  $core.bool hasHeight() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearHeight() => clearField(2);
-
-  @$pb.TagNumber(3)
-  $core.bool get visibility => $_getBF(2);
-  @$pb.TagNumber(3)
-  set visibility($core.bool v) { $_setBool(2, v); }
-  @$pb.TagNumber(3)
-  $core.bool hasVisibility() => $_has(2);
-  @$pb.TagNumber(3)
-  void clearVisibility() => clearField(3);
-
-  @$pb.TagNumber(4)
-  $core.Map<$core.String, CellMeta> get cellByFieldId => $_getMap(3);
-}
-
-class CellMeta extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CellMeta', createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data')
-    ..hasRequiredFields = false
-  ;
-
-  CellMeta._() : super();
-  factory CellMeta({
-    $core.String? data,
-  }) {
-    final _result = create();
-    if (data != null) {
-      _result.data = data;
-    }
-    return _result;
-  }
-  factory CellMeta.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory CellMeta.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  CellMeta clone() => CellMeta()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  CellMeta copyWith(void Function(CellMeta) updates) => super.copyWith((message) => updates(message as CellMeta)) as CellMeta; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static CellMeta create() => CellMeta._();
-  CellMeta createEmptyInstance() => create();
-  static $pb.PbList<CellMeta> createRepeated() => $pb.PbList<CellMeta>();
-  @$core.pragma('dart2js:noInline')
-  static CellMeta getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CellMeta>(create);
-  static CellMeta? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.String get data => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set data($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasData() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearData() => clearField(1);
-}
-
-enum CellMetaChangeset_OneOfData {
-  data, 
-  notSet
-}
-
-class CellMetaChangeset extends $pb.GeneratedMessage {
-  static const $core.Map<$core.int, CellMetaChangeset_OneOfData> _CellMetaChangeset_OneOfDataByTag = {
-    4 : CellMetaChangeset_OneOfData.data,
-    0 : CellMetaChangeset_OneOfData.notSet
-  };
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CellMetaChangeset', createEmptyInstance: create)
-    ..oo(0, [4])
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId')
-    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId')
-    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data')
-    ..hasRequiredFields = false
-  ;
-
-  CellMetaChangeset._() : super();
-  factory CellMetaChangeset({
-    $core.String? gridId,
-    $core.String? rowId,
-    $core.String? fieldId,
-    $core.String? data,
-  }) {
-    final _result = create();
-    if (gridId != null) {
-      _result.gridId = gridId;
-    }
-    if (rowId != null) {
-      _result.rowId = rowId;
-    }
-    if (fieldId != null) {
-      _result.fieldId = fieldId;
-    }
-    if (data != null) {
-      _result.data = data;
-    }
-    return _result;
-  }
-  factory CellMetaChangeset.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory CellMetaChangeset.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  CellMetaChangeset clone() => CellMetaChangeset()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  CellMetaChangeset copyWith(void Function(CellMetaChangeset) updates) => super.copyWith((message) => updates(message as CellMetaChangeset)) as CellMetaChangeset; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static CellMetaChangeset create() => CellMetaChangeset._();
-  CellMetaChangeset createEmptyInstance() => create();
-  static $pb.PbList<CellMetaChangeset> createRepeated() => $pb.PbList<CellMetaChangeset>();
-  @$core.pragma('dart2js:noInline')
-  static CellMetaChangeset getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CellMetaChangeset>(create);
-  static CellMetaChangeset? _defaultInstance;
-
-  CellMetaChangeset_OneOfData whichOneOfData() => _CellMetaChangeset_OneOfDataByTag[$_whichOneof(0)]!;
-  void clearOneOfData() => clearField($_whichOneof(0));
-
-  @$pb.TagNumber(1)
-  $core.String get gridId => $_getSZ(0);
-  @$pb.TagNumber(1)
-  set gridId($core.String v) { $_setString(0, v); }
-  @$pb.TagNumber(1)
-  $core.bool hasGridId() => $_has(0);
-  @$pb.TagNumber(1)
-  void clearGridId() => clearField(1);
-
-  @$pb.TagNumber(2)
-  $core.String get rowId => $_getSZ(1);
-  @$pb.TagNumber(2)
-  set rowId($core.String v) { $_setString(1, v); }
-  @$pb.TagNumber(2)
-  $core.bool hasRowId() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearRowId() => clearField(2);
-
-  @$pb.TagNumber(3)
-  $core.String get fieldId => $_getSZ(2);
-  @$pb.TagNumber(3)
-  set fieldId($core.String v) { $_setString(2, v); }
-  @$pb.TagNumber(3)
-  $core.bool hasFieldId() => $_has(2);
-  @$pb.TagNumber(3)
-  void clearFieldId() => clearField(3);
-
-  @$pb.TagNumber(4)
-  $core.String get data => $_getSZ(3);
-  @$pb.TagNumber(4)
-  set data($core.String v) { $_setString(3, v); }
-  @$pb.TagNumber(4)
-  $core.bool hasData() => $_has(3);
-  @$pb.TagNumber(4)
-  void clearData() => clearField(4);
-}
-
-class BuildGridContext extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildGridContext', createEmptyInstance: create)
-    ..pc<FieldMeta>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldMetas', $pb.PbFieldType.PM, subBuilder: FieldMeta.create)
-    ..aOM<GridBlockMeta>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockMeta', subBuilder: GridBlockMeta.create)
-    ..aOM<GridBlockMetaData>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockMetaData', subBuilder: GridBlockMetaData.create)
-    ..hasRequiredFields = false
-  ;
-
-  BuildGridContext._() : super();
-  factory BuildGridContext({
-    $core.Iterable<FieldMeta>? fieldMetas,
-    GridBlockMeta? blockMeta,
-    GridBlockMetaData? blockMetaData,
-  }) {
-    final _result = create();
-    if (fieldMetas != null) {
-      _result.fieldMetas.addAll(fieldMetas);
-    }
-    if (blockMeta != null) {
-      _result.blockMeta = blockMeta;
-    }
-    if (blockMetaData != null) {
-      _result.blockMetaData = blockMetaData;
-    }
-    return _result;
-  }
-  factory BuildGridContext.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory BuildGridContext.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  BuildGridContext clone() => BuildGridContext()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  BuildGridContext copyWith(void Function(BuildGridContext) updates) => super.copyWith((message) => updates(message as BuildGridContext)) as BuildGridContext; // ignore: deprecated_member_use
-  $pb.BuilderInfo get info_ => _i;
-  @$core.pragma('dart2js:noInline')
-  static BuildGridContext create() => BuildGridContext._();
-  BuildGridContext createEmptyInstance() => create();
-  static $pb.PbList<BuildGridContext> createRepeated() => $pb.PbList<BuildGridContext>();
-  @$core.pragma('dart2js:noInline')
-  static BuildGridContext getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildGridContext>(create);
-  static BuildGridContext? _defaultInstance;
-
-  @$pb.TagNumber(1)
-  $core.List<FieldMeta> get fieldMetas => $_getList(0);
-
-  @$pb.TagNumber(2)
-  GridBlockMeta get blockMeta => $_getN(1);
-  @$pb.TagNumber(2)
-  set blockMeta(GridBlockMeta v) { setField(2, v); }
-  @$pb.TagNumber(2)
-  $core.bool hasBlockMeta() => $_has(1);
-  @$pb.TagNumber(2)
-  void clearBlockMeta() => clearField(2);
-  @$pb.TagNumber(2)
-  GridBlockMeta ensureBlockMeta() => $_ensure(1);
-
-  @$pb.TagNumber(3)
-  GridBlockMetaData get blockMetaData => $_getN(2);
-  @$pb.TagNumber(3)
-  set blockMetaData(GridBlockMetaData v) { setField(3, v); }
-  @$pb.TagNumber(3)
-  $core.bool hasBlockMetaData() => $_has(2);
-  @$pb.TagNumber(3)
-  void clearBlockMetaData() => clearField(3);
-  @$pb.TagNumber(3)
-  GridBlockMetaData ensureBlockMetaData() => $_ensure(2);
-}
-

+ 0 - 34
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbenum.dart

@@ -1,34 +0,0 @@
-///
-//  Generated code. Do not modify.
-//  source: meta.proto
-//
-// @dart = 2.12
-// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
-
-// ignore_for_file: UNDEFINED_SHOWN_NAME
-import 'dart:core' as $core;
-import 'package:protobuf/protobuf.dart' as $pb;
-
-class FieldType extends $pb.ProtobufEnum {
-  static const FieldType RichText = FieldType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RichText');
-  static const FieldType Number = FieldType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Number');
-  static const FieldType DateTime = FieldType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DateTime');
-  static const FieldType SingleSelect = FieldType._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SingleSelect');
-  static const FieldType MultiSelect = FieldType._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'MultiSelect');
-  static const FieldType Checkbox = FieldType._(5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Checkbox');
-
-  static const $core.List<FieldType> values = <FieldType> [
-    RichText,
-    Number,
-    DateTime,
-    SingleSelect,
-    MultiSelect,
-    Checkbox,
-  ];
-
-  static final $core.Map<$core.int, FieldType> _byValue = $pb.ProtobufEnum.initByValue(values);
-  static FieldType? valueOf($core.int value) => _byValue[value];
-
-  const FieldType._($core.int v, $core.String n) : super(v, n);
-}
-

+ 0 - 217
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart

@@ -1,217 +0,0 @@
-///
-//  Generated code. Do not modify.
-//  source: meta.proto
-//
-// @dart = 2.12
-// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
-
-import 'dart:core' as $core;
-import 'dart:convert' as $convert;
-import 'dart:typed_data' as $typed_data;
-@$core.Deprecated('Use fieldTypeDescriptor instead')
-const FieldType$json = const {
-  '1': 'FieldType',
-  '2': const [
-    const {'1': 'RichText', '2': 0},
-    const {'1': 'Number', '2': 1},
-    const {'1': 'DateTime', '2': 2},
-    const {'1': 'SingleSelect', '2': 3},
-    const {'1': 'MultiSelect', '2': 4},
-    const {'1': 'Checkbox', '2': 5},
-  ],
-};
-
-/// Descriptor for `FieldType`. Decode as a `google.protobuf.EnumDescriptorProto`.
-final $typed_data.Uint8List fieldTypeDescriptor = $convert.base64Decode('CglGaWVsZFR5cGUSDAoIUmljaFRleHQQABIKCgZOdW1iZXIQARIMCghEYXRlVGltZRACEhAKDFNpbmdsZVNlbGVjdBADEg8KC011bHRpU2VsZWN0EAQSDAoIQ2hlY2tib3gQBQ==');
-@$core.Deprecated('Use gridMetaDescriptor instead')
-const GridMeta$json = const {
-  '1': 'GridMeta',
-  '2': const [
-    const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'},
-    const {'1': 'fields', '3': 2, '4': 3, '5': 11, '6': '.FieldMeta', '10': 'fields'},
-    const {'1': 'blocks', '3': 3, '4': 3, '5': 11, '6': '.GridBlockMeta', '10': 'blocks'},
-  ],
-};
-
-/// Descriptor for `GridMeta`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List gridMetaDescriptor = $convert.base64Decode('CghHcmlkTWV0YRIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSIgoGZmllbGRzGAIgAygLMgouRmllbGRNZXRhUgZmaWVsZHMSJgoGYmxvY2tzGAMgAygLMg4uR3JpZEJsb2NrTWV0YVIGYmxvY2tz');
-@$core.Deprecated('Use gridBlockMetaDescriptor instead')
-const GridBlockMeta$json = const {
-  '1': 'GridBlockMeta',
-  '2': const [
-    const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'},
-    const {'1': 'start_row_index', '3': 2, '4': 1, '5': 5, '10': 'startRowIndex'},
-    const {'1': 'row_count', '3': 3, '4': 1, '5': 5, '10': 'rowCount'},
-  ],
-};
-
-/// Descriptor for `GridBlockMeta`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List gridBlockMetaDescriptor = $convert.base64Decode('Cg1HcmlkQmxvY2tNZXRhEhkKCGJsb2NrX2lkGAEgASgJUgdibG9ja0lkEiYKD3N0YXJ0X3Jvd19pbmRleBgCIAEoBVINc3RhcnRSb3dJbmRleBIbCglyb3dfY291bnQYAyABKAVSCHJvd0NvdW50');
-@$core.Deprecated('Use gridBlockMetaDataDescriptor instead')
-const GridBlockMetaData$json = const {
-  '1': 'GridBlockMetaData',
-  '2': const [
-    const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'},
-    const {'1': 'rows', '3': 2, '4': 3, '5': 11, '6': '.RowMeta', '10': 'rows'},
-  ],
-};
-
-/// Descriptor for `GridBlockMetaData`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List gridBlockMetaDataDescriptor = $convert.base64Decode('ChFHcmlkQmxvY2tNZXRhRGF0YRIZCghibG9ja19pZBgBIAEoCVIHYmxvY2tJZBIcCgRyb3dzGAIgAygLMgguUm93TWV0YVIEcm93cw==');
-@$core.Deprecated('Use fieldMetaDescriptor instead')
-const FieldMeta$json = const {
-  '1': 'FieldMeta',
-  '2': const [
-    const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
-    const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},
-    const {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},
-    const {'1': 'field_type', '3': 4, '4': 1, '5': 14, '6': '.FieldType', '10': 'fieldType'},
-    const {'1': 'frozen', '3': 5, '4': 1, '5': 8, '10': 'frozen'},
-    const {'1': 'visibility', '3': 6, '4': 1, '5': 8, '10': 'visibility'},
-    const {'1': 'width', '3': 7, '4': 1, '5': 5, '10': 'width'},
-    const {'1': 'type_options', '3': 8, '4': 3, '5': 11, '6': '.FieldMeta.TypeOptionsEntry', '10': 'typeOptions'},
-  ],
-  '3': const [FieldMeta_TypeOptionsEntry$json],
-};
-
-@$core.Deprecated('Use fieldMetaDescriptor instead')
-const FieldMeta_TypeOptionsEntry$json = const {
-  '1': 'TypeOptionsEntry',
-  '2': const [
-    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
-    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
-  ],
-  '7': const {'7': true},
-};
-
-/// Descriptor for `FieldMeta`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List fieldMetaDescriptor = $convert.base64Decode('CglGaWVsZE1ldGESDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEgoEZGVzYxgDIAEoCVIEZGVzYxIpCgpmaWVsZF90eXBlGAQgASgOMgouRmllbGRUeXBlUglmaWVsZFR5cGUSFgoGZnJvemVuGAUgASgIUgZmcm96ZW4SHgoKdmlzaWJpbGl0eRgGIAEoCFIKdmlzaWJpbGl0eRIUCgV3aWR0aBgHIAEoBVIFd2lkdGgSPgoMdHlwZV9vcHRpb25zGAggAygLMhsuRmllbGRNZXRhLlR5cGVPcHRpb25zRW50cnlSC3R5cGVPcHRpb25zGj4KEFR5cGVPcHRpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');
-@$core.Deprecated('Use fieldChangesetPayloadDescriptor instead')
-const FieldChangesetPayload$json = const {
-  '1': 'FieldChangesetPayload',
-  '2': const [
-    const {'1': 'field_id', '3': 1, '4': 1, '5': 9, '10': 'fieldId'},
-    const {'1': 'grid_id', '3': 2, '4': 1, '5': 9, '10': 'gridId'},
-    const {'1': 'name', '3': 3, '4': 1, '5': 9, '9': 0, '10': 'name'},
-    const {'1': 'desc', '3': 4, '4': 1, '5': 9, '9': 1, '10': 'desc'},
-    const {'1': 'field_type', '3': 5, '4': 1, '5': 14, '6': '.FieldType', '9': 2, '10': 'fieldType'},
-    const {'1': 'frozen', '3': 6, '4': 1, '5': 8, '9': 3, '10': 'frozen'},
-    const {'1': 'visibility', '3': 7, '4': 1, '5': 8, '9': 4, '10': 'visibility'},
-    const {'1': 'width', '3': 8, '4': 1, '5': 5, '9': 5, '10': 'width'},
-    const {'1': 'type_option_data', '3': 9, '4': 1, '5': 12, '9': 6, '10': 'typeOptionData'},
-  ],
-  '8': const [
-    const {'1': 'one_of_name'},
-    const {'1': 'one_of_desc'},
-    const {'1': 'one_of_field_type'},
-    const {'1': 'one_of_frozen'},
-    const {'1': 'one_of_visibility'},
-    const {'1': 'one_of_width'},
-    const {'1': 'one_of_type_option_data'},
-  ],
-};
-
-/// Descriptor for `FieldChangesetPayload`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List fieldChangesetPayloadDescriptor = $convert.base64Decode('ChVGaWVsZENoYW5nZXNldFBheWxvYWQSGQoIZmllbGRfaWQYASABKAlSB2ZpZWxkSWQSFwoHZ3JpZF9pZBgCIAEoCVIGZ3JpZElkEhQKBG5hbWUYAyABKAlIAFIEbmFtZRIUCgRkZXNjGAQgASgJSAFSBGRlc2MSKwoKZmllbGRfdHlwZRgFIAEoDjIKLkZpZWxkVHlwZUgCUglmaWVsZFR5cGUSGAoGZnJvemVuGAYgASgISANSBmZyb3plbhIgCgp2aXNpYmlsaXR5GAcgASgISARSCnZpc2liaWxpdHkSFgoFd2lkdGgYCCABKAVIBVIFd2lkdGgSKgoQdHlwZV9vcHRpb25fZGF0YRgJIAEoDEgGUg50eXBlT3B0aW9uRGF0YUINCgtvbmVfb2ZfbmFtZUINCgtvbmVfb2ZfZGVzY0ITChFvbmVfb2ZfZmllbGRfdHlwZUIPCg1vbmVfb2ZfZnJvemVuQhMKEW9uZV9vZl92aXNpYmlsaXR5Qg4KDG9uZV9vZl93aWR0aEIZChdvbmVfb2ZfdHlwZV9vcHRpb25fZGF0YQ==');
-@$core.Deprecated('Use anyDataDescriptor instead')
-const AnyData$json = const {
-  '1': 'AnyData',
-  '2': const [
-    const {'1': 'type_id', '3': 1, '4': 1, '5': 9, '10': 'typeId'},
-    const {'1': 'value', '3': 2, '4': 1, '5': 12, '10': 'value'},
-  ],
-};
-
-/// Descriptor for `AnyData`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List anyDataDescriptor = $convert.base64Decode('CgdBbnlEYXRhEhcKB3R5cGVfaWQYASABKAlSBnR5cGVJZBIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU=');
-@$core.Deprecated('Use rowMetaDescriptor instead')
-const RowMeta$json = const {
-  '1': 'RowMeta',
-  '2': const [
-    const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
-    const {'1': 'block_id', '3': 2, '4': 1, '5': 9, '10': 'blockId'},
-    const {'1': 'cells', '3': 3, '4': 3, '5': 11, '6': '.RowMeta.CellsEntry', '10': 'cells'},
-    const {'1': 'height', '3': 4, '4': 1, '5': 5, '10': 'height'},
-    const {'1': 'visibility', '3': 5, '4': 1, '5': 8, '10': 'visibility'},
-  ],
-  '3': const [RowMeta_CellsEntry$json],
-};
-
-@$core.Deprecated('Use rowMetaDescriptor instead')
-const RowMeta_CellsEntry$json = const {
-  '1': 'CellsEntry',
-  '2': const [
-    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
-    const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.CellMeta', '10': 'value'},
-  ],
-  '7': const {'7': true},
-};
-
-/// Descriptor for `RowMeta`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List rowMetaDescriptor = $convert.base64Decode('CgdSb3dNZXRhEg4KAmlkGAEgASgJUgJpZBIZCghibG9ja19pZBgCIAEoCVIHYmxvY2tJZBIpCgVjZWxscxgDIAMoCzITLlJvd01ldGEuQ2VsbHNFbnRyeVIFY2VsbHMSFgoGaGVpZ2h0GAQgASgFUgZoZWlnaHQSHgoKdmlzaWJpbGl0eRgFIAEoCFIKdmlzaWJpbGl0eRpDCgpDZWxsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Eh8KBXZhbHVlGAIgASgLMgkuQ2VsbE1ldGFSBXZhbHVlOgI4AQ==');
-@$core.Deprecated('Use rowMetaChangesetDescriptor instead')
-const RowMetaChangeset$json = const {
-  '1': 'RowMetaChangeset',
-  '2': const [
-    const {'1': 'row_id', '3': 1, '4': 1, '5': 9, '10': 'rowId'},
-    const {'1': 'height', '3': 2, '4': 1, '5': 5, '9': 0, '10': 'height'},
-    const {'1': 'visibility', '3': 3, '4': 1, '5': 8, '9': 1, '10': 'visibility'},
-    const {'1': 'cell_by_field_id', '3': 4, '4': 3, '5': 11, '6': '.RowMetaChangeset.CellByFieldIdEntry', '10': 'cellByFieldId'},
-  ],
-  '3': const [RowMetaChangeset_CellByFieldIdEntry$json],
-  '8': const [
-    const {'1': 'one_of_height'},
-    const {'1': 'one_of_visibility'},
-  ],
-};
-
-@$core.Deprecated('Use rowMetaChangesetDescriptor instead')
-const RowMetaChangeset_CellByFieldIdEntry$json = const {
-  '1': 'CellByFieldIdEntry',
-  '2': const [
-    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
-    const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.CellMeta', '10': 'value'},
-  ],
-  '7': const {'7': true},
-};
-
-/// Descriptor for `RowMetaChangeset`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List rowMetaChangesetDescriptor = $convert.base64Decode('ChBSb3dNZXRhQ2hhbmdlc2V0EhUKBnJvd19pZBgBIAEoCVIFcm93SWQSGAoGaGVpZ2h0GAIgASgFSABSBmhlaWdodBIgCgp2aXNpYmlsaXR5GAMgASgISAFSCnZpc2liaWxpdHkSTQoQY2VsbF9ieV9maWVsZF9pZBgEIAMoCzIkLlJvd01ldGFDaGFuZ2VzZXQuQ2VsbEJ5RmllbGRJZEVudHJ5Ug1jZWxsQnlGaWVsZElkGksKEkNlbGxCeUZpZWxkSWRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIfCgV2YWx1ZRgCIAEoCzIJLkNlbGxNZXRhUgV2YWx1ZToCOAFCDwoNb25lX29mX2hlaWdodEITChFvbmVfb2ZfdmlzaWJpbGl0eQ==');
-@$core.Deprecated('Use cellMetaDescriptor instead')
-const CellMeta$json = const {
-  '1': 'CellMeta',
-  '2': const [
-    const {'1': 'data', '3': 1, '4': 1, '5': 9, '10': 'data'},
-  ],
-};
-
-/// Descriptor for `CellMeta`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List cellMetaDescriptor = $convert.base64Decode('CghDZWxsTWV0YRISCgRkYXRhGAEgASgJUgRkYXRh');
-@$core.Deprecated('Use cellMetaChangesetDescriptor instead')
-const CellMetaChangeset$json = const {
-  '1': 'CellMetaChangeset',
-  '2': const [
-    const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'},
-    const {'1': 'row_id', '3': 2, '4': 1, '5': 9, '10': 'rowId'},
-    const {'1': 'field_id', '3': 3, '4': 1, '5': 9, '10': 'fieldId'},
-    const {'1': 'data', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'data'},
-  ],
-  '8': const [
-    const {'1': 'one_of_data'},
-  ],
-};
-
-/// Descriptor for `CellMetaChangeset`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List cellMetaChangesetDescriptor = $convert.base64Decode('ChFDZWxsTWV0YUNoYW5nZXNldBIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSFQoGcm93X2lkGAIgASgJUgVyb3dJZBIZCghmaWVsZF9pZBgDIAEoCVIHZmllbGRJZBIUCgRkYXRhGAQgASgJSABSBGRhdGFCDQoLb25lX29mX2RhdGE=');
-@$core.Deprecated('Use buildGridContextDescriptor instead')
-const BuildGridContext$json = const {
-  '1': 'BuildGridContext',
-  '2': const [
-    const {'1': 'field_metas', '3': 1, '4': 3, '5': 11, '6': '.FieldMeta', '10': 'fieldMetas'},
-    const {'1': 'block_meta', '3': 2, '4': 1, '5': 11, '6': '.GridBlockMeta', '10': 'blockMeta'},
-    const {'1': 'block_meta_data', '3': 3, '4': 1, '5': 11, '6': '.GridBlockMetaData', '10': 'blockMetaData'},
-  ],
-};
-
-/// Descriptor for `BuildGridContext`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List buildGridContextDescriptor = $convert.base64Decode('ChBCdWlsZEdyaWRDb250ZXh0EisKC2ZpZWxkX21ldGFzGAEgAygLMgouRmllbGRNZXRhUgpmaWVsZE1ldGFzEi0KCmJsb2NrX21ldGEYAiABKAsyDi5HcmlkQmxvY2tNZXRhUglibG9ja01ldGESOgoPYmxvY2tfbWV0YV9kYXRhGAMgASgLMhIuR3JpZEJsb2NrTWV0YURhdGFSDWJsb2NrTWV0YURhdGE=');

+ 0 - 9
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbserver.dart

@@ -1,9 +0,0 @@
-///
-//  Generated code. Do not modify.
-//  source: meta.proto
-//
-// @dart = 2.12
-// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
-
-export 'meta.pb.dart';
-

+ 0 - 1
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/protobuf.dart

@@ -1,3 +1,2 @@
 // Auto-generated, do not edit 
 export './grid.pb.dart';
-export './meta.pb.dart';

+ 21 - 8
frontend/rust-lib/Cargo.lock

@@ -919,6 +919,7 @@ dependencies = [
  "flowy-error-code",
  "lib-infra",
  "log",
+ "nanoid",
  "protobuf",
  "serde",
  "serde_json",
@@ -926,7 +927,6 @@ dependencies = [
  "strum",
  "strum_macros",
  "unicode-segmentation",
- "uuid",
 ]
 
 [[package]]
@@ -946,10 +946,12 @@ dependencies = [
  "flowy-revision",
  "flowy-sync",
  "flowy-test",
+ "indexmap",
  "lazy_static",
  "lib-dispatch",
  "lib-infra",
  "lib-ot",
+ "nanoid",
  "protobuf",
  "rayon",
  "rust_decimal",
@@ -961,7 +963,6 @@ dependencies = [
  "strum_macros",
  "tokio",
  "tracing",
- "uuid",
 ]
 
 [[package]]
@@ -971,14 +972,15 @@ dependencies = [
  "bytes",
  "flowy-derive",
  "flowy-error-code",
+ "indexmap",
  "lib-infra",
+ "nanoid",
  "protobuf",
  "serde",
  "serde_json",
  "serde_repr",
  "strum",
  "strum_macros",
- "uuid",
 ]
 
 [[package]]
@@ -1006,6 +1008,7 @@ dependencies = [
  "lib-infra",
  "lib-ws",
  "log",
+ "nanoid",
  "parking_lot",
  "protobuf",
  "reqwest",
@@ -1120,6 +1123,7 @@ dependencies = [
  "lib-infra",
  "lib-ot",
  "log",
+ "nanoid",
  "protobuf",
  "quickcheck",
  "quickcheck_macros",
@@ -1188,6 +1192,7 @@ dependencies = [
  "lib-dispatch",
  "lib-infra",
  "log",
+ "nanoid",
  "once_cell",
  "parking_lot",
  "protobuf",
@@ -1611,12 +1616,13 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
 
 [[package]]
 name = "indexmap"
-version = "1.8.0"
+version = "1.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223"
+checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee"
 dependencies = [
  "autocfg",
  "hashbrown",
+ "serde",
 ]
 
 [[package]]
@@ -1699,6 +1705,7 @@ dependencies = [
  "futures-util",
  "lazy_static",
  "log",
+ "nanoid",
  "paste",
  "pin-project",
  "protobuf",
@@ -1708,7 +1715,6 @@ dependencies = [
  "thread-id",
  "tokio",
  "tracing",
- "uuid",
 ]
 
 [[package]]
@@ -1737,7 +1743,6 @@ dependencies = [
  "tera",
  "tokio",
  "toml",
- "uuid",
  "walkdir",
 ]
 
@@ -1962,6 +1967,15 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "nanoid"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8"
+dependencies = [
+ "rand 0.8.4",
+]
+
 [[package]]
 name = "native-tls"
 version = "0.2.8"
@@ -3584,7 +3598,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
 dependencies = [
  "getrandom 0.2.3",
- "serde",
 ]
 
 [[package]]

+ 3 - 4
frontend/rust-lib/flowy-folder/src/services/view/controller.rs

@@ -14,10 +14,9 @@ use crate::{
 };
 use bytes::Bytes;
 use flowy_database::kv::KV;
-use flowy_folder_data_model::entities::view::ViewDataType;
+use flowy_folder_data_model::entities::view::{gen_view_id, ViewDataType};
 use flowy_sync::entities::text_block_info::TextBlockId;
 use futures::{FutureExt, StreamExt};
-use lib_infra::uuid;
 use std::{collections::HashSet, sync::Arc};
 
 const LATEST_VIEW_ID: &str = "latest_view_id";
@@ -151,7 +150,7 @@ impl ViewController {
             }
         }
         let processor = self.get_data_processor_from_view_id(&params.value).await?;
-        let _ = processor.close_container(&params.value).await?;
+        let _ = processor.delete_container(&params.value).await?;
         Ok(())
     }
 
@@ -171,7 +170,7 @@ impl ViewController {
             thumbnail: view.thumbnail,
             data_type: view.data_type,
             data: delta_bytes.to_vec(),
-            view_id: uuid(),
+            view_id: gen_view_id(),
             plugin_type: view.plugin_type,
         };
 

+ 2 - 1
frontend/rust-lib/flowy-grid/Cargo.toml

@@ -25,7 +25,7 @@ rust_decimal = "1.8.1"
 rusty-money = {version = "0.4.0", features = ["iso"]}
 lazy_static = "1.4.0"
 chrono = "0.4.19"
-uuid = { version = "0.8", features = ["serde", "v4"] }
+nanoid = "0.4.0"
 bytes = { version = "1.0" }
 diesel = {version = "1.4.8", features = ["sqlite"]}
 dashmap = "4.0"
@@ -34,6 +34,7 @@ rayon = "1.5"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = {version = "1.0"}
 serde_repr = "0.1"
+indexmap = {version = "1.8.1", features = ["serde"]}
 
 [dev-dependencies]
 flowy-test = { path = "../flowy-test" }

+ 4 - 4
frontend/rust-lib/flowy-grid/src/event_handler.rs

@@ -227,10 +227,10 @@ pub(crate) async fn get_cell_handler(
 
 #[tracing::instrument(level = "debug", skip_all, err)]
 pub(crate) async fn update_cell_handler(
-    data: Data<CellMetaChangeset>,
+    data: Data<CellChangeset>,
     manager: AppData<Arc<GridManager>>,
 ) -> Result<(), FlowyError> {
-    let changeset: CellMetaChangeset = data.into_inner();
+    let changeset: CellChangeset = data.into_inner();
     let editor = manager.get_grid_editor(&changeset.grid_id)?;
     let _ = editor.update_cell(changeset).await?;
     Ok(())
@@ -271,7 +271,7 @@ pub(crate) async fn select_option_changeset_handler(
         field_meta.insert_type_option_entry(&*type_option);
         let _ = editor.replace_field(field_meta).await?;
 
-        let changeset = CellMetaChangeset {
+        let changeset = CellChangeset {
             grid_id: changeset.cell_identifier.grid_id,
             row_id: changeset.cell_identifier.row_id,
             field_id: changeset.cell_identifier.field_id,
@@ -310,7 +310,7 @@ pub(crate) async fn select_option_cell_changeset_handler(
 ) -> Result<(), FlowyError> {
     let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?;
     let editor = manager.get_grid_editor(&params.grid_id)?;
-    let changeset: CellMetaChangeset = params.into();
+    let changeset: CellChangeset = params.into();
     let _ = editor.update_cell(changeset).await?;
     Ok(())
 }

+ 1 - 1
frontend/rust-lib/flowy-grid/src/event_map.rs

@@ -92,7 +92,7 @@ pub enum GridEvent {
     #[event(input = "CellIdentifierPayload", output = "Cell")]
     GetCell = 70,
 
-    #[event(input = "CellMetaChangeset")]
+    #[event(input = "CellChangeset")]
     UpdateCell = 71,
 
     #[event(input = "SelectOptionCellChangesetPayload")]

+ 2 - 2
frontend/rust-lib/flowy-grid/src/macros.rs

@@ -30,7 +30,7 @@ macro_rules! impl_type_option {
     ($target: ident, $field_type:expr) => {
         impl std::convert::From<&FieldMeta> for $target {
             fn from(field_meta: &FieldMeta) -> $target {
-                match field_meta.get_type_option_entry::<$target>(Some($field_type)) {
+                match field_meta.get_type_option_entry::<$target>(&$field_type) {
                     None => $target::default(),
                     Some(target) => target,
                 }
@@ -63,7 +63,7 @@ macro_rules! impl_type_option {
             }
         }
 
-        impl TypeOptionDataEntity for $target {
+        impl TypeOptionDataDeserializer for $target {
             fn from_json_str(s: &str) -> $target {
                 match serde_json::from_str(s) {
                     Ok(obj) => obj,

+ 1 - 1
frontend/rust-lib/flowy-grid/src/manager.rs

@@ -73,7 +73,7 @@ impl GridManager {
         self.get_or_create_grid_editor(grid_id).await
     }
 
-    #[tracing::instrument(level = "trace", skip_all, fields(grid_id), err)]
+    #[tracing::instrument(level = "debug", skip_all, fields(grid_id), err)]
     pub fn close_grid<T: AsRef<str>>(&self, grid_id: T) -> FlowyResult<()> {
         let grid_id = grid_id.as_ref();
         tracing::Span::current().record("grid_id", &grid_id);

+ 2 - 2
frontend/rust-lib/flowy-grid/src/services/block_meta_manager.rs

@@ -8,7 +8,7 @@ use std::borrow::Cow;
 use dashmap::DashMap;
 use flowy_error::FlowyResult;
 use flowy_grid_data_model::entities::{
-    CellMeta, CellMetaChangeset, CellNotificationData, FieldMeta, GridBlockMeta, GridBlockMetaChangeset,
+    CellChangeset, CellMeta, CellNotificationData, FieldMeta, GridBlockMeta, GridBlockMetaChangeset,
     GridBlockOrderChangeset, IndexRowOrder, RowMeta, RowMetaChangeset, RowOrder,
 };
 use flowy_revision::disk::SQLiteGridBlockMetaRevisionPersistence;
@@ -154,7 +154,7 @@ impl GridBlockMetaEditorManager {
         Ok(changesets)
     }
 
-    pub async fn update_cell(&self, changeset: CellMetaChangeset) -> FlowyResult<()> {
+    pub async fn update_cell(&self, changeset: CellChangeset) -> FlowyResult<()> {
         let row_id = changeset.row_id.clone();
         let editor = self.get_editor_from_row_id(&row_id).await?;
         let row_changeset: RowMetaChangeset = changeset.clone().into();

+ 4 - 4
frontend/rust-lib/flowy-grid/src/services/cell/cell_entities.rs

@@ -1,6 +1,6 @@
 use flowy_derive::ProtoBuf;
 use flowy_error::ErrorCode;
-use flowy_grid_data_model::parser::{NotEmptyStr, NotEmptyUuid};
+use flowy_grid_data_model::parser::NotEmptyStr;
 
 #[derive(ProtoBuf, Default)]
 pub struct CreateSelectOptionPayload {
@@ -51,9 +51,9 @@ impl TryInto<CellIdentifier> for CellIdentifierPayload {
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<CellIdentifier, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
-        let field_id = NotEmptyUuid::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
-        let row_id = NotEmptyUuid::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let field_id = NotEmptyStr::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
+        let row_id = NotEmptyStr::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?;
         Ok(CellIdentifier {
             grid_id: grid_id.0,
             field_id: field_id.0,

+ 2 - 2
frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs

@@ -1,7 +1,7 @@
 use crate::services::field::type_options::*;
 use bytes::Bytes;
 use flowy_grid_data_model::entities::{Field, FieldMeta, FieldType, TypeOptionDataEntry};
-use std::collections::HashMap;
+use indexmap::IndexMap;
 
 pub struct FieldBuilder {
     field_meta: FieldMeta,
@@ -34,7 +34,7 @@ impl FieldBuilder {
             frozen: field.frozen,
             visibility: field.visibility,
             width: field.width,
-            type_options: HashMap::default(),
+            type_options: IndexMap::default(),
         };
         Self {
             field_meta,

+ 3 - 3
frontend/rust-lib/flowy-grid/src/services/field/field_entities.rs

@@ -1,6 +1,6 @@
 use flowy_derive::ProtoBuf;
 use flowy_error::ErrorCode;
-use flowy_grid_data_model::parser::NotEmptyUuid;
+use flowy_grid_data_model::parser::NotEmptyStr;
 
 #[derive(Debug, Clone, Default, ProtoBuf)]
 pub struct FieldIdentifierPayload {
@@ -20,8 +20,8 @@ impl TryInto<FieldIdentifier> for FieldIdentifierPayload {
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<FieldIdentifier, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
-        let field_id = NotEmptyUuid::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let field_id = NotEmptyStr::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
         Ok(FieldIdentifier {
             grid_id: grid_id.0,
             field_id: field_id.0,

+ 4 - 1
frontend/rust-lib/flowy-grid/src/services/field/type_options/checkbox_type_option.rs

@@ -4,7 +4,10 @@ use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellD
 use bytes::Bytes;
 use flowy_derive::ProtoBuf;
 use flowy_error::FlowyError;
-use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry};
+use flowy_grid_data_model::entities::{
+    CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
+};
+
 use serde::{Deserialize, Serialize};
 use std::str::FromStr;
 

+ 4 - 1
frontend/rust-lib/flowy-grid/src/services/field/type_options/date_type_option.rs

@@ -5,7 +5,10 @@ use chrono::format::strftime::StrftimeItems;
 use chrono::NaiveDateTime;
 use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
 use flowy_error::FlowyError;
-use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry};
+use flowy_grid_data_model::entities::{
+    CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
+};
+
 use serde::{Deserialize, Serialize};
 use std::str::FromStr;
 

+ 4 - 1
frontend/rust-lib/flowy-grid/src/services/field/type_options/number_type_option.rs

@@ -2,7 +2,10 @@ use crate::impl_type_option;
 use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellData};
 use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
 use flowy_error::FlowyError;
-use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry};
+use flowy_grid_data_model::entities::{
+    CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
+};
+
 use lazy_static::lazy_static;
 
 use rust_decimal::Decimal;

+ 11 - 11
frontend/rust-lib/flowy-grid/src/services/field/type_options/selection_type_option.rs

@@ -2,14 +2,14 @@ use crate::impl_type_option;
 use crate::services::cell::{CellIdentifier, CellIdentifierPayload};
 use crate::services::field::{BoxTypeOptionBuilder, TypeOptionBuilder};
 use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellData};
-use crate::services::util::*;
 use bytes::Bytes;
 use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
 use flowy_error::{ErrorCode, FlowyError};
 use flowy_grid_data_model::entities::{
-    CellMeta, CellMetaChangeset, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry,
+    CellChangeset, CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
 };
-use flowy_grid_data_model::parser::NotEmptyUuid;
+use flowy_grid_data_model::parser::NotEmptyStr;
+use nanoid::nanoid;
 use serde::{Deserialize, Serialize};
 use std::str::FromStr;
 
@@ -260,7 +260,7 @@ pub struct SelectOption {
 impl SelectOption {
     pub fn new(name: &str) -> Self {
         SelectOption {
-            id: uuid(),
+            id: nanoid!(4),
             name: name.to_owned(),
             color: SelectOptionColor::default(),
         }
@@ -356,14 +356,14 @@ impl SelectOptionCellChangeset {
     }
 }
 
-impl std::convert::From<SelectOptionCellChangesetParams> for CellMetaChangeset {
+impl std::convert::From<SelectOptionCellChangesetParams> for CellChangeset {
     fn from(params: SelectOptionCellChangesetParams) -> Self {
         let changeset = SelectOptionCellChangeset {
             insert_option_id: params.insert_option_id,
             delete_option_id: params.delete_option_id,
         };
         let s = serde_json::to_string(&changeset).unwrap();
-        CellMetaChangeset {
+        CellChangeset {
             grid_id: params.grid_id,
             row_id: params.row_id,
             field_id: params.field_id,
@@ -376,13 +376,13 @@ impl TryInto<SelectOptionCellChangesetParams> for SelectOptionCellChangesetPaylo
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<SelectOptionCellChangesetParams, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
-        let row_id = NotEmptyUuid::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?;
-        let field_id = NotEmptyUuid::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let row_id = NotEmptyStr::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?;
+        let field_id = NotEmptyStr::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
         let insert_option_id = match self.insert_option_id {
             None => None,
             Some(insert_option_id) => Some(
-                NotEmptyUuid::parse(insert_option_id)
+                NotEmptyStr::parse(insert_option_id)
                     .map_err(|_| ErrorCode::OptionIdIsEmpty)?
                     .0,
             ),
@@ -391,7 +391,7 @@ impl TryInto<SelectOptionCellChangesetParams> for SelectOptionCellChangesetPaylo
         let delete_option_id = match self.delete_option_id {
             None => None,
             Some(delete_option_id) => Some(
-                NotEmptyUuid::parse(delete_option_id)
+                NotEmptyStr::parse(delete_option_id)
                     .map_err(|_| ErrorCode::OptionIdIsEmpty)?
                     .0,
             ),

+ 4 - 2
frontend/rust-lib/flowy-grid/src/services/field/type_options/text_type_option.rs

@@ -4,7 +4,9 @@ use crate::services::row::{decode_cell_data, CellDataChangeset, CellDataOperatio
 use bytes::Bytes;
 use flowy_derive::ProtoBuf;
 use flowy_error::FlowyError;
-use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry};
+use flowy_grid_data_model::entities::{
+    CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
+};
 use serde::{Deserialize, Serialize};
 use std::str::FromStr;
 
@@ -38,7 +40,7 @@ impl CellDataOperation for RichTextTypeOption {
                 || type_option_cell_data.is_multi_select()
                 || type_option_cell_data.is_number()
             {
-                decode_cell_data(data, field_meta).unwrap_or_else(|_| "".to_owned())
+                decode_cell_data(data, field_meta, &type_option_cell_data.field_type).unwrap_or_else(|| "".to_owned())
             } else {
                 type_option_cell_data.data
             }

+ 4 - 2
frontend/rust-lib/flowy-grid/src/services/grid_editor.rs

@@ -293,13 +293,15 @@ impl ClientGridEditor {
         }
     }
 
-    pub async fn update_cell(&self, mut changeset: CellMetaChangeset) -> FlowyResult<()> {
+    #[tracing::instrument(level = "trace", skip_all, err)]
+    pub async fn update_cell(&self, mut changeset: CellChangeset) -> FlowyResult<()> {
         if changeset.data.as_ref().is_none() {
             return Ok(());
         }
 
         let cell_data_changeset = changeset.data.unwrap();
         let cell_meta = self.get_cell_meta(&changeset.row_id, &changeset.field_id).await?;
+        tracing::trace!("{}: {:?}", &changeset.field_id, cell_meta);
         match self.pad.read().await.get_field(&changeset.field_id) {
             None => {
                 let msg = format!("Field not found with id: {}", &changeset.field_id);
@@ -431,7 +433,7 @@ impl ClientGridEditor {
 
         if let Some(field_meta) = field_metas.pop() {
             send_dart_notification(field_id, GridNotification::DidUpdateField)
-                .payload(field_meta)
+                .payload(Field::from(field_meta))
                 .send();
         }
 

+ 37 - 11
frontend/rust-lib/flowy-grid/src/services/row/cell_data_operation.rs

@@ -106,17 +106,43 @@ pub fn apply_cell_data_changeset<T: Into<CellDataChangeset>>(
         FieldType::Checkbox => CheckboxTypeOption::from(field_meta).apply_changeset(changeset, cell_meta),
     }
 }
-
-#[tracing::instrument(level = "trace", skip(field_meta, data), fields(content), err)]
-pub fn decode_cell_data(data: String, field_meta: &FieldMeta) -> Result<String, FlowyError> {
-    let s = match field_meta.field_type {
-        FieldType::RichText => RichTextTypeOption::from(field_meta).decode_cell_data(data, field_meta),
-        FieldType::Number => NumberTypeOption::from(field_meta).decode_cell_data(data, field_meta),
-        FieldType::DateTime => DateTypeOption::from(field_meta).decode_cell_data(data, field_meta),
-        FieldType::SingleSelect => SingleSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
-        FieldType::MultiSelect => MultiSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
-        FieldType::Checkbox => CheckboxTypeOption::from(field_meta).decode_cell_data(data, field_meta),
+//
+// #[tracing::instrument(level = "trace", skip(field_meta, data), fields(content), err)]
+// pub fn decode_cell_data(data: String, field_meta: &FieldMeta, field_type: &FieldType) -> Result<String, FlowyError> {
+//     let s = match field_meta.field_type {
+//         FieldType::RichText => RichTextTypeOption::from(field_meta).decode_cell_data(data, field_meta),
+//         FieldType::Number => NumberTypeOption::from(field_meta).decode_cell_data(data, field_meta),
+//         FieldType::DateTime => DateTypeOption::from(field_meta).decode_cell_data(data, field_meta),
+//         FieldType::SingleSelect => SingleSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
+//         FieldType::MultiSelect => MultiSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
+//         FieldType::Checkbox => CheckboxTypeOption::from(field_meta).decode_cell_data(data, field_meta),
+//     };
+//     tracing::Span::current().record("content", &format!("{:?}: {}", field_meta.field_type, s).as_str());
+//     Ok(s)
+// }
+
+#[tracing::instrument(level = "trace", skip(field_meta, data), fields(content))]
+pub fn decode_cell_data(data: String, field_meta: &FieldMeta, field_type: &FieldType) -> Option<String> {
+    let s = match field_type {
+        FieldType::RichText => field_meta
+            .get_type_option_entry::<RichTextTypeOption>(field_type)?
+            .decode_cell_data(data, field_meta),
+        FieldType::Number => field_meta
+            .get_type_option_entry::<NumberTypeOption>(field_type)?
+            .decode_cell_data(data, field_meta),
+        FieldType::DateTime => field_meta
+            .get_type_option_entry::<DateTypeOption>(field_type)?
+            .decode_cell_data(data, field_meta),
+        FieldType::SingleSelect => field_meta
+            .get_type_option_entry::<SingleSelectTypeOption>(field_type)?
+            .decode_cell_data(data, field_meta),
+        FieldType::MultiSelect => field_meta
+            .get_type_option_entry::<MultiSelectTypeOption>(field_type)?
+            .decode_cell_data(data, field_meta),
+        FieldType::Checkbox => field_meta
+            .get_type_option_entry::<CheckboxTypeOption>(field_type)?
+            .decode_cell_data(data, field_meta),
     };
     tracing::Span::current().record("content", &format!("{:?}: {}", field_meta.field_type, s).as_str());
-    Ok(s)
+    Some(s)
 }

+ 5 - 5
frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs

@@ -1,8 +1,8 @@
-use crate::services::row::apply_cell_data_changeset;
-
 use crate::services::field::SelectOptionCellChangeset;
+use crate::services::row::apply_cell_data_changeset;
 use flowy_error::{FlowyError, FlowyResult};
-use flowy_grid_data_model::entities::{CellMeta, FieldMeta, RowMeta, DEFAULT_ROW_HEIGHT};
+use flowy_grid_data_model::entities::{gen_row_id, CellMeta, FieldMeta, RowMeta, DEFAULT_ROW_HEIGHT};
+use indexmap::IndexMap;
 use std::collections::HashMap;
 
 pub struct CreateRowMetaBuilder<'a> {
@@ -18,7 +18,7 @@ impl<'a> CreateRowMetaBuilder<'a> {
             .collect::<HashMap<&String, &FieldMeta>>();
 
         let payload = CreateRowMetaPayload {
-            row_id: uuid::Uuid::new_v4().to_string(),
+            row_id: gen_row_id(),
             cell_by_field_id: Default::default(),
             height: DEFAULT_ROW_HEIGHT,
             visibility: true,
@@ -90,7 +90,7 @@ pub fn make_row_meta_from_context(block_id: &str, payload: CreateRowMetaPayload)
 
 pub struct CreateRowMetaPayload {
     pub row_id: String,
-    pub cell_by_field_id: HashMap<String, CellMeta>,
+    pub cell_by_field_id: IndexMap<String, CellMeta>,
     pub height: i32,
     pub visibility: bool,
 }

+ 3 - 3
frontend/rust-lib/flowy-grid/src/services/row/row_entities.rs

@@ -1,6 +1,6 @@
 use flowy_derive::ProtoBuf;
 use flowy_error::ErrorCode;
-use flowy_grid_data_model::parser::NotEmptyUuid;
+use flowy_grid_data_model::parser::NotEmptyStr;
 
 #[derive(ProtoBuf, Default)]
 pub struct RowIdentifierPayload {
@@ -20,8 +20,8 @@ impl TryInto<RowIdentifier> for RowIdentifierPayload {
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<RowIdentifier, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
-        let row_id = NotEmptyUuid::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let row_id = NotEmptyStr::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?;
 
         Ok(RowIdentifier {
             grid_id: grid_id.0,

+ 6 - 21
frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs

@@ -3,10 +3,7 @@ use flowy_error::FlowyResult;
 use flowy_grid_data_model::entities::{
     Cell, CellMeta, FieldMeta, GridBlock, GridBlockOrder, RepeatedGridBlock, Row, RowMeta, RowOrder,
 };
-use rayon::iter::{IntoParallelIterator, ParallelIterator};
-
 use std::collections::HashMap;
-
 use std::sync::Arc;
 
 pub struct GridBlockSnapshot {
@@ -34,28 +31,16 @@ pub fn make_cell_by_field_id(
     cell_meta: CellMeta,
 ) -> Option<(String, Cell)> {
     let field_meta = field_map.get(&field_id)?;
-    match decode_cell_data(cell_meta.data, field_meta) {
-        Ok(content) => {
-            let cell = Cell::new(&field_id, content);
-            Some((field_id, cell))
-        }
-        Err(e) => {
-            tracing::error!("{}", e);
-            None
-        }
-    }
+    let content = decode_cell_data(cell_meta.data, field_meta, &field_meta.field_type)?;
+    let cell = Cell::new(&field_id, content);
+    Some((field_id, cell))
 }
 
 #[allow(dead_code)]
 pub fn make_cell(field_id: &str, field_meta: &FieldMeta, row_meta: &RowMeta) -> Option<Cell> {
     let cell_meta = row_meta.cells.get(field_id)?.clone();
-    match decode_cell_data(cell_meta.data, field_meta) {
-        Ok(content) => Some(Cell::new(field_id, content)),
-        Err(e) => {
-            tracing::error!("{}", e);
-            None
-        }
-    }
+    let content = decode_cell_data(cell_meta.data, field_meta, &field_meta.field_type)?;
+    Some(Cell::new(field_id, content))
 }
 
 pub(crate) fn make_row_orders_from_row_metas(row_metas: &[Arc<RowMeta>]) -> Vec<RowOrder> {
@@ -72,7 +57,7 @@ pub(crate) fn make_rows_from_row_metas(fields: &[FieldMeta], row_metas: &[Arc<Ro
         let cell_by_field_id = row_meta
             .cells
             .clone()
-            .into_par_iter()
+            .into_iter()
             .flat_map(|(field_id, cell_meta)| make_cell_by_field_id(&field_meta_map, field_id, cell_meta))
             .collect::<HashMap<String, Cell>>();
 

+ 1 - 3
frontend/rust-lib/flowy-grid/src/services/util.rs

@@ -1,3 +1 @@
-pub fn uuid() -> String {
-    uuid::Uuid::new_v4().to_string()
-}
+

+ 4 - 4
frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs

@@ -6,7 +6,7 @@ use flowy_grid::services::field::{
 };
 use flowy_grid::services::row::{decode_cell_data, CreateRowMetaBuilder};
 use flowy_grid_data_model::entities::{
-    CellMetaChangeset, FieldChangesetParams, FieldType, GridBlockMeta, GridBlockMetaChangeset, RowMetaChangeset,
+    CellChangeset, FieldChangesetParams, FieldType, GridBlockMeta, GridBlockMetaChangeset, RowMetaChangeset,
     TypeOptionDataEntry,
 };
 
@@ -287,7 +287,7 @@ async fn grid_row_add_date_cell_test() {
     let date_field = date_field.unwrap();
     let cell_data = context.cell_by_field_id.get(&date_field.id).unwrap().clone();
     assert_eq!(
-        decode_cell_data(cell_data.data.clone(), &date_field).unwrap(),
+        decode_cell_data(cell_data.data.clone(), &date_field, &date_field.field_type).unwrap(),
         "2022/03/16 08:31",
     );
     let scripts = vec![CreateRow { context }];
@@ -324,7 +324,7 @@ async fn grid_cell_update() {
                 };
 
                 scripts.push(UpdateCell {
-                    changeset: CellMetaChangeset {
+                    changeset: CellChangeset {
                         grid_id: block_id.to_string(),
                         row_id: row_meta.id.clone(),
                         field_id: field_meta.id.clone(),
@@ -345,7 +345,7 @@ async fn grid_cell_update() {
                 };
 
                 scripts.push(UpdateCell {
-                    changeset: CellMetaChangeset {
+                    changeset: CellChangeset {
                         grid_id: block_id.to_string(),
                         row_id: row_meta.id.clone(),
                         field_id: field_meta.id.clone(),

+ 6 - 6
frontend/rust-lib/flowy-grid/tests/grid/script.rs

@@ -3,8 +3,8 @@ use flowy_grid::services::field::*;
 use flowy_grid::services::grid_editor::{ClientGridEditor, GridPadBuilder};
 use flowy_grid::services::row::CreateRowMetaPayload;
 use flowy_grid_data_model::entities::{
-    BuildGridContext, CellMetaChangeset, CreateFieldParams, Field, FieldChangesetParams, FieldMeta, FieldOrder,
-    FieldType, GridBlockMeta, GridBlockMetaChangeset, RowMeta, RowMetaChangeset, RowOrder, TypeOptionDataEntry,
+    BuildGridContext, CellChangeset, CreateFieldParams, Field, FieldChangesetParams, FieldMeta, FieldOrder, FieldType,
+    GridBlockMeta, GridBlockMetaChangeset, RowMeta, RowMetaChangeset, RowOrder, TypeOptionDataEntry,
 };
 use flowy_revision::REVISION_WRITE_INTERVAL_IN_MILLIS;
 use flowy_sync::client_grid::GridBuilder;
@@ -61,7 +61,7 @@ pub enum EditorScript {
         row_ids: Vec<String>,
     },
     UpdateCell {
-        changeset: CellMetaChangeset,
+        changeset: CellChangeset,
         is_err: bool,
     },
     AssertRowCount(usize),
@@ -86,7 +86,7 @@ impl GridEditorTest {
         let sdk = FlowySDKTest::default();
         let _ = sdk.init_user().await;
         let build_context = make_template_1_grid();
-        let view_data: Bytes = build_context.try_into().unwrap();
+        let view_data: Bytes = build_context.into();
         let test = ViewTest::new_grid_view(&sdk, view_data.to_vec()).await;
         let editor = sdk.grid_manager.open_grid(&test.view.id).await.unwrap();
         let field_metas = editor.get_field_metas::<FieldOrder>(None).await.unwrap();
@@ -258,7 +258,7 @@ pub fn create_text_field(grid_id: &str) -> (CreateFieldParams, FieldMeta) {
     let cloned_field_meta = field_meta.clone();
 
     let type_option_data = field_meta
-        .get_type_option_entry::<RichTextTypeOption>(None)
+        .get_type_option_entry::<RichTextTypeOption>(&field_meta.field_type)
         .unwrap()
         .protobuf_bytes()
         .to_vec();
@@ -290,7 +290,7 @@ pub fn create_single_select_field(grid_id: &str) -> (CreateFieldParams, FieldMet
     let field_meta = FieldBuilder::new(single_select).name("Name").visibility(true).build();
     let cloned_field_meta = field_meta.clone();
     let type_option_data = field_meta
-        .get_type_option_entry::<SingleSelectTypeOption>(None)
+        .get_type_option_entry::<SingleSelectTypeOption>(&field_meta.field_type)
         .unwrap()
         .protobuf_bytes()
         .to_vec();

+ 1 - 0
frontend/rust-lib/flowy-net/Cargo.toml

@@ -37,6 +37,7 @@ config = { version = "0.10.1", default-features = false, features = ["yaml"] }
 log = "0.4.14"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
+nanoid = "0.4.0"
 
 [features]
 http_server = []

+ 8 - 5
frontend/rust-lib/flowy-net/src/local_server/server.rs

@@ -17,6 +17,7 @@ use flowy_sync::{
 };
 use futures_util::stream::StreamExt;
 use lib_ws::{WSChannel, WebSocketRawMessage};
+use nanoid::nanoid;
 use parking_lot::RwLock;
 use std::{
     convert::{TryFrom, TryInto},
@@ -251,6 +252,8 @@ impl RevisionUser for LocalRevisionUser {
     }
 }
 
+use flowy_folder_data_model::entities::app::gen_app_id;
+use flowy_folder_data_model::entities::workspace::gen_workspace_id;
 use flowy_folder_data_model::entities::{
     app::{App, AppId, CreateAppParams, RepeatedApp, UpdateAppParams},
     trash::{RepeatedTrash, RepeatedTrashId},
@@ -262,7 +265,7 @@ use flowy_user::event_map::UserCloudService;
 use flowy_user_data_model::entities::{
     SignInParams, SignInResponse, SignUpParams, SignUpResponse, UpdateUserParams, UserProfile,
 };
-use lib_infra::{future::FutureResult, timestamp, uuid};
+use lib_infra::{future::FutureResult, timestamp};
 
 impl FolderCouldServiceV1 for LocalServer {
     fn init(&self) {}
@@ -270,7 +273,7 @@ impl FolderCouldServiceV1 for LocalServer {
     fn create_workspace(&self, _token: &str, params: CreateWorkspaceParams) -> FutureResult<Workspace, FlowyError> {
         let time = timestamp();
         let workspace = Workspace {
-            id: uuid(),
+            id: gen_workspace_id(),
             name: params.name,
             desc: params.desc,
             apps: RepeatedApp::default(),
@@ -330,7 +333,7 @@ impl FolderCouldServiceV1 for LocalServer {
     fn create_app(&self, _token: &str, params: CreateAppParams) -> FutureResult<App, FlowyError> {
         let time = timestamp();
         let app = App {
-            id: uuid(),
+            id: gen_app_id(),
             workspace_id: params.workspace_id,
             name: params.name,
             desc: params.desc,
@@ -372,7 +375,7 @@ impl FolderCouldServiceV1 for LocalServer {
 
 impl UserCloudService for LocalServer {
     fn sign_up(&self, params: SignUpParams) -> FutureResult<SignUpResponse, FlowyError> {
-        let uid = uuid();
+        let uid = nanoid!(10);
         FutureResult::new(async move {
             Ok(SignUpResponse {
                 user_id: uid.clone(),
@@ -384,7 +387,7 @@ impl UserCloudService for LocalServer {
     }
 
     fn sign_in(&self, params: SignInParams) -> FutureResult<SignInResponse, FlowyError> {
-        let user_id = uuid();
+        let user_id = nanoid!(10);
         FutureResult::new(async {
             Ok(SignInResponse {
                 user_id: user_id.clone(),

+ 3 - 1
frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs

@@ -14,7 +14,7 @@ use flowy_folder::{
 };
 use flowy_grid::manager::{make_grid_view_data, GridManager};
 use flowy_grid::util::make_default_grid;
-use flowy_grid_data_model::entities::BuildGridContext;
+
 use flowy_net::ClientServerConfiguration;
 use flowy_net::{
     http_server::folder::FolderHttpCloudService, local_server::LocalServer, ws::connection::FlowyWebSocketConnect,
@@ -25,6 +25,8 @@ use futures_core::future::BoxFuture;
 use lib_infra::future::{BoxResultFuture, FutureResult};
 use lib_ws::{WSChannel, WSMessageReceiver, WebSocketRawMessage};
 use std::collections::HashMap;
+
+use flowy_grid_data_model::entities::BuildGridContext;
 use std::convert::TryFrom;
 use std::{convert::TryInto, sync::Arc};
 

+ 1 - 1
frontend/rust-lib/flowy-sdk/src/lib.rs

@@ -67,7 +67,7 @@ fn crate_log_filter(level: String) -> String {
     filters.push(format!("flowy_sdk={}", level));
     filters.push(format!("flowy_folder={}", level));
     filters.push(format!("flowy_user={}", level));
-    filters.push(format!("flowy_block={}", level));
+    filters.push(format!("flowy_text_block={}", level));
     filters.push(format!("flowy_grid={}", level));
     filters.push(format!("flowy_collaboration={}", "debug"));
     filters.push(format!("dart_notify={}", level));

+ 1 - 0
frontend/rust-lib/flowy-test/Cargo.toml

@@ -26,6 +26,7 @@ futures-util = "0.3.15"
 thread-id = "3.3.0"
 log = "0.4"
 bytes = "1.0"
+nanoid = "0.4.0"
 
 [dev-dependencies]
 quickcheck = "0.9.2"

+ 1 - 2
frontend/rust-lib/flowy-test/src/helper.rs

@@ -14,7 +14,6 @@ use flowy_user::{
     event_map::UserEvent::{InitUser, SignIn, SignOut, SignUp},
 };
 use lib_dispatch::prelude::{EventDispatcher, ModuleRequest, ToBytes};
-use lib_infra::uuid;
 use std::{fs, path::PathBuf, sync::Arc};
 
 pub struct ViewTest {
@@ -127,7 +126,7 @@ pub fn root_dir() -> String {
 }
 
 pub fn random_email() -> String {
-    format!("{}@appflowy.io", uuid())
+    format!("{}@appflowy.io", nanoid!(10))
 }
 
 pub fn login_email() -> String {

+ 2 - 2
frontend/rust-lib/flowy-test/src/lib.rs

@@ -5,7 +5,7 @@ use crate::helper::*;
 use flowy_net::{get_client_server_configuration, ClientServerConfiguration};
 use flowy_sdk::{FlowySDK, FlowySDKConfig};
 use flowy_user::entities::UserProfile;
-use lib_infra::uuid;
+use nanoid::nanoid;
 
 pub mod prelude {
     pub use crate::{event_builder::*, helper::*, *};
@@ -36,7 +36,7 @@ impl std::default::Default for FlowySDKTest {
 
 impl FlowySDKTest {
     pub fn new(server_config: ClientServerConfiguration) -> Self {
-        let config = FlowySDKConfig::new(&root_dir(), server_config, &uuid()).log_filter("trace");
+        let config = FlowySDKConfig::new(&root_dir(), server_config, &nanoid!(6)).log_filter("trace");
         let sdk = std::thread::spawn(|| FlowySDK::new(config)).join().unwrap();
         std::mem::forget(sdk.dispatcher());
         Self { inner: sdk }

+ 1 - 0
frontend/rust-lib/flowy-text-block/src/manager.rs

@@ -118,6 +118,7 @@ impl TextBlockManager {
         }
     }
 
+    #[tracing::instrument(level = "trace", skip(self, pool), err)]
     async fn make_text_block_editor(
         &self,
         block_id: &str,

+ 1 - 0
frontend/rust-lib/flowy-user/Cargo.toml

@@ -34,6 +34,7 @@ tokio = { version = "1", features = ["rt"] }
 [dev-dependencies]
 flowy-test = { path = "../flowy-test" }
 futures = "0.3.15"
+nanoid = "0.4.0"
 
 [features]
 http_server = []

+ 3 - 2
frontend/rust-lib/flowy-user/tests/event/user_profile_test.rs

@@ -2,7 +2,8 @@ use crate::helper::*;
 use flowy_test::{event_builder::UserModuleEventBuilder, FlowySDKTest};
 use flowy_user::{errors::ErrorCode, event_map::UserEvent::*};
 use flowy_user_data_model::entities::{UpdateUserPayload, UserProfile};
-use lib_infra::uuid;
+use nanoid::nanoid;
+
 // use serial_test::*;
 
 #[tokio::test]
@@ -51,7 +52,7 @@ async fn user_update_with_name() {
 async fn user_update_with_email() {
     let sdk = FlowySDKTest::default();
     let user = sdk.init_user().await;
-    let new_email = format!("{}@gmail.com", uuid());
+    let new_email = format!("{}@gmail.com", nanoid!(6));
     let request = UpdateUserPayload::new(&user.id).email(&new_email);
     let _ = UserModuleEventBuilder::new(sdk.clone())
         .event(UpdateUser)

+ 1 - 1
frontend/rust-lib/lib-dispatch/Cargo.toml

@@ -14,7 +14,7 @@ futures = "0.3.15"
 futures-util = "0.3.15"
 bytes = {version = "1.0", features = ["serde"]}
 tokio = { version = "1", features = ["full"] }
-uuid = { version = "0.8", features = ["serde", "v4"] }
+nanoid = "0.4.0"
 log = "0.4.14"
 env_logger = "0.8"
 serde_with = "1.9.4"

+ 2 - 1
frontend/rust-lib/lib-dispatch/src/module/module.rs

@@ -22,6 +22,7 @@ use crate::{
     },
 };
 use futures_core::future::BoxFuture;
+use nanoid::nanoid;
 use std::sync::Arc;
 
 pub type ModuleMap = Arc<HashMap<Event, Arc<Module>>>;
@@ -118,7 +119,7 @@ impl ModuleRequest {
         E: Into<Event>,
     {
         Self {
-            id: uuid::Uuid::new_v4().to_string(),
+            id: nanoid!(6),
             event: event.into(),
             payload: Payload::None,
         }

+ 29 - 13
shared-lib/Cargo.lock

@@ -441,6 +441,7 @@ dependencies = [
  "flowy-error-code",
  "lib-infra",
  "log",
+ "nanoid",
  "protobuf",
  "serde",
  "serde_json",
@@ -448,7 +449,6 @@ dependencies = [
  "strum",
  "strum_macros",
  "unicode-segmentation",
- "uuid",
 ]
 
 [[package]]
@@ -458,14 +458,15 @@ dependencies = [
  "bytes",
  "flowy-derive",
  "flowy-error-code",
+ "indexmap",
  "lib-infra",
+ "nanoid",
  "protobuf",
  "serde",
  "serde_json",
  "serde_repr",
  "strum",
  "strum_macros",
- "uuid",
 ]
 
 [[package]]
@@ -701,6 +702,12 @@ dependencies = [
  "walkdir",
 ]
 
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+
 [[package]]
 name = "heck"
 version = "0.3.3"
@@ -777,6 +784,17 @@ dependencies = [
  "winapi-util",
 ]
 
+[[package]]
+name = "indexmap"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+ "serde",
+]
+
 [[package]]
 name = "instant"
 version = "0.1.12"
@@ -833,7 +851,6 @@ dependencies = [
  "tera",
  "tokio",
  "toml",
- "uuid",
  "walkdir",
 ]
 
@@ -954,6 +971,15 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "nanoid"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8"
+dependencies = [
+ "rand 0.8.4",
+]
+
 [[package]]
 name = "ntapi"
 version = "0.3.6"
@@ -2079,16 +2105,6 @@ version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
 
-[[package]]
-name = "uuid"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
-dependencies = [
- "getrandom 0.2.3",
- "serde",
-]
-
 [[package]]
 name = "validator"
 version = "0.12.0"

+ 1 - 1
shared-lib/flowy-folder-data-model/Cargo.toml

@@ -14,7 +14,7 @@ strum = "0.21"
 strum_macros = "0.21"
 derive_more = {version = "0.99", features = ["display"]}
 log = "0.4.14"
-uuid = { version = "0.8", features = ["serde", "v4"] }
+nanoid = "0.4.0"
 chrono = { version = "0.4" }
 flowy-error-code = { path = "../flowy-error-code"}
 serde = { version = "1.0", features = ["derive"] }

+ 4 - 0
shared-lib/flowy-folder-data-model/src/entities/app.rs

@@ -8,9 +8,13 @@ use crate::{
     },
 };
 use flowy_derive::ProtoBuf;
+use nanoid::nanoid;
 use serde::{Deserialize, Serialize};
 use std::convert::TryInto;
 
+pub fn gen_app_id() -> String {
+    nanoid!(10)
+}
 #[derive(Eq, PartialEq, ProtoBuf, Default, Debug, Clone, Serialize, Deserialize)]
 pub struct App {
     #[pb(index = 1)]

+ 6 - 1
shared-lib/flowy-folder-data-model/src/entities/view.rs

@@ -8,10 +8,15 @@ use crate::{
     },
 };
 use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
+use nanoid::nanoid;
 use serde::{Deserialize, Serialize};
 use serde_repr::*;
 use std::convert::TryInto;
 
+pub fn gen_view_id() -> String {
+    nanoid!(10)
+}
+
 #[derive(Eq, PartialEq, ProtoBuf, Default, Debug, Clone, Serialize, Deserialize)]
 pub struct View {
     #[pb(index = 1)]
@@ -163,7 +168,7 @@ impl TryInto<CreateViewParams> for CreateViewPayload {
     fn try_into(self) -> Result<CreateViewParams, Self::Error> {
         let name = ViewName::parse(self.name)?.0;
         let belong_to_id = AppIdentify::parse(self.belong_to_id)?.0;
-        let view_id = uuid::Uuid::new_v4().to_string();
+        let view_id = gen_view_id();
         let thumbnail = match self.thumbnail {
             None => "".to_string(),
             Some(thumbnail) => ViewThumbnail::parse(thumbnail)?.0,

+ 4 - 0
shared-lib/flowy-folder-data-model/src/entities/workspace.rs

@@ -5,9 +5,13 @@ use crate::{
     parser::workspace::{WorkspaceDesc, WorkspaceIdentify, WorkspaceName},
 };
 use flowy_derive::ProtoBuf;
+use nanoid::nanoid;
 use serde::{Deserialize, Serialize};
 use std::convert::TryInto;
 
+pub fn gen_workspace_id() -> String {
+    nanoid!(10)
+}
 #[derive(Eq, PartialEq, ProtoBuf, Default, Debug, Clone, Serialize, Deserialize)]
 pub struct Workspace {
     #[pb(index = 1)]

+ 6 - 3
shared-lib/flowy-folder-data-model/src/user_default.rs

@@ -1,3 +1,6 @@
+use crate::entities::app::gen_app_id;
+use crate::entities::view::gen_view_id;
+use crate::entities::workspace::gen_workspace_id;
 use crate::entities::{
     app::{App, RepeatedApp},
     view::{RepeatedView, View, ViewDataType},
@@ -7,7 +10,7 @@ use chrono::Utc;
 
 pub fn create_default_workspace() -> Workspace {
     let time = Utc::now();
-    let workspace_id = uuid::Uuid::new_v4();
+    let workspace_id = gen_workspace_id();
     let name = "Workspace".to_string();
     let desc = "".to_string();
 
@@ -26,7 +29,7 @@ pub fn create_default_workspace() -> Workspace {
 }
 
 fn create_default_app(workspace_id: String, time: chrono::DateTime<Utc>) -> App {
-    let app_id = uuid::Uuid::new_v4();
+    let app_id = gen_app_id();
     let name = "⭐️ Getting started".to_string();
     let desc = "".to_string();
 
@@ -47,7 +50,7 @@ fn create_default_app(workspace_id: String, time: chrono::DateTime<Utc>) -> App
 }
 
 fn create_default_view(app_id: String, time: chrono::DateTime<Utc>) -> View {
-    let view_id = uuid::Uuid::new_v4();
+    let view_id = gen_view_id();
     let name = "Read me".to_string();
     let desc = "".to_string();
     let data_type = ViewDataType::TextBlock;

+ 2 - 2
shared-lib/flowy-grid-data-model/Cargo.toml

@@ -14,9 +14,9 @@ strum_macros = "0.21"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = {version = "1.0"}
 serde_repr = "0.1"
-uuid = { version = "0.8", features = ["serde", "v4"] }
+nanoid = "0.4.0"
 flowy-error-code = { path = "../flowy-error-code"}
-
+indexmap = {version = "1.8.1", features = ["serde"]}
 [build-dependencies]
 lib-infra = { path = "../lib-infra", features = ["protobuf_file_gen"] }
 

+ 1 - 1
shared-lib/flowy-grid-data-model/Flowy.toml

@@ -1,3 +1,3 @@
 
-proto_crates = ["src/entities",]
+proto_crates = ["src/entities/grid.rs",]
 event_files = []

+ 180 - 11
shared-lib/flowy-grid-data-model/src/entities/grid.rs

@@ -1,9 +1,12 @@
-use crate::entities::{FieldMeta, FieldType, RowMeta};
-use crate::parser::NotEmptyUuid;
-use flowy_derive::ProtoBuf;
+use crate::entities::{CellMeta, FieldMeta, RowMeta, RowMetaChangeset};
+use crate::parser::NotEmptyStr;
+use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
 use flowy_error_code::ErrorCode;
+
+use serde_repr::*;
 use std::collections::HashMap;
 use std::sync::Arc;
+use strum_macros::{Display, EnumCount as EnumCountMacro, EnumIter, EnumString};
 
 #[derive(Debug, Clone, Default, ProtoBuf)]
 pub struct Grid {
@@ -115,8 +118,8 @@ impl TryInto<EditFieldParams> for EditFieldPayload {
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<EditFieldParams, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
-        let field_id = NotEmptyUuid::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let field_id = NotEmptyStr::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
         Ok(EditFieldParams {
             grid_id: grid_id.0,
             field_id: field_id.0,
@@ -471,7 +474,7 @@ impl TryInto<CreateRowParams> for CreateRowPayload {
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<CreateRowParams, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
         Ok(CreateRowParams {
             grid_id: grid_id.0,
             start_row_id: self.start_row_id,
@@ -506,12 +509,12 @@ impl TryInto<CreateFieldParams> for CreateFieldPayload {
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<CreateFieldParams, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
-        let _ = NotEmptyUuid::parse(self.field.id.clone()).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let _ = NotEmptyStr::parse(self.field.id.clone()).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
 
         let start_field_id = match self.start_field_id {
             None => None,
-            Some(id) => Some(NotEmptyUuid::parse(id).map_err(|_| ErrorCode::FieldIdIsEmpty)?.0),
+            Some(id) => Some(NotEmptyStr::parse(id).map_err(|_| ErrorCode::FieldIdIsEmpty)?.0),
         };
 
         Ok(CreateFieldParams {
@@ -541,7 +544,7 @@ impl TryInto<QueryFieldParams> for QueryFieldPayload {
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<QueryFieldParams, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
         Ok(QueryFieldParams {
             grid_id: grid_id.0,
             field_orders: self.field_orders,
@@ -567,10 +570,176 @@ impl TryInto<QueryGridBlocksParams> for QueryGridBlocksPayload {
     type Error = ErrorCode;
 
     fn try_into(self) -> Result<QueryGridBlocksParams, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
         Ok(QueryGridBlocksParams {
             grid_id: grid_id.0,
             block_orders: self.block_orders,
         })
     }
 }
+
+#[derive(Debug, Clone, Default, ProtoBuf)]
+pub struct FieldChangesetPayload {
+    #[pb(index = 1)]
+    pub field_id: String,
+
+    #[pb(index = 2)]
+    pub grid_id: String,
+
+    #[pb(index = 3, one_of)]
+    pub name: Option<String>,
+
+    #[pb(index = 4, one_of)]
+    pub desc: Option<String>,
+
+    #[pb(index = 5, one_of)]
+    pub field_type: Option<FieldType>,
+
+    #[pb(index = 6, one_of)]
+    pub frozen: Option<bool>,
+
+    #[pb(index = 7, one_of)]
+    pub visibility: Option<bool>,
+
+    #[pb(index = 8, one_of)]
+    pub width: Option<i32>,
+
+    #[pb(index = 9, one_of)]
+    pub type_option_data: Option<Vec<u8>>,
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct FieldChangesetParams {
+    pub field_id: String,
+
+    pub grid_id: String,
+
+    pub name: Option<String>,
+
+    pub desc: Option<String>,
+
+    pub field_type: Option<FieldType>,
+
+    pub frozen: Option<bool>,
+
+    pub visibility: Option<bool>,
+
+    pub width: Option<i32>,
+
+    pub type_option_data: Option<Vec<u8>>,
+}
+
+impl TryInto<FieldChangesetParams> for FieldChangesetPayload {
+    type Error = ErrorCode;
+
+    fn try_into(self) -> Result<FieldChangesetParams, Self::Error> {
+        let grid_id = NotEmptyStr::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
+        let field_id = NotEmptyStr::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
+
+        if let Some(type_option_data) = self.type_option_data.as_ref() {
+            if type_option_data.is_empty() {
+                return Err(ErrorCode::TypeOptionDataIsEmpty);
+            }
+        }
+
+        Ok(FieldChangesetParams {
+            field_id: field_id.0,
+            grid_id: grid_id.0,
+            name: self.name,
+            desc: self.desc,
+            field_type: self.field_type,
+            frozen: self.frozen,
+            visibility: self.visibility,
+            width: self.width,
+            type_option_data: self.type_option_data,
+        })
+    }
+}
+
+#[derive(
+    Debug,
+    Clone,
+    PartialEq,
+    Eq,
+    ProtoBuf_Enum,
+    EnumCountMacro,
+    EnumString,
+    EnumIter,
+    Display,
+    Serialize_repr,
+    Deserialize_repr,
+)]
+#[repr(u8)]
+pub enum FieldType {
+    RichText = 0,
+    Number = 1,
+    DateTime = 2,
+    SingleSelect = 3,
+    MultiSelect = 4,
+    Checkbox = 5,
+}
+
+impl std::default::Default for FieldType {
+    fn default() -> Self {
+        FieldType::RichText
+    }
+}
+
+impl AsRef<FieldType> for FieldType {
+    fn as_ref(&self) -> &FieldType {
+        self
+    }
+}
+
+impl From<&FieldType> for FieldType {
+    fn from(field_type: &FieldType) -> Self {
+        field_type.clone()
+    }
+}
+
+impl FieldType {
+    pub fn type_id(&self) -> String {
+        let ty = self.clone();
+        format!("{}", ty as u8)
+    }
+
+    pub fn default_cell_width(&self) -> i32 {
+        match self {
+            FieldType::DateTime => 180,
+            _ => 150,
+        }
+    }
+}
+
+#[derive(Debug, Clone, Default, ProtoBuf)]
+pub struct CellChangeset {
+    #[pb(index = 1)]
+    pub grid_id: String,
+
+    #[pb(index = 2)]
+    pub row_id: String,
+
+    #[pb(index = 3)]
+    pub field_id: String,
+
+    #[pb(index = 4, one_of)]
+    pub data: Option<String>,
+}
+
+impl std::convert::From<CellChangeset> for RowMetaChangeset {
+    fn from(changeset: CellChangeset) -> Self {
+        let mut cell_by_field_id = HashMap::with_capacity(1);
+        let field_id = changeset.field_id;
+        let cell_meta = CellMeta {
+            data: changeset.data.unwrap_or_else(|| "".to_owned()),
+        };
+        cell_by_field_id.insert(field_id, cell_meta);
+
+        RowMetaChangeset {
+            row_id: changeset.row_id,
+            height: None,
+            visibility: None,
+            cell_by_field_id,
+        }
+    }
+}

+ 56 - 252
shared-lib/flowy-grid-data-model/src/entities/meta.rs

@@ -1,35 +1,40 @@
-use crate::parser::NotEmptyUuid;
+use crate::entities::FieldType;
 use bytes::Bytes;
-use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
-use flowy_error_code::ErrorCode;
+use indexmap::IndexMap;
+use nanoid::nanoid;
 use serde::{Deserialize, Serialize};
-use serde_repr::*;
 use std::collections::HashMap;
-use strum_macros::{Display, EnumCount as EnumCountMacro, EnumIter, EnumString};
 
 pub const DEFAULT_ROW_HEIGHT: i32 = 42;
 
-#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)]
+pub fn gen_grid_id() -> String {
+    // nanoid calculator https://zelark.github.io/nano-id-cc/
+    nanoid!(10)
+}
+
+pub fn gen_block_id() -> String {
+    nanoid!(10)
+}
+
+pub fn gen_row_id() -> String {
+    nanoid!(6)
+}
+
+pub fn gen_field_id() -> String {
+    nanoid!(6)
+}
+
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
 pub struct GridMeta {
-    #[pb(index = 1)]
     pub grid_id: String,
-
-    #[pb(index = 2)]
     pub fields: Vec<FieldMeta>,
-
-    #[pb(index = 3)]
     pub blocks: Vec<GridBlockMeta>,
 }
 
-#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ProtoBuf)]
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
 pub struct GridBlockMeta {
-    #[pb(index = 1)]
     pub block_id: String,
-
-    #[pb(index = 2)]
     pub start_row_index: i32,
-
-    #[pb(index = 3)]
     pub row_count: i32,
 }
 
@@ -46,7 +51,7 @@ impl GridBlockMeta {
 impl GridBlockMeta {
     pub fn new() -> Self {
         GridBlockMeta {
-            block_id: uuid::Uuid::new_v4().to_string(),
+            block_id: gen_block_id(),
             ..Default::default()
         }
     }
@@ -68,50 +73,41 @@ impl GridBlockMetaChangeset {
     }
 }
 
-#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)]
+#[derive(Debug, Clone, Default, Serialize, Deserialize)]
 pub struct GridBlockMetaData {
-    #[pb(index = 1)]
     pub block_id: String,
-
-    #[pb(index = 2)]
     pub rows: Vec<RowMeta>,
 }
 
-#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf, Eq, PartialEq)]
+#[derive(Debug, Clone, Default, Serialize, Deserialize, Eq, PartialEq)]
 pub struct FieldMeta {
-    #[pb(index = 1)]
     pub id: String,
 
-    #[pb(index = 2)]
     pub name: String,
 
-    #[pb(index = 3)]
     pub desc: String,
 
-    #[pb(index = 4)]
     pub field_type: FieldType,
 
-    #[pb(index = 5)]
     pub frozen: bool,
 
-    #[pb(index = 6)]
     pub visibility: bool,
 
-    #[pb(index = 7)]
     pub width: i32,
 
-    #[pb(index = 8)]
+    // #[pb(index = 8)]
     /// type_options contains key/value pairs
     /// key: id of the FieldType
     /// value: type option data string
-    pub type_options: HashMap<String, String>,
+    #[serde(with = "indexmap::serde_seq")]
+    pub type_options: IndexMap<String, String>,
 }
 
 impl FieldMeta {
     pub fn new(name: &str, desc: &str, field_type: FieldType) -> Self {
         let width = field_type.default_cell_width();
         Self {
-            id: uuid::Uuid::new_v4().to_string(),
+            id: gen_field_id(),
             name: name.to_string(),
             desc: desc.to_string(),
             field_type,
@@ -122,12 +118,14 @@ impl FieldMeta {
         }
     }
 
-    pub fn insert_type_option_entry<T: TypeOptionDataEntry + ?Sized>(&mut self, entry: &T) {
+    pub fn insert_type_option_entry<T>(&mut self, entry: &T)
+    where
+        T: TypeOptionDataEntry + ?Sized,
+    {
         self.type_options.insert(entry.field_type().type_id(), entry.json_str());
     }
 
-    pub fn get_type_option_entry<T: TypeOptionDataEntity>(&self, field_type: Option<FieldType>) -> Option<T> {
-        let field_type = field_type.as_ref().unwrap_or(&self.field_type);
+    pub fn get_type_option_entry<T: TypeOptionDataDeserializer>(&self, field_type: &FieldType) -> Option<T> {
         self.type_options
             .get(&field_type.type_id())
             .map(|s| T::from_json_str(s))
@@ -149,192 +147,28 @@ pub trait TypeOptionDataEntry {
     fn protobuf_bytes(&self) -> Bytes;
 }
 
-pub trait TypeOptionDataEntity {
+pub trait TypeOptionDataDeserializer {
     fn from_json_str(s: &str) -> Self;
     fn from_protobuf_bytes(bytes: Bytes) -> Self;
 }
 
-#[derive(Debug, Clone, Default, ProtoBuf)]
-pub struct FieldChangesetPayload {
-    #[pb(index = 1)]
-    pub field_id: String,
-
-    #[pb(index = 2)]
-    pub grid_id: String,
-
-    #[pb(index = 3, one_of)]
-    pub name: Option<String>,
-
-    #[pb(index = 4, one_of)]
-    pub desc: Option<String>,
-
-    #[pb(index = 5, one_of)]
-    pub field_type: Option<FieldType>,
-
-    #[pb(index = 6, one_of)]
-    pub frozen: Option<bool>,
-
-    #[pb(index = 7, one_of)]
-    pub visibility: Option<bool>,
-
-    #[pb(index = 8, one_of)]
-    pub width: Option<i32>,
-
-    #[pb(index = 9, one_of)]
-    pub type_option_data: Option<Vec<u8>>,
-}
-
-#[derive(Debug, Clone, Default)]
-pub struct FieldChangesetParams {
-    pub field_id: String,
-    pub grid_id: String,
-    pub name: Option<String>,
-    pub desc: Option<String>,
-    pub field_type: Option<FieldType>,
-    pub frozen: Option<bool>,
-    pub visibility: Option<bool>,
-    pub width: Option<i32>,
-    pub type_option_data: Option<Vec<u8>>,
-}
-
-impl TryInto<FieldChangesetParams> for FieldChangesetPayload {
-    type Error = ErrorCode;
-
-    fn try_into(self) -> Result<FieldChangesetParams, Self::Error> {
-        let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?;
-        let field_id = NotEmptyUuid::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
-
-        if let Some(type_option_data) = self.type_option_data.as_ref() {
-            if type_option_data.is_empty() {
-                return Err(ErrorCode::TypeOptionDataIsEmpty);
-            }
-        }
-
-        Ok(FieldChangesetParams {
-            field_id: field_id.0,
-            grid_id: grid_id.0,
-            name: self.name,
-            desc: self.desc,
-            field_type: self.field_type,
-            frozen: self.frozen,
-            visibility: self.visibility,
-            width: self.width,
-            type_option_data: self.type_option_data,
-        })
-    }
-}
-
-#[derive(
-    Debug,
-    Clone,
-    PartialEq,
-    Eq,
-    ProtoBuf_Enum,
-    EnumCountMacro,
-    EnumString,
-    EnumIter,
-    Display,
-    Serialize_repr,
-    Deserialize_repr,
-)]
-#[repr(u8)]
-pub enum FieldType {
-    RichText = 0,
-    Number = 1,
-    DateTime = 2,
-    SingleSelect = 3,
-    MultiSelect = 4,
-    Checkbox = 5,
-}
-
-impl std::default::Default for FieldType {
-    fn default() -> Self {
-        FieldType::RichText
-    }
-}
-
-impl AsRef<FieldType> for FieldType {
-    fn as_ref(&self) -> &FieldType {
-        self
-    }
-}
-
-impl From<&FieldType> for FieldType {
-    fn from(field_type: &FieldType) -> Self {
-        field_type.clone()
-    }
-}
-
-impl FieldType {
-    pub fn type_id(&self) -> String {
-        let ty = self.clone();
-        format!("{}", ty as u8)
-    }
-
-    pub fn default_cell_width(&self) -> i32 {
-        match self {
-            FieldType::DateTime => 180,
-            _ => 150,
-        }
-    }
-}
-
-#[derive(Debug, Clone, Serialize, Deserialize, Default, ProtoBuf)]
-pub struct AnyData {
-    #[pb(index = 1)]
-    pub type_id: String,
-
-    #[pb(index = 2)]
-    pub value: Vec<u8>,
-}
-
-impl AnyData {
-    pub fn from_str<F: Into<FieldType>>(field_type: F, s: &str) -> AnyData {
-        Self::from_bytes(field_type, s.as_bytes().to_vec())
-    }
-
-    pub fn from_bytes<T: AsRef<[u8]>, F: Into<FieldType>>(field_type: F, bytes: T) -> AnyData {
-        AnyData {
-            type_id: field_type.into().type_id(),
-            value: bytes.as_ref().to_vec(),
-        }
-    }
-}
-
-impl ToString for AnyData {
-    fn to_string(&self) -> String {
-        match String::from_utf8(self.value.clone()) {
-            Ok(s) => s,
-            Err(_) => "".to_owned(),
-        }
-    }
-}
-
-#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ProtoBuf)]
+#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
 pub struct RowMeta {
-    #[pb(index = 1)]
     pub id: String,
-
-    #[pb(index = 2)]
     pub block_id: String,
-
-    #[pb(index = 3)]
     /// cells contains key/value pairs.
     /// key: field id,
     /// value: CellMeta
-    pub cells: HashMap<String, CellMeta>,
-
-    #[pb(index = 4)]
+    #[serde(with = "indexmap::serde_seq")]
+    pub cells: IndexMap<String, CellMeta>,
     pub height: i32,
-
-    #[pb(index = 5)]
     pub visibility: bool,
 }
 
 impl RowMeta {
     pub fn new(block_id: &str) -> Self {
         Self {
-            id: uuid::Uuid::new_v4().to_string(),
+            id: gen_row_id(),
             block_id: block_id.to_owned(),
             cells: Default::default(),
             height: DEFAULT_ROW_HEIGHT,
@@ -343,24 +177,16 @@ impl RowMeta {
     }
 }
 
-#[derive(Debug, Clone, Default, ProtoBuf)]
+#[derive(Debug, Clone, Default)]
 pub struct RowMetaChangeset {
-    #[pb(index = 1)]
     pub row_id: String,
-
-    #[pb(index = 2, one_of)]
     pub height: Option<i32>,
-
-    #[pb(index = 3, one_of)]
     pub visibility: Option<bool>,
-
-    #[pb(index = 4)]
     pub cell_by_field_id: HashMap<String, CellMeta>,
 }
 
-#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize, ProtoBuf)]
+#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
 pub struct CellMeta {
-    #[pb(index = 1)]
     pub data: String,
 }
 
@@ -370,49 +196,27 @@ impl CellMeta {
     }
 }
 
-#[derive(Debug, Clone, Default, ProtoBuf)]
-pub struct CellMetaChangeset {
-    #[pb(index = 1)]
-    pub grid_id: String,
-
-    #[pb(index = 2)]
-    pub row_id: String,
-
-    #[pb(index = 3)]
-    pub field_id: String,
-
-    #[pb(index = 4, one_of)]
-    pub data: Option<String>,
+#[derive(Clone, Deserialize, Serialize)]
+pub struct BuildGridContext {
+    pub field_metas: Vec<FieldMeta>,
+    pub block_meta: GridBlockMeta,
+    pub block_meta_data: GridBlockMetaData,
 }
 
-impl std::convert::From<CellMetaChangeset> for RowMetaChangeset {
-    fn from(changeset: CellMetaChangeset) -> Self {
-        let mut cell_by_field_id = HashMap::with_capacity(1);
-        let field_id = changeset.field_id;
-        let cell_meta = CellMeta {
-            data: changeset.data.unwrap_or_else(|| "".to_owned()),
-        };
-        cell_by_field_id.insert(field_id, cell_meta);
-
-        RowMetaChangeset {
-            row_id: changeset.row_id,
-            height: None,
-            visibility: None,
-            cell_by_field_id,
-        }
+impl std::convert::From<BuildGridContext> for Bytes {
+    fn from(ctx: BuildGridContext) -> Self {
+        let bytes = serde_json::to_vec(&ctx).unwrap_or_else(|_| vec![]);
+        Bytes::from(bytes)
     }
 }
 
-#[derive(Clone, ProtoBuf)]
-pub struct BuildGridContext {
-    #[pb(index = 1)]
-    pub field_metas: Vec<FieldMeta>,
-
-    #[pb(index = 2)]
-    pub block_meta: GridBlockMeta,
+impl std::convert::TryFrom<Bytes> for BuildGridContext {
+    type Error = serde_json::Error;
 
-    #[pb(index = 3)]
-    pub block_meta_data: GridBlockMetaData,
+    fn try_from(bytes: Bytes) -> Result<Self, Self::Error> {
+        let ctx: BuildGridContext = serde_json::from_slice(&bytes)?;
+        Ok(ctx)
+    }
 }
 
 impl std::default::Default for BuildGridContext {

+ 0 - 22
shared-lib/flowy-grid-data-model/src/parser/str_parser.rs

@@ -1,25 +1,3 @@
-use uuid::Uuid;
-
-#[derive(Debug)]
-pub struct NotEmptyUuid(pub String);
-
-impl NotEmptyUuid {
-    pub fn parse(s: String) -> Result<Self, String> {
-        if s.trim().is_empty() {
-            return Err("Input string is empty".to_owned());
-        }
-        debug_assert!(Uuid::parse_str(&s).is_ok());
-
-        Ok(Self(s))
-    }
-}
-
-impl AsRef<str> for NotEmptyUuid {
-    fn as_ref(&self) -> &str {
-        &self.0
-    }
-}
-
 #[derive(Debug)]
 pub struct NotEmptyStr(pub String);
 

+ 1163 - 86
shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs

@@ -286,7 +286,7 @@ pub struct Field {
     pub id: ::std::string::String,
     pub name: ::std::string::String,
     pub desc: ::std::string::String,
-    pub field_type: super::meta::FieldType,
+    pub field_type: FieldType,
     pub frozen: bool,
     pub visibility: bool,
     pub width: i32,
@@ -387,15 +387,15 @@ impl Field {
     // .FieldType field_type = 4;
 
 
-    pub fn get_field_type(&self) -> super::meta::FieldType {
+    pub fn get_field_type(&self) -> FieldType {
         self.field_type
     }
     pub fn clear_field_type(&mut self) {
-        self.field_type = super::meta::FieldType::RichText;
+        self.field_type = FieldType::RichText;
     }
 
     // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: super::meta::FieldType) {
+    pub fn set_field_type(&mut self, v: FieldType) {
         self.field_type = v;
     }
 
@@ -508,7 +508,7 @@ impl ::protobuf::Message for Field {
         if !self.desc.is_empty() {
             my_size += ::protobuf::rt::string_size(3, &self.desc);
         }
-        if self.field_type != super::meta::FieldType::RichText {
+        if self.field_type != FieldType::RichText {
             my_size += ::protobuf::rt::enum_size(4, self.field_type);
         }
         if self.frozen != false {
@@ -535,7 +535,7 @@ impl ::protobuf::Message for Field {
         if !self.desc.is_empty() {
             os.write_string(3, &self.desc)?;
         }
-        if self.field_type != super::meta::FieldType::RichText {
+        if self.field_type != FieldType::RichText {
             os.write_enum(4, ::protobuf::ProtobufEnum::value(&self.field_type))?;
         }
         if self.frozen != false {
@@ -600,7 +600,7 @@ impl ::protobuf::Message for Field {
                 |m: &Field| { &m.desc },
                 |m: &mut Field| { &mut m.desc },
             ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<super::meta::FieldType>>(
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldType>>(
                 "field_type",
                 |m: &Field| { &m.field_type },
                 |m: &mut Field| { &mut m.field_type },
@@ -639,7 +639,7 @@ impl ::protobuf::Clear for Field {
         self.id.clear();
         self.name.clear();
         self.desc.clear();
-        self.field_type = super::meta::FieldType::RichText;
+        self.field_type = FieldType::RichText;
         self.frozen = false;
         self.visibility = false;
         self.width = 0;
@@ -822,7 +822,7 @@ impl ::protobuf::reflect::ProtobufValue for FieldOrder {
 pub struct GetEditFieldContextPayload {
     // message fields
     pub grid_id: ::std::string::String,
-    pub field_type: super::meta::FieldType,
+    pub field_type: FieldType,
     // message oneof groups
     pub one_of_field_id: ::std::option::Option<GetEditFieldContextPayload_oneof_one_of_field_id>,
     // special fields
@@ -924,15 +924,15 @@ impl GetEditFieldContextPayload {
     // .FieldType field_type = 3;
 
 
-    pub fn get_field_type(&self) -> super::meta::FieldType {
+    pub fn get_field_type(&self) -> FieldType {
         self.field_type
     }
     pub fn clear_field_type(&mut self) {
-        self.field_type = super::meta::FieldType::RichText;
+        self.field_type = FieldType::RichText;
     }
 
     // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: super::meta::FieldType) {
+    pub fn set_field_type(&mut self, v: FieldType) {
         self.field_type = v;
     }
 }
@@ -973,7 +973,7 @@ impl ::protobuf::Message for GetEditFieldContextPayload {
         if !self.grid_id.is_empty() {
             my_size += ::protobuf::rt::string_size(1, &self.grid_id);
         }
-        if self.field_type != super::meta::FieldType::RichText {
+        if self.field_type != FieldType::RichText {
             my_size += ::protobuf::rt::enum_size(3, self.field_type);
         }
         if let ::std::option::Option::Some(ref v) = self.one_of_field_id {
@@ -992,7 +992,7 @@ impl ::protobuf::Message for GetEditFieldContextPayload {
         if !self.grid_id.is_empty() {
             os.write_string(1, &self.grid_id)?;
         }
-        if self.field_type != super::meta::FieldType::RichText {
+        if self.field_type != FieldType::RichText {
             os.write_enum(3, ::protobuf::ProtobufEnum::value(&self.field_type))?;
         }
         if let ::std::option::Option::Some(ref v) = self.one_of_field_id {
@@ -1050,7 +1050,7 @@ impl ::protobuf::Message for GetEditFieldContextPayload {
                 GetEditFieldContextPayload::has_field_id,
                 GetEditFieldContextPayload::get_field_id,
             ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<super::meta::FieldType>>(
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldType>>(
                 "field_type",
                 |m: &GetEditFieldContextPayload| { &m.field_type },
                 |m: &mut GetEditFieldContextPayload| { &mut m.field_type },
@@ -1073,7 +1073,7 @@ impl ::protobuf::Clear for GetEditFieldContextPayload {
     fn clear(&mut self) {
         self.grid_id.clear();
         self.one_of_field_id = ::std::option::Option::None;
-        self.field_type = super::meta::FieldType::RichText;
+        self.field_type = FieldType::RichText;
         self.unknown_fields.clear();
     }
 }
@@ -1095,7 +1095,7 @@ pub struct EditFieldPayload {
     // message fields
     pub grid_id: ::std::string::String,
     pub field_id: ::std::string::String,
-    pub field_type: super::meta::FieldType,
+    pub field_type: FieldType,
     // special fields
     pub unknown_fields: ::protobuf::UnknownFields,
     pub cached_size: ::protobuf::CachedSize,
@@ -1167,15 +1167,15 @@ impl EditFieldPayload {
     // .FieldType field_type = 3;
 
 
-    pub fn get_field_type(&self) -> super::meta::FieldType {
+    pub fn get_field_type(&self) -> FieldType {
         self.field_type
     }
     pub fn clear_field_type(&mut self) {
-        self.field_type = super::meta::FieldType::RichText;
+        self.field_type = FieldType::RichText;
     }
 
     // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: super::meta::FieldType) {
+    pub fn set_field_type(&mut self, v: FieldType) {
         self.field_type = v;
     }
 }
@@ -1216,7 +1216,7 @@ impl ::protobuf::Message for EditFieldPayload {
         if !self.field_id.is_empty() {
             my_size += ::protobuf::rt::string_size(2, &self.field_id);
         }
-        if self.field_type != super::meta::FieldType::RichText {
+        if self.field_type != FieldType::RichText {
             my_size += ::protobuf::rt::enum_size(3, self.field_type);
         }
         my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
@@ -1231,7 +1231,7 @@ impl ::protobuf::Message for EditFieldPayload {
         if !self.field_id.is_empty() {
             os.write_string(2, &self.field_id)?;
         }
-        if self.field_type != super::meta::FieldType::RichText {
+        if self.field_type != FieldType::RichText {
             os.write_enum(3, ::protobuf::ProtobufEnum::value(&self.field_type))?;
         }
         os.write_unknown_fields(self.get_unknown_fields())?;
@@ -1282,7 +1282,7 @@ impl ::protobuf::Message for EditFieldPayload {
                 |m: &EditFieldPayload| { &m.field_id },
                 |m: &mut EditFieldPayload| { &mut m.field_id },
             ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<super::meta::FieldType>>(
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldType>>(
                 "field_type",
                 |m: &EditFieldPayload| { &m.field_type },
                 |m: &mut EditFieldPayload| { &mut m.field_type },
@@ -1305,7 +1305,7 @@ impl ::protobuf::Clear for EditFieldPayload {
     fn clear(&mut self) {
         self.grid_id.clear();
         self.field_id.clear();
-        self.field_type = super::meta::FieldType::RichText;
+        self.field_type = FieldType::RichText;
         self.unknown_fields.clear();
     }
 }
@@ -5839,69 +5839,1146 @@ impl ::protobuf::reflect::ProtobufValue for QueryGridBlocksPayload {
     }
 }
 
+#[derive(PartialEq,Clone,Default)]
+pub struct FieldChangesetPayload {
+    // message fields
+    pub field_id: ::std::string::String,
+    pub grid_id: ::std::string::String,
+    // message oneof groups
+    pub one_of_name: ::std::option::Option<FieldChangesetPayload_oneof_one_of_name>,
+    pub one_of_desc: ::std::option::Option<FieldChangesetPayload_oneof_one_of_desc>,
+    pub one_of_field_type: ::std::option::Option<FieldChangesetPayload_oneof_one_of_field_type>,
+    pub one_of_frozen: ::std::option::Option<FieldChangesetPayload_oneof_one_of_frozen>,
+    pub one_of_visibility: ::std::option::Option<FieldChangesetPayload_oneof_one_of_visibility>,
+    pub one_of_width: ::std::option::Option<FieldChangesetPayload_oneof_one_of_width>,
+    pub one_of_type_option_data: ::std::option::Option<FieldChangesetPayload_oneof_one_of_type_option_data>,
+    // special fields
+    pub unknown_fields: ::protobuf::UnknownFields,
+    pub cached_size: ::protobuf::CachedSize,
+}
+
+impl<'a> ::std::default::Default for &'a FieldChangesetPayload {
+    fn default() -> &'a FieldChangesetPayload {
+        <FieldChangesetPayload as ::protobuf::Message>::default_instance()
+    }
+}
+
+#[derive(Clone,PartialEq,Debug)]
+pub enum FieldChangesetPayload_oneof_one_of_name {
+    name(::std::string::String),
+}
+
+#[derive(Clone,PartialEq,Debug)]
+pub enum FieldChangesetPayload_oneof_one_of_desc {
+    desc(::std::string::String),
+}
+
+#[derive(Clone,PartialEq,Debug)]
+pub enum FieldChangesetPayload_oneof_one_of_field_type {
+    field_type(FieldType),
+}
+
+#[derive(Clone,PartialEq,Debug)]
+pub enum FieldChangesetPayload_oneof_one_of_frozen {
+    frozen(bool),
+}
+
+#[derive(Clone,PartialEq,Debug)]
+pub enum FieldChangesetPayload_oneof_one_of_visibility {
+    visibility(bool),
+}
+
+#[derive(Clone,PartialEq,Debug)]
+pub enum FieldChangesetPayload_oneof_one_of_width {
+    width(i32),
+}
+
+#[derive(Clone,PartialEq,Debug)]
+pub enum FieldChangesetPayload_oneof_one_of_type_option_data {
+    type_option_data(::std::vec::Vec<u8>),
+}
+
+impl FieldChangesetPayload {
+    pub fn new() -> FieldChangesetPayload {
+        ::std::default::Default::default()
+    }
+
+    // string field_id = 1;
+
+
+    pub fn get_field_id(&self) -> &str {
+        &self.field_id
+    }
+    pub fn clear_field_id(&mut self) {
+        self.field_id.clear();
+    }
+
+    // Param is passed by value, moved
+    pub fn set_field_id(&mut self, v: ::std::string::String) {
+        self.field_id = v;
+    }
+
+    // Mutable pointer to the field.
+    // If field is not initialized, it is initialized with default value first.
+    pub fn mut_field_id(&mut self) -> &mut ::std::string::String {
+        &mut self.field_id
+    }
+
+    // Take field
+    pub fn take_field_id(&mut self) -> ::std::string::String {
+        ::std::mem::replace(&mut self.field_id, ::std::string::String::new())
+    }
+
+    // string grid_id = 2;
+
+
+    pub fn get_grid_id(&self) -> &str {
+        &self.grid_id
+    }
+    pub fn clear_grid_id(&mut self) {
+        self.grid_id.clear();
+    }
+
+    // Param is passed by value, moved
+    pub fn set_grid_id(&mut self, v: ::std::string::String) {
+        self.grid_id = v;
+    }
+
+    // Mutable pointer to the field.
+    // If field is not initialized, it is initialized with default value first.
+    pub fn mut_grid_id(&mut self) -> &mut ::std::string::String {
+        &mut self.grid_id
+    }
+
+    // Take field
+    pub fn take_grid_id(&mut self) -> ::std::string::String {
+        ::std::mem::replace(&mut self.grid_id, ::std::string::String::new())
+    }
+
+    // string name = 3;
+
+
+    pub fn get_name(&self) -> &str {
+        match self.one_of_name {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(ref v)) => v,
+            _ => "",
+        }
+    }
+    pub fn clear_name(&mut self) {
+        self.one_of_name = ::std::option::Option::None;
+    }
+
+    pub fn has_name(&self) -> bool {
+        match self.one_of_name {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_name(&mut self, v: ::std::string::String) {
+        self.one_of_name = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(v))
+    }
+
+    // Mutable pointer to the field.
+    pub fn mut_name(&mut self) -> &mut ::std::string::String {
+        if let ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(_)) = self.one_of_name {
+        } else {
+            self.one_of_name = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(::std::string::String::new()));
+        }
+        match self.one_of_name {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(ref mut v)) => v,
+            _ => panic!(),
+        }
+    }
+
+    // Take field
+    pub fn take_name(&mut self) -> ::std::string::String {
+        if self.has_name() {
+            match self.one_of_name.take() {
+                ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(v)) => v,
+                _ => panic!(),
+            }
+        } else {
+            ::std::string::String::new()
+        }
+    }
+
+    // string desc = 4;
+
+
+    pub fn get_desc(&self) -> &str {
+        match self.one_of_desc {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(ref v)) => v,
+            _ => "",
+        }
+    }
+    pub fn clear_desc(&mut self) {
+        self.one_of_desc = ::std::option::Option::None;
+    }
+
+    pub fn has_desc(&self) -> bool {
+        match self.one_of_desc {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_desc(&mut self, v: ::std::string::String) {
+        self.one_of_desc = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(v))
+    }
+
+    // Mutable pointer to the field.
+    pub fn mut_desc(&mut self) -> &mut ::std::string::String {
+        if let ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(_)) = self.one_of_desc {
+        } else {
+            self.one_of_desc = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(::std::string::String::new()));
+        }
+        match self.one_of_desc {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(ref mut v)) => v,
+            _ => panic!(),
+        }
+    }
+
+    // Take field
+    pub fn take_desc(&mut self) -> ::std::string::String {
+        if self.has_desc() {
+            match self.one_of_desc.take() {
+                ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(v)) => v,
+                _ => panic!(),
+            }
+        } else {
+            ::std::string::String::new()
+        }
+    }
+
+    // .FieldType field_type = 5;
+
+
+    pub fn get_field_type(&self) -> FieldType {
+        match self.one_of_field_type {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(v)) => v,
+            _ => FieldType::RichText,
+        }
+    }
+    pub fn clear_field_type(&mut self) {
+        self.one_of_field_type = ::std::option::Option::None;
+    }
+
+    pub fn has_field_type(&self) -> bool {
+        match self.one_of_field_type {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_field_type(&mut self, v: FieldType) {
+        self.one_of_field_type = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(v))
+    }
+
+    // bool frozen = 6;
+
+
+    pub fn get_frozen(&self) -> bool {
+        match self.one_of_frozen {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(v)) => v,
+            _ => false,
+        }
+    }
+    pub fn clear_frozen(&mut self) {
+        self.one_of_frozen = ::std::option::Option::None;
+    }
+
+    pub fn has_frozen(&self) -> bool {
+        match self.one_of_frozen {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_frozen(&mut self, v: bool) {
+        self.one_of_frozen = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(v))
+    }
+
+    // bool visibility = 7;
+
+
+    pub fn get_visibility(&self) -> bool {
+        match self.one_of_visibility {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(v)) => v,
+            _ => false,
+        }
+    }
+    pub fn clear_visibility(&mut self) {
+        self.one_of_visibility = ::std::option::Option::None;
+    }
+
+    pub fn has_visibility(&self) -> bool {
+        match self.one_of_visibility {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_visibility(&mut self, v: bool) {
+        self.one_of_visibility = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(v))
+    }
+
+    // int32 width = 8;
+
+
+    pub fn get_width(&self) -> i32 {
+        match self.one_of_width {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(v)) => v,
+            _ => 0,
+        }
+    }
+    pub fn clear_width(&mut self) {
+        self.one_of_width = ::std::option::Option::None;
+    }
+
+    pub fn has_width(&self) -> bool {
+        match self.one_of_width {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_width(&mut self, v: i32) {
+        self.one_of_width = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(v))
+    }
+
+    // bytes type_option_data = 9;
+
+
+    pub fn get_type_option_data(&self) -> &[u8] {
+        match self.one_of_type_option_data {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref v)) => v,
+            _ => &[],
+        }
+    }
+    pub fn clear_type_option_data(&mut self) {
+        self.one_of_type_option_data = ::std::option::Option::None;
+    }
+
+    pub fn has_type_option_data(&self) -> bool {
+        match self.one_of_type_option_data {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_type_option_data(&mut self, v: ::std::vec::Vec<u8>) {
+        self.one_of_type_option_data = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(v))
+    }
+
+    // Mutable pointer to the field.
+    pub fn mut_type_option_data(&mut self) -> &mut ::std::vec::Vec<u8> {
+        if let ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(_)) = self.one_of_type_option_data {
+        } else {
+            self.one_of_type_option_data = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(::std::vec::Vec::new()));
+        }
+        match self.one_of_type_option_data {
+            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref mut v)) => v,
+            _ => panic!(),
+        }
+    }
+
+    // Take field
+    pub fn take_type_option_data(&mut self) -> ::std::vec::Vec<u8> {
+        if self.has_type_option_data() {
+            match self.one_of_type_option_data.take() {
+                ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(v)) => v,
+                _ => panic!(),
+            }
+        } else {
+            ::std::vec::Vec::new()
+        }
+    }
+}
+
+impl ::protobuf::Message for FieldChangesetPayload {
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+        while !is.eof()? {
+            let (field_number, wire_type) = is.read_tag_unpack()?;
+            match field_number {
+                1 => {
+                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?;
+                },
+                2 => {
+                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?;
+                },
+                3 => {
+                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
+                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
+                    }
+                    self.one_of_name = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(is.read_string()?));
+                },
+                4 => {
+                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
+                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
+                    }
+                    self.one_of_desc = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(is.read_string()?));
+                },
+                5 => {
+                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
+                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
+                    }
+                    self.one_of_field_type = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(is.read_enum()?));
+                },
+                6 => {
+                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
+                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
+                    }
+                    self.one_of_frozen = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(is.read_bool()?));
+                },
+                7 => {
+                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
+                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
+                    }
+                    self.one_of_visibility = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(is.read_bool()?));
+                },
+                8 => {
+                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
+                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
+                    }
+                    self.one_of_width = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(is.read_int32()?));
+                },
+                9 => {
+                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
+                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
+                    }
+                    self.one_of_type_option_data = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(is.read_bytes()?));
+                },
+                _ => {
+                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u32 {
+        let mut my_size = 0;
+        if !self.field_id.is_empty() {
+            my_size += ::protobuf::rt::string_size(1, &self.field_id);
+        }
+        if !self.grid_id.is_empty() {
+            my_size += ::protobuf::rt::string_size(2, &self.grid_id);
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_name {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_name::name(ref v) => {
+                    my_size += ::protobuf::rt::string_size(3, &v);
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_desc {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_desc::desc(ref v) => {
+                    my_size += ::protobuf::rt::string_size(4, &v);
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_field_type {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_field_type::field_type(v) => {
+                    my_size += ::protobuf::rt::enum_size(5, v);
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_frozen {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_frozen::frozen(v) => {
+                    my_size += 2;
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_visibility {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_visibility::visibility(v) => {
+                    my_size += 2;
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_width {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_width::width(v) => {
+                    my_size += ::protobuf::rt::value_size(8, v, ::protobuf::wire_format::WireTypeVarint);
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_type_option_data {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref v) => {
+                    my_size += ::protobuf::rt::bytes_size(9, &v);
+                },
+            };
+        }
+        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
+        self.cached_size.set(my_size);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+        if !self.field_id.is_empty() {
+            os.write_string(1, &self.field_id)?;
+        }
+        if !self.grid_id.is_empty() {
+            os.write_string(2, &self.grid_id)?;
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_name {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_name::name(ref v) => {
+                    os.write_string(3, v)?;
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_desc {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_desc::desc(ref v) => {
+                    os.write_string(4, v)?;
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_field_type {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_field_type::field_type(v) => {
+                    os.write_enum(5, ::protobuf::ProtobufEnum::value(&v))?;
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_frozen {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_frozen::frozen(v) => {
+                    os.write_bool(6, v)?;
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_visibility {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_visibility::visibility(v) => {
+                    os.write_bool(7, v)?;
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_width {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_width::width(v) => {
+                    os.write_int32(8, v)?;
+                },
+            };
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_type_option_data {
+            match v {
+                &FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref v) => {
+                    os.write_bytes(9, v)?;
+                },
+            };
+        }
+        os.write_unknown_fields(self.get_unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn get_cached_size(&self) -> u32 {
+        self.cached_size.get()
+    }
+
+    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
+        &self.unknown_fields
+    }
+
+    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
+        &mut self.unknown_fields
+    }
+
+    fn as_any(&self) -> &dyn (::std::any::Any) {
+        self as &dyn (::std::any::Any)
+    }
+    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
+        self as &mut dyn (::std::any::Any)
+    }
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+        self
+    }
+
+    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
+        Self::descriptor_static()
+    }
+
+    fn new() -> FieldChangesetPayload {
+        FieldChangesetPayload::new()
+    }
+
+    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "field_id",
+                |m: &FieldChangesetPayload| { &m.field_id },
+                |m: &mut FieldChangesetPayload| { &mut m.field_id },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "grid_id",
+                |m: &FieldChangesetPayload| { &m.grid_id },
+                |m: &mut FieldChangesetPayload| { &mut m.grid_id },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
+                "name",
+                FieldChangesetPayload::has_name,
+                FieldChangesetPayload::get_name,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
+                "desc",
+                FieldChangesetPayload::has_desc,
+                FieldChangesetPayload::get_desc,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_enum_accessor::<_, FieldType>(
+                "field_type",
+                FieldChangesetPayload::has_field_type,
+                FieldChangesetPayload::get_field_type,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>(
+                "frozen",
+                FieldChangesetPayload::has_frozen,
+                FieldChangesetPayload::get_frozen,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>(
+                "visibility",
+                FieldChangesetPayload::has_visibility,
+                FieldChangesetPayload::get_visibility,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_i32_accessor::<_>(
+                "width",
+                FieldChangesetPayload::has_width,
+                FieldChangesetPayload::get_width,
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_bytes_accessor::<_>(
+                "type_option_data",
+                FieldChangesetPayload::has_type_option_data,
+                FieldChangesetPayload::get_type_option_data,
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldChangesetPayload>(
+                "FieldChangesetPayload",
+                fields,
+                file_descriptor_proto()
+            )
+        })
+    }
+
+    fn default_instance() -> &'static FieldChangesetPayload {
+        static instance: ::protobuf::rt::LazyV2<FieldChangesetPayload> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(FieldChangesetPayload::new)
+    }
+}
+
+impl ::protobuf::Clear for FieldChangesetPayload {
+    fn clear(&mut self) {
+        self.field_id.clear();
+        self.grid_id.clear();
+        self.one_of_name = ::std::option::Option::None;
+        self.one_of_desc = ::std::option::Option::None;
+        self.one_of_field_type = ::std::option::Option::None;
+        self.one_of_frozen = ::std::option::Option::None;
+        self.one_of_visibility = ::std::option::Option::None;
+        self.one_of_width = ::std::option::Option::None;
+        self.one_of_type_option_data = ::std::option::Option::None;
+        self.unknown_fields.clear();
+    }
+}
+
+impl ::std::fmt::Debug for FieldChangesetPayload {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        ::protobuf::text_format::fmt(self, f)
+    }
+}
+
+impl ::protobuf::reflect::ProtobufValue for FieldChangesetPayload {
+    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
+        ::protobuf::reflect::ReflectValueRef::Message(self)
+    }
+}
+
+#[derive(PartialEq,Clone,Default)]
+pub struct CellChangeset {
+    // message fields
+    pub grid_id: ::std::string::String,
+    pub row_id: ::std::string::String,
+    pub field_id: ::std::string::String,
+    // message oneof groups
+    pub one_of_data: ::std::option::Option<CellChangeset_oneof_one_of_data>,
+    // special fields
+    pub unknown_fields: ::protobuf::UnknownFields,
+    pub cached_size: ::protobuf::CachedSize,
+}
+
+impl<'a> ::std::default::Default for &'a CellChangeset {
+    fn default() -> &'a CellChangeset {
+        <CellChangeset as ::protobuf::Message>::default_instance()
+    }
+}
+
+#[derive(Clone,PartialEq,Debug)]
+pub enum CellChangeset_oneof_one_of_data {
+    data(::std::string::String),
+}
+
+impl CellChangeset {
+    pub fn new() -> CellChangeset {
+        ::std::default::Default::default()
+    }
+
+    // string grid_id = 1;
+
+
+    pub fn get_grid_id(&self) -> &str {
+        &self.grid_id
+    }
+    pub fn clear_grid_id(&mut self) {
+        self.grid_id.clear();
+    }
+
+    // Param is passed by value, moved
+    pub fn set_grid_id(&mut self, v: ::std::string::String) {
+        self.grid_id = v;
+    }
+
+    // Mutable pointer to the field.
+    // If field is not initialized, it is initialized with default value first.
+    pub fn mut_grid_id(&mut self) -> &mut ::std::string::String {
+        &mut self.grid_id
+    }
+
+    // Take field
+    pub fn take_grid_id(&mut self) -> ::std::string::String {
+        ::std::mem::replace(&mut self.grid_id, ::std::string::String::new())
+    }
+
+    // string row_id = 2;
+
+
+    pub fn get_row_id(&self) -> &str {
+        &self.row_id
+    }
+    pub fn clear_row_id(&mut self) {
+        self.row_id.clear();
+    }
+
+    // Param is passed by value, moved
+    pub fn set_row_id(&mut self, v: ::std::string::String) {
+        self.row_id = v;
+    }
+
+    // Mutable pointer to the field.
+    // If field is not initialized, it is initialized with default value first.
+    pub fn mut_row_id(&mut self) -> &mut ::std::string::String {
+        &mut self.row_id
+    }
+
+    // Take field
+    pub fn take_row_id(&mut self) -> ::std::string::String {
+        ::std::mem::replace(&mut self.row_id, ::std::string::String::new())
+    }
+
+    // string field_id = 3;
+
+
+    pub fn get_field_id(&self) -> &str {
+        &self.field_id
+    }
+    pub fn clear_field_id(&mut self) {
+        self.field_id.clear();
+    }
+
+    // Param is passed by value, moved
+    pub fn set_field_id(&mut self, v: ::std::string::String) {
+        self.field_id = v;
+    }
+
+    // Mutable pointer to the field.
+    // If field is not initialized, it is initialized with default value first.
+    pub fn mut_field_id(&mut self) -> &mut ::std::string::String {
+        &mut self.field_id
+    }
+
+    // Take field
+    pub fn take_field_id(&mut self) -> ::std::string::String {
+        ::std::mem::replace(&mut self.field_id, ::std::string::String::new())
+    }
+
+    // string data = 4;
+
+
+    pub fn get_data(&self) -> &str {
+        match self.one_of_data {
+            ::std::option::Option::Some(CellChangeset_oneof_one_of_data::data(ref v)) => v,
+            _ => "",
+        }
+    }
+    pub fn clear_data(&mut self) {
+        self.one_of_data = ::std::option::Option::None;
+    }
+
+    pub fn has_data(&self) -> bool {
+        match self.one_of_data {
+            ::std::option::Option::Some(CellChangeset_oneof_one_of_data::data(..)) => true,
+            _ => false,
+        }
+    }
+
+    // Param is passed by value, moved
+    pub fn set_data(&mut self, v: ::std::string::String) {
+        self.one_of_data = ::std::option::Option::Some(CellChangeset_oneof_one_of_data::data(v))
+    }
+
+    // Mutable pointer to the field.
+    pub fn mut_data(&mut self) -> &mut ::std::string::String {
+        if let ::std::option::Option::Some(CellChangeset_oneof_one_of_data::data(_)) = self.one_of_data {
+        } else {
+            self.one_of_data = ::std::option::Option::Some(CellChangeset_oneof_one_of_data::data(::std::string::String::new()));
+        }
+        match self.one_of_data {
+            ::std::option::Option::Some(CellChangeset_oneof_one_of_data::data(ref mut v)) => v,
+            _ => panic!(),
+        }
+    }
+
+    // Take field
+    pub fn take_data(&mut self) -> ::std::string::String {
+        if self.has_data() {
+            match self.one_of_data.take() {
+                ::std::option::Option::Some(CellChangeset_oneof_one_of_data::data(v)) => v,
+                _ => panic!(),
+            }
+        } else {
+            ::std::string::String::new()
+        }
+    }
+}
+
+impl ::protobuf::Message for CellChangeset {
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+        while !is.eof()? {
+            let (field_number, wire_type) = is.read_tag_unpack()?;
+            match field_number {
+                1 => {
+                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?;
+                },
+                2 => {
+                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?;
+                },
+                3 => {
+                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?;
+                },
+                4 => {
+                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
+                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
+                    }
+                    self.one_of_data = ::std::option::Option::Some(CellChangeset_oneof_one_of_data::data(is.read_string()?));
+                },
+                _ => {
+                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u32 {
+        let mut my_size = 0;
+        if !self.grid_id.is_empty() {
+            my_size += ::protobuf::rt::string_size(1, &self.grid_id);
+        }
+        if !self.row_id.is_empty() {
+            my_size += ::protobuf::rt::string_size(2, &self.row_id);
+        }
+        if !self.field_id.is_empty() {
+            my_size += ::protobuf::rt::string_size(3, &self.field_id);
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_data {
+            match v {
+                &CellChangeset_oneof_one_of_data::data(ref v) => {
+                    my_size += ::protobuf::rt::string_size(4, &v);
+                },
+            };
+        }
+        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
+        self.cached_size.set(my_size);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
+        if !self.grid_id.is_empty() {
+            os.write_string(1, &self.grid_id)?;
+        }
+        if !self.row_id.is_empty() {
+            os.write_string(2, &self.row_id)?;
+        }
+        if !self.field_id.is_empty() {
+            os.write_string(3, &self.field_id)?;
+        }
+        if let ::std::option::Option::Some(ref v) = self.one_of_data {
+            match v {
+                &CellChangeset_oneof_one_of_data::data(ref v) => {
+                    os.write_string(4, v)?;
+                },
+            };
+        }
+        os.write_unknown_fields(self.get_unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn get_cached_size(&self) -> u32 {
+        self.cached_size.get()
+    }
+
+    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
+        &self.unknown_fields
+    }
+
+    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
+        &mut self.unknown_fields
+    }
+
+    fn as_any(&self) -> &dyn (::std::any::Any) {
+        self as &dyn (::std::any::Any)
+    }
+    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
+        self as &mut dyn (::std::any::Any)
+    }
+    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
+        self
+    }
+
+    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
+        Self::descriptor_static()
+    }
+
+    fn new() -> CellChangeset {
+        CellChangeset::new()
+    }
+
+    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            let mut fields = ::std::vec::Vec::new();
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "grid_id",
+                |m: &CellChangeset| { &m.grid_id },
+                |m: &mut CellChangeset| { &mut m.grid_id },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "row_id",
+                |m: &CellChangeset| { &m.row_id },
+                |m: &mut CellChangeset| { &mut m.row_id },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
+                "field_id",
+                |m: &CellChangeset| { &m.field_id },
+                |m: &mut CellChangeset| { &mut m.field_id },
+            ));
+            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
+                "data",
+                CellChangeset::has_data,
+                CellChangeset::get_data,
+            ));
+            ::protobuf::reflect::MessageDescriptor::new_pb_name::<CellChangeset>(
+                "CellChangeset",
+                fields,
+                file_descriptor_proto()
+            )
+        })
+    }
+
+    fn default_instance() -> &'static CellChangeset {
+        static instance: ::protobuf::rt::LazyV2<CellChangeset> = ::protobuf::rt::LazyV2::INIT;
+        instance.get(CellChangeset::new)
+    }
+}
+
+impl ::protobuf::Clear for CellChangeset {
+    fn clear(&mut self) {
+        self.grid_id.clear();
+        self.row_id.clear();
+        self.field_id.clear();
+        self.one_of_data = ::std::option::Option::None;
+        self.unknown_fields.clear();
+    }
+}
+
+impl ::std::fmt::Debug for CellChangeset {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        ::protobuf::text_format::fmt(self, f)
+    }
+}
+
+impl ::protobuf::reflect::ProtobufValue for CellChangeset {
+    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
+        ::protobuf::reflect::ReflectValueRef::Message(self)
+    }
+}
+
+#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+pub enum FieldType {
+    RichText = 0,
+    Number = 1,
+    DateTime = 2,
+    SingleSelect = 3,
+    MultiSelect = 4,
+    Checkbox = 5,
+}
+
+impl ::protobuf::ProtobufEnum for FieldType {
+    fn value(&self) -> i32 {
+        *self as i32
+    }
+
+    fn from_i32(value: i32) -> ::std::option::Option<FieldType> {
+        match value {
+            0 => ::std::option::Option::Some(FieldType::RichText),
+            1 => ::std::option::Option::Some(FieldType::Number),
+            2 => ::std::option::Option::Some(FieldType::DateTime),
+            3 => ::std::option::Option::Some(FieldType::SingleSelect),
+            4 => ::std::option::Option::Some(FieldType::MultiSelect),
+            5 => ::std::option::Option::Some(FieldType::Checkbox),
+            _ => ::std::option::Option::None
+        }
+    }
+
+    fn values() -> &'static [Self] {
+        static values: &'static [FieldType] = &[
+            FieldType::RichText,
+            FieldType::Number,
+            FieldType::DateTime,
+            FieldType::SingleSelect,
+            FieldType::MultiSelect,
+            FieldType::Checkbox,
+        ];
+        values
+    }
+
+    fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldType>("FieldType", file_descriptor_proto())
+        })
+    }
+}
+
+impl ::std::marker::Copy for FieldType {
+}
+
+impl ::std::default::Default for FieldType {
+    fn default() -> Self {
+        FieldType::RichText
+    }
+}
+
+impl ::protobuf::reflect::ProtobufValue for FieldType {
+    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
+    }
+}
+
 static file_descriptor_proto_data: &'static [u8] = b"\
-    \n\ngrid.proto\x1a\nmeta.proto\"z\n\x04Grid\x12\x0e\n\x02id\x18\x01\x20\
-    \x01(\tR\x02id\x12.\n\x0cfield_orders\x18\x02\x20\x03(\x0b2\x0b.FieldOrd\
-    erR\x0bfieldOrders\x122\n\x0cblock_orders\x18\x03\x20\x03(\x0b2\x0f.Grid\
-    BlockOrderR\x0bblockOrders\"\xb8\x01\n\x05Field\x12\x0e\n\x02id\x18\x01\
-    \x20\x01(\tR\x02id\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12\x12\
-    \n\x04desc\x18\x03\x20\x01(\tR\x04desc\x12)\n\nfield_type\x18\x04\x20\
-    \x01(\x0e2\n.FieldTypeR\tfieldType\x12\x16\n\x06frozen\x18\x05\x20\x01(\
-    \x08R\x06frozen\x12\x1e\n\nvisibility\x18\x06\x20\x01(\x08R\nvisibility\
-    \x12\x14\n\x05width\x18\x07\x20\x01(\x05R\x05width\"'\n\nFieldOrder\x12\
-    \x19\n\x08field_id\x18\x01\x20\x01(\tR\x07fieldId\"\x90\x01\n\x1aGetEdit\
-    FieldContextPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\
-    \x12\x1b\n\x08field_id\x18\x02\x20\x01(\tH\0R\x07fieldId\x12)\n\nfield_t\
-    ype\x18\x03\x20\x01(\x0e2\n.FieldTypeR\tfieldTypeB\x11\n\x0fone_of_field\
-    _id\"q\n\x10EditFieldPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\
-    \x06gridId\x12\x19\n\x08field_id\x18\x02\x20\x01(\tR\x07fieldId\x12)\n\n\
-    field_type\x18\x03\x20\x01(\x0e2\n.FieldTypeR\tfieldType\"|\n\x10EditFie\
-    ldContext\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12%\n\ngri\
-    d_field\x18\x02\x20\x01(\x0b2\x06.FieldR\tgridField\x12(\n\x10type_optio\
-    n_data\x18\x03\x20\x01(\x0cR\x0etypeOptionData\"-\n\rRepeatedField\x12\
-    \x1c\n\x05items\x18\x01\x20\x03(\x0b2\x06.FieldR\x05items\"7\n\x12Repeat\
-    edFieldOrder\x12!\n\x05items\x18\x01\x20\x03(\x0b2\x0b.FieldOrderR\x05it\
-    ems\"T\n\x08RowOrder\x12\x15\n\x06row_id\x18\x01\x20\x01(\tR\x05rowId\
-    \x12\x19\n\x08block_id\x18\x02\x20\x01(\tR\x07blockId\x12\x16\n\x06heigh\
-    t\x18\x03\x20\x01(\x05R\x06height\"\xb8\x01\n\x03Row\x12\x0e\n\x02id\x18\
-    \x01\x20\x01(\tR\x02id\x12@\n\x10cell_by_field_id\x18\x02\x20\x03(\x0b2\
-    \x17.Row.CellByFieldIdEntryR\rcellByFieldId\x12\x16\n\x06height\x18\x03\
-    \x20\x01(\x05R\x06height\x1aG\n\x12CellByFieldIdEntry\x12\x10\n\x03key\
-    \x18\x01\x20\x01(\tR\x03key\x12\x1b\n\x05value\x18\x02\x20\x01(\x0b2\x05\
-    .CellR\x05value:\x028\x01\")\n\x0bRepeatedRow\x12\x1a\n\x05items\x18\x01\
-    \x20\x03(\x0b2\x04.RowR\x05items\"5\n\x11RepeatedGridBlock\x12\x20\n\x05\
-    items\x18\x01\x20\x03(\x0b2\n.GridBlockR\x05items\"U\n\x0eGridBlockOrder\
-    \x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12(\n\nrow_orders\
-    \x18\x02\x20\x03(\x0b2\t.RowOrderR\trowOrders\"\xc5\x01\n\x17GridBlockOr\
-    derChangeset\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x123\n\
-    \rinserted_rows\x18\x02\x20\x03(\x0b2\x0e.IndexRowOrderR\x0cinsertedRows\
-    \x12,\n\x0cdeleted_rows\x18\x03\x20\x03(\x0b2\t.RowOrderR\x0bdeletedRows\
-    \x12,\n\x0cupdated_rows\x18\x04\x20\x03(\x0b2\t.RowOrderR\x0bupdatedRows\
-    \"_\n\rIndexRowOrder\x12&\n\trow_order\x18\x01\x20\x01(\x0b2\t.RowOrderR\
-    \x08rowOrder\x12\x16\n\x05index\x18\x02\x20\x01(\x05H\0R\x05indexB\x0e\n\
-    \x0cone_of_index\"E\n\tGridBlock\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02\
-    id\x12(\n\nrow_orders\x18\x02\x20\x03(\x0b2\t.RowOrderR\trowOrders\";\n\
-    \x04Cell\x12\x19\n\x08field_id\x18\x01\x20\x01(\tR\x07fieldId\x12\x18\n\
-    \x07content\x18\x02\x20\x01(\tR\x07content\"\x8f\x01\n\x14CellNotificati\
-    onData\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12\x19\n\x08f\
-    ield_id\x18\x02\x20\x01(\tR\x07fieldId\x12\x15\n\x06row_id\x18\x03\x20\
-    \x01(\tR\x05rowId\x12\x1a\n\x07content\x18\x04\x20\x01(\tH\0R\x07content\
-    B\x10\n\x0eone_of_content\"+\n\x0cRepeatedCell\x12\x1b\n\x05items\x18\
-    \x01\x20\x03(\x0b2\x05.CellR\x05items\"'\n\x11CreateGridPayload\x12\x12\
-    \n\x04name\x18\x01\x20\x01(\tR\x04name\"\x1e\n\x06GridId\x12\x14\n\x05va\
-    lue\x18\x01\x20\x01(\tR\x05value\"#\n\x0bGridBlockId\x12\x14\n\x05value\
-    \x18\x01\x20\x01(\tR\x05value\"f\n\x10CreateRowPayload\x12\x17\n\x07grid\
-    _id\x18\x01\x20\x01(\tR\x06gridId\x12\"\n\x0cstart_row_id\x18\x02\x20\
-    \x01(\tH\0R\nstartRowIdB\x15\n\x13one_of_start_row_id\"\xb6\x01\n\x12Cre\
-    ateFieldPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12\
-    \x1c\n\x05field\x18\x02\x20\x01(\x0b2\x06.FieldR\x05field\x12(\n\x10type\
-    _option_data\x18\x03\x20\x01(\x0cR\x0etypeOptionData\x12&\n\x0estart_fie\
-    ld_id\x18\x04\x20\x01(\tH\0R\x0cstartFieldIdB\x17\n\x15one_of_start_fiel\
-    d_id\"d\n\x11QueryFieldPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\
-    \x06gridId\x126\n\x0cfield_orders\x18\x02\x20\x01(\x0b2\x13.RepeatedFiel\
-    dOrderR\x0bfieldOrders\"e\n\x16QueryGridBlocksPayload\x12\x17\n\x07grid_\
-    id\x18\x01\x20\x01(\tR\x06gridId\x122\n\x0cblock_orders\x18\x02\x20\x03(\
-    \x0b2\x0f.GridBlockOrderR\x0bblockOrdersb\x06proto3\
+    \n\ngrid.proto\"z\n\x04Grid\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\
+    \x12.\n\x0cfield_orders\x18\x02\x20\x03(\x0b2\x0b.FieldOrderR\x0bfieldOr\
+    ders\x122\n\x0cblock_orders\x18\x03\x20\x03(\x0b2\x0f.GridBlockOrderR\
+    \x0bblockOrders\"\xb8\x01\n\x05Field\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\
+    \x02id\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12\x12\n\x04desc\
+    \x18\x03\x20\x01(\tR\x04desc\x12)\n\nfield_type\x18\x04\x20\x01(\x0e2\n.\
+    FieldTypeR\tfieldType\x12\x16\n\x06frozen\x18\x05\x20\x01(\x08R\x06froze\
+    n\x12\x1e\n\nvisibility\x18\x06\x20\x01(\x08R\nvisibility\x12\x14\n\x05w\
+    idth\x18\x07\x20\x01(\x05R\x05width\"'\n\nFieldOrder\x12\x19\n\x08field_\
+    id\x18\x01\x20\x01(\tR\x07fieldId\"\x90\x01\n\x1aGetEditFieldContextPayl\
+    oad\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12\x1b\n\x08fiel\
+    d_id\x18\x02\x20\x01(\tH\0R\x07fieldId\x12)\n\nfield_type\x18\x03\x20\
+    \x01(\x0e2\n.FieldTypeR\tfieldTypeB\x11\n\x0fone_of_field_id\"q\n\x10Edi\
+    tFieldPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12\x19\
+    \n\x08field_id\x18\x02\x20\x01(\tR\x07fieldId\x12)\n\nfield_type\x18\x03\
+    \x20\x01(\x0e2\n.FieldTypeR\tfieldType\"|\n\x10EditFieldContext\x12\x17\
+    \n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12%\n\ngrid_field\x18\x02\
+    \x20\x01(\x0b2\x06.FieldR\tgridField\x12(\n\x10type_option_data\x18\x03\
+    \x20\x01(\x0cR\x0etypeOptionData\"-\n\rRepeatedField\x12\x1c\n\x05items\
+    \x18\x01\x20\x03(\x0b2\x06.FieldR\x05items\"7\n\x12RepeatedFieldOrder\
+    \x12!\n\x05items\x18\x01\x20\x03(\x0b2\x0b.FieldOrderR\x05items\"T\n\x08\
+    RowOrder\x12\x15\n\x06row_id\x18\x01\x20\x01(\tR\x05rowId\x12\x19\n\x08b\
+    lock_id\x18\x02\x20\x01(\tR\x07blockId\x12\x16\n\x06height\x18\x03\x20\
+    \x01(\x05R\x06height\"\xb8\x01\n\x03Row\x12\x0e\n\x02id\x18\x01\x20\x01(\
+    \tR\x02id\x12@\n\x10cell_by_field_id\x18\x02\x20\x03(\x0b2\x17.Row.CellB\
+    yFieldIdEntryR\rcellByFieldId\x12\x16\n\x06height\x18\x03\x20\x01(\x05R\
+    \x06height\x1aG\n\x12CellByFieldIdEntry\x12\x10\n\x03key\x18\x01\x20\x01\
+    (\tR\x03key\x12\x1b\n\x05value\x18\x02\x20\x01(\x0b2\x05.CellR\x05value:\
+    \x028\x01\")\n\x0bRepeatedRow\x12\x1a\n\x05items\x18\x01\x20\x03(\x0b2\
+    \x04.RowR\x05items\"5\n\x11RepeatedGridBlock\x12\x20\n\x05items\x18\x01\
+    \x20\x03(\x0b2\n.GridBlockR\x05items\"U\n\x0eGridBlockOrder\x12\x19\n\
+    \x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12(\n\nrow_orders\x18\x02\
+    \x20\x03(\x0b2\t.RowOrderR\trowOrders\"\xc5\x01\n\x17GridBlockOrderChang\
+    eset\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x123\n\rinsert\
+    ed_rows\x18\x02\x20\x03(\x0b2\x0e.IndexRowOrderR\x0cinsertedRows\x12,\n\
+    \x0cdeleted_rows\x18\x03\x20\x03(\x0b2\t.RowOrderR\x0bdeletedRows\x12,\n\
+    \x0cupdated_rows\x18\x04\x20\x03(\x0b2\t.RowOrderR\x0bupdatedRows\"_\n\r\
+    IndexRowOrder\x12&\n\trow_order\x18\x01\x20\x01(\x0b2\t.RowOrderR\x08row\
+    Order\x12\x16\n\x05index\x18\x02\x20\x01(\x05H\0R\x05indexB\x0e\n\x0cone\
+    _of_index\"E\n\tGridBlock\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12(\
+    \n\nrow_orders\x18\x02\x20\x03(\x0b2\t.RowOrderR\trowOrders\";\n\x04Cell\
+    \x12\x19\n\x08field_id\x18\x01\x20\x01(\tR\x07fieldId\x12\x18\n\x07conte\
+    nt\x18\x02\x20\x01(\tR\x07content\"\x8f\x01\n\x14CellNotificationData\
+    \x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12\x19\n\x08field_i\
+    d\x18\x02\x20\x01(\tR\x07fieldId\x12\x15\n\x06row_id\x18\x03\x20\x01(\tR\
+    \x05rowId\x12\x1a\n\x07content\x18\x04\x20\x01(\tH\0R\x07contentB\x10\n\
+    \x0eone_of_content\"+\n\x0cRepeatedCell\x12\x1b\n\x05items\x18\x01\x20\
+    \x03(\x0b2\x05.CellR\x05items\"'\n\x11CreateGridPayload\x12\x12\n\x04nam\
+    e\x18\x01\x20\x01(\tR\x04name\"\x1e\n\x06GridId\x12\x14\n\x05value\x18\
+    \x01\x20\x01(\tR\x05value\"#\n\x0bGridBlockId\x12\x14\n\x05value\x18\x01\
+    \x20\x01(\tR\x05value\"f\n\x10CreateRowPayload\x12\x17\n\x07grid_id\x18\
+    \x01\x20\x01(\tR\x06gridId\x12\"\n\x0cstart_row_id\x18\x02\x20\x01(\tH\0\
+    R\nstartRowIdB\x15\n\x13one_of_start_row_id\"\xb6\x01\n\x12CreateFieldPa\
+    yload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12\x1c\n\x05fi\
+    eld\x18\x02\x20\x01(\x0b2\x06.FieldR\x05field\x12(\n\x10type_option_data\
+    \x18\x03\x20\x01(\x0cR\x0etypeOptionData\x12&\n\x0estart_field_id\x18\
+    \x04\x20\x01(\tH\0R\x0cstartFieldIdB\x17\n\x15one_of_start_field_id\"d\n\
+    \x11QueryFieldPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\
+    \x126\n\x0cfield_orders\x18\x02\x20\x01(\x0b2\x13.RepeatedFieldOrderR\
+    \x0bfieldOrders\"e\n\x16QueryGridBlocksPayload\x12\x17\n\x07grid_id\x18\
+    \x01\x20\x01(\tR\x06gridId\x122\n\x0cblock_orders\x18\x02\x20\x03(\x0b2\
+    \x0f.GridBlockOrderR\x0bblockOrders\"\xa8\x03\n\x15FieldChangesetPayload\
+    \x12\x19\n\x08field_id\x18\x01\x20\x01(\tR\x07fieldId\x12\x17\n\x07grid_\
+    id\x18\x02\x20\x01(\tR\x06gridId\x12\x14\n\x04name\x18\x03\x20\x01(\tH\0\
+    R\x04name\x12\x14\n\x04desc\x18\x04\x20\x01(\tH\x01R\x04desc\x12+\n\nfie\
+    ld_type\x18\x05\x20\x01(\x0e2\n.FieldTypeH\x02R\tfieldType\x12\x18\n\x06\
+    frozen\x18\x06\x20\x01(\x08H\x03R\x06frozen\x12\x20\n\nvisibility\x18\
+    \x07\x20\x01(\x08H\x04R\nvisibility\x12\x16\n\x05width\x18\x08\x20\x01(\
+    \x05H\x05R\x05width\x12*\n\x10type_option_data\x18\t\x20\x01(\x0cH\x06R\
+    \x0etypeOptionDataB\r\n\x0bone_of_nameB\r\n\x0bone_of_descB\x13\n\x11one\
+    _of_field_typeB\x0f\n\rone_of_frozenB\x13\n\x11one_of_visibilityB\x0e\n\
+    \x0cone_of_widthB\x19\n\x17one_of_type_option_data\"\x7f\n\rCellChangese\
+    t\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x12\x15\n\x06row_id\
+    \x18\x02\x20\x01(\tR\x05rowId\x12\x19\n\x08field_id\x18\x03\x20\x01(\tR\
+    \x07fieldId\x12\x14\n\x04data\x18\x04\x20\x01(\tH\0R\x04dataB\r\n\x0bone\
+    _of_data*d\n\tFieldType\x12\x0c\n\x08RichText\x10\0\x12\n\n\x06Number\
+    \x10\x01\x12\x0c\n\x08DateTime\x10\x02\x12\x10\n\x0cSingleSelect\x10\x03\
+    \x12\x0f\n\x0bMultiSelect\x10\x04\x12\x0c\n\x08Checkbox\x10\x05b\x06prot\
+    o3\
 ";
 
 static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;

+ 0 - 3520
shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs

@@ -1,3520 +0,0 @@
-// This file is generated by rust-protobuf 2.25.2. Do not edit
-// @generated
-
-// https://github.com/rust-lang/rust-clippy/issues/702
-#![allow(unknown_lints)]
-#![allow(clippy::all)]
-
-#![allow(unused_attributes)]
-#![cfg_attr(rustfmt, rustfmt::skip)]
-
-#![allow(box_pointers)]
-#![allow(dead_code)]
-#![allow(missing_docs)]
-#![allow(non_camel_case_types)]
-#![allow(non_snake_case)]
-#![allow(non_upper_case_globals)]
-#![allow(trivial_casts)]
-#![allow(unused_imports)]
-#![allow(unused_results)]
-//! Generated file from `meta.proto`
-
-/// Generated files are compatible only with the same version
-/// of protobuf runtime.
-// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2;
-
-#[derive(PartialEq,Clone,Default)]
-pub struct GridMeta {
-    // message fields
-    pub grid_id: ::std::string::String,
-    pub fields: ::protobuf::RepeatedField<FieldMeta>,
-    pub blocks: ::protobuf::RepeatedField<GridBlockMeta>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a GridMeta {
-    fn default() -> &'a GridMeta {
-        <GridMeta as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl GridMeta {
-    pub fn new() -> GridMeta {
-        ::std::default::Default::default()
-    }
-
-    // string grid_id = 1;
-
-
-    pub fn get_grid_id(&self) -> &str {
-        &self.grid_id
-    }
-    pub fn clear_grid_id(&mut self) {
-        self.grid_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_grid_id(&mut self, v: ::std::string::String) {
-        self.grid_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_grid_id(&mut self) -> &mut ::std::string::String {
-        &mut self.grid_id
-    }
-
-    // Take field
-    pub fn take_grid_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.grid_id, ::std::string::String::new())
-    }
-
-    // repeated .FieldMeta fields = 2;
-
-
-    pub fn get_fields(&self) -> &[FieldMeta] {
-        &self.fields
-    }
-    pub fn clear_fields(&mut self) {
-        self.fields.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_fields(&mut self, v: ::protobuf::RepeatedField<FieldMeta>) {
-        self.fields = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_fields(&mut self) -> &mut ::protobuf::RepeatedField<FieldMeta> {
-        &mut self.fields
-    }
-
-    // Take field
-    pub fn take_fields(&mut self) -> ::protobuf::RepeatedField<FieldMeta> {
-        ::std::mem::replace(&mut self.fields, ::protobuf::RepeatedField::new())
-    }
-
-    // repeated .GridBlockMeta blocks = 3;
-
-
-    pub fn get_blocks(&self) -> &[GridBlockMeta] {
-        &self.blocks
-    }
-    pub fn clear_blocks(&mut self) {
-        self.blocks.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_blocks(&mut self, v: ::protobuf::RepeatedField<GridBlockMeta>) {
-        self.blocks = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_blocks(&mut self) -> &mut ::protobuf::RepeatedField<GridBlockMeta> {
-        &mut self.blocks
-    }
-
-    // Take field
-    pub fn take_blocks(&mut self) -> ::protobuf::RepeatedField<GridBlockMeta> {
-        ::std::mem::replace(&mut self.blocks, ::protobuf::RepeatedField::new())
-    }
-}
-
-impl ::protobuf::Message for GridMeta {
-    fn is_initialized(&self) -> bool {
-        for v in &self.fields {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.blocks {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?;
-                },
-                2 => {
-                    ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.fields)?;
-                },
-                3 => {
-                    ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.blocks)?;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.grid_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.grid_id);
-        }
-        for value in &self.fields {
-            let len = value.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
-        };
-        for value in &self.blocks {
-            let len = value.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
-        };
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.grid_id.is_empty() {
-            os.write_string(1, &self.grid_id)?;
-        }
-        for v in &self.fields {
-            os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        for v in &self.blocks {
-            os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> GridMeta {
-        GridMeta::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "grid_id",
-                |m: &GridMeta| { &m.grid_id },
-                |m: &mut GridMeta| { &mut m.grid_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldMeta>>(
-                "fields",
-                |m: &GridMeta| { &m.fields },
-                |m: &mut GridMeta| { &mut m.fields },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<GridBlockMeta>>(
-                "blocks",
-                |m: &GridMeta| { &m.blocks },
-                |m: &mut GridMeta| { &mut m.blocks },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<GridMeta>(
-                "GridMeta",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static GridMeta {
-        static instance: ::protobuf::rt::LazyV2<GridMeta> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(GridMeta::new)
-    }
-}
-
-impl ::protobuf::Clear for GridMeta {
-    fn clear(&mut self) {
-        self.grid_id.clear();
-        self.fields.clear();
-        self.blocks.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for GridMeta {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for GridMeta {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct GridBlockMeta {
-    // message fields
-    pub block_id: ::std::string::String,
-    pub start_row_index: i32,
-    pub row_count: i32,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a GridBlockMeta {
-    fn default() -> &'a GridBlockMeta {
-        <GridBlockMeta as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl GridBlockMeta {
-    pub fn new() -> GridBlockMeta {
-        ::std::default::Default::default()
-    }
-
-    // string block_id = 1;
-
-
-    pub fn get_block_id(&self) -> &str {
-        &self.block_id
-    }
-    pub fn clear_block_id(&mut self) {
-        self.block_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_block_id(&mut self, v: ::std::string::String) {
-        self.block_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_block_id(&mut self) -> &mut ::std::string::String {
-        &mut self.block_id
-    }
-
-    // Take field
-    pub fn take_block_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.block_id, ::std::string::String::new())
-    }
-
-    // int32 start_row_index = 2;
-
-
-    pub fn get_start_row_index(&self) -> i32 {
-        self.start_row_index
-    }
-    pub fn clear_start_row_index(&mut self) {
-        self.start_row_index = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_start_row_index(&mut self, v: i32) {
-        self.start_row_index = v;
-    }
-
-    // int32 row_count = 3;
-
-
-    pub fn get_row_count(&self) -> i32 {
-        self.row_count
-    }
-    pub fn clear_row_count(&mut self) {
-        self.row_count = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_row_count(&mut self, v: i32) {
-        self.row_count = v;
-    }
-}
-
-impl ::protobuf::Message for GridBlockMeta {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?;
-                },
-                2 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.start_row_index = tmp;
-                },
-                3 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.row_count = tmp;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.block_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.block_id);
-        }
-        if self.start_row_index != 0 {
-            my_size += ::protobuf::rt::value_size(2, self.start_row_index, ::protobuf::wire_format::WireTypeVarint);
-        }
-        if self.row_count != 0 {
-            my_size += ::protobuf::rt::value_size(3, self.row_count, ::protobuf::wire_format::WireTypeVarint);
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.block_id.is_empty() {
-            os.write_string(1, &self.block_id)?;
-        }
-        if self.start_row_index != 0 {
-            os.write_int32(2, self.start_row_index)?;
-        }
-        if self.row_count != 0 {
-            os.write_int32(3, self.row_count)?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> GridBlockMeta {
-        GridBlockMeta::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "block_id",
-                |m: &GridBlockMeta| { &m.block_id },
-                |m: &mut GridBlockMeta| { &mut m.block_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                "start_row_index",
-                |m: &GridBlockMeta| { &m.start_row_index },
-                |m: &mut GridBlockMeta| { &mut m.start_row_index },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                "row_count",
-                |m: &GridBlockMeta| { &m.row_count },
-                |m: &mut GridBlockMeta| { &mut m.row_count },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<GridBlockMeta>(
-                "GridBlockMeta",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static GridBlockMeta {
-        static instance: ::protobuf::rt::LazyV2<GridBlockMeta> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(GridBlockMeta::new)
-    }
-}
-
-impl ::protobuf::Clear for GridBlockMeta {
-    fn clear(&mut self) {
-        self.block_id.clear();
-        self.start_row_index = 0;
-        self.row_count = 0;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for GridBlockMeta {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for GridBlockMeta {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct GridBlockMetaData {
-    // message fields
-    pub block_id: ::std::string::String,
-    pub rows: ::protobuf::RepeatedField<RowMeta>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a GridBlockMetaData {
-    fn default() -> &'a GridBlockMetaData {
-        <GridBlockMetaData as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl GridBlockMetaData {
-    pub fn new() -> GridBlockMetaData {
-        ::std::default::Default::default()
-    }
-
-    // string block_id = 1;
-
-
-    pub fn get_block_id(&self) -> &str {
-        &self.block_id
-    }
-    pub fn clear_block_id(&mut self) {
-        self.block_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_block_id(&mut self, v: ::std::string::String) {
-        self.block_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_block_id(&mut self) -> &mut ::std::string::String {
-        &mut self.block_id
-    }
-
-    // Take field
-    pub fn take_block_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.block_id, ::std::string::String::new())
-    }
-
-    // repeated .RowMeta rows = 2;
-
-
-    pub fn get_rows(&self) -> &[RowMeta] {
-        &self.rows
-    }
-    pub fn clear_rows(&mut self) {
-        self.rows.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_rows(&mut self, v: ::protobuf::RepeatedField<RowMeta>) {
-        self.rows = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_rows(&mut self) -> &mut ::protobuf::RepeatedField<RowMeta> {
-        &mut self.rows
-    }
-
-    // Take field
-    pub fn take_rows(&mut self) -> ::protobuf::RepeatedField<RowMeta> {
-        ::std::mem::replace(&mut self.rows, ::protobuf::RepeatedField::new())
-    }
-}
-
-impl ::protobuf::Message for GridBlockMetaData {
-    fn is_initialized(&self) -> bool {
-        for v in &self.rows {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?;
-                },
-                2 => {
-                    ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.rows)?;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.block_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.block_id);
-        }
-        for value in &self.rows {
-            let len = value.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
-        };
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.block_id.is_empty() {
-            os.write_string(1, &self.block_id)?;
-        }
-        for v in &self.rows {
-            os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> GridBlockMetaData {
-        GridBlockMetaData::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "block_id",
-                |m: &GridBlockMetaData| { &m.block_id },
-                |m: &mut GridBlockMetaData| { &mut m.block_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<RowMeta>>(
-                "rows",
-                |m: &GridBlockMetaData| { &m.rows },
-                |m: &mut GridBlockMetaData| { &mut m.rows },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<GridBlockMetaData>(
-                "GridBlockMetaData",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static GridBlockMetaData {
-        static instance: ::protobuf::rt::LazyV2<GridBlockMetaData> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(GridBlockMetaData::new)
-    }
-}
-
-impl ::protobuf::Clear for GridBlockMetaData {
-    fn clear(&mut self) {
-        self.block_id.clear();
-        self.rows.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for GridBlockMetaData {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for GridBlockMetaData {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct FieldMeta {
-    // message fields
-    pub id: ::std::string::String,
-    pub name: ::std::string::String,
-    pub desc: ::std::string::String,
-    pub field_type: FieldType,
-    pub frozen: bool,
-    pub visibility: bool,
-    pub width: i32,
-    pub type_options: ::std::collections::HashMap<::std::string::String, ::std::string::String>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a FieldMeta {
-    fn default() -> &'a FieldMeta {
-        <FieldMeta as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl FieldMeta {
-    pub fn new() -> FieldMeta {
-        ::std::default::Default::default()
-    }
-
-    // string id = 1;
-
-
-    pub fn get_id(&self) -> &str {
-        &self.id
-    }
-    pub fn clear_id(&mut self) {
-        self.id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_id(&mut self, v: ::std::string::String) {
-        self.id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_id(&mut self) -> &mut ::std::string::String {
-        &mut self.id
-    }
-
-    // Take field
-    pub fn take_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.id, ::std::string::String::new())
-    }
-
-    // string name = 2;
-
-
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-    pub fn clear_name(&mut self) {
-        self.name.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.name = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        &mut self.name
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.name, ::std::string::String::new())
-    }
-
-    // string desc = 3;
-
-
-    pub fn get_desc(&self) -> &str {
-        &self.desc
-    }
-    pub fn clear_desc(&mut self) {
-        self.desc.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_desc(&mut self, v: ::std::string::String) {
-        self.desc = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_desc(&mut self) -> &mut ::std::string::String {
-        &mut self.desc
-    }
-
-    // Take field
-    pub fn take_desc(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.desc, ::std::string::String::new())
-    }
-
-    // .FieldType field_type = 4;
-
-
-    pub fn get_field_type(&self) -> FieldType {
-        self.field_type
-    }
-    pub fn clear_field_type(&mut self) {
-        self.field_type = FieldType::RichText;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: FieldType) {
-        self.field_type = v;
-    }
-
-    // bool frozen = 5;
-
-
-    pub fn get_frozen(&self) -> bool {
-        self.frozen
-    }
-    pub fn clear_frozen(&mut self) {
-        self.frozen = false;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_frozen(&mut self, v: bool) {
-        self.frozen = v;
-    }
-
-    // bool visibility = 6;
-
-
-    pub fn get_visibility(&self) -> bool {
-        self.visibility
-    }
-    pub fn clear_visibility(&mut self) {
-        self.visibility = false;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_visibility(&mut self, v: bool) {
-        self.visibility = v;
-    }
-
-    // int32 width = 7;
-
-
-    pub fn get_width(&self) -> i32 {
-        self.width
-    }
-    pub fn clear_width(&mut self) {
-        self.width = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_width(&mut self, v: i32) {
-        self.width = v;
-    }
-
-    // repeated .FieldMeta.TypeOptionsEntry type_options = 8;
-
-
-    pub fn get_type_options(&self) -> &::std::collections::HashMap<::std::string::String, ::std::string::String> {
-        &self.type_options
-    }
-    pub fn clear_type_options(&mut self) {
-        self.type_options.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_type_options(&mut self, v: ::std::collections::HashMap<::std::string::String, ::std::string::String>) {
-        self.type_options = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_type_options(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, ::std::string::String> {
-        &mut self.type_options
-    }
-
-    // Take field
-    pub fn take_type_options(&mut self) -> ::std::collections::HashMap<::std::string::String, ::std::string::String> {
-        ::std::mem::replace(&mut self.type_options, ::std::collections::HashMap::new())
-    }
-}
-
-impl ::protobuf::Message for FieldMeta {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?;
-                },
-                2 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?;
-                },
-                3 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.desc)?;
-                },
-                4 => {
-                    ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.field_type, 4, &mut self.unknown_fields)?
-                },
-                5 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.frozen = tmp;
-                },
-                6 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.visibility = tmp;
-                },
-                7 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.width = tmp;
-                },
-                8 => {
-                    ::protobuf::rt::read_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeString>(wire_type, is, &mut self.type_options)?;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.id);
-        }
-        if !self.name.is_empty() {
-            my_size += ::protobuf::rt::string_size(2, &self.name);
-        }
-        if !self.desc.is_empty() {
-            my_size += ::protobuf::rt::string_size(3, &self.desc);
-        }
-        if self.field_type != FieldType::RichText {
-            my_size += ::protobuf::rt::enum_size(4, self.field_type);
-        }
-        if self.frozen != false {
-            my_size += 2;
-        }
-        if self.visibility != false {
-            my_size += 2;
-        }
-        if self.width != 0 {
-            my_size += ::protobuf::rt::value_size(7, self.width, ::protobuf::wire_format::WireTypeVarint);
-        }
-        my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeString>(8, &self.type_options);
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.id.is_empty() {
-            os.write_string(1, &self.id)?;
-        }
-        if !self.name.is_empty() {
-            os.write_string(2, &self.name)?;
-        }
-        if !self.desc.is_empty() {
-            os.write_string(3, &self.desc)?;
-        }
-        if self.field_type != FieldType::RichText {
-            os.write_enum(4, ::protobuf::ProtobufEnum::value(&self.field_type))?;
-        }
-        if self.frozen != false {
-            os.write_bool(5, self.frozen)?;
-        }
-        if self.visibility != false {
-            os.write_bool(6, self.visibility)?;
-        }
-        if self.width != 0 {
-            os.write_int32(7, self.width)?;
-        }
-        ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeString>(8, &self.type_options, os)?;
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> FieldMeta {
-        FieldMeta::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "id",
-                |m: &FieldMeta| { &m.id },
-                |m: &mut FieldMeta| { &mut m.id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "name",
-                |m: &FieldMeta| { &m.name },
-                |m: &mut FieldMeta| { &mut m.name },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "desc",
-                |m: &FieldMeta| { &m.desc },
-                |m: &mut FieldMeta| { &mut m.desc },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<FieldType>>(
-                "field_type",
-                |m: &FieldMeta| { &m.field_type },
-                |m: &mut FieldMeta| { &mut m.field_type },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                "frozen",
-                |m: &FieldMeta| { &m.frozen },
-                |m: &mut FieldMeta| { &mut m.frozen },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                "visibility",
-                |m: &FieldMeta| { &m.visibility },
-                |m: &mut FieldMeta| { &mut m.visibility },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                "width",
-                |m: &FieldMeta| { &m.width },
-                |m: &mut FieldMeta| { &mut m.width },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeString>(
-                "type_options",
-                |m: &FieldMeta| { &m.type_options },
-                |m: &mut FieldMeta| { &mut m.type_options },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldMeta>(
-                "FieldMeta",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static FieldMeta {
-        static instance: ::protobuf::rt::LazyV2<FieldMeta> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(FieldMeta::new)
-    }
-}
-
-impl ::protobuf::Clear for FieldMeta {
-    fn clear(&mut self) {
-        self.id.clear();
-        self.name.clear();
-        self.desc.clear();
-        self.field_type = FieldType::RichText;
-        self.frozen = false;
-        self.visibility = false;
-        self.width = 0;
-        self.type_options.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for FieldMeta {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for FieldMeta {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct FieldChangesetPayload {
-    // message fields
-    pub field_id: ::std::string::String,
-    pub grid_id: ::std::string::String,
-    // message oneof groups
-    pub one_of_name: ::std::option::Option<FieldChangesetPayload_oneof_one_of_name>,
-    pub one_of_desc: ::std::option::Option<FieldChangesetPayload_oneof_one_of_desc>,
-    pub one_of_field_type: ::std::option::Option<FieldChangesetPayload_oneof_one_of_field_type>,
-    pub one_of_frozen: ::std::option::Option<FieldChangesetPayload_oneof_one_of_frozen>,
-    pub one_of_visibility: ::std::option::Option<FieldChangesetPayload_oneof_one_of_visibility>,
-    pub one_of_width: ::std::option::Option<FieldChangesetPayload_oneof_one_of_width>,
-    pub one_of_type_option_data: ::std::option::Option<FieldChangesetPayload_oneof_one_of_type_option_data>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a FieldChangesetPayload {
-    fn default() -> &'a FieldChangesetPayload {
-        <FieldChangesetPayload as ::protobuf::Message>::default_instance()
-    }
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum FieldChangesetPayload_oneof_one_of_name {
-    name(::std::string::String),
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum FieldChangesetPayload_oneof_one_of_desc {
-    desc(::std::string::String),
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum FieldChangesetPayload_oneof_one_of_field_type {
-    field_type(FieldType),
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum FieldChangesetPayload_oneof_one_of_frozen {
-    frozen(bool),
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum FieldChangesetPayload_oneof_one_of_visibility {
-    visibility(bool),
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum FieldChangesetPayload_oneof_one_of_width {
-    width(i32),
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum FieldChangesetPayload_oneof_one_of_type_option_data {
-    type_option_data(::std::vec::Vec<u8>),
-}
-
-impl FieldChangesetPayload {
-    pub fn new() -> FieldChangesetPayload {
-        ::std::default::Default::default()
-    }
-
-    // string field_id = 1;
-
-
-    pub fn get_field_id(&self) -> &str {
-        &self.field_id
-    }
-    pub fn clear_field_id(&mut self) {
-        self.field_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_field_id(&mut self, v: ::std::string::String) {
-        self.field_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_field_id(&mut self) -> &mut ::std::string::String {
-        &mut self.field_id
-    }
-
-    // Take field
-    pub fn take_field_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.field_id, ::std::string::String::new())
-    }
-
-    // string grid_id = 2;
-
-
-    pub fn get_grid_id(&self) -> &str {
-        &self.grid_id
-    }
-    pub fn clear_grid_id(&mut self) {
-        self.grid_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_grid_id(&mut self, v: ::std::string::String) {
-        self.grid_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_grid_id(&mut self) -> &mut ::std::string::String {
-        &mut self.grid_id
-    }
-
-    // Take field
-    pub fn take_grid_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.grid_id, ::std::string::String::new())
-    }
-
-    // string name = 3;
-
-
-    pub fn get_name(&self) -> &str {
-        match self.one_of_name {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(ref v)) => v,
-            _ => "",
-        }
-    }
-    pub fn clear_name(&mut self) {
-        self.one_of_name = ::std::option::Option::None;
-    }
-
-    pub fn has_name(&self) -> bool {
-        match self.one_of_name {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_name(&mut self, v: ::std::string::String) {
-        self.one_of_name = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(v))
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_name(&mut self) -> &mut ::std::string::String {
-        if let ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(_)) = self.one_of_name {
-        } else {
-            self.one_of_name = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(::std::string::String::new()));
-        }
-        match self.one_of_name {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(ref mut v)) => v,
-            _ => panic!(),
-        }
-    }
-
-    // Take field
-    pub fn take_name(&mut self) -> ::std::string::String {
-        if self.has_name() {
-            match self.one_of_name.take() {
-                ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(v)) => v,
-                _ => panic!(),
-            }
-        } else {
-            ::std::string::String::new()
-        }
-    }
-
-    // string desc = 4;
-
-
-    pub fn get_desc(&self) -> &str {
-        match self.one_of_desc {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(ref v)) => v,
-            _ => "",
-        }
-    }
-    pub fn clear_desc(&mut self) {
-        self.one_of_desc = ::std::option::Option::None;
-    }
-
-    pub fn has_desc(&self) -> bool {
-        match self.one_of_desc {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_desc(&mut self, v: ::std::string::String) {
-        self.one_of_desc = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(v))
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_desc(&mut self) -> &mut ::std::string::String {
-        if let ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(_)) = self.one_of_desc {
-        } else {
-            self.one_of_desc = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(::std::string::String::new()));
-        }
-        match self.one_of_desc {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(ref mut v)) => v,
-            _ => panic!(),
-        }
-    }
-
-    // Take field
-    pub fn take_desc(&mut self) -> ::std::string::String {
-        if self.has_desc() {
-            match self.one_of_desc.take() {
-                ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(v)) => v,
-                _ => panic!(),
-            }
-        } else {
-            ::std::string::String::new()
-        }
-    }
-
-    // .FieldType field_type = 5;
-
-
-    pub fn get_field_type(&self) -> FieldType {
-        match self.one_of_field_type {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(v)) => v,
-            _ => FieldType::RichText,
-        }
-    }
-    pub fn clear_field_type(&mut self) {
-        self.one_of_field_type = ::std::option::Option::None;
-    }
-
-    pub fn has_field_type(&self) -> bool {
-        match self.one_of_field_type {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_field_type(&mut self, v: FieldType) {
-        self.one_of_field_type = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(v))
-    }
-
-    // bool frozen = 6;
-
-
-    pub fn get_frozen(&self) -> bool {
-        match self.one_of_frozen {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(v)) => v,
-            _ => false,
-        }
-    }
-    pub fn clear_frozen(&mut self) {
-        self.one_of_frozen = ::std::option::Option::None;
-    }
-
-    pub fn has_frozen(&self) -> bool {
-        match self.one_of_frozen {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_frozen(&mut self, v: bool) {
-        self.one_of_frozen = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(v))
-    }
-
-    // bool visibility = 7;
-
-
-    pub fn get_visibility(&self) -> bool {
-        match self.one_of_visibility {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(v)) => v,
-            _ => false,
-        }
-    }
-    pub fn clear_visibility(&mut self) {
-        self.one_of_visibility = ::std::option::Option::None;
-    }
-
-    pub fn has_visibility(&self) -> bool {
-        match self.one_of_visibility {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_visibility(&mut self, v: bool) {
-        self.one_of_visibility = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(v))
-    }
-
-    // int32 width = 8;
-
-
-    pub fn get_width(&self) -> i32 {
-        match self.one_of_width {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(v)) => v,
-            _ => 0,
-        }
-    }
-    pub fn clear_width(&mut self) {
-        self.one_of_width = ::std::option::Option::None;
-    }
-
-    pub fn has_width(&self) -> bool {
-        match self.one_of_width {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_width(&mut self, v: i32) {
-        self.one_of_width = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(v))
-    }
-
-    // bytes type_option_data = 9;
-
-
-    pub fn get_type_option_data(&self) -> &[u8] {
-        match self.one_of_type_option_data {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref v)) => v,
-            _ => &[],
-        }
-    }
-    pub fn clear_type_option_data(&mut self) {
-        self.one_of_type_option_data = ::std::option::Option::None;
-    }
-
-    pub fn has_type_option_data(&self) -> bool {
-        match self.one_of_type_option_data {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_type_option_data(&mut self, v: ::std::vec::Vec<u8>) {
-        self.one_of_type_option_data = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(v))
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_type_option_data(&mut self) -> &mut ::std::vec::Vec<u8> {
-        if let ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(_)) = self.one_of_type_option_data {
-        } else {
-            self.one_of_type_option_data = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(::std::vec::Vec::new()));
-        }
-        match self.one_of_type_option_data {
-            ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref mut v)) => v,
-            _ => panic!(),
-        }
-    }
-
-    // Take field
-    pub fn take_type_option_data(&mut self) -> ::std::vec::Vec<u8> {
-        if self.has_type_option_data() {
-            match self.one_of_type_option_data.take() {
-                ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(v)) => v,
-                _ => panic!(),
-            }
-        } else {
-            ::std::vec::Vec::new()
-        }
-    }
-}
-
-impl ::protobuf::Message for FieldChangesetPayload {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?;
-                },
-                2 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?;
-                },
-                3 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_name = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(is.read_string()?));
-                },
-                4 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_desc = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(is.read_string()?));
-                },
-                5 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_field_type = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(is.read_enum()?));
-                },
-                6 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_frozen = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(is.read_bool()?));
-                },
-                7 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_visibility = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(is.read_bool()?));
-                },
-                8 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_width = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(is.read_int32()?));
-                },
-                9 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_type_option_data = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(is.read_bytes()?));
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.field_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.field_id);
-        }
-        if !self.grid_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(2, &self.grid_id);
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_name {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_name::name(ref v) => {
-                    my_size += ::protobuf::rt::string_size(3, &v);
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_desc {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_desc::desc(ref v) => {
-                    my_size += ::protobuf::rt::string_size(4, &v);
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_field_type {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_field_type::field_type(v) => {
-                    my_size += ::protobuf::rt::enum_size(5, v);
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_frozen {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_frozen::frozen(v) => {
-                    my_size += 2;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_visibility {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_visibility::visibility(v) => {
-                    my_size += 2;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_width {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_width::width(v) => {
-                    my_size += ::protobuf::rt::value_size(8, v, ::protobuf::wire_format::WireTypeVarint);
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_type_option_data {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref v) => {
-                    my_size += ::protobuf::rt::bytes_size(9, &v);
-                },
-            };
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.field_id.is_empty() {
-            os.write_string(1, &self.field_id)?;
-        }
-        if !self.grid_id.is_empty() {
-            os.write_string(2, &self.grid_id)?;
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_name {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_name::name(ref v) => {
-                    os.write_string(3, v)?;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_desc {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_desc::desc(ref v) => {
-                    os.write_string(4, v)?;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_field_type {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_field_type::field_type(v) => {
-                    os.write_enum(5, ::protobuf::ProtobufEnum::value(&v))?;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_frozen {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_frozen::frozen(v) => {
-                    os.write_bool(6, v)?;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_visibility {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_visibility::visibility(v) => {
-                    os.write_bool(7, v)?;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_width {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_width::width(v) => {
-                    os.write_int32(8, v)?;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_type_option_data {
-            match v {
-                &FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref v) => {
-                    os.write_bytes(9, v)?;
-                },
-            };
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> FieldChangesetPayload {
-        FieldChangesetPayload::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "field_id",
-                |m: &FieldChangesetPayload| { &m.field_id },
-                |m: &mut FieldChangesetPayload| { &mut m.field_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "grid_id",
-                |m: &FieldChangesetPayload| { &m.grid_id },
-                |m: &mut FieldChangesetPayload| { &mut m.grid_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
-                "name",
-                FieldChangesetPayload::has_name,
-                FieldChangesetPayload::get_name,
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
-                "desc",
-                FieldChangesetPayload::has_desc,
-                FieldChangesetPayload::get_desc,
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_enum_accessor::<_, FieldType>(
-                "field_type",
-                FieldChangesetPayload::has_field_type,
-                FieldChangesetPayload::get_field_type,
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>(
-                "frozen",
-                FieldChangesetPayload::has_frozen,
-                FieldChangesetPayload::get_frozen,
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>(
-                "visibility",
-                FieldChangesetPayload::has_visibility,
-                FieldChangesetPayload::get_visibility,
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_i32_accessor::<_>(
-                "width",
-                FieldChangesetPayload::has_width,
-                FieldChangesetPayload::get_width,
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_bytes_accessor::<_>(
-                "type_option_data",
-                FieldChangesetPayload::has_type_option_data,
-                FieldChangesetPayload::get_type_option_data,
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<FieldChangesetPayload>(
-                "FieldChangesetPayload",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static FieldChangesetPayload {
-        static instance: ::protobuf::rt::LazyV2<FieldChangesetPayload> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(FieldChangesetPayload::new)
-    }
-}
-
-impl ::protobuf::Clear for FieldChangesetPayload {
-    fn clear(&mut self) {
-        self.field_id.clear();
-        self.grid_id.clear();
-        self.one_of_name = ::std::option::Option::None;
-        self.one_of_desc = ::std::option::Option::None;
-        self.one_of_field_type = ::std::option::Option::None;
-        self.one_of_frozen = ::std::option::Option::None;
-        self.one_of_visibility = ::std::option::Option::None;
-        self.one_of_width = ::std::option::Option::None;
-        self.one_of_type_option_data = ::std::option::Option::None;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for FieldChangesetPayload {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for FieldChangesetPayload {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct AnyData {
-    // message fields
-    pub type_id: ::std::string::String,
-    pub value: ::std::vec::Vec<u8>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a AnyData {
-    fn default() -> &'a AnyData {
-        <AnyData as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl AnyData {
-    pub fn new() -> AnyData {
-        ::std::default::Default::default()
-    }
-
-    // string type_id = 1;
-
-
-    pub fn get_type_id(&self) -> &str {
-        &self.type_id
-    }
-    pub fn clear_type_id(&mut self) {
-        self.type_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_type_id(&mut self, v: ::std::string::String) {
-        self.type_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_type_id(&mut self) -> &mut ::std::string::String {
-        &mut self.type_id
-    }
-
-    // Take field
-    pub fn take_type_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.type_id, ::std::string::String::new())
-    }
-
-    // bytes value = 2;
-
-
-    pub fn get_value(&self) -> &[u8] {
-        &self.value
-    }
-    pub fn clear_value(&mut self) {
-        self.value.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_value(&mut self, v: ::std::vec::Vec<u8>) {
-        self.value = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_value(&mut self) -> &mut ::std::vec::Vec<u8> {
-        &mut self.value
-    }
-
-    // Take field
-    pub fn take_value(&mut self) -> ::std::vec::Vec<u8> {
-        ::std::mem::replace(&mut self.value, ::std::vec::Vec::new())
-    }
-}
-
-impl ::protobuf::Message for AnyData {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.type_id)?;
-                },
-                2 => {
-                    ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.value)?;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.type_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.type_id);
-        }
-        if !self.value.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(2, &self.value);
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.type_id.is_empty() {
-            os.write_string(1, &self.type_id)?;
-        }
-        if !self.value.is_empty() {
-            os.write_bytes(2, &self.value)?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> AnyData {
-        AnyData::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "type_id",
-                |m: &AnyData| { &m.type_id },
-                |m: &mut AnyData| { &mut m.type_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
-                "value",
-                |m: &AnyData| { &m.value },
-                |m: &mut AnyData| { &mut m.value },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<AnyData>(
-                "AnyData",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static AnyData {
-        static instance: ::protobuf::rt::LazyV2<AnyData> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(AnyData::new)
-    }
-}
-
-impl ::protobuf::Clear for AnyData {
-    fn clear(&mut self) {
-        self.type_id.clear();
-        self.value.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for AnyData {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for AnyData {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct RowMeta {
-    // message fields
-    pub id: ::std::string::String,
-    pub block_id: ::std::string::String,
-    pub cells: ::std::collections::HashMap<::std::string::String, CellMeta>,
-    pub height: i32,
-    pub visibility: bool,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a RowMeta {
-    fn default() -> &'a RowMeta {
-        <RowMeta as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl RowMeta {
-    pub fn new() -> RowMeta {
-        ::std::default::Default::default()
-    }
-
-    // string id = 1;
-
-
-    pub fn get_id(&self) -> &str {
-        &self.id
-    }
-    pub fn clear_id(&mut self) {
-        self.id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_id(&mut self, v: ::std::string::String) {
-        self.id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_id(&mut self) -> &mut ::std::string::String {
-        &mut self.id
-    }
-
-    // Take field
-    pub fn take_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.id, ::std::string::String::new())
-    }
-
-    // string block_id = 2;
-
-
-    pub fn get_block_id(&self) -> &str {
-        &self.block_id
-    }
-    pub fn clear_block_id(&mut self) {
-        self.block_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_block_id(&mut self, v: ::std::string::String) {
-        self.block_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_block_id(&mut self) -> &mut ::std::string::String {
-        &mut self.block_id
-    }
-
-    // Take field
-    pub fn take_block_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.block_id, ::std::string::String::new())
-    }
-
-    // repeated .RowMeta.CellsEntry cells = 3;
-
-
-    pub fn get_cells(&self) -> &::std::collections::HashMap<::std::string::String, CellMeta> {
-        &self.cells
-    }
-    pub fn clear_cells(&mut self) {
-        self.cells.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_cells(&mut self, v: ::std::collections::HashMap<::std::string::String, CellMeta>) {
-        self.cells = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_cells(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, CellMeta> {
-        &mut self.cells
-    }
-
-    // Take field
-    pub fn take_cells(&mut self) -> ::std::collections::HashMap<::std::string::String, CellMeta> {
-        ::std::mem::replace(&mut self.cells, ::std::collections::HashMap::new())
-    }
-
-    // int32 height = 4;
-
-
-    pub fn get_height(&self) -> i32 {
-        self.height
-    }
-    pub fn clear_height(&mut self) {
-        self.height = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_height(&mut self, v: i32) {
-        self.height = v;
-    }
-
-    // bool visibility = 5;
-
-
-    pub fn get_visibility(&self) -> bool {
-        self.visibility
-    }
-    pub fn clear_visibility(&mut self) {
-        self.visibility = false;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_visibility(&mut self, v: bool) {
-        self.visibility = v;
-    }
-}
-
-impl ::protobuf::Message for RowMeta {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?;
-                },
-                2 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.block_id)?;
-                },
-                3 => {
-                    ::protobuf::rt::read_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<CellMeta>>(wire_type, is, &mut self.cells)?;
-                },
-                4 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int32()?;
-                    self.height = tmp;
-                },
-                5 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_bool()?;
-                    self.visibility = tmp;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.id);
-        }
-        if !self.block_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(2, &self.block_id);
-        }
-        my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<CellMeta>>(3, &self.cells);
-        if self.height != 0 {
-            my_size += ::protobuf::rt::value_size(4, self.height, ::protobuf::wire_format::WireTypeVarint);
-        }
-        if self.visibility != false {
-            my_size += 2;
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.id.is_empty() {
-            os.write_string(1, &self.id)?;
-        }
-        if !self.block_id.is_empty() {
-            os.write_string(2, &self.block_id)?;
-        }
-        ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<CellMeta>>(3, &self.cells, os)?;
-        if self.height != 0 {
-            os.write_int32(4, self.height)?;
-        }
-        if self.visibility != false {
-            os.write_bool(5, self.visibility)?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> RowMeta {
-        RowMeta::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "id",
-                |m: &RowMeta| { &m.id },
-                |m: &mut RowMeta| { &mut m.id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "block_id",
-                |m: &RowMeta| { &m.block_id },
-                |m: &mut RowMeta| { &mut m.block_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<CellMeta>>(
-                "cells",
-                |m: &RowMeta| { &m.cells },
-                |m: &mut RowMeta| { &mut m.cells },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
-                "height",
-                |m: &RowMeta| { &m.height },
-                |m: &mut RowMeta| { &mut m.height },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
-                "visibility",
-                |m: &RowMeta| { &m.visibility },
-                |m: &mut RowMeta| { &mut m.visibility },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<RowMeta>(
-                "RowMeta",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static RowMeta {
-        static instance: ::protobuf::rt::LazyV2<RowMeta> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(RowMeta::new)
-    }
-}
-
-impl ::protobuf::Clear for RowMeta {
-    fn clear(&mut self) {
-        self.id.clear();
-        self.block_id.clear();
-        self.cells.clear();
-        self.height = 0;
-        self.visibility = false;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for RowMeta {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for RowMeta {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct RowMetaChangeset {
-    // message fields
-    pub row_id: ::std::string::String,
-    pub cell_by_field_id: ::std::collections::HashMap<::std::string::String, CellMeta>,
-    // message oneof groups
-    pub one_of_height: ::std::option::Option<RowMetaChangeset_oneof_one_of_height>,
-    pub one_of_visibility: ::std::option::Option<RowMetaChangeset_oneof_one_of_visibility>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a RowMetaChangeset {
-    fn default() -> &'a RowMetaChangeset {
-        <RowMetaChangeset as ::protobuf::Message>::default_instance()
-    }
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum RowMetaChangeset_oneof_one_of_height {
-    height(i32),
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum RowMetaChangeset_oneof_one_of_visibility {
-    visibility(bool),
-}
-
-impl RowMetaChangeset {
-    pub fn new() -> RowMetaChangeset {
-        ::std::default::Default::default()
-    }
-
-    // string row_id = 1;
-
-
-    pub fn get_row_id(&self) -> &str {
-        &self.row_id
-    }
-    pub fn clear_row_id(&mut self) {
-        self.row_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_row_id(&mut self, v: ::std::string::String) {
-        self.row_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_row_id(&mut self) -> &mut ::std::string::String {
-        &mut self.row_id
-    }
-
-    // Take field
-    pub fn take_row_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.row_id, ::std::string::String::new())
-    }
-
-    // int32 height = 2;
-
-
-    pub fn get_height(&self) -> i32 {
-        match self.one_of_height {
-            ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_height::height(v)) => v,
-            _ => 0,
-        }
-    }
-    pub fn clear_height(&mut self) {
-        self.one_of_height = ::std::option::Option::None;
-    }
-
-    pub fn has_height(&self) -> bool {
-        match self.one_of_height {
-            ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_height::height(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_height(&mut self, v: i32) {
-        self.one_of_height = ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_height::height(v))
-    }
-
-    // bool visibility = 3;
-
-
-    pub fn get_visibility(&self) -> bool {
-        match self.one_of_visibility {
-            ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_visibility::visibility(v)) => v,
-            _ => false,
-        }
-    }
-    pub fn clear_visibility(&mut self) {
-        self.one_of_visibility = ::std::option::Option::None;
-    }
-
-    pub fn has_visibility(&self) -> bool {
-        match self.one_of_visibility {
-            ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_visibility::visibility(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_visibility(&mut self, v: bool) {
-        self.one_of_visibility = ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_visibility::visibility(v))
-    }
-
-    // repeated .RowMetaChangeset.CellByFieldIdEntry cell_by_field_id = 4;
-
-
-    pub fn get_cell_by_field_id(&self) -> &::std::collections::HashMap<::std::string::String, CellMeta> {
-        &self.cell_by_field_id
-    }
-    pub fn clear_cell_by_field_id(&mut self) {
-        self.cell_by_field_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_cell_by_field_id(&mut self, v: ::std::collections::HashMap<::std::string::String, CellMeta>) {
-        self.cell_by_field_id = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_cell_by_field_id(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, CellMeta> {
-        &mut self.cell_by_field_id
-    }
-
-    // Take field
-    pub fn take_cell_by_field_id(&mut self) -> ::std::collections::HashMap<::std::string::String, CellMeta> {
-        ::std::mem::replace(&mut self.cell_by_field_id, ::std::collections::HashMap::new())
-    }
-}
-
-impl ::protobuf::Message for RowMetaChangeset {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?;
-                },
-                2 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_height = ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_height::height(is.read_int32()?));
-                },
-                3 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_visibility = ::std::option::Option::Some(RowMetaChangeset_oneof_one_of_visibility::visibility(is.read_bool()?));
-                },
-                4 => {
-                    ::protobuf::rt::read_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<CellMeta>>(wire_type, is, &mut self.cell_by_field_id)?;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.row_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.row_id);
-        }
-        my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<CellMeta>>(4, &self.cell_by_field_id);
-        if let ::std::option::Option::Some(ref v) = self.one_of_height {
-            match v {
-                &RowMetaChangeset_oneof_one_of_height::height(v) => {
-                    my_size += ::protobuf::rt::value_size(2, v, ::protobuf::wire_format::WireTypeVarint);
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_visibility {
-            match v {
-                &RowMetaChangeset_oneof_one_of_visibility::visibility(v) => {
-                    my_size += 2;
-                },
-            };
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.row_id.is_empty() {
-            os.write_string(1, &self.row_id)?;
-        }
-        ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<CellMeta>>(4, &self.cell_by_field_id, os)?;
-        if let ::std::option::Option::Some(ref v) = self.one_of_height {
-            match v {
-                &RowMetaChangeset_oneof_one_of_height::height(v) => {
-                    os.write_int32(2, v)?;
-                },
-            };
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_visibility {
-            match v {
-                &RowMetaChangeset_oneof_one_of_visibility::visibility(v) => {
-                    os.write_bool(3, v)?;
-                },
-            };
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> RowMetaChangeset {
-        RowMetaChangeset::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "row_id",
-                |m: &RowMetaChangeset| { &m.row_id },
-                |m: &mut RowMetaChangeset| { &mut m.row_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_i32_accessor::<_>(
-                "height",
-                RowMetaChangeset::has_height,
-                RowMetaChangeset::get_height,
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>(
-                "visibility",
-                RowMetaChangeset::has_visibility,
-                RowMetaChangeset::get_visibility,
-            ));
-            fields.push(::protobuf::reflect::accessor::make_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeMessage<CellMeta>>(
-                "cell_by_field_id",
-                |m: &RowMetaChangeset| { &m.cell_by_field_id },
-                |m: &mut RowMetaChangeset| { &mut m.cell_by_field_id },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<RowMetaChangeset>(
-                "RowMetaChangeset",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static RowMetaChangeset {
-        static instance: ::protobuf::rt::LazyV2<RowMetaChangeset> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(RowMetaChangeset::new)
-    }
-}
-
-impl ::protobuf::Clear for RowMetaChangeset {
-    fn clear(&mut self) {
-        self.row_id.clear();
-        self.one_of_height = ::std::option::Option::None;
-        self.one_of_visibility = ::std::option::Option::None;
-        self.cell_by_field_id.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for RowMetaChangeset {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for RowMetaChangeset {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct CellMeta {
-    // message fields
-    pub data: ::std::string::String,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a CellMeta {
-    fn default() -> &'a CellMeta {
-        <CellMeta as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl CellMeta {
-    pub fn new() -> CellMeta {
-        ::std::default::Default::default()
-    }
-
-    // string data = 1;
-
-
-    pub fn get_data(&self) -> &str {
-        &self.data
-    }
-    pub fn clear_data(&mut self) {
-        self.data.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_data(&mut self, v: ::std::string::String) {
-        self.data = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_data(&mut self) -> &mut ::std::string::String {
-        &mut self.data
-    }
-
-    // Take field
-    pub fn take_data(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.data, ::std::string::String::new())
-    }
-}
-
-impl ::protobuf::Message for CellMeta {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.data)?;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.data.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.data);
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.data.is_empty() {
-            os.write_string(1, &self.data)?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> CellMeta {
-        CellMeta::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "data",
-                |m: &CellMeta| { &m.data },
-                |m: &mut CellMeta| { &mut m.data },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<CellMeta>(
-                "CellMeta",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static CellMeta {
-        static instance: ::protobuf::rt::LazyV2<CellMeta> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(CellMeta::new)
-    }
-}
-
-impl ::protobuf::Clear for CellMeta {
-    fn clear(&mut self) {
-        self.data.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for CellMeta {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for CellMeta {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct CellMetaChangeset {
-    // message fields
-    pub grid_id: ::std::string::String,
-    pub row_id: ::std::string::String,
-    pub field_id: ::std::string::String,
-    // message oneof groups
-    pub one_of_data: ::std::option::Option<CellMetaChangeset_oneof_one_of_data>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a CellMetaChangeset {
-    fn default() -> &'a CellMetaChangeset {
-        <CellMetaChangeset as ::protobuf::Message>::default_instance()
-    }
-}
-
-#[derive(Clone,PartialEq,Debug)]
-pub enum CellMetaChangeset_oneof_one_of_data {
-    data(::std::string::String),
-}
-
-impl CellMetaChangeset {
-    pub fn new() -> CellMetaChangeset {
-        ::std::default::Default::default()
-    }
-
-    // string grid_id = 1;
-
-
-    pub fn get_grid_id(&self) -> &str {
-        &self.grid_id
-    }
-    pub fn clear_grid_id(&mut self) {
-        self.grid_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_grid_id(&mut self, v: ::std::string::String) {
-        self.grid_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_grid_id(&mut self) -> &mut ::std::string::String {
-        &mut self.grid_id
-    }
-
-    // Take field
-    pub fn take_grid_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.grid_id, ::std::string::String::new())
-    }
-
-    // string row_id = 2;
-
-
-    pub fn get_row_id(&self) -> &str {
-        &self.row_id
-    }
-    pub fn clear_row_id(&mut self) {
-        self.row_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_row_id(&mut self, v: ::std::string::String) {
-        self.row_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_row_id(&mut self) -> &mut ::std::string::String {
-        &mut self.row_id
-    }
-
-    // Take field
-    pub fn take_row_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.row_id, ::std::string::String::new())
-    }
-
-    // string field_id = 3;
-
-
-    pub fn get_field_id(&self) -> &str {
-        &self.field_id
-    }
-    pub fn clear_field_id(&mut self) {
-        self.field_id.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_field_id(&mut self, v: ::std::string::String) {
-        self.field_id = v;
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_field_id(&mut self) -> &mut ::std::string::String {
-        &mut self.field_id
-    }
-
-    // Take field
-    pub fn take_field_id(&mut self) -> ::std::string::String {
-        ::std::mem::replace(&mut self.field_id, ::std::string::String::new())
-    }
-
-    // string data = 4;
-
-
-    pub fn get_data(&self) -> &str {
-        match self.one_of_data {
-            ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(ref v)) => v,
-            _ => "",
-        }
-    }
-    pub fn clear_data(&mut self) {
-        self.one_of_data = ::std::option::Option::None;
-    }
-
-    pub fn has_data(&self) -> bool {
-        match self.one_of_data {
-            ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(..)) => true,
-            _ => false,
-        }
-    }
-
-    // Param is passed by value, moved
-    pub fn set_data(&mut self, v: ::std::string::String) {
-        self.one_of_data = ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(v))
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_data(&mut self) -> &mut ::std::string::String {
-        if let ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(_)) = self.one_of_data {
-        } else {
-            self.one_of_data = ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(::std::string::String::new()));
-        }
-        match self.one_of_data {
-            ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(ref mut v)) => v,
-            _ => panic!(),
-        }
-    }
-
-    // Take field
-    pub fn take_data(&mut self) -> ::std::string::String {
-        if self.has_data() {
-            match self.one_of_data.take() {
-                ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(v)) => v,
-                _ => panic!(),
-            }
-        } else {
-            ::std::string::String::new()
-        }
-    }
-}
-
-impl ::protobuf::Message for CellMetaChangeset {
-    fn is_initialized(&self) -> bool {
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.grid_id)?;
-                },
-                2 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?;
-                },
-                3 => {
-                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?;
-                },
-                4 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    self.one_of_data = ::std::option::Option::Some(CellMetaChangeset_oneof_one_of_data::data(is.read_string()?));
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        if !self.grid_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(1, &self.grid_id);
-        }
-        if !self.row_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(2, &self.row_id);
-        }
-        if !self.field_id.is_empty() {
-            my_size += ::protobuf::rt::string_size(3, &self.field_id);
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_data {
-            match v {
-                &CellMetaChangeset_oneof_one_of_data::data(ref v) => {
-                    my_size += ::protobuf::rt::string_size(4, &v);
-                },
-            };
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if !self.grid_id.is_empty() {
-            os.write_string(1, &self.grid_id)?;
-        }
-        if !self.row_id.is_empty() {
-            os.write_string(2, &self.row_id)?;
-        }
-        if !self.field_id.is_empty() {
-            os.write_string(3, &self.field_id)?;
-        }
-        if let ::std::option::Option::Some(ref v) = self.one_of_data {
-            match v {
-                &CellMetaChangeset_oneof_one_of_data::data(ref v) => {
-                    os.write_string(4, v)?;
-                },
-            };
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> CellMetaChangeset {
-        CellMetaChangeset::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "grid_id",
-                |m: &CellMetaChangeset| { &m.grid_id },
-                |m: &mut CellMetaChangeset| { &mut m.grid_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "row_id",
-                |m: &CellMetaChangeset| { &m.row_id },
-                |m: &mut CellMetaChangeset| { &mut m.row_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
-                "field_id",
-                |m: &CellMetaChangeset| { &m.field_id },
-                |m: &mut CellMetaChangeset| { &mut m.field_id },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
-                "data",
-                CellMetaChangeset::has_data,
-                CellMetaChangeset::get_data,
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<CellMetaChangeset>(
-                "CellMetaChangeset",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static CellMetaChangeset {
-        static instance: ::protobuf::rt::LazyV2<CellMetaChangeset> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(CellMetaChangeset::new)
-    }
-}
-
-impl ::protobuf::Clear for CellMetaChangeset {
-    fn clear(&mut self) {
-        self.grid_id.clear();
-        self.row_id.clear();
-        self.field_id.clear();
-        self.one_of_data = ::std::option::Option::None;
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for CellMetaChangeset {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for CellMetaChangeset {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(PartialEq,Clone,Default)]
-pub struct BuildGridContext {
-    // message fields
-    pub field_metas: ::protobuf::RepeatedField<FieldMeta>,
-    pub block_meta: ::protobuf::SingularPtrField<GridBlockMeta>,
-    pub block_meta_data: ::protobuf::SingularPtrField<GridBlockMetaData>,
-    // special fields
-    pub unknown_fields: ::protobuf::UnknownFields,
-    pub cached_size: ::protobuf::CachedSize,
-}
-
-impl<'a> ::std::default::Default for &'a BuildGridContext {
-    fn default() -> &'a BuildGridContext {
-        <BuildGridContext as ::protobuf::Message>::default_instance()
-    }
-}
-
-impl BuildGridContext {
-    pub fn new() -> BuildGridContext {
-        ::std::default::Default::default()
-    }
-
-    // repeated .FieldMeta field_metas = 1;
-
-
-    pub fn get_field_metas(&self) -> &[FieldMeta] {
-        &self.field_metas
-    }
-    pub fn clear_field_metas(&mut self) {
-        self.field_metas.clear();
-    }
-
-    // Param is passed by value, moved
-    pub fn set_field_metas(&mut self, v: ::protobuf::RepeatedField<FieldMeta>) {
-        self.field_metas = v;
-    }
-
-    // Mutable pointer to the field.
-    pub fn mut_field_metas(&mut self) -> &mut ::protobuf::RepeatedField<FieldMeta> {
-        &mut self.field_metas
-    }
-
-    // Take field
-    pub fn take_field_metas(&mut self) -> ::protobuf::RepeatedField<FieldMeta> {
-        ::std::mem::replace(&mut self.field_metas, ::protobuf::RepeatedField::new())
-    }
-
-    // .GridBlockMeta block_meta = 2;
-
-
-    pub fn get_block_meta(&self) -> &GridBlockMeta {
-        self.block_meta.as_ref().unwrap_or_else(|| <GridBlockMeta as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_block_meta(&mut self) {
-        self.block_meta.clear();
-    }
-
-    pub fn has_block_meta(&self) -> bool {
-        self.block_meta.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_block_meta(&mut self, v: GridBlockMeta) {
-        self.block_meta = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_block_meta(&mut self) -> &mut GridBlockMeta {
-        if self.block_meta.is_none() {
-            self.block_meta.set_default();
-        }
-        self.block_meta.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_block_meta(&mut self) -> GridBlockMeta {
-        self.block_meta.take().unwrap_or_else(|| GridBlockMeta::new())
-    }
-
-    // .GridBlockMetaData block_meta_data = 3;
-
-
-    pub fn get_block_meta_data(&self) -> &GridBlockMetaData {
-        self.block_meta_data.as_ref().unwrap_or_else(|| <GridBlockMetaData as ::protobuf::Message>::default_instance())
-    }
-    pub fn clear_block_meta_data(&mut self) {
-        self.block_meta_data.clear();
-    }
-
-    pub fn has_block_meta_data(&self) -> bool {
-        self.block_meta_data.is_some()
-    }
-
-    // Param is passed by value, moved
-    pub fn set_block_meta_data(&mut self, v: GridBlockMetaData) {
-        self.block_meta_data = ::protobuf::SingularPtrField::some(v);
-    }
-
-    // Mutable pointer to the field.
-    // If field is not initialized, it is initialized with default value first.
-    pub fn mut_block_meta_data(&mut self) -> &mut GridBlockMetaData {
-        if self.block_meta_data.is_none() {
-            self.block_meta_data.set_default();
-        }
-        self.block_meta_data.as_mut().unwrap()
-    }
-
-    // Take field
-    pub fn take_block_meta_data(&mut self) -> GridBlockMetaData {
-        self.block_meta_data.take().unwrap_or_else(|| GridBlockMetaData::new())
-    }
-}
-
-impl ::protobuf::Message for BuildGridContext {
-    fn is_initialized(&self) -> bool {
-        for v in &self.field_metas {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.block_meta {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        for v in &self.block_meta_data {
-            if !v.is_initialized() {
-                return false;
-            }
-        };
-        true
-    }
-
-    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        while !is.eof()? {
-            let (field_number, wire_type) = is.read_tag_unpack()?;
-            match field_number {
-                1 => {
-                    ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.field_metas)?;
-                },
-                2 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.block_meta)?;
-                },
-                3 => {
-                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.block_meta_data)?;
-                },
-                _ => {
-                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
-                },
-            };
-        }
-        ::std::result::Result::Ok(())
-    }
-
-    // Compute sizes of nested messages
-    #[allow(unused_variables)]
-    fn compute_size(&self) -> u32 {
-        let mut my_size = 0;
-        for value in &self.field_metas {
-            let len = value.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
-        };
-        if let Some(ref v) = self.block_meta.as_ref() {
-            let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
-        }
-        if let Some(ref v) = self.block_meta_data.as_ref() {
-            let len = v.compute_size();
-            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
-        }
-        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
-        self.cached_size.set(my_size);
-        my_size
-    }
-
-    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        for v in &self.field_metas {
-            os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        };
-        if let Some(ref v) = self.block_meta.as_ref() {
-            os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        }
-        if let Some(ref v) = self.block_meta_data.as_ref() {
-            os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?;
-            os.write_raw_varint32(v.get_cached_size())?;
-            v.write_to_with_cached_sizes(os)?;
-        }
-        os.write_unknown_fields(self.get_unknown_fields())?;
-        ::std::result::Result::Ok(())
-    }
-
-    fn get_cached_size(&self) -> u32 {
-        self.cached_size.get()
-    }
-
-    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
-        &self.unknown_fields
-    }
-
-    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
-        &mut self.unknown_fields
-    }
-
-    fn as_any(&self) -> &dyn (::std::any::Any) {
-        self as &dyn (::std::any::Any)
-    }
-    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
-        self as &mut dyn (::std::any::Any)
-    }
-    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
-        self
-    }
-
-    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
-        Self::descriptor_static()
-    }
-
-    fn new() -> BuildGridContext {
-        BuildGridContext::new()
-    }
-
-    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            let mut fields = ::std::vec::Vec::new();
-            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<FieldMeta>>(
-                "field_metas",
-                |m: &BuildGridContext| { &m.field_metas },
-                |m: &mut BuildGridContext| { &mut m.field_metas },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<GridBlockMeta>>(
-                "block_meta",
-                |m: &BuildGridContext| { &m.block_meta },
-                |m: &mut BuildGridContext| { &mut m.block_meta },
-            ));
-            fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<GridBlockMetaData>>(
-                "block_meta_data",
-                |m: &BuildGridContext| { &m.block_meta_data },
-                |m: &mut BuildGridContext| { &mut m.block_meta_data },
-            ));
-            ::protobuf::reflect::MessageDescriptor::new_pb_name::<BuildGridContext>(
-                "BuildGridContext",
-                fields,
-                file_descriptor_proto()
-            )
-        })
-    }
-
-    fn default_instance() -> &'static BuildGridContext {
-        static instance: ::protobuf::rt::LazyV2<BuildGridContext> = ::protobuf::rt::LazyV2::INIT;
-        instance.get(BuildGridContext::new)
-    }
-}
-
-impl ::protobuf::Clear for BuildGridContext {
-    fn clear(&mut self) {
-        self.field_metas.clear();
-        self.block_meta.clear();
-        self.block_meta_data.clear();
-        self.unknown_fields.clear();
-    }
-}
-
-impl ::std::fmt::Debug for BuildGridContext {
-    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
-        ::protobuf::text_format::fmt(self, f)
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for BuildGridContext {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Message(self)
-    }
-}
-
-#[derive(Clone,PartialEq,Eq,Debug,Hash)]
-pub enum FieldType {
-    RichText = 0,
-    Number = 1,
-    DateTime = 2,
-    SingleSelect = 3,
-    MultiSelect = 4,
-    Checkbox = 5,
-}
-
-impl ::protobuf::ProtobufEnum for FieldType {
-    fn value(&self) -> i32 {
-        *self as i32
-    }
-
-    fn from_i32(value: i32) -> ::std::option::Option<FieldType> {
-        match value {
-            0 => ::std::option::Option::Some(FieldType::RichText),
-            1 => ::std::option::Option::Some(FieldType::Number),
-            2 => ::std::option::Option::Some(FieldType::DateTime),
-            3 => ::std::option::Option::Some(FieldType::SingleSelect),
-            4 => ::std::option::Option::Some(FieldType::MultiSelect),
-            5 => ::std::option::Option::Some(FieldType::Checkbox),
-            _ => ::std::option::Option::None
-        }
-    }
-
-    fn values() -> &'static [Self] {
-        static values: &'static [FieldType] = &[
-            FieldType::RichText,
-            FieldType::Number,
-            FieldType::DateTime,
-            FieldType::SingleSelect,
-            FieldType::MultiSelect,
-            FieldType::Checkbox,
-        ];
-        values
-    }
-
-    fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
-        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
-        descriptor.get(|| {
-            ::protobuf::reflect::EnumDescriptor::new_pb_name::<FieldType>("FieldType", file_descriptor_proto())
-        })
-    }
-}
-
-impl ::std::marker::Copy for FieldType {
-}
-
-impl ::std::default::Default for FieldType {
-    fn default() -> Self {
-        FieldType::RichText
-    }
-}
-
-impl ::protobuf::reflect::ProtobufValue for FieldType {
-    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
-        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
-    }
-}
-
-static file_descriptor_proto_data: &'static [u8] = b"\
-    \n\nmeta.proto\"o\n\x08GridMeta\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\
-    \x06gridId\x12\"\n\x06fields\x18\x02\x20\x03(\x0b2\n.FieldMetaR\x06field\
-    s\x12&\n\x06blocks\x18\x03\x20\x03(\x0b2\x0e.GridBlockMetaR\x06blocks\"o\
-    \n\rGridBlockMeta\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\
-    \x12&\n\x0fstart_row_index\x18\x02\x20\x01(\x05R\rstartRowIndex\x12\x1b\
-    \n\trow_count\x18\x03\x20\x01(\x05R\x08rowCount\"L\n\x11GridBlockMetaDat\
-    a\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12\x1c\n\x04rows\
-    \x18\x02\x20\x03(\x0b2\x08.RowMetaR\x04rows\"\xbc\x02\n\tFieldMeta\x12\
-    \x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x12\n\x04name\x18\x02\x20\x01\
-    (\tR\x04name\x12\x12\n\x04desc\x18\x03\x20\x01(\tR\x04desc\x12)\n\nfield\
-    _type\x18\x04\x20\x01(\x0e2\n.FieldTypeR\tfieldType\x12\x16\n\x06frozen\
-    \x18\x05\x20\x01(\x08R\x06frozen\x12\x1e\n\nvisibility\x18\x06\x20\x01(\
-    \x08R\nvisibility\x12\x14\n\x05width\x18\x07\x20\x01(\x05R\x05width\x12>\
-    \n\x0ctype_options\x18\x08\x20\x03(\x0b2\x1b.FieldMeta.TypeOptionsEntryR\
-    \x0btypeOptions\x1a>\n\x10TypeOptionsEntry\x12\x10\n\x03key\x18\x01\x20\
-    \x01(\tR\x03key\x12\x14\n\x05value\x18\x02\x20\x01(\tR\x05value:\x028\
-    \x01\"\xa8\x03\n\x15FieldChangesetPayload\x12\x19\n\x08field_id\x18\x01\
-    \x20\x01(\tR\x07fieldId\x12\x17\n\x07grid_id\x18\x02\x20\x01(\tR\x06grid\
-    Id\x12\x14\n\x04name\x18\x03\x20\x01(\tH\0R\x04name\x12\x14\n\x04desc\
-    \x18\x04\x20\x01(\tH\x01R\x04desc\x12+\n\nfield_type\x18\x05\x20\x01(\
-    \x0e2\n.FieldTypeH\x02R\tfieldType\x12\x18\n\x06frozen\x18\x06\x20\x01(\
-    \x08H\x03R\x06frozen\x12\x20\n\nvisibility\x18\x07\x20\x01(\x08H\x04R\nv\
-    isibility\x12\x16\n\x05width\x18\x08\x20\x01(\x05H\x05R\x05width\x12*\n\
-    \x10type_option_data\x18\t\x20\x01(\x0cH\x06R\x0etypeOptionDataB\r\n\x0b\
-    one_of_nameB\r\n\x0bone_of_descB\x13\n\x11one_of_field_typeB\x0f\n\rone_\
-    of_frozenB\x13\n\x11one_of_visibilityB\x0e\n\x0cone_of_widthB\x19\n\x17o\
-    ne_of_type_option_data\"8\n\x07AnyData\x12\x17\n\x07type_id\x18\x01\x20\
-    \x01(\tR\x06typeId\x12\x14\n\x05value\x18\x02\x20\x01(\x0cR\x05value\"\
-    \xdc\x01\n\x07RowMeta\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x19\
-    \n\x08block_id\x18\x02\x20\x01(\tR\x07blockId\x12)\n\x05cells\x18\x03\
-    \x20\x03(\x0b2\x13.RowMeta.CellsEntryR\x05cells\x12\x16\n\x06height\x18\
-    \x04\x20\x01(\x05R\x06height\x12\x1e\n\nvisibility\x18\x05\x20\x01(\x08R\
-    \nvisibility\x1aC\n\nCellsEntry\x12\x10\n\x03key\x18\x01\x20\x01(\tR\x03\
-    key\x12\x1f\n\x05value\x18\x02\x20\x01(\x0b2\t.CellMetaR\x05value:\x028\
-    \x01\"\xa7\x02\n\x10RowMetaChangeset\x12\x15\n\x06row_id\x18\x01\x20\x01\
-    (\tR\x05rowId\x12\x18\n\x06height\x18\x02\x20\x01(\x05H\0R\x06height\x12\
-    \x20\n\nvisibility\x18\x03\x20\x01(\x08H\x01R\nvisibility\x12M\n\x10cell\
-    _by_field_id\x18\x04\x20\x03(\x0b2$.RowMetaChangeset.CellByFieldIdEntryR\
-    \rcellByFieldId\x1aK\n\x12CellByFieldIdEntry\x12\x10\n\x03key\x18\x01\
-    \x20\x01(\tR\x03key\x12\x1f\n\x05value\x18\x02\x20\x01(\x0b2\t.CellMetaR\
-    \x05value:\x028\x01B\x0f\n\rone_of_heightB\x13\n\x11one_of_visibility\"\
-    \x1e\n\x08CellMeta\x12\x12\n\x04data\x18\x01\x20\x01(\tR\x04data\"\x83\
-    \x01\n\x11CellMetaChangeset\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06\
-    gridId\x12\x15\n\x06row_id\x18\x02\x20\x01(\tR\x05rowId\x12\x19\n\x08fie\
-    ld_id\x18\x03\x20\x01(\tR\x07fieldId\x12\x14\n\x04data\x18\x04\x20\x01(\
-    \tH\0R\x04dataB\r\n\x0bone_of_data\"\xaa\x01\n\x10BuildGridContext\x12+\
-    \n\x0bfield_metas\x18\x01\x20\x03(\x0b2\n.FieldMetaR\nfieldMetas\x12-\n\
-    \nblock_meta\x18\x02\x20\x01(\x0b2\x0e.GridBlockMetaR\tblockMeta\x12:\n\
-    \x0fblock_meta_data\x18\x03\x20\x01(\x0b2\x12.GridBlockMetaDataR\rblockM\
-    etaData*d\n\tFieldType\x12\x0c\n\x08RichText\x10\0\x12\n\n\x06Number\x10\
-    \x01\x12\x0c\n\x08DateTime\x10\x02\x12\x10\n\x0cSingleSelect\x10\x03\x12\
-    \x0f\n\x0bMultiSelect\x10\x04\x12\x0c\n\x08Checkbox\x10\x05b\x06proto3\
-";
-
-static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
-
-fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
-    ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
-}
-
-pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
-    file_descriptor_proto_lazy.get(|| {
-        parse_descriptor_proto()
-    })
-}

+ 0 - 3
shared-lib/flowy-grid-data-model/src/protobuf/model/mod.rs

@@ -3,6 +3,3 @@
 
 mod grid;
 pub use grid::*;
-
-mod meta;
-pub use meta::*;

+ 25 - 1
shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto

@@ -1,5 +1,4 @@
 syntax = "proto3";
-import "meta.proto";
 
 message Grid {
     string id = 1;
@@ -113,3 +112,28 @@ message QueryGridBlocksPayload {
     string grid_id = 1;
     repeated GridBlockOrder block_orders = 2;
 }
+message FieldChangesetPayload {
+    string field_id = 1;
+    string grid_id = 2;
+    oneof one_of_name { string name = 3; };
+    oneof one_of_desc { string desc = 4; };
+    oneof one_of_field_type { FieldType field_type = 5; };
+    oneof one_of_frozen { bool frozen = 6; };
+    oneof one_of_visibility { bool visibility = 7; };
+    oneof one_of_width { int32 width = 8; };
+    oneof one_of_type_option_data { bytes type_option_data = 9; };
+}
+message CellChangeset {
+    string grid_id = 1;
+    string row_id = 2;
+    string field_id = 3;
+    oneof one_of_data { string data = 4; };
+}
+enum FieldType {
+    RichText = 0;
+    Number = 1;
+    DateTime = 2;
+    SingleSelect = 3;
+    MultiSelect = 4;
+    Checkbox = 5;
+}

+ 0 - 76
shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto

@@ -1,76 +0,0 @@
-syntax = "proto3";
-
-message GridMeta {
-    string grid_id = 1;
-    repeated FieldMeta fields = 2;
-    repeated GridBlockMeta blocks = 3;
-}
-message GridBlockMeta {
-    string block_id = 1;
-    int32 start_row_index = 2;
-    int32 row_count = 3;
-}
-message GridBlockMetaData {
-    string block_id = 1;
-    repeated RowMeta rows = 2;
-}
-message FieldMeta {
-    string id = 1;
-    string name = 2;
-    string desc = 3;
-    FieldType field_type = 4;
-    bool frozen = 5;
-    bool visibility = 6;
-    int32 width = 7;
-    map<string, string> type_options = 8;
-}
-message FieldChangesetPayload {
-    string field_id = 1;
-    string grid_id = 2;
-    oneof one_of_name { string name = 3; };
-    oneof one_of_desc { string desc = 4; };
-    oneof one_of_field_type { FieldType field_type = 5; };
-    oneof one_of_frozen { bool frozen = 6; };
-    oneof one_of_visibility { bool visibility = 7; };
-    oneof one_of_width { int32 width = 8; };
-    oneof one_of_type_option_data { bytes type_option_data = 9; };
-}
-message AnyData {
-    string type_id = 1;
-    bytes value = 2;
-}
-message RowMeta {
-    string id = 1;
-    string block_id = 2;
-    map<string, CellMeta> cells = 3;
-    int32 height = 4;
-    bool visibility = 5;
-}
-message RowMetaChangeset {
-    string row_id = 1;
-    oneof one_of_height { int32 height = 2; };
-    oneof one_of_visibility { bool visibility = 3; };
-    map<string, CellMeta> cell_by_field_id = 4;
-}
-message CellMeta {
-    string data = 1;
-}
-message CellMetaChangeset {
-    string grid_id = 1;
-    string row_id = 2;
-    string field_id = 3;
-    oneof one_of_data { string data = 4; };
-}
-message BuildGridContext {
-    repeated FieldMeta field_metas = 1;
-    GridBlockMeta block_meta = 2;
-    GridBlockMetaData block_meta_data = 3;
-}
-enum FieldType {
-    RichText = 0;
-    Number = 1;
-    DateTime = 2;
-    SingleSelect = 3;
-    MultiSelect = 4;
-    Checkbox = 5;
-}

+ 10 - 6
shared-lib/flowy-sync/src/client_grid/grid_block_meta_pad.rs

@@ -1,8 +1,7 @@
 use crate::entities::revision::{md5, RepeatedRevision, Revision};
 use crate::errors::{CollaborateError, CollaborateResult};
 use crate::util::{cal_diff, make_delta_from_revisions};
-use flowy_grid_data_model::entities::{CellMeta, GridBlockMetaData, RowMeta, RowMetaChangeset};
-use lib_infra::uuid;
+use flowy_grid_data_model::entities::{gen_block_id, CellMeta, GridBlockMetaData, RowMeta, RowMetaChangeset};
 use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder};
 use serde::{Deserialize, Serialize};
 use std::borrow::Cow;
@@ -163,7 +162,11 @@ impl GridBlockMetaPad {
                 match cal_diff::<PlainTextAttributes>(old, new) {
                     None => Ok(None),
                     Some(delta) => {
-                        tracing::debug!("[GridBlockMeta] Composing change {}", delta.to_delta_str());
+                        tracing::debug!("[GridBlockMeta] Composing delta {}", delta.to_delta_str());
+                        tracing::debug!(
+                            "[GridBlockMeta] current delta: {}",
+                            self.delta.to_str().unwrap_or_else(|_| "".to_string())
+                        );
                         self.delta = self.delta.compose(&delta)?;
                         Ok(Some(GridBlockMetaChange { delta, md5: self.md5() }))
                     }
@@ -221,7 +224,7 @@ pub fn make_block_meta_revisions(user_id: &str, grid_block_meta_data: &GridBlock
 impl std::default::Default for GridBlockMetaPad {
     fn default() -> Self {
         let block_meta_data = GridBlockMetaData {
-            block_id: uuid(),
+            block_id: gen_block_id(),
             rows: vec![],
         };
 
@@ -251,7 +254,8 @@ mod tests {
             visibility: false,
         };
 
-        let change = pad.add_row_meta(row, None).unwrap().unwrap();
+        let change = pad.add_row_meta(row.clone(), None).unwrap().unwrap();
+        assert_eq!(pad.rows.first().unwrap().as_ref(), &row);
         assert_eq!(
             change.delta.to_delta_str(),
             r#"[{"retain":24},{"insert":"{\"id\":\"1\",\"block_id\":\"1\",\"cells\":{},\"height\":0,\"visibility\":false}"},{"retain":2}]"#
@@ -380,7 +384,7 @@ mod tests {
 
         assert_eq!(
             pad.to_json().unwrap(),
-            r#"{"block_id":"1","rows":[{"id":"1","block_id":"1","cells":{},"height":100,"visibility":true}]}"#
+            r#"{"block_id":"1","rows":[{"id":"1","block_id":"1","cells":[],"height":100,"visibility":true}]}"#
         );
     }
 

+ 4 - 5
shared-lib/flowy-sync/src/client_grid/grid_meta_pad.rs

@@ -3,10 +3,9 @@ use crate::errors::{internal_error, CollaborateError, CollaborateResult};
 use crate::util::{cal_diff, make_delta_from_revisions};
 use bytes::Bytes;
 use flowy_grid_data_model::entities::{
-    FieldChangesetParams, FieldMeta, FieldOrder, FieldType, GridBlockMeta, GridBlockMetaChangeset, GridMeta,
+    gen_field_id, gen_grid_id, FieldChangesetParams, FieldMeta, FieldOrder, FieldType, GridBlockMeta,
+    GridBlockMetaChangeset, GridMeta,
 };
-
-use lib_infra::uuid;
 use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder};
 use std::collections::HashMap;
 
@@ -89,7 +88,7 @@ impl GridMetaPad {
                 None => Ok(None),
                 Some(index) => {
                     let mut duplicate_field_meta = grid_meta.fields[index].clone();
-                    duplicate_field_meta.id = uuid();
+                    duplicate_field_meta.id = gen_field_id();
                     duplicate_field_meta.name = format!("{} (copy)", duplicate_field_meta.name);
                     grid_meta.fields.insert(index + 1, duplicate_field_meta);
                     Ok(Some(()))
@@ -374,7 +373,7 @@ pub fn make_grid_revisions(user_id: &str, grid_meta: &GridMeta) -> RepeatedRevis
 impl std::default::Default for GridMetaPad {
     fn default() -> Self {
         let grid = GridMeta {
-            grid_id: uuid(),
+            grid_id: gen_grid_id(),
             fields: vec![],
             blocks: vec![],
         };

+ 1 - 1
shared-lib/flowy-sync/src/server_document/document_manager.rs

@@ -163,7 +163,6 @@ impl ServerDocumentManager {
         }
     }
 
-    #[tracing::instrument(level = "debug", skip(self, repeated_revision), err)]
     async fn create_document(
         &self,
         doc_id: &str,
@@ -182,6 +181,7 @@ impl ServerDocumentManager {
         }
     }
 
+    #[tracing::instrument(level = "debug", skip(self, doc), err)]
     async fn create_document_handler(&self, doc: TextBlockInfo) -> Result<Arc<OpenDocumentHandler>, CollaborateError> {
         let persistence = self.persistence.clone();
         let handle = spawn_blocking(|| OpenDocumentHandler::new(doc, persistence))

+ 0 - 1
shared-lib/lib-infra/Cargo.toml

@@ -6,7 +6,6 @@ edition = "2018"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-uuid = { version = "0.8", features = ["serde", "v4"] }
 log = "0.4.14"
 chrono = "0.4.19"
 bytes = { version = "1.0" }

+ 0 - 5
shared-lib/lib-infra/src/lib.rs

@@ -2,11 +2,6 @@ pub mod code_gen;
 pub mod future;
 pub mod retry;
 
-#[allow(dead_code)]
-pub fn uuid() -> String {
-    uuid::Uuid::new_v4().to_string()
-}
-
 #[allow(dead_code)]
 pub fn timestamp() -> i64 {
     chrono::Utc::now().timestamp()