diff --git a/frontend/app_flowy/assets/images/editor/Icons 16/Yen.svg b/frontend/app_flowy/assets/images/editor/Icons 16/Yen.svg deleted file mode 100644 index b7cf1d361d..0000000000 --- a/frontend/app_flowy/assets/images/editor/Icons 16/Yen.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/app_flowy/assets/images/grid/checkmark.svg b/frontend/app_flowy/assets/images/grid/checkmark.svg new file mode 100644 index 0000000000..f9c848f713 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/checkmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/app_flowy/assets/images/grid/delete.svg b/frontend/app_flowy/assets/images/grid/delete.svg new file mode 100644 index 0000000000..fcfbf2f6dd --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/delete.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/app_flowy/assets/images/grid/details.svg b/frontend/app_flowy/assets/images/grid/details.svg new file mode 100644 index 0000000000..e4c9f58f27 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/details.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/images/grid/duplicate.svg b/frontend/app_flowy/assets/images/grid/duplicate.svg new file mode 100644 index 0000000000..f11048fd2f --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/duplicate.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/images/grid/field/checkbox.svg b/frontend/app_flowy/assets/images/grid/field/checkbox.svg new file mode 100644 index 0000000000..37f52c47ed --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/checkbox.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/images/grid/field/checklist.svg b/frontend/app_flowy/assets/images/grid/field/checklist.svg new file mode 100644 index 0000000000..3a88d236a1 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/checklist.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/images/grid/field/date.svg b/frontend/app_flowy/assets/images/grid/field/date.svg new file mode 100644 index 0000000000..78243f1e75 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/date.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/app_flowy/assets/images/grid/field/euro.svg b/frontend/app_flowy/assets/images/grid/field/euro.svg new file mode 100644 index 0000000000..95f511f687 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/euro.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/app_flowy/assets/images/grid/field/multi_select.svg b/frontend/app_flowy/assets/images/grid/field/multi_select.svg new file mode 100644 index 0000000000..97a2e9c434 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/multi_select.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/frontend/app_flowy/assets/images/grid/field/number.svg b/frontend/app_flowy/assets/images/grid/field/number.svg new file mode 100644 index 0000000000..9d8b98d10d --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/number.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/app_flowy/assets/images/grid/field/numbers.svg b/frontend/app_flowy/assets/images/grid/field/numbers.svg new file mode 100644 index 0000000000..9d8b98d10d --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/numbers.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/app_flowy/assets/images/grid/field/single_select.svg b/frontend/app_flowy/assets/images/grid/field/single_select.svg new file mode 100644 index 0000000000..8ccbc9a2e3 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/single_select.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/images/grid/field/text.svg b/frontend/app_flowy/assets/images/grid/field/text.svg new file mode 100644 index 0000000000..7befa5080f --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/text.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/images/grid/field/us_dollar.svg b/frontend/app_flowy/assets/images/grid/field/us_dollar.svg new file mode 100644 index 0000000000..a8485cd6a1 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/us_dollar.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/app_flowy/assets/images/grid/field/yen.svg b/frontend/app_flowy/assets/images/grid/field/yen.svg new file mode 100644 index 0000000000..8e9bf47c99 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/field/yen.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/app_flowy/assets/images/grid/hide.svg b/frontend/app_flowy/assets/images/grid/hide.svg new file mode 100644 index 0000000000..dfb6dbb90c --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/hide.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/images/grid/left.svg b/frontend/app_flowy/assets/images/grid/left.svg new file mode 100644 index 0000000000..0f771a3858 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/left.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/app_flowy/assets/images/grid/more.svg b/frontend/app_flowy/assets/images/grid/more.svg new file mode 100644 index 0000000000..b191e64a10 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/more.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/app_flowy/assets/images/grid/right.svg b/frontend/app_flowy/assets/images/grid/right.svg new file mode 100644 index 0000000000..7d738f4e69 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/right.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/app_flowy/assets/images/editor/Icons 16/Sort/Ascending.svg b/frontend/app_flowy/assets/images/grid/setting/ascending.svg similarity index 100% rename from frontend/app_flowy/assets/images/editor/Icons 16/Sort/Ascending.svg rename to frontend/app_flowy/assets/images/grid/setting/ascending.svg diff --git a/frontend/app_flowy/assets/images/editor/Icons 16/Sort/Descending.svg b/frontend/app_flowy/assets/images/grid/setting/descending.svg similarity index 100% rename from frontend/app_flowy/assets/images/editor/Icons 16/Sort/Descending.svg rename to frontend/app_flowy/assets/images/grid/setting/descending.svg diff --git a/frontend/app_flowy/assets/images/editor/Icons 16/Filter.svg b/frontend/app_flowy/assets/images/grid/setting/filter.svg similarity index 100% rename from frontend/app_flowy/assets/images/editor/Icons 16/Filter.svg rename to frontend/app_flowy/assets/images/grid/setting/filter.svg diff --git a/frontend/app_flowy/assets/images/editor/Icons 16/Properties.svg b/frontend/app_flowy/assets/images/grid/setting/properties.svg similarity index 100% rename from frontend/app_flowy/assets/images/editor/Icons 16/Properties.svg rename to frontend/app_flowy/assets/images/grid/setting/properties.svg diff --git a/frontend/app_flowy/assets/images/grid/setting/setting.svg b/frontend/app_flowy/assets/images/grid/setting/setting.svg new file mode 100644 index 0000000000..3d632703ab --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/setting/setting.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/images/grid/setting/sort.svg b/frontend/app_flowy/assets/images/grid/setting/sort.svg new file mode 100644 index 0000000000..06e17d62a9 --- /dev/null +++ b/frontend/app_flowy/assets/images/grid/setting/sort.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app_flowy/assets/translations/en.json b/frontend/app_flowy/assets/translations/en.json index 7717e71229..7e20a947dc 100644 --- a/frontend/app_flowy/assets/translations/en.json +++ b/frontend/app_flowy/assets/translations/en.json @@ -141,5 +141,53 @@ "lightLabel": "Light Mode", "darkLabel": "Dark Mode" } + }, + "grid": { + "settings": { + "filter": "Filter", + "sortBy": "Sort by", + "Properties": "Properties" + }, + "field": { + "hide": "Hide", + "insertLeft": "Insert Left", + "insertRight": "Insert Right", + "duplicate": "Duplicate", + "delete": "Delete", + "textFieldName": "Text", + "checkboxFieldName": "Checkbox", + "dateFieldName": "Date", + "numberFieldName": "Numbers", + "singleSelectFieldName": "Select", + "multiSelectFieldName": "Multiselect", + "numberFormat": " Number format", + "dateFormat": " Date format", + "dateFormatFriendly": "Month Day,Year", + "dateFormatISO": "Year-Month-Day", + "dateFormatLocal": "Month/Month/Day", + "dateFormatUS": "Month/Month/Day", + "timeFormat": " Time format", + "timeFormatTwelveHour": "12 hour", + "timeFormatTwentyFourHour": "24 hour", + "addSelectOption": "Add an option", + "optionTitle": "Options", + "addOption": "Add option", + "editProperty": "Edit property" + }, + "selectOption": { + "purpleColor": "Purple", + "pinkColor": "Pink", + "lightPinkColor": "Light Pink", + "orangeColor": "Orange", + "yellowColor": "Yellow", + "limeColor": "Lime", + "greenColor": "Green", + "aquaColor": "Aqua", + "blueColor": "Blue", + "deleteTag": "Delete tag", + "colorPannelTitle": "Colors", + "pannelTitle": "Select an option or create one", + "searchOption": "Search for an option" + } } } diff --git a/frontend/app_flowy/lib/core/notification_helper.dart b/frontend/app_flowy/lib/core/notification_helper.dart index d815bf92bb..650abc544c 100644 --- a/frontend/app_flowy/lib/core/notification_helper.dart +++ b/frontend/app_flowy/lib/core/notification_helper.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:typed_data'; import 'package:flowy_sdk/protobuf/dart-notify/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart'; @@ -5,6 +6,7 @@ import 'package:dartz/dartz.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-folder/dart_notification.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart'; +import 'package:flowy_sdk/rust_stream.dart'; // User typedef UserNotificationCallback = void Function(UserNotification, Either); @@ -45,6 +47,23 @@ class GridNotificationParser extends NotificationParser result); + +class GridNotificationListener { + StreamSubscription? _subscription; + GridNotificationParser? _parser; + + GridNotificationListener({required String objectId, required GridNotificationHandler handler}) + : _parser = GridNotificationParser(id: objectId, callback: handler) { + _subscription = RustStreamReceiver.listen((observable) => _parser?.parse(observable)); + } + + Future stop() async { + _parser = null; + await _subscription?.cancel(); + } +} + class NotificationParser { String? id; void Function(T, Either) callback; diff --git a/frontend/app_flowy/lib/plugin/plugin.dart b/frontend/app_flowy/lib/plugin/plugin.dart index 607ebaab53..8d30b122ad 100644 --- a/frontend/app_flowy/lib/plugin/plugin.dart +++ b/frontend/app_flowy/lib/plugin/plugin.dart @@ -61,12 +61,6 @@ abstract class PluginConfig { } abstract class PluginDisplay with NavigationItem { - @override - Widget get leftBarItem; - - @override - Widget? get rightBarItem; - List get navigationItems; PublishNotifier? get notifier => null; diff --git a/frontend/app_flowy/lib/startup/deps_resolver.dart b/frontend/app_flowy/lib/startup/deps_resolver.dart new file mode 100644 index 0000000000..a0af57f580 --- /dev/null +++ b/frontend/app_flowy/lib/startup/deps_resolver.dart @@ -0,0 +1,238 @@ +import 'package:app_flowy/core/network_monitor.dart'; +import 'package:app_flowy/user/application/user_listener.dart'; +import 'package:app_flowy/user/application/user_service.dart'; +import 'package:app_flowy/workspace/application/app/prelude.dart'; +import 'package:app_flowy/workspace/application/doc/prelude.dart'; +import 'package:app_flowy/workspace/application/grid/field/type_option/multi_select_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; +import 'package:app_flowy/workspace/application/grid/row/row_listener.dart'; +import 'package:app_flowy/workspace/application/trash/prelude.dart'; +import 'package:app_flowy/workspace/application/workspace/prelude.dart'; +import 'package:app_flowy/workspace/application/edit_pannel/edit_pannel_bloc.dart'; +import 'package:app_flowy/workspace/application/home/home_bloc.dart'; +import 'package:app_flowy/workspace/application/view/prelude.dart'; +import 'package:app_flowy/workspace/application/home/prelude.dart'; +import 'package:app_flowy/workspace/application/menu/prelude.dart'; +import 'package:app_flowy/user/application/prelude.dart'; +import 'package:app_flowy/user/presentation/router.dart'; +import 'package:app_flowy/workspace/presentation/home/home_stack.dart'; +import 'package:flowy_sdk/protobuf/flowy-folder-data-model/app.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:flowy_sdk/protobuf/flowy-grid/date_type_option.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/number_type_option.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-user-data-model/user_profile.pb.dart'; +import 'package:get_it/get_it.dart'; + +class DependencyResolver { + static Future resolve(GetIt getIt) async { + _resolveUserDeps(getIt); + + _resolveHomeDeps(getIt); + + _resolveFolderDeps(getIt); + + _resolveDocDeps(getIt); + + _resolveGridDeps(getIt); + } +} + +void _resolveUserDeps(GetIt getIt) { + getIt.registerFactory(() => AuthService()); + getIt.registerFactory(() => AuthRouter()); + + getIt.registerFactory(() => SignInBloc(getIt())); + getIt.registerFactory(() => SignUpBloc(getIt())); + + getIt.registerFactory(() => SplashRoute()); + getIt.registerFactory(() => HomeBloc()); + getIt.registerFactory(() => EditPannelBloc()); + getIt.registerFactory(() => SplashBloc()); + getIt.registerLazySingleton(() => NetworkListener()); +} + +void _resolveHomeDeps(GetIt getIt) { + getIt.registerFactoryParam( + (user, _) => UserListener(user: user), + ); + + getIt.registerFactoryParam( + (user, _) => HomeListenBloc(getIt(param1: user)), + ); + + // + getIt.registerLazySingleton(() => HomeStackManager()); + + getIt.registerFactoryParam( + (user, _) => WelcomeBloc( + userService: UserService(), + userListener: getIt(param1: user), + ), + ); + + // share + getIt.registerLazySingleton(() => ShareService()); + getIt.registerFactoryParam( + (view, _) => DocShareBloc(view: view, service: getIt())); +} + +void _resolveFolderDeps(GetIt getIt) { + //workspace + getIt.registerFactoryParam((user, workspaceId) => + WorkspaceListener(service: WorkspaceListenerService(user: user, workspaceId: workspaceId))); + + // View + getIt.registerFactoryParam( + (view, _) => ViewListener(view: view), + ); + + getIt.registerFactoryParam( + (view, _) => ViewBloc( + view: view, + service: ViewService(), + listener: getIt(param1: view), + ), + ); + + //Menu + getIt.registerFactoryParam( + (user, workspaceId) => MenuBloc( + workspaceId: workspaceId, + service: WorkspaceService(), + listener: getIt(param1: user, param2: workspaceId), + ), + ); + + getIt.registerFactoryParam( + (user, _) => MenuUserBloc( + user, + UserService(), + getIt(param1: user), + ), + ); + + // App + getIt.registerFactoryParam( + (app, _) => AppBloc( + app: app, + service: AppService(), + listener: AppListener(appId: app.id), + ), + ); + + // trash + getIt.registerLazySingleton(() => TrashService()); + getIt.registerLazySingleton(() => TrashListener()); + getIt.registerFactory( + () => TrashBloc( + service: getIt(), + listener: getIt(), + ), + ); +} + +void _resolveDocDeps(GetIt getIt) { +// Doc + getIt.registerFactoryParam( + (view, _) => DocumentBloc( + view: view, + service: DocumentService(), + listener: getIt(param1: view), + trashService: getIt(), + ), + ); +} + +void _resolveGridDeps(GetIt getIt) { + // Grid + getIt.registerFactoryParam( + (view, _) => GridBloc(view: view, service: GridService()), + ); + + getIt.registerFactoryParam( + (data, _) => RowBloc( + rowData: data, + rowlistener: RowListener(rowId: data.rowId), + ), + ); + + getIt.registerFactoryParam>( + (gridId, fields) => GridHeaderBloc( + data: GridHeaderData(gridId: gridId, fields: fields), + service: FieldService(gridId: gridId), + ), + ); + + getIt.registerFactoryParam( + (data, _) => FieldActionSheetBloc( + field: data.field, + service: FieldService(gridId: data.gridId), + ), + ); + + getIt.registerFactoryParam( + (gridId, fieldLoader) => FieldEditorBloc( + service: FieldService(gridId: gridId), + fieldLoader: fieldLoader, + ), + ); + + getIt.registerFactoryParam( + (cellData, _) => TextCellBloc( + service: CellService(), + cellData: cellData, + ), + ); + + getIt.registerFactoryParam( + (cellData, _) => SelectionCellBloc( + cellData: cellData, + ), + ); + + getIt.registerFactoryParam( + (cellData, _) => NumberCellBloc( + cellData: cellData, + ), + ); + + getIt.registerFactoryParam( + (cellData, _) => DateCellBloc( + service: CellService(), + cellData: cellData, + ), + ); + + getIt.registerFactoryParam( + (cellData, _) => CheckboxCellBloc( + service: CellService(), + cellData: cellData, + ), + ); + + getIt.registerFactoryParam( + (context, _) => FieldSwitcherBloc(context), + ); + + getIt.registerFactoryParam( + (typeOption, fieldId) => SingleSelectTypeOptionBloc(typeOption, fieldId), + ); + + getIt.registerFactoryParam( + (typeOption, fieldId) => MultiSelectTypeOptionBloc(typeOption, fieldId), + ); + + getIt.registerFactoryParam( + (typeOption, _) => DateTypeOptionBloc(typeOption: typeOption), + ); + + getIt.registerFactoryParam( + (typeOption, _) => NumberTypeOptionBloc(typeOption: typeOption), + ); + + getIt.registerFactoryParam>( + (gridId, fields) => GridPropertyBloc(gridId: gridId, fields: fields), + ); +} diff --git a/frontend/app_flowy/lib/startup/home_deps_resolver.dart b/frontend/app_flowy/lib/startup/home_deps_resolver.dart deleted file mode 100644 index 2dcf6ca077..0000000000 --- a/frontend/app_flowy/lib/startup/home_deps_resolver.dart +++ /dev/null @@ -1,156 +0,0 @@ -import 'package:app_flowy/user/application/user_listener.dart'; -import 'package:app_flowy/user/application/user_service.dart'; -import 'package:app_flowy/workspace/application/app/prelude.dart'; -import 'package:app_flowy/workspace/application/doc/prelude.dart'; -import 'package:app_flowy/workspace/application/grid/prelude.dart'; -import 'package:app_flowy/workspace/application/grid/row_listener.dart'; -import 'package:app_flowy/workspace/application/trash/prelude.dart'; -import 'package:app_flowy/workspace/application/workspace/prelude.dart'; -import 'package:app_flowy/workspace/application/view/prelude.dart'; -import 'package:app_flowy/workspace/application/home/prelude.dart'; -import 'package:app_flowy/workspace/application/menu/prelude.dart'; - -import 'package:app_flowy/workspace/presentation/home/home_stack.dart'; -import 'package:flowy_sdk/protobuf/flowy-folder-data-model/app.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:flowy_sdk/protobuf/flowy-user-data-model/user_profile.pb.dart'; -import 'package:get_it/get_it.dart'; - -class HomeDepsResolver { - static Future resolve(GetIt getIt) async { - getIt.registerFactoryParam( - (user, _) => UserListener(user: user), - ); - - getIt.registerFactoryParam( - (user, _) => HomeListenBloc(getIt(param1: user)), - ); - - // - getIt.registerLazySingleton(() => HomeStackManager()); - getIt.registerFactoryParam( - (user, _) => WelcomeBloc( - userService: UserService(), - userListener: getIt(param1: user), - ), - ); - - //workspace - getIt.registerFactoryParam((user, workspaceId) => - WorkspaceListener(service: WorkspaceListenerService(user: user, workspaceId: workspaceId))); - - // View - getIt.registerFactoryParam( - (view, _) => ViewListener(view: view), - ); - - getIt.registerFactoryParam( - (view, _) => ViewBloc( - view: view, - service: ViewService(), - listener: getIt(param1: view), - ), - ); - - //Menu Bloc - getIt.registerFactoryParam( - (user, workspaceId) => MenuBloc( - workspaceId: workspaceId, - service: WorkspaceService(), - listener: getIt(param1: user, param2: workspaceId), - ), - ); - - getIt.registerFactoryParam( - (user, _) => MenuUserBloc( - user, - UserService(), - getIt(param1: user), - ), - ); - - // App - getIt.registerFactoryParam( - (app, _) => AppBloc( - app: app, - service: AppService(), - listener: AppListener(appId: app.id), - ), - ); - - // Doc - getIt.registerFactoryParam( - (view, _) => DocumentBloc( - view: view, - service: DocumentService(), - listener: getIt(param1: view), - trashService: getIt(), - ), - ); - - // Grid - getIt.registerFactoryParam( - (view, _) => GridBloc(view: view, service: GridService()), - ); - - getIt.registerFactoryParam( - (data, _) => RowBloc( - rowService: RowService(data), - listener: RowListener(rowId: data.rowId), - ), - ); - - getIt.registerFactoryParam, void>( - (data, _) => ColumnBloc( - data: GridColumnData(fields: data), - service: ColumnService(), - ), - ); - - getIt.registerFactoryParam( - (context, _) => TextCellBloc( - service: CellService(context), - ), - ); - - getIt.registerFactoryParam( - (context, _) => SelectionCellBloc( - service: CellService(context), - ), - ); - - getIt.registerFactoryParam( - (context, _) => NumberCellBloc( - service: CellService(context), - ), - ); - - getIt.registerFactoryParam( - (context, _) => DateCellBloc( - service: CellService(context), - ), - ); - - getIt.registerFactoryParam( - (context, _) => CheckboxCellBloc( - service: CellService(context), - ), - ); - - // trash - getIt.registerLazySingleton(() => TrashService()); - getIt.registerLazySingleton(() => TrashListener()); - getIt.registerFactory( - () => TrashBloc( - service: getIt(), - listener: getIt(), - ), - ); - - // share - getIt.registerLazySingleton(() => ShareService()); - getIt.registerFactoryParam( - (view, _) => DocShareBloc(view: view, service: getIt())); - } -} diff --git a/frontend/app_flowy/lib/startup/startup.dart b/frontend/app_flowy/lib/startup/startup.dart index 0335879f5a..38243afa56 100644 --- a/frontend/app_flowy/lib/startup/startup.dart +++ b/frontend/app_flowy/lib/startup/startup.dart @@ -2,8 +2,7 @@ import 'dart:io'; import 'package:app_flowy/plugin/plugin.dart'; import 'package:app_flowy/startup/tasks/prelude.dart'; -import 'package:app_flowy/startup/home_deps_resolver.dart'; -import 'package:app_flowy/startup/user_deps_resolver.dart'; +import 'package:app_flowy/startup/deps_resolver.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; @@ -62,8 +61,7 @@ Future initGetIt( getIt.registerLazySingleton(() => AppLauncher(env, getIt)); getIt.registerSingleton(PluginSandbox()); - await UserDepsResolver.resolve(getIt); - await HomeDepsResolver.resolve(getIt); + await DependencyResolver.resolve(getIt); } class LaunchContext { diff --git a/frontend/app_flowy/lib/startup/tasks/app_widget.dart b/frontend/app_flowy/lib/startup/tasks/app_widget.dart index 7368cc3b13..12e88949a0 100644 --- a/frontend/app_flowy/lib/startup/tasks/app_widget.dart +++ b/frontend/app_flowy/lib/startup/tasks/app_widget.dart @@ -113,7 +113,7 @@ class ApplicationBlocObserver extends BlocObserver { // ignore: unnecessary_overrides void onTransition(Bloc bloc, Transition transition) { // Log.debug("[current]: ${transition.currentState} \n\n[next]: ${transition.nextState}"); - //Log.debug("${transition.nextState}"); + // Log.debug("${transition.nextState}"); super.onTransition(bloc, transition); } diff --git a/frontend/app_flowy/lib/startup/user_deps_resolver.dart b/frontend/app_flowy/lib/startup/user_deps_resolver.dart deleted file mode 100644 index daf67a071a..0000000000 --- a/frontend/app_flowy/lib/startup/user_deps_resolver.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:app_flowy/user/application/auth_service.dart'; -import 'package:app_flowy/user/application/sign_in_bloc.dart'; -import 'package:app_flowy/user/application/sign_up_bloc.dart'; -import 'package:app_flowy/user/application/splash_bloc.dart'; -import 'package:app_flowy/user/presentation/router.dart'; -import 'package:app_flowy/workspace/application/edit_pannel/edit_pannel_bloc.dart'; -import 'package:app_flowy/workspace/application/home/home_bloc.dart'; -import 'package:get_it/get_it.dart'; - -import '../core/network_monitor.dart'; - -class UserDepsResolver { - static Future resolve(GetIt getIt) async { - getIt.registerFactory(() => AuthService()); - - //Interface implementation - getIt.registerFactory(() => AuthRouter()); - - //Bloc - getIt.registerFactory(() => SignInBloc(getIt())); - getIt.registerFactory(() => SignUpBloc(getIt())); - - getIt.registerFactory(() => SplashRoute()); - getIt.registerFactory(() => HomeBloc()); - getIt.registerFactory(() => EditPannelBloc()); - getIt.registerFactory(() => SplashBloc()); - getIt.registerLazySingleton(() => NetworkListener()); - } -} diff --git a/frontend/app_flowy/lib/user/application/prelude.dart b/frontend/app_flowy/lib/user/application/prelude.dart new file mode 100644 index 0000000000..74b644808e --- /dev/null +++ b/frontend/app_flowy/lib/user/application/prelude.dart @@ -0,0 +1,4 @@ +export './auth_service.dart'; +export './sign_in_bloc.dart'; +export './sign_up_bloc.dart'; +export './splash_bloc.dart'; diff --git a/frontend/app_flowy/lib/user/application/sign_in_bloc.dart b/frontend/app_flowy/lib/user/application/sign_in_bloc.dart index 25aa66cc50..e0f5bed605 100644 --- a/frontend/app_flowy/lib/user/application/sign_in_bloc.dart +++ b/frontend/app_flowy/lib/user/application/sign_in_bloc.dart @@ -54,14 +54,14 @@ class SignInBloc extends Bloc { } @freezed -abstract class SignInEvent with _$SignInEvent { +class SignInEvent with _$SignInEvent { const factory SignInEvent.signedInWithUserEmailAndPassword() = SignedInWithUserEmailAndPassword; const factory SignInEvent.emailChanged(String email) = EmailChanged; const factory SignInEvent.passwordChanged(String password) = PasswordChanged; } @freezed -abstract class SignInState with _$SignInState { +class SignInState with _$SignInState { const factory SignInState({ String? email, String? password, diff --git a/frontend/app_flowy/lib/user/application/sign_up_bloc.dart b/frontend/app_flowy/lib/user/application/sign_up_bloc.dart index 11acd1d385..2efc82d3c7 100644 --- a/frontend/app_flowy/lib/user/application/sign_up_bloc.dart +++ b/frontend/app_flowy/lib/user/application/sign_up_bloc.dart @@ -15,11 +15,11 @@ class SignUpBloc extends Bloc { on((event, emit) async { await event.map(signUpWithUserEmailAndPassword: (e) async { await _performActionOnSignUp(emit); - }, emailChanged: (EmailChanged value) async { + }, emailChanged: (_EmailChanged value) async { emit(state.copyWith(email: value.email, emailError: none(), successOrFail: none())); - }, passwordChanged: (PasswordChanged value) async { + }, passwordChanged: (_PasswordChanged value) async { emit(state.copyWith(password: value.password, passwordError: none(), successOrFail: none())); - }, repeatPasswordChanged: (RepeatPasswordChanged value) async { + }, repeatPasswordChanged: (_RepeatPasswordChanged value) async { emit(state.copyWith(repeatedPassword: value.password, repeatPasswordError: none(), successOrFail: none())); }); }); @@ -104,9 +104,9 @@ class SignUpBloc extends Bloc { @freezed class SignUpEvent with _$SignUpEvent { const factory SignUpEvent.signUpWithUserEmailAndPassword() = SignUpWithUserEmailAndPassword; - const factory SignUpEvent.emailChanged(String email) = EmailChanged; - const factory SignUpEvent.passwordChanged(String password) = PasswordChanged; - const factory SignUpEvent.repeatPasswordChanged(String password) = RepeatPasswordChanged; + const factory SignUpEvent.emailChanged(String email) = _EmailChanged; + const factory SignUpEvent.passwordChanged(String password) = _PasswordChanged; + const factory SignUpEvent.repeatPasswordChanged(String password) = _RepeatPasswordChanged; } @freezed diff --git a/frontend/app_flowy/lib/user/application/user_listener.dart b/frontend/app_flowy/lib/user/application/user_listener.dart index 993aee60e0..5b212cc2d0 100644 --- a/frontend/app_flowy/lib/user/application/user_listener.dart +++ b/frontend/app_flowy/lib/user/application/user_listener.dart @@ -12,7 +12,6 @@ import 'package:flowy_sdk/protobuf/flowy-user-data-model/user_profile.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-user/dart_notification.pb.dart' as user; import 'package:flowy_sdk/rust_stream.dart'; - typedef UserProfileUpdatedNotifierValue = Either; typedef AuthNotifierValue = Either; typedef WorkspaceUpdatedNotifierValue = Either, FlowyError>; @@ -23,8 +22,8 @@ class UserListener { final authDidChangedNotifier = PublishNotifier(); final workspaceUpdatedNotifier = PublishNotifier(); - late FolderNotificationParser _workspaceParser; - late UserNotificationParser _userParser; + FolderNotificationParser? _workspaceParser; + UserNotificationParser? _userParser; late UserProfile _user; UserListener({ required UserProfile user, @@ -36,12 +35,14 @@ class UserListener { _workspaceParser = FolderNotificationParser(id: _user.token, callback: _notificationCallback); _userParser = UserNotificationParser(id: _user.token, callback: _userNotificationCallback); _subscription = RustStreamReceiver.listen((observable) { - _workspaceParser.parse(observable); - _userParser.parse(observable); + _workspaceParser?.parse(observable); + _userParser?.parse(observable); }); } Future stop() async { + _workspaceParser = null; + _userParser = null; await _subscription?.cancel(); profileUpdatedNotifier.dispose(); authDidChangedNotifier.dispose(); diff --git a/frontend/app_flowy/lib/user/domain/auth_state.dart b/frontend/app_flowy/lib/user/domain/auth_state.dart index b70383c0aa..96f2036e01 100644 --- a/frontend/app_flowy/lib/user/domain/auth_state.dart +++ b/frontend/app_flowy/lib/user/domain/auth_state.dart @@ -4,7 +4,7 @@ import 'package:freezed_annotation/freezed_annotation.dart'; part 'auth_state.freezed.dart'; @freezed -abstract class AuthState with _$AuthState { +class AuthState with _$AuthState { const factory AuthState.authenticated(UserProfile userProfile) = Authenticated; const factory AuthState.unauthenticated(FlowyError error) = Unauthenticated; const factory AuthState.initial() = _Initial; diff --git a/frontend/app_flowy/lib/user/presentation/sign_in_screen.dart b/frontend/app_flowy/lib/user/presentation/sign_in_screen.dart index f7afa0b4d3..9a02863345 100644 --- a/frontend/app_flowy/lib/user/presentation/sign_in_screen.dart +++ b/frontend/app_flowy/lib/user/presentation/sign_in_screen.dart @@ -170,11 +170,11 @@ class PasswordTextField extends StatelessWidget { return RoundedInputField( obscureText: true, style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), - obscureIcon: svg("home/hide"), - obscureHideIcon: svg("home/show"), + obscureIcon: svgWidget("home/hide"), + obscureHideIcon: svgWidget("home/show"), hintText: LocaleKeys.signIn_passwordHint.tr(), normalBorderColor: theme.shader4, - highlightBorderColor: theme.red, + errorBorderColor: theme.red, cursorColor: theme.main1, errorText: context.read().state.passwordError.fold(() => "", (error) => error), onChanged: (value) => context.read().add(SignInEvent.passwordChanged(value)), @@ -199,7 +199,7 @@ class EmailTextField extends StatelessWidget { hintText: LocaleKeys.signIn_emailHint.tr(), style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), normalBorderColor: theme.shader4, - highlightBorderColor: theme.red, + errorBorderColor: theme.red, cursorColor: theme.main1, errorText: context.read().state.emailError.fold(() => "", (error) => error), onChanged: (value) => context.read().add(SignInEvent.emailChanged(value)), diff --git a/frontend/app_flowy/lib/user/presentation/sign_up_screen.dart b/frontend/app_flowy/lib/user/presentation/sign_up_screen.dart index 931ccff516..9f95a1db75 100644 --- a/frontend/app_flowy/lib/user/presentation/sign_up_screen.dart +++ b/frontend/app_flowy/lib/user/presentation/sign_up_screen.dart @@ -134,12 +134,12 @@ class PasswordTextField extends StatelessWidget { builder: (context, state) { return RoundedInputField( obscureText: true, - obscureIcon: svg("home/hide"), - obscureHideIcon: svg("home/show"), + obscureIcon: svgWidget("home/hide"), + obscureHideIcon: svgWidget("home/show"), style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), hintText: LocaleKeys.signUp_passwordHint.tr(), normalBorderColor: theme.shader4, - highlightBorderColor: theme.red, + errorBorderColor: theme.red, cursorColor: theme.main1, errorText: context.read().state.passwordError.fold(() => "", (error) => error), onChanged: (value) => context.read().add(SignUpEvent.passwordChanged(value)), @@ -162,12 +162,12 @@ class RepeatPasswordTextField extends StatelessWidget { builder: (context, state) { return RoundedInputField( obscureText: true, - obscureIcon: svg("home/hide"), - obscureHideIcon: svg("home/show"), + obscureIcon: svgWidget("home/hide"), + obscureHideIcon: svgWidget("home/show"), style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), hintText: LocaleKeys.signUp_repeatPasswordHint.tr(), normalBorderColor: theme.shader4, - highlightBorderColor: theme.red, + errorBorderColor: theme.red, cursorColor: theme.main1, errorText: context.read().state.repeatPasswordError.fold(() => "", (error) => error), onChanged: (value) => context.read().add(SignUpEvent.repeatPasswordChanged(value)), @@ -192,7 +192,7 @@ class EmailTextField extends StatelessWidget { hintText: LocaleKeys.signUp_emailHint.tr(), style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), normalBorderColor: theme.shader4, - highlightBorderColor: theme.red, + errorBorderColor: theme.red, cursorColor: theme.main1, errorText: context.read().state.emailError.fold(() => "", (error) => error), onChanged: (value) => context.read().add(SignUpEvent.emailChanged(value)), diff --git a/frontend/app_flowy/lib/user/presentation/splash_screen.dart b/frontend/app_flowy/lib/user/presentation/splash_screen.dart index 5fe302abd0..dd8fdcd180 100644 --- a/frontend/app_flowy/lib/user/presentation/splash_screen.dart +++ b/frontend/app_flowy/lib/user/presentation/splash_screen.dart @@ -4,7 +4,7 @@ import 'package:app_flowy/user/domain/auth_state.dart'; import 'package:app_flowy/user/presentation/router.dart'; import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart'; -import 'package:flowy_sdk/protobuf/flowy-folder-data-model/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/error-code/error_code.pbenum.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/frontend/app_flowy/lib/user/presentation/widgets/background.dart b/frontend/app_flowy/lib/user/presentation/widgets/background.dart index 86dfab7ffe..225f7f0080 100644 --- a/frontend/app_flowy/lib/user/presentation/widgets/background.dart +++ b/frontend/app_flowy/lib/user/presentation/widgets/background.dart @@ -44,7 +44,7 @@ class FlowyLogoTitle extends StatelessWidget { children: [ SizedBox.fromSize( size: logoSize, - child: svg("flowy_logo"), + child: svgWidget("flowy_logo"), ), const VSpace(30), Text( diff --git a/frontend/app_flowy/lib/workspace/application/app/app_bloc.dart b/frontend/app_flowy/lib/workspace/application/app/app_bloc.dart index 5175fe2396..73192436bf 100644 --- a/frontend/app_flowy/lib/workspace/application/app/app_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/app/app_bloc.dart @@ -19,7 +19,7 @@ class AppBloc extends Bloc { AppBloc({required this.app, required this.service, required this.listener}) : super(AppState.initial(app)) { on((event, emit) async { await event.map(initial: (e) async { - listener.startListening( + listener.start( viewsChanged: _handleViewsChanged, appUpdated: (app) => add(AppEvent.appDidUpdate(app)), ); diff --git a/frontend/app_flowy/lib/workspace/application/app/app_listener.dart b/frontend/app_flowy/lib/workspace/application/app/app_listener.dart index 8f0ff7cb23..46b16bb080 100644 --- a/frontend/app_flowy/lib/workspace/application/app/app_listener.dart +++ b/frontend/app_flowy/lib/workspace/application/app/app_listener.dart @@ -17,18 +17,18 @@ class AppListener { StreamSubscription? _subscription; ViewsDidChangeCallback? _viewsChanged; AppDidUpdateCallback? _updated; - late FolderNotificationParser _parser; + FolderNotificationParser? _parser; String appId; AppListener({ required this.appId, }); - void startListening({ViewsDidChangeCallback? viewsChanged, AppDidUpdateCallback? appUpdated}) { + void start({ViewsDidChangeCallback? viewsChanged, AppDidUpdateCallback? appUpdated}) { _viewsChanged = viewsChanged; _updated = appUpdated; _parser = FolderNotificationParser(id: appId, callback: _bservableCallback); - _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable)); + _subscription = RustStreamReceiver.listen((observable) => _parser?.parse(observable)); } void _bservableCallback(FolderNotification ty, Either result) { @@ -61,6 +61,7 @@ class AppListener { } Future close() async { + _parser = null; await _subscription?.cancel(); _viewsChanged = null; _updated = null; diff --git a/frontend/app_flowy/lib/workspace/application/appearance.dart b/frontend/app_flowy/lib/workspace/application/appearance.dart index 87cd7e1af8..06473729a8 100644 --- a/frontend/app_flowy/lib/workspace/application/appearance.dart +++ b/frontend/app_flowy/lib/workspace/application/appearance.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:app_flowy/user/application/user_settings_service.dart'; import 'package:equatable/equatable.dart'; import 'package:flowy_infra/theme.dart'; @@ -5,13 +7,12 @@ import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/protobuf/flowy-user-data-model/user_setting.pb.dart'; import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:async/async.dart'; class AppearanceSettingModel extends ChangeNotifier with EquatableMixin { AppearanceSettings setting; AppTheme _theme; Locale _locale; - CancelableOperation? _saveOperation; + Timer? _saveOperation; AppearanceSettingModel(this.setting) : _theme = AppTheme.fromName(name: setting.theme), @@ -21,12 +22,10 @@ class AppearanceSettingModel extends ChangeNotifier with EquatableMixin { Locale get locale => _locale; Future save() async { - _saveOperation?.cancel; - _saveOperation = CancelableOperation.fromFuture( - Future.delayed(const Duration(seconds: 1), () async { - await UserSettingsService().setAppearanceSettings(setting); - }), - ); + _saveOperation?.cancel(); + _saveOperation = Timer(const Duration(seconds: 2), () async { + await UserSettingsService().setAppearanceSettings(setting); + }); } @override diff --git a/frontend/app_flowy/lib/workspace/application/edit_pannel/edit_context.dart b/frontend/app_flowy/lib/workspace/application/edit_pannel/edit_context.dart index cd52bc7f11..571461b365 100644 --- a/frontend/app_flowy/lib/workspace/application/edit_pannel/edit_context.dart +++ b/frontend/app_flowy/lib/workspace/application/edit_pannel/edit_context.dart @@ -5,19 +5,8 @@ abstract class EditPannelContext extends Equatable { final String identifier; final String title; final Widget child; - const EditPannelContext( - {required this.child, required this.identifier, required this.title}); + const EditPannelContext({required this.child, required this.identifier, required this.title}); @override List get props => [identifier]; } - -class BlankEditPannelContext extends EditPannelContext { - const BlankEditPannelContext() - : super(child: const Text('Blank'), identifier: '1', title: ''); -} - -class CellEditPannelContext extends EditPannelContext { - const CellEditPannelContext() - : super(child: const Text('shit'), identifier: 'test', title: 'test'); -} diff --git a/frontend/app_flowy/lib/workspace/application/edit_pannel/edit_pannel_bloc.dart b/frontend/app_flowy/lib/workspace/application/edit_pannel/edit_pannel_bloc.dart index 0ae2e8326a..e1f2f5835d 100644 --- a/frontend/app_flowy/lib/workspace/application/edit_pannel/edit_pannel_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/edit_pannel/edit_pannel_bloc.dart @@ -1,7 +1,6 @@ import 'package:app_flowy/workspace/application/edit_pannel/edit_context.dart'; import 'package:dartz/dartz.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -// ignore: import_of_legacy_library_into_null_safe import 'package:flutter_bloc/flutter_bloc.dart'; part 'edit_pannel_bloc.freezed.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_listener.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_listener.dart new file mode 100644 index 0000000000..d1fb0acc0c --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_listener.dart @@ -0,0 +1,40 @@ +import 'package:dartz/dartz.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart'; +import 'package:flowy_infra/notifier.dart'; +import 'dart:async'; +import 'dart:typed_data'; +import 'package:app_flowy/core/notification_helper.dart'; + +typedef UpdateFieldNotifiedValue = Either; + +class CellListener { + final String rowId; + final String fieldId; + PublishNotifier updateCellNotifier = PublishNotifier(); + GridNotificationListener? _listener; + CellListener({required this.rowId, required this.fieldId}); + + void start() { + _listener = GridNotificationListener(objectId: "$rowId:$fieldId", handler: _handler); + } + + void _handler(GridNotification ty, Either result) { + switch (ty) { + case GridNotification.DidUpdateCell: + result.fold( + (payload) => updateCellNotifier.value = left(CellNotificationData.fromBuffer(payload)), + (error) => updateCellNotifier.value = right(error), + ); + break; + default: + break; + } + } + + Future stop() async { + await _listener?.stop(); + updateCellNotifier.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart index 44cf86e5d2..9bdd48c259 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/cell_service.dart @@ -1,20 +1,36 @@ -import 'package:app_flowy/workspace/application/grid/row_service.dart'; 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/cell_entities.pb.dart'; class CellService { - final GridCellData context; + CellService(); - CellService(this.context); - - Future> updateCell({required String data}) { + Future> updateCell({ + required String gridId, + required String fieldId, + required String rowId, + required String data, + }) { final payload = CellMetaChangeset.create() - ..gridId = context.gridId - ..fieldId = context.field.id - ..rowId = context.rowId + ..gridId = gridId + ..fieldId = fieldId + ..rowId = rowId ..data = data; return GridEventUpdateCell(payload).send(); } + + Future> getCell({ + required String gridId, + required String fieldId, + required String rowId, + }) { + final payload = CellIdentifierPayload.create() + ..gridId = gridId + ..fieldId = fieldId + ..rowId = rowId; + return GridEventGetCell(payload).send(); + } } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart index ab844448dc..a2b888a295 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart @@ -1,4 +1,7 @@ -import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart'; +import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show Cell; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'dart:async'; @@ -7,15 +10,32 @@ import 'cell_service.dart'; part 'checkbox_cell_bloc.freezed.dart'; class CheckboxCellBloc extends Bloc { - final CellService service; + final CellService _service; + final CellListener _listener; CheckboxCellBloc({ - required this.service, - }) : super(CheckboxCellState.initial(service.context.cell)) { + required CellService service, + required CellData cellData, + }) : _service = service, + _listener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id), + super(CheckboxCellState.initial(cellData)) { on( (event, emit) async { await event.map( - initial: (_InitialCell value) async {}, + initial: (_Initial value) { + _startListening(); + }, + select: (_Selected value) async { + _service.updateCell( + gridId: state.cellData.gridId, + fieldId: state.cellData.field.id, + rowId: state.cellData.rowId, + data: !state.isSelected ? "Yes" : "No", + ); + }, + didReceiveCellUpdate: (_DidReceiveCellUpdate value) { + emit(state.copyWith(isSelected: isSelected(value.cell))); + }, ); }, ); @@ -23,20 +43,51 @@ class CheckboxCellBloc extends Bloc { @override Future close() async { + await _listener.stop(); return super.close(); } + + void _startListening() { + _listener.updateCellNotifier.addPublishListener((result) { + result.fold( + (notificationData) async { + final result = await _service.getCell( + gridId: state.cellData.gridId, + fieldId: state.cellData.field.id, + rowId: state.cellData.rowId, + ); + result.fold( + (cell) => add(CheckboxCellEvent.didReceiveCellUpdate(cell)), + (err) => Log.error(err), + ); + }, + (err) => Log.error(err), + ); + }); + _listener.start(); + } } @freezed -abstract class CheckboxCellEvent with _$CheckboxCellEvent { - const factory CheckboxCellEvent.initial() = _InitialCell; +class CheckboxCellEvent with _$CheckboxCellEvent { + const factory CheckboxCellEvent.initial() = _Initial; + const factory CheckboxCellEvent.select() = _Selected; + const factory CheckboxCellEvent.didReceiveCellUpdate(Cell cell) = _DidReceiveCellUpdate; } @freezed -abstract class CheckboxCellState with _$CheckboxCellState { +class CheckboxCellState with _$CheckboxCellState { const factory CheckboxCellState({ - required Cell? cell, + required CellData cellData, + required bool isSelected, }) = _CheckboxCellState; - factory CheckboxCellState.initial(Cell? cell) => CheckboxCellState(cell: cell); + factory CheckboxCellState.initial(CellData cellData) { + return CheckboxCellState(cellData: cellData, isSelected: isSelected(cellData.cell)); + } +} + +bool isSelected(Cell? cell) { + final content = cell?.content ?? ""; + return content == "Yes"; } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart index dcb0461165..7a995aab28 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/date_cell_bloc.dart @@ -1,3 +1,4 @@ +import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; @@ -8,10 +9,12 @@ part 'date_cell_bloc.freezed.dart'; class DateCellBloc extends Bloc { final CellService service; + final CellData cellData; DateCellBloc({ required this.service, - }) : super(DateCellState.initial(service.context.cell)) { + required this.cellData, + }) : super(DateCellState.initial()) { on( (event, emit) async { await event.map( @@ -28,15 +31,15 @@ class DateCellBloc extends Bloc { } @freezed -abstract class DateCellEvent with _$DateCellEvent { +class DateCellEvent with _$DateCellEvent { const factory DateCellEvent.initial() = _InitialCell; } @freezed -abstract class DateCellState with _$DateCellState { +class DateCellState with _$DateCellState { const factory DateCellState({ - required Cell? cell, + Cell? cell, }) = _DateCellState; - factory DateCellState.initial(Cell? cell) => DateCellState(cell: cell); + factory DateCellState.initial() => const DateCellState(); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart index caa91fa408..fe5c6befeb 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/number_cell_bloc.dart @@ -1,3 +1,6 @@ +import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart'; +import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; +import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; @@ -7,36 +10,87 @@ import 'cell_service.dart'; part 'number_cell_bloc.freezed.dart'; class NumberCellBloc extends Bloc { - final CellService service; + final CellService _service; + final CellListener _listener; NumberCellBloc({ - required this.service, - }) : super(NumberCellState.initial(service.context.cell)) { + required CellData cellData, + }) : _service = CellService(), + _listener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id), + super(NumberCellState.initial(cellData)) { on( (event, emit) async { await event.map( - initial: (_InitialCell value) async {}, + initial: (_Initial value) async { + _startListening(); + }, + didReceiveCellUpdate: (_DidReceiveCellUpdate value) { + emit(state.copyWith(content: value.cell.content)); + }, + updateCell: (_UpdateCell value) { + _updateCellValue(value, emit); + }, ); }, ); } + void _updateCellValue(_UpdateCell value, Emitter emit) { + final number = num.tryParse(value.text); + if (number == null) { + emit(state.copyWith(content: "")); + } else { + _service.updateCell( + gridId: state.cellData.gridId, + fieldId: state.cellData.field.id, + rowId: state.cellData.rowId, + data: value.text, + ); + } + } + @override Future close() async { + await _listener.stop(); return super.close(); } + + void _startListening() { + _listener.updateCellNotifier.addPublishListener((result) { + result.fold( + (notificationData) async { + final result = await _service.getCell( + gridId: state.cellData.gridId, + fieldId: state.cellData.field.id, + rowId: state.cellData.rowId, + ); + result.fold( + (cell) => add(NumberCellEvent.didReceiveCellUpdate(cell)), + (err) => Log.error(err), + ); + }, + (err) => Log.error(err), + ); + }); + _listener.start(); + } } @freezed -abstract class NumberCellEvent with _$NumberCellEvent { - const factory NumberCellEvent.initial() = _InitialCell; +class NumberCellEvent with _$NumberCellEvent { + const factory NumberCellEvent.initial() = _Initial; + const factory NumberCellEvent.updateCell(String text) = _UpdateCell; + const factory NumberCellEvent.didReceiveCellUpdate(Cell cell) = _DidReceiveCellUpdate; } @freezed -abstract class NumberCellState with _$NumberCellState { +class NumberCellState with _$NumberCellState { const factory NumberCellState({ - required Cell? cell, + required CellData cellData, + required String content, }) = _NumberCellState; - factory NumberCellState.initial(Cell? cell) => NumberCellState(cell: cell); + factory NumberCellState.initial(CellData cellData) { + return NumberCellState(cellData: cellData, content: cellData.cell?.content ?? ""); + } } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/select_option_service.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/select_option_service.dart new file mode 100644 index 0000000000..ad0a1888b3 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/select_option_service.dart @@ -0,0 +1,109 @@ +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/cell_entities.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; + +class SelectOptionService { + SelectOptionService(); + + Future> create({ + required String gridId, + required String fieldId, + required String rowId, + required String name, + }) { + return GridEventNewSelectOption(SelectOptionName.create()..name = name).send().then( + (result) { + return result.fold( + (option) { + final cellIdentifier = CellIdentifierPayload.create() + ..gridId = gridId + ..fieldId = fieldId + ..rowId = rowId; + final payload = SelectOptionChangesetPayload.create() + ..insertOption = option + ..cellIdentifier = cellIdentifier; + return GridEventApplySelectOptionChangeset(payload).send(); + }, + (r) => right(r), + ); + }, + ); + } + + Future> insert({ + required String gridId, + required String fieldId, + required String rowId, + required SelectOption option, + }) { + final cellIdentifier = CellIdentifierPayload.create() + ..gridId = gridId + ..fieldId = fieldId + ..rowId = rowId; + final payload = SelectOptionChangesetPayload.create() + ..insertOption = option + ..cellIdentifier = cellIdentifier; + return GridEventApplySelectOptionChangeset(payload).send(); + } + + Future> delete({ + required String gridId, + required String fieldId, + required String rowId, + required SelectOption option, + }) { + final cellIdentifier = CellIdentifierPayload.create() + ..gridId = gridId + ..fieldId = fieldId + ..rowId = rowId; + + final payload = SelectOptionChangesetPayload.create() + ..deleteOption = option + ..cellIdentifier = cellIdentifier; + + return GridEventApplySelectOptionChangeset(payload).send(); + } + + Future> getOpitonContext({ + required String gridId, + required String fieldId, + required String rowId, + }) { + final payload = CellIdentifierPayload.create() + ..gridId = gridId + ..fieldId = fieldId + ..rowId = rowId; + + return GridEventGetSelectOptionContext(payload).send(); + } + + Future> select({ + required String gridId, + required String fieldId, + required String rowId, + required String optionId, + }) { + final payload = SelectOptionCellChangesetPayload.create() + ..gridId = gridId + ..fieldId = fieldId + ..rowId = rowId + ..insertOptionId = optionId; + return GridEventApplySelectOptionCellChangeset(payload).send(); + } + + Future> remove({ + required String gridId, + required String fieldId, + required String rowId, + required String optionId, + }) { + final payload = SelectOptionCellChangesetPayload.create() + ..gridId = gridId + ..fieldId = fieldId + ..rowId = rowId + ..deleteOptionId = optionId; + return GridEventApplySelectOptionCellChangeset(payload).send(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart index 7f21a84fff..b12b56b827 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_cell_bloc.dart @@ -1,21 +1,33 @@ -import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart'; +import 'package:app_flowy/workspace/application/grid/cell_bloc/select_option_service.dart'; +import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'dart:async'; -import 'cell_service.dart'; part 'selection_cell_bloc.freezed.dart'; class SelectionCellBloc extends Bloc { - final CellService service; + final SelectOptionService _service; + final CellListener _listener; SelectionCellBloc({ - required this.service, - }) : super(SelectionCellState.initial(service.context.cell)) { + required CellData cellData, + }) : _service = SelectOptionService(), + _listener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id), + super(SelectionCellState.initial(cellData)) { on( (event, emit) async { await event.map( - initial: (_InitialCell value) async {}, + initial: (_InitialCell value) async { + _loadOptions(); + _startListening(); + }, + didReceiveOptions: (_DidReceiveOptions value) { + emit(state.copyWith(options: value.options, selectedOptions: value.selectedOptions)); + }, ); }, ); @@ -23,20 +35,57 @@ class SelectionCellBloc extends Bloc { @override Future close() async { + await _listener.stop(); return super.close(); } + + void _loadOptions() async { + final result = await _service.getOpitonContext( + gridId: state.cellData.gridId, + fieldId: state.cellData.field.id, + rowId: state.cellData.rowId, + ); + + result.fold( + (selectOptionContext) => add(SelectionCellEvent.didReceiveOptions( + selectOptionContext.options, + selectOptionContext.selectOptions, + )), + (err) => Log.error(err), + ); + } + + void _startListening() { + _listener.updateCellNotifier.addPublishListener((result) { + result.fold( + (notificationData) => _loadOptions(), + (err) => Log.error(err), + ); + }); + _listener.start(); + } } @freezed -abstract class SelectionCellEvent with _$SelectionCellEvent { +class SelectionCellEvent with _$SelectionCellEvent { const factory SelectionCellEvent.initial() = _InitialCell; + const factory SelectionCellEvent.didReceiveOptions( + List options, + List selectedOptions, + ) = _DidReceiveOptions; } @freezed -abstract class SelectionCellState with _$SelectionCellState { +class SelectionCellState with _$SelectionCellState { const factory SelectionCellState({ - required Cell? cell, + required CellData cellData, + required List options, + required List selectedOptions, }) = _SelectionCellState; - factory SelectionCellState.initial(Cell? cell) => SelectionCellState(cell: cell); + factory SelectionCellState.initial(CellData cellData) => SelectionCellState( + cellData: cellData, + options: [], + selectedOptions: [], + ); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_editor_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_editor_bloc.dart new file mode 100644 index 0000000000..e7f471dece --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/selection_editor_bloc.dart @@ -0,0 +1,186 @@ +import 'package:app_flowy/workspace/application/grid/cell_bloc/cell_listener.dart'; +import 'package:app_flowy/workspace/application/grid/field/field_listener.dart'; +import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'select_option_service.dart'; + +part 'selection_editor_bloc.freezed.dart'; + +class SelectOptionEditorBloc extends Bloc { + final SelectOptionService _selectOptionService; + final FieldListener _fieldListener; + final CellListener _cellListener; + Timer? _delayOperation; + + SelectOptionEditorBloc({ + required CellData cellData, + required List options, + required List selectedOptions, + }) : _selectOptionService = SelectOptionService(), + _fieldListener = FieldListener(fieldId: cellData.field.id), + _cellListener = CellListener(rowId: cellData.rowId, fieldId: cellData.field.id), + super(SelectOptionEditorState.initial(cellData, options, selectedOptions)) { + on( + (event, emit) async { + await event.map( + initial: (_Initial value) async { + _startListening(); + }, + didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) { + emit(state.copyWith(field: value.field)); + _loadOptions(); + }, + didReceiveOptions: (_DidReceiveOptions value) { + emit(state.copyWith( + options: value.options, + selectedOptions: value.selectedOptions, + )); + }, + newOption: (_NewOption value) { + _createOption(value.optionName); + }, + deleteOption: (_DeleteOption value) { + _deleteOption(value.option); + }, + updateOption: (_UpdateOption value) { + _updateOption(value.option); + }, + selectOption: (_SelectOption value) { + _makeOptionAsSelected(value.optionId); + }, + ); + }, + ); + } + + @override + Future close() async { + _delayOperation?.cancel(); + await _fieldListener.stop(); + await _cellListener.stop(); + return super.close(); + } + + void _createOption(String name) async { + final result = await _selectOptionService.create( + gridId: state.gridId, + fieldId: state.field.id, + rowId: state.rowId, + name: name, + ); + result.fold((l) => _loadOptions(), (err) => Log.error(err)); + } + + void _deleteOption(SelectOption option) async { + final result = await _selectOptionService.delete( + gridId: state.gridId, + fieldId: state.field.id, + rowId: state.rowId, + option: option, + ); + + result.fold((l) => null, (err) => Log.error(err)); + } + + void _updateOption(SelectOption option) async { + final result = await _selectOptionService.insert( + gridId: state.gridId, + fieldId: state.field.id, + rowId: state.rowId, + option: option, + ); + + result.fold((l) => null, (err) => Log.error(err)); + } + + void _makeOptionAsSelected(String optionId) { + _selectOptionService.select( + gridId: state.gridId, + fieldId: state.field.id, + rowId: state.rowId, + optionId: optionId, + ); + } + + void _loadOptions() async { + _delayOperation?.cancel(); + _delayOperation = Timer( + const Duration(milliseconds: 300), + () async { + final result = await _selectOptionService.getOpitonContext( + gridId: state.gridId, + fieldId: state.field.id, + rowId: state.rowId, + ); + + result.fold( + (selectOptionContext) => add(SelectOptionEditorEvent.didReceiveOptions( + selectOptionContext.options, + selectOptionContext.selectOptions, + )), + (err) => Log.error(err), + ); + }, + ); + } + + void _startListening() { + _cellListener.updateCellNotifier.addPublishListener((result) { + result.fold( + (notificationData) => _loadOptions(), + (err) => Log.error(err), + ); + }); + _cellListener.start(); + + _fieldListener.updateFieldNotifier.addPublishListener((result) { + result.fold( + (field) => add(SelectOptionEditorEvent.didReceiveFieldUpdate(field)), + (err) => Log.error(err), + ); + }); + _fieldListener.start(); + } +} + +@freezed +class SelectOptionEditorEvent with _$SelectOptionEditorEvent { + const factory SelectOptionEditorEvent.initial() = _Initial; + const factory SelectOptionEditorEvent.didReceiveFieldUpdate(Field field) = _DidReceiveFieldUpdate; + const factory SelectOptionEditorEvent.didReceiveOptions( + List options, List selectedOptions) = _DidReceiveOptions; + const factory SelectOptionEditorEvent.newOption(String optionName) = _NewOption; + const factory SelectOptionEditorEvent.selectOption(String optionId) = _SelectOption; + const factory SelectOptionEditorEvent.updateOption(SelectOption option) = _UpdateOption; + const factory SelectOptionEditorEvent.deleteOption(SelectOption option) = _DeleteOption; +} + +@freezed +class SelectOptionEditorState with _$SelectOptionEditorState { + const factory SelectOptionEditorState({ + required String gridId, + required Field field, + required String rowId, + required List options, + required List selectedOptions, + }) = _SelectOptionEditorState; + + factory SelectOptionEditorState.initial( + CellData cellData, + List options, + List selectedOptions, + ) { + return SelectOptionEditorState( + gridId: cellData.gridId, + field: cellData.field, + rowId: cellData.rowId, + options: options, + selectedOptions: selectedOptions, + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/text_cell_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/text_cell_bloc.dart index 80bc722be7..5af39bbd9f 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/text_cell_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/cell_bloc/text_cell_bloc.dart @@ -1,3 +1,4 @@ +import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'dart:async'; @@ -10,19 +11,39 @@ class TextCellBloc extends Bloc { TextCellBloc({ required this.service, - }) : super(TextCellState.initial(service.context.cell?.content ?? "")) { + required CellData cellData, + }) : super(TextCellState.initial(cellData)) { on( (event, emit) async { await event.map( initial: (_InitialCell value) async {}, updateText: (_UpdateText value) { - service.updateCell(data: value.text); + updateCellContent(value.text); + emit(state.copyWith(content: value.text)); + }, + didReceiveCellData: (_DidReceiveCellData value) { + emit(state.copyWith( + cellData: value.cellData, + content: value.cellData.cell?.content ?? "", + )); }, ); }, ); } + void updateCellContent(String content) { + final fieldId = state.cellData.field.id; + final gridId = state.cellData.gridId; + final rowId = state.cellData.rowId; + service.updateCell( + data: content, + fieldId: fieldId, + gridId: gridId, + rowId: rowId, + ); + } + @override Future close() async { return super.close(); @@ -30,16 +51,21 @@ class TextCellBloc extends Bloc { } @freezed -abstract class TextCellEvent with _$TextCellEvent { +class TextCellEvent with _$TextCellEvent { const factory TextCellEvent.initial() = _InitialCell; + const factory TextCellEvent.didReceiveCellData(CellData cellData) = _DidReceiveCellData; const factory TextCellEvent.updateText(String text) = _UpdateText; } @freezed -abstract class TextCellState with _$TextCellState { +class TextCellState with _$TextCellState { const factory TextCellState({ required String content, + required CellData cellData, }) = _TextCellState; - factory TextCellState.initial(String content) => TextCellState(content: content); + factory TextCellState.initial(CellData cellData) => TextCellState( + content: cellData.cell?.content ?? "", + cellData: cellData, + ); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/column_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/column_bloc.dart deleted file mode 100644 index 39badc922a..0000000000 --- a/frontend/app_flowy/lib/workspace/application/grid/column_bloc.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'dart:async'; -import 'column_service.dart'; -import 'data.dart'; - -part 'column_bloc.freezed.dart'; - -class ColumnBloc extends Bloc { - final ColumnService service; - final GridColumnData data; - - ColumnBloc({required this.data, required this.service}) : super(ColumnState.initial(data.fields)) { - on( - (event, emit) async { - await event.map( - initial: (_InitialColumn value) async {}, - createColumn: (_CreateColumn value) {}, - ); - }, - ); - } - - @override - Future close() async { - return super.close(); - } -} - -@freezed -abstract class ColumnEvent with _$ColumnEvent { - const factory ColumnEvent.initial() = _InitialColumn; - const factory ColumnEvent.createColumn() = _CreateColumn; -} - -@freezed -abstract class ColumnState with _$ColumnState { - const factory ColumnState({required List fields}) = _ColumnState; - - factory ColumnState.initial(List fields) => ColumnState(fields: fields); -} diff --git a/frontend/app_flowy/lib/workspace/application/grid/column_service.dart b/frontend/app_flowy/lib/workspace/application/grid/column_service.dart deleted file mode 100644 index c074dcf616..0000000000 --- a/frontend/app_flowy/lib/workspace/application/grid/column_service.dart +++ /dev/null @@ -1 +0,0 @@ -class ColumnService {} diff --git a/frontend/app_flowy/lib/workspace/application/grid/data.dart b/frontend/app_flowy/lib/workspace/application/grid/data.dart index ff1b1e3efc..7c508a6867 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/data.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/data.dart @@ -1,7 +1,8 @@ import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; -class GridColumnData { +class GridHeaderData { + final String gridId; final List fields; - GridColumnData({required this.fields}); + GridHeaderData({required this.gridId, required this.fields}); } diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/action_sheet_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/action_sheet_bloc.dart new file mode 100644 index 0000000000..5e8cb5a932 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/action_sheet_bloc.dart @@ -0,0 +1,80 @@ +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'field_service.dart'; + +part 'action_sheet_bloc.freezed.dart'; + +class FieldActionSheetBloc extends Bloc { + final FieldService service; + + FieldActionSheetBloc({required Field field, required this.service}) + : super(ActionSheetState.initial(EditFieldContext.create()..gridField = field)) { + on( + (event, emit) async { + await event.map( + updateFieldName: (_UpdateFieldName value) async { + final result = await service.updateField(fieldId: field.id, name: value.name); + result.fold( + (l) => null, + (err) => Log.error(err), + ); + }, + hideField: (_HideField value) async { + final result = await service.updateField(fieldId: field.id, visibility: false); + result.fold( + (l) => null, + (err) => Log.error(err), + ); + }, + deleteField: (_DeleteField value) async { + final result = await service.deleteField(fieldId: field.id); + result.fold( + (l) => null, + (err) => Log.error(err), + ); + }, + duplicateField: (_DuplicateField value) async { + final result = await service.duplicateField(fieldId: field.id); + result.fold( + (l) => null, + (err) => Log.error(err), + ); + }, + saveField: (_SaveField value) {}, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +class ActionSheetEvent with _$ActionSheetEvent { + const factory ActionSheetEvent.updateFieldName(String name) = _UpdateFieldName; + const factory ActionSheetEvent.hideField() = _HideField; + const factory ActionSheetEvent.duplicateField() = _DuplicateField; + const factory ActionSheetEvent.deleteField() = _DeleteField; + const factory ActionSheetEvent.saveField() = _SaveField; +} + +@freezed +class ActionSheetState with _$ActionSheetState { + const factory ActionSheetState({ + required EditFieldContext editContext, + required String errorText, + required String fieldName, + }) = _ActionSheetState; + + factory ActionSheetState.initial(EditFieldContext editContext) => ActionSheetState( + editContext: editContext, + errorText: '', + fieldName: editContext.gridField.name, + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/field_editor_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/field_editor_bloc.dart new file mode 100644 index 0000000000..c38713862e --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/field_editor_bloc.dart @@ -0,0 +1,100 @@ +import 'dart:typed_data'; +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'field_service.dart'; +import 'package:dartz/dartz.dart'; + +part 'field_editor_bloc.freezed.dart'; + +class FieldEditorBloc extends Bloc { + final FieldService service; + final EditFieldContextLoader _loader; + + FieldEditorBloc({ + required this.service, + required EditFieldContextLoader fieldLoader, + }) : _loader = fieldLoader, + super(FieldEditorState.initial(service.gridId)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialField value) async { + await _getEditFieldContext(emit); + }, + updateName: (_UpdateName value) { + emit(state.copyWith(fieldName: value.name)); + }, + switchField: (_SwitchField value) { + emit(state.copyWith(field: Some(value.field), typeOptionData: value.typeOptionData)); + }, + done: (_Done value) async { + await _saveField(emit); + }, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } + + Future _saveField(Emitter emit) async { + await state.field.fold( + () async => null, + (field) async { + field.name = state.fieldName; + final result = await service.insertField( + field: field, + typeOptionData: state.typeOptionData, + ); + result.fold((l) => null, (r) => null); + }, + ); + } + + Future _getEditFieldContext(Emitter emit) async { + final result = await _loader.load(); + result.fold( + (editContext) { + emit(state.copyWith( + field: Some(editContext.gridField), + typeOptionData: editContext.typeOptionData, + fieldName: editContext.gridField.name, + )); + }, + (err) => Log.error(err), + ); + } +} + +@freezed +class FieldEditorEvent with _$FieldEditorEvent { + const factory FieldEditorEvent.initial() = _InitialField; + const factory FieldEditorEvent.updateName(String name) = _UpdateName; + const factory FieldEditorEvent.switchField(Field field, Uint8List typeOptionData) = _SwitchField; + const factory FieldEditorEvent.done() = _Done; +} + +@freezed +class FieldEditorState with _$FieldEditorState { + const factory FieldEditorState({ + required String fieldName, + required String gridId, + required String errorText, + required Option field, + required List typeOptionData, + }) = _FieldEditorState; + + factory FieldEditorState.initial(String gridId) => FieldEditorState( + gridId: gridId, + fieldName: '', + field: none(), + errorText: '', + typeOptionData: List.empty(), + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/field_listener.dart b/frontend/app_flowy/lib/workspace/application/grid/field/field_listener.dart new file mode 100644 index 0000000000..ed09ca9b82 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/field_listener.dart @@ -0,0 +1,46 @@ +import 'package:dartz/dartz.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart'; +import 'package:flowy_infra/notifier.dart'; +import 'dart:async'; +import 'dart:typed_data'; +import 'package:app_flowy/core/notification_helper.dart'; + +typedef UpdateFieldNotifiedValue = Either; + +class FieldListener { + final String fieldId; + PublishNotifier updateFieldNotifier = PublishNotifier(); + GridNotificationListener? _listener; + + FieldListener({required this.fieldId}); + + void start() { + _listener = GridNotificationListener( + objectId: fieldId, + handler: _handler, + ); + } + + void _handler( + GridNotification ty, + Either result, + ) { + switch (ty) { + case GridNotification.DidUpdateField: + result.fold( + (payload) => updateFieldNotifier.value = left(Field.fromBuffer(payload)), + (error) => updateFieldNotifier.value = right(error), + ); + break; + default: + break; + } + } + + Future stop() async { + await _listener?.stop(); + updateFieldNotifier.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/field_service.dart b/frontend/app_flowy/lib/workspace/application/grid/field/field_service.dart new file mode 100644 index 0000000000..2336c4f340 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/field_service.dart @@ -0,0 +1,170 @@ +import 'package:dartz/dartz.dart'; +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 { + final String gridId; + + FieldService({required this.gridId}); + + Future> switchToField(String fieldId, FieldType fieldType) { + final payload = EditFieldPayload.create() + ..gridId = gridId + ..fieldId = fieldId + ..fieldType = fieldType; + + return GridEventSwitchToField(payload).send(); + } + + Future> updateField({ + required String fieldId, + String? name, + FieldType? fieldType, + bool? frozen, + bool? visibility, + double? width, + List? typeOptionData, + }) { + var payload = FieldChangesetPayload.create() + ..gridId = gridId + ..fieldId = fieldId; + + if (name != null) { + payload.name = name; + } + + if (fieldType != null) { + payload.fieldType = fieldType; + } + + if (frozen != null) { + payload.frozen = frozen; + } + + if (visibility != null) { + payload.visibility = visibility; + } + + if (width != null) { + payload.width = width.toInt(); + } + + if (typeOptionData != null) { + payload.typeOptionData = typeOptionData; + } + + return GridEventUpdateField(payload).send(); + } + + // Create the field if it does not exist. Otherwise, update the field. + Future> insertField({ + required Field field, + List? typeOptionData, + String? startFieldId, + }) { + var payload = CreateFieldPayload.create() + ..gridId = gridId + ..field_2 = field + ..typeOptionData = typeOptionData ?? []; + + if (startFieldId != null) { + payload.startFieldId = startFieldId; + } + + return GridEventCreateField(payload).send(); + } + + Future> deleteField({ + required String fieldId, + }) { + final payload = FieldIdentifierPayload.create() + ..gridId = gridId + ..fieldId = fieldId; + + return GridEventDeleteField(payload).send(); + } + + Future> duplicateField({ + required String fieldId, + }) { + final payload = FieldIdentifierPayload.create() + ..gridId = gridId + ..fieldId = fieldId; + + return GridEventDuplicateField(payload).send(); + } +} + +class GridFieldCellContext extends Equatable { + final String gridId; + final Field field; + + const GridFieldCellContext({ + required this.gridId, + required this.field, + }); + + @override + List get props => [field.id]; +} + +abstract class EditFieldContextLoader { + Future> load(); + + Future> switchToField(String fieldId, FieldType fieldType); +} + +class NewFieldContextLoader extends EditFieldContextLoader { + final String gridId; + NewFieldContextLoader({ + required this.gridId, + }); + + @override + Future> load() { + final payload = GetEditFieldContextPayload.create() + ..gridId = gridId + ..fieldType = FieldType.RichText; + + return GridEventGetEditFieldContext(payload).send(); + } + + @override + Future> switchToField(String fieldId, FieldType fieldType) { + final payload = GetEditFieldContextPayload.create() + ..gridId = gridId + ..fieldType = fieldType; + + return GridEventGetEditFieldContext(payload).send(); + } +} + +class FieldContextLoaderAdaptor extends EditFieldContextLoader { + final String gridId; + final Field field; + + FieldContextLoaderAdaptor({ + required this.gridId, + required this.field, + }); + + @override + Future> load() { + final payload = GetEditFieldContextPayload.create() + ..gridId = gridId + ..fieldId = field.id + ..fieldType = field.fieldType; + + return GridEventGetEditFieldContext(payload).send(); + } + + @override + Future> switchToField(String fieldId, FieldType fieldType) async { + final fieldService = FieldService(gridId: gridId); + return fieldService.switchToField(fieldId, fieldType); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/field_switch_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/field_switch_bloc.dart new file mode 100644 index 0000000000..082c0decf4 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/field_switch_bloc.dart @@ -0,0 +1,61 @@ +import 'dart:typed_data'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; + +part 'field_switch_bloc.freezed.dart'; + +class FieldSwitcherBloc extends Bloc { + FieldSwitcherBloc(SwitchFieldContext editContext) : super(FieldSwitchState.initial(editContext)) { + on( + (event, emit) async { + await event.map( + toFieldType: (_ToFieldType value) async { + emit(state.copyWith( + field: value.field, + typeOptionData: Uint8List.fromList(value.typeOptionData), + )); + }, + didUpdateTypeOptionData: (_DidUpdateTypeOptionData value) { + emit(state.copyWith(typeOptionData: value.typeOptionData)); + }, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +class FieldSwitchEvent with _$FieldSwitchEvent { + const factory FieldSwitchEvent.toFieldType(Field field, List typeOptionData) = _ToFieldType; + const factory FieldSwitchEvent.didUpdateTypeOptionData(Uint8List typeOptionData) = _DidUpdateTypeOptionData; +} + +@freezed +class FieldSwitchState with _$FieldSwitchState { + const factory FieldSwitchState({ + required String gridId, + required Field field, + required Uint8List typeOptionData, + }) = _FieldSwitchState; + + factory FieldSwitchState.initial(SwitchFieldContext switchContext) => FieldSwitchState( + gridId: switchContext.gridId, + field: switchContext.field, + typeOptionData: Uint8List.fromList(switchContext.typeOptionData), + ); +} + +class SwitchFieldContext { + final String gridId; + final Field field; + final List typeOptionData; + + SwitchFieldContext(this.gridId, this.field, this.typeOptionData); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/grid_header_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/grid_header_bloc.dart new file mode 100644 index 0000000000..4145e23804 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/grid_header_bloc.dart @@ -0,0 +1,72 @@ +import 'package:app_flowy/workspace/application/grid/data.dart'; +import 'package:app_flowy/workspace/application/grid/field/grid_listenr.dart'; +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'field_service.dart'; + +part 'grid_header_bloc.freezed.dart'; + +class GridHeaderBloc extends Bloc { + final FieldService service; + final GridFieldsListener _fieldListener; + + GridHeaderBloc({ + required GridHeaderData data, + required this.service, + }) : _fieldListener = GridFieldsListener(gridId: data.gridId), + super(GridHeaderState.initial(data.fields)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialHeader value) async { + _startListening(); + }, + createField: (_CreateField value) {}, + insertField: (_InsertField value) {}, + didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) { + value.fields.retainWhere((field) => field.visibility); + emit(state.copyWith(fields: value.fields)); + }, + ); + }, + ); + } + + Future _startListening() async { + _fieldListener.updateFieldsNotifier.addPublishListener((result) { + result.fold( + (fields) => add(GridHeaderEvent.didReceiveFieldUpdate(fields)), + (err) => Log.error(err), + ); + }); + + _fieldListener.start(); + } + + @override + Future close() async { + await _fieldListener.stop(); + return super.close(); + } +} + +@freezed +class GridHeaderEvent with _$GridHeaderEvent { + const factory GridHeaderEvent.initial() = _InitialHeader; + const factory GridHeaderEvent.createField() = _CreateField; + const factory GridHeaderEvent.insertField({required bool onLeft}) = _InsertField; + const factory GridHeaderEvent.didReceiveFieldUpdate(List fields) = _DidReceiveFieldUpdate; +} + +@freezed +class GridHeaderState with _$GridHeaderState { + const factory GridHeaderState({required List fields}) = _GridHeaderState; + + factory GridHeaderState.initial(List fields) { + fields.retainWhere((field) => field.visibility); + return GridHeaderState(fields: fields); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/grid_header_listener.dart b/frontend/app_flowy/lib/workspace/application/grid/field/grid_header_listener.dart new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/grid_listenr.dart b/frontend/app_flowy/lib/workspace/application/grid/field/grid_listenr.dart new file mode 100644 index 0000000000..434b343d8d --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/grid_listenr.dart @@ -0,0 +1,42 @@ +import 'package:dartz/dartz.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart'; +import 'package:flowy_infra/notifier.dart'; +import 'dart:async'; +import 'dart:typed_data'; +import 'package:app_flowy/core/notification_helper.dart'; + +typedef UpdateFieldNotifiedValue = Either, FlowyError>; + +class GridFieldsListener { + final String gridId; + PublishNotifier updateFieldsNotifier = PublishNotifier(); + GridNotificationListener? _listener; + GridFieldsListener({required this.gridId}); + + void start() { + _listener = GridNotificationListener( + objectId: gridId, + handler: _handler, + ); + } + + void _handler(GridNotification ty, Either result) { + switch (ty) { + case GridNotification.DidUpdateGrid: + result.fold( + (payload) => updateFieldsNotifier.value = left(RepeatedField.fromBuffer(payload).items), + (error) => updateFieldsNotifier.value = right(error), + ); + break; + default: + break; + } + } + + Future stop() async { + await _listener?.stop(); + updateFieldsNotifier.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/type_option/date_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/date_bloc.dart new file mode 100644 index 0000000000..0cf842a171 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/date_bloc.dart @@ -0,0 +1,57 @@ +import 'package:flowy_sdk/protobuf/flowy-grid/date_type_option.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'package:protobuf/protobuf.dart'; +part 'date_bloc.freezed.dart'; + +class DateTypeOptionBloc extends Bloc { + DateTypeOptionBloc({required DateTypeOption typeOption}) : super(DateTypeOptionState.initial(typeOption)) { + on( + (event, emit) async { + event.map( + didSelectDateFormat: (_DidSelectDateFormat value) { + emit(state.copyWith(typeOption: _updateDateFormat(value.format))); + }, + didSelectTimeFormat: (_DidSelectTimeFormat value) { + emit(state.copyWith(typeOption: _updateTimeFormat(value.format))); + }, + ); + }, + ); + } + + DateTypeOption _updateTimeFormat(TimeFormat format) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + typeOption.timeFormat = format; + }); + } + + DateTypeOption _updateDateFormat(DateFormat format) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + typeOption.dateFormat = format; + }); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +class DateTypeOptionEvent with _$DateTypeOptionEvent { + const factory DateTypeOptionEvent.didSelectDateFormat(DateFormat format) = _DidSelectDateFormat; + const factory DateTypeOptionEvent.didSelectTimeFormat(TimeFormat format) = _DidSelectTimeFormat; +} + +@freezed +class DateTypeOptionState with _$DateTypeOptionState { + const factory DateTypeOptionState({ + required DateTypeOption typeOption, + }) = _DateTypeOptionState; + + factory DateTypeOptionState.initial(DateTypeOption typeOption) => DateTypeOptionState(typeOption: typeOption); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/type_option/edit_option_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/edit_option_bloc.dart new file mode 100644 index 0000000000..ccd0c47bab --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/edit_option_bloc.dart @@ -0,0 +1,66 @@ +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'package:protobuf/protobuf.dart'; +import 'package:dartz/dartz.dart'; +part 'edit_option_bloc.freezed.dart'; + +class EditOptionBloc extends Bloc { + EditOptionBloc({required SelectOption option}) : super(EditOptionState.initial(option)) { + on( + (event, emit) async { + event.map( + updateName: (_UpdateName value) { + emit(state.copyWith(option: _updateName(value.name))); + }, + updateColor: (_UpdateColor value) { + emit(state.copyWith(option: _updateColor(value.color))); + }, + delete: (_Delete value) { + emit(state.copyWith(deleted: const Some(true))); + }, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } + + SelectOption _updateColor(SelectOptionColor color) { + state.option.freeze(); + return state.option.rebuild((option) { + option.color = color; + }); + } + + SelectOption _updateName(String name) { + state.option.freeze(); + return state.option.rebuild((option) { + option.name = name; + }); + } +} + +@freezed +class EditOptionEvent with _$EditOptionEvent { + const factory EditOptionEvent.updateName(String name) = _UpdateName; + const factory EditOptionEvent.updateColor(SelectOptionColor color) = _UpdateColor; + const factory EditOptionEvent.delete() = _Delete; +} + +@freezed +class EditOptionState with _$EditOptionState { + const factory EditOptionState({ + required SelectOption option, + required Option deleted, + }) = _EditOptionState; + + factory EditOptionState.initial(SelectOption option) => EditOptionState( + option: option, + deleted: none(), + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/type_option/multi_select_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/multi_select_bloc.dart new file mode 100644 index 0000000000..c5a55e20e1 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/multi_select_bloc.dart @@ -0,0 +1,89 @@ +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'package:protobuf/protobuf.dart'; +import 'type_option_service.dart'; + +part 'multi_select_bloc.freezed.dart'; + +class MultiSelectTypeOptionBloc extends Bloc { + final TypeOptionService service; + + MultiSelectTypeOptionBloc(MultiSelectTypeOption typeOption, String fieldId) + : service = TypeOptionService(fieldId: fieldId), + super(MultiSelectTypeOptionState.initial(typeOption)) { + on( + (event, emit) async { + await event.map( + createOption: (_CreateOption value) async { + final result = await service.newOption(value.optionName); + result.fold( + (option) { + emit(state.copyWith(typeOption: _insertOption(option))); + }, + (err) => Log.error(err), + ); + }, + updateOption: (_UpdateOption value) async { + emit(state.copyWith(typeOption: _updateOption(value.option))); + }, + deleteOption: (_DeleteOption value) { + emit(state.copyWith(typeOption: _deleteOption(value.option))); + }, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } + + MultiSelectTypeOption _insertOption(SelectOption option) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + typeOption.options.insert(0, option); + }); + } + + MultiSelectTypeOption _updateOption(SelectOption option) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + final index = typeOption.options.indexWhere((element) => element.id == option.id); + if (index != -1) { + typeOption.options[index] = option; + } + }); + } + + MultiSelectTypeOption _deleteOption(SelectOption option) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + final index = typeOption.options.indexWhere((element) => element.id == option.id); + if (index != -1) { + typeOption.options.removeAt(index); + } + }); + } +} + +@freezed +class MultiSelectTypeOptionEvent with _$MultiSelectTypeOptionEvent { + const factory MultiSelectTypeOptionEvent.createOption(String optionName) = _CreateOption; + const factory MultiSelectTypeOptionEvent.updateOption(SelectOption option) = _UpdateOption; + const factory MultiSelectTypeOptionEvent.deleteOption(SelectOption option) = _DeleteOption; +} + +@freezed +class MultiSelectTypeOptionState with _$MultiSelectTypeOptionState { + const factory MultiSelectTypeOptionState({ + required MultiSelectTypeOption typeOption, + }) = _MultiSelectTypeOptionState; + + factory MultiSelectTypeOptionState.initial(MultiSelectTypeOption typeOption) => MultiSelectTypeOptionState( + typeOption: typeOption, + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/type_option/number_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/number_bloc.dart new file mode 100644 index 0000000000..a655ebc1e8 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/number_bloc.dart @@ -0,0 +1,49 @@ +import 'package:flowy_sdk/protobuf/flowy-grid/number_type_option.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'package:protobuf/protobuf.dart'; + +part 'number_bloc.freezed.dart'; + +class NumberTypeOptionBloc extends Bloc { + NumberTypeOptionBloc({required NumberTypeOption typeOption}) : super(NumberTypeOptionState.initial(typeOption)) { + on( + (event, emit) async { + event.map( + didSelectFormat: (_DidSelectFormat value) { + emit(state.copyWith(typeOption: _updateNumberFormat(value.format))); + }, + ); + }, + ); + } + + NumberTypeOption _updateNumberFormat(NumberFormat format) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + typeOption.format = format; + }); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +class NumberTypeOptionEvent with _$NumberTypeOptionEvent { + const factory NumberTypeOptionEvent.didSelectFormat(NumberFormat format) = _DidSelectFormat; +} + +@freezed +class NumberTypeOptionState with _$NumberTypeOptionState { + const factory NumberTypeOptionState({ + required NumberTypeOption typeOption, + }) = _NumberTypeOptionState; + + factory NumberTypeOptionState.initial(NumberTypeOption typeOption) => NumberTypeOptionState( + typeOption: typeOption, + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/type_option/option_pannel_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/option_pannel_bloc.dart new file mode 100644 index 0000000000..715cde72d7 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/option_pannel_bloc.dart @@ -0,0 +1,65 @@ +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'package:dartz/dartz.dart'; +part 'option_pannel_bloc.freezed.dart'; + +class OptionPannelBloc extends Bloc { + OptionPannelBloc({required List options}) : super(OptionPannelState.initial(options)) { + on( + (event, emit) async { + await event.map( + createOption: (_CreateOption value) async { + emit(state.copyWith(isEditingOption: false, newOptionName: Some(value.optionName))); + }, + beginAddingOption: (_BeginAddingOption value) { + emit(state.copyWith(isEditingOption: true, newOptionName: none())); + }, + endAddingOption: (_EndAddingOption value) { + emit(state.copyWith(isEditingOption: false, newOptionName: none())); + }, + updateOption: (_UpdateOption value) { + emit(state.copyWith(updateOption: Some(value.option))); + }, + deleteOption: (_DeleteOption value) { + emit(state.copyWith(deleteOption: Some(value.option))); + }, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +class OptionPannelEvent with _$OptionPannelEvent { + const factory OptionPannelEvent.createOption(String optionName) = _CreateOption; + const factory OptionPannelEvent.beginAddingOption() = _BeginAddingOption; + const factory OptionPannelEvent.endAddingOption() = _EndAddingOption; + const factory OptionPannelEvent.updateOption(SelectOption option) = _UpdateOption; + const factory OptionPannelEvent.deleteOption(SelectOption option) = _DeleteOption; +} + +@freezed +class OptionPannelState with _$OptionPannelState { + const factory OptionPannelState({ + required List options, + required bool isEditingOption, + required Option newOptionName, + required Option updateOption, + required Option deleteOption, + }) = _OptionPannelState; + + factory OptionPannelState.initial(List options) => OptionPannelState( + options: options, + isEditingOption: false, + newOptionName: none(), + updateOption: none(), + deleteOption: none(), + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/type_option/single_select_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/single_select_bloc.dart new file mode 100644 index 0000000000..82e4bba790 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/single_select_bloc.dart @@ -0,0 +1,93 @@ +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'package:protobuf/protobuf.dart'; +import 'type_option_service.dart'; + +part 'single_select_bloc.freezed.dart'; + +class SingleSelectTypeOptionBloc extends Bloc { + final TypeOptionService service; + + SingleSelectTypeOptionBloc( + SingleSelectTypeOption typeOption, + String fieldId, + ) : service = TypeOptionService(fieldId: fieldId), + super( + SingleSelectTypeOptionState.initial(typeOption), + ) { + on( + (event, emit) async { + await event.map( + createOption: (_CreateOption value) async { + final result = await service.newOption(value.optionName); + result.fold( + (option) { + emit(state.copyWith(typeOption: _insertOption(option))); + }, + (err) => Log.error(err), + ); + }, + updateOption: (_UpdateOption value) async { + emit(state.copyWith(typeOption: _updateOption(value.option))); + }, + deleteOption: (_DeleteOption value) { + emit(state.copyWith(typeOption: _deleteOption(value.option))); + }, + ); + }, + ); + } + + @override + Future close() async { + return super.close(); + } + + SingleSelectTypeOption _insertOption(SelectOption option) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + typeOption.options.insert(0, option); + }); + } + + SingleSelectTypeOption _updateOption(SelectOption option) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + final index = typeOption.options.indexWhere((element) => element.id == option.id); + if (index != -1) { + typeOption.options[index] = option; + } + }); + } + + SingleSelectTypeOption _deleteOption(SelectOption option) { + state.typeOption.freeze(); + return state.typeOption.rebuild((typeOption) { + final index = typeOption.options.indexWhere((element) => element.id == option.id); + if (index != -1) { + typeOption.options.removeAt(index); + } + }); + } +} + +@freezed +class SingleSelectTypeOptionEvent with _$SingleSelectTypeOptionEvent { + const factory SingleSelectTypeOptionEvent.createOption(String optionName) = _CreateOption; + const factory SingleSelectTypeOptionEvent.updateOption(SelectOption option) = _UpdateOption; + const factory SingleSelectTypeOptionEvent.deleteOption(SelectOption option) = _DeleteOption; +} + +@freezed +class SingleSelectTypeOptionState with _$SingleSelectTypeOptionState { + const factory SingleSelectTypeOptionState({ + required SingleSelectTypeOption typeOption, + }) = _SingleSelectTypeOptionState; + + factory SingleSelectTypeOptionState.initial(SingleSelectTypeOption typeOption) => SingleSelectTypeOptionState( + typeOption: typeOption, + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/field/type_option/type_option_service.dart b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/type_option_service.dart new file mode 100644 index 0000000000..0f0c2f067d --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/field/type_option/type_option_service.dart @@ -0,0 +1,17 @@ +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-grid/cell_entities.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; + +class TypeOptionService { + final String fieldId; + TypeOptionService({ + required this.fieldId, + }); + + Future> newOption(String name, {bool selected = false}) { + final payload = SelectOptionName.create()..name = name; + return GridEventNewSelectOption(payload).send(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart index 1db06d815c..4b63ec0251 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart @@ -1,12 +1,14 @@ import 'dart:async'; import 'package:dartz/dartz.dart'; +import 'package:flowy_sdk/log.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/protobuf.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:equatable/equatable.dart'; import 'grid_block_service.dart'; -import 'grid_listenr.dart'; +import 'field/grid_listenr.dart'; import 'grid_service.dart'; part 'grid_bloc.freezed.dart'; @@ -14,17 +16,17 @@ part 'grid_bloc.freezed.dart'; class GridBloc extends Bloc { final View view; final GridService service; - late GridListener _gridListener; + late GridFieldsListener _fieldListener; late GridBlockService _blockService; GridBloc({required this.view, required this.service}) : super(GridState.initial()) { - _gridListener = GridListener(); + _fieldListener = GridFieldsListener(gridId: view.id); on( (event, emit) async { await event.map( initial: (InitialGrid value) async { - await _loadGrid(emit); + await _initGrid(emit); }, createRow: (_CreateRow value) { service.createRow(gridId: view.id); @@ -32,9 +34,12 @@ class GridBloc extends Bloc { delete: (_Delete value) {}, rename: (_Rename value) {}, updateDesc: (_Desc value) {}, - didLoadRows: (_DidLoadRows value) { + didReceiveRowUpdate: (_DidReceiveRowUpdate value) { emit(state.copyWith(rows: value.rows)); }, + didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) { + emit(state.copyWith(fields: value.fields)); + }, ); }, ); @@ -42,22 +47,39 @@ class GridBloc extends Bloc { @override Future close() async { - await _gridListener.stop(); + await _fieldListener.stop(); await _blockService.stop(); return super.close(); } - Future _startGridListening() async { - _blockService.didLoadRowscallback = (rows) { - add(GridEvent.didLoadRows(rows)); - }; + Future _initGrid(Emitter emit) async { + _fieldListener.updateFieldsNotifier.addPublishListener((result) { + result.fold( + (fields) => add(GridEvent.didReceiveFieldUpdate(fields)), + (err) => Log.error(err), + ); + }); + _fieldListener.start(); - _gridListener.start(); + await _loadGrid(emit); + } + + Future _initGridBlock(Grid grid) async { + _blockService = GridBlockService( + gridId: grid.id, + blockOrders: grid.blockOrders, + ); + + _blockService.blocksUpdateNotifier?.addPublishListener((result) { + result.fold( + (blockMap) => add(GridEvent.didReceiveRowUpdate(_buildRows(blockMap))), + (err) => Log.error('$err'), + ); + }); } Future _loadGrid(Emitter emit) async { final result = await service.openGrid(gridId: view.id); - return Future( () => result.fold( (grid) async => await _loadFields(grid, emit), @@ -70,60 +92,58 @@ class GridBloc extends Bloc { final result = await service.getFields(gridId: grid.id, fieldOrders: grid.fieldOrders); return Future( () => result.fold( - (fields) => _loadGridBlocks(grid, fields.items, emit), + (fields) { + _initGridBlock(grid); + emit(state.copyWith( + grid: Some(grid), + fields: fields.items, + loadingState: GridLoadingState.finish(left(unit)), + )); + }, (err) => emit(state.copyWith(loadingState: GridLoadingState.finish(right(err)))), ), ); } - Future _loadGridBlocks(Grid grid, List fields, Emitter emit) async { - final result = await service.getGridBlocks(gridId: grid.id, blockOrders: grid.blockOrders); - result.fold( - (repeatedGridBlock) { - final gridBlocks = repeatedGridBlock.items; - final gridId = view.id; - _blockService = GridBlockService( - gridId: gridId, - fields: fields, - gridBlocks: gridBlocks, - ); - final rows = _blockService.rows(); - - _startGridListening(); - emit(state.copyWith( - grid: Some(grid), - fields: Some(fields), - rows: rows, - loadingState: GridLoadingState.finish(left(unit)), - )); - }, - (err) => emit(state.copyWith(loadingState: GridLoadingState.finish(right(err)), rows: [])), - ); + List _buildRows(GridBlockMap blockMap) { + List rows = []; + blockMap.forEach((_, GridBlock gridBlock) { + rows.addAll(gridBlock.rowOrders.map( + (rowOrder) => GridBlockRow( + gridId: view.id, + blockId: gridBlock.id, + rowId: rowOrder.rowId, + height: rowOrder.height.toDouble(), + ), + )); + }); + return rows; } } @freezed -abstract class GridEvent with _$GridEvent { +class GridEvent with _$GridEvent { const factory GridEvent.initial() = InitialGrid; const factory GridEvent.rename(String gridId, String name) = _Rename; const factory GridEvent.updateDesc(String gridId, String desc) = _Desc; const factory GridEvent.delete(String gridId) = _Delete; const factory GridEvent.createRow() = _CreateRow; - const factory GridEvent.didLoadRows(List rows) = _DidLoadRows; + const factory GridEvent.didReceiveRowUpdate(List rows) = _DidReceiveRowUpdate; + const factory GridEvent.didReceiveFieldUpdate(List fields) = _DidReceiveFieldUpdate; } @freezed -abstract class GridState with _$GridState { +class GridState with _$GridState { const factory GridState({ required GridLoadingState loadingState, - required Option> fields, - required List rows, + required List fields, + required List rows, required Option grid, }) = _GridState; factory GridState.initial() => GridState( loadingState: const _Loading(), - fields: none(), + fields: [], rows: [], grid: none(), ); @@ -134,3 +154,46 @@ class GridLoadingState with _$GridLoadingState { const factory GridLoadingState.loading() = _Loading; const factory GridLoadingState.finish(Either successOrFail) = _Finish; } + +class GridBlockRow { + final String gridId; + final String rowId; + final String blockId; + final double height; + + const GridBlockRow({ + required this.gridId, + required this.rowId, + required this.blockId, + required this.height, + }); +} + +class RowData extends Equatable { + final String gridId; + final String rowId; + final String blockId; + final List fields; + final double height; + + const RowData({ + required this.gridId, + required this.rowId, + required this.blockId, + required this.fields, + required this.height, + }); + + factory RowData.fromBlockRow(GridBlockRow row, List fields) { + return RowData( + gridId: row.gridId, + rowId: row.rowId, + blockId: row.blockId, + fields: fields, + height: row.height, + ); + } + + @override + List get props => [rowId, fields]; +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_block_service.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_block_service.dart index 3672a910f4..e6ecad0949 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_block_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_block_service.dart @@ -1,85 +1,81 @@ import 'dart:collection'; import 'package:dartz/dartz.dart'; +import 'package:flowy_sdk/dispatch/dispatch.dart'; +import 'package:flowy_sdk/log.dart'; import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; -import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart'; -import 'package:flowy_sdk/rust_stream.dart'; import 'package:flowy_infra/notifier.dart'; import 'dart:async'; import 'dart:typed_data'; import 'package:app_flowy/core/notification_helper.dart'; -import 'grid_service.dart'; - -typedef DidLoadRowsCallback = void Function(List); -typedef GridBlockUpdateNotifiedValue = Either; +typedef GridBlockMap = LinkedHashMap; +typedef BlocksUpdateNotifierValue = Either; class GridBlockService { String gridId; - List fields; - LinkedHashMap blockMap = LinkedHashMap(); + GridBlockMap blockMap = GridBlockMap(); late GridBlockListener _blockListener; - DidLoadRowsCallback? didLoadRowscallback; + PublishNotifier? blocksUpdateNotifier = PublishNotifier(); - GridBlockService({required this.gridId, required this.fields, required List gridBlocks}) { - for (final gridBlock in gridBlocks) { - blockMap[gridBlock.blockId] = gridBlock; - } + GridBlockService({required this.gridId, required List blockOrders}) { + _loadGridBlocks(blockOrders); _blockListener = GridBlockListener(gridId: gridId); _blockListener.blockUpdateNotifier.addPublishListener((result) { - result.fold((blockId) { - // - }, (err) => null); + result.fold( + (blockOrder) => _loadGridBlocks(blockOrder), + (err) => Log.error(err), + ); }); - } - - List rows() { - List rows = []; - blockMap.forEach((_, GridBlock gridBlock) { - rows.addAll(gridBlock.rowOrders.map( - (rowOrder) => GridRowData( - gridId: gridId, - fields: fields, - blockId: gridBlock.blockId, - rowId: rowOrder.rowId, - height: rowOrder.height.toDouble(), - ), - )); - }); - return rows; + _blockListener.start(); } Future stop() async { await _blockListener.stop(); + blocksUpdateNotifier?.dispose(); + blocksUpdateNotifier = null; + } + + void _loadGridBlocks(List blockOrders) { + final payload = QueryGridBlocksPayload.create() + ..gridId = gridId + ..blockOrders.addAll(blockOrders); + + GridEventGetGridBlocks(payload).send().then((result) { + result.fold( + (repeatedBlocks) { + for (final gridBlock in repeatedBlocks.items) { + blockMap[gridBlock.id] = gridBlock; + } + blocksUpdateNotifier?.value = left(blockMap); + }, + (err) => blocksUpdateNotifier?.value = right(err), + ); + }); } } class GridBlockListener { final String gridId; - PublishNotifier blockUpdateNotifier = PublishNotifier(); - StreamSubscription? _subscription; - late GridNotificationParser _parser; + PublishNotifier, FlowyError>> blockUpdateNotifier = PublishNotifier(comparable: null); + GridNotificationListener? _listener; GridBlockListener({required this.gridId}); void start() { - _parser = GridNotificationParser( - id: gridId, - callback: (ty, result) { - _handleObservableType(ty, result); - }, + _listener = GridNotificationListener( + objectId: gridId, + handler: _handler, ); - - _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable)); } - void _handleObservableType(GridNotification ty, Either result) { + void _handler(GridNotification ty, Either result) { switch (ty) { - case GridNotification.GridDidUpdateBlock: + case GridNotification.DidUpdateBlock: result.fold( - (payload) => blockUpdateNotifier.value = left(GridBlockId.fromBuffer(payload)), + (payload) => blockUpdateNotifier.value = left([GridBlockOrder.fromBuffer(payload)]), (error) => blockUpdateNotifier.value = right(error), ); break; @@ -90,7 +86,7 @@ class GridBlockListener { } Future stop() async { - await _subscription?.cancel(); + await _listener?.stop(); blockUpdateNotifier.dispose(); } } diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_listenr.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_listenr.dart deleted file mode 100644 index 55e29d915c..0000000000 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_listenr.dart +++ /dev/null @@ -1,4 +0,0 @@ -class GridListener { - void start() {} - Future stop() async {} -} diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart index 506401706b..9bb2e36e5f 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_service.dart @@ -3,7 +3,6 @@ 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'; -import 'package:equatable/equatable.dart'; class GridService { Future> openGrid({required String gridId}) async { @@ -13,9 +12,9 @@ class GridService { return GridEventGetGridData(payload).send(); } - Future> createRow({required String gridId, Option? upperRowId}) { + Future> createRow({required String gridId, Option? startRowId}) { CreateRowPayload payload = CreateRowPayload.create()..gridId = gridId; - upperRowId?.fold(() => null, (id) => payload.startRowId = id); + startRowId?.fold(() => null, (id) => payload.startRowId = id); return GridEventCreateRow(payload).send(); } @@ -34,22 +33,3 @@ class GridService { return GridEventGetFields(payload).send(); } } - -class GridRowData extends Equatable { - final String gridId; - final String rowId; - final String blockId; - final List fields; - final double height; - - const GridRowData({ - required this.gridId, - required this.rowId, - required this.blockId, - required this.fields, - required this.height, - }); - - @override - List get props => [rowId]; -} diff --git a/frontend/app_flowy/lib/workspace/application/grid/prelude.dart b/frontend/app_flowy/lib/workspace/application/grid/prelude.dart index d28df04c62..f941b01056 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/prelude.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/prelude.dart @@ -1,13 +1,29 @@ export 'grid_bloc.dart'; -export 'row_bloc.dart'; -export 'row_service.dart'; +export 'row/row_bloc.dart'; +export 'row/row_service.dart'; export 'grid_service.dart'; export 'data.dart'; -export 'column_service.dart'; -export 'column_bloc.dart'; + +// Field +export 'field/field_service.dart'; +export 'field/grid_header_bloc.dart'; +export 'field/action_sheet_bloc.dart'; +export 'field/field_editor_bloc.dart'; +export 'field/field_switch_bloc.dart'; + +// Field Type Option +export 'field/type_option/date_bloc.dart'; +export 'field/type_option/number_bloc.dart'; +export 'field/type_option/single_select_bloc.dart'; + +// Cell export 'cell_bloc/text_cell_bloc.dart'; export 'cell_bloc/number_cell_bloc.dart'; export 'cell_bloc/selection_cell_bloc.dart'; export 'cell_bloc/date_cell_bloc.dart'; export 'cell_bloc/checkbox_cell_bloc.dart'; export 'cell_bloc/cell_service.dart'; + +// Setting +export 'setting/setting_bloc.dart'; +export 'setting/property_bloc.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/grid/row/row_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/row/row_bloc.dart new file mode 100644 index 0000000000..418cb23e88 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/row/row_bloc.dart @@ -0,0 +1,151 @@ +import 'dart:collection'; + +import 'package:app_flowy/workspace/application/grid/field/grid_listenr.dart'; +import 'package:app_flowy/workspace/application/grid/grid_bloc.dart'; +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'row_listener.dart'; +import 'row_service.dart'; +import 'package:dartz/dartz.dart'; + +part 'row_bloc.freezed.dart'; + +typedef CellDataMap = LinkedHashMap; + +class RowBloc extends Bloc { + final RowService rowService; + final RowListener rowlistener; + final GridFieldsListener fieldListener; + + RowBloc({required RowData rowData, required this.rowlistener}) + : rowService = RowService( + gridId: rowData.gridId, + blockId: rowData.blockId, + rowId: rowData.rowId, + ), + fieldListener = GridFieldsListener( + gridId: rowData.gridId, + ), + super(RowState.initial(rowData)) { + on( + (event, emit) async { + await event.map( + initial: (_InitialRow value) async { + _startListening(); + await _loadRow(emit); + }, + createRow: (_CreateRow value) { + rowService.createRow(); + }, + didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) async { + await _handleFieldUpdate(emit, value); + }, + didUpdateRow: (_DidUpdateRow value) async { + _handleRowUpdate(value, emit); + }, + ); + }, + ); + } + + void _handleRowUpdate(_DidUpdateRow value, Emitter emit) { + final CellDataMap cellDataMap = _makeCellDatas(value.row, state.fields); + emit(state.copyWith( + row: Future(() => Some(value.row)), + cellDataMap: Some(cellDataMap), + )); + } + + Future _handleFieldUpdate(Emitter emit, _DidReceiveFieldUpdate value) async { + final optionRow = await state.row; + final CellDataMap cellDataMap = optionRow.fold( + () => CellDataMap.identity(), + (row) => _makeCellDatas(row, value.fields), + ); + + emit(state.copyWith( + fields: value.fields, + cellDataMap: Some(cellDataMap), + )); + } + + @override + Future close() async { + await rowlistener.stop(); + await fieldListener.stop(); + return super.close(); + } + + Future _startListening() async { + rowlistener.updateRowNotifier.addPublishListener((result) { + result.fold( + (row) => add(RowEvent.didUpdateRow(row)), + (err) => Log.error(err), + ); + }); + + fieldListener.updateFieldsNotifier.addPublishListener((result) { + result.fold( + (fields) => add(RowEvent.didReceiveFieldUpdate(fields)), + (err) => Log.error(err), + ); + }); + + rowlistener.start(); + fieldListener.start(); + } + + Future _loadRow(Emitter emit) async { + rowService.getRow().then((result) { + return result.fold( + (row) => add(RowEvent.didUpdateRow(row)), + (err) => Log.error(err), + ); + }); + } + + CellDataMap _makeCellDatas(Row row, List fields) { + var map = CellDataMap.new(); + for (final field in fields) { + if (field.visibility) { + map[field.id] = CellData( + rowId: row.id, + gridId: rowService.gridId, + cell: row.cellByFieldId[field.id], + field: field, + ); + } + } + return map; + } +} + +@freezed +class RowEvent with _$RowEvent { + const factory RowEvent.initial() = _InitialRow; + const factory RowEvent.createRow() = _CreateRow; + const factory RowEvent.didReceiveFieldUpdate(List fields) = _DidReceiveFieldUpdate; + const factory RowEvent.didUpdateRow(Row row) = _DidUpdateRow; +} + +@freezed +class RowState with _$RowState { + const factory RowState({ + required String rowId, + required double rowHeight, + required List fields, + required Future> row, + required Option cellDataMap, + }) = _RowState; + + factory RowState.initial(RowData data) => RowState( + rowId: data.rowId, + rowHeight: data.height, + fields: data.fields, + row: Future(() => none()), + cellDataMap: none(), + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/row/row_listener.dart b/frontend/app_flowy/lib/workspace/application/grid/row/row_listener.dart new file mode 100644 index 0000000000..716d252802 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/row/row_listener.dart @@ -0,0 +1,41 @@ +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/dart_notification.pb.dart'; +import 'package:flowy_infra/notifier.dart'; +import 'dart:async'; +import 'dart:typed_data'; +import 'package:app_flowy/core/notification_helper.dart'; +import 'package:dartz/dartz.dart'; + +typedef UpdateRowNotifiedValue = Either; +typedef UpdateFieldNotifiedValue = Either, FlowyError>; + +class RowListener { + final String rowId; + PublishNotifier updateRowNotifier = PublishNotifier(); + GridNotificationListener? _listener; + + RowListener({required this.rowId}); + + void start() { + _listener = GridNotificationListener(objectId: rowId, handler: _handler); + } + + void _handler(GridNotification ty, Either result) { + switch (ty) { + case GridNotification.DidUpdateRow: + result.fold( + (payload) => updateRowNotifier.value = left(Row.fromBuffer(payload)), + (error) => updateRowNotifier.value = right(error), + ); + break; + default: + break; + } + } + + Future stop() async { + await _listener?.stop(); + updateRowNotifier.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/row_service.dart b/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart similarity index 59% rename from frontend/app_flowy/lib/workspace/application/grid/row_service.dart rename to frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart index 013ae3fb1c..8b2548b1b2 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/row_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart @@ -1,45 +1,47 @@ import 'package:dartz/dartz.dart'; +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 'grid_service.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/row_entities.pb.dart'; class RowService { - final GridRowData rowData; + final String gridId; + final String rowId; + final String blockId; - RowService(this.rowData); + RowService({required this.gridId, required this.rowId, required this.blockId}); Future> createRow() { CreateRowPayload payload = CreateRowPayload.create() - ..gridId = rowData.gridId - ..startRowId = rowData.rowId; + ..gridId = gridId + ..startRowId = rowId; return GridEventCreateRow(payload).send(); } Future> getRow() { - QueryRowPayload payload = QueryRowPayload.create() - ..gridId = rowData.gridId - ..blockId = rowData.blockId - ..rowId = rowData.rowId; + final payload = RowIdentifierPayload.create() + ..gridId = gridId + ..rowId = rowId; return GridEventGetRow(payload).send(); } } -class GridCellData { +class CellData extends Equatable { final String gridId; final String rowId; - final String blockId; final Field field; final Cell? cell; - GridCellData({ + const CellData({ required this.rowId, required this.gridId, - required this.blockId, required this.field, required this.cell, }); + + @override + List get props => [cell, field]; } diff --git a/frontend/app_flowy/lib/workspace/application/grid/row_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/row_bloc.dart deleted file mode 100644 index bf13c682d7..0000000000 --- a/frontend/app_flowy/lib/workspace/application/grid/row_bloc.dart +++ /dev/null @@ -1,113 +0,0 @@ -import 'package:flowy_sdk/log.dart'; -import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'dart:async'; -import 'grid_service.dart'; -import 'row_listener.dart'; -import 'row_service.dart'; - -part 'row_bloc.freezed.dart'; - -class RowBloc extends Bloc { - final RowService rowService; - final RowListener listener; - - RowBloc({required this.rowService, required this.listener}) : super(RowState.initial(rowService.rowData)) { - on( - (event, emit) async { - await event.map( - initial: (_InitialRow value) async { - _startRowListening(); - await _loadCellDatas(emit); - }, - createRow: (_CreateRow value) { - rowService.createRow(); - }, - activeRow: (_ActiveRow value) { - emit(state.copyWith(active: true)); - }, - disactiveRow: (_DisactiveRow value) { - emit(state.copyWith(active: false)); - }, - ); - }, - ); - } - - @override - Future close() async { - await listener.close(); - return super.close(); - } - - Future _startRowListening() async { - listener.updateRowNotifier.addPublishListener((result) { - result.fold((row) { - // - }, (err) => null); - }); - - listener.updateCellNotifier.addPublishListener((result) { - result.fold((repeatedCvell) { - // - Log.info("$repeatedCvell"); - }, (r) => null); - }); - - listener.start(); - } - - Future _loadCellDatas(Emitter emit) async { - final result = await rowService.getRow(); - result.fold( - (row) { - emit(state.copyWith( - cellDatas: makeGridCellDatas(row), - rowHeight: row.height.toDouble(), - )); - }, - (e) => Log.error(e), - ); - } - - List makeGridCellDatas(Row row) { - return rowService.rowData.fields.map((field) { - final cell = row.cellByFieldId[field.id]; - final rowData = rowService.rowData; - - return GridCellData( - rowId: row.id, - gridId: rowData.gridId, - blockId: rowData.blockId, - cell: cell, - field: field, - ); - }).toList(); - } -} - -@freezed -abstract class RowEvent with _$RowEvent { - const factory RowEvent.initial() = _InitialRow; - const factory RowEvent.createRow() = _CreateRow; - const factory RowEvent.activeRow() = _ActiveRow; - const factory RowEvent.disactiveRow() = _DisactiveRow; -} - -@freezed -abstract class RowState with _$RowState { - const factory RowState({ - required String rowId, - required double rowHeight, - required List cellDatas, - required bool active, - }) = _RowState; - - factory RowState.initial(GridRowData data) => RowState( - rowId: data.rowId, - active: false, - rowHeight: data.height, - cellDatas: [], - ); -} diff --git a/frontend/app_flowy/lib/workspace/application/grid/row_listener.dart b/frontend/app_flowy/lib/workspace/application/grid/row_listener.dart deleted file mode 100644 index 76a2ba617d..0000000000 --- a/frontend/app_flowy/lib/workspace/application/grid/row_listener.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.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/dart_notification.pb.dart'; -import 'package:flowy_sdk/rust_stream.dart'; -import 'package:flowy_infra/notifier.dart'; -import 'dart:async'; -import 'dart:typed_data'; -import 'package:app_flowy/core/notification_helper.dart'; -import 'package:dartz/dartz.dart'; - -typedef UpdateCellNotifiedValue = Either; -typedef UpdateRowNotifiedValue = Either; - -class RowListener { - final String rowId; - PublishNotifier updateCellNotifier = PublishNotifier(); - PublishNotifier updateRowNotifier = PublishNotifier(); - StreamSubscription? _subscription; - late GridNotificationParser _parser; - - RowListener({required this.rowId}); - - void start() { - _parser = GridNotificationParser( - id: rowId, - callback: (ty, result) { - _handleObservableType(ty, result); - }, - ); - - _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable)); - } - - void _handleObservableType(GridNotification ty, Either result) { - switch (ty) { - case GridNotification.GridDidUpdateCells: - result.fold( - (payload) => updateCellNotifier.value = left(RepeatedCell.fromBuffer(payload)), - (error) => updateCellNotifier.value = right(error), - ); - break; - - default: - break; - } - } - - Future close() async { - await _subscription?.cancel(); - updateCellNotifier.dispose(); - updateRowNotifier.dispose(); - } -} diff --git a/frontend/app_flowy/lib/workspace/application/grid/setting/property_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/setting/property_bloc.dart new file mode 100644 index 0000000000..ab618b0fa9 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/setting/property_bloc.dart @@ -0,0 +1,77 @@ +import 'package:app_flowy/workspace/application/grid/field/field_service.dart'; +import 'package:app_flowy/workspace/application/grid/field/grid_listenr.dart'; +import 'package:flowy_sdk/log.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; + +part 'property_bloc.freezed.dart'; + +class GridPropertyBloc extends Bloc { + final FieldService _service; + final GridFieldsListener _fieldListener; + + GridPropertyBloc({required String gridId, required List fields}) + : _service = FieldService(gridId: gridId), + _fieldListener = GridFieldsListener(gridId: gridId), + super(GridPropertyState.initial(gridId, fields)) { + on( + (event, emit) async { + await event.map( + initial: (_Initial value) { + _startListening(); + }, + setFieldVisibility: (_SetFieldVisibility value) async { + final result = await _service.updateField(fieldId: value.fieldId, visibility: value.visibility); + result.fold( + (l) => null, + (err) => Log.error(err), + ); + }, + didReceiveFieldUpdate: (_DidReceiveFieldUpdate value) { + emit(state.copyWith(fields: value.fields)); + }, + ); + }, + ); + } + + @override + Future close() async { + await _fieldListener.stop(); + return super.close(); + } + + void _startListening() { + _fieldListener.updateFieldsNotifier.addPublishListener((result) { + result.fold( + (fields) { + add(GridPropertyEvent.didReceiveFieldUpdate(fields)); + }, + (err) => Log.error(err), + ); + }); + _fieldListener.start(); + } +} + +@freezed +class GridPropertyEvent with _$GridPropertyEvent { + const factory GridPropertyEvent.initial() = _Initial; + const factory GridPropertyEvent.setFieldVisibility(String fieldId, bool visibility) = _SetFieldVisibility; + const factory GridPropertyEvent.didReceiveFieldUpdate(List fields) = _DidReceiveFieldUpdate; +} + +@freezed +class GridPropertyState with _$GridPropertyState { + const factory GridPropertyState({ + required String gridId, + required List fields, + }) = _GridPropertyState; + + factory GridPropertyState.initial(String gridId, List fields) => GridPropertyState( + gridId: gridId, + fields: fields, + ); +} diff --git a/frontend/app_flowy/lib/workspace/application/grid/setting/setting_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/setting/setting_bloc.dart new file mode 100644 index 0000000000..bea2b87da6 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/application/grid/setting/setting_bloc.dart @@ -0,0 +1,46 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'dart:async'; +import 'package:dartz/dartz.dart'; + +part 'setting_bloc.freezed.dart'; + +class GridSettingBloc extends Bloc { + final String gridId; + GridSettingBloc({required this.gridId}) : super(GridSettingState.initial()) { + on( + (event, emit) async { + event.map(performAction: (_PerformAction value) { + emit(state.copyWith(selectedAction: Some(value.action))); + }); + }, + ); + } + + @override + Future close() async { + return super.close(); + } +} + +@freezed +class GridSettingEvent with _$GridSettingEvent { + const factory GridSettingEvent.performAction(GridSettingAction action) = _PerformAction; +} + +@freezed +class GridSettingState with _$GridSettingState { + const factory GridSettingState({ + required Option selectedAction, + }) = _GridSettingState; + + factory GridSettingState.initial() => GridSettingState( + selectedAction: none(), + ); +} + +enum GridSettingAction { + filter, + sortBy, + properties, +} diff --git a/frontend/app_flowy/lib/workspace/application/home/home_bloc.dart b/frontend/app_flowy/lib/workspace/application/home/home_bloc.dart index e4b0482989..5ed7ce959d 100644 --- a/frontend/app_flowy/lib/workspace/application/home/home_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/home/home_bloc.dart @@ -12,10 +12,10 @@ class HomeBloc extends Bloc { emit(state.copyWith(isLoading: e.isLoading)); }, setEditPannel: (e) async { - emit(state.copyWith(editContext: some(e.editContext))); + emit(state.copyWith(pannelContext: some(e.editContext))); }, dismissEditPannel: (value) async { - emit(state.copyWith(editContext: none())); + emit(state.copyWith(pannelContext: none())); }, forceCollapse: (e) async { emit(state.copyWith(forceCollapse: e.forceCollapse)); @@ -43,12 +43,12 @@ class HomeState with _$HomeState { const factory HomeState({ required bool isLoading, required bool forceCollapse, - required Option editContext, + required Option pannelContext, }) = _HomeState; factory HomeState.initial() => HomeState( isLoading: false, forceCollapse: false, - editContext: none(), + pannelContext: none(), ); } diff --git a/frontend/app_flowy/lib/workspace/application/home/home_listen_bloc.dart b/frontend/app_flowy/lib/workspace/application/home/home_listen_bloc.dart index f3da1af678..0ebb572e17 100644 --- a/frontend/app_flowy/lib/workspace/application/home/home_listen_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/home/home_listen_bloc.dart @@ -1,5 +1,5 @@ import 'package:app_flowy/user/application/user_listener.dart'; -import 'package:flowy_sdk/protobuf/flowy-folder-data-model/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/error-code/error_code.pbenum.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/frontend/app_flowy/lib/workspace/application/trash/trash_bloc.dart b/frontend/app_flowy/lib/workspace/application/trash/trash_bloc.dart index 8bef2e41fd..e6b61af3e2 100644 --- a/frontend/app_flowy/lib/workspace/application/trash/trash_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/trash/trash_bloc.dart @@ -14,7 +14,7 @@ class TrashBloc extends Bloc { TrashBloc({required this.service, required this.listener}) : super(TrashState.init()) { on((event, emit) async { await event.map(initial: (e) async { - listener.startListening(trashUpdated: _listenTrashUpdated); + listener.start(trashUpdated: _listenTrashUpdated); final result = await service.readTrash(); emit(result.fold( (object) => state.copyWith(objects: object.items, successOrFailure: left(unit)), diff --git a/frontend/app_flowy/lib/workspace/application/trash/trash_listener.dart b/frontend/app_flowy/lib/workspace/application/trash/trash_listener.dart index 6a95de958e..36dc982466 100644 --- a/frontend/app_flowy/lib/workspace/application/trash/trash_listener.dart +++ b/frontend/app_flowy/lib/workspace/application/trash/trash_listener.dart @@ -13,12 +13,12 @@ typedef TrashUpdatedCallback = void Function(Either, FlowyError> tra class TrashListener { StreamSubscription? _subscription; TrashUpdatedCallback? _trashUpdated; - late FolderNotificationParser _parser; + FolderNotificationParser? _parser; - void startListening({TrashUpdatedCallback? trashUpdated}) { + void start({TrashUpdatedCallback? trashUpdated}) { _trashUpdated = trashUpdated; _parser = FolderNotificationParser(callback: _bservableCallback); - _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable)); + _subscription = RustStreamReceiver.listen((observable) => _parser?.parse(observable)); } void _bservableCallback(FolderNotification ty, Either result) { @@ -40,6 +40,7 @@ class TrashListener { } Future close() async { + _parser = null; await _subscription?.cancel(); _trashUpdated = null; } diff --git a/frontend/app_flowy/lib/workspace/application/view/view_ext.dart b/frontend/app_flowy/lib/workspace/application/view/view_ext.dart index cf80a820a0..78230e1311 100644 --- a/frontend/app_flowy/lib/workspace/application/view/view_ext.dart +++ b/frontend/app_flowy/lib/workspace/application/view/view_ext.dart @@ -39,7 +39,7 @@ extension ViewExtension on View { thumbnail = "file_icon"; } - final Widget widget = svg(thumbnail, color: iconColor); + final Widget widget = svgWidget(thumbnail, color: iconColor); return widget; } diff --git a/frontend/app_flowy/lib/workspace/application/view/view_listener.dart b/frontend/app_flowy/lib/workspace/application/view/view_listener.dart index f400124805..ee27d55139 100644 --- a/frontend/app_flowy/lib/workspace/application/view/view_listener.dart +++ b/frontend/app_flowy/lib/workspace/application/view/view_listener.dart @@ -18,7 +18,7 @@ class ViewListener { PublishNotifier updatedNotifier = PublishNotifier(); PublishNotifier deletedNotifier = PublishNotifier(); PublishNotifier restoredNotifier = PublishNotifier(); - late FolderNotificationParser _parser; + FolderNotificationParser? _parser; View view; ViewListener({ @@ -33,7 +33,7 @@ class ViewListener { }, ); - _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable)); + _subscription = RustStreamReceiver.listen((observable) => _parser?.parse(observable)); } void _handleObservableType(FolderNotification ty, Either result) { @@ -62,6 +62,7 @@ class ViewListener { } Future close() async { + _parser = null; await _subscription?.cancel(); updatedNotifier.dispose(); deletedNotifier.dispose(); diff --git a/frontend/app_flowy/lib/workspace/application/workspace/workspace_listener.dart b/frontend/app_flowy/lib/workspace/application/workspace/workspace_listener.dart index e5959d1562..9ac51e36f8 100644 --- a/frontend/app_flowy/lib/workspace/application/workspace/workspace_listener.dart +++ b/frontend/app_flowy/lib/workspace/application/workspace/workspace_listener.dart @@ -12,7 +12,6 @@ import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-folder/dart_notification.pb.dart'; import 'package:flowy_sdk/rust_stream.dart'; - typedef WorkspaceAppsChangedCallback = void Function(Either, FlowyError> appsOrFail); typedef WorkspaceUpdatedCallback = void Function(String name, String desc); @@ -31,12 +30,11 @@ class WorkspaceListener { } } - class WorkspaceListenerService { StreamSubscription? _subscription; WorkspaceAppsChangedCallback? _appsChanged; WorkspaceUpdatedCallback? _update; - late FolderNotificationParser _parser; + FolderNotificationParser? _parser; final UserProfile user; final String workspaceId; @@ -59,7 +57,7 @@ class WorkspaceListenerService { }, ); - _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable)); + _subscription = RustStreamReceiver.listen((observable) => _parser?.parse(observable)); } void _handleObservableType(FolderNotification ty, Either result) { @@ -91,6 +89,7 @@ class WorkspaceListenerService { } Future close() async { + _parser = null; await _subscription?.cancel(); // _appsChanged = null; // _update = null; diff --git a/frontend/app_flowy/lib/workspace/presentation/home/home_layout.dart b/frontend/app_flowy/lib/workspace/presentation/home/home_layout.dart index f0192a846b..0405279851 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/home_layout.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/home_layout.dart @@ -20,7 +20,7 @@ class HomeLayout { HomeLayout(BuildContext context, BoxConstraints homeScreenConstraint, bool forceCollapse) { final homeBlocState = context.read().state; - showEditPannel = homeBlocState.editContext.isSome(); + showEditPannel = homeBlocState.pannelContext.isSome(); menuWidth = Sizes.sideBarMed; if (context.widthPx >= PageBreaks.desktop) { diff --git a/frontend/app_flowy/lib/workspace/presentation/home/home_screen.dart b/frontend/app_flowy/lib/workspace/presentation/home/home_screen.dart index 88ec0f5ad6..e9bb80dd30 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/home_screen.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/home_screen.dart @@ -126,13 +126,22 @@ class _HomeScreenState extends State { Widget _buildEditPannel({required HomeState homeState, required BuildContext context, required HomeLayout layout}) { final homeBloc = context.read(); - Widget editPannel = EditPannel( - context: homeState.editContext, - onEndEdit: () => homeBloc.add(const HomeEvent.dismissEditPannel()), + return BlocBuilder( + buildWhen: (previous, current) => previous.pannelContext != current.pannelContext, + builder: (context, state) { + return state.pannelContext.fold( + () => const SizedBox(), + (pannelContext) => FocusTraversalGroup( + child: RepaintBoundary( + child: EditPannel( + pannelContext: pannelContext, + onEndEdit: () => homeBloc.add(const HomeEvent.dismissEditPannel()), + ), + ), + ), + ); + }, ); - // editPannel = RepaintBoundary(child: editPannel); - // editPannel = FocusTraversalGroup(child: editPannel); - return editPannel; } Widget _layoutWidgets({ diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/add_button.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/add_button.dart index 9e696e8a73..6df78a67cc 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/add_button.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/add_button.dart @@ -28,7 +28,7 @@ class AddButton extends StatelessWidget { onSelected: onSelected, ).show(context); }, - icon: svg("home/add").padding(horizontal: 3, vertical: 3), + icon: svgWidget("home/add").padding(horizontal: 3, vertical: 3), ); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/header.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/header.dart index da20eafc7b..ff1d6e6822 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/header.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/header.dart @@ -81,7 +81,6 @@ class MenuAppHeader extends StatelessWidget { onSecondaryTap: () { final actionList = AppDisclosureActionSheet(onSelected: (action) => _handleAction(context, action)); actionList.show( - context, context, anchorDirection: AnchorDirection.bottomWithCenterAligned, ); @@ -154,9 +153,9 @@ extension AppDisclosureExtension on AppDisclosureAction { Widget get icon { switch (this) { case AppDisclosureAction.rename: - return svg('editor/edit', color: const Color(0xffe5e5e5)); + return svgWidget('editor/edit', color: const Color(0xffe5e5e5)); case AppDisclosureAction.delete: - return svg('editor/delete', color: const Color(0xffe5e5e5)); + return svgWidget('editor/delete', color: const Color(0xffe5e5e5)); } } } diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/right_click_action.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/right_click_action.dart index 8938443236..be6a97dbfb 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/right_click_action.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/right_click_action.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'header.dart'; -class AppDisclosureActionSheet with ActionList implements FlowyOverlayDelegate { +class AppDisclosureActionSheet with ActionList, FlowyOverlayDelegate { final Function(dartz.Option) onSelected; final _items = AppDisclosureAction.values.map((action) => DisclosureActionWrapper(action)).toList(); diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/disclosure_action.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/disclosure_action.dart index a2cd2edcac..c9a02a9de7 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/disclosure_action.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/disclosure_action.dart @@ -11,9 +11,7 @@ import 'item.dart'; // [[Widget: LifeCycle]] // https://flutterbyexample.com/lesson/stateful-widget-lifecycle -class ViewDisclosureButton extends StatelessWidget - with ActionList - implements FlowyOverlayDelegate { +class ViewDisclosureButton extends StatelessWidget with ActionList, FlowyOverlayDelegate { final Function() onTap; final Function(dartz.Option) onSelected; final _items = ViewDisclosureAction.values.map((action) => ViewDisclosureActionWrapper(action)).toList(); @@ -32,9 +30,9 @@ class ViewDisclosureButton extends StatelessWidget width: 26, onPressed: () { onTap(); - show(context, context); + show(context); }, - icon: svg("editor/details", color: theme.iconColor), + icon: svgWidget("editor/details", color: theme.iconColor), ); } diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/item.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/item.dart index 1503835bf6..15a27268c5 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/item.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/item.dart @@ -45,7 +45,7 @@ class ViewSectionItem extends StatelessWidget { child: FlowyHover( config: HoverDisplayConfig(hoverColor: theme.bg3), builder: (_, onHover) => _render(context, onHover, state, theme.iconColor), - isOnSelected: () => state.isEditing || isSelected, + setSelected: () => state.isEditing || isSelected, ), ); }, @@ -126,11 +126,11 @@ extension ViewDisclosureExtension on ViewDisclosureAction { Widget get icon { switch (this) { case ViewDisclosureAction.rename: - return svg('editor/edit', color: const Color(0xff999999)); + return svgWidget('editor/edit', color: const Color(0xff999999)); case ViewDisclosureAction.delete: - return svg('editor/delete', color: const Color(0xff999999)); + return svgWidget('editor/delete', color: const Color(0xff999999)); case ViewDisclosureAction.duplicate: - return svg('editor/copy', color: const Color(0xff999999)); + return svgWidget('editor/copy', color: const Color(0xff999999)); } } } diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/section.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/section.dart index dcb2d454b9..080211a8b7 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/section.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/app/section/section.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/application/view/view_ext.dart'; import 'package:app_flowy/workspace/presentation/home/home_stack.dart'; @@ -7,7 +9,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:styled_widget/styled_widget.dart'; import 'item.dart'; -import 'package:async/async.dart'; class ViewSection extends StatelessWidget { final AppDataNotifier appData; @@ -64,7 +65,7 @@ class ViewSectionNotifier with ChangeNotifier { bool isDisposed = false; List _views; View? _selectedView; - CancelableOperation? _notifyListenerOperation; + Timer? _notifyListenerOperation; ViewSectionNotifier({ required BuildContext context, @@ -120,9 +121,7 @@ class ViewSectionNotifier with ChangeNotifier { void _notifyListeners() { _notifyListenerOperation?.cancel(); - _notifyListenerOperation = CancelableOperation.fromFuture( - Future.delayed(const Duration(milliseconds: 30), () {}), - ).then((_) { + _notifyListenerOperation = Timer(const Duration(milliseconds: 30), () { if (!isDisposed) { notifyListeners(); } diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/menu.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/menu.dart index 73771596cb..395a85bf45 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/menu.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/menu.dart @@ -186,7 +186,7 @@ class MenuTopBar extends StatelessWidget { width: 28, onPressed: () => context.read().add(const MenuEvent.collapse()), iconPadding: const EdgeInsets.fromLTRB(4, 4, 4, 4), - icon: svg("home/hide_menu", color: theme.iconColor), + icon: svgWidget("home/hide_menu", color: theme.iconColor), ) ], ), diff --git a/frontend/app_flowy/lib/workspace/presentation/home/menu/menu_user.dart b/frontend/app_flowy/lib/workspace/presentation/home/menu/menu_user.dart index fb0a4284d8..3a1674e486 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/menu/menu_user.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/menu/menu_user.dart @@ -80,7 +80,7 @@ class MenuUser extends StatelessWidget { }, icon: SizedBox.square( dimension: 20, - child: svg("home/settings", color: theme.iconColor), + child: svgWidget("home/settings", color: theme.iconColor), ), ), ); diff --git a/frontend/app_flowy/lib/workspace/presentation/home/navigation.dart b/frontend/app_flowy/lib/workspace/presentation/home/navigation.dart index 511b94db90..b6947c79fe 100644 --- a/frontend/app_flowy/lib/workspace/presentation/home/navigation.dart +++ b/frontend/app_flowy/lib/workspace/presentation/home/navigation.dart @@ -97,7 +97,7 @@ class FlowyNavigation extends StatelessWidget { notifier.value = false; }, iconPadding: const EdgeInsets.fromLTRB(2, 2, 2, 2), - icon: svg("home/hide_menu", color: theme.iconColor), + icon: svgWidget("home/hide_menu", color: theme.iconColor), ), ); } else { diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/blank/blank.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/blank/blank.dart index 598f6971f2..05456f20f4 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/blank/blank.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/blank/blank.dart @@ -40,7 +40,7 @@ class BlankPagePlugin extends Plugin { PluginType get ty => _pluginType; } -class BlankPagePluginDisplay extends PluginDisplay { +class BlankPagePluginDisplay extends PluginDisplay with NavigationItem { @override Widget get leftBarItem => FlowyText.medium(LocaleKeys.blankPageTitle.tr(), fontSize: 12); diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart index f027bf3e7a..b0727bb73a 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart @@ -10,14 +10,13 @@ import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/application/appearance.dart'; import 'package:app_flowy/workspace/application/doc/share_bloc.dart'; import 'package:app_flowy/workspace/application/view/view_listener.dart'; -import 'package:app_flowy/workspace/application/view/view_service.dart'; import 'package:app_flowy/workspace/presentation/home/home_stack.dart'; +import 'package:app_flowy/workspace/presentation/plugins/widgets/left_bar_item.dart'; import 'package:app_flowy/workspace/presentation/widgets/dialogs.dart'; import 'package:app_flowy/workspace/presentation/widgets/pop_up_action.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra/notifier.dart'; import 'package:flowy_infra/size.dart'; -import 'package:flowy_infra/theme.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/widget/rounded_button.dart'; import 'package:flowy_sdk/log.dart'; @@ -89,7 +88,7 @@ class DocumentPlugin implements Plugin { PluginId get id => _view.id; } -class DocumentPluginDisplay extends PluginDisplay { +class DocumentPluginDisplay extends PluginDisplay with NavigationItem { final PublishNotifier _displayNotifier = PublishNotifier(); final View _view; @@ -99,91 +98,16 @@ class DocumentPluginDisplay extends PluginDisplay { Widget buildWidget() => DocumentPage(view: _view, key: ValueKey(_view.id)); @override - Widget get leftBarItem => DocumentLeftBarItem(view: _view); + Widget get leftBarItem => ViewLeftBarItem(view: _view); @override Widget? get rightBarItem => DocumentShareButton(view: _view); @override - List get navigationItems => _makeNavigationItems(); + List get navigationItems => [this]; @override PublishNotifier? get notifier => _displayNotifier; - - List _makeNavigationItems() { - return [ - this, - ]; - } -} - -class DocumentLeftBarItem extends StatefulWidget { - final View view; - - DocumentLeftBarItem({required this.view, Key? key}) : super(key: ValueKey(view.hashCode)); - - @override - State createState() => _DocumentLeftBarItemState(); -} - -class _DocumentLeftBarItemState extends State { - final _controller = TextEditingController(); - final _focusNode = FocusNode(); - late ViewService service; - - @override - void initState() { - service = ViewService(/*view: widget.view*/); - _focusNode.addListener(_handleFocusChanged); - super.initState(); - } - - @override - void dispose() { - _controller.dispose(); - _focusNode.removeListener(_handleFocusChanged); - _focusNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - _controller.text = widget.view.name; - - final theme = context.watch(); - return IntrinsicWidth( - key: ValueKey(_controller.text), - child: TextField( - controller: _controller, - focusNode: _focusNode, - scrollPadding: EdgeInsets.zero, - decoration: const InputDecoration( - contentPadding: EdgeInsets.zero, - border: InputBorder.none, - isDense: true, - ), - style: TextStyle( - color: theme.textColor, - fontSize: 14, - fontWeight: FontWeight.w500, - overflow: TextOverflow.ellipsis, - ), - // cursorColor: widget.cursorColor, - // obscureText: widget.enableObscure, - ), - ); - } - - void _handleFocusChanged() { - if (_controller.text.isEmpty) { - _controller.text = widget.view.name; - return; - } - - if (_controller.text != widget.view.name) { - service.updateView(viewId: widget.view.id, name: _controller.text); - } - } } class DocumentShareButton extends StatelessWidget { @@ -264,7 +188,6 @@ class DocumentShareButton extends StatelessWidget { }); }); actionList.show( - context, context, anchorDirection: AnchorDirection.bottomWithCenterAligned, anchorOffset: offset, @@ -272,7 +195,7 @@ class DocumentShareButton extends StatelessWidget { } } -class ShareActions with ActionList implements FlowyOverlayDelegate { +class ShareActions with ActionList, FlowyOverlayDelegate { final Function(dartz.Option) onSelected; final _items = ShareAction.values.map((action) => ShareActionWrapper(action)).toList(); diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/document_page.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/document_page.dart index 031edb93fd..5983102047 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/document_page.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/document_page.dart @@ -61,6 +61,7 @@ class _DocumentPageState extends State { @override Future dispose() async { documentBloc.close(); + _focusNode.dispose(); super.dispose(); } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/style_widgets.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/style_widgets.dart index 9d307b3ace..4f09b64053 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/style_widgets.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/style_widgets.dart @@ -51,7 +51,7 @@ class _FlowyEditorCheckboxState extends State { @override Widget build(BuildContext context) { - final icon = isChecked ? svg('editor/editor_check') : svg('editor/editor_uncheck'); + final icon = isChecked ? svgWidget('editor/editor_check') : svgWidget('editor/editor_uncheck'); return Align( alignment: Alignment.centerLeft, child: FlowyIconButton( diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/color_picker.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/color_picker.dart index 793399989c..57299bd6cc 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/color_picker.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/color_picker.dart @@ -117,15 +117,6 @@ class _FlowyColorButtonState extends State { } void _showColorPicker() { - // FlowyPoppuWindow.show( - // context, - // size: Size(600, 200), - // child: MaterialPicker( - // pickerColor: const Color(0x00000000), - // onColorChanged: (color) => _changeColor(context, color), - // ), - // ); - final style = widget.controller.getSelectionStyle(); final values = style.values.where((v) => v.key == Attribute.background.key).map((v) => v.value); int initialColor = 0; diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/link_button.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/link_button.dart index 3daa9f0679..60b654302f 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/link_button.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/link_button.dart @@ -54,11 +54,11 @@ class _FlowyLinkStyleButtonState extends State { final isEnabled = !widget.controller.selection.isCollapsed; final pressedHandler = isEnabled ? () => _openLinkDialog(context) : null; final icon = isEnabled - ? svg( + ? svgWidget( 'editor/share', color: theme.iconColor, ) - : svg( + : svgWidget( 'editor/share', color: theme.disableIconColor, ); diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/toolbar_icon_button.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/toolbar_icon_button.dart index 500f683355..b6dddefbb3 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/toolbar_icon_button.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/doc/src/widget/toolbar/toolbar_icon_button.dart @@ -29,7 +29,7 @@ class ToolbarIconButton extends StatelessWidget { iconPadding: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), onPressed: onPressed, width: width, - icon: isToggled == true ? svg(iconName, color: Colors.white) : svg(iconName), + icon: isToggled == true ? svgWidget(iconName, color: Colors.white) : svgWidget(iconName), fillColor: isToggled == true ? theme.main1 : theme.shader6, hoverColor: isToggled == true ? theme.main1 : theme.shader5, tooltipText: tooltipText, diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/grid.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/grid.dart index cf6b4c9032..adc2a91fa9 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/grid.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/grid.dart @@ -1,5 +1,5 @@ import 'package:app_flowy/workspace/presentation/home/home_stack.dart'; -import 'package:flowy_infra_ui/style_widget/text.dart'; +import 'package:app_flowy/workspace/presentation/plugins/widgets/left_bar_item.dart'; import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart'; import 'package:app_flowy/plugin/plugin.dart'; import 'package:flutter/material.dart'; @@ -28,7 +28,7 @@ class GridPluginBuilder implements PluginBuilder { class GridPluginConfig implements PluginConfig { @override - bool get creatable => false; + bool get creatable => true; } class GridPlugin extends Plugin { @@ -56,7 +56,7 @@ class GridPluginDisplay extends PluginDisplay { GridPluginDisplay({required View view, Key? key}) : _view = view; @override - Widget get leftBarItem => const FlowyText.medium("Grid demo", fontSize: 12); + Widget get leftBarItem => ViewLeftBarItem(view: _view); @override Widget buildWidget() => GridPage(view: _view); diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart index 4e7747ac1d..936ad68c44 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart @@ -5,17 +5,15 @@ import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_scrollview.dart'; import 'package:flowy_infra_ui/widget/error_page.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:flutter_bloc/flutter_bloc.dart'; import 'package:flutter/material.dart'; -import 'package:styled_widget/styled_widget.dart'; - import 'controller/grid_scroll.dart'; import 'layout/layout.dart'; import 'layout/sizes.dart'; -import 'widgets/content/grid_row.dart'; +import 'widgets/row/grid_row.dart'; import 'widgets/footer/grid_footer.dart'; -import 'widgets/header/header.dart'; +import 'widgets/header/grid_header.dart'; +import 'widgets/toolbar/grid_toolbar.dart'; class GridPage extends StatefulWidget { final View view; @@ -83,63 +81,91 @@ class _FlowyGridState extends State { @override Widget build(BuildContext context) { + final gridId = context.read().view.id; + + return BlocBuilder( + buildWhen: (previous, current) => previous.fields != current.fields, + builder: (context, state) { + if (state.fields.isEmpty) { + return const Center(child: CircularProgressIndicator.adaptive()); + } + + final child = BlocBuilder( + builder: (context, state) { + return SizedBox( + width: GridLayout.headerWidth(state.fields), + child: ScrollConfiguration( + behavior: const ScrollBehavior().copyWith(scrollbars: false), + child: CustomScrollView( + physics: StyledScrollPhysics(), + controller: _scrollController.verticalController, + slivers: [ + _renderToolbar(gridId), + GridHeader(gridId: gridId, fields: List.from(state.fields)), + _renderRows(context), + const GridFooter(), + ], + ), + ), + ); + }, + ); + + return _wrapScrollbar(child); + }, + ); + } + + Widget _wrapScrollbar(Widget child) { + return ScrollbarListStack( + axis: Axis.vertical, + controller: _scrollController.verticalController, + barSize: GridSize.scrollBarSize, + child: StyledSingleChildScrollView( + controller: _scrollController.horizontalController, + axis: Axis.horizontal, + child: child, + ), + ); + } + + Widget _renderToolbar(String gridId) { return BlocBuilder( builder: (context, state) { - return state.fields.fold( - () => const Center(child: CircularProgressIndicator.adaptive()), - (fields) => _renderGrid(context, fields), + final toolbarContext = GridToolbarContext( + gridId: gridId, + fields: state.fields, + ); + + return SliverToBoxAdapter( + child: GridToolbar(toolbarContext: toolbarContext), ); }, ); } - Widget _renderGrid(BuildContext context, List fields) { - return Stack( - children: [ - StyledSingleChildScrollView( - controller: _scrollController.horizontalController, - axis: Axis.horizontal, - child: SizedBox( - width: GridLayout.headerWidth(fields), - child: CustomScrollView( - physics: StyledScrollPhysics(), - controller: _scrollController.verticalController, - slivers: [ - _buildHeader(fields), - _buildRows(context), - const GridFooter(), - ], - ), + Widget _renderRows(BuildContext context) { + return BlocBuilder( + buildWhen: (previous, current) { + final rowChanged = previous.rows.length != current.rows.length; + // final fieldChanged = previous.fields.length != current.fields.length; + return rowChanged; + }, + builder: (context, state) { + return SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final blockRow = context.read().state.rows[index]; + final fields = context.read().state.fields; + final rowData = RowData.fromBlockRow(blockRow, fields); + return GridRowWidget(data: rowData, key: ValueKey(rowData.rowId)); + }, + childCount: context.read().state.rows.length, + addRepaintBoundaries: true, + addAutomaticKeepAlives: true, ), - ), - ScrollbarListStack( - axis: Axis.vertical, - controller: _scrollController.verticalController, - barSize: GridSize.scrollBarSize, - child: Container(), - ).padding(right: 0, top: GridSize.headerHeight, bottom: GridSize.scrollBarSize), - ], - ); - } - - Widget _buildHeader(List fields) { - return SliverPersistentHeader( - delegate: GridHeaderDelegate(fields), - floating: true, - pinned: true, - ); - } - - Widget _buildRows(BuildContext context) { - return SliverList( - delegate: SliverChildBuilderDelegate( - (context, index) { - final rowData = context.read().state.rows[index]; - return GridRowWidget(data: rowData); - }, - childCount: context.read().state.rows.length, - addRepaintBoundaries: true, - ), + ); + }, ); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart index 5f8f94e1a2..23a541e610 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/layout/sizes.dart @@ -8,23 +8,36 @@ class GridSize { static double get footerHeight => 40 * scale; static double get leadingHeaderPadding => 30 * scale; static double get trailHeaderPadding => 140 * scale; - static double get headerContentPadding => 8 * scale; - static double get cellContentPadding => 8 * scale; + static double get headerContainerPadding => 0 * scale; + static double get cellHPadding => 10 * scale; + static double get cellVPadding => 8 * scale; + static double get typeOptionItemHeight => 32 * scale; + static double get typeOptionSeparatorHeight => 6 * scale; // static EdgeInsets get headerContentInsets => EdgeInsets.symmetric( - horizontal: GridSize.headerContentPadding, - vertical: GridSize.headerContentPadding, + horizontal: GridSize.headerContainerPadding, + vertical: GridSize.headerContainerPadding, ); static EdgeInsets get cellContentInsets => EdgeInsets.symmetric( - horizontal: GridSize.cellContentPadding, - vertical: GridSize.cellContentPadding, + horizontal: GridSize.cellHPadding, + vertical: GridSize.cellVPadding, + ); + + static EdgeInsets get fieldContentInsets => EdgeInsets.symmetric( + horizontal: GridSize.cellHPadding, + vertical: GridSize.cellVPadding, + ); + + static EdgeInsets get typeOptionContentInsets => const EdgeInsets.symmetric( + horizontal: 6, + vertical: 2, ); static EdgeInsets get footerContentInsets => EdgeInsets.fromLTRB( 0, - GridSize.headerContentPadding, - GridSize.headerContentPadding, - GridSize.headerContentPadding, + GridSize.headerContainerPadding, + GridSize.headerContainerPadding, + GridSize.headerContainerPadding, ); } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_builder.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_builder.dart similarity index 51% rename from frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_builder.dart rename to frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_builder.dart index 187a81c1bc..3b84ac557a 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_builder.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_builder.dart @@ -1,28 +1,29 @@ -import 'package:app_flowy/workspace/application/grid/row_service.dart'; +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:flutter/widgets.dart'; import 'checkbox_cell.dart'; import 'date_cell.dart'; import 'number_cell.dart'; -import 'selection_cell.dart'; +import 'selection_cell/selection_cell.dart'; import 'text_cell.dart'; -Widget buildGridCell(GridCellData cellData) { +Widget buildGridCell(CellData cellData) { + final key = ValueKey(cellData.field.id + cellData.rowId); switch (cellData.field.fieldType) { case FieldType.Checkbox: - return CheckboxCell(cellData: cellData); + return CheckboxCell(cellData: cellData, key: key); case FieldType.DateTime: - return DateCell(cellData: cellData); + return DateCell(cellData: cellData, key: key); case FieldType.MultiSelect: - return MultiSelectCell(cellContext: cellData); + return MultiSelectCell(cellData: cellData, key: key); case FieldType.Number: - return NumberCell(cellData: cellData); + return NumberCell(cellData: cellData, key: key); case FieldType.RichText: - return GridTextCell(cellData: cellData); + return GridTextCell(cellData: cellData, key: key); case FieldType.SingleSelect: - return SingleSelectCell(cellContext: cellData); + return SingleSelectCell(cellData: cellData, key: key); default: - return const BlankCell(); + throw UnimplementedError; } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_container.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_container.dart new file mode 100755 index 0000000000..57f3610be2 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_container.dart @@ -0,0 +1,90 @@ +import 'package:flowy_infra/theme.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; + +class CellStateNotifier extends ChangeNotifier { + bool _isFocus = false; + + set isFocus(bool value) { + if (_isFocus != value) { + _isFocus = value; + notifyListeners(); + } + } + + bool get isFocus => _isFocus; +} + +class CellContainer extends StatelessWidget { + final Widget child; + final double width; + const CellContainer({ + Key? key, + required this.child, + required this.width, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (_) => CellStateNotifier(), + child: Consumer( + builder: (context, state, _) { + return Container( + constraints: BoxConstraints( + maxWidth: width, + ), + decoration: _makeBoxDecoration(context, state), + padding: GridSize.cellContentInsets, + child: Center(child: child), + ); + }, + ), + ); + } + + BoxDecoration _makeBoxDecoration(BuildContext context, CellStateNotifier state) { + final theme = context.watch(); + if (state.isFocus) { + final borderSide = BorderSide(color: theme.main1, width: 1.0); + return BoxDecoration(border: Border.fromBorderSide(borderSide)); + } else { + final borderSide = BorderSide(color: theme.shader4, width: 0.4); + return BoxDecoration(border: Border(right: borderSide, bottom: borderSide)); + } + } +} + +abstract class GridCell extends StatefulWidget { + const GridCell({Key? key}) : super(key: key); + + void setFocus(BuildContext context, bool value) { + Provider.of(context, listen: false).isFocus = value; + } +} + +class CellFocusNode extends FocusNode { + VoidCallback? focusCallback; + + void addCallback(BuildContext context, VoidCallback callback) { + if (focusCallback != null) { + removeListener(focusCallback!); + } + focusCallback = () { + Provider.of(context, listen: false).isFocus = hasFocus; + callback(); + }; + + addListener(focusCallback!); + } + + @override + void dispose() { + if (focusCallback != null) { + removeListener(focusCallback!); + } + super.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_decoration.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_decoration.dart similarity index 100% rename from frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_decoration.dart rename to frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_decoration.dart diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/checkbox_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/checkbox_cell.dart similarity index 56% rename from frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/checkbox_cell.dart rename to frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/checkbox_cell.dart index eec381914a..b4095c71d9 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/checkbox_cell.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/checkbox_cell.dart @@ -1,11 +1,12 @@ import 'package:app_flowy/startup/startup.dart'; -import 'package:app_flowy/workspace/application/grid/cell_bloc/checkbox_cell_bloc.dart'; -import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class CheckboxCell extends StatefulWidget { - final GridCellData cellData; + final CellData cellData; const CheckboxCell({ required this.cellData, @@ -21,7 +22,7 @@ class _CheckboxCellState extends State { @override void initState() { - _cellBloc = getIt(param1: widget.cellData); + _cellBloc = getIt(param1: widget.cellData)..add(const CheckboxCellEvent.initial()); super.initState(); } @@ -31,7 +32,16 @@ class _CheckboxCellState extends State { value: _cellBloc, child: BlocBuilder( builder: (context, state) { - return Container(); + final icon = state.isSelected ? svgWidget('editor/editor_check') : svgWidget('editor/editor_uncheck'); + return Align( + alignment: Alignment.centerLeft, + child: FlowyIconButton( + onPressed: () => context.read().add(const CheckboxCellEvent.select()), + iconPadding: EdgeInsets.zero, + icon: icon, + width: 23, + ), + ); }, ), ); diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/date_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/date_cell.dart similarity index 82% rename from frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/date_cell.dart rename to frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/date_cell.dart index 5d9f452c78..e3b48279c0 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/date_cell.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/date_cell.dart @@ -1,11 +1,10 @@ import 'package:app_flowy/startup/startup.dart'; -import 'package:app_flowy/workspace/application/grid/cell_bloc/date_cell_bloc.dart'; -import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class DateCell extends StatefulWidget { - final GridCellData cellData; + final CellData cellData; const DateCell({ required this.cellData, diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart new file mode 100644 index 0000000000..ba9d75ed1b --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/number_cell.dart @@ -0,0 +1,84 @@ +import 'dart:async'; + +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'; + +class NumberCell extends StatefulWidget { + final CellData cellData; + + const NumberCell({ + required this.cellData, + Key? key, + }) : super(key: key); + + @override + State createState() => _NumberCellState(); +} + +class _NumberCellState extends State { + late NumberCellBloc _cellBloc; + late TextEditingController _controller; + late CellFocusNode _focusNode; + Timer? _delayOperation; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellData); + _controller = TextEditingController(text: _cellBloc.state.content); + _focusNode = CellFocusNode(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + _focusNode.addCallback(context, focusChanged); + + return BlocProvider.value( + value: _cellBloc, + child: BlocConsumer( + listener: (context, state) { + if (_controller.text != state.content) { + _controller.text = state.content; + } + }, + builder: (context, state) { + return TextField( + controller: _controller, + focusNode: _focusNode, + onChanged: (value) => focusChanged(), + onEditingComplete: () => _focusNode.unfocus(), + maxLines: 1, + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), + decoration: const InputDecoration( + contentPadding: EdgeInsets.zero, + border: InputBorder.none, + isDense: true, + ), + ); + }, + ), + ); + } + + @override + Future dispose() async { + _delayOperation?.cancel(); + _cellBloc.close(); + _focusNode.dispose(); + super.dispose(); + } + + Future focusChanged() async { + if (mounted) { + _delayOperation?.cancel(); + _delayOperation = Timer(const Duration(milliseconds: 300), () { + if (_cellBloc.isClosed == false && _controller.text != _cellBloc.state.content) { + _cellBloc.add(NumberCellEvent.updateCell(_controller.text)); + } + }); + } + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/prelude.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/prelude.dart new file mode 100644 index 0000000000..7fc3b3246f --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/prelude.dart @@ -0,0 +1,7 @@ +export 'cell_builder.dart'; +export 'cell_container.dart'; +export 'text_cell.dart'; +export 'number_cell.dart'; +export 'date_cell.dart'; +export 'checkbox_cell.dart'; +export 'selection_cell/selection_cell.dart'; diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/extension.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/extension.dart new file mode 100644 index 0000000000..1b3a81704d --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/extension.dart @@ -0,0 +1,174 @@ +import 'dart:collection'; + +import 'package:flowy_infra/size.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/text.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:app_flowy/generated/locale_keys.g.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:textfield_tags/textfield_tags.dart'; + +extension SelectOptionColorExtension on SelectOptionColor { + Color make(BuildContext context) { + final theme = context.watch(); + switch (this) { + case SelectOptionColor.Purple: + return theme.tint1; + case SelectOptionColor.Pink: + return theme.tint2; + case SelectOptionColor.LightPink: + return theme.tint3; + case SelectOptionColor.Orange: + return theme.tint4; + case SelectOptionColor.Yellow: + return theme.tint5; + case SelectOptionColor.Lime: + return theme.tint6; + case SelectOptionColor.Green: + return theme.tint7; + case SelectOptionColor.Aqua: + return theme.tint8; + case SelectOptionColor.Blue: + return theme.tint9; + default: + throw ArgumentError; + } + } + + String optionName() { + switch (this) { + case SelectOptionColor.Purple: + return LocaleKeys.grid_selectOption_purpleColor.tr(); + case SelectOptionColor.Pink: + return LocaleKeys.grid_selectOption_pinkColor.tr(); + case SelectOptionColor.LightPink: + return LocaleKeys.grid_selectOption_lightPinkColor.tr(); + case SelectOptionColor.Orange: + return LocaleKeys.grid_selectOption_orangeColor.tr(); + case SelectOptionColor.Yellow: + return LocaleKeys.grid_selectOption_yellowColor.tr(); + case SelectOptionColor.Lime: + return LocaleKeys.grid_selectOption_limeColor.tr(); + case SelectOptionColor.Green: + return LocaleKeys.grid_selectOption_greenColor.tr(); + case SelectOptionColor.Aqua: + return LocaleKeys.grid_selectOption_aquaColor.tr(); + case SelectOptionColor.Blue: + return LocaleKeys.grid_selectOption_blueColor.tr(); + default: + throw ArgumentError; + } + } +} + +class SelectOptionTextField extends StatelessWidget { + final FocusNode _focusNode; + final TextEditingController _controller; + final TextfieldTagsController tagController; + final List options; + final LinkedHashMap selectedOptionMap; + + final double distanceToText; + + final Function(String) onNewTag; + + SelectOptionTextField({ + required this.options, + required this.selectedOptionMap, + required this.distanceToText, + required this.tagController, + required this.onNewTag, + TextEditingController? controller, + FocusNode? focusNode, + Key? key, + }) : _controller = controller ?? TextEditingController(), + _focusNode = focusNode ?? FocusNode(), + super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + + return TextFieldTags( + textEditingController: _controller, + textfieldTagsController: tagController, + initialTags: selectedOptionMap.keys.toList(), + focusNode: _focusNode, + textSeparators: const [' ', ','], + inputfieldBuilder: (BuildContext context, editController, focusNode, error, onChanged, onSubmitted) { + return ((context, sc, tags, onTagDelegate) { + tags.retainWhere((name) { + return options.where((option) => option.name == name).isEmpty; + }); + if (tags.isNotEmpty) { + assert(tags.length == 1); + onNewTag(tags.first); + } + + return TextField( + controller: editController, + focusNode: focusNode, + onChanged: onChanged, + onSubmitted: onSubmitted, + maxLines: 1, + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), + decoration: InputDecoration( + border: OutlineInputBorder( + borderSide: BorderSide(color: theme.shader3, width: 1.0), + borderRadius: Corners.s10Border, + ), + isDense: true, + prefixIcon: _renderTags(sc), + hintText: LocaleKeys.grid_selectOption_searchOption.tr(), + prefixIconConstraints: BoxConstraints(maxWidth: distanceToText), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: theme.main1, + width: 1.0, + ), + borderRadius: Corners.s10Border, + ), + ), + ); + }); + }, + ); + } + + Widget? _renderTags(ScrollController sc) { + if (selectedOptionMap.isEmpty) { + return null; + } + + final children = selectedOptionMap.values.map((option) => SelectOptionTag(option: option)).toList(); + return Padding( + padding: const EdgeInsets.all(8.0), + child: SingleChildScrollView( + controller: sc, + scrollDirection: Axis.horizontal, + child: Row(children: children), + ), + ); + } +} + +class SelectOptionTag extends StatelessWidget { + final SelectOption option; + const SelectOptionTag({required this.option, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: option.color.make(context), + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8.0), + ), + child: Center(child: FlowyText.medium(option.name, fontSize: 12)), + margin: const EdgeInsets.symmetric(horizontal: 3.0), + padding: const EdgeInsets.symmetric(horizontal: 6.0), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_cell.dart new file mode 100644 index 0000000000..3e6f5b1649 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_cell.dart @@ -0,0 +1,104 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'extension.dart'; +import 'selection_editor.dart'; + +class SingleSelectCell extends StatefulWidget { + final CellData cellData; + + const SingleSelectCell({ + required this.cellData, + Key? key, + }) : super(key: key); + + @override + State createState() => _SingleSelectCellState(); +} + +class _SingleSelectCellState extends State { + late SelectionCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellData)..add(const SelectionCellEvent.initial()); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: _cellBloc, + child: BlocBuilder( + builder: (context, state) { + final children = state.selectedOptions.map((option) => SelectOptionTag(option: option)).toList(); + return SizedBox.expand( + child: InkWell( + onTap: () { + SelectOptionEditor.show(context, state.cellData, state.options, state.selectedOptions); + }, + child: Row(children: children), + ), + ); + }, + ), + ); + } + + @override + Future dispose() async { + _cellBloc.close(); + super.dispose(); + } +} + +//---------------------------------------------------------------- +class MultiSelectCell extends StatefulWidget { + final CellData cellData; + + const MultiSelectCell({ + required this.cellData, + Key? key, + }) : super(key: key); + + @override + State createState() => _MultiSelectCellState(); +} + +class _MultiSelectCellState extends State { + late SelectionCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellData)..add(const SelectionCellEvent.initial()); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: _cellBloc, + child: BlocBuilder( + builder: (context, state) { + final children = state.selectedOptions.map((option) => SelectOptionTag(option: option)).toList(); + return SizedBox.expand( + child: InkWell( + onTap: () { + SelectOptionEditor.show(context, state.cellData, state.options, state.selectedOptions); + }, + child: Row(children: children), + ), + ); + }, + ), + ); + } + + @override + Future dispose() async { + _cellBloc.close(); + super.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_editor.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_editor.dart new file mode 100644 index 0000000000..1df2cd03b6 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/selection_editor.dart @@ -0,0 +1,241 @@ +import 'dart:collection'; + +import 'package:app_flowy/workspace/application/grid/cell_bloc/selection_editor_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/row/row_service.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/edit_option_pannel.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +import 'package:flowy_infra_ui/style_widget/hover.dart'; +import 'package:flowy_infra_ui/style_widget/icon_button.dart'; +import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart'; +import 'package:flowy_infra_ui/widget/spacing.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flowy_infra_ui/style_widget/text.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:app_flowy/generated/locale_keys.g.dart'; +import 'package:textfield_tags/textfield_tags.dart'; + +import 'extension.dart'; + +const double _editorPannelWidth = 300; + +class SelectOptionEditor extends StatelessWidget with FlowyOverlayDelegate { + final CellData cellData; + final List options; + final List selectedOptions; + + const SelectOptionEditor({ + required this.cellData, + required this.options, + required this.selectedOptions, + Key? key, + }) : super(key: key); + + static String identifier() { + return (SelectOptionEditor).toString(); + } + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => SelectOptionEditorBloc( + cellData: cellData, + options: options, + selectedOptions: selectedOptions, + )..add(const SelectOptionEditorEvent.initial()), + child: BlocBuilder( + builder: (context, state) { + return CustomScrollView( + shrinkWrap: true, + slivers: [ + SliverToBoxAdapter(child: _TextField()), + const SliverToBoxAdapter(child: VSpace(10)), + const SliverToBoxAdapter(child: _Title()), + const SliverToBoxAdapter(child: _OptionList()), + ], + ); + }, + ), + ); + } + + static void show( + BuildContext context, + CellData cellData, + List options, + List selectedOptions, + ) { + SelectOptionEditor.hide(context); + final editor = SelectOptionEditor( + cellData: cellData, + options: options, + selectedOptions: selectedOptions, + ); + + // + FlowyOverlay.of(context).insertWithAnchor( + widget: OverlayContainer( + child: SizedBox(width: _editorPannelWidth, child: editor), + constraints: BoxConstraints.loose(const Size(_editorPannelWidth, 300)), + ), + identifier: SelectOptionEditor.identifier(), + anchorContext: context, + anchorDirection: AnchorDirection.bottomWithCenterAligned, + delegate: editor, + ); + } + + static void hide(BuildContext context) { + FlowyOverlay.of(context).remove(identifier()); + } + + @override + bool asBarrier() => true; +} + +class _OptionList extends StatelessWidget { + const _OptionList({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + final cells = state.options.map((option) => _SelectOptionCell(option)).toList(); + final list = ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + itemCount: cells.length, + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + physics: StyledScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ); + return list; + }, + ); + } +} + +class _TextField extends StatelessWidget { + final TextfieldTagsController _tagController = TextfieldTagsController(); + + _TextField({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocConsumer( + listener: (context, state) {}, + builder: (context, state) { + final optionMap = LinkedHashMap.fromIterable(state.selectedOptions, + key: (option) => option.name, value: (option) => option); + + return SizedBox( + height: 42, + child: SelectOptionTextField( + options: state.options, + selectedOptionMap: optionMap, + distanceToText: _editorPannelWidth * 0.7, + tagController: _tagController, + onNewTag: (tagName) { + context.read().add(SelectOptionEditorEvent.newOption(tagName)); + }, + ), + ); + }, + ); + } +} + +class _Title extends StatelessWidget { + const _Title({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: FlowyText.medium( + LocaleKeys.grid_selectOption_pannelTitle.tr(), + fontSize: 12, + color: theme.shader3, + ), + ), + ); + } +} + +class _SelectOptionCell extends StatelessWidget { + final SelectOption option; + const _SelectOptionCell(this.option, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: InkWell( + onTap: () { + context.read().add(SelectOptionEditorEvent.selectOption(option.id)); + }, + child: FlowyHover( + config: HoverDisplayConfig(hoverColor: theme.hover), + builder: (_, onHover) { + List children = [ + SelectOptionTag(option: option), + const Spacer(), + ]; + + if (onHover) { + children.add(FlowyIconButton( + width: 28, + onPressed: () => _showEditOptionPannel(context), + iconPadding: const EdgeInsets.fromLTRB(4, 4, 4, 4), + icon: svgWidget("editor/details", color: theme.iconColor), + )); + } + + return Padding( + padding: const EdgeInsets.all(3.0), + child: Row(children: children), + ); + }, + ), + ), + ); + } + + void _showEditOptionPannel(BuildContext context) { + final pannel = EditSelectOptionPannel( + option: option, + onDeleted: () { + context.read().add(SelectOptionEditorEvent.deleteOption(option)); + }, + onUpdated: (updatedOption) { + context.read().add(SelectOptionEditorEvent.updateOption(updatedOption)); + }, + // key: ValueKey(option.id), + ); + final overlayIdentifier = pannel.toString(); + + FlowyOverlay.of(context).remove(overlayIdentifier); + FlowyOverlay.of(context).insertWithAnchor( + widget: OverlayContainer( + child: pannel, + constraints: BoxConstraints.loose(const Size(200, 300)), + ), + identifier: overlayIdentifier, + anchorContext: context, + anchorDirection: AnchorDirection.rightWithCenterAligned, + anchorOffset: Offset(2 * overlayContainerPadding.left, 0), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/text_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/text_cell.dart similarity index 56% rename from frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/text_cell.dart rename to frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/text_cell.dart index 71ab0c41bd..543a337b9b 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/text_cell.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/text_cell.dart @@ -1,13 +1,12 @@ +import 'dart:async'; import 'package:app_flowy/startup/startup.dart'; -import 'package:app_flowy/workspace/application/grid/cell_bloc/text_cell_bloc.dart'; -import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'cell_container.dart'; -/// The interface of base cell. - -class GridTextCell extends StatefulWidget { - final GridCellData cellData; +class GridTextCell extends GridCell { + final CellData cellData; const GridTextCell({ required this.cellData, Key? key, @@ -18,28 +17,37 @@ class GridTextCell extends StatefulWidget { } class _GridTextCellState extends State { - late TextEditingController _controller; - final _focusNode = FocusNode(); late TextCellBloc _cellBloc; + late TextEditingController _controller; + late CellFocusNode _focusNode; + Timer? _delayOperation; @override void initState() { _cellBloc = getIt(param1: widget.cellData); _controller = TextEditingController(text: _cellBloc.state.content); - _focusNode.addListener(_focusChanged); + _focusNode = CellFocusNode(); super.initState(); } @override Widget build(BuildContext context) { + _focusNode.addCallback(context, focusChanged); + return BlocProvider.value( value: _cellBloc, - child: BlocBuilder( + child: BlocConsumer( + listener: (context, state) { + if (_controller.text != state.content) { + _controller.text = state.content; + } + }, builder: (context, state) { return TextField( controller: _controller, focusNode: _focusNode, - onChanged: (value) {}, + onChanged: (value) => focusChanged(), + onEditingComplete: () => _focusNode.unfocus(), maxLines: 1, style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500), decoration: const InputDecoration( @@ -55,13 +63,20 @@ class _GridTextCellState extends State { @override Future dispose() async { + _delayOperation?.cancel(); _cellBloc.close(); - _focusNode.removeListener(_focusChanged); _focusNode.dispose(); super.dispose(); } - void _focusChanged() { - _cellBloc.add(TextCellEvent.updateText(_controller.text)); + Future focusChanged() async { + if (mounted) { + _delayOperation?.cancel(); + _delayOperation = Timer(const Duration(milliseconds: 300), () { + if (_cellBloc.isClosed == false && _controller.text != _cellBloc.state.content) { + _cellBloc.add(TextCellEvent.updateText(_controller.text)); + } + }); + } } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_container.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_container.dart deleted file mode 100755 index 0bfcc10caa..0000000000 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/cell_container.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; -import 'package:flowy_infra/theme.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -class CellContainer extends StatefulWidget { - final Widget child; - final double width; - const CellContainer({ - Key? key, - required this.child, - required this.width, - }) : super(key: key); - - @override - State createState() => _CellContainerState(); -} - -class _CellContainerState extends State { - @override - Widget build(BuildContext context) { - final theme = context.watch(); - final borderSide = BorderSide(color: theme.shader4, width: 0.4); - return GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () {}, - child: Container( - constraints: BoxConstraints( - maxWidth: widget.width, - ), - decoration: BoxDecoration( - border: Border(right: borderSide, bottom: borderSide), - ), - padding: GridSize.cellContentInsets, - child: Center(child: IntrinsicHeight(child: widget.child)), - ), - ); - } -} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/selection_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/selection_cell.dart deleted file mode 100644 index 94891924cd..0000000000 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/selection_cell.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:app_flowy/startup/startup.dart'; -import 'package:app_flowy/workspace/application/grid/prelude.dart'; -import 'package:flutter/material.dart'; - -class SingleSelectCell extends StatefulWidget { - final GridCellData cellContext; - - const SingleSelectCell({ - required this.cellContext, - Key? key, - }) : super(key: key); - - @override - State createState() => _SingleSelectCellState(); -} - -class _SingleSelectCellState extends State { - late SelectionCellBloc _cellBloc; - - @override - void initState() { - _cellBloc = getIt(param1: widget.cellContext); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Container(); - } - - @override - Future dispose() async { - _cellBloc.close(); - super.dispose(); - } -} - -//---------------------------------------------------------------- -class MultiSelectCell extends StatefulWidget { - final GridCellData cellContext; - - const MultiSelectCell({ - required this.cellContext, - Key? key, - }) : super(key: key); - - @override - State createState() => _MultiSelectCellState(); -} - -class _MultiSelectCellState extends State { - late SelectionCellBloc _cellBloc; - - @override - void initState() { - _cellBloc = getIt(param1: widget.cellContext); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Container(); - } - - @override - Future dispose() async { - _cellBloc.close(); - super.dispose(); - } -} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/footer/grid_footer.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/footer/grid_footer.dart index 69e27a0fc4..8d9719ae75 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/footer/grid_footer.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/footer/grid_footer.dart @@ -39,7 +39,7 @@ class _AddRowButton extends StatelessWidget { text: const FlowyText.medium('New row', fontSize: 12), hoverColor: theme.hover, onTap: () => context.read().add(const GridEvent.createRow()), - icon: svg("home/add"), + leftIcon: svgWidget("home/add"), ); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_cell.dart new file mode 100755 index 0000000000..89cd0b60ff --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_cell.dart @@ -0,0 +1,58 @@ +import 'package:app_flowy/workspace/application/grid/field/field_service.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/button.dart'; +import 'package:flowy_infra_ui/style_widget/text.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'field_type_extension.dart'; + +import 'field_cell_action_sheet.dart'; +import 'field_editor.dart'; + +class GridFieldCell extends StatelessWidget { + final GridFieldCellContext fieldCellContext; + const GridFieldCell(this.fieldCellContext, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + final field = fieldCellContext.field; + + final button = FlowyButton( + hoverColor: theme.hover, + onTap: () => _showActionSheet(context), + rightIcon: svgWidget("editor/details", color: theme.iconColor), + leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), + text: FlowyText.medium(field.name, fontSize: 12), + padding: GridSize.cellContentInsets, + ); + + final borderSide = BorderSide(color: theme.shader4, width: 0.4); + final decoration = BoxDecoration(border: Border(top: borderSide, right: borderSide, bottom: borderSide)); + + return Container( + width: field.width.toDouble(), + decoration: decoration, + child: button, + ); + } + + void _showActionSheet(BuildContext context) { + GridFieldCellActionSheet( + fieldCellContext: fieldCellContext, + onEdited: () => _showFieldEditor(context), + ).show(context); + } + + void _showFieldEditor(BuildContext context) { + FieldEditor( + gridId: fieldCellContext.gridId, + fieldContextLoader: FieldContextLoaderAdaptor( + gridId: fieldCellContext.gridId, + field: fieldCellContext.field, + ), + ).show(context); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_cell_action_sheet.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_cell_action_sheet.dart new file mode 100644 index 0000000000..6cf62bf397 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_cell_action_sheet.dart @@ -0,0 +1,195 @@ +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/layout/sizes.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +import 'package:flowy_infra_ui/style_widget/button.dart'; +import 'package:flowy_infra_ui/style_widget/text.dart'; +import 'package:flowy_infra_ui/widget/spacing.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:app_flowy/generated/locale_keys.g.dart'; + +class GridFieldCellActionSheet extends StatelessWidget with FlowyOverlayDelegate { + final GridFieldCellContext fieldCellContext; + final VoidCallback onEdited; + const GridFieldCellActionSheet({required this.fieldCellContext, required this.onEdited, Key? key}) : super(key: key); + + void show(BuildContext overlayContext) { + FlowyOverlay.of(overlayContext).insertWithAnchor( + widget: OverlayContainer( + child: this, + constraints: BoxConstraints.loose(const Size(240, 200)), + ), + identifier: identifier(), + anchorContext: overlayContext, + anchorDirection: AnchorDirection.bottomWithLeftAligned, + delegate: this, + ); + } + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => getIt(param1: fieldCellContext), + child: SingleChildScrollView( + child: Column( + children: [ + _EditFieldButton( + onEdited: () { + FlowyOverlay.of(context).remove(identifier()); + onEdited(); + }, + ), + const VSpace(6), + _FieldOperationList(fieldCellContext, () => FlowyOverlay.of(context).remove(identifier())), + ], + ), + ), + ); + } + + String identifier() { + return toString(); + } + + @override + bool asBarrier() { + return true; + } +} + +class _EditFieldButton extends StatelessWidget { + final Function() onEdited; + const _EditFieldButton({required this.onEdited, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return BlocBuilder( + builder: (context, state) { + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(LocaleKeys.grid_field_editProperty.tr(), fontSize: 12), + hoverColor: theme.hover, + onTap: onEdited, + ), + ); + }, + ); + } +} + +class _FieldOperationList extends StatelessWidget { + final GridFieldCellContext fieldData; + final VoidCallback onDismissed; + const _FieldOperationList(this.fieldData, this.onDismissed, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final actions = FieldAction.values + .map( + (action) => FieldActionCell( + fieldId: fieldData.field.id, + action: action, + onTap: onDismissed, + ), + ) + .toList(); + + return FieldOperationList(actions: actions); + } +} + +class FieldOperationList extends StatelessWidget { + final List actions; + const FieldOperationList({required this.actions, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GridView( + // https://api.flutter.dev/flutter/widgets/AnimatedList/shrinkWrap.html + shrinkWrap: true, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: 4.0, + mainAxisSpacing: 8, + ), + children: actions, + ); + } +} + +class FieldActionCell extends StatelessWidget { + final String fieldId; + final VoidCallback onTap; + final FieldAction action; + + const FieldActionCell({ + required this.fieldId, + required this.action, + required this.onTap, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return FlowyButton( + text: FlowyText.medium(action.title(), fontSize: 12), + hoverColor: theme.hover, + onTap: () { + action.run(context); + onTap(); + }, + leftIcon: svgWidget(action.iconName(), color: theme.iconColor), + ); + } +} + +enum FieldAction { + hide, + duplicate, + delete, +} + +extension _FieldActionExtension on FieldAction { + String iconName() { + switch (this) { + case FieldAction.hide: + return 'grid/hide'; + case FieldAction.duplicate: + return 'grid/duplicate'; + case FieldAction.delete: + return 'grid/delete'; + } + } + + String title() { + switch (this) { + case FieldAction.hide: + return LocaleKeys.grid_field_hide.tr(); + case FieldAction.duplicate: + return LocaleKeys.grid_field_duplicate.tr(); + case FieldAction.delete: + return LocaleKeys.grid_field_delete.tr(); + } + } + + void run(BuildContext context) { + switch (this) { + case FieldAction.hide: + context.read().add(const ActionSheetEvent.hideField()); + break; + case FieldAction.duplicate: + context.read().add(const ActionSheetEvent.duplicateField()); + break; + case FieldAction.delete: + context.read().add(const ActionSheetEvent.deleteField()); + break; + } + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_editor.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_editor.dart new file mode 100644 index 0000000000..3a41ee938b --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_editor.dart @@ -0,0 +1,117 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/field/field_editor_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/field/field_service.dart'; +import 'package:app_flowy/workspace/application/grid/field/field_switch_bloc.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.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/grid.pb.dart' show Field; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'field_name_input.dart'; +import 'field_switcher.dart'; + +class FieldEditor extends FlowyOverlayDelegate { + final String gridId; + final FieldEditorBloc _fieldEditorBloc; + final EditFieldContextLoader fieldContextLoader; + FieldEditor({ + required this.gridId, + required this.fieldContextLoader, + Key? key, + }) : _fieldEditorBloc = getIt(param1: gridId, param2: fieldContextLoader) { + _fieldEditorBloc.add(const FieldEditorEvent.initial()); + } + + void show( + BuildContext context, { + AnchorDirection anchorDirection = AnchorDirection.bottomWithLeftAligned, + }) { + FlowyOverlay.of(context).remove(identifier()); + FlowyOverlay.of(context).insertWithAnchor( + widget: OverlayContainer( + child: _FieldEditorWidget(_fieldEditorBloc, fieldContextLoader), + constraints: BoxConstraints.loose(const Size(220, 400)), + ), + identifier: identifier(), + anchorContext: context, + anchorDirection: anchorDirection, + style: FlowyOverlayStyle(blur: false), + delegate: this, + ); + } + + String identifier() { + return toString(); + } + + @override + void didRemove() { + _fieldEditorBloc.add(const FieldEditorEvent.done()); + } + + @override + bool asBarrier() => true; +} + +class _FieldEditorWidget extends StatelessWidget { + final FieldEditorBloc editorBloc; + final EditFieldContextLoader fieldContextLoader; + const _FieldEditorWidget(this.editorBloc, this.fieldContextLoader, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: editorBloc, + child: BlocBuilder( + builder: (context, state) { + return state.field.fold( + () => const SizedBox(width: 200), + (field) => ListView( + shrinkWrap: true, + children: [ + const FlowyText.medium("Edit property", fontSize: 12), + const VSpace(10), + const _FieldNameTextField(), + const VSpace(10), + _renderSwitchButton(context, field, state), + ], + ), + ); + }, + ), + ); + } + + Widget _renderSwitchButton(BuildContext context, Field field, FieldEditorState state) { + return FieldSwitcher( + switchContext: SwitchFieldContext(state.gridId, field, state.typeOptionData), + onSwitchToField: (fieldId, fieldType) { + return fieldContextLoader.switchToField(fieldId, fieldType); + }, + onUpdated: (field, typeOptionData) { + context.read().add(FieldEditorEvent.switchField(field, typeOptionData)); + }, + ); + } +} + +class _FieldNameTextField extends StatelessWidget { + const _FieldNameTextField({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocBuilder( + buildWhen: (previous, current) => previous.fieldName != current.fieldName, + builder: (context, state) { + return FieldNameTextField( + name: state.fieldName, + errorText: context.read().state.errorText, + onNameChanged: (newName) { + context.read().add(FieldEditorEvent.updateName(newName)); + }, + ); + }, + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_name_input.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_name_input.dart new file mode 100644 index 0000000000..80cb327379 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_name_input.dart @@ -0,0 +1,32 @@ +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/widget/rounded_input_field.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class FieldNameTextField extends StatelessWidget { + final void Function(String) onNameChanged; + final String name; + final String errorText; + const FieldNameTextField({ + required this.name, + required this.errorText, + required this.onNameChanged, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return RoundedInputField( + height: 36, + style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w500), + initialValue: name, + normalBorderColor: theme.shader4, + errorBorderColor: theme.red, + focusBorderColor: theme.main1, + cursorColor: theme.main1, + errorText: errorText, + onChanged: onNameChanged, + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart new file mode 100644 index 0000000000..decaaec611 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart @@ -0,0 +1,239 @@ +import 'dart:typed_data'; + +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/date.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +import 'package:flowy_infra_ui/style_widget/button.dart'; +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'; +import 'package:flutter_bloc/flutter_bloc.dart'; +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/header/field_type_list.dart'; +import 'field_type_extension.dart'; +import 'package:dartz/dartz.dart' show Either; +import 'type_option/multi_select.dart'; +import 'type_option/number.dart'; +import 'type_option/single_select.dart'; + +typedef UpdateFieldCallback = void Function(Field, Uint8List); +typedef SwitchToFieldCallback = Future> Function( + String fieldId, + FieldType fieldType, +); + +class FieldSwitcher extends StatefulWidget { + final SwitchFieldContext switchContext; + final UpdateFieldCallback onUpdated; + final SwitchToFieldCallback onSwitchToField; + + const FieldSwitcher({ + required this.switchContext, + required this.onUpdated, + required this.onSwitchToField, + Key? key, + }) : super(key: key); + + @override + State createState() => _FieldSwitcherState(); +} + +class _FieldSwitcherState extends State { + String? currentOverlayIdentifier; + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => getIt(param1: widget.switchContext), + child: BlocConsumer( + listener: (context, state) { + widget.onUpdated(state.field, state.typeOptionData); + }, + builder: (context, state) { + List children = [_switchFieldTypeButton(context, state.field)]; + final typeOptionWidget = _typeOptionWidget( + context: context, + field: state.field, + data: state.typeOptionData, + ); + + if (typeOptionWidget != null) { + children.add(typeOptionWidget); + } + + return ListView( + shrinkWrap: true, + children: children, + ); + }, + ), + ); + } + + Widget _switchFieldTypeButton(BuildContext context, Field field) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(field.fieldType.title(), fontSize: 12), + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + hoverColor: theme.hover, + onTap: () { + final list = FieldTypeList(onSelectField: (newFieldType) { + widget.onSwitchToField(field.id, newFieldType).then((result) { + result.fold( + (editFieldContext) { + context.read().add( + FieldSwitchEvent.toFieldType( + editFieldContext.gridField, + editFieldContext.typeOptionData, + ), + ); + }, + (err) => Log.error(err), + ); + }); + }); + _showOverlay(context, list); + }, + leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), + rightIcon: svgWidget("grid/more", color: theme.iconColor), + ), + ); + } + + Widget? _typeOptionWidget({ + required BuildContext context, + required Field field, + required TypeOptionData data, + }) { + final overlayDelegate = TypeOptionOverlayDelegate( + showOverlay: _showOverlay, + hideOverlay: _hideOverlay, + ); + + final dataDelegate = TypeOptionDataDelegate(didUpdateTypeOptionData: (data) { + context.read().add(FieldSwitchEvent.didUpdateTypeOptionData(data)); + }); + + final builder = _makeTypeOptionBuild( + field: field, + data: data, + overlayDelegate: overlayDelegate, + dataDelegate: dataDelegate, + ); + + return builder.customWidget; + } + + void _showOverlay(BuildContext context, Widget child, {VoidCallback? onRemoved}) { + final identifier = child.toString(); + if (currentOverlayIdentifier != null) { + FlowyOverlay.of(context).remove(currentOverlayIdentifier!); + } + + currentOverlayIdentifier = identifier; + FlowyOverlay.of(context).insertWithAnchor( + widget: OverlayContainer( + child: child, + constraints: BoxConstraints.loose(const Size(340, 400)), + ), + identifier: identifier, + anchorContext: context, + anchorDirection: AnchorDirection.leftWithCenterAligned, + style: FlowyOverlayStyle(blur: false), + anchorOffset: const Offset(-20, 0), + ); + } + + void _hideOverlay(BuildContext context) { + if (currentOverlayIdentifier != null) { + FlowyOverlay.of(context).remove(currentOverlayIdentifier!); + } + } +} + +abstract class TypeOptionBuilder { + Widget? get customWidget; +} + +TypeOptionBuilder _makeTypeOptionBuild({ + required Field field, + required TypeOptionData data, + required TypeOptionOverlayDelegate overlayDelegate, + required TypeOptionDataDelegate dataDelegate, +}) { + switch (field.fieldType) { + case FieldType.Checkbox: + return CheckboxTypeOptionBuilder(data); + case FieldType.DateTime: + return DateTypeOptionBuilder(data, overlayDelegate, dataDelegate); + case FieldType.SingleSelect: + return SingleSelectTypeOptionBuilder(field.id, data, overlayDelegate, dataDelegate); + case FieldType.MultiSelect: + return MultiSelectTypeOptionBuilder(field.id, data, overlayDelegate, dataDelegate); + case FieldType.Number: + return NumberTypeOptionBuilder(data, overlayDelegate, dataDelegate); + case FieldType.RichText: + return RichTextTypeOptionBuilder(data); + + default: + throw UnimplementedError; + } +} + +abstract class TypeOptionWidget extends StatelessWidget { + const TypeOptionWidget({Key? key}) : super(key: key); +} + +typedef TypeOptionData = Uint8List; +typedef TypeOptionDataCallback = void Function(TypeOptionData typeOptionData); +typedef ShowOverlayCallback = void Function( + BuildContext anchorContext, + Widget child, { + VoidCallback? onRemoved, +}); +typedef HideOverlayCallback = void Function(BuildContext anchorContext); + +class TypeOptionOverlayDelegate { + ShowOverlayCallback showOverlay; + HideOverlayCallback hideOverlay; + TypeOptionOverlayDelegate({ + required this.showOverlay, + required this.hideOverlay, + }); +} + +class TypeOptionDataDelegate { + TypeOptionDataCallback didUpdateTypeOptionData; + + TypeOptionDataDelegate({ + required this.didUpdateTypeOptionData, + }); +} + +class RichTextTypeOptionBuilder extends TypeOptionBuilder { + RichTextTypeOption typeOption; + + RichTextTypeOptionBuilder(TypeOptionData typeOptionData) : typeOption = RichTextTypeOption.fromBuffer(typeOptionData); + + @override + Widget? get customWidget => null; +} + +class CheckboxTypeOptionBuilder extends TypeOptionBuilder { + CheckboxTypeOption typeOption; + + CheckboxTypeOptionBuilder(TypeOptionData typeOptionData) : typeOption = CheckboxTypeOption.fromBuffer(typeOptionData); + + @override + Widget? get customWidget => null; +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_extension.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_extension.dart new file mode 100644 index 0000000000..ce37afe861 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_extension.dart @@ -0,0 +1,44 @@ + +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/meta.pb.dart'; +import 'package:app_flowy/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; + +extension FieldTypeListExtension on FieldType { + String iconName() { + switch (this) { + case FieldType.Checkbox: + return "grid/field/checkbox"; + case FieldType.DateTime: + return "grid/field/date"; + case FieldType.MultiSelect: + return "grid/field/multi_select"; + case FieldType.Number: + return "grid/field/number"; + case FieldType.RichText: + return "grid/field/text"; + case FieldType.SingleSelect: + return "grid/field/single_select"; + default: + throw UnimplementedError; + } + } + + String title() { + switch (this) { + case FieldType.Checkbox: + return LocaleKeys.grid_field_checkboxFieldName.tr(); + case FieldType.DateTime: + return LocaleKeys.grid_field_dateFieldName.tr(); + case FieldType.MultiSelect: + return LocaleKeys.grid_field_multiSelectFieldName.tr(); + case FieldType.Number: + return LocaleKeys.grid_field_numberFieldName.tr(); + case FieldType.RichText: + return LocaleKeys.grid_field_textFieldName.tr(); + case FieldType.SingleSelect: + return LocaleKeys.grid_field_singleSelectFieldName.tr(); + default: + throw UnimplementedError; + } + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_list.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_list.dart new file mode 100644 index 0000000000..dfeacf4d17 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/field_type_list.dart @@ -0,0 +1,77 @@ +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +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:flutter/material.dart'; +import 'field_type_extension.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +typedef SelectFieldCallback = void Function(FieldType); + +class FieldTypeList extends StatelessWidget with FlowyOverlayDelegate { + final SelectFieldCallback onSelectField; + const FieldTypeList({required this.onSelectField, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final cells = FieldType.values.where((ty) => ty != FieldType.DateTime).map((fieldType) { + return FieldTypeCell( + fieldType: fieldType, + onSelectField: (fieldType) { + onSelectField(fieldType); + FlowyOverlay.of(context).remove(FieldTypeList.identifier()); + }, + ); + }).toList(); + + return SizedBox( + width: 140, + child: ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + itemCount: cells.length, + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + physics: StyledScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ), + ); + } + + static String identifier() { + return (FieldTypeList).toString(); + } +} + +class FieldTypeCell extends StatelessWidget { + final FieldType fieldType; + final SelectFieldCallback onSelectField; + const FieldTypeCell({ + required this.fieldType, + required this.onSelectField, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(fieldType.title(), fontSize: 12), + hoverColor: theme.hover, + onTap: () => onSelectField(fieldType), + leftIcon: svgWidget(fieldType.iconName(), color: theme.iconColor), + ), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/grid_header.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/grid_header.dart new file mode 100644 index 0000000000..2a7baaa773 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/grid_header.dart @@ -0,0 +1,143 @@ +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/layout/sizes.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/button.dart'; +import 'package:flowy_infra_ui/style_widget/text.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' hide Row; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'field_editor.dart'; +import 'field_cell.dart'; + +class GridHeader extends StatelessWidget { + final String gridId; + final List fields; + const GridHeader({Key? key, required this.gridId, required this.fields}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) { + final bloc = getIt(param1: gridId, param2: fields); + bloc.add(const GridHeaderEvent.initial()); + return bloc; + }, + child: BlocBuilder( + builder: (context, state) { + return SliverPersistentHeader( + delegate: _GridHeaderDelegate(gridId: gridId, fields: List.from(state.fields)), + floating: true, + pinned: true, + ); + }, + ), + ); + } +} + +class _GridHeaderDelegate extends SliverPersistentHeaderDelegate { + final String gridId; + final List fields; + + _GridHeaderDelegate({required this.gridId, required this.fields}); + + @override + Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) { + return _GridHeaderWidget(gridId: gridId, fields: fields); + } + + @override + double get maxExtent => GridSize.headerHeight; + + @override + double get minExtent => GridSize.headerHeight; + + @override + bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) { + if (oldDelegate is _GridHeaderDelegate) { + return fields != oldDelegate.fields; + } + return true; + } +} + +class _GridHeaderWidget extends StatelessWidget { + final String gridId; + final List fields; + + const _GridHeaderWidget({required this.gridId, required this.fields, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + final cells = fields.map( + (field) => GridFieldCell( + GridFieldCellContext(gridId: gridId, field: field), + ), + ); + + final row = Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const _HeaderLeading(), + ...cells, + _HeaderTrailing(gridId: gridId), + ], + ); + + return Container(height: GridSize.headerHeight, color: theme.surface, child: row); + } +} + +class _HeaderLeading extends StatelessWidget { + const _HeaderLeading({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: GridSize.leadingHeaderPadding, + ); + } +} + +class _HeaderTrailing extends StatelessWidget { + final String gridId; + const _HeaderTrailing({required this.gridId, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + final borderSide = BorderSide(color: theme.shader4, width: 0.4); + return Container( + width: GridSize.trailHeaderPadding, + decoration: BoxDecoration( + border: Border(top: borderSide, bottom: borderSide), + ), + padding: GridSize.headerContentInsets, + child: CreateFieldButton(gridId: gridId), + ); + } +} + +class CreateFieldButton extends StatelessWidget { + final String gridId; + const CreateFieldButton({required this.gridId, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + + return FlowyButton( + text: const FlowyText.medium('New column', fontSize: 12), + hoverColor: theme.hover, + onTap: () => FieldEditor( + gridId: gridId, + fieldContextLoader: NewFieldContextLoader(gridId: gridId), + ).show(context), + leftIcon: svgWidget("home/add"), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header.dart deleted file mode 100644 index 83d24535f4..0000000000 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:app_flowy/startup/startup.dart'; -import 'package:app_flowy/workspace/application/grid/column_bloc.dart'; -import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; -import 'package:flowy_infra/image.dart'; -import 'package:flowy_infra/theme.dart'; -import 'package:flowy_infra_ui/style_widget/button.dart'; -import 'package:flowy_infra_ui/style_widget/text.dart'; -import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' hide Row; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'header_cell.dart'; - -class GridHeaderDelegate extends SliverPersistentHeaderDelegate { - final List fields; - - GridHeaderDelegate(this.fields); - - @override - Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) { - return GridHeader(fields: fields); - } - - @override - double get maxExtent => GridSize.headerHeight; - - @override - double get minExtent => GridSize.headerHeight; - - @override - bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) { - if (oldDelegate is GridHeaderDelegate) { - return fields != oldDelegate.fields; - } - return false; - } -} - -class GridHeader extends StatelessWidget { - final List fields; - const GridHeader({required this.fields, Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (context) => getIt(param1: fields)..add(const ColumnEvent.initial()), - child: BlocBuilder( - builder: (context, state) { - final headers = state.fields - .map( - (field) => HeaderCellContainer( - width: field.width.toDouble(), - child: HeaderCell(field), - ), - ) - .toList(); - - return Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const LeadingHeaderCell(), - ...headers, - const TrailingHeaderCell(), - ], - ); - }, - ), - ); - } -} - -class LeadingHeaderCell extends StatelessWidget { - const LeadingHeaderCell({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: GridSize.leadingHeaderPadding, - ); - } -} - -class TrailingHeaderCell extends StatelessWidget { - const TrailingHeaderCell({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final theme = context.watch(); - final borderSide = BorderSide(color: theme.shader4, width: 0.4); - return Container( - width: GridSize.trailHeaderPadding, - decoration: BoxDecoration( - border: Border(top: borderSide, bottom: borderSide), - ), - padding: GridSize.headerContentInsets, - child: const CreateColumnButton(), - ); - } -} - -class CreateColumnButton extends StatelessWidget { - const CreateColumnButton({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final theme = context.watch(); - return FlowyButton( - text: const FlowyText.medium('New column', fontSize: 12), - hoverColor: theme.hover, - onTap: () => context.read().add(const ColumnEvent.createColumn()), - icon: svg("home/add"), - ); - } -} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header_cell.dart deleted file mode 100755 index aacdcd251e..0000000000 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/header_cell.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; -import 'package:flowy_infra/theme.dart'; -import 'package:flowy_infra_ui/style_widget/button.dart'; -import 'package:flowy_infra_ui/style_widget/text.dart'; -import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -class HeaderCell extends StatelessWidget { - final Field field; - const HeaderCell(this.field, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final theme = context.watch(); - return FlowyButton( - text: FlowyText.medium(field.name, fontSize: 12), - hoverColor: theme.hover, - onTap: () {}, - ); - } -} - -class HeaderCellContainer extends StatelessWidget { - final HeaderCell child; - final double width; - const HeaderCellContainer({Key? key, required this.child, required this.width}) : super(key: key); - - @override - Widget build(BuildContext context) { - final theme = context.watch(); - final borderSide = BorderSide(color: theme.shader4, width: 0.4); - return Container( - width: width, - decoration: BoxDecoration( - border: Border(top: borderSide, right: borderSide, bottom: borderSide), - ), - padding: GridSize.headerContentInsets, - child: child, - ); - } -} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/date.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/date.dart new file mode 100644 index 0000000000..a31d371b09 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/date.dart @@ -0,0 +1,275 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/field/type_option/date_bloc.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart'; +import 'package:easy_localization/easy_localization.dart' hide DateFormat; +import 'package:app_flowy/generated/locale_keys.g.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +import 'package:flowy_infra_ui/style_widget/button.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/date_type_option.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class DateTypeOptionBuilder extends TypeOptionBuilder { + final DateTypeOptionWidget _widget; + + DateTypeOptionBuilder( + TypeOptionData typeOptionData, + TypeOptionOverlayDelegate overlayDelegate, + TypeOptionDataDelegate dataDelegate, + ) : _widget = DateTypeOptionWidget( + typeOption: DateTypeOption.fromBuffer(typeOptionData), + dataDelegate: dataDelegate, + overlayDelegate: overlayDelegate, + ); + + @override + Widget? get customWidget => _widget; +} + +class DateTypeOptionWidget extends TypeOptionWidget { + final DateTypeOption typeOption; + final TypeOptionOverlayDelegate overlayDelegate; + final TypeOptionDataDelegate dataDelegate; + const DateTypeOptionWidget({ + required this.typeOption, + required this.dataDelegate, + required this.overlayDelegate, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => getIt(param1: typeOption), + child: BlocConsumer( + listener: (context, state) => dataDelegate.didUpdateTypeOptionData(state.typeOption.writeToBuffer()), + builder: (context, state) { + return Column(children: [ + _dateFormatButton(context, state.typeOption.dateFormat), + _timeFormatButton(context, state.typeOption.timeFormat), + ]); + }, + ), + ); + } + + Widget _dateFormatButton(BuildContext context, DateFormat dataFormat) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(LocaleKeys.grid_field_dateFormat.tr(), fontSize: 12), + padding: GridSize.typeOptionContentInsets, + hoverColor: theme.hover, + onTap: () { + final list = DateFormatList( + selectedFormat: dataFormat, + onSelected: (format) { + context.read().add(DateTypeOptionEvent.didSelectDateFormat(format)); + }, + ); + overlayDelegate.showOverlay(context, list); + }, + rightIcon: svgWidget("grid/more", color: theme.iconColor), + ), + ); + } + + Widget _timeFormatButton(BuildContext context, TimeFormat timeFormat) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(LocaleKeys.grid_field_timeFormat.tr(), fontSize: 12), + padding: GridSize.typeOptionContentInsets, + hoverColor: theme.hover, + onTap: () { + final list = TimeFormatList( + selectedFormat: timeFormat, + onSelected: (format) { + context.read().add(DateTypeOptionEvent.didSelectTimeFormat(format)); + }); + overlayDelegate.showOverlay(context, list); + }, + rightIcon: svgWidget("grid/more", color: theme.iconColor), + ), + ); + } +} + +class DateFormatList extends StatelessWidget { + final DateFormat selectedFormat; + final Function(DateFormat format) onSelected; + const DateFormatList({required this.selectedFormat, required this.onSelected, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final cells = DateFormat.values.map((format) { + return DateFormatCell( + dateFormat: format, + onSelected: (format) { + onSelected(format); + FlowyOverlay.of(context).remove(identifier()); + }, + isSelected: selectedFormat == format); + }).toList(); + + return SizedBox( + width: 180, + child: ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + itemCount: cells.length, + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ), + ); + } + + String identifier() { + return toString(); + } +} + +class DateFormatCell extends StatelessWidget { + final bool isSelected; + final DateFormat dateFormat; + final Function(DateFormat format) onSelected; + const DateFormatCell({ + required this.dateFormat, + required this.onSelected, + required this.isSelected, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + Widget? checkmark; + if (isSelected) { + checkmark = svgWidget("grid/checkmark"); + } + + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(dateFormat.title(), fontSize: 12), + hoverColor: theme.hover, + rightIcon: checkmark, + onTap: () => onSelected(dateFormat), + ), + ); + } +} + +extension DateFormatExtension on DateFormat { + String title() { + switch (this) { + case DateFormat.Friendly: + return LocaleKeys.grid_field_dateFormatFriendly.tr(); + case DateFormat.ISO: + return LocaleKeys.grid_field_dateFormatISO.tr(); + case DateFormat.Local: + return LocaleKeys.grid_field_dateFormatLocal.tr(); + case DateFormat.US: + return LocaleKeys.grid_field_dateFormatUS.tr(); + default: + throw UnimplementedError; + } + } +} + +class TimeFormatList extends StatelessWidget { + final TimeFormat selectedFormat; + final Function(TimeFormat format) onSelected; + const TimeFormatList({ + required this.selectedFormat, + required this.onSelected, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final cells = TimeFormat.values.map((format) { + return TimeFormatCell( + isSelected: format == selectedFormat, + timeFormat: format, + onSelected: (format) { + onSelected(format); + FlowyOverlay.of(context).remove(identifier()); + }); + }).toList(); + + return SizedBox( + width: 120, + child: ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + itemCount: cells.length, + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ), + ); + } + + String identifier() { + return toString(); + } +} + +class TimeFormatCell extends StatelessWidget { + final TimeFormat timeFormat; + final bool isSelected; + final Function(TimeFormat format) onSelected; + const TimeFormatCell({ + required this.timeFormat, + required this.onSelected, + required this.isSelected, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + Widget? checkmark; + if (isSelected) { + checkmark = svgWidget("grid/checkmark"); + } + + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(timeFormat.title(), fontSize: 12), + hoverColor: theme.hover, + rightIcon: checkmark, + onTap: () => onSelected(timeFormat), + ), + ); + } +} + +extension TimeFormatExtension on TimeFormat { + String title() { + switch (this) { + case TimeFormat.TwelveHour: + return LocaleKeys.grid_field_timeFormatTwelveHour.tr(); + case TimeFormat.TwentyFourHour: + return LocaleKeys.grid_field_timeFormatTwentyFourHour.tr(); + default: + throw UnimplementedError; + } + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/edit_option_pannel.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/edit_option_pannel.dart new file mode 100644 index 0000000000..1893a77846 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/edit_option_pannel.dart @@ -0,0 +1,186 @@ +import 'package:app_flowy/workspace/application/grid/field/type_option/edit_option_bloc.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/cell/selection_cell/extension.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/widget.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +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/selection_type_option.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:app_flowy/generated/locale_keys.g.dart'; + +class EditSelectOptionPannel extends StatelessWidget { + final SelectOption option; + final VoidCallback onDeleted; + final Function(SelectOption) onUpdated; + const EditSelectOptionPannel({ + required this.option, + required this.onDeleted, + required this.onUpdated, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => EditOptionBloc(option: option), + child: MultiBlocListener( + listeners: [ + BlocListener( + listenWhen: (p, c) => p.deleted != c.deleted, + listener: (context, state) { + state.deleted.fold(() => null, (_) => onDeleted()); + }, + ), + BlocListener( + listenWhen: (p, c) => p.option != c.option, + listener: (context, state) { + onUpdated(state.option); + }, + ), + ], + child: BlocBuilder( + builder: (context, state) { + List slivers = [ + SliverToBoxAdapter(child: _OptionNameTextField(state.option.name)), + const SliverToBoxAdapter(child: VSpace(10)), + const SliverToBoxAdapter(child: _DeleteTag()), + const SliverToBoxAdapter(child: TypeOptionSeparator()), + SliverToBoxAdapter(child: SelectOptionColorList(selectedColor: state.option.color)), + ]; + + return SizedBox( + width: 160, + child: CustomScrollView( + slivers: slivers, + controller: ScrollController(), + physics: StyledScrollPhysics(), + ), + ); + }, + ), + ), + ); + } +} + +class _DeleteTag extends StatelessWidget { + const _DeleteTag({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(LocaleKeys.grid_selectOption_deleteTag.tr(), fontSize: 12), + hoverColor: theme.hover, + leftIcon: svgWidget("grid/delete", color: theme.iconColor), + onTap: () { + context.read().add(const EditOptionEvent.delete()); + }, + ), + ); + } +} + +class _OptionNameTextField extends StatelessWidget { + final String name; + const _OptionNameTextField(this.name, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return NameTextField( + name: name, + onCanceled: () {}, + onDone: (optionName) { + context.read().add(EditOptionEvent.updateName(optionName)); + }, + ); + } +} + +class SelectOptionColorList extends StatelessWidget { + final SelectOptionColor selectedColor; + const SelectOptionColorList({required this.selectedColor, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final cells = SelectOptionColor.values.map((color) { + return _SelectOptionColorCell(color: color, isSelected: selectedColor == color); + }).toList(); + + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: GridSize.typeOptionContentInsets, + child: SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyText.medium( + LocaleKeys.grid_selectOption_colorPannelTitle.tr(), + fontSize: 12, + textAlign: TextAlign.left, + ), + ), + ), + ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + itemCount: cells.length, + physics: StyledScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ), + ], + ); + } +} + +class _SelectOptionColorCell extends StatelessWidget { + final SelectOptionColor color; + final bool isSelected; + const _SelectOptionColorCell({required this.color, required this.isSelected, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + Widget? checkmark; + if (isSelected) { + checkmark = svgWidget("grid/checkmark"); + } + + final colorIcon = SizedBox.square( + dimension: 16, + child: Container( + decoration: BoxDecoration( + color: color.make(context), + shape: BoxShape.circle, + ), + ), + ); + + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(color.optionName(), fontSize: 12), + hoverColor: theme.hover, + leftIcon: colorIcon, + rightIcon: checkmark, + onTap: () { + context.read().add(EditOptionEvent.updateColor(color)); + }, + ), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/multi_select.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/multi_select.dart new file mode 100644 index 0000000000..11d2c866ce --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/multi_select.dart @@ -0,0 +1,72 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/field/type_option/multi_select_bloc.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'option_pannel.dart'; + +class MultiSelectTypeOptionBuilder extends TypeOptionBuilder { + final MultiSelectTypeOptionWidget _widget; + + MultiSelectTypeOptionBuilder( + String fieldId, + TypeOptionData typeOptionData, + TypeOptionOverlayDelegate overlayDelegate, + TypeOptionDataDelegate dataDelegate, + ) : _widget = MultiSelectTypeOptionWidget( + fieldId: fieldId, + typeOption: MultiSelectTypeOption.fromBuffer(typeOptionData), + overlayDelegate: overlayDelegate, + dataDelegate: dataDelegate, + ); + + @override + Widget? get customWidget => _widget; +} + +class MultiSelectTypeOptionWidget extends TypeOptionWidget { + final String fieldId; + final MultiSelectTypeOption typeOption; + final TypeOptionOverlayDelegate overlayDelegate; + final TypeOptionDataDelegate dataDelegate; + const MultiSelectTypeOptionWidget({ + required this.fieldId, + required this.typeOption, + required this.overlayDelegate, + required this.dataDelegate, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => getIt(param1: typeOption, param2: fieldId), + child: BlocConsumer( + listener: (context, state) { + dataDelegate.didUpdateTypeOptionData(state.typeOption.writeToBuffer()); + }, + builder: (context, state) { + return OptionPannel( + options: state.typeOption.options, + beginEdit: () { + overlayDelegate.hideOverlay(context); + }, + createOptionCallback: (name) { + context.read().add(MultiSelectTypeOptionEvent.createOption(name)); + }, + updateOptionCallback: (updateOption) { + context.read().add(MultiSelectTypeOptionEvent.updateOption(updateOption)); + }, + deleteOptionCallback: (deleteOption) { + context.read().add(MultiSelectTypeOptionEvent.deleteOption(deleteOption)); + }, + overlayDelegate: overlayDelegate, + key: ValueKey(state.typeOption.hashCode), + ); + }, + ), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/number.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/number.dart new file mode 100644 index 0000000000..a12b7e2be9 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/number.dart @@ -0,0 +1,159 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/field/type_option/number_bloc.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +import 'package:flowy_infra_ui/style_widget/button.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/number_type_option.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:easy_localization/easy_localization.dart' hide NumberFormat; +import 'package:app_flowy/generated/locale_keys.g.dart'; + +class NumberTypeOptionBuilder extends TypeOptionBuilder { + final NumberTypeOptionWidget _widget; + + NumberTypeOptionBuilder( + TypeOptionData typeOptionData, + TypeOptionOverlayDelegate overlayDelegate, + TypeOptionDataDelegate dataDelegate, + ) : _widget = NumberTypeOptionWidget( + typeOption: NumberTypeOption.fromBuffer(typeOptionData), + dataDelegate: dataDelegate, + overlayDelegate: overlayDelegate, + ); + + @override + Widget? get customWidget => _widget; +} + +class NumberTypeOptionWidget extends TypeOptionWidget { + final TypeOptionDataDelegate dataDelegate; + final TypeOptionOverlayDelegate overlayDelegate; + final NumberTypeOption typeOption; + const NumberTypeOptionWidget( + {required this.typeOption, required this.dataDelegate, required this.overlayDelegate, Key? key}) + : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return BlocProvider( + create: (context) => getIt(param1: typeOption), + child: SizedBox( + height: GridSize.typeOptionItemHeight, + child: BlocConsumer( + listener: (context, state) => dataDelegate.didUpdateTypeOptionData(state.typeOption.writeToBuffer()), + builder: (context, state) { + return FlowyButton( + text: FlowyText.medium(LocaleKeys.grid_field_numberFormat.tr(), fontSize: 12), + padding: GridSize.typeOptionContentInsets, + hoverColor: theme.hover, + onTap: () { + final list = NumberFormatList(onSelected: (format) { + context.read().add(NumberTypeOptionEvent.didSelectFormat(format)); + }); + overlayDelegate.showOverlay(context, list); + }, + rightIcon: svgWidget("grid/more", color: theme.iconColor), + ); + }, + ), + ), + ); + } +} + +typedef _SelectNumberFormatCallback = Function(NumberFormat format); + +class NumberFormatList extends StatelessWidget { + final _SelectNumberFormatCallback onSelected; + const NumberFormatList({required this.onSelected, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final cells = NumberFormat.values.map((format) { + return NumberFormatCell( + format: format, + onSelected: (format) { + onSelected(format); + FlowyOverlay.of(context).remove(identifier()); + }); + }).toList(); + + return SizedBox( + width: 120, + child: ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + itemCount: cells.length, + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ), + ); + } + + String identifier() { + return toString(); + } +} + +class NumberFormatCell extends StatelessWidget { + final NumberFormat format; + final Function(NumberFormat format) onSelected; + const NumberFormatCell({required this.format, required this.onSelected, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(format.title(), fontSize: 12), + hoverColor: theme.hover, + onTap: () => onSelected(format), + leftIcon: svgWidget(format.iconName(), color: theme.iconColor), + ), + ); + } +} + +extension NumberFormatExtension on NumberFormat { + String title() { + switch (this) { + case NumberFormat.CNY: + return "Yen"; + case NumberFormat.EUR: + return "Euro"; + case NumberFormat.Number: + return "Numbers"; + case NumberFormat.USD: + return "US Dollar"; + default: + throw UnimplementedError; + } + } + + String iconName() { + switch (this) { + case NumberFormat.CNY: + return "grid/field/yen"; + case NumberFormat.EUR: + return "grid/field/euro"; + case NumberFormat.Number: + return "grid/field/numbers"; + case NumberFormat.USD: + return "grid/field/us_dollar"; + default: + throw UnimplementedError; + } + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/option_pannel.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/option_pannel.dart new file mode 100644 index 0000000000..034accfb19 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/option_pannel.dart @@ -0,0 +1,233 @@ +import 'package:app_flowy/workspace/application/grid/field/type_option/option_pannel_bloc.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/button.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/selection_type_option.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:app_flowy/generated/locale_keys.g.dart'; + +import 'edit_option_pannel.dart'; +import 'widget.dart'; + +class OptionPannel extends StatelessWidget { + final List options; + final VoidCallback beginEdit; + final Function(String optionName) createOptionCallback; + final Function(SelectOption) updateOptionCallback; + final Function(SelectOption) deleteOptionCallback; + final TypeOptionOverlayDelegate overlayDelegate; + + const OptionPannel({ + required this.options, + required this.beginEdit, + required this.createOptionCallback, + required this.updateOptionCallback, + required this.deleteOptionCallback, + required this.overlayDelegate, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => OptionPannelBloc(options: options), + child: BlocConsumer( + listener: (context, state) { + if (state.isEditingOption) { + beginEdit(); + } + state.newOptionName.fold( + () => null, + (optionName) => createOptionCallback(optionName), + ); + + state.updateOption.fold( + () => null, + (updateOption) => updateOptionCallback(updateOption), + ); + + state.deleteOption.fold( + () => null, + (deleteOption) => deleteOptionCallback(deleteOption), + ); + }, + builder: (context, state) { + List children = [ + const TypeOptionSeparator(), + const OptionTitle(), + ]; + if (state.isEditingOption) { + children.add(const _OptionNameTextField()); + } + + if (state.options.isEmpty && !state.isEditingOption) { + children.add(const _AddOptionButton()); + } + + if (state.options.isNotEmpty) { + children.add(_OptionList(overlayDelegate)); + } + + return Column(children: children); + }, + ), + ); + } +} + +class OptionTitle extends StatelessWidget { + const OptionTitle({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + + return BlocBuilder( + builder: (context, state) { + List children = [FlowyText.medium(LocaleKeys.grid_field_optionTitle.tr(), fontSize: 12)]; + if (state.options.isNotEmpty) { + children.add(const Spacer()); + children.add( + SizedBox( + width: 100, + height: 26, + child: FlowyButton( + text: FlowyText.medium( + LocaleKeys.grid_field_addOption.tr(), + fontSize: 12, + textAlign: TextAlign.center, + ), + hoverColor: theme.hover, + onTap: () { + context.read().add(const OptionPannelEvent.beginAddingOption()); + }, + ), + ), + ); + } + + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: Row(children: children), + ); + }, + ); + } +} + +class _OptionList extends StatelessWidget { + final TypeOptionOverlayDelegate delegate; + const _OptionList(this.delegate, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocBuilder( + buildWhen: (previous, current) { + return previous.options != current.options; + }, + builder: (context, state) { + final cells = state.options.map((option) { + return _makeOptionCell(context, option); + }).toList(); + + return ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + itemCount: cells.length, + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ); + }, + ); + } + + _OptionCell _makeOptionCell(BuildContext context, SelectOption option) { + return _OptionCell( + option: option, + onEdited: (option) { + final pannel = EditSelectOptionPannel( + option: option, + onDeleted: () { + delegate.hideOverlay(context); + context.read().add(OptionPannelEvent.deleteOption(option)); + }, + onUpdated: (updatedOption) { + delegate.hideOverlay(context); + context.read().add(OptionPannelEvent.updateOption(updatedOption)); + }, + ); + delegate.showOverlay(context, pannel); + }, + ); + } +} + +class _OptionCell extends StatelessWidget { + final SelectOption option; + final Function(SelectOption) onEdited; + const _OptionCell({ + required this.option, + required this.onEdited, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(option.name, fontSize: 12), + hoverColor: theme.hover, + onTap: () => onEdited(option), + rightIcon: svgWidget("grid/details", color: theme.iconColor), + ), + ); + } +} + +class _AddOptionButton extends StatelessWidget { + const _AddOptionButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(LocaleKeys.grid_field_addSelectOption.tr(), fontSize: 12), + hoverColor: theme.hover, + onTap: () { + context.read().add(const OptionPannelEvent.beginAddingOption()); + }, + leftIcon: svgWidget("home/add", color: theme.iconColor), + ), + ); + } +} + +class _OptionNameTextField extends StatelessWidget { + const _OptionNameTextField({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return NameTextField( + name: "", + onCanceled: () { + context.read().add(const OptionPannelEvent.endAddingOption()); + }, + onDone: (optionName) { + context.read().add(OptionPannelEvent.createOption(optionName)); + }); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/single_select.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/single_select.dart new file mode 100644 index 0000000000..ecc0dfc80a --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/single_select.dart @@ -0,0 +1,71 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/field/type_option/single_select_bloc.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_switcher.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'option_pannel.dart'; + +class SingleSelectTypeOptionBuilder extends TypeOptionBuilder { + final SingleSelectTypeOptionWidget _widget; + + SingleSelectTypeOptionBuilder( + String fieldId, + TypeOptionData typeOptionData, + TypeOptionOverlayDelegate overlayDelegate, + TypeOptionDataDelegate dataDelegate, + ) : _widget = SingleSelectTypeOptionWidget( + fieldId: fieldId, + typeOption: SingleSelectTypeOption.fromBuffer(typeOptionData), + dataDelegate: dataDelegate, + overlayDelegate: overlayDelegate, + ); + + @override + Widget? get customWidget => _widget; +} + +class SingleSelectTypeOptionWidget extends TypeOptionWidget { + final String fieldId; + final SingleSelectTypeOption typeOption; + final TypeOptionOverlayDelegate overlayDelegate; + final TypeOptionDataDelegate dataDelegate; + const SingleSelectTypeOptionWidget({ + required this.fieldId, + required this.typeOption, + required this.dataDelegate, + required this.overlayDelegate, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => getIt(param1: typeOption, param2: fieldId), + child: BlocConsumer( + listener: (context, state) { + dataDelegate.didUpdateTypeOptionData(state.typeOption.writeToBuffer()); + }, + builder: (context, state) { + return OptionPannel( + options: state.typeOption.options, + beginEdit: () { + overlayDelegate.hideOverlay(context); + }, + createOptionCallback: (name) { + context.read().add(SingleSelectTypeOptionEvent.createOption(name)); + }, + updateOptionCallback: (updateOption) { + context.read().add(SingleSelectTypeOptionEvent.updateOption(updateOption)); + }, + deleteOptionCallback: (deleteOption) { + context.read().add(SingleSelectTypeOptionEvent.deleteOption(deleteOption)); + }, + overlayDelegate: overlayDelegate, + key: ValueKey(state.typeOption.hashCode), + ); + }, + ), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/widget.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/widget.dart new file mode 100644 index 0000000000..6f4e86a4e1 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/header/type_option/widget.dart @@ -0,0 +1,88 @@ +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/widget/rounded_input_field.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class NameTextField extends StatefulWidget { + final void Function(String) onDone; + final void Function() onCanceled; + final String name; + + const NameTextField({ + required this.name, + required this.onDone, + required this.onCanceled, + Key? key, + }) : super(key: key); + + @override + State createState() => _NameTextFieldState(); +} + +class _NameTextFieldState extends State { + late FocusNode _focusNode; + var isEdited = false; + late TextEditingController _controller; + + @override + void initState() { + _focusNode = FocusNode(); + _controller = TextEditingController(text: widget.name); + + _focusNode.addListener(notifyDidEndEditing); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + + return RoundedInputField( + controller: _controller, + focusNode: _focusNode, + autoFocus: true, + height: 36, + style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w500), + normalBorderColor: theme.shader4, + focusBorderColor: theme.main1, + cursorColor: theme.main1, + onEditingComplete: () { + widget.onDone(_controller.text); + }, + ); + } + + @override + void dispose() { + _focusNode.removeListener(notifyDidEndEditing); + _focusNode.dispose(); + super.dispose(); + } + + void notifyDidEndEditing() { + if (_controller.text.isEmpty) { + if (isEdited) { + widget.onCanceled(); + } + isEdited = true; + } else { + widget.onDone(_controller.text); + } + } +} + +class TypeOptionSeparator extends StatelessWidget { + const TypeOptionSeparator({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return Padding( + padding: const EdgeInsets.symmetric(vertical: 6), + child: Container( + color: theme.shader4, + height: 0.25, + ), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/number_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/cell/number_cell.dart similarity index 80% rename from frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/number_cell.dart rename to frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/cell/number_cell.dart index ea3f70fed3..41b8cf6ee5 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/number_cell.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/cell/number_cell.dart @@ -1,11 +1,10 @@ import 'package:app_flowy/startup/startup.dart'; -import 'package:app_flowy/workspace/application/grid/cell_bloc/number_cell_bloc.dart'; -import 'package:app_flowy/workspace/application/grid/row_service.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class NumberCell extends StatefulWidget { - final GridCellData cellData; + final CellData cellData; const NumberCell({ required this.cellData, @@ -39,7 +38,7 @@ class _NumberCellState extends State { @override Future dispose() async { - await _cellBloc.close(); + _cellBloc.close(); super.dispose(); } } diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_row.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/grid_row.dart similarity index 51% rename from frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_row.dart rename to frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/grid_row.dart index f062202744..08d68f197a 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/content/grid_row.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/grid_row.dart @@ -1,17 +1,17 @@ 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/layout/sizes.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/cell/prelude.dart'; import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'cell_builder.dart'; -import 'cell_container.dart'; +import 'package:provider/provider.dart'; class GridRowWidget extends StatefulWidget { - final GridRowData data; - GridRowWidget({required this.data, Key? key}) : super(key: ObjectKey(data.rowId)); + final RowData data; + const GridRowWidget({required this.data, Key? key}) : super(key: key); @override State createState() => _GridRowWidgetState(); @@ -19,10 +19,12 @@ class GridRowWidget extends StatefulWidget { class _GridRowWidgetState extends State { late RowBloc _rowBloc; + late _RegionStateNotifier _rowStateNotifier; @override void initState() { _rowBloc = getIt(param1: widget.data)..add(const RowEvent.initial()); + _rowStateNotifier = _RegionStateNotifier(); super.initState(); } @@ -30,12 +32,12 @@ class _GridRowWidgetState extends State { Widget build(BuildContext context) { return BlocProvider.value( value: _rowBloc, - child: GestureDetector( - behavior: HitTestBehavior.translucent, + child: ChangeNotifierProvider.value( + value: _rowStateNotifier, child: MouseRegion( cursor: SystemMouseCursors.click, - onEnter: (p) => _rowBloc.add(const RowEvent.activeRow()), - onExit: (p) => _rowBloc.add(const RowEvent.disactiveRow()), + onEnter: (p) => _rowStateNotifier.onEnter = true, + onExit: (p) => _rowStateNotifier.onEnter = false, child: BlocBuilder( buildWhen: (p, c) => p.rowHeight != c.rowHeight, builder: (context, state) { @@ -43,10 +45,10 @@ class _GridRowWidgetState extends State { height: _rowBloc.state.rowHeight, child: Row( crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const LeadingRow(), - _buildCells(), - const TrailingRow(), + children: const [ + _RowLeading(), + _RowCells(), + _RowTrailing(), ], ), ); @@ -60,71 +62,39 @@ class _GridRowWidgetState extends State { @override Future dispose() async { _rowBloc.close(); + _rowStateNotifier.dispose(); super.dispose(); } +} - Widget _buildCells() { - return BlocBuilder( - buildWhen: (p, c) => p.cellDatas != c.cellDatas, - builder: (context, state) { - return Row( - children: state.cellDatas - .map( - (cellData) => CellContainer( - width: cellData.field.width.toDouble(), - child: buildGridCell(cellData), - ), - ) - .toList(), - ); +class _RowLeading extends StatelessWidget { + const _RowLeading({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Consumer<_RegionStateNotifier>( + builder: (context, state, _) { + return SizedBox(width: GridSize.leadingHeaderPadding, child: state.onEnter ? _activeWidget() : null); }, ); } + + Widget _activeWidget() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + AppendRowButton(), + ], + ); + } } -class LeadingRow extends StatelessWidget { - const LeadingRow({Key? key}) : super(key: key); +class _RowTrailing extends StatelessWidget { + const _RowTrailing({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return BlocSelector( - selector: (state) => state.active, - builder: (context, isActive) { - return SizedBox( - width: GridSize.leadingHeaderPadding, - child: isActive - ? Row( - mainAxisAlignment: MainAxisAlignment.center, - children: const [ - AppendRowButton(), - ], - ) - : null, - ); - }, - ); - } -} - -class TrailingRow extends StatelessWidget { - const TrailingRow({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final theme = context.watch(); - final borderSide = BorderSide(color: theme.shader4, width: 0.4); - - return BlocBuilder( - builder: (context, state) { - return Container( - width: GridSize.trailHeaderPadding, - decoration: BoxDecoration( - border: Border(bottom: borderSide), - ), - padding: GridSize.cellContentInsets, - ); - }, - ); + return const SizedBox(); } } @@ -139,7 +109,46 @@ class AppendRowButton extends StatelessWidget { width: 22, onPressed: () => context.read().add(const RowEvent.createRow()), iconPadding: const EdgeInsets.all(3), - icon: svg("home/add"), + icon: svgWidget("home/add"), ); } } + +class _RowCells extends StatelessWidget { + const _RowCells({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocBuilder( + buildWhen: (previous, current) => previous.cellDataMap != current.cellDataMap, + builder: (context, state) { + final List children = state.cellDataMap.fold(() => [], _toCells); + return Row(children: children); + }, + ); + } + + List _toCells(CellDataMap dataMap) { + return dataMap.values.map( + (cellData) { + return CellContainer( + width: cellData.field.width.toDouble(), + child: buildGridCell(cellData), + ); + }, + ).toList(); + } +} + +class _RegionStateNotifier extends ChangeNotifier { + bool _onEnter = false; + + set onEnter(bool value) { + if (_onEnter != value) { + _onEnter = value; + notifyListeners(); + } + } + + bool get onEnter => _onEnter; +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/number_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/number_cell.dart new file mode 100644 index 0000000000..41b8cf6ee5 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/number_cell.dart @@ -0,0 +1,44 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/prelude.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class NumberCell extends StatefulWidget { + final CellData cellData; + + const NumberCell({ + required this.cellData, + Key? key, + }) : super(key: key); + + @override + State createState() => _NumberCellState(); +} + +class _NumberCellState extends State { + late NumberCellBloc _cellBloc; + + @override + void initState() { + _cellBloc = getIt(param1: widget.cellData); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BlocProvider.value( + value: _cellBloc, + child: BlocBuilder( + builder: (context, state) { + return Container(); + }, + ), + ); + } + + @override + Future dispose() async { + _cellBloc.close(); + super.dispose(); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_property.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_property.dart new file mode 100644 index 0000000000..a34682d204 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_property.dart @@ -0,0 +1,119 @@ +import 'package:app_flowy/startup/startup.dart'; +import 'package:app_flowy/workspace/application/grid/field/field_service.dart'; +import 'package:app_flowy/workspace/application/grid/setting/property_bloc.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_editor.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_type_extension.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +import 'package:flowy_infra_ui/style_widget/button.dart'; +import 'package:flowy_infra_ui/style_widget/icon_button.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/grid.pb.dart' show Field; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:styled_widget/styled_widget.dart'; + +class GridPropertyList extends StatelessWidget with FlowyOverlayDelegate { + final String gridId; + final List fields; + const GridPropertyList({ + required this.gridId, + required this.fields, + Key? key, + }) : super(key: key); + + void show(BuildContext context) { + FlowyOverlay.of(context).insertWithAnchor( + widget: OverlayContainer( + child: this, + constraints: BoxConstraints.loose(const Size(260, 400)), + ), + identifier: identifier(), + anchorContext: context, + anchorDirection: AnchorDirection.bottomRight, + style: FlowyOverlayStyle(blur: false), + delegate: this, + ); + } + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => + getIt(param1: gridId, param2: fields)..add(const GridPropertyEvent.initial()), + child: BlocBuilder( + builder: (context, state) { + final cells = state.fields.map((field) { + return _GridPropertyCell(gridId: gridId, field: field); + }).toList(); + + return ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + itemCount: cells.length, + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ); + }, + ), + ); + } + + String identifier() { + return toString(); + } + + @override + bool asBarrier() => true; +} + +class _GridPropertyCell extends StatelessWidget { + final Field field; + final String gridId; + const _GridPropertyCell({required this.gridId, required this.field, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + + final checkmark = field.visibility + ? svgWidget('home/show', color: theme.iconColor) + : svgWidget('home/hide', color: theme.iconColor); + + return Row( + children: [ + Expanded( + child: SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + text: FlowyText.medium(field.name, fontSize: 12), + hoverColor: theme.hover, + leftIcon: svgWidget(field.fieldType.iconName(), color: theme.iconColor), + onTap: () { + FieldEditor( + gridId: gridId, + fieldContextLoader: FieldContextLoaderAdaptor(gridId: gridId, field: field), + ).show(context, anchorDirection: AnchorDirection.bottomRight); + }, + ), + ), + ), + FlowyIconButton( + hoverColor: theme.hover, + width: GridSize.typeOptionItemHeight, + onPressed: () { + context.read().add(GridPropertyEvent.setFieldVisibility(field.id, !field.visibility)); + }, + icon: checkmark.padding(all: 6), + ) + ], + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_setting.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_setting.dart new file mode 100644 index 0000000000..e8a792025d --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_setting.dart @@ -0,0 +1,166 @@ +import 'package:app_flowy/workspace/application/grid/setting/setting_bloc.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/flowy_infra_ui.dart'; +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/grid.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:app_flowy/generated/locale_keys.g.dart'; +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; + +import 'grid_property.dart'; + +class GridSettingContext { + final String gridId; + final List fields; + + GridSettingContext({ + required this.gridId, + required this.fields, + }); +} + +class GridSettingList extends StatelessWidget { + final GridSettingContext settingContext; + final Function(GridSettingAction, GridSettingContext) onAction; + const GridSettingList({required this.settingContext, required this.onAction, Key? key}) : super(key: key); + + static void show(BuildContext context, GridSettingContext settingContext) { + final list = GridSettingList( + settingContext: settingContext, + onAction: (action, settingContext) { + switch (action) { + case GridSettingAction.filter: + // TODO: Handle this case. + break; + case GridSettingAction.sortBy: + // TODO: Handle this case. + break; + case GridSettingAction.properties: + GridPropertyList(gridId: settingContext.gridId, fields: settingContext.fields).show(context); + break; + } + }, + ); + + FlowyOverlay.of(context).insertWithAnchor( + widget: OverlayContainer( + child: list, + constraints: BoxConstraints.loose(const Size(140, 400)), + ), + identifier: list.identifier(), + anchorContext: context, + anchorDirection: AnchorDirection.bottomRight, + style: FlowyOverlayStyle(blur: false), + ); + } + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => GridSettingBloc(gridId: settingContext.gridId), + child: BlocListener( + listenWhen: (previous, current) => previous.selectedAction != current.selectedAction, + listener: (context, state) { + state.selectedAction.foldLeft(null, (_, action) { + FlowyOverlay.of(context).remove(identifier()); + onAction(action, settingContext); + }); + }, + child: BlocBuilder( + builder: (context, state) { + return _renderList(); + }, + ), + ), + ); + } + + String identifier() { + return toString(); + } + + Widget _renderList() { + final cells = GridSettingAction.values.map((action) { + return _SettingItem(action: action); + }).toList(); + + return SizedBox( + width: 140, + child: ListView.separated( + shrinkWrap: true, + controller: ScrollController(), + itemCount: cells.length, + separatorBuilder: (context, index) { + return VSpace(GridSize.typeOptionSeparatorHeight); + }, + physics: StyledScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return cells[index]; + }, + ), + ); + } +} + +class _SettingItem extends StatelessWidget { + final GridSettingAction action; + + const _SettingItem({ + required this.action, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + final isSelected = context + .read() + .state + .selectedAction + .foldLeft(false, (_, selectedAction) => selectedAction == action); + + return SizedBox( + height: GridSize.typeOptionItemHeight, + child: FlowyButton( + isSelected: isSelected, + text: FlowyText.medium(action.title(), fontSize: 12), + hoverColor: theme.hover, + onTap: () { + context.read().add(GridSettingEvent.performAction(action)); + }, + leftIcon: svgWidget(action.iconName(), color: theme.iconColor), + ), + ); + } +} + +extension _GridSettingExtension on GridSettingAction { + String iconName() { + switch (this) { + case GridSettingAction.filter: + return 'grid/setting/filter'; + case GridSettingAction.sortBy: + return 'grid/setting/sort'; + case GridSettingAction.properties: + return 'grid/setting/properties'; + } + } + + String title() { + switch (this) { + case GridSettingAction.filter: + return LocaleKeys.grid_settings_filter.tr(); + case GridSettingAction.sortBy: + return LocaleKeys.grid_settings_sortBy.tr(); + case GridSettingAction.properties: + return LocaleKeys.grid_settings_Properties.tr(); + } + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_toolbar.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_toolbar.dart new file mode 100644 index 0000000000..9569f95225 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/toolbar/grid_toolbar.dart @@ -0,0 +1,59 @@ +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/extension.dart'; +import 'package:flowy_infra_ui/style_widget/icon_button.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' hide Row; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart'; + +import 'grid_setting.dart'; + +class GridToolbarContext { + final String gridId; + final List fields; + GridToolbarContext({ + required this.gridId, + required this.fields, + }); +} + +class GridToolbar extends StatelessWidget { + final GridToolbarContext toolbarContext; + const GridToolbar({required this.toolbarContext, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final settingContext = GridSettingContext( + gridId: toolbarContext.gridId, + fields: toolbarContext.fields, + ); + return SizedBox( + height: 40, + child: Row( + children: [ + SizedBox(width: GridSize.leadingHeaderPadding), + _SettingButton(settingContext: settingContext), + const Spacer(), + ], + ), + ); + } +} + +class _SettingButton extends StatelessWidget { + final GridSettingContext settingContext; + const _SettingButton({required this.settingContext, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return FlowyIconButton( + hoverColor: theme.hover, + width: 22, + onPressed: () => GridSettingList.show(context, settingContext), + icon: svgWidget("grid/setting/setting").padding(horizontal: 3, vertical: 3), + ); + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/trash/menu.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/trash/menu.dart index ccd1c85188..770889c610 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/trash/menu.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/trash/menu.dart @@ -36,7 +36,7 @@ class MenuTrash extends StatelessWidget { child: Selector( selector: (ctx, notifier) => notifier.theme, builder: (ctx, theme, child) => - SizedBox(width: 16, height: 16, child: svg("home/trash", color: theme.iconColor)), + SizedBox(width: 16, height: 16, child: svgWidget("home/trash", color: theme.iconColor)), ), ), const HSpace(6), diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/trash/src/trash_cell.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/trash/src/trash_cell.dart index 4ba52edfe1..2c9679d97d 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/trash/src/trash_cell.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/trash/src/trash_cell.dart @@ -29,13 +29,13 @@ class TrashCell extends StatelessWidget { FlowyIconButton( width: 16, onPressed: onRestore, - icon: svg("editor/restore", color: theme.iconColor), + icon: svgWidget("editor/restore", color: theme.iconColor), ), const HSpace(20), FlowyIconButton( width: 16, onPressed: onDelete, - icon: svg("editor/delete", color: theme.iconColor), + icon: svgWidget("editor/delete", color: theme.iconColor), ), ], ); diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/trash/trash.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/trash/trash.dart index e74289d982..324b676fc3 100644 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/trash/trash.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/trash/trash.dart @@ -146,7 +146,7 @@ class _TrashPageState extends State { size: const Size(102, 30), child: FlowyButton( text: FlowyText.medium(LocaleKeys.trash_restoreAll.tr(), fontSize: 12), - icon: svg('editor/restore', color: theme.iconColor), + leftIcon: svgWidget('editor/restore', color: theme.iconColor), hoverColor: theme.hover, onTap: () => context.read().add(const TrashEvent.restoreAll()), ), @@ -156,7 +156,7 @@ class _TrashPageState extends State { size: const Size(102, 30), child: FlowyButton( text: FlowyText.medium(LocaleKeys.trash_deleteAll.tr(), fontSize: 12), - icon: svg('editor/delete', color: theme.iconColor), + leftIcon: svgWidget('editor/delete', color: theme.iconColor), hoverColor: theme.hover, onTap: () => context.read().add(const TrashEvent.deleteAll()), ), diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/widgets/left_bar_item.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/widgets/left_bar_item.dart new file mode 100644 index 0000000000..7c1e819cc5 --- /dev/null +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/widgets/left_bar_item.dart @@ -0,0 +1,74 @@ +import 'package:app_flowy/workspace/application/view/view_service.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class ViewLeftBarItem extends StatefulWidget { + final View view; + + ViewLeftBarItem({required this.view, Key? key}) : super(key: ValueKey(view.hashCode)); + + @override + State createState() => _ViewLeftBarItemState(); +} + +class _ViewLeftBarItemState extends State { + final _controller = TextEditingController(); + final _focusNode = FocusNode(); + late ViewService serviceService; + + @override + void initState() { + serviceService = ViewService(/*view: widget.view*/); + _focusNode.addListener(_handleFocusChanged); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + _focusNode.removeListener(_handleFocusChanged); + _focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _controller.text = widget.view.name; + + final theme = context.watch(); + return IntrinsicWidth( + key: ValueKey(_controller.text), + child: TextField( + controller: _controller, + focusNode: _focusNode, + scrollPadding: EdgeInsets.zero, + decoration: const InputDecoration( + contentPadding: EdgeInsets.zero, + border: InputBorder.none, + isDense: true, + ), + style: TextStyle( + color: theme.textColor, + fontSize: 14, + fontWeight: FontWeight.w500, + overflow: TextOverflow.ellipsis, + ), + // cursorColor: widget.cursorColor, + // obscureText: widget.enableObscure, + ), + ); + } + + void _handleFocusChanged() { + if (_controller.text.isEmpty) { + _controller.text = widget.view.name; + return; + } + + if (_controller.text != widget.view.name) { + serviceService.updateView(viewId: widget.view.id, name: _controller.text); + } + } +} diff --git a/frontend/app_flowy/lib/workspace/presentation/widgets/edit_pannel/edit_pannel.dart b/frontend/app_flowy/lib/workspace/presentation/widgets/edit_pannel/edit_pannel.dart index b892a8e49d..f9e5e0e6b5 100644 --- a/frontend/app_flowy/lib/workspace/presentation/widgets/edit_pannel/edit_pannel.dart +++ b/frontend/app_flowy/lib/workspace/presentation/widgets/edit_pannel/edit_pannel.dart @@ -2,7 +2,6 @@ import 'package:app_flowy/workspace/application/edit_pannel/edit_pannel_bloc.dar import 'package:app_flowy/workspace/application/edit_pannel/edit_context.dart'; import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/presentation/home/home_sizes.dart'; -import 'package:dartz/dartz.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flowy_infra_ui/style_widget/bar_title.dart'; import 'package:flowy_infra_ui/style_widget/close_button.dart'; @@ -11,15 +10,13 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:app_flowy/generated/locale_keys.g.dart'; class EditPannel extends StatelessWidget { - late final EditPannelContext editContext; + final EditPannelContext pannelContext; final VoidCallback onEndEdit; - EditPannel({ + const EditPannel({ Key? key, - required Option context, + required this.pannelContext, required this.onEndEdit, - }) : super(key: key) { - editContext = context.fold(() => const BlankEditPannelContext(), (c) => c); - } + }) : super(key: key); @override Widget build(BuildContext context) { @@ -34,7 +31,7 @@ class EditPannel extends StatelessWidget { children: [ EditPannelTopBar(onClose: () => onEndEdit()), Expanded( - child: editContext.child, + child: pannelContext.child, ), ], ); diff --git a/frontend/app_flowy/lib/workspace/presentation/widgets/float_bubble/question_bubble.dart b/frontend/app_flowy/lib/workspace/presentation/widgets/float_bubble/question_bubble.dart index 2c28b88660..3309566eaf 100644 --- a/frontend/app_flowy/lib/workspace/presentation/widgets/float_bubble/question_bubble.dart +++ b/frontend/app_flowy/lib/workspace/presentation/widgets/float_bubble/question_bubble.dart @@ -112,7 +112,6 @@ class QuestionBubble extends StatelessWidget { }); }); actionList.show( - context, context, anchorDirection: AnchorDirection.topWithRightAligned, anchorOffset: const Offset(0, -10), @@ -131,7 +130,7 @@ class QuestionBubble extends StatelessWidget { } } -class QuestionBubbleActionSheet with ActionList implements FlowyOverlayDelegate { +class QuestionBubbleActionSheet with ActionList, FlowyOverlayDelegate { final Function(dartz.Option) onSelected; final _items = BubbleAction.values.map((action) => BubbleActionWrapper(action)).toList(); diff --git a/frontend/app_flowy/lib/workspace/presentation/widgets/pop_up_action.dart b/frontend/app_flowy/lib/workspace/presentation/widgets/pop_up_action.dart index 61caa84c2f..5c782d3ece 100644 --- a/frontend/app_flowy/lib/workspace/presentation/widgets/pop_up_action.dart +++ b/frontend/app_flowy/lib/workspace/presentation/widgets/pop_up_action.dart @@ -24,8 +24,8 @@ abstract class ActionList { FlowyOverlayDelegate? get delegate; void show( - BuildContext buildContext, - BuildContext anchorContext, { + BuildContext buildContext, { + BuildContext? anchorContext, AnchorDirection anchorDirection = AnchorDirection.bottomRight, Offset? anchorOffset, }) { @@ -47,7 +47,7 @@ abstract class ActionList { identifier: identifier, itemCount: widgets.length, itemBuilder: (context, index) => widgets[index], - anchorContext: anchorContext, + anchorContext: anchorContext ?? buildContext, anchorDirection: anchorDirection, width: maxWidth, height: widgets.length * (itemHeight + ActionListSizes.padding * 2), diff --git a/frontend/app_flowy/lib/workspace/presentation/widgets/pop_up_window.dart b/frontend/app_flowy/lib/workspace/presentation/widgets/pop_up_window.dart index bea342747b..1803257672 100644 --- a/frontend/app_flowy/lib/workspace/presentation/widgets/pop_up_window.dart +++ b/frontend/app_flowy/lib/workspace/presentation/widgets/pop_up_window.dart @@ -22,10 +22,7 @@ class FlowyPoppuWindow extends StatelessWidget { }) async { final window = await getWindowInfo(); FlowyOverlay.of(context).insertWithRect( - widget: SizedBox.fromSize( - size: size, - child: FlowyPoppuWindow(child: child), - ), + widget: FlowyPoppuWindow(child: child), identifier: 'FlowyPoppuWindow', anchorPosition: Offset(-size.width / 2.0, -size.height / 2.0), anchorSize: window.frame.size, diff --git a/frontend/app_flowy/packages/flowy_infra/lib/image.dart b/frontend/app_flowy/packages/flowy_infra/lib/image.dart index 68bea3cd6d..e70c8b4bff 100644 --- a/frontend/app_flowy/packages/flowy_infra/lib/image.dart +++ b/frontend/app_flowy/packages/flowy_infra/lib/image.dart @@ -1,7 +1,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_svg/flutter_svg.dart'; -Widget svg(String name, {Color? color}) { +Widget svgWidget(String name, {Color? color}) { final Widget svg = SvgPicture.asset('assets/images/$name.svg', color: color); return svg; @@ -10,6 +10,6 @@ Widget svg(String name, {Color? color}) { Widget svgWithSize(String name, Size size) { return SizedBox.fromSize( size: size, - child: svg(name), + child: svgWidget(name), ); } diff --git a/frontend/app_flowy/packages/flowy_infra/lib/notifier.dart b/frontend/app_flowy/packages/flowy_infra/lib/notifier.dart index 0e0c6bc4cf..0079ba51a1 100644 --- a/frontend/app_flowy/packages/flowy_infra/lib/notifier.dart +++ b/frontend/app_flowy/packages/flowy_infra/lib/notifier.dart @@ -1,10 +1,29 @@ import 'package:flutter/material.dart'; +abstract class Comparable { + bool compare(T? previous, T? current); +} + +class ObjectComparable extends Comparable { + @override + bool compare(T? previous, T? current) { + return previous == current; + } +} + class PublishNotifier extends ChangeNotifier { T? _value; + Comparable? comparable = ObjectComparable(); + + PublishNotifier({this.comparable}); set value(T newValue) { - if (_value != newValue) { + if (comparable != null) { + if (comparable!.compare(_value, newValue)) { + _value = newValue; + notifyListeners(); + } + } else { _value = newValue; notifyListeners(); } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart index 84c2cddd82..1229745381 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/flowy_overlay.dart @@ -1,9 +1,9 @@ // ignore_for_file: unused_element -import 'package:dartz/dartz.dart' show Tuple3; +import 'dart:ui'; import 'package:flowy_infra_ui/src/flowy_overlay/layout.dart'; import 'package:flutter/material.dart'; -import 'dart:ui'; +export './overlay_container.dart'; /// Specifies how overlay are anchored to the SourceWidget enum AnchorDirection { @@ -73,7 +73,8 @@ TransitionBuilder overlayManagerBuilder() { } abstract class FlowyOverlayDelegate { - void didRemove(); + bool asBarrier() => false; + void didRemove() => {}; } class FlowyOverlay extends StatefulWidget { @@ -108,8 +109,20 @@ class FlowyOverlay extends StatefulWidget { FlowyOverlayState createState() => FlowyOverlayState(); } +class OverlayItem { + Widget widget; + String identifier; + FlowyOverlayDelegate? delegate; + + OverlayItem({ + required this.widget, + required this.identifier, + this.delegate, + }); +} + class FlowyOverlayState extends State { - List> _overlayList = []; + final List _overlayList = []; FlowyOverlayStyle style = FlowyOverlayStyle(); /// Insert a overlay widget which frame is set by the widget, not the component. @@ -179,17 +192,32 @@ class FlowyOverlayState extends State { void remove(String identifier) { setState(() { - final index = _overlayList.indexWhere((ele) => ele.value2 == identifier); - _overlayList.removeAt(index).value3?.didRemove(); + final index = _overlayList.indexWhere((item) => item.identifier == identifier); + if (index != -1) { + _overlayList.removeAt(index).delegate?.didRemove(); + } }); } void removeAll() { setState(() { - for (var ele in _overlayList.reversed) { - ele.value3?.didRemove(); + if (_overlayList.isEmpty) { + return; + } + + final reveredList = _overlayList.reversed.toList(); + final firstItem = reveredList.removeAt(0); + firstItem.delegate?.didRemove(); + _overlayList.remove(firstItem); + + for (final element in reveredList) { + if (element.delegate?.asBarrier() ?? false) { + return; + } else { + element.delegate?.didRemove(); + _overlayList.remove(element); + } } - _overlayList = []; }); } @@ -248,13 +276,17 @@ class FlowyOverlayState extends State { } setState(() { - _overlayList.add(Tuple3(overlay, identifier, delegate)); + _overlayList.add(OverlayItem( + widget: overlay, + identifier: identifier, + delegate: delegate, + )); }); } @override Widget build(BuildContext context) { - final overlays = _overlayList.map((ele) => ele.value1); + final overlays = _overlayList.map((item) => item.widget); List children = [widget.child]; Widget? child; @@ -279,8 +311,22 @@ class FlowyOverlayState extends State { children.add(child); } - return Stack( - children: children..addAll(overlays), + // Try to fix there is no overlay for editabletext widget. e.g. TextField. + // // Check out the TextSelectionOverlay class in text_selection.dart. + // // ... + // // final OverlayState? overlay = Overlay.of(context, rootOverlay: true); + // // assert( + // // overlay != null, + // // 'No Overlay widget exists above $context.\n' + // // 'Usually the Navigator created by WidgetsApp provides the overlay. Perhaps your ' + // // 'app content was created above the Navigator with the WidgetsApp builder parameter.', + // // ); + // // ... + return MaterialApp( + debugShowCheckedModeBanner: false, + home: Stack( + children: children..addAll(overlays), + ), ); } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/list_overlay.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/list_overlay.dart index 862f47b662..16d3b55f47 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/list_overlay.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/list_overlay.dart @@ -1,8 +1,5 @@ import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; -import 'package:flowy_infra_ui/style_widget/decoration.dart'; import 'package:flutter/material.dart'; -import 'package:flowy_infra/theme.dart'; -import 'package:provider/provider.dart'; class ListOverlayFooter { Widget widget; @@ -35,36 +32,29 @@ class ListOverlay extends StatelessWidget { @override Widget build(BuildContext context) { - final theme = context.watch(); const padding = EdgeInsets.symmetric(horizontal: 6, vertical: 6); double totalHeight = height + padding.vertical; if (footer != null) { totalHeight = totalHeight + footer!.height + footer!.padding.vertical; } - return Material( - type: MaterialType.transparency, - child: Container( - decoration: FlowyDecoration.decoration(theme.surface, theme.shadowColor.withOpacity(0.1)), - constraints: BoxConstraints.tight(Size(width, totalHeight)), - child: Padding( - padding: padding, - child: Column( - children: [ - ListView.builder( - shrinkWrap: true, - itemBuilder: itemBuilder, - itemCount: itemCount, - controller: controller, - ), - if (footer != null) - Padding( - padding: footer!.padding, - child: footer!.widget, - ), - ], + return OverlayContainer( + constraints: BoxConstraints.tight(Size(width, totalHeight)), + padding: padding, + child: Column( + children: [ + ListView.builder( + shrinkWrap: true, + itemBuilder: itemBuilder, + itemCount: itemCount, + controller: controller, ), - ), + if (footer != null) + Padding( + padding: footer!.padding, + child: footer!.widget, + ), + ], ), ); } @@ -103,38 +93,4 @@ class ListOverlay extends StatelessWidget { style: style, ); } - - static void showWithRect( - BuildContext context, { - required BuildContext anchorContext, - required String identifier, - required IndexedWidgetBuilder itemBuilder, - int? itemCount, - ScrollController? controller, - double maxWidth = double.infinity, - double maxHeight = double.infinity, - required Offset anchorPosition, - required Size anchorSize, - AnchorDirection? anchorDirection, - FlowyOverlayDelegate? delegate, - OverlapBehaviour? overlapBehaviour, - FlowyOverlayStyle? style, - }) { - FlowyOverlay.of(context).insertWithRect( - widget: ListOverlay( - itemBuilder: itemBuilder, - itemCount: itemCount, - controller: controller, - width: maxWidth, - height: maxHeight, - ), - identifier: identifier, - anchorPosition: anchorPosition, - anchorSize: anchorSize, - anchorDirection: anchorDirection, - delegate: delegate, - overlapBehaviour: overlapBehaviour, - style: style, - ); - } } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/overlay_container.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/overlay_container.dart new file mode 100644 index 0000000000..85de2c71a7 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/src/flowy_overlay/overlay_container.dart @@ -0,0 +1,32 @@ +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/decoration.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +const overlayContainerPadding = EdgeInsets.all(12); + +class OverlayContainer extends StatelessWidget { + final Widget child; + final BoxConstraints? constraints; + final EdgeInsets padding; + const OverlayContainer({ + required this.child, + this.constraints, + this.padding = overlayContainerPadding, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = context.watch(); + return Material( + type: MaterialType.transparency, + child: Container( + padding: padding, + decoration: FlowyDecoration.decoration(theme.surface, theme.shadowColor.withOpacity(0.15)), + constraints: constraints, + child: child, + ), + ); + } +} diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart index b7d8ea4e88..69cddbf2fb 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/button.dart @@ -8,15 +8,19 @@ class FlowyButton extends StatelessWidget { final Widget text; final VoidCallback? onTap; final EdgeInsets padding; - final Widget? icon; + final Widget? leftIcon; + final Widget? rightIcon; final Color hoverColor; + final bool isSelected; const FlowyButton({ Key? key, required this.text, this.onTap, - this.padding = const EdgeInsets.symmetric(horizontal: 3, vertical: 2), - this.icon, + this.padding = const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + this.leftIcon, + this.rightIcon, this.hoverColor = Colors.transparent, + this.isSelected = false, }) : super(key: key); @override @@ -24,7 +28,8 @@ class FlowyButton extends StatelessWidget { return InkWell( onTap: onTap, child: FlowyHover( - config: HoverDisplayConfig(borderRadius: Corners.s5Border, hoverColor: hoverColor), + config: HoverDisplayConfig(borderRadius: Corners.s6Border, hoverColor: hoverColor), + setSelected: () => isSelected, builder: (context, onHover) => _render(), ), ); @@ -33,16 +38,22 @@ class FlowyButton extends StatelessWidget { Widget _render() { List children = List.empty(growable: true); - if (icon != null) { - children.add(SizedBox.fromSize(size: const Size.square(16), child: icon!)); + if (leftIcon != null) { + children.add(SizedBox.fromSize(size: const Size.square(16), child: leftIcon!)); children.add(const HSpace(6)); } - children.add(Align(child: text)); + children.add(Expanded(child: text)); + + if (rightIcon != null) { + children.add(SizedBox.fromSize(size: const Size.square(16), child: rightIcon!)); + } return Padding( padding: padding, child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: children, ), ); diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/hover.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/hover.dart index a85867e456..48a702c2e4 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/hover.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/hover.dart @@ -4,18 +4,16 @@ import 'package:flowy_infra/time/duration.dart'; typedef HoverBuilder = Widget Function(BuildContext context, bool onHover); -typedef IsOnSelected = bool Function(); - class FlowyHover extends StatefulWidget { final HoverDisplayConfig config; final HoverBuilder builder; - final IsOnSelected? isOnSelected; + final bool Function()? setSelected; const FlowyHover({ Key? key, required this.builder, required this.config, - this.isOnSelected, + this.setSelected, }) : super(key: key); @override @@ -29,23 +27,20 @@ class _FlowyHoverState extends State { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - onEnter: (p) => setOnHover(true), - onExit: (p) => setOnHover(false), + onEnter: (p) => setState(() => _onHover = true), + onExit: (p) => setState(() => _onHover = false), child: render(), ); } - void setOnHover(bool value) => setState(() => _onHover = value); - Widget render() { var showHover = _onHover; - - if (showHover == false && widget.isOnSelected != null) { - showHover = widget.isOnSelected!(); + if (!showHover && widget.setSelected != null) { + showHover = widget.setSelected!(); } if (showHover) { - return FlowyHoverBackground( + return FlowyHoverContainer( config: widget.config, child: widget.builder(context, _onHover), ); @@ -68,12 +63,11 @@ class HoverDisplayConfig { required this.hoverColor}); } -class FlowyHoverBackground extends StatelessWidget { +class FlowyHoverContainer extends StatelessWidget { final HoverDisplayConfig config; - final Widget child; - const FlowyHoverBackground({ + const FlowyHoverContainer({ Key? key, required this.child, required this.config, diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart index 79e9c648ea..f3ecd23005 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart @@ -77,7 +77,7 @@ class FlowyDropdownButton extends StatelessWidget { return FlowyIconButton( width: 16, onPressed: onPressed, - icon: svg("home/drop_down_show"), + icon: svgWidget("home/drop_down_show"), ); } } diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/scrolling/styled_scrollview.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/scrolling/styled_scrollview.dart index 3df1fea4c7..ed960a1c12 100644 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/scrolling/styled_scrollview.dart +++ b/frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/scrolling/styled_scrollview.dart @@ -63,13 +63,11 @@ class _StyledSingleChildScrollViewState extends State? onChanged; + final VoidCallback? onEditingComplete; final String? initialValue; - late bool enableObscure; - var _text = ""; + final EdgeInsets margin; + final EdgeInsets padding; + final EdgeInsets contentPadding; + final double height; + final FocusNode? focusNode; + final TextEditingController? controller; + final bool autoFocus; - RoundedInputField({ + const RoundedInputField({ Key? key, this.hintText, this.errorText = "", this.initialValue, - this.icon, this.obscureText = false, this.obscureIcon, this.obscureHideIcon, this.onChanged, + this.onEditingComplete, this.normalBorderColor = Colors.transparent, - this.highlightBorderColor = Colors.transparent, + this.errorBorderColor = Colors.transparent, + this.focusBorderColor, this.cursorColor = Colors.black, this.style = const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), - }) : super(key: key) { - enableObscure = obscureText; - } + this.margin = EdgeInsets.zero, + this.padding = EdgeInsets.zero, + this.contentPadding = const EdgeInsets.symmetric(horizontal: 10), + this.height = 48, + this.focusNode, + this.controller, + this.autoFocus = false, + }) : super(key: key); @override State createState() => _RoundedInputFieldState(); } class _RoundedInputFieldState extends State { + String inputText = ""; + bool obscuteText = false; + + @override + void initState() { + obscuteText = widget.obscureText; + super.initState(); + } + @override Widget build(BuildContext context) { - final Icon? newIcon = widget.icon == null - ? null - : Icon( - widget.icon!, - color: const Color(0xFF6F35A5), - ); - var borderColor = widget.normalBorderColor; + var focusBorderColor = widget.focusBorderColor ?? borderColor; + if (widget.errorText.isNotEmpty) { - borderColor = widget.highlightBorderColor; + borderColor = widget.errorBorderColor; + focusBorderColor = borderColor; } List children = [ - TextFieldContainer( - height: 48, - borderRadius: Corners.s10Border, - borderColor: borderColor, + Container( + margin: widget.margin, + padding: widget.padding, + height: widget.height, child: TextFormField( + controller: widget.controller, initialValue: widget.initialValue, + focusNode: widget.focusNode, + autofocus: widget.autoFocus, onChanged: (value) { - widget._text = value; + inputText = value; if (widget.onChanged != null) { widget.onChanged!(value); } setState(() {}); }, + onEditingComplete: widget.onEditingComplete, cursorColor: widget.cursorColor, - obscureText: widget.enableObscure, + obscureText: obscuteText, + style: widget.style, decoration: InputDecoration( - icon: newIcon, + contentPadding: widget.contentPadding, hintText: widget.hintText, hintStyle: TextStyle(color: widget.normalBorderColor), - border: InputBorder.none, - suffixIcon: suffixIcon(), + border: OutlineInputBorder( + borderSide: BorderSide( + color: borderColor, + width: 1.0, + ), + borderRadius: Corners.s10Border, + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: focusBorderColor, + width: 1.0, + ), + borderRadius: Corners.s10Border, + ), + suffixIcon: obscureIcon(), ), ), ), @@ -100,39 +133,32 @@ class _RoundedInputFieldState extends State { return AnimatedSize( duration: .4.seconds, curve: Curves.easeInOut, - child: Column( - children: children, - ), + child: Column(children: children), ); } - Widget? suffixIcon() { + Widget? obscureIcon() { if (widget.obscureText == false) { return null; } - if (widget._text.isEmpty) { - return SizedBox.fromSize(size: const Size.square(16)); + const double iconWidth = 16; + if (inputText.isEmpty) { + return SizedBox.fromSize(size: const Size.square(iconWidth)); } + assert(widget.obscureIcon != null && widget.obscureHideIcon != null); Widget? icon; - if (widget.obscureText == true) { - assert(widget.obscureIcon != null && widget.obscureHideIcon != null); - if (widget.enableObscure) { - icon = widget.obscureIcon!; - } else { - icon = widget.obscureHideIcon!; - } - } - - if (icon == null) { - return null; + if (obscuteText) { + icon = widget.obscureIcon!; + } else { + icon = widget.obscureHideIcon!; } return RoundedImageButton( - size: 16, + size: iconWidth, press: () { - widget.enableObscure = !widget.enableObscure; + obscuteText = !obscuteText; setState(() {}); }, child: icon, diff --git a/frontend/app_flowy/packages/flowy_infra_ui/lib/widget/text_field_container.dart b/frontend/app_flowy/packages/flowy_infra_ui/lib/widget/text_field_container.dart deleted file mode 100644 index 7c1bf131a1..0000000000 --- a/frontend/app_flowy/packages/flowy_infra_ui/lib/widget/text_field_container.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -class TextFieldContainer extends StatelessWidget { - final Widget child; - final BorderRadius borderRadius; - final Color borderColor; - final double? height; - final double? width; - const TextFieldContainer({ - Key? key, - required this.child, - this.borderRadius = BorderRadius.zero, - this.borderColor = Colors.white, - this.height, - this.width, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.symmetric(vertical: 10), - padding: const EdgeInsets.symmetric(horizontal: 15), - height: height, - width: width, - decoration: BoxDecoration( - border: Border.all(color: borderColor), - color: Colors.white, - borderRadius: borderRadius, - ), - child: Align(alignment: Alignment.center, child: child), - ); - } - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties.add(DiagnosticsProperty('child', child)); - } -} diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart index c13b12e687..a4871a6bef 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-grid/dart_event.dart @@ -52,6 +52,159 @@ class GridEventGetFields { } } +class GridEventUpdateField { + FieldChangesetPayload request; + GridEventUpdateField(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.UpdateField.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (bytes) => left(unit), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventCreateField { + CreateFieldPayload request; + GridEventCreateField(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.CreateField.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (bytes) => left(unit), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventDeleteField { + FieldIdentifierPayload request; + GridEventDeleteField(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.DeleteField.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (bytes) => left(unit), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventSwitchToField { + EditFieldPayload request; + GridEventSwitchToField(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.SwitchToField.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (okBytes) => left(EditFieldContext.fromBuffer(okBytes)), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventDuplicateField { + FieldIdentifierPayload request; + GridEventDuplicateField(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.DuplicateField.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (bytes) => left(unit), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventGetEditFieldContext { + GetEditFieldContextPayload request; + GridEventGetEditFieldContext(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.GetEditFieldContext.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (okBytes) => left(EditFieldContext.fromBuffer(okBytes)), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventNewSelectOption { + SelectOptionName request; + GridEventNewSelectOption(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.NewSelectOption.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (okBytes) => left(SelectOption.fromBuffer(okBytes)), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventGetSelectOptionContext { + CellIdentifierPayload request; + GridEventGetSelectOptionContext(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.GetSelectOptionContext.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (okBytes) => left(SelectOptionContext.fromBuffer(okBytes)), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + +class GridEventApplySelectOptionChangeset { + SelectOptionChangesetPayload request; + GridEventApplySelectOptionChangeset(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.ApplySelectOptionChangeset.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (bytes) => left(unit), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + class GridEventCreateRow { CreateRowPayload request; GridEventCreateRow(this.request); @@ -70,7 +223,7 @@ class GridEventCreateRow { } class GridEventGetRow { - QueryRowPayload request; + RowIdentifierPayload request; GridEventGetRow(this.request); Future> send() { @@ -86,6 +239,23 @@ class GridEventGetRow { } } +class GridEventGetCell { + CellIdentifierPayload request; + GridEventGetCell(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.GetCell.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (okBytes) => left(Cell.fromBuffer(okBytes)), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + class GridEventUpdateCell { CellMetaChangeset request; GridEventUpdateCell(this.request); @@ -103,3 +273,20 @@ class GridEventUpdateCell { } } +class GridEventApplySelectOptionCellChangeset { + SelectOptionCellChangesetPayload request; + GridEventApplySelectOptionCellChangeset(this.request); + + Future> send() { + final request = FFIRequest.create() + ..event = GridEvent.ApplySelectOptionCellChangeset.toString() + ..payload = requestToBytes(this.request); + + return Dispatch.asyncRequest(request) + .then((bytesResult) => bytesResult.fold( + (bytes) => left(unit), + (errBytes) => right(FlowyError.fromBuffer(errBytes)), + )); + } +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart index b068956465..db010e9f75 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart @@ -4,6 +4,10 @@ import 'package:flowy_sdk/log.dart'; // ignore: unnecessary_import import 'package:flowy_sdk/protobuf/dart-ffi/ffi_response.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/cell_entities.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/row_entities.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/selection_type_option.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-net/event.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-net/network_state.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-user/event_map.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbenum.dart index 5e5da6665d..0d1eabddf8 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbenum.dart @@ -42,10 +42,17 @@ class ErrorCode extends $pb.ProtobufEnum { static const ErrorCode UserIdInvalid = ErrorCode._(311, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserIdInvalid'); static const ErrorCode UserNotExist = ErrorCode._(312, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNotExist'); static const ErrorCode TextTooLong = ErrorCode._(400, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TextTooLong'); - static const ErrorCode BlockIdIsEmpty = ErrorCode._(401, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'BlockIdIsEmpty'); - static const ErrorCode RowIdIsEmpty = ErrorCode._(402, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RowIdIsEmpty'); - static const ErrorCode GridIdIsEmpty = ErrorCode._(403, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridIdIsEmpty'); - static const ErrorCode InvalidData = ErrorCode._(404, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'InvalidData'); + static const ErrorCode GridIdIsEmpty = ErrorCode._(410, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridIdIsEmpty'); + static const ErrorCode BlockIdIsEmpty = ErrorCode._(420, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'BlockIdIsEmpty'); + static const ErrorCode RowIdIsEmpty = ErrorCode._(430, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RowIdIsEmpty'); + static const ErrorCode OptionIdIsEmpty = ErrorCode._(431, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'OptionIdIsEmpty'); + static const ErrorCode FieldIdIsEmpty = ErrorCode._(440, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'FieldIdIsEmpty'); + static const ErrorCode FieldDoesNotExist = ErrorCode._(441, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'FieldDoesNotExist'); + static const ErrorCode SelectOptionNameIsEmpty = ErrorCode._(442, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SelectOptionNameIsEmpty'); + static const ErrorCode FieldNotExists = ErrorCode._(443, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'FieldNotExists'); + static const ErrorCode FieldInvalidOperation = ErrorCode._(444, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'FieldInvalidOperation'); + static const ErrorCode TypeOptionDataIsEmpty = ErrorCode._(450, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TypeOptionDataIsEmpty'); + static const ErrorCode InvalidData = ErrorCode._(500, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'InvalidData'); static const $core.List values = [ Internal, @@ -80,9 +87,16 @@ class ErrorCode extends $pb.ProtobufEnum { UserIdInvalid, UserNotExist, TextTooLong, + GridIdIsEmpty, BlockIdIsEmpty, RowIdIsEmpty, - GridIdIsEmpty, + OptionIdIsEmpty, + FieldIdIsEmpty, + FieldDoesNotExist, + SelectOptionNameIsEmpty, + FieldNotExists, + FieldInvalidOperation, + TypeOptionDataIsEmpty, InvalidData, ]; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbjson.dart index 7c18eb68e2..fa6ba4076b 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-error-code/code.pbjson.dart @@ -44,12 +44,19 @@ const ErrorCode$json = const { const {'1': 'UserIdInvalid', '2': 311}, const {'1': 'UserNotExist', '2': 312}, const {'1': 'TextTooLong', '2': 400}, - const {'1': 'BlockIdIsEmpty', '2': 401}, - const {'1': 'RowIdIsEmpty', '2': 402}, - const {'1': 'GridIdIsEmpty', '2': 403}, - const {'1': 'InvalidData', '2': 404}, + const {'1': 'GridIdIsEmpty', '2': 410}, + const {'1': 'BlockIdIsEmpty', '2': 420}, + const {'1': 'RowIdIsEmpty', '2': 430}, + const {'1': 'OptionIdIsEmpty', '2': 431}, + const {'1': 'FieldIdIsEmpty', '2': 440}, + const {'1': 'FieldDoesNotExist', '2': 441}, + const {'1': 'SelectOptionNameIsEmpty', '2': 442}, + const {'1': 'FieldNotExists', '2': 443}, + const {'1': 'FieldInvalidOperation', '2': 444}, + const {'1': 'TypeOptionDataIsEmpty', '2': 450}, + const {'1': 'InvalidData', '2': 500}, ], }; /// Descriptor for `ErrorCode`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSDAoISW50ZXJuYWwQABIUChBVc2VyVW5hdXRob3JpemVkEAISEgoOUmVjb3JkTm90Rm91bmQQAxIRCg1Vc2VySWRJc0VtcHR5EAQSGAoUV29ya3NwYWNlTmFtZUludmFsaWQQZBIWChJXb3Jrc3BhY2VJZEludmFsaWQQZRIYChRBcHBDb2xvclN0eWxlSW52YWxpZBBmEhgKFFdvcmtzcGFjZURlc2NUb29Mb25nEGcSGAoUV29ya3NwYWNlTmFtZVRvb0xvbmcQaBIQCgxBcHBJZEludmFsaWQQbhISCg5BcHBOYW1lSW52YWxpZBBvEhMKD1ZpZXdOYW1lSW52YWxpZBB4EhgKFFZpZXdUaHVtYm5haWxJbnZhbGlkEHkSEQoNVmlld0lkSW52YWxpZBB6EhMKD1ZpZXdEZXNjVG9vTG9uZxB7EhMKD1ZpZXdEYXRhSW52YWxpZBB8EhMKD1ZpZXdOYW1lVG9vTG9uZxB9EhEKDENvbm5lY3RFcnJvchDIARIRCgxFbWFpbElzRW1wdHkQrAISFwoSRW1haWxGb3JtYXRJbnZhbGlkEK0CEhcKEkVtYWlsQWxyZWFkeUV4aXN0cxCuAhIUCg9QYXNzd29yZElzRW1wdHkQrwISFAoPUGFzc3dvcmRUb29Mb25nELACEiUKIFBhc3N3b3JkQ29udGFpbnNGb3JiaWRDaGFyYWN0ZXJzELECEhoKFVBhc3N3b3JkRm9ybWF0SW52YWxpZBCyAhIVChBQYXNzd29yZE5vdE1hdGNoELMCEhQKD1VzZXJOYW1lVG9vTG9uZxC0AhInCiJVc2VyTmFtZUNvbnRhaW5Gb3JiaWRkZW5DaGFyYWN0ZXJzELUCEhQKD1VzZXJOYW1lSXNFbXB0eRC2AhISCg1Vc2VySWRJbnZhbGlkELcCEhEKDFVzZXJOb3RFeGlzdBC4AhIQCgtUZXh0VG9vTG9uZxCQAxITCg5CbG9ja0lkSXNFbXB0eRCRAxIRCgxSb3dJZElzRW1wdHkQkgMSEgoNR3JpZElkSXNFbXB0eRCTAxIQCgtJbnZhbGlkRGF0YRCUAw=='); +final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSDAoISW50ZXJuYWwQABIUChBVc2VyVW5hdXRob3JpemVkEAISEgoOUmVjb3JkTm90Rm91bmQQAxIRCg1Vc2VySWRJc0VtcHR5EAQSGAoUV29ya3NwYWNlTmFtZUludmFsaWQQZBIWChJXb3Jrc3BhY2VJZEludmFsaWQQZRIYChRBcHBDb2xvclN0eWxlSW52YWxpZBBmEhgKFFdvcmtzcGFjZURlc2NUb29Mb25nEGcSGAoUV29ya3NwYWNlTmFtZVRvb0xvbmcQaBIQCgxBcHBJZEludmFsaWQQbhISCg5BcHBOYW1lSW52YWxpZBBvEhMKD1ZpZXdOYW1lSW52YWxpZBB4EhgKFFZpZXdUaHVtYm5haWxJbnZhbGlkEHkSEQoNVmlld0lkSW52YWxpZBB6EhMKD1ZpZXdEZXNjVG9vTG9uZxB7EhMKD1ZpZXdEYXRhSW52YWxpZBB8EhMKD1ZpZXdOYW1lVG9vTG9uZxB9EhEKDENvbm5lY3RFcnJvchDIARIRCgxFbWFpbElzRW1wdHkQrAISFwoSRW1haWxGb3JtYXRJbnZhbGlkEK0CEhcKEkVtYWlsQWxyZWFkeUV4aXN0cxCuAhIUCg9QYXNzd29yZElzRW1wdHkQrwISFAoPUGFzc3dvcmRUb29Mb25nELACEiUKIFBhc3N3b3JkQ29udGFpbnNGb3JiaWRDaGFyYWN0ZXJzELECEhoKFVBhc3N3b3JkRm9ybWF0SW52YWxpZBCyAhIVChBQYXNzd29yZE5vdE1hdGNoELMCEhQKD1VzZXJOYW1lVG9vTG9uZxC0AhInCiJVc2VyTmFtZUNvbnRhaW5Gb3JiaWRkZW5DaGFyYWN0ZXJzELUCEhQKD1VzZXJOYW1lSXNFbXB0eRC2AhISCg1Vc2VySWRJbnZhbGlkELcCEhEKDFVzZXJOb3RFeGlzdBC4AhIQCgtUZXh0VG9vTG9uZxCQAxISCg1HcmlkSWRJc0VtcHR5EJoDEhMKDkJsb2NrSWRJc0VtcHR5EKQDEhEKDFJvd0lkSXNFbXB0eRCuAxIUCg9PcHRpb25JZElzRW1wdHkQrwMSEwoORmllbGRJZElzRW1wdHkQuAMSFgoRRmllbGREb2VzTm90RXhpc3QQuQMSHAoXU2VsZWN0T3B0aW9uTmFtZUlzRW1wdHkQugMSEwoORmllbGROb3RFeGlzdHMQuwMSGgoVRmllbGRJbnZhbGlkT3BlcmF0aW9uELwDEhoKFVR5cGVPcHRpb25EYXRhSXNFbXB0eRDCAxIQCgtJbnZhbGlkRGF0YRD0Aw=='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbenum.dart deleted file mode 100644 index 52eb16349e..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbenum.dart +++ /dev/null @@ -1,56 +0,0 @@ -/// -// Generated code. Do not modify. -// source: errors.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 ErrorCode extends $pb.ProtobufEnum { - static const ErrorCode WorkspaceNameInvalid = ErrorCode._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WorkspaceNameInvalid'); - static const ErrorCode WorkspaceIdInvalid = ErrorCode._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WorkspaceIdInvalid'); - static const ErrorCode AppColorStyleInvalid = ErrorCode._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AppColorStyleInvalid'); - static const ErrorCode WorkspaceDescTooLong = ErrorCode._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WorkspaceDescTooLong'); - static const ErrorCode WorkspaceNameTooLong = ErrorCode._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WorkspaceNameTooLong'); - static const ErrorCode AppIdInvalid = ErrorCode._(10, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AppIdInvalid'); - static const ErrorCode AppNameInvalid = ErrorCode._(11, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AppNameInvalid'); - static const ErrorCode ViewNameInvalid = ErrorCode._(20, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ViewNameInvalid'); - static const ErrorCode ViewThumbnailInvalid = ErrorCode._(21, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ViewThumbnailInvalid'); - static const ErrorCode ViewIdInvalid = ErrorCode._(22, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ViewIdInvalid'); - static const ErrorCode ViewDescTooLong = ErrorCode._(23, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ViewDescTooLong'); - static const ErrorCode ViewDataInvalid = ErrorCode._(24, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ViewDataInvalid'); - static const ErrorCode ViewNameTooLong = ErrorCode._(25, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ViewNameTooLong'); - static const ErrorCode UserUnauthorized = ErrorCode._(100, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserUnauthorized'); - static const ErrorCode WsConnectError = ErrorCode._(200, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WsConnectError'); - static const ErrorCode InternalError = ErrorCode._(1000, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'InternalError'); - static const ErrorCode RecordNotFound = ErrorCode._(1001, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RecordNotFound'); - - static const $core.List values = [ - WorkspaceNameInvalid, - WorkspaceIdInvalid, - AppColorStyleInvalid, - WorkspaceDescTooLong, - WorkspaceNameTooLong, - AppIdInvalid, - AppNameInvalid, - ViewNameInvalid, - ViewThumbnailInvalid, - ViewIdInvalid, - ViewDescTooLong, - ViewDataInvalid, - ViewNameTooLong, - UserUnauthorized, - WsConnectError, - InternalError, - RecordNotFound, - ]; - - static final $core.Map<$core.int, ErrorCode> _byValue = $pb.ProtobufEnum.initByValue(values); - static ErrorCode? valueOf($core.int value) => _byValue[value]; - - const ErrorCode._($core.int v, $core.String n) : super(v, n); -} - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbjson.dart deleted file mode 100644 index a829c0ed5d..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbjson.dart +++ /dev/null @@ -1,36 +0,0 @@ -/// -// Generated code. Do not modify. -// source: errors.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 errorCodeDescriptor instead') -const ErrorCode$json = const { - '1': 'ErrorCode', - '2': const [ - const {'1': 'WorkspaceNameInvalid', '2': 0}, - const {'1': 'WorkspaceIdInvalid', '2': 1}, - const {'1': 'AppColorStyleInvalid', '2': 2}, - const {'1': 'WorkspaceDescTooLong', '2': 3}, - const {'1': 'WorkspaceNameTooLong', '2': 4}, - const {'1': 'AppIdInvalid', '2': 10}, - const {'1': 'AppNameInvalid', '2': 11}, - const {'1': 'ViewNameInvalid', '2': 20}, - const {'1': 'ViewThumbnailInvalid', '2': 21}, - const {'1': 'ViewIdInvalid', '2': 22}, - const {'1': 'ViewDescTooLong', '2': 23}, - const {'1': 'ViewDataInvalid', '2': 24}, - const {'1': 'ViewNameTooLong', '2': 25}, - const {'1': 'UserUnauthorized', '2': 100}, - const {'1': 'WsConnectError', '2': 200}, - const {'1': 'InternalError', '2': 1000}, - const {'1': 'RecordNotFound', '2': 1001}, - ], -}; - -/// Descriptor for `ErrorCode`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSGAoUV29ya3NwYWNlTmFtZUludmFsaWQQABIWChJXb3Jrc3BhY2VJZEludmFsaWQQARIYChRBcHBDb2xvclN0eWxlSW52YWxpZBACEhgKFFdvcmtzcGFjZURlc2NUb29Mb25nEAMSGAoUV29ya3NwYWNlTmFtZVRvb0xvbmcQBBIQCgxBcHBJZEludmFsaWQQChISCg5BcHBOYW1lSW52YWxpZBALEhMKD1ZpZXdOYW1lSW52YWxpZBAUEhgKFFZpZXdUaHVtYm5haWxJbnZhbGlkEBUSEQoNVmlld0lkSW52YWxpZBAWEhMKD1ZpZXdEZXNjVG9vTG9uZxAXEhMKD1ZpZXdEYXRhSW52YWxpZBAYEhMKD1ZpZXdOYW1lVG9vTG9uZxAZEhQKEFVzZXJVbmF1dGhvcml6ZWQQZBITCg5Xc0Nvbm5lY3RFcnJvchDIARISCg1JbnRlcm5hbEVycm9yEOgHEhMKDlJlY29yZE5vdEZvdW5kEOkH'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart index bc713bbdb8..e27e019be3 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pb.dart @@ -252,6 +252,246 @@ class FieldOrder extends $pb.GeneratedMessage { void clearFieldId() => clearField(1); } +enum GetEditFieldContextPayload_OneOfFieldId { + fieldId, + notSet +} + +class GetEditFieldContextPayload extends $pb.GeneratedMessage { + static const $core.Map<$core.int, GetEditFieldContextPayload_OneOfFieldId> _GetEditFieldContextPayload_OneOfFieldIdByTag = { + 2 : GetEditFieldContextPayload_OneOfFieldId.fieldId, + 0 : GetEditFieldContextPayload_OneOfFieldId.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GetEditFieldContextPayload', createEmptyInstance: create) + ..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) + ..hasRequiredFields = false + ; + + GetEditFieldContextPayload._() : super(); + factory GetEditFieldContextPayload({ + $core.String? gridId, + $core.String? fieldId, + $0.FieldType? fieldType, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (fieldType != null) { + _result.fieldType = fieldType; + } + return _result; + } + factory GetEditFieldContextPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory GetEditFieldContextPayload.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') + GetEditFieldContextPayload clone() => GetEditFieldContextPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + GetEditFieldContextPayload copyWith(void Function(GetEditFieldContextPayload) updates) => super.copyWith((message) => updates(message as GetEditFieldContextPayload)) as GetEditFieldContextPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static GetEditFieldContextPayload create() => GetEditFieldContextPayload._(); + GetEditFieldContextPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GetEditFieldContextPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static GetEditFieldContextPayload? _defaultInstance; + + GetEditFieldContextPayload_OneOfFieldId whichOneOfFieldId() => _GetEditFieldContextPayload_OneOfFieldIdByTag[$_whichOneof(0)]!; + void clearOneOfFieldId() => 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 fieldId => $_getSZ(1); + @$pb.TagNumber(2) + set fieldId($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasFieldId() => $_has(1); + @$pb.TagNumber(2) + void clearFieldId() => clearField(2); + + @$pb.TagNumber(3) + $0.FieldType get fieldType => $_getN(2); + @$pb.TagNumber(3) + set fieldType($0.FieldType v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasFieldType() => $_has(2); + @$pb.TagNumber(3) + void clearFieldType() => clearField(3); +} + +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) + ..hasRequiredFields = false + ; + + EditFieldPayload._() : super(); + factory EditFieldPayload({ + $core.String? gridId, + $core.String? fieldId, + $0.FieldType? fieldType, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (fieldType != null) { + _result.fieldType = fieldType; + } + return _result; + } + factory EditFieldPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory EditFieldPayload.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') + EditFieldPayload clone() => EditFieldPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + EditFieldPayload copyWith(void Function(EditFieldPayload) updates) => super.copyWith((message) => updates(message as EditFieldPayload)) as EditFieldPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static EditFieldPayload create() => EditFieldPayload._(); + EditFieldPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static EditFieldPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static EditFieldPayload? _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.String get fieldId => $_getSZ(1); + @$pb.TagNumber(2) + set fieldId($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasFieldId() => $_has(1); + @$pb.TagNumber(2) + void clearFieldId() => clearField(2); + + @$pb.TagNumber(3) + $0.FieldType get fieldType => $_getN(2); + @$pb.TagNumber(3) + set fieldType($0.FieldType v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasFieldType() => $_has(2); + @$pb.TagNumber(3) + void clearFieldType() => clearField(3); +} + +class EditFieldContext extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'EditFieldContext', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridField', subBuilder: Field.create) + ..a<$core.List<$core.int>>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptionData', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + EditFieldContext._() : super(); + factory EditFieldContext({ + $core.String? gridId, + Field? gridField, + $core.List<$core.int>? typeOptionData, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (gridField != null) { + _result.gridField = gridField; + } + if (typeOptionData != null) { + _result.typeOptionData = typeOptionData; + } + return _result; + } + factory EditFieldContext.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory EditFieldContext.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') + EditFieldContext clone() => EditFieldContext()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + EditFieldContext copyWith(void Function(EditFieldContext) updates) => super.copyWith((message) => updates(message as EditFieldContext)) as EditFieldContext; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static EditFieldContext create() => EditFieldContext._(); + EditFieldContext createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static EditFieldContext getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static EditFieldContext? _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) + Field get gridField => $_getN(1); + @$pb.TagNumber(2) + set gridField(Field v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasGridField() => $_has(1); + @$pb.TagNumber(2) + void clearGridField() => clearField(2); + @$pb.TagNumber(2) + Field ensureGridField() => $_ensure(1); + + @$pb.TagNumber(3) + $core.List<$core.int> get typeOptionData => $_getN(2); + @$pb.TagNumber(3) + set typeOptionData($core.List<$core.int> v) { $_setBytes(2, v); } + @$pb.TagNumber(3) + $core.bool hasTypeOptionData() => $_has(2); + @$pb.TagNumber(3) + void clearTypeOptionData() => clearField(3); +} + class RepeatedField extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedField', createEmptyInstance: create) ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: Field.create) @@ -609,19 +849,19 @@ class GridBlockOrder extends $pb.GeneratedMessage { class GridBlock extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlock', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowOrders', $pb.PbFieldType.PM, subBuilder: RowOrder.create) ..hasRequiredFields = false ; GridBlock._() : super(); factory GridBlock({ - $core.String? blockId, + $core.String? id, $core.Iterable? rowOrders, }) { final _result = create(); - if (blockId != null) { - _result.blockId = blockId; + if (id != null) { + _result.id = id; } if (rowOrders != null) { _result.rowOrders.addAll(rowOrders); @@ -650,13 +890,13 @@ class GridBlock extends $pb.GeneratedMessage { static GridBlock? _defaultInstance; @$pb.TagNumber(1) - $core.String get blockId => $_getSZ(0); + $core.String get id => $_getSZ(0); @$pb.TagNumber(1) - set blockId($core.String v) { $_setString(0, v); } + set id($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) - $core.bool hasBlockId() => $_has(0); + $core.bool hasId() => $_has(0); @$pb.TagNumber(1) - void clearBlockId() => clearField(1); + void clearId() => clearField(1); @$pb.TagNumber(2) $core.List get rowOrders => $_getList(1); @@ -723,6 +963,108 @@ class Cell extends $pb.GeneratedMessage { void clearContent() => clearField(2); } +enum CellNotificationData_OneOfContent { + content, + notSet +} + +class CellNotificationData extends $pb.GeneratedMessage { + static const $core.Map<$core.int, CellNotificationData_OneOfContent> _CellNotificationData_OneOfContentByTag = { + 4 : CellNotificationData_OneOfContent.content, + 0 : CellNotificationData_OneOfContent.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CellNotificationData', 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') ? '' : 'fieldId') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') + ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'content') + ..hasRequiredFields = false + ; + + CellNotificationData._() : super(); + factory CellNotificationData({ + $core.String? gridId, + $core.String? fieldId, + $core.String? rowId, + $core.String? content, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (rowId != null) { + _result.rowId = rowId; + } + if (content != null) { + _result.content = content; + } + return _result; + } + factory CellNotificationData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CellNotificationData.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') + CellNotificationData clone() => CellNotificationData()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CellNotificationData copyWith(void Function(CellNotificationData) updates) => super.copyWith((message) => updates(message as CellNotificationData)) as CellNotificationData; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CellNotificationData create() => CellNotificationData._(); + CellNotificationData createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CellNotificationData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CellNotificationData? _defaultInstance; + + CellNotificationData_OneOfContent whichOneOfContent() => _CellNotificationData_OneOfContentByTag[$_whichOneof(0)]!; + void clearOneOfContent() => 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 fieldId => $_getSZ(1); + @$pb.TagNumber(2) + set fieldId($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasFieldId() => $_has(1); + @$pb.TagNumber(2) + void clearFieldId() => clearField(2); + + @$pb.TagNumber(3) + $core.String get rowId => $_getSZ(2); + @$pb.TagNumber(3) + set rowId($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasRowId() => $_has(2); + @$pb.TagNumber(3) + void clearRowId() => clearField(3); + + @$pb.TagNumber(4) + $core.String get content => $_getSZ(3); + @$pb.TagNumber(4) + set content($core.String v) { $_setString(3, v); } + @$pb.TagNumber(4) + $core.bool hasContent() => $_has(3); + @$pb.TagNumber(4) + void clearContent() => clearField(4); +} + class RepeatedCell extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedCell', createEmptyInstance: create) ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: Cell.create) @@ -979,6 +1321,110 @@ class CreateRowPayload extends $pb.GeneratedMessage { void clearStartRowId() => clearField(2); } +enum CreateFieldPayload_OneOfStartFieldId { + startFieldId, + notSet +} + +class CreateFieldPayload extends $pb.GeneratedMessage { + static const $core.Map<$core.int, CreateFieldPayload_OneOfStartFieldId> _CreateFieldPayload_OneOfStartFieldIdByTag = { + 4 : CreateFieldPayload_OneOfStartFieldId.startFieldId, + 0 : CreateFieldPayload_OneOfStartFieldId.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateFieldPayload', createEmptyInstance: create) + ..oo(0, [4]) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'field', subBuilder: Field.create) + ..a<$core.List<$core.int>>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptionData', $pb.PbFieldType.OY) + ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startFieldId') + ..hasRequiredFields = false + ; + + CreateFieldPayload._() : super(); + factory CreateFieldPayload({ + $core.String? gridId, + Field? field_2, + $core.List<$core.int>? typeOptionData, + $core.String? startFieldId, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (field_2 != null) { + _result.field_2 = field_2; + } + if (typeOptionData != null) { + _result.typeOptionData = typeOptionData; + } + if (startFieldId != null) { + _result.startFieldId = startFieldId; + } + return _result; + } + factory CreateFieldPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateFieldPayload.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') + CreateFieldPayload clone() => CreateFieldPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateFieldPayload copyWith(void Function(CreateFieldPayload) updates) => super.copyWith((message) => updates(message as CreateFieldPayload)) as CreateFieldPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CreateFieldPayload create() => CreateFieldPayload._(); + CreateFieldPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateFieldPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateFieldPayload? _defaultInstance; + + CreateFieldPayload_OneOfStartFieldId whichOneOfStartFieldId() => _CreateFieldPayload_OneOfStartFieldIdByTag[$_whichOneof(0)]!; + void clearOneOfStartFieldId() => 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) + Field get field_2 => $_getN(1); + @$pb.TagNumber(2) + set field_2(Field v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasField_2() => $_has(1); + @$pb.TagNumber(2) + void clearField_2() => clearField(2); + @$pb.TagNumber(2) + Field ensureField_2() => $_ensure(1); + + @$pb.TagNumber(3) + $core.List<$core.int> get typeOptionData => $_getN(2); + @$pb.TagNumber(3) + set typeOptionData($core.List<$core.int> v) { $_setBytes(2, v); } + @$pb.TagNumber(3) + $core.bool hasTypeOptionData() => $_has(2); + @$pb.TagNumber(3) + void clearTypeOptionData() => clearField(3); + + @$pb.TagNumber(4) + $core.String get startFieldId => $_getSZ(3); + @$pb.TagNumber(4) + set startFieldId($core.String v) { $_setString(3, v); } + @$pb.TagNumber(4) + $core.bool hasStartFieldId() => $_has(3); + @$pb.TagNumber(4) + void clearStartFieldId() => clearField(4); +} + class QueryFieldPayload extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'QueryFieldPayload', createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') @@ -1097,78 +1543,3 @@ class QueryGridBlocksPayload extends $pb.GeneratedMessage { $core.List get blockOrders => $_getList(1); } -class QueryRowPayload extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'QueryRowPayload', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') - ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockId') - ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') - ..hasRequiredFields = false - ; - - QueryRowPayload._() : super(); - factory QueryRowPayload({ - $core.String? gridId, - $core.String? blockId, - $core.String? rowId, - }) { - final _result = create(); - if (gridId != null) { - _result.gridId = gridId; - } - if (blockId != null) { - _result.blockId = blockId; - } - if (rowId != null) { - _result.rowId = rowId; - } - return _result; - } - factory QueryRowPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory QueryRowPayload.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') - QueryRowPayload clone() => QueryRowPayload()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - QueryRowPayload copyWith(void Function(QueryRowPayload) updates) => super.copyWith((message) => updates(message as QueryRowPayload)) as QueryRowPayload; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static QueryRowPayload create() => QueryRowPayload._(); - QueryRowPayload createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static QueryRowPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static QueryRowPayload? _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.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.String get rowId => $_getSZ(2); - @$pb.TagNumber(3) - set rowId($core.String v) { $_setString(2, v); } - @$pb.TagNumber(3) - $core.bool hasRowId() => $_has(2); - @$pb.TagNumber(3) - void clearRowId() => clearField(3); -} - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart index 5e24c82178..3cd228af79 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/grid.pbjson.dart @@ -46,6 +46,45 @@ const FieldOrder$json = const { /// Descriptor for `FieldOrder`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List fieldOrderDescriptor = $convert.base64Decode('CgpGaWVsZE9yZGVyEhkKCGZpZWxkX2lkGAEgASgJUgdmaWVsZElk'); +@$core.Deprecated('Use getEditFieldContextPayloadDescriptor instead') +const GetEditFieldContextPayload$json = const { + '1': 'GetEditFieldContextPayload', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'field_id', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'fieldId'}, + const {'1': 'field_type', '3': 3, '4': 1, '5': 14, '6': '.FieldType', '10': 'fieldType'}, + ], + '8': const [ + const {'1': 'one_of_field_id'}, + ], +}; + +/// Descriptor for `GetEditFieldContextPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getEditFieldContextPayloadDescriptor = $convert.base64Decode('ChpHZXRFZGl0RmllbGRDb250ZXh0UGF5bG9hZBIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSGwoIZmllbGRfaWQYAiABKAlIAFIHZmllbGRJZBIpCgpmaWVsZF90eXBlGAMgASgOMgouRmllbGRUeXBlUglmaWVsZFR5cGVCEQoPb25lX29mX2ZpZWxkX2lk'); +@$core.Deprecated('Use editFieldPayloadDescriptor instead') +const EditFieldPayload$json = const { + '1': 'EditFieldPayload', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'field_id', '3': 2, '4': 1, '5': 9, '10': 'fieldId'}, + const {'1': 'field_type', '3': 3, '4': 1, '5': 14, '6': '.FieldType', '10': 'fieldType'}, + ], +}; + +/// Descriptor for `EditFieldPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List editFieldPayloadDescriptor = $convert.base64Decode('ChBFZGl0RmllbGRQYXlsb2FkEhcKB2dyaWRfaWQYASABKAlSBmdyaWRJZBIZCghmaWVsZF9pZBgCIAEoCVIHZmllbGRJZBIpCgpmaWVsZF90eXBlGAMgASgOMgouRmllbGRUeXBlUglmaWVsZFR5cGU='); +@$core.Deprecated('Use editFieldContextDescriptor instead') +const EditFieldContext$json = const { + '1': 'EditFieldContext', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'grid_field', '3': 2, '4': 1, '5': 11, '6': '.Field', '10': 'gridField'}, + const {'1': 'type_option_data', '3': 3, '4': 1, '5': 12, '10': 'typeOptionData'}, + ], +}; + +/// Descriptor for `EditFieldContext`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List editFieldContextDescriptor = $convert.base64Decode('ChBFZGl0RmllbGRDb250ZXh0EhcKB2dyaWRfaWQYASABKAlSBmdyaWRJZBIlCgpncmlkX2ZpZWxkGAIgASgLMgYuRmllbGRSCWdyaWRGaWVsZBIoChB0eXBlX29wdGlvbl9kYXRhGAMgASgMUg50eXBlT3B0aW9uRGF0YQ=='); @$core.Deprecated('Use repeatedFieldDescriptor instead') const RepeatedField$json = const { '1': 'RepeatedField', @@ -135,13 +174,13 @@ final $typed_data.Uint8List gridBlockOrderDescriptor = $convert.base64Decode('Cg const GridBlock$json = const { '1': 'GridBlock', '2': const [ - const {'1': 'block_id', '3': 1, '4': 1, '5': 9, '10': 'blockId'}, + const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, const {'1': 'row_orders', '3': 2, '4': 3, '5': 11, '6': '.RowOrder', '10': 'rowOrders'}, ], }; /// Descriptor for `GridBlock`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List gridBlockDescriptor = $convert.base64Decode('CglHcmlkQmxvY2sSGQoIYmxvY2tfaWQYASABKAlSB2Jsb2NrSWQSKAoKcm93X29yZGVycxgCIAMoCzIJLlJvd09yZGVyUglyb3dPcmRlcnM='); +final $typed_data.Uint8List gridBlockDescriptor = $convert.base64Decode('CglHcmlkQmxvY2sSDgoCaWQYASABKAlSAmlkEigKCnJvd19vcmRlcnMYAiADKAsyCS5Sb3dPcmRlclIJcm93T3JkZXJz'); @$core.Deprecated('Use cellDescriptor instead') const Cell$json = const { '1': 'Cell', @@ -153,6 +192,22 @@ const Cell$json = const { /// Descriptor for `Cell`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List cellDescriptor = $convert.base64Decode('CgRDZWxsEhkKCGZpZWxkX2lkGAEgASgJUgdmaWVsZElkEhgKB2NvbnRlbnQYAiABKAlSB2NvbnRlbnQ='); +@$core.Deprecated('Use cellNotificationDataDescriptor instead') +const CellNotificationData$json = const { + '1': 'CellNotificationData', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'field_id', '3': 2, '4': 1, '5': 9, '10': 'fieldId'}, + const {'1': 'row_id', '3': 3, '4': 1, '5': 9, '10': 'rowId'}, + const {'1': 'content', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'content'}, + ], + '8': const [ + const {'1': 'one_of_content'}, + ], +}; + +/// Descriptor for `CellNotificationData`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List cellNotificationDataDescriptor = $convert.base64Decode('ChRDZWxsTm90aWZpY2F0aW9uRGF0YRIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSGQoIZmllbGRfaWQYAiABKAlSB2ZpZWxkSWQSFQoGcm93X2lkGAMgASgJUgVyb3dJZBIaCgdjb250ZW50GAQgASgJSABSB2NvbnRlbnRCEAoOb25lX29mX2NvbnRlbnQ='); @$core.Deprecated('Use repeatedCellDescriptor instead') const RepeatedCell$json = const { '1': 'RepeatedCell', @@ -207,6 +262,22 @@ const CreateRowPayload$json = const { /// Descriptor for `CreateRowPayload`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List createRowPayloadDescriptor = $convert.base64Decode('ChBDcmVhdGVSb3dQYXlsb2FkEhcKB2dyaWRfaWQYASABKAlSBmdyaWRJZBIiCgxzdGFydF9yb3dfaWQYAiABKAlIAFIKc3RhcnRSb3dJZEIVChNvbmVfb2Zfc3RhcnRfcm93X2lk'); +@$core.Deprecated('Use createFieldPayloadDescriptor instead') +const CreateFieldPayload$json = const { + '1': 'CreateFieldPayload', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'field', '3': 2, '4': 1, '5': 11, '6': '.Field', '10': 'field'}, + const {'1': 'type_option_data', '3': 3, '4': 1, '5': 12, '10': 'typeOptionData'}, + const {'1': 'start_field_id', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'startFieldId'}, + ], + '8': const [ + const {'1': 'one_of_start_field_id'}, + ], +}; + +/// Descriptor for `CreateFieldPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List createFieldPayloadDescriptor = $convert.base64Decode('ChJDcmVhdGVGaWVsZFBheWxvYWQSFwoHZ3JpZF9pZBgBIAEoCVIGZ3JpZElkEhwKBWZpZWxkGAIgASgLMgYuRmllbGRSBWZpZWxkEigKEHR5cGVfb3B0aW9uX2RhdGEYAyABKAxSDnR5cGVPcHRpb25EYXRhEiYKDnN0YXJ0X2ZpZWxkX2lkGAQgASgJSABSDHN0YXJ0RmllbGRJZEIXChVvbmVfb2Zfc3RhcnRfZmllbGRfaWQ='); @$core.Deprecated('Use queryFieldPayloadDescriptor instead') const QueryFieldPayload$json = const { '1': 'QueryFieldPayload', @@ -229,15 +300,3 @@ const QueryGridBlocksPayload$json = const { /// Descriptor for `QueryGridBlocksPayload`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List queryGridBlocksPayloadDescriptor = $convert.base64Decode('ChZRdWVyeUdyaWRCbG9ja3NQYXlsb2FkEhcKB2dyaWRfaWQYASABKAlSBmdyaWRJZBIyCgxibG9ja19vcmRlcnMYAiADKAsyDy5HcmlkQmxvY2tPcmRlclILYmxvY2tPcmRlcnM='); -@$core.Deprecated('Use queryRowPayloadDescriptor instead') -const QueryRowPayload$json = const { - '1': 'QueryRowPayload', - '2': const [ - const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, - const {'1': 'block_id', '3': 2, '4': 1, '5': 9, '10': 'blockId'}, - const {'1': 'row_id', '3': 3, '4': 1, '5': 9, '10': 'rowId'}, - ], -}; - -/// Descriptor for `QueryRowPayload`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List queryRowPayloadDescriptor = $convert.base64Decode('Cg9RdWVyeVJvd1BheWxvYWQSFwoHZ3JpZF9pZBgBIAEoCVIGZ3JpZElkEhkKCGJsb2NrX2lkGAIgASgJUgdibG9ja0lkEhUKBnJvd19pZBgDIAEoCVIFcm93SWQ='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart index 4bbeae52a5..9e730b17d2 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pb.dart @@ -151,15 +151,15 @@ class GridBlockMeta extends $pb.GeneratedMessage { void clearRowCount() => clearField(3); } -class GridBlockMetaSerde extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GridBlockMetaSerde', createEmptyInstance: create) +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(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowMetas', $pb.PbFieldType.PM, subBuilder: RowMeta.create) ..hasRequiredFields = false ; - GridBlockMetaSerde._() : super(); - factory GridBlockMetaSerde({ + GridBlockMetaData._() : super(); + factory GridBlockMetaData({ $core.String? blockId, $core.Iterable? rowMetas, }) { @@ -172,26 +172,26 @@ class GridBlockMetaSerde extends $pb.GeneratedMessage { } return _result; } - factory GridBlockMetaSerde.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory GridBlockMetaSerde.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + 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') - GridBlockMetaSerde clone() => GridBlockMetaSerde()..mergeFromMessage(this); + 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') - GridBlockMetaSerde copyWith(void Function(GridBlockMetaSerde) updates) => super.copyWith((message) => updates(message as GridBlockMetaSerde)) as GridBlockMetaSerde; // ignore: deprecated_member_use + 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 GridBlockMetaSerde create() => GridBlockMetaSerde._(); - GridBlockMetaSerde createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static GridBlockMetaData create() => GridBlockMetaData._(); + GridBlockMetaData createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static GridBlockMetaSerde getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static GridBlockMetaSerde? _defaultInstance; + static GridBlockMetaData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static GridBlockMetaData? _defaultInstance; @$pb.TagNumber(1) $core.String get blockId => $_getSZ(0); @@ -215,7 +215,7 @@ class FieldMeta extends $pb.GeneratedMessage { ..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) - ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptions') + ..aOM(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptionByFieldTypeId', subBuilder: TypeOptionDataByFieldTypeId.create) ..hasRequiredFields = false ; @@ -228,7 +228,7 @@ class FieldMeta extends $pb.GeneratedMessage { $core.bool? frozen, $core.bool? visibility, $core.int? width, - $core.String? typeOptions, + TypeOptionDataByFieldTypeId? typeOptionByFieldTypeId, }) { final _result = create(); if (id != null) { @@ -252,8 +252,8 @@ class FieldMeta extends $pb.GeneratedMessage { if (width != null) { _result.width = width; } - if (typeOptions != null) { - _result.typeOptions = typeOptions; + if (typeOptionByFieldTypeId != null) { + _result.typeOptionByFieldTypeId = typeOptionByFieldTypeId; } return _result; } @@ -342,113 +342,161 @@ class FieldMeta extends $pb.GeneratedMessage { void clearWidth() => clearField(7); @$pb.TagNumber(8) - $core.String get typeOptions => $_getSZ(7); + TypeOptionDataByFieldTypeId get typeOptionByFieldTypeId => $_getN(7); @$pb.TagNumber(8) - set typeOptions($core.String v) { $_setString(7, v); } + set typeOptionByFieldTypeId(TypeOptionDataByFieldTypeId v) { setField(8, v); } @$pb.TagNumber(8) - $core.bool hasTypeOptions() => $_has(7); + $core.bool hasTypeOptionByFieldTypeId() => $_has(7); @$pb.TagNumber(8) - void clearTypeOptions() => clearField(8); + void clearTypeOptionByFieldTypeId() => clearField(8); + @$pb.TagNumber(8) + TypeOptionDataByFieldTypeId ensureTypeOptionByFieldTypeId() => $_ensure(7); } -enum FieldChangeset_OneOfName { +class TypeOptionDataByFieldTypeId extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TypeOptionDataByFieldTypeId', createEmptyInstance: create) + ..m<$core.String, $core.String>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'map', entryClassName: 'TypeOptionDataByFieldTypeId.MapEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OS) + ..hasRequiredFields = false + ; + + TypeOptionDataByFieldTypeId._() : super(); + factory TypeOptionDataByFieldTypeId({ + $core.Map<$core.String, $core.String>? map, + }) { + final _result = create(); + if (map != null) { + _result.map.addAll(map); + } + return _result; + } + factory TypeOptionDataByFieldTypeId.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TypeOptionDataByFieldTypeId.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') + TypeOptionDataByFieldTypeId clone() => TypeOptionDataByFieldTypeId()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TypeOptionDataByFieldTypeId copyWith(void Function(TypeOptionDataByFieldTypeId) updates) => super.copyWith((message) => updates(message as TypeOptionDataByFieldTypeId)) as TypeOptionDataByFieldTypeId; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static TypeOptionDataByFieldTypeId create() => TypeOptionDataByFieldTypeId._(); + TypeOptionDataByFieldTypeId createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static TypeOptionDataByFieldTypeId getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TypeOptionDataByFieldTypeId? _defaultInstance; + + @$pb.TagNumber(1) + $core.Map<$core.String, $core.String> get map => $_getMap(0); +} + +enum FieldChangesetPayload_OneOfName { name, notSet } -enum FieldChangeset_OneOfDesc { +enum FieldChangesetPayload_OneOfDesc { desc, notSet } -enum FieldChangeset_OneOfFieldType { +enum FieldChangesetPayload_OneOfFieldType { fieldType, notSet } -enum FieldChangeset_OneOfFrozen { +enum FieldChangesetPayload_OneOfFrozen { frozen, notSet } -enum FieldChangeset_OneOfVisibility { +enum FieldChangesetPayload_OneOfVisibility { visibility, notSet } -enum FieldChangeset_OneOfWidth { +enum FieldChangesetPayload_OneOfWidth { width, notSet } -enum FieldChangeset_OneOfTypeOptions { - typeOptions, +enum FieldChangesetPayload_OneOfTypeOptionData { + typeOptionData, notSet } -class FieldChangeset extends $pb.GeneratedMessage { - static const $core.Map<$core.int, FieldChangeset_OneOfName> _FieldChangeset_OneOfNameByTag = { - 2 : FieldChangeset_OneOfName.name, - 0 : FieldChangeset_OneOfName.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, FieldChangeset_OneOfDesc> _FieldChangeset_OneOfDescByTag = { - 3 : FieldChangeset_OneOfDesc.desc, - 0 : FieldChangeset_OneOfDesc.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, FieldChangeset_OneOfFieldType> _FieldChangeset_OneOfFieldTypeByTag = { - 4 : FieldChangeset_OneOfFieldType.fieldType, - 0 : FieldChangeset_OneOfFieldType.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, FieldChangeset_OneOfFrozen> _FieldChangeset_OneOfFrozenByTag = { - 5 : FieldChangeset_OneOfFrozen.frozen, - 0 : FieldChangeset_OneOfFrozen.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, FieldChangeset_OneOfVisibility> _FieldChangeset_OneOfVisibilityByTag = { - 6 : FieldChangeset_OneOfVisibility.visibility, - 0 : FieldChangeset_OneOfVisibility.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, FieldChangeset_OneOfWidth> _FieldChangeset_OneOfWidthByTag = { - 7 : FieldChangeset_OneOfWidth.width, - 0 : FieldChangeset_OneOfWidth.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, FieldChangeset_OneOfTypeOptions> _FieldChangeset_OneOfTypeOptionsByTag = { - 8 : FieldChangeset_OneOfTypeOptions.typeOptions, - 0 : FieldChangeset_OneOfTypeOptions.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') ? '' : 'FieldChangeset', createEmptyInstance: create) - ..oo(0, [2]) - ..oo(1, [3]) - ..oo(2, [4]) - ..oo(3, [5]) - ..oo(4, [6]) - ..oo(5, [7]) - ..oo(6, [8]) + 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') ? '' : 'name') - ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc') - ..e(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) - ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'typeOptions') + ..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(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 ; - FieldChangeset._() : super(); - factory FieldChangeset({ + 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.String? typeOptions, + $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; } @@ -467,52 +515,52 @@ class FieldChangeset extends $pb.GeneratedMessage { if (width != null) { _result.width = width; } - if (typeOptions != null) { - _result.typeOptions = typeOptions; + if (typeOptionData != null) { + _result.typeOptionData = typeOptionData; } return _result; } - factory FieldChangeset.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory FieldChangeset.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + 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') - FieldChangeset clone() => FieldChangeset()..mergeFromMessage(this); + 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') - FieldChangeset copyWith(void Function(FieldChangeset) updates) => super.copyWith((message) => updates(message as FieldChangeset)) as FieldChangeset; // ignore: deprecated_member_use + 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 FieldChangeset create() => FieldChangeset._(); - FieldChangeset createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static FieldChangesetPayload create() => FieldChangesetPayload._(); + FieldChangesetPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static FieldChangeset getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static FieldChangeset? _defaultInstance; + static FieldChangesetPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static FieldChangesetPayload? _defaultInstance; - FieldChangeset_OneOfName whichOneOfName() => _FieldChangeset_OneOfNameByTag[$_whichOneof(0)]!; + FieldChangesetPayload_OneOfName whichOneOfName() => _FieldChangesetPayload_OneOfNameByTag[$_whichOneof(0)]!; void clearOneOfName() => clearField($_whichOneof(0)); - FieldChangeset_OneOfDesc whichOneOfDesc() => _FieldChangeset_OneOfDescByTag[$_whichOneof(1)]!; + FieldChangesetPayload_OneOfDesc whichOneOfDesc() => _FieldChangesetPayload_OneOfDescByTag[$_whichOneof(1)]!; void clearOneOfDesc() => clearField($_whichOneof(1)); - FieldChangeset_OneOfFieldType whichOneOfFieldType() => _FieldChangeset_OneOfFieldTypeByTag[$_whichOneof(2)]!; + FieldChangesetPayload_OneOfFieldType whichOneOfFieldType() => _FieldChangesetPayload_OneOfFieldTypeByTag[$_whichOneof(2)]!; void clearOneOfFieldType() => clearField($_whichOneof(2)); - FieldChangeset_OneOfFrozen whichOneOfFrozen() => _FieldChangeset_OneOfFrozenByTag[$_whichOneof(3)]!; + FieldChangesetPayload_OneOfFrozen whichOneOfFrozen() => _FieldChangesetPayload_OneOfFrozenByTag[$_whichOneof(3)]!; void clearOneOfFrozen() => clearField($_whichOneof(3)); - FieldChangeset_OneOfVisibility whichOneOfVisibility() => _FieldChangeset_OneOfVisibilityByTag[$_whichOneof(4)]!; + FieldChangesetPayload_OneOfVisibility whichOneOfVisibility() => _FieldChangesetPayload_OneOfVisibilityByTag[$_whichOneof(4)]!; void clearOneOfVisibility() => clearField($_whichOneof(4)); - FieldChangeset_OneOfWidth whichOneOfWidth() => _FieldChangeset_OneOfWidthByTag[$_whichOneof(5)]!; + FieldChangesetPayload_OneOfWidth whichOneOfWidth() => _FieldChangesetPayload_OneOfWidthByTag[$_whichOneof(5)]!; void clearOneOfWidth() => clearField($_whichOneof(5)); - FieldChangeset_OneOfTypeOptions whichOneOfTypeOptions() => _FieldChangeset_OneOfTypeOptionsByTag[$_whichOneof(6)]!; - void clearOneOfTypeOptions() => clearField($_whichOneof(6)); + FieldChangesetPayload_OneOfTypeOptionData whichOneOfTypeOptionData() => _FieldChangesetPayload_OneOfTypeOptionDataByTag[$_whichOneof(6)]!; + void clearOneOfTypeOptionData() => clearField($_whichOneof(6)); @$pb.TagNumber(1) $core.String get fieldId => $_getSZ(0); @@ -524,67 +572,76 @@ class FieldChangeset extends $pb.GeneratedMessage { void clearFieldId() => clearField(1); @$pb.TagNumber(2) - $core.String get name => $_getSZ(1); + $core.String get gridId => $_getSZ(1); @$pb.TagNumber(2) - set name($core.String v) { $_setString(1, v); } + set gridId($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) - $core.bool hasName() => $_has(1); + $core.bool hasGridId() => $_has(1); @$pb.TagNumber(2) - void clearName() => clearField(2); + void clearGridId() => clearField(2); @$pb.TagNumber(3) - $core.String get desc => $_getSZ(2); + $core.String get name => $_getSZ(2); @$pb.TagNumber(3) - set desc($core.String v) { $_setString(2, v); } + set name($core.String v) { $_setString(2, v); } @$pb.TagNumber(3) - $core.bool hasDesc() => $_has(2); + $core.bool hasName() => $_has(2); @$pb.TagNumber(3) - void clearDesc() => clearField(3); + void clearName() => clearField(3); @$pb.TagNumber(4) - FieldType get fieldType => $_getN(3); + $core.String get desc => $_getSZ(3); @$pb.TagNumber(4) - set fieldType(FieldType v) { setField(4, v); } + set desc($core.String v) { $_setString(3, v); } @$pb.TagNumber(4) - $core.bool hasFieldType() => $_has(3); + $core.bool hasDesc() => $_has(3); @$pb.TagNumber(4) - void clearFieldType() => clearField(4); + void clearDesc() => clearField(4); @$pb.TagNumber(5) - $core.bool get frozen => $_getBF(4); + FieldType get fieldType => $_getN(4); @$pb.TagNumber(5) - set frozen($core.bool v) { $_setBool(4, v); } + set fieldType(FieldType v) { setField(5, v); } @$pb.TagNumber(5) - $core.bool hasFrozen() => $_has(4); + $core.bool hasFieldType() => $_has(4); @$pb.TagNumber(5) - void clearFrozen() => clearField(5); + void clearFieldType() => clearField(5); @$pb.TagNumber(6) - $core.bool get visibility => $_getBF(5); + $core.bool get frozen => $_getBF(5); @$pb.TagNumber(6) - set visibility($core.bool v) { $_setBool(5, v); } + set frozen($core.bool v) { $_setBool(5, v); } @$pb.TagNumber(6) - $core.bool hasVisibility() => $_has(5); + $core.bool hasFrozen() => $_has(5); @$pb.TagNumber(6) - void clearVisibility() => clearField(6); + void clearFrozen() => clearField(6); @$pb.TagNumber(7) - $core.int get width => $_getIZ(6); + $core.bool get visibility => $_getBF(6); @$pb.TagNumber(7) - set width($core.int v) { $_setSignedInt32(6, v); } + set visibility($core.bool v) { $_setBool(6, v); } @$pb.TagNumber(7) - $core.bool hasWidth() => $_has(6); + $core.bool hasVisibility() => $_has(6); @$pb.TagNumber(7) - void clearWidth() => clearField(7); + void clearVisibility() => clearField(7); @$pb.TagNumber(8) - $core.String get typeOptions => $_getSZ(7); + $core.int get width => $_getIZ(7); @$pb.TagNumber(8) - set typeOptions($core.String v) { $_setString(7, v); } + set width($core.int v) { $_setSignedInt32(7, v); } @$pb.TagNumber(8) - $core.bool hasTypeOptions() => $_has(7); + $core.bool hasWidth() => $_has(7); @$pb.TagNumber(8) - void clearTypeOptions() => clearField(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 { @@ -1021,7 +1078,7 @@ class BuildGridContext extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildGridContext', createEmptyInstance: create) ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldMetas', $pb.PbFieldType.PM, subBuilder: FieldMeta.create) ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockMetas', subBuilder: GridBlockMeta.create) - ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockMetaData', subBuilder: GridBlockMetaSerde.create) + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockMetaData', subBuilder: GridBlockMetaData.create) ..hasRequiredFields = false ; @@ -1029,7 +1086,7 @@ class BuildGridContext extends $pb.GeneratedMessage { factory BuildGridContext({ $core.Iterable? fieldMetas, GridBlockMeta? blockMetas, - GridBlockMetaSerde? blockMetaData, + GridBlockMetaData? blockMetaData, }) { final _result = create(); if (fieldMetas != null) { @@ -1079,14 +1136,14 @@ class BuildGridContext extends $pb.GeneratedMessage { GridBlockMeta ensureBlockMetas() => $_ensure(1); @$pb.TagNumber(3) - GridBlockMetaSerde get blockMetaData => $_getN(2); + GridBlockMetaData get blockMetaData => $_getN(2); @$pb.TagNumber(3) - set blockMetaData(GridBlockMetaSerde v) { setField(3, v); } + 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) - GridBlockMetaSerde ensureBlockMetaData() => $_ensure(2); + GridBlockMetaData ensureBlockMetaData() => $_ensure(2); } diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart index d20b9da3f5..65e813160f 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid-data-model/meta.pbjson.dart @@ -47,17 +47,17 @@ const GridBlockMeta$json = const { /// Descriptor for `GridBlockMeta`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List gridBlockMetaDescriptor = $convert.base64Decode('Cg1HcmlkQmxvY2tNZXRhEhkKCGJsb2NrX2lkGAEgASgJUgdibG9ja0lkEiYKD3N0YXJ0X3Jvd19pbmRleBgCIAEoBVINc3RhcnRSb3dJbmRleBIbCglyb3dfY291bnQYAyABKAVSCHJvd0NvdW50'); -@$core.Deprecated('Use gridBlockMetaSerdeDescriptor instead') -const GridBlockMetaSerde$json = const { - '1': 'GridBlockMetaSerde', +@$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': 'row_metas', '3': 2, '4': 3, '5': 11, '6': '.RowMeta', '10': 'rowMetas'}, ], }; -/// Descriptor for `GridBlockMetaSerde`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List gridBlockMetaSerdeDescriptor = $convert.base64Decode('ChJHcmlkQmxvY2tNZXRhU2VyZGUSGQoIYmxvY2tfaWQYASABKAlSB2Jsb2NrSWQSJQoJcm93X21ldGFzGAIgAygLMgguUm93TWV0YVIIcm93TWV0YXM='); +/// Descriptor for `GridBlockMetaData`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List gridBlockMetaDataDescriptor = $convert.base64Decode('ChFHcmlkQmxvY2tNZXRhRGF0YRIZCghibG9ja19pZBgBIAEoCVIHYmxvY2tJZBIlCglyb3dfbWV0YXMYAiADKAsyCC5Sb3dNZXRhUghyb3dNZXRhcw=='); @$core.Deprecated('Use fieldMetaDescriptor instead') const FieldMeta$json = const { '1': 'FieldMeta', @@ -69,24 +69,46 @@ const FieldMeta$json = const { 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': 1, '5': 9, '10': 'typeOptions'}, + const {'1': 'type_option_by_field_type_id', '3': 8, '4': 1, '5': 11, '6': '.TypeOptionDataByFieldTypeId', '10': 'typeOptionByFieldTypeId'}, ], }; /// Descriptor for `FieldMeta`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List fieldMetaDescriptor = $convert.base64Decode('CglGaWVsZE1ldGESDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEgoEZGVzYxgDIAEoCVIEZGVzYxIpCgpmaWVsZF90eXBlGAQgASgOMgouRmllbGRUeXBlUglmaWVsZFR5cGUSFgoGZnJvemVuGAUgASgIUgZmcm96ZW4SHgoKdmlzaWJpbGl0eRgGIAEoCFIKdmlzaWJpbGl0eRIUCgV3aWR0aBgHIAEoBVIFd2lkdGgSIQoMdHlwZV9vcHRpb25zGAggASgJUgt0eXBlT3B0aW9ucw=='); -@$core.Deprecated('Use fieldChangesetDescriptor instead') -const FieldChangeset$json = const { - '1': 'FieldChangeset', +final $typed_data.Uint8List fieldMetaDescriptor = $convert.base64Decode('CglGaWVsZE1ldGESDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEgoEZGVzYxgDIAEoCVIEZGVzYxIpCgpmaWVsZF90eXBlGAQgASgOMgouRmllbGRUeXBlUglmaWVsZFR5cGUSFgoGZnJvemVuGAUgASgIUgZmcm96ZW4SHgoKdmlzaWJpbGl0eRgGIAEoCFIKdmlzaWJpbGl0eRIUCgV3aWR0aBgHIAEoBVIFd2lkdGgSWwocdHlwZV9vcHRpb25fYnlfZmllbGRfdHlwZV9pZBgIIAEoCzIcLlR5cGVPcHRpb25EYXRhQnlGaWVsZFR5cGVJZFIXdHlwZU9wdGlvbkJ5RmllbGRUeXBlSWQ='); +@$core.Deprecated('Use typeOptionDataByFieldTypeIdDescriptor instead') +const TypeOptionDataByFieldTypeId$json = const { + '1': 'TypeOptionDataByFieldTypeId', + '2': const [ + const {'1': 'map', '3': 1, '4': 3, '5': 11, '6': '.TypeOptionDataByFieldTypeId.MapEntry', '10': 'map'}, + ], + '3': const [TypeOptionDataByFieldTypeId_MapEntry$json], +}; + +@$core.Deprecated('Use typeOptionDataByFieldTypeIdDescriptor instead') +const TypeOptionDataByFieldTypeId_MapEntry$json = const { + '1': 'MapEntry', + '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 `TypeOptionDataByFieldTypeId`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List typeOptionDataByFieldTypeIdDescriptor = $convert.base64Decode('ChtUeXBlT3B0aW9uRGF0YUJ5RmllbGRUeXBlSWQSNwoDbWFwGAEgAygLMiUuVHlwZU9wdGlvbkRhdGFCeUZpZWxkVHlwZUlkLk1hcEVudHJ5UgNtYXAaNgoITWFwRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ=='); +@$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': 'name', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'name'}, - const {'1': 'desc', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'desc'}, - const {'1': 'field_type', '3': 4, '4': 1, '5': 14, '6': '.FieldType', '9': 2, '10': 'fieldType'}, - const {'1': 'frozen', '3': 5, '4': 1, '5': 8, '9': 3, '10': 'frozen'}, - const {'1': 'visibility', '3': 6, '4': 1, '5': 8, '9': 4, '10': 'visibility'}, - const {'1': 'width', '3': 7, '4': 1, '5': 5, '9': 5, '10': 'width'}, - const {'1': 'type_options', '3': 8, '4': 1, '5': 9, '9': 6, '10': 'typeOptions'}, + 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'}, @@ -95,12 +117,12 @@ const FieldChangeset$json = const { const {'1': 'one_of_frozen'}, const {'1': 'one_of_visibility'}, const {'1': 'one_of_width'}, - const {'1': 'one_of_type_options'}, + const {'1': 'one_of_type_option_data'}, ], }; -/// Descriptor for `FieldChangeset`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List fieldChangesetDescriptor = $convert.base64Decode('Cg5GaWVsZENoYW5nZXNldBIZCghmaWVsZF9pZBgBIAEoCVIHZmllbGRJZBIUCgRuYW1lGAIgASgJSABSBG5hbWUSFAoEZGVzYxgDIAEoCUgBUgRkZXNjEisKCmZpZWxkX3R5cGUYBCABKA4yCi5GaWVsZFR5cGVIAlIJZmllbGRUeXBlEhgKBmZyb3plbhgFIAEoCEgDUgZmcm96ZW4SIAoKdmlzaWJpbGl0eRgGIAEoCEgEUgp2aXNpYmlsaXR5EhYKBXdpZHRoGAcgASgFSAVSBXdpZHRoEiMKDHR5cGVfb3B0aW9ucxgIIAEoCUgGUgt0eXBlT3B0aW9uc0INCgtvbmVfb2ZfbmFtZUINCgtvbmVfb2ZfZGVzY0ITChFvbmVfb2ZfZmllbGRfdHlwZUIPCg1vbmVfb2ZfZnJvemVuQhMKEW9uZV9vZl92aXNpYmlsaXR5Qg4KDG9uZV9vZl93aWR0aEIVChNvbmVfb2ZfdHlwZV9vcHRpb25z'); +/// 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', @@ -198,9 +220,9 @@ const BuildGridContext$json = const { '2': const [ const {'1': 'field_metas', '3': 1, '4': 3, '5': 11, '6': '.FieldMeta', '10': 'fieldMetas'}, const {'1': 'block_metas', '3': 2, '4': 1, '5': 11, '6': '.GridBlockMeta', '10': 'blockMetas'}, - const {'1': 'block_meta_data', '3': 3, '4': 1, '5': 11, '6': '.GridBlockMetaSerde', '10': 'blockMetaData'}, + 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('ChBCdWlsZEdyaWRDb250ZXh0EisKC2ZpZWxkX21ldGFzGAEgAygLMgouRmllbGRNZXRhUgpmaWVsZE1ldGFzEi8KC2Jsb2NrX21ldGFzGAIgASgLMg4uR3JpZEJsb2NrTWV0YVIKYmxvY2tNZXRhcxI7Cg9ibG9ja19tZXRhX2RhdGEYAyABKAsyEy5HcmlkQmxvY2tNZXRhU2VyZGVSDWJsb2NrTWV0YURhdGE='); +final $typed_data.Uint8List buildGridContextDescriptor = $convert.base64Decode('ChBCdWlsZEdyaWRDb250ZXh0EisKC2ZpZWxkX21ldGFzGAEgAygLMgouRmllbGRNZXRhUgpmaWVsZE1ldGFzEi8KC2Jsb2NrX21ldGFzGAIgASgLMg4uR3JpZEJsb2NrTWV0YVIKYmxvY2tNZXRhcxI6Cg9ibG9ja19tZXRhX2RhdGEYAyABKAsyEi5HcmlkQmxvY2tNZXRhRGF0YVINYmxvY2tNZXRhRGF0YQ=='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pb.dart deleted file mode 100644 index d87c9e02c7..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pb.dart +++ /dev/null @@ -1,458 +0,0 @@ -/// -// Generated code. Do not modify. -// source: cell_data.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 'cell_data.pbenum.dart'; - -export 'cell_data.pbenum.dart'; - -class RichTextDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RichTextDescription', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'format') - ..hasRequiredFields = false - ; - - RichTextDescription._() : super(); - factory RichTextDescription({ - $core.String? format, - }) { - final _result = create(); - if (format != null) { - _result.format = format; - } - return _result; - } - factory RichTextDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RichTextDescription.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') - RichTextDescription clone() => RichTextDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - RichTextDescription copyWith(void Function(RichTextDescription) updates) => super.copyWith((message) => updates(message as RichTextDescription)) as RichTextDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static RichTextDescription create() => RichTextDescription._(); - RichTextDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static RichTextDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static RichTextDescription? _defaultInstance; - - @$pb.TagNumber(1) - $core.String get format => $_getSZ(0); - @$pb.TagNumber(1) - set format($core.String v) { $_setString(0, v); } - @$pb.TagNumber(1) - $core.bool hasFormat() => $_has(0); - @$pb.TagNumber(1) - void clearFormat() => clearField(1); -} - -class CheckboxDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CheckboxDescription', createEmptyInstance: create) - ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isSelected') - ..hasRequiredFields = false - ; - - CheckboxDescription._() : super(); - factory CheckboxDescription({ - $core.bool? isSelected, - }) { - final _result = create(); - if (isSelected != null) { - _result.isSelected = isSelected; - } - return _result; - } - factory CheckboxDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory CheckboxDescription.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') - CheckboxDescription clone() => CheckboxDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - CheckboxDescription copyWith(void Function(CheckboxDescription) updates) => super.copyWith((message) => updates(message as CheckboxDescription)) as CheckboxDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static CheckboxDescription create() => CheckboxDescription._(); - CheckboxDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static CheckboxDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static CheckboxDescription? _defaultInstance; - - @$pb.TagNumber(1) - $core.bool get isSelected => $_getBF(0); - @$pb.TagNumber(1) - set isSelected($core.bool v) { $_setBool(0, v); } - @$pb.TagNumber(1) - $core.bool hasIsSelected() => $_has(0); - @$pb.TagNumber(1) - void clearIsSelected() => clearField(1); -} - -class DateDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DateDescription', createEmptyInstance: create) - ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dateFormat', $pb.PbFieldType.OE, defaultOrMaker: DateFormat.Local, valueOf: DateFormat.valueOf, enumValues: DateFormat.values) - ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'timeFormat', $pb.PbFieldType.OE, defaultOrMaker: TimeFormat.TwelveHour, valueOf: TimeFormat.valueOf, enumValues: TimeFormat.values) - ..hasRequiredFields = false - ; - - DateDescription._() : super(); - factory DateDescription({ - DateFormat? dateFormat, - TimeFormat? timeFormat, - }) { - final _result = create(); - if (dateFormat != null) { - _result.dateFormat = dateFormat; - } - if (timeFormat != null) { - _result.timeFormat = timeFormat; - } - return _result; - } - factory DateDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory DateDescription.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') - DateDescription clone() => DateDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - DateDescription copyWith(void Function(DateDescription) updates) => super.copyWith((message) => updates(message as DateDescription)) as DateDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static DateDescription create() => DateDescription._(); - DateDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static DateDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static DateDescription? _defaultInstance; - - @$pb.TagNumber(1) - DateFormat get dateFormat => $_getN(0); - @$pb.TagNumber(1) - set dateFormat(DateFormat v) { setField(1, v); } - @$pb.TagNumber(1) - $core.bool hasDateFormat() => $_has(0); - @$pb.TagNumber(1) - void clearDateFormat() => clearField(1); - - @$pb.TagNumber(2) - TimeFormat get timeFormat => $_getN(1); - @$pb.TagNumber(2) - set timeFormat(TimeFormat v) { setField(2, v); } - @$pb.TagNumber(2) - $core.bool hasTimeFormat() => $_has(1); - @$pb.TagNumber(2) - void clearTimeFormat() => clearField(2); -} - -class SingleSelect extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SingleSelect', createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) - ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') - ..hasRequiredFields = false - ; - - SingleSelect._() : super(); - factory SingleSelect({ - $core.Iterable? options, - $core.bool? disableColor, - }) { - final _result = create(); - if (options != null) { - _result.options.addAll(options); - } - if (disableColor != null) { - _result.disableColor = disableColor; - } - return _result; - } - factory SingleSelect.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SingleSelect.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') - SingleSelect clone() => SingleSelect()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SingleSelect copyWith(void Function(SingleSelect) updates) => super.copyWith((message) => updates(message as SingleSelect)) as SingleSelect; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static SingleSelect create() => SingleSelect._(); - SingleSelect createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static SingleSelect getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static SingleSelect? _defaultInstance; - - @$pb.TagNumber(1) - $core.List get options => $_getList(0); - - @$pb.TagNumber(2) - $core.bool get disableColor => $_getBF(1); - @$pb.TagNumber(2) - set disableColor($core.bool v) { $_setBool(1, v); } - @$pb.TagNumber(2) - $core.bool hasDisableColor() => $_has(1); - @$pb.TagNumber(2) - void clearDisableColor() => clearField(2); -} - -class MultiSelect extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MultiSelect', createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) - ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') - ..hasRequiredFields = false - ; - - MultiSelect._() : super(); - factory MultiSelect({ - $core.Iterable? options, - $core.bool? disableColor, - }) { - final _result = create(); - if (options != null) { - _result.options.addAll(options); - } - if (disableColor != null) { - _result.disableColor = disableColor; - } - return _result; - } - factory MultiSelect.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory MultiSelect.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') - MultiSelect clone() => MultiSelect()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - MultiSelect copyWith(void Function(MultiSelect) updates) => super.copyWith((message) => updates(message as MultiSelect)) as MultiSelect; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static MultiSelect create() => MultiSelect._(); - MultiSelect createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static MultiSelect getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static MultiSelect? _defaultInstance; - - @$pb.TagNumber(1) - $core.List get options => $_getList(0); - - @$pb.TagNumber(2) - $core.bool get disableColor => $_getBF(1); - @$pb.TagNumber(2) - set disableColor($core.bool v) { $_setBool(1, v); } - @$pb.TagNumber(2) - $core.bool hasDisableColor() => $_has(1); - @$pb.TagNumber(2) - void clearDisableColor() => clearField(2); -} - -class SelectOption extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOption', 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') ? '' : 'color') - ..hasRequiredFields = false - ; - - SelectOption._() : super(); - factory SelectOption({ - $core.String? id, - $core.String? name, - $core.String? color, - }) { - final _result = create(); - if (id != null) { - _result.id = id; - } - if (name != null) { - _result.name = name; - } - if (color != null) { - _result.color = color; - } - return _result; - } - factory SelectOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SelectOption.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') - SelectOption clone() => SelectOption()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SelectOption copyWith(void Function(SelectOption) updates) => super.copyWith((message) => updates(message as SelectOption)) as SelectOption; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static SelectOption create() => SelectOption._(); - SelectOption createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static SelectOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static SelectOption? _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 color => $_getSZ(2); - @$pb.TagNumber(3) - set color($core.String v) { $_setString(2, v); } - @$pb.TagNumber(3) - $core.bool hasColor() => $_has(2); - @$pb.TagNumber(3) - void clearColor() => clearField(3); -} - -class NumberDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NumberDescription', createEmptyInstance: create) - ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'money', $pb.PbFieldType.OE, defaultOrMaker: FlowyMoney.CNY, valueOf: FlowyMoney.valueOf, enumValues: FlowyMoney.values) - ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scale', $pb.PbFieldType.OU3) - ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'symbol') - ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'signPositive') - ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') - ..hasRequiredFields = false - ; - - NumberDescription._() : super(); - factory NumberDescription({ - FlowyMoney? money, - $core.int? scale, - $core.String? symbol, - $core.bool? signPositive, - $core.String? name, - }) { - final _result = create(); - if (money != null) { - _result.money = money; - } - if (scale != null) { - _result.scale = scale; - } - if (symbol != null) { - _result.symbol = symbol; - } - if (signPositive != null) { - _result.signPositive = signPositive; - } - if (name != null) { - _result.name = name; - } - return _result; - } - factory NumberDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory NumberDescription.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') - NumberDescription clone() => NumberDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - NumberDescription copyWith(void Function(NumberDescription) updates) => super.copyWith((message) => updates(message as NumberDescription)) as NumberDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static NumberDescription create() => NumberDescription._(); - NumberDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static NumberDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static NumberDescription? _defaultInstance; - - @$pb.TagNumber(1) - FlowyMoney get money => $_getN(0); - @$pb.TagNumber(1) - set money(FlowyMoney v) { setField(1, v); } - @$pb.TagNumber(1) - $core.bool hasMoney() => $_has(0); - @$pb.TagNumber(1) - void clearMoney() => clearField(1); - - @$pb.TagNumber(2) - $core.int get scale => $_getIZ(1); - @$pb.TagNumber(2) - set scale($core.int v) { $_setUnsignedInt32(1, v); } - @$pb.TagNumber(2) - $core.bool hasScale() => $_has(1); - @$pb.TagNumber(2) - void clearScale() => clearField(2); - - @$pb.TagNumber(3) - $core.String get symbol => $_getSZ(2); - @$pb.TagNumber(3) - set symbol($core.String v) { $_setString(2, v); } - @$pb.TagNumber(3) - $core.bool hasSymbol() => $_has(2); - @$pb.TagNumber(3) - void clearSymbol() => clearField(3); - - @$pb.TagNumber(4) - $core.bool get signPositive => $_getBF(3); - @$pb.TagNumber(4) - set signPositive($core.bool v) { $_setBool(3, v); } - @$pb.TagNumber(4) - $core.bool hasSignPositive() => $_has(3); - @$pb.TagNumber(4) - void clearSignPositive() => clearField(4); - - @$pb.TagNumber(5) - $core.String get name => $_getSZ(4); - @$pb.TagNumber(5) - set name($core.String v) { $_setString(4, v); } - @$pb.TagNumber(5) - $core.bool hasName() => $_has(4); - @$pb.TagNumber(5) - void clearName() => clearField(5); -} - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbenum.dart deleted file mode 100644 index b6512aafba..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbenum.dart +++ /dev/null @@ -1,62 +0,0 @@ -/// -// Generated code. Do not modify. -// source: cell_data.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 DateFormat extends $pb.ProtobufEnum { - static const DateFormat Local = DateFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Local'); - static const DateFormat US = DateFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'US'); - static const DateFormat ISO = DateFormat._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ISO'); - static const DateFormat Friendly = DateFormat._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Friendly'); - - static const $core.List values = [ - Local, - US, - ISO, - Friendly, - ]; - - static final $core.Map<$core.int, DateFormat> _byValue = $pb.ProtobufEnum.initByValue(values); - static DateFormat? valueOf($core.int value) => _byValue[value]; - - const DateFormat._($core.int v, $core.String n) : super(v, n); -} - -class TimeFormat extends $pb.ProtobufEnum { - static const TimeFormat TwelveHour = TimeFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TwelveHour'); - static const TimeFormat TwentyFourHour = TimeFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TwentyFourHour'); - - static const $core.List values = [ - TwelveHour, - TwentyFourHour, - ]; - - static final $core.Map<$core.int, TimeFormat> _byValue = $pb.ProtobufEnum.initByValue(values); - static TimeFormat? valueOf($core.int value) => _byValue[value]; - - const TimeFormat._($core.int v, $core.String n) : super(v, n); -} - -class FlowyMoney extends $pb.ProtobufEnum { - static const FlowyMoney CNY = FlowyMoney._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CNY'); - static const FlowyMoney EUR = FlowyMoney._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EUR'); - static const FlowyMoney USD = FlowyMoney._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'USD'); - - static const $core.List values = [ - CNY, - EUR, - USD, - ]; - - static final $core.Map<$core.int, FlowyMoney> _byValue = $pb.ProtobufEnum.initByValue(values); - static FlowyMoney? valueOf($core.int value) => _byValue[value]; - - const FlowyMoney._($core.int v, $core.String n) : super(v, n); -} - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbjson.dart deleted file mode 100644 index c2caf59394..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbjson.dart +++ /dev/null @@ -1,125 +0,0 @@ -/// -// Generated code. Do not modify. -// source: cell_data.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 dateFormatDescriptor instead') -const DateFormat$json = const { - '1': 'DateFormat', - '2': const [ - const {'1': 'Local', '2': 0}, - const {'1': 'US', '2': 1}, - const {'1': 'ISO', '2': 2}, - const {'1': 'Friendly', '2': 3}, - ], -}; - -/// Descriptor for `DateFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List dateFormatDescriptor = $convert.base64Decode('CgpEYXRlRm9ybWF0EgkKBUxvY2FsEAASBgoCVVMQARIHCgNJU08QAhIMCghGcmllbmRseRAD'); -@$core.Deprecated('Use timeFormatDescriptor instead') -const TimeFormat$json = const { - '1': 'TimeFormat', - '2': const [ - const {'1': 'TwelveHour', '2': 0}, - const {'1': 'TwentyFourHour', '2': 1}, - ], -}; - -/// Descriptor for `TimeFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List timeFormatDescriptor = $convert.base64Decode('CgpUaW1lRm9ybWF0Eg4KClR3ZWx2ZUhvdXIQABISCg5Ud2VudHlGb3VySG91chAB'); -@$core.Deprecated('Use flowyMoneyDescriptor instead') -const FlowyMoney$json = const { - '1': 'FlowyMoney', - '2': const [ - const {'1': 'CNY', '2': 0}, - const {'1': 'EUR', '2': 1}, - const {'1': 'USD', '2': 2}, - ], -}; - -/// Descriptor for `FlowyMoney`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List flowyMoneyDescriptor = $convert.base64Decode('CgpGbG93eU1vbmV5EgcKA0NOWRAAEgcKA0VVUhABEgcKA1VTRBAC'); -@$core.Deprecated('Use richTextDescriptionDescriptor instead') -const RichTextDescription$json = const { - '1': 'RichTextDescription', - '2': const [ - const {'1': 'format', '3': 1, '4': 1, '5': 9, '10': 'format'}, - ], -}; - -/// Descriptor for `RichTextDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List richTextDescriptionDescriptor = $convert.base64Decode('ChNSaWNoVGV4dERlc2NyaXB0aW9uEhYKBmZvcm1hdBgBIAEoCVIGZm9ybWF0'); -@$core.Deprecated('Use checkboxDescriptionDescriptor instead') -const CheckboxDescription$json = const { - '1': 'CheckboxDescription', - '2': const [ - const {'1': 'is_selected', '3': 1, '4': 1, '5': 8, '10': 'isSelected'}, - ], -}; - -/// Descriptor for `CheckboxDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List checkboxDescriptionDescriptor = $convert.base64Decode('ChNDaGVja2JveERlc2NyaXB0aW9uEh8KC2lzX3NlbGVjdGVkGAEgASgIUgppc1NlbGVjdGVk'); -@$core.Deprecated('Use dateDescriptionDescriptor instead') -const DateDescription$json = const { - '1': 'DateDescription', - '2': const [ - const {'1': 'date_format', '3': 1, '4': 1, '5': 14, '6': '.DateFormat', '10': 'dateFormat'}, - const {'1': 'time_format', '3': 2, '4': 1, '5': 14, '6': '.TimeFormat', '10': 'timeFormat'}, - ], -}; - -/// Descriptor for `DateDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List dateDescriptionDescriptor = $convert.base64Decode('Cg9EYXRlRGVzY3JpcHRpb24SLAoLZGF0ZV9mb3JtYXQYASABKA4yCy5EYXRlRm9ybWF0UgpkYXRlRm9ybWF0EiwKC3RpbWVfZm9ybWF0GAIgASgOMgsuVGltZUZvcm1hdFIKdGltZUZvcm1hdA=='); -@$core.Deprecated('Use singleSelectDescriptor instead') -const SingleSelect$json = const { - '1': 'SingleSelect', - '2': const [ - const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, - const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, - ], -}; - -/// Descriptor for `SingleSelect`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List singleSelectDescriptor = $convert.base64Decode('CgxTaW5nbGVTZWxlY3QSJwoHb3B0aW9ucxgBIAMoCzINLlNlbGVjdE9wdGlvblIHb3B0aW9ucxIjCg1kaXNhYmxlX2NvbG9yGAIgASgIUgxkaXNhYmxlQ29sb3I='); -@$core.Deprecated('Use multiSelectDescriptor instead') -const MultiSelect$json = const { - '1': 'MultiSelect', - '2': const [ - const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, - const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, - ], -}; - -/// Descriptor for `MultiSelect`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List multiSelectDescriptor = $convert.base64Decode('CgtNdWx0aVNlbGVjdBInCgdvcHRpb25zGAEgAygLMg0uU2VsZWN0T3B0aW9uUgdvcHRpb25zEiMKDWRpc2FibGVfY29sb3IYAiABKAhSDGRpc2FibGVDb2xvcg=='); -@$core.Deprecated('Use selectOptionDescriptor instead') -const SelectOption$json = const { - '1': 'SelectOption', - '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': 'color', '3': 3, '4': 1, '5': 9, '10': 'color'}, - ], -}; - -/// Descriptor for `SelectOption`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List selectOptionDescriptor = $convert.base64Decode('CgxTZWxlY3RPcHRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFY29sb3IYAyABKAlSBWNvbG9y'); -@$core.Deprecated('Use numberDescriptionDescriptor instead') -const NumberDescription$json = const { - '1': 'NumberDescription', - '2': const [ - const {'1': 'money', '3': 1, '4': 1, '5': 14, '6': '.FlowyMoney', '10': 'money'}, - const {'1': 'scale', '3': 2, '4': 1, '5': 13, '10': 'scale'}, - const {'1': 'symbol', '3': 3, '4': 1, '5': 9, '10': 'symbol'}, - const {'1': 'sign_positive', '3': 4, '4': 1, '5': 8, '10': 'signPositive'}, - const {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'}, - ], -}; - -/// Descriptor for `NumberDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List numberDescriptionDescriptor = $convert.base64Decode('ChFOdW1iZXJEZXNjcmlwdGlvbhIhCgVtb25leRgBIAEoDjILLkZsb3d5TW9uZXlSBW1vbmV5EhQKBXNjYWxlGAIgASgNUgVzY2FsZRIWCgZzeW1ib2wYAyABKAlSBnN5bWJvbBIjCg1zaWduX3Bvc2l0aXZlGAQgASgIUgxzaWduUG9zaXRpdmUSEgoEbmFtZRgFIAEoCVIEbmFtZQ=='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pb.dart new file mode 100644 index 0000000000..259fcf1422 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pb.dart @@ -0,0 +1,196 @@ +/// +// Generated code. Do not modify. +// source: cell_entities.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; + +class CreateSelectOptionPayload extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateSelectOptionPayload', createEmptyInstance: create) + ..aOM(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cellIdentifier', subBuilder: CellIdentifierPayload.create) + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'optionName') + ..hasRequiredFields = false + ; + + CreateSelectOptionPayload._() : super(); + factory CreateSelectOptionPayload({ + CellIdentifierPayload? cellIdentifier, + $core.String? optionName, + }) { + final _result = create(); + if (cellIdentifier != null) { + _result.cellIdentifier = cellIdentifier; + } + if (optionName != null) { + _result.optionName = optionName; + } + return _result; + } + factory CreateSelectOptionPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateSelectOptionPayload.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') + CreateSelectOptionPayload clone() => CreateSelectOptionPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateSelectOptionPayload copyWith(void Function(CreateSelectOptionPayload) updates) => super.copyWith((message) => updates(message as CreateSelectOptionPayload)) as CreateSelectOptionPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CreateSelectOptionPayload create() => CreateSelectOptionPayload._(); + CreateSelectOptionPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateSelectOptionPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateSelectOptionPayload? _defaultInstance; + + @$pb.TagNumber(1) + CellIdentifierPayload get cellIdentifier => $_getN(0); + @$pb.TagNumber(1) + set cellIdentifier(CellIdentifierPayload v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasCellIdentifier() => $_has(0); + @$pb.TagNumber(1) + void clearCellIdentifier() => clearField(1); + @$pb.TagNumber(1) + CellIdentifierPayload ensureCellIdentifier() => $_ensure(0); + + @$pb.TagNumber(2) + $core.String get optionName => $_getSZ(1); + @$pb.TagNumber(2) + set optionName($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasOptionName() => $_has(1); + @$pb.TagNumber(2) + void clearOptionName() => clearField(2); +} + +class CellIdentifierPayload extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CellIdentifierPayload', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') + ..hasRequiredFields = false + ; + + CellIdentifierPayload._() : super(); + factory CellIdentifierPayload({ + $core.String? gridId, + $core.String? fieldId, + $core.String? rowId, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (rowId != null) { + _result.rowId = rowId; + } + return _result; + } + factory CellIdentifierPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CellIdentifierPayload.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') + CellIdentifierPayload clone() => CellIdentifierPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CellIdentifierPayload copyWith(void Function(CellIdentifierPayload) updates) => super.copyWith((message) => updates(message as CellIdentifierPayload)) as CellIdentifierPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static CellIdentifierPayload create() => CellIdentifierPayload._(); + CellIdentifierPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CellIdentifierPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CellIdentifierPayload? _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.String get fieldId => $_getSZ(1); + @$pb.TagNumber(2) + set fieldId($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasFieldId() => $_has(1); + @$pb.TagNumber(2) + void clearFieldId() => clearField(2); + + @$pb.TagNumber(3) + $core.String get rowId => $_getSZ(2); + @$pb.TagNumber(3) + set rowId($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasRowId() => $_has(2); + @$pb.TagNumber(3) + void clearRowId() => clearField(3); +} + +class SelectOptionName extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOptionName', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..hasRequiredFields = false + ; + + SelectOptionName._() : super(); + factory SelectOptionName({ + $core.String? name, + }) { + final _result = create(); + if (name != null) { + _result.name = name; + } + return _result; + } + factory SelectOptionName.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SelectOptionName.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') + SelectOptionName clone() => SelectOptionName()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SelectOptionName copyWith(void Function(SelectOptionName) updates) => super.copyWith((message) => updates(message as SelectOptionName)) as SelectOptionName; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SelectOptionName create() => SelectOptionName._(); + SelectOptionName createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SelectOptionName getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SelectOptionName? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => clearField(1); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbenum.dart similarity index 87% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbenum.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbenum.dart index 0070b08607..a53c27b1fe 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbenum.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: checkbox_description.proto +// source: cell_entities.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 diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbjson.dart new file mode 100644 index 0000000000..ac0c9add9c --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbjson.dart @@ -0,0 +1,43 @@ +/// +// Generated code. Do not modify. +// source: cell_entities.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 createSelectOptionPayloadDescriptor instead') +const CreateSelectOptionPayload$json = const { + '1': 'CreateSelectOptionPayload', + '2': const [ + const {'1': 'cell_identifier', '3': 1, '4': 1, '5': 11, '6': '.CellIdentifierPayload', '10': 'cellIdentifier'}, + const {'1': 'option_name', '3': 2, '4': 1, '5': 9, '10': 'optionName'}, + ], +}; + +/// Descriptor for `CreateSelectOptionPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List createSelectOptionPayloadDescriptor = $convert.base64Decode('ChlDcmVhdGVTZWxlY3RPcHRpb25QYXlsb2FkEj8KD2NlbGxfaWRlbnRpZmllchgBIAEoCzIWLkNlbGxJZGVudGlmaWVyUGF5bG9hZFIOY2VsbElkZW50aWZpZXISHwoLb3B0aW9uX25hbWUYAiABKAlSCm9wdGlvbk5hbWU='); +@$core.Deprecated('Use cellIdentifierPayloadDescriptor instead') +const CellIdentifierPayload$json = const { + '1': 'CellIdentifierPayload', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'field_id', '3': 2, '4': 1, '5': 9, '10': 'fieldId'}, + const {'1': 'row_id', '3': 3, '4': 1, '5': 9, '10': 'rowId'}, + ], +}; + +/// Descriptor for `CellIdentifierPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List cellIdentifierPayloadDescriptor = $convert.base64Decode('ChVDZWxsSWRlbnRpZmllclBheWxvYWQSFwoHZ3JpZF9pZBgBIAEoCVIGZ3JpZElkEhkKCGZpZWxkX2lkGAIgASgJUgdmaWVsZElkEhUKBnJvd19pZBgDIAEoCVIFcm93SWQ='); +@$core.Deprecated('Use selectOptionNameDescriptor instead') +const SelectOptionName$json = const { + '1': 'SelectOptionName', + '2': const [ + const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'}, + ], +}; + +/// Descriptor for `SelectOptionName`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List selectOptionNameDescriptor = $convert.base64Decode('ChBTZWxlY3RPcHRpb25OYW1lEhIKBG5hbWUYASABKAlSBG5hbWU='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbserver.dart similarity index 83% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbserver.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbserver.dart index bae86fb5d9..a0f185bca8 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_data.pbserver.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/cell_entities.pbserver.dart @@ -1,9 +1,9 @@ /// // Generated code. Do not modify. -// source: cell_data.proto +// source: cell_entities.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 'cell_data.pb.dart'; +export 'cell_entities.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pb.dart similarity index 55% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pb.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pb.dart index 8481b81985..fb907766cf 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pb.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: checkbox_description.proto +// source: checkbox_type_option.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 @@ -9,14 +9,14 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -class CheckboxDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CheckboxDescription', createEmptyInstance: create) +class CheckboxTypeOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CheckboxTypeOption', createEmptyInstance: create) ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isSelected') ..hasRequiredFields = false ; - CheckboxDescription._() : super(); - factory CheckboxDescription({ + CheckboxTypeOption._() : super(); + factory CheckboxTypeOption({ $core.bool? isSelected, }) { final _result = create(); @@ -25,26 +25,26 @@ class CheckboxDescription extends $pb.GeneratedMessage { } return _result; } - factory CheckboxDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory CheckboxDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + factory CheckboxTypeOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CheckboxTypeOption.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') - CheckboxDescription clone() => CheckboxDescription()..mergeFromMessage(this); + CheckboxTypeOption clone() => CheckboxTypeOption()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - CheckboxDescription copyWith(void Function(CheckboxDescription) updates) => super.copyWith((message) => updates(message as CheckboxDescription)) as CheckboxDescription; // ignore: deprecated_member_use + CheckboxTypeOption copyWith(void Function(CheckboxTypeOption) updates) => super.copyWith((message) => updates(message as CheckboxTypeOption)) as CheckboxTypeOption; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static CheckboxDescription create() => CheckboxDescription._(); - CheckboxDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static CheckboxTypeOption create() => CheckboxTypeOption._(); + CheckboxTypeOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static CheckboxDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static CheckboxDescription? _defaultInstance; + static CheckboxTypeOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CheckboxTypeOption? _defaultInstance; @$pb.TagNumber(1) $core.bool get isSelected => $_getBF(0); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbenum.dart similarity index 87% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbenum.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbenum.dart index 6688bc34c9..7c03d6985e 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbenum.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: selection_description.proto +// source: checkbox_type_option.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 diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbjson.dart similarity index 55% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbjson.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbjson.dart index 6295b27033..33c4627985 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbjson.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: checkbox_description.proto +// source: checkbox_type_option.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 @@ -8,13 +8,13 @@ import 'dart:core' as $core; import 'dart:convert' as $convert; import 'dart:typed_data' as $typed_data; -@$core.Deprecated('Use checkboxDescriptionDescriptor instead') -const CheckboxDescription$json = const { - '1': 'CheckboxDescription', +@$core.Deprecated('Use checkboxTypeOptionDescriptor instead') +const CheckboxTypeOption$json = const { + '1': 'CheckboxTypeOption', '2': const [ const {'1': 'is_selected', '3': 1, '4': 1, '5': 8, '10': 'isSelected'}, ], }; -/// Descriptor for `CheckboxDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List checkboxDescriptionDescriptor = $convert.base64Decode('ChNDaGVja2JveERlc2NyaXB0aW9uEh8KC2lzX3NlbGVjdGVkGAEgASgIUgppc1NlbGVjdGVk'); +/// Descriptor for `CheckboxTypeOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List checkboxTypeOptionDescriptor = $convert.base64Decode('ChJDaGVja2JveFR5cGVPcHRpb24SHwoLaXNfc2VsZWN0ZWQYASABKAhSCmlzU2VsZWN0ZWQ='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbserver.dart similarity index 80% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbserver.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbserver.dart index 166969b429..5424623115 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_description.pbserver.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/checkbox_type_option.pbserver.dart @@ -1,9 +1,9 @@ /// // Generated code. Do not modify. -// source: checkbox_description.proto +// source: checkbox_type_option.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 'checkbox_description.pb.dart'; +export 'checkbox_type_option.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbenum.dart index f68b10f292..4331fef2a7 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbenum.dart @@ -11,17 +11,21 @@ import 'package:protobuf/protobuf.dart' as $pb; class GridNotification extends $pb.ProtobufEnum { static const GridNotification Unknown = GridNotification._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Unknown'); - static const GridNotification GridDidUpdateBlock = GridNotification._(10, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridDidUpdateBlock'); - static const GridNotification GridDidCreateBlock = GridNotification._(11, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridDidCreateBlock'); - static const GridNotification GridDidUpdateCells = GridNotification._(20, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridDidUpdateCells'); - static const GridNotification GridDidUpdateFields = GridNotification._(30, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GridDidUpdateFields'); + static const GridNotification DidCreateBlock = GridNotification._(11, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DidCreateBlock'); + static const GridNotification DidUpdateBlock = GridNotification._(20, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DidUpdateBlock'); + static const GridNotification DidUpdateRow = GridNotification._(30, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DidUpdateRow'); + static const GridNotification DidUpdateCell = GridNotification._(31, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DidUpdateCell'); + static const GridNotification DidUpdateGrid = GridNotification._(40, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DidUpdateGrid'); + static const GridNotification DidUpdateField = GridNotification._(41, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DidUpdateField'); static const $core.List values = [ Unknown, - GridDidUpdateBlock, - GridDidCreateBlock, - GridDidUpdateCells, - GridDidUpdateFields, + DidCreateBlock, + DidUpdateBlock, + DidUpdateRow, + DidUpdateCell, + DidUpdateGrid, + DidUpdateField, ]; static final $core.Map<$core.int, GridNotification> _byValue = $pb.ProtobufEnum.initByValue(values); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbjson.dart index b266e63e09..ed6bbdc2d4 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/dart_notification.pbjson.dart @@ -13,12 +13,14 @@ const GridNotification$json = const { '1': 'GridNotification', '2': const [ const {'1': 'Unknown', '2': 0}, - const {'1': 'GridDidUpdateBlock', '2': 10}, - const {'1': 'GridDidCreateBlock', '2': 11}, - const {'1': 'GridDidUpdateCells', '2': 20}, - const {'1': 'GridDidUpdateFields', '2': 30}, + const {'1': 'DidCreateBlock', '2': 11}, + const {'1': 'DidUpdateBlock', '2': 20}, + const {'1': 'DidUpdateRow', '2': 30}, + const {'1': 'DidUpdateCell', '2': 31}, + const {'1': 'DidUpdateGrid', '2': 40}, + const {'1': 'DidUpdateField', '2': 41}, ], }; /// Descriptor for `GridNotification`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List gridNotificationDescriptor = $convert.base64Decode('ChBHcmlkTm90aWZpY2F0aW9uEgsKB1Vua25vd24QABIWChJHcmlkRGlkVXBkYXRlQmxvY2sQChIWChJHcmlkRGlkQ3JlYXRlQmxvY2sQCxIWChJHcmlkRGlkVXBkYXRlQ2VsbHMQFBIXChNHcmlkRGlkVXBkYXRlRmllbGRzEB4='); +final $typed_data.Uint8List gridNotificationDescriptor = $convert.base64Decode('ChBHcmlkTm90aWZpY2F0aW9uEgsKB1Vua25vd24QABISCg5EaWRDcmVhdGVCbG9jaxALEhIKDkRpZFVwZGF0ZUJsb2NrEBQSEAoMRGlkVXBkYXRlUm93EB4SEQoNRGlkVXBkYXRlQ2VsbBAfEhEKDURpZFVwZGF0ZUdyaWQQKBISCg5EaWRVcGRhdGVGaWVsZBAp'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pb.dart similarity index 65% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pb.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pb.dart index a70bff6f3c..85c5e55111 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pb.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: date_description.proto +// source: date_type_option.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 @@ -9,19 +9,19 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import 'date_description.pbenum.dart'; +import 'date_type_option.pbenum.dart'; -export 'date_description.pbenum.dart'; +export 'date_type_option.pbenum.dart'; -class DateDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DateDescription', createEmptyInstance: create) +class DateTypeOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DateTypeOption', createEmptyInstance: create) ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dateFormat', $pb.PbFieldType.OE, defaultOrMaker: DateFormat.Local, valueOf: DateFormat.valueOf, enumValues: DateFormat.values) ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'timeFormat', $pb.PbFieldType.OE, defaultOrMaker: TimeFormat.TwelveHour, valueOf: TimeFormat.valueOf, enumValues: TimeFormat.values) ..hasRequiredFields = false ; - DateDescription._() : super(); - factory DateDescription({ + DateTypeOption._() : super(); + factory DateTypeOption({ DateFormat? dateFormat, TimeFormat? timeFormat, }) { @@ -34,26 +34,26 @@ class DateDescription extends $pb.GeneratedMessage { } return _result; } - factory DateDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory DateDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + factory DateTypeOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory DateTypeOption.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') - DateDescription clone() => DateDescription()..mergeFromMessage(this); + DateTypeOption clone() => DateTypeOption()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - DateDescription copyWith(void Function(DateDescription) updates) => super.copyWith((message) => updates(message as DateDescription)) as DateDescription; // ignore: deprecated_member_use + DateTypeOption copyWith(void Function(DateTypeOption) updates) => super.copyWith((message) => updates(message as DateTypeOption)) as DateTypeOption; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static DateDescription create() => DateDescription._(); - DateDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static DateTypeOption create() => DateTypeOption._(); + DateTypeOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static DateDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static DateDescription? _defaultInstance; + static DateTypeOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static DateTypeOption? _defaultInstance; @$pb.TagNumber(1) DateFormat get dateFormat => $_getN(0); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbenum.dart similarity index 98% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbenum.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbenum.dart index 93ea01d9be..63255cb1ab 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbenum.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: date_description.proto +// source: date_type_option.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 diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbjson.dart similarity index 76% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbjson.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbjson.dart index 841db39005..9acf67241b 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbjson.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: date_description.proto +// source: date_type_option.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 @@ -32,14 +32,14 @@ const TimeFormat$json = const { /// Descriptor for `TimeFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. final $typed_data.Uint8List timeFormatDescriptor = $convert.base64Decode('CgpUaW1lRm9ybWF0Eg4KClR3ZWx2ZUhvdXIQABISCg5Ud2VudHlGb3VySG91chAB'); -@$core.Deprecated('Use dateDescriptionDescriptor instead') -const DateDescription$json = const { - '1': 'DateDescription', +@$core.Deprecated('Use dateTypeOptionDescriptor instead') +const DateTypeOption$json = const { + '1': 'DateTypeOption', '2': const [ const {'1': 'date_format', '3': 1, '4': 1, '5': 14, '6': '.DateFormat', '10': 'dateFormat'}, const {'1': 'time_format', '3': 2, '4': 1, '5': 14, '6': '.TimeFormat', '10': 'timeFormat'}, ], }; -/// Descriptor for `DateDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List dateDescriptionDescriptor = $convert.base64Decode('Cg9EYXRlRGVzY3JpcHRpb24SLAoLZGF0ZV9mb3JtYXQYASABKA4yCy5EYXRlRm9ybWF0UgpkYXRlRm9ybWF0EiwKC3RpbWVfZm9ybWF0GAIgASgOMgsuVGltZUZvcm1hdFIKdGltZUZvcm1hdA=='); +/// Descriptor for `DateTypeOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List dateTypeOptionDescriptor = $convert.base64Decode('Cg5EYXRlVHlwZU9wdGlvbhIsCgtkYXRlX2Zvcm1hdBgBIAEoDjILLkRhdGVGb3JtYXRSCmRhdGVGb3JtYXQSLAoLdGltZV9mb3JtYXQYAiABKA4yCy5UaW1lRm9ybWF0Ugp0aW1lRm9ybWF0'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbserver.dart similarity index 81% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbserver.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbserver.dart index dd4ff2c3c7..b95719d206 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_description.pbserver.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/date_type_option.pbserver.dart @@ -1,9 +1,9 @@ /// // Generated code. Do not modify. -// source: date_description.proto +// source: date_type_option.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 'date_description.pb.dart'; +export 'date_type_option.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbenum.dart index 91a3861076..37032ec41b 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbenum.dart @@ -13,17 +13,39 @@ class GridEvent extends $pb.ProtobufEnum { static const GridEvent GetGridData = GridEvent._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetGridData'); static const GridEvent GetGridBlocks = GridEvent._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetGridBlocks'); static const GridEvent GetFields = GridEvent._(10, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetFields'); - static const GridEvent CreateRow = GridEvent._(11, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CreateRow'); - static const GridEvent GetRow = GridEvent._(12, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetRow'); - static const GridEvent UpdateCell = GridEvent._(20, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UpdateCell'); + static const GridEvent UpdateField = GridEvent._(11, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UpdateField'); + static const GridEvent CreateField = GridEvent._(12, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CreateField'); + static const GridEvent DeleteField = GridEvent._(13, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DeleteField'); + static const GridEvent SwitchToField = GridEvent._(14, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SwitchToField'); + static const GridEvent DuplicateField = GridEvent._(15, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DuplicateField'); + static const GridEvent GetEditFieldContext = GridEvent._(16, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetEditFieldContext'); + static const GridEvent NewSelectOption = GridEvent._(30, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'NewSelectOption'); + static const GridEvent GetSelectOptionContext = GridEvent._(31, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetSelectOptionContext'); + static const GridEvent ApplySelectOptionChangeset = GridEvent._(32, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ApplySelectOptionChangeset'); + static const GridEvent CreateRow = GridEvent._(50, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CreateRow'); + static const GridEvent GetRow = GridEvent._(51, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetRow'); + static const GridEvent GetCell = GridEvent._(70, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'GetCell'); + static const GridEvent UpdateCell = GridEvent._(71, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UpdateCell'); + static const GridEvent ApplySelectOptionCellChangeset = GridEvent._(72, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ApplySelectOptionCellChangeset'); static const $core.List values = [ GetGridData, GetGridBlocks, GetFields, + UpdateField, + CreateField, + DeleteField, + SwitchToField, + DuplicateField, + GetEditFieldContext, + NewSelectOption, + GetSelectOptionContext, + ApplySelectOptionChangeset, CreateRow, GetRow, + GetCell, UpdateCell, + ApplySelectOptionCellChangeset, ]; static final $core.Map<$core.int, GridEvent> _byValue = $pb.ProtobufEnum.initByValue(values); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbjson.dart index c203b10c75..bc4b838bca 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/event_map.pbjson.dart @@ -15,11 +15,22 @@ const GridEvent$json = const { const {'1': 'GetGridData', '2': 0}, const {'1': 'GetGridBlocks', '2': 1}, const {'1': 'GetFields', '2': 10}, - const {'1': 'CreateRow', '2': 11}, - const {'1': 'GetRow', '2': 12}, - const {'1': 'UpdateCell', '2': 20}, + const {'1': 'UpdateField', '2': 11}, + const {'1': 'CreateField', '2': 12}, + const {'1': 'DeleteField', '2': 13}, + const {'1': 'SwitchToField', '2': 14}, + const {'1': 'DuplicateField', '2': 15}, + const {'1': 'GetEditFieldContext', '2': 16}, + const {'1': 'NewSelectOption', '2': 30}, + const {'1': 'GetSelectOptionContext', '2': 31}, + const {'1': 'ApplySelectOptionChangeset', '2': 32}, + const {'1': 'CreateRow', '2': 50}, + const {'1': 'GetRow', '2': 51}, + const {'1': 'GetCell', '2': 70}, + const {'1': 'UpdateCell', '2': 71}, + const {'1': 'ApplySelectOptionCellChangeset', '2': 72}, ], }; /// Descriptor for `GridEvent`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List gridEventDescriptor = $convert.base64Decode('CglHcmlkRXZlbnQSDwoLR2V0R3JpZERhdGEQABIRCg1HZXRHcmlkQmxvY2tzEAESDQoJR2V0RmllbGRzEAoSDQoJQ3JlYXRlUm93EAsSCgoGR2V0Um93EAwSDgoKVXBkYXRlQ2VsbBAU'); +final $typed_data.Uint8List gridEventDescriptor = $convert.base64Decode('CglHcmlkRXZlbnQSDwoLR2V0R3JpZERhdGEQABIRCg1HZXRHcmlkQmxvY2tzEAESDQoJR2V0RmllbGRzEAoSDwoLVXBkYXRlRmllbGQQCxIPCgtDcmVhdGVGaWVsZBAMEg8KC0RlbGV0ZUZpZWxkEA0SEQoNU3dpdGNoVG9GaWVsZBAOEhIKDkR1cGxpY2F0ZUZpZWxkEA8SFwoTR2V0RWRpdEZpZWxkQ29udGV4dBAQEhMKD05ld1NlbGVjdE9wdGlvbhAeEhoKFkdldFNlbGVjdE9wdGlvbkNvbnRleHQQHxIeChpBcHBseVNlbGVjdE9wdGlvbkNoYW5nZXNldBAgEg0KCUNyZWF0ZVJvdxAyEgoKBkdldFJvdxAzEgsKB0dldENlbGwQRhIOCgpVcGRhdGVDZWxsEEcSIgoeQXBwbHlTZWxlY3RPcHRpb25DZWxsQ2hhbmdlc2V0EEg='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pb.dart new file mode 100644 index 0000000000..a99c401bf2 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pb.dart @@ -0,0 +1,72 @@ +/// +// Generated code. Do not modify. +// source: field_entities.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; + +class FieldIdentifierPayload extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FieldIdentifierPayload', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fieldId') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..hasRequiredFields = false + ; + + FieldIdentifierPayload._() : super(); + factory FieldIdentifierPayload({ + $core.String? fieldId, + $core.String? gridId, + }) { + final _result = create(); + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (gridId != null) { + _result.gridId = gridId; + } + return _result; + } + factory FieldIdentifierPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory FieldIdentifierPayload.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') + FieldIdentifierPayload clone() => FieldIdentifierPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + FieldIdentifierPayload copyWith(void Function(FieldIdentifierPayload) updates) => super.copyWith((message) => updates(message as FieldIdentifierPayload)) as FieldIdentifierPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static FieldIdentifierPayload create() => FieldIdentifierPayload._(); + FieldIdentifierPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static FieldIdentifierPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static FieldIdentifierPayload? _defaultInstance; + + @$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); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbenum.dart similarity index 76% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pb.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbenum.dart index f2ec97799a..e9ca968924 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbenum.dart @@ -1,11 +1,7 @@ /// // Generated code. Do not modify. -// source: errors.proto +// source: field_entities.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; - -export 'errors.pbenum.dart'; - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbjson.dart new file mode 100644 index 0000000000..e8b768c21a --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbjson.dart @@ -0,0 +1,21 @@ +/// +// Generated code. Do not modify. +// source: field_entities.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 fieldIdentifierPayloadDescriptor instead') +const FieldIdentifierPayload$json = const { + '1': 'FieldIdentifierPayload', + '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'}, + ], +}; + +/// Descriptor for `FieldIdentifierPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List fieldIdentifierPayloadDescriptor = $convert.base64Decode('ChZGaWVsZElkZW50aWZpZXJQYXlsb2FkEhkKCGZpZWxkX2lkGAEgASgJUgdmaWVsZElkEhcKB2dyaWRfaWQYAiABKAlSBmdyaWRJZA=='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbserver.dart similarity index 82% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbserver.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbserver.dart index b46de00bf5..9c99be4d1d 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbserver.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/field_entities.pbserver.dart @@ -1,9 +1,9 @@ /// // Generated code. Do not modify. -// source: type_options.proto +// source: field_entities.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 'type_options.pb.dart'; +export 'field_entities.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pb.dart similarity index 73% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pb.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pb.dart index 19064fbfd1..54f4d9546f 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pb.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: number_description.proto +// source: number_type_option.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 @@ -9,12 +9,12 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import 'number_description.pbenum.dart'; +import 'number_type_option.pbenum.dart'; -export 'number_description.pbenum.dart'; +export 'number_type_option.pbenum.dart'; -class NumberDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NumberDescription', createEmptyInstance: create) +class NumberTypeOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NumberTypeOption', createEmptyInstance: create) ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'format', $pb.PbFieldType.OE, defaultOrMaker: NumberFormat.Number, valueOf: NumberFormat.valueOf, enumValues: NumberFormat.values) ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scale', $pb.PbFieldType.OU3) ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'symbol') @@ -23,8 +23,8 @@ class NumberDescription extends $pb.GeneratedMessage { ..hasRequiredFields = false ; - NumberDescription._() : super(); - factory NumberDescription({ + NumberTypeOption._() : super(); + factory NumberTypeOption({ NumberFormat? format, $core.int? scale, $core.String? symbol, @@ -49,26 +49,26 @@ class NumberDescription extends $pb.GeneratedMessage { } return _result; } - factory NumberDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory NumberDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + factory NumberTypeOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NumberTypeOption.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') - NumberDescription clone() => NumberDescription()..mergeFromMessage(this); + NumberTypeOption clone() => NumberTypeOption()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - NumberDescription copyWith(void Function(NumberDescription) updates) => super.copyWith((message) => updates(message as NumberDescription)) as NumberDescription; // ignore: deprecated_member_use + NumberTypeOption copyWith(void Function(NumberTypeOption) updates) => super.copyWith((message) => updates(message as NumberTypeOption)) as NumberTypeOption; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static NumberDescription create() => NumberDescription._(); - NumberDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static NumberTypeOption create() => NumberTypeOption._(); + NumberTypeOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static NumberDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static NumberDescription? _defaultInstance; + static NumberTypeOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NumberTypeOption? _defaultInstance; @$pb.TagNumber(1) NumberFormat get format => $_getN(0); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbenum.dart similarity index 97% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbenum.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbenum.dart index f5c3d38628..5e486443c6 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbenum.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbenum.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: number_description.proto +// source: number_type_option.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 diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbjson.dart similarity index 70% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbjson.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbjson.dart index ff1b3dc40f..d3c593d40e 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbjson.dart @@ -1,6 +1,6 @@ /// // Generated code. Do not modify. -// source: number_description.proto +// source: number_type_option.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 @@ -21,9 +21,9 @@ const NumberFormat$json = const { /// Descriptor for `NumberFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. final $typed_data.Uint8List numberFormatDescriptor = $convert.base64Decode('CgxOdW1iZXJGb3JtYXQSCgoGTnVtYmVyEAASBwoDVVNEEAESBwoDQ05ZEAISBwoDRVVSEAM='); -@$core.Deprecated('Use numberDescriptionDescriptor instead') -const NumberDescription$json = const { - '1': 'NumberDescription', +@$core.Deprecated('Use numberTypeOptionDescriptor instead') +const NumberTypeOption$json = const { + '1': 'NumberTypeOption', '2': const [ const {'1': 'format', '3': 1, '4': 1, '5': 14, '6': '.NumberFormat', '10': 'format'}, const {'1': 'scale', '3': 2, '4': 1, '5': 13, '10': 'scale'}, @@ -33,5 +33,5 @@ const NumberDescription$json = const { ], }; -/// Descriptor for `NumberDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List numberDescriptionDescriptor = $convert.base64Decode('ChFOdW1iZXJEZXNjcmlwdGlvbhIlCgZmb3JtYXQYASABKA4yDS5OdW1iZXJGb3JtYXRSBmZvcm1hdBIUCgVzY2FsZRgCIAEoDVIFc2NhbGUSFgoGc3ltYm9sGAMgASgJUgZzeW1ib2wSIwoNc2lnbl9wb3NpdGl2ZRgEIAEoCFIMc2lnblBvc2l0aXZlEhIKBG5hbWUYBSABKAlSBG5hbWU='); +/// Descriptor for `NumberTypeOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List numberTypeOptionDescriptor = $convert.base64Decode('ChBOdW1iZXJUeXBlT3B0aW9uEiUKBmZvcm1hdBgBIAEoDjINLk51bWJlckZvcm1hdFIGZm9ybWF0EhQKBXNjYWxlGAIgASgNUgVzY2FsZRIWCgZzeW1ib2wYAyABKAlSBnN5bWJvbBIjCg1zaWduX3Bvc2l0aXZlGAQgASgIUgxzaWduUG9zaXRpdmUSEgoEbmFtZRgFIAEoCVIEbmFtZQ=='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbserver.dart similarity index 80% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbserver.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbserver.dart index 58225a92b7..107c3a1d86 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_description.pbserver.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/number_type_option.pbserver.dart @@ -1,9 +1,9 @@ /// // Generated code. Do not modify. -// source: number_description.proto +// source: number_type_option.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 'number_description.pb.dart'; +export 'number_type_option.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/protobuf.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/protobuf.dart index daefe6a170..af6583c106 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/protobuf.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/protobuf.dart @@ -1,8 +1,11 @@ // Auto-generated, do not edit -export './date_description.pb.dart'; -export './text_description.pb.dart'; +export './field_entities.pb.dart'; +export './number_type_option.pb.dart'; export './dart_notification.pb.dart'; -export './checkbox_description.pb.dart'; -export './selection_description.pb.dart'; +export './selection_type_option.pb.dart'; +export './row_entities.pb.dart'; +export './cell_entities.pb.dart'; +export './checkbox_type_option.pb.dart'; export './event_map.pb.dart'; -export './number_description.pb.dart'; +export './text_type_option.pb.dart'; +export './date_type_option.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pb.dart new file mode 100644 index 0000000000..8f8c278b12 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pb.dart @@ -0,0 +1,72 @@ +/// +// Generated code. Do not modify. +// source: row_entities.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; + +class RowIdentifierPayload extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RowIdentifierPayload', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gridId') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rowId') + ..hasRequiredFields = false + ; + + RowIdentifierPayload._() : super(); + factory RowIdentifierPayload({ + $core.String? gridId, + $core.String? rowId, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (rowId != null) { + _result.rowId = rowId; + } + return _result; + } + factory RowIdentifierPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RowIdentifierPayload.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') + RowIdentifierPayload clone() => RowIdentifierPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RowIdentifierPayload copyWith(void Function(RowIdentifierPayload) updates) => super.copyWith((message) => updates(message as RowIdentifierPayload)) as RowIdentifierPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static RowIdentifierPayload create() => RowIdentifierPayload._(); + RowIdentifierPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RowIdentifierPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RowIdentifierPayload? _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(3) + $core.String get rowId => $_getSZ(1); + @$pb.TagNumber(3) + set rowId($core.String v) { $_setString(1, v); } + @$pb.TagNumber(3) + $core.bool hasRowId() => $_has(1); + @$pb.TagNumber(3) + void clearRowId() => clearField(3); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbenum.dart new file mode 100644 index 0000000000..a53bd30bf7 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbenum.dart @@ -0,0 +1,7 @@ +/// +// Generated code. Do not modify. +// source: row_entities.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 + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbjson.dart new file mode 100644 index 0000000000..b5dd44d360 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbjson.dart @@ -0,0 +1,21 @@ +/// +// Generated code. Do not modify. +// source: row_entities.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 rowIdentifierPayloadDescriptor instead') +const RowIdentifierPayload$json = const { + '1': 'RowIdentifierPayload', + '2': const [ + const {'1': 'grid_id', '3': 1, '4': 1, '5': 9, '10': 'gridId'}, + const {'1': 'row_id', '3': 3, '4': 1, '5': 9, '10': 'rowId'}, + ], +}; + +/// Descriptor for `RowIdentifierPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List rowIdentifierPayloadDescriptor = $convert.base64Decode('ChRSb3dJZGVudGlmaWVyUGF5bG9hZBIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSFQoGcm93X2lkGAMgASgJUgVyb3dJZA=='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbserver.dart similarity index 83% rename from frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbserver.dart rename to frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbserver.dart index 18b02b9216..905505060a 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/errors.pbserver.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/row_entities.pbserver.dart @@ -1,9 +1,9 @@ /// // Generated code. Do not modify. -// source: errors.proto +// source: row_entities.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 'errors.pb.dart'; +export 'row_entities.pb.dart'; diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pb.dart deleted file mode 100644 index 27b2fa8431..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pb.dart +++ /dev/null @@ -1,196 +0,0 @@ -/// -// Generated code. Do not modify. -// source: selection_description.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; - -class SingleSelectDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SingleSelectDescription', createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) - ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') - ..hasRequiredFields = false - ; - - SingleSelectDescription._() : super(); - factory SingleSelectDescription({ - $core.Iterable? options, - $core.bool? disableColor, - }) { - final _result = create(); - if (options != null) { - _result.options.addAll(options); - } - if (disableColor != null) { - _result.disableColor = disableColor; - } - return _result; - } - factory SingleSelectDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SingleSelectDescription.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') - SingleSelectDescription clone() => SingleSelectDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SingleSelectDescription copyWith(void Function(SingleSelectDescription) updates) => super.copyWith((message) => updates(message as SingleSelectDescription)) as SingleSelectDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static SingleSelectDescription create() => SingleSelectDescription._(); - SingleSelectDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static SingleSelectDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static SingleSelectDescription? _defaultInstance; - - @$pb.TagNumber(1) - $core.List get options => $_getList(0); - - @$pb.TagNumber(2) - $core.bool get disableColor => $_getBF(1); - @$pb.TagNumber(2) - set disableColor($core.bool v) { $_setBool(1, v); } - @$pb.TagNumber(2) - $core.bool hasDisableColor() => $_has(1); - @$pb.TagNumber(2) - void clearDisableColor() => clearField(2); -} - -class MultiSelectDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MultiSelectDescription', createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) - ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') - ..hasRequiredFields = false - ; - - MultiSelectDescription._() : super(); - factory MultiSelectDescription({ - $core.Iterable? options, - $core.bool? disableColor, - }) { - final _result = create(); - if (options != null) { - _result.options.addAll(options); - } - if (disableColor != null) { - _result.disableColor = disableColor; - } - return _result; - } - factory MultiSelectDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory MultiSelectDescription.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') - MultiSelectDescription clone() => MultiSelectDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - MultiSelectDescription copyWith(void Function(MultiSelectDescription) updates) => super.copyWith((message) => updates(message as MultiSelectDescription)) as MultiSelectDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static MultiSelectDescription create() => MultiSelectDescription._(); - MultiSelectDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static MultiSelectDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static MultiSelectDescription? _defaultInstance; - - @$pb.TagNumber(1) - $core.List get options => $_getList(0); - - @$pb.TagNumber(2) - $core.bool get disableColor => $_getBF(1); - @$pb.TagNumber(2) - set disableColor($core.bool v) { $_setBool(1, v); } - @$pb.TagNumber(2) - $core.bool hasDisableColor() => $_has(1); - @$pb.TagNumber(2) - void clearDisableColor() => clearField(2); -} - -class SelectOption extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOption', 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') ? '' : 'color') - ..hasRequiredFields = false - ; - - SelectOption._() : super(); - factory SelectOption({ - $core.String? id, - $core.String? name, - $core.String? color, - }) { - final _result = create(); - if (id != null) { - _result.id = id; - } - if (name != null) { - _result.name = name; - } - if (color != null) { - _result.color = color; - } - return _result; - } - factory SelectOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SelectOption.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') - SelectOption clone() => SelectOption()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SelectOption copyWith(void Function(SelectOption) updates) => super.copyWith((message) => updates(message as SelectOption)) as SelectOption; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static SelectOption create() => SelectOption._(); - SelectOption createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static SelectOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static SelectOption? _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 color => $_getSZ(2); - @$pb.TagNumber(3) - set color($core.String v) { $_setString(2, v); } - @$pb.TagNumber(3) - $core.bool hasColor() => $_has(2); - @$pb.TagNumber(3) - void clearColor() => clearField(3); -} - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbjson.dart deleted file mode 100644 index 6bb0c9e4db..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbjson.dart +++ /dev/null @@ -1,44 +0,0 @@ -/// -// Generated code. Do not modify. -// source: selection_description.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 singleSelectDescriptionDescriptor instead') -const SingleSelectDescription$json = const { - '1': 'SingleSelectDescription', - '2': const [ - const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, - const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, - ], -}; - -/// Descriptor for `SingleSelectDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List singleSelectDescriptionDescriptor = $convert.base64Decode('ChdTaW5nbGVTZWxlY3REZXNjcmlwdGlvbhInCgdvcHRpb25zGAEgAygLMg0uU2VsZWN0T3B0aW9uUgdvcHRpb25zEiMKDWRpc2FibGVfY29sb3IYAiABKAhSDGRpc2FibGVDb2xvcg=='); -@$core.Deprecated('Use multiSelectDescriptionDescriptor instead') -const MultiSelectDescription$json = const { - '1': 'MultiSelectDescription', - '2': const [ - const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, - const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, - ], -}; - -/// Descriptor for `MultiSelectDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List multiSelectDescriptionDescriptor = $convert.base64Decode('ChZNdWx0aVNlbGVjdERlc2NyaXB0aW9uEicKB29wdGlvbnMYASADKAsyDS5TZWxlY3RPcHRpb25SB29wdGlvbnMSIwoNZGlzYWJsZV9jb2xvchgCIAEoCFIMZGlzYWJsZUNvbG9y'); -@$core.Deprecated('Use selectOptionDescriptor instead') -const SelectOption$json = const { - '1': 'SelectOption', - '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': 'color', '3': 3, '4': 1, '5': 9, '10': 'color'}, - ], -}; - -/// Descriptor for `SelectOption`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List selectOptionDescriptor = $convert.base64Decode('CgxTZWxlY3RPcHRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFY29sb3IYAyABKAlSBWNvbG9y'); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbserver.dart deleted file mode 100644 index f55cbba1ec..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_description.pbserver.dart +++ /dev/null @@ -1,9 +0,0 @@ -/// -// Generated code. Do not modify. -// source: selection_description.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 'selection_description.pb.dart'; - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pb.dart new file mode 100644 index 0000000000..5b2576d7eb --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pb.dart @@ -0,0 +1,487 @@ +/// +// Generated code. Do not modify. +// source: selection_type_option.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 'cell_entities.pb.dart' as $0; + +import 'selection_type_option.pbenum.dart'; + +export 'selection_type_option.pbenum.dart'; + +class SingleSelectTypeOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SingleSelectTypeOption', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) + ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') + ..hasRequiredFields = false + ; + + SingleSelectTypeOption._() : super(); + factory SingleSelectTypeOption({ + $core.Iterable? options, + $core.bool? disableColor, + }) { + final _result = create(); + if (options != null) { + _result.options.addAll(options); + } + if (disableColor != null) { + _result.disableColor = disableColor; + } + return _result; + } + factory SingleSelectTypeOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SingleSelectTypeOption.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') + SingleSelectTypeOption clone() => SingleSelectTypeOption()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SingleSelectTypeOption copyWith(void Function(SingleSelectTypeOption) updates) => super.copyWith((message) => updates(message as SingleSelectTypeOption)) as SingleSelectTypeOption; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SingleSelectTypeOption create() => SingleSelectTypeOption._(); + SingleSelectTypeOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SingleSelectTypeOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SingleSelectTypeOption? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get options => $_getList(0); + + @$pb.TagNumber(2) + $core.bool get disableColor => $_getBF(1); + @$pb.TagNumber(2) + set disableColor($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasDisableColor() => $_has(1); + @$pb.TagNumber(2) + void clearDisableColor() => clearField(2); +} + +class MultiSelectTypeOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MultiSelectTypeOption', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) + ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') + ..hasRequiredFields = false + ; + + MultiSelectTypeOption._() : super(); + factory MultiSelectTypeOption({ + $core.Iterable? options, + $core.bool? disableColor, + }) { + final _result = create(); + if (options != null) { + _result.options.addAll(options); + } + if (disableColor != null) { + _result.disableColor = disableColor; + } + return _result; + } + factory MultiSelectTypeOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory MultiSelectTypeOption.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') + MultiSelectTypeOption clone() => MultiSelectTypeOption()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + MultiSelectTypeOption copyWith(void Function(MultiSelectTypeOption) updates) => super.copyWith((message) => updates(message as MultiSelectTypeOption)) as MultiSelectTypeOption; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static MultiSelectTypeOption create() => MultiSelectTypeOption._(); + MultiSelectTypeOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static MultiSelectTypeOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static MultiSelectTypeOption? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get options => $_getList(0); + + @$pb.TagNumber(2) + $core.bool get disableColor => $_getBF(1); + @$pb.TagNumber(2) + set disableColor($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasDisableColor() => $_has(1); + @$pb.TagNumber(2) + void clearDisableColor() => clearField(2); +} + +class SelectOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOption', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..e(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'color', $pb.PbFieldType.OE, defaultOrMaker: SelectOptionColor.Purple, valueOf: SelectOptionColor.valueOf, enumValues: SelectOptionColor.values) + ..hasRequiredFields = false + ; + + SelectOption._() : super(); + factory SelectOption({ + $core.String? id, + $core.String? name, + SelectOptionColor? color, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (name != null) { + _result.name = name; + } + if (color != null) { + _result.color = color; + } + return _result; + } + factory SelectOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SelectOption.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') + SelectOption clone() => SelectOption()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SelectOption copyWith(void Function(SelectOption) updates) => super.copyWith((message) => updates(message as SelectOption)) as SelectOption; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SelectOption create() => SelectOption._(); + SelectOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SelectOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SelectOption? _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) + SelectOptionColor get color => $_getN(2); + @$pb.TagNumber(3) + set color(SelectOptionColor v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasColor() => $_has(2); + @$pb.TagNumber(3) + void clearColor() => clearField(3); +} + +enum SelectOptionChangesetPayload_OneOfInsertOption { + insertOption, + notSet +} + +enum SelectOptionChangesetPayload_OneOfDeleteOption { + deleteOption, + notSet +} + +class SelectOptionChangesetPayload extends $pb.GeneratedMessage { + static const $core.Map<$core.int, SelectOptionChangesetPayload_OneOfInsertOption> _SelectOptionChangesetPayload_OneOfInsertOptionByTag = { + 2 : SelectOptionChangesetPayload_OneOfInsertOption.insertOption, + 0 : SelectOptionChangesetPayload_OneOfInsertOption.notSet + }; + static const $core.Map<$core.int, SelectOptionChangesetPayload_OneOfDeleteOption> _SelectOptionChangesetPayload_OneOfDeleteOptionByTag = { + 3 : SelectOptionChangesetPayload_OneOfDeleteOption.deleteOption, + 0 : SelectOptionChangesetPayload_OneOfDeleteOption.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOptionChangesetPayload', createEmptyInstance: create) + ..oo(0, [2]) + ..oo(1, [3]) + ..aOM<$0.CellIdentifierPayload>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cellIdentifier', subBuilder: $0.CellIdentifierPayload.create) + ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'insertOption', subBuilder: SelectOption.create) + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'deleteOption', subBuilder: SelectOption.create) + ..hasRequiredFields = false + ; + + SelectOptionChangesetPayload._() : super(); + factory SelectOptionChangesetPayload({ + $0.CellIdentifierPayload? cellIdentifier, + SelectOption? insertOption, + SelectOption? deleteOption, + }) { + final _result = create(); + if (cellIdentifier != null) { + _result.cellIdentifier = cellIdentifier; + } + if (insertOption != null) { + _result.insertOption = insertOption; + } + if (deleteOption != null) { + _result.deleteOption = deleteOption; + } + return _result; + } + factory SelectOptionChangesetPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SelectOptionChangesetPayload.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') + SelectOptionChangesetPayload clone() => SelectOptionChangesetPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SelectOptionChangesetPayload copyWith(void Function(SelectOptionChangesetPayload) updates) => super.copyWith((message) => updates(message as SelectOptionChangesetPayload)) as SelectOptionChangesetPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SelectOptionChangesetPayload create() => SelectOptionChangesetPayload._(); + SelectOptionChangesetPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SelectOptionChangesetPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SelectOptionChangesetPayload? _defaultInstance; + + SelectOptionChangesetPayload_OneOfInsertOption whichOneOfInsertOption() => _SelectOptionChangesetPayload_OneOfInsertOptionByTag[$_whichOneof(0)]!; + void clearOneOfInsertOption() => clearField($_whichOneof(0)); + + SelectOptionChangesetPayload_OneOfDeleteOption whichOneOfDeleteOption() => _SelectOptionChangesetPayload_OneOfDeleteOptionByTag[$_whichOneof(1)]!; + void clearOneOfDeleteOption() => clearField($_whichOneof(1)); + + @$pb.TagNumber(1) + $0.CellIdentifierPayload get cellIdentifier => $_getN(0); + @$pb.TagNumber(1) + set cellIdentifier($0.CellIdentifierPayload v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasCellIdentifier() => $_has(0); + @$pb.TagNumber(1) + void clearCellIdentifier() => clearField(1); + @$pb.TagNumber(1) + $0.CellIdentifierPayload ensureCellIdentifier() => $_ensure(0); + + @$pb.TagNumber(2) + SelectOption get insertOption => $_getN(1); + @$pb.TagNumber(2) + set insertOption(SelectOption v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasInsertOption() => $_has(1); + @$pb.TagNumber(2) + void clearInsertOption() => clearField(2); + @$pb.TagNumber(2) + SelectOption ensureInsertOption() => $_ensure(1); + + @$pb.TagNumber(3) + SelectOption get deleteOption => $_getN(2); + @$pb.TagNumber(3) + set deleteOption(SelectOption v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasDeleteOption() => $_has(2); + @$pb.TagNumber(3) + void clearDeleteOption() => clearField(3); + @$pb.TagNumber(3) + SelectOption ensureDeleteOption() => $_ensure(2); +} + +enum SelectOptionCellChangesetPayload_OneOfInsertOptionId { + insertOptionId, + notSet +} + +enum SelectOptionCellChangesetPayload_OneOfDeleteOptionId { + deleteOptionId, + notSet +} + +class SelectOptionCellChangesetPayload extends $pb.GeneratedMessage { + static const $core.Map<$core.int, SelectOptionCellChangesetPayload_OneOfInsertOptionId> _SelectOptionCellChangesetPayload_OneOfInsertOptionIdByTag = { + 4 : SelectOptionCellChangesetPayload_OneOfInsertOptionId.insertOptionId, + 0 : SelectOptionCellChangesetPayload_OneOfInsertOptionId.notSet + }; + static const $core.Map<$core.int, SelectOptionCellChangesetPayload_OneOfDeleteOptionId> _SelectOptionCellChangesetPayload_OneOfDeleteOptionIdByTag = { + 5 : SelectOptionCellChangesetPayload_OneOfDeleteOptionId.deleteOptionId, + 0 : SelectOptionCellChangesetPayload_OneOfDeleteOptionId.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOptionCellChangesetPayload', createEmptyInstance: create) + ..oo(0, [4]) + ..oo(1, [5]) + ..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') ? '' : 'insertOptionId') + ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'deleteOptionId') + ..hasRequiredFields = false + ; + + SelectOptionCellChangesetPayload._() : super(); + factory SelectOptionCellChangesetPayload({ + $core.String? gridId, + $core.String? rowId, + $core.String? fieldId, + $core.String? insertOptionId, + $core.String? deleteOptionId, + }) { + final _result = create(); + if (gridId != null) { + _result.gridId = gridId; + } + if (rowId != null) { + _result.rowId = rowId; + } + if (fieldId != null) { + _result.fieldId = fieldId; + } + if (insertOptionId != null) { + _result.insertOptionId = insertOptionId; + } + if (deleteOptionId != null) { + _result.deleteOptionId = deleteOptionId; + } + return _result; + } + factory SelectOptionCellChangesetPayload.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SelectOptionCellChangesetPayload.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') + SelectOptionCellChangesetPayload clone() => SelectOptionCellChangesetPayload()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SelectOptionCellChangesetPayload copyWith(void Function(SelectOptionCellChangesetPayload) updates) => super.copyWith((message) => updates(message as SelectOptionCellChangesetPayload)) as SelectOptionCellChangesetPayload; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SelectOptionCellChangesetPayload create() => SelectOptionCellChangesetPayload._(); + SelectOptionCellChangesetPayload createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SelectOptionCellChangesetPayload getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SelectOptionCellChangesetPayload? _defaultInstance; + + SelectOptionCellChangesetPayload_OneOfInsertOptionId whichOneOfInsertOptionId() => _SelectOptionCellChangesetPayload_OneOfInsertOptionIdByTag[$_whichOneof(0)]!; + void clearOneOfInsertOptionId() => clearField($_whichOneof(0)); + + SelectOptionCellChangesetPayload_OneOfDeleteOptionId whichOneOfDeleteOptionId() => _SelectOptionCellChangesetPayload_OneOfDeleteOptionIdByTag[$_whichOneof(1)]!; + void clearOneOfDeleteOptionId() => clearField($_whichOneof(1)); + + @$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 insertOptionId => $_getSZ(3); + @$pb.TagNumber(4) + set insertOptionId($core.String v) { $_setString(3, v); } + @$pb.TagNumber(4) + $core.bool hasInsertOptionId() => $_has(3); + @$pb.TagNumber(4) + void clearInsertOptionId() => clearField(4); + + @$pb.TagNumber(5) + $core.String get deleteOptionId => $_getSZ(4); + @$pb.TagNumber(5) + set deleteOptionId($core.String v) { $_setString(4, v); } + @$pb.TagNumber(5) + $core.bool hasDeleteOptionId() => $_has(4); + @$pb.TagNumber(5) + void clearDeleteOptionId() => clearField(5); +} + +class SelectOptionContext extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOptionContext', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'selectOptions', $pb.PbFieldType.PM, subBuilder: SelectOption.create) + ..hasRequiredFields = false + ; + + SelectOptionContext._() : super(); + factory SelectOptionContext({ + $core.Iterable? options, + $core.Iterable? selectOptions, + }) { + final _result = create(); + if (options != null) { + _result.options.addAll(options); + } + if (selectOptions != null) { + _result.selectOptions.addAll(selectOptions); + } + return _result; + } + factory SelectOptionContext.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SelectOptionContext.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') + SelectOptionContext clone() => SelectOptionContext()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SelectOptionContext copyWith(void Function(SelectOptionContext) updates) => super.copyWith((message) => updates(message as SelectOptionContext)) as SelectOptionContext; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SelectOptionContext create() => SelectOptionContext._(); + SelectOptionContext createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SelectOptionContext getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SelectOptionContext? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get options => $_getList(0); + + @$pb.TagNumber(2) + $core.List get selectOptions => $_getList(1); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbenum.dart new file mode 100644 index 0000000000..0a063abf16 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbenum.dart @@ -0,0 +1,40 @@ +/// +// Generated code. Do not modify. +// source: selection_type_option.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 SelectOptionColor extends $pb.ProtobufEnum { + static const SelectOptionColor Purple = SelectOptionColor._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Purple'); + static const SelectOptionColor Pink = SelectOptionColor._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Pink'); + static const SelectOptionColor LightPink = SelectOptionColor._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LightPink'); + static const SelectOptionColor Orange = SelectOptionColor._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Orange'); + static const SelectOptionColor Yellow = SelectOptionColor._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Yellow'); + static const SelectOptionColor Lime = SelectOptionColor._(5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Lime'); + static const SelectOptionColor Green = SelectOptionColor._(6, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Green'); + static const SelectOptionColor Aqua = SelectOptionColor._(7, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Aqua'); + static const SelectOptionColor Blue = SelectOptionColor._(8, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Blue'); + + static const $core.List values = [ + Purple, + Pink, + LightPink, + Orange, + Yellow, + Lime, + Green, + Aqua, + Blue, + ]; + + static final $core.Map<$core.int, SelectOptionColor> _byValue = $pb.ProtobufEnum.initByValue(values); + static SelectOptionColor? valueOf($core.int value) => _byValue[value]; + + const SelectOptionColor._($core.int v, $core.String n) : super(v, n); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbjson.dart new file mode 100644 index 0000000000..7a160d582d --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbjson.dart @@ -0,0 +1,107 @@ +/// +// Generated code. Do not modify. +// source: selection_type_option.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 selectOptionColorDescriptor instead') +const SelectOptionColor$json = const { + '1': 'SelectOptionColor', + '2': const [ + const {'1': 'Purple', '2': 0}, + const {'1': 'Pink', '2': 1}, + const {'1': 'LightPink', '2': 2}, + const {'1': 'Orange', '2': 3}, + const {'1': 'Yellow', '2': 4}, + const {'1': 'Lime', '2': 5}, + const {'1': 'Green', '2': 6}, + const {'1': 'Aqua', '2': 7}, + const {'1': 'Blue', '2': 8}, + ], +}; + +/// Descriptor for `SelectOptionColor`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List selectOptionColorDescriptor = $convert.base64Decode('ChFTZWxlY3RPcHRpb25Db2xvchIKCgZQdXJwbGUQABIICgRQaW5rEAESDQoJTGlnaHRQaW5rEAISCgoGT3JhbmdlEAMSCgoGWWVsbG93EAQSCAoETGltZRAFEgkKBUdyZWVuEAYSCAoEQXF1YRAHEggKBEJsdWUQCA=='); +@$core.Deprecated('Use singleSelectTypeOptionDescriptor instead') +const SingleSelectTypeOption$json = const { + '1': 'SingleSelectTypeOption', + '2': const [ + const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, + const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, + ], +}; + +/// Descriptor for `SingleSelectTypeOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List singleSelectTypeOptionDescriptor = $convert.base64Decode('ChZTaW5nbGVTZWxlY3RUeXBlT3B0aW9uEicKB29wdGlvbnMYASADKAsyDS5TZWxlY3RPcHRpb25SB29wdGlvbnMSIwoNZGlzYWJsZV9jb2xvchgCIAEoCFIMZGlzYWJsZUNvbG9y'); +@$core.Deprecated('Use multiSelectTypeOptionDescriptor instead') +const MultiSelectTypeOption$json = const { + '1': 'MultiSelectTypeOption', + '2': const [ + const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, + const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, + ], +}; + +/// Descriptor for `MultiSelectTypeOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List multiSelectTypeOptionDescriptor = $convert.base64Decode('ChVNdWx0aVNlbGVjdFR5cGVPcHRpb24SJwoHb3B0aW9ucxgBIAMoCzINLlNlbGVjdE9wdGlvblIHb3B0aW9ucxIjCg1kaXNhYmxlX2NvbG9yGAIgASgIUgxkaXNhYmxlQ29sb3I='); +@$core.Deprecated('Use selectOptionDescriptor instead') +const SelectOption$json = const { + '1': 'SelectOption', + '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': 'color', '3': 3, '4': 1, '5': 14, '6': '.SelectOptionColor', '10': 'color'}, + ], +}; + +/// Descriptor for `SelectOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List selectOptionDescriptor = $convert.base64Decode('CgxTZWxlY3RPcHRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSKAoFY29sb3IYAyABKA4yEi5TZWxlY3RPcHRpb25Db2xvclIFY29sb3I='); +@$core.Deprecated('Use selectOptionChangesetPayloadDescriptor instead') +const SelectOptionChangesetPayload$json = const { + '1': 'SelectOptionChangesetPayload', + '2': const [ + const {'1': 'cell_identifier', '3': 1, '4': 1, '5': 11, '6': '.CellIdentifierPayload', '10': 'cellIdentifier'}, + const {'1': 'insert_option', '3': 2, '4': 1, '5': 11, '6': '.SelectOption', '9': 0, '10': 'insertOption'}, + const {'1': 'delete_option', '3': 3, '4': 1, '5': 11, '6': '.SelectOption', '9': 1, '10': 'deleteOption'}, + ], + '8': const [ + const {'1': 'one_of_insert_option'}, + const {'1': 'one_of_delete_option'}, + ], +}; + +/// Descriptor for `SelectOptionChangesetPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List selectOptionChangesetPayloadDescriptor = $convert.base64Decode('ChxTZWxlY3RPcHRpb25DaGFuZ2VzZXRQYXlsb2FkEj8KD2NlbGxfaWRlbnRpZmllchgBIAEoCzIWLkNlbGxJZGVudGlmaWVyUGF5bG9hZFIOY2VsbElkZW50aWZpZXISNAoNaW5zZXJ0X29wdGlvbhgCIAEoCzINLlNlbGVjdE9wdGlvbkgAUgxpbnNlcnRPcHRpb24SNAoNZGVsZXRlX29wdGlvbhgDIAEoCzINLlNlbGVjdE9wdGlvbkgBUgxkZWxldGVPcHRpb25CFgoUb25lX29mX2luc2VydF9vcHRpb25CFgoUb25lX29mX2RlbGV0ZV9vcHRpb24='); +@$core.Deprecated('Use selectOptionCellChangesetPayloadDescriptor instead') +const SelectOptionCellChangesetPayload$json = const { + '1': 'SelectOptionCellChangesetPayload', + '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': 'insert_option_id', '3': 4, '4': 1, '5': 9, '9': 0, '10': 'insertOptionId'}, + const {'1': 'delete_option_id', '3': 5, '4': 1, '5': 9, '9': 1, '10': 'deleteOptionId'}, + ], + '8': const [ + const {'1': 'one_of_insert_option_id'}, + const {'1': 'one_of_delete_option_id'}, + ], +}; + +/// Descriptor for `SelectOptionCellChangesetPayload`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List selectOptionCellChangesetPayloadDescriptor = $convert.base64Decode('CiBTZWxlY3RPcHRpb25DZWxsQ2hhbmdlc2V0UGF5bG9hZBIXCgdncmlkX2lkGAEgASgJUgZncmlkSWQSFQoGcm93X2lkGAIgASgJUgVyb3dJZBIZCghmaWVsZF9pZBgDIAEoCVIHZmllbGRJZBIqChBpbnNlcnRfb3B0aW9uX2lkGAQgASgJSABSDmluc2VydE9wdGlvbklkEioKEGRlbGV0ZV9vcHRpb25faWQYBSABKAlIAVIOZGVsZXRlT3B0aW9uSWRCGQoXb25lX29mX2luc2VydF9vcHRpb25faWRCGQoXb25lX29mX2RlbGV0ZV9vcHRpb25faWQ='); +@$core.Deprecated('Use selectOptionContextDescriptor instead') +const SelectOptionContext$json = const { + '1': 'SelectOptionContext', + '2': const [ + const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, + const {'1': 'select_options', '3': 2, '4': 3, '5': 11, '6': '.SelectOption', '10': 'selectOptions'}, + ], +}; + +/// Descriptor for `SelectOptionContext`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List selectOptionContextDescriptor = $convert.base64Decode('ChNTZWxlY3RPcHRpb25Db250ZXh0EicKB29wdGlvbnMYASADKAsyDS5TZWxlY3RPcHRpb25SB29wdGlvbnMSNAoOc2VsZWN0X29wdGlvbnMYAiADKAsyDS5TZWxlY3RPcHRpb25SDXNlbGVjdE9wdGlvbnM='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbserver.dart new file mode 100644 index 0000000000..2e9ff7c00b --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/selection_type_option.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: selection_type_option.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 'selection_type_option.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pb.dart index 9434b2fc90..c8f930be1b 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pb.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pb.dart @@ -9,14 +9,14 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -class RichTextDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RichTextDescription', createEmptyInstance: create) +class RichTextTypeOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RichTextTypeOption', createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'format') ..hasRequiredFields = false ; - RichTextDescription._() : super(); - factory RichTextDescription({ + RichTextTypeOption._() : super(); + factory RichTextTypeOption({ $core.String? format, }) { final _result = create(); @@ -25,26 +25,26 @@ class RichTextDescription extends $pb.GeneratedMessage { } return _result; } - factory RichTextDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RichTextDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + factory RichTextTypeOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RichTextTypeOption.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') - RichTextDescription clone() => RichTextDescription()..mergeFromMessage(this); + RichTextTypeOption clone() => RichTextTypeOption()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - RichTextDescription copyWith(void Function(RichTextDescription) updates) => super.copyWith((message) => updates(message as RichTextDescription)) as RichTextDescription; // ignore: deprecated_member_use + RichTextTypeOption copyWith(void Function(RichTextTypeOption) updates) => super.copyWith((message) => updates(message as RichTextTypeOption)) as RichTextTypeOption; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static RichTextDescription create() => RichTextDescription._(); - RichTextDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static RichTextTypeOption create() => RichTextTypeOption._(); + RichTextTypeOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static RichTextDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static RichTextDescription? _defaultInstance; + static RichTextTypeOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RichTextTypeOption? _defaultInstance; @$pb.TagNumber(1) $core.String get format => $_getSZ(0); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbjson.dart index fdf2098d47..ebe805501b 100644 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbjson.dart +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_description.pbjson.dart @@ -8,13 +8,13 @@ import 'dart:core' as $core; import 'dart:convert' as $convert; import 'dart:typed_data' as $typed_data; -@$core.Deprecated('Use richTextDescriptionDescriptor instead') -const RichTextDescription$json = const { - '1': 'RichTextDescription', +@$core.Deprecated('Use richTextTypeOptionDescriptor instead') +const RichTextTypeOption$json = const { + '1': 'RichTextTypeOption', '2': const [ const {'1': 'format', '3': 1, '4': 1, '5': 9, '10': 'format'}, ], }; -/// Descriptor for `RichTextDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List richTextDescriptionDescriptor = $convert.base64Decode('ChNSaWNoVGV4dERlc2NyaXB0aW9uEhYKBmZvcm1hdBgBIAEoCVIGZm9ybWF0'); +/// Descriptor for `RichTextTypeOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List richTextTypeOptionDescriptor = $convert.base64Decode('ChJSaWNoVGV4dFR5cGVPcHRpb24SFgoGZm9ybWF0GAEgASgJUgZmb3JtYXQ='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pb.dart new file mode 100644 index 0000000000..c30f2eb6e1 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pb.dart @@ -0,0 +1,58 @@ +/// +// Generated code. Do not modify. +// source: text_type_option.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; + +class RichTextTypeOption extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RichTextTypeOption', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'format') + ..hasRequiredFields = false + ; + + RichTextTypeOption._() : super(); + factory RichTextTypeOption({ + $core.String? format, + }) { + final _result = create(); + if (format != null) { + _result.format = format; + } + return _result; + } + factory RichTextTypeOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RichTextTypeOption.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') + RichTextTypeOption clone() => RichTextTypeOption()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RichTextTypeOption copyWith(void Function(RichTextTypeOption) updates) => super.copyWith((message) => updates(message as RichTextTypeOption)) as RichTextTypeOption; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static RichTextTypeOption create() => RichTextTypeOption._(); + RichTextTypeOption createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RichTextTypeOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RichTextTypeOption? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get format => $_getSZ(0); + @$pb.TagNumber(1) + set format($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasFormat() => $_has(0); + @$pb.TagNumber(1) + void clearFormat() => clearField(1); +} + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbenum.dart new file mode 100644 index 0000000000..f2bd90bfa5 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbenum.dart @@ -0,0 +1,7 @@ +/// +// Generated code. Do not modify. +// source: text_type_option.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 + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbjson.dart new file mode 100644 index 0000000000..e4ba6956ee --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbjson.dart @@ -0,0 +1,20 @@ +/// +// Generated code. Do not modify. +// source: text_type_option.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 richTextTypeOptionDescriptor instead') +const RichTextTypeOption$json = const { + '1': 'RichTextTypeOption', + '2': const [ + const {'1': 'format', '3': 1, '4': 1, '5': 9, '10': 'format'}, + ], +}; + +/// Descriptor for `RichTextTypeOption`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List richTextTypeOptionDescriptor = $convert.base64Decode('ChJSaWNoVGV4dFR5cGVPcHRpb24SFgoGZm9ybWF0GAEgASgJUgZmb3JtYXQ='); diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbserver.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbserver.dart new file mode 100644 index 0000000000..6620aa1ee7 --- /dev/null +++ b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/text_type_option.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: text_type_option.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 'text_type_option.pb.dart'; + diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pb.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pb.dart deleted file mode 100644 index 152eef0c74..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pb.dart +++ /dev/null @@ -1,458 +0,0 @@ -/// -// Generated code. Do not modify. -// source: type_options.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 'type_options.pbenum.dart'; - -export 'type_options.pbenum.dart'; - -class RichTextDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RichTextDescription', createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'format') - ..hasRequiredFields = false - ; - - RichTextDescription._() : super(); - factory RichTextDescription({ - $core.String? format, - }) { - final _result = create(); - if (format != null) { - _result.format = format; - } - return _result; - } - factory RichTextDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RichTextDescription.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') - RichTextDescription clone() => RichTextDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - RichTextDescription copyWith(void Function(RichTextDescription) updates) => super.copyWith((message) => updates(message as RichTextDescription)) as RichTextDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static RichTextDescription create() => RichTextDescription._(); - RichTextDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static RichTextDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static RichTextDescription? _defaultInstance; - - @$pb.TagNumber(1) - $core.String get format => $_getSZ(0); - @$pb.TagNumber(1) - set format($core.String v) { $_setString(0, v); } - @$pb.TagNumber(1) - $core.bool hasFormat() => $_has(0); - @$pb.TagNumber(1) - void clearFormat() => clearField(1); -} - -class CheckboxDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CheckboxDescription', createEmptyInstance: create) - ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isSelected') - ..hasRequiredFields = false - ; - - CheckboxDescription._() : super(); - factory CheckboxDescription({ - $core.bool? isSelected, - }) { - final _result = create(); - if (isSelected != null) { - _result.isSelected = isSelected; - } - return _result; - } - factory CheckboxDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory CheckboxDescription.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') - CheckboxDescription clone() => CheckboxDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - CheckboxDescription copyWith(void Function(CheckboxDescription) updates) => super.copyWith((message) => updates(message as CheckboxDescription)) as CheckboxDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static CheckboxDescription create() => CheckboxDescription._(); - CheckboxDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static CheckboxDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static CheckboxDescription? _defaultInstance; - - @$pb.TagNumber(1) - $core.bool get isSelected => $_getBF(0); - @$pb.TagNumber(1) - set isSelected($core.bool v) { $_setBool(0, v); } - @$pb.TagNumber(1) - $core.bool hasIsSelected() => $_has(0); - @$pb.TagNumber(1) - void clearIsSelected() => clearField(1); -} - -class DateDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DateDescription', createEmptyInstance: create) - ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dateFormat', $pb.PbFieldType.OE, defaultOrMaker: DateFormat.Local, valueOf: DateFormat.valueOf, enumValues: DateFormat.values) - ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'timeFormat', $pb.PbFieldType.OE, defaultOrMaker: TimeFormat.TwelveHour, valueOf: TimeFormat.valueOf, enumValues: TimeFormat.values) - ..hasRequiredFields = false - ; - - DateDescription._() : super(); - factory DateDescription({ - DateFormat? dateFormat, - TimeFormat? timeFormat, - }) { - final _result = create(); - if (dateFormat != null) { - _result.dateFormat = dateFormat; - } - if (timeFormat != null) { - _result.timeFormat = timeFormat; - } - return _result; - } - factory DateDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory DateDescription.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') - DateDescription clone() => DateDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - DateDescription copyWith(void Function(DateDescription) updates) => super.copyWith((message) => updates(message as DateDescription)) as DateDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static DateDescription create() => DateDescription._(); - DateDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static DateDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static DateDescription? _defaultInstance; - - @$pb.TagNumber(1) - DateFormat get dateFormat => $_getN(0); - @$pb.TagNumber(1) - set dateFormat(DateFormat v) { setField(1, v); } - @$pb.TagNumber(1) - $core.bool hasDateFormat() => $_has(0); - @$pb.TagNumber(1) - void clearDateFormat() => clearField(1); - - @$pb.TagNumber(2) - TimeFormat get timeFormat => $_getN(1); - @$pb.TagNumber(2) - set timeFormat(TimeFormat v) { setField(2, v); } - @$pb.TagNumber(2) - $core.bool hasTimeFormat() => $_has(1); - @$pb.TagNumber(2) - void clearTimeFormat() => clearField(2); -} - -class SingleSelectDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SingleSelectDescription', createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) - ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') - ..hasRequiredFields = false - ; - - SingleSelectDescription._() : super(); - factory SingleSelectDescription({ - $core.Iterable? options, - $core.bool? disableColor, - }) { - final _result = create(); - if (options != null) { - _result.options.addAll(options); - } - if (disableColor != null) { - _result.disableColor = disableColor; - } - return _result; - } - factory SingleSelectDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SingleSelectDescription.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') - SingleSelectDescription clone() => SingleSelectDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SingleSelectDescription copyWith(void Function(SingleSelectDescription) updates) => super.copyWith((message) => updates(message as SingleSelectDescription)) as SingleSelectDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static SingleSelectDescription create() => SingleSelectDescription._(); - SingleSelectDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static SingleSelectDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static SingleSelectDescription? _defaultInstance; - - @$pb.TagNumber(1) - $core.List get options => $_getList(0); - - @$pb.TagNumber(2) - $core.bool get disableColor => $_getBF(1); - @$pb.TagNumber(2) - set disableColor($core.bool v) { $_setBool(1, v); } - @$pb.TagNumber(2) - $core.bool hasDisableColor() => $_has(1); - @$pb.TagNumber(2) - void clearDisableColor() => clearField(2); -} - -class MultiSelectDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MultiSelectDescription', createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'options', $pb.PbFieldType.PM, subBuilder: SelectOption.create) - ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disableColor') - ..hasRequiredFields = false - ; - - MultiSelectDescription._() : super(); - factory MultiSelectDescription({ - $core.Iterable? options, - $core.bool? disableColor, - }) { - final _result = create(); - if (options != null) { - _result.options.addAll(options); - } - if (disableColor != null) { - _result.disableColor = disableColor; - } - return _result; - } - factory MultiSelectDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory MultiSelectDescription.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') - MultiSelectDescription clone() => MultiSelectDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - MultiSelectDescription copyWith(void Function(MultiSelectDescription) updates) => super.copyWith((message) => updates(message as MultiSelectDescription)) as MultiSelectDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static MultiSelectDescription create() => MultiSelectDescription._(); - MultiSelectDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static MultiSelectDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static MultiSelectDescription? _defaultInstance; - - @$pb.TagNumber(1) - $core.List get options => $_getList(0); - - @$pb.TagNumber(2) - $core.bool get disableColor => $_getBF(1); - @$pb.TagNumber(2) - set disableColor($core.bool v) { $_setBool(1, v); } - @$pb.TagNumber(2) - $core.bool hasDisableColor() => $_has(1); - @$pb.TagNumber(2) - void clearDisableColor() => clearField(2); -} - -class SelectOption extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SelectOption', 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') ? '' : 'color') - ..hasRequiredFields = false - ; - - SelectOption._() : super(); - factory SelectOption({ - $core.String? id, - $core.String? name, - $core.String? color, - }) { - final _result = create(); - if (id != null) { - _result.id = id; - } - if (name != null) { - _result.name = name; - } - if (color != null) { - _result.color = color; - } - return _result; - } - factory SelectOption.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SelectOption.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') - SelectOption clone() => SelectOption()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SelectOption copyWith(void Function(SelectOption) updates) => super.copyWith((message) => updates(message as SelectOption)) as SelectOption; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static SelectOption create() => SelectOption._(); - SelectOption createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static SelectOption getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static SelectOption? _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 color => $_getSZ(2); - @$pb.TagNumber(3) - set color($core.String v) { $_setString(2, v); } - @$pb.TagNumber(3) - $core.bool hasColor() => $_has(2); - @$pb.TagNumber(3) - void clearColor() => clearField(3); -} - -class NumberDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'NumberDescription', createEmptyInstance: create) - ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'money', $pb.PbFieldType.OE, defaultOrMaker: MoneySymbol.CNY, valueOf: MoneySymbol.valueOf, enumValues: MoneySymbol.values) - ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scale', $pb.PbFieldType.OU3) - ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'symbol') - ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'signPositive') - ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') - ..hasRequiredFields = false - ; - - NumberDescription._() : super(); - factory NumberDescription({ - MoneySymbol? money, - $core.int? scale, - $core.String? symbol, - $core.bool? signPositive, - $core.String? name, - }) { - final _result = create(); - if (money != null) { - _result.money = money; - } - if (scale != null) { - _result.scale = scale; - } - if (symbol != null) { - _result.symbol = symbol; - } - if (signPositive != null) { - _result.signPositive = signPositive; - } - if (name != null) { - _result.name = name; - } - return _result; - } - factory NumberDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory NumberDescription.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') - NumberDescription clone() => NumberDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - NumberDescription copyWith(void Function(NumberDescription) updates) => super.copyWith((message) => updates(message as NumberDescription)) as NumberDescription; // ignore: deprecated_member_use - $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') - static NumberDescription create() => NumberDescription._(); - NumberDescription createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); - @$core.pragma('dart2js:noInline') - static NumberDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static NumberDescription? _defaultInstance; - - @$pb.TagNumber(1) - MoneySymbol get money => $_getN(0); - @$pb.TagNumber(1) - set money(MoneySymbol v) { setField(1, v); } - @$pb.TagNumber(1) - $core.bool hasMoney() => $_has(0); - @$pb.TagNumber(1) - void clearMoney() => clearField(1); - - @$pb.TagNumber(2) - $core.int get scale => $_getIZ(1); - @$pb.TagNumber(2) - set scale($core.int v) { $_setUnsignedInt32(1, v); } - @$pb.TagNumber(2) - $core.bool hasScale() => $_has(1); - @$pb.TagNumber(2) - void clearScale() => clearField(2); - - @$pb.TagNumber(3) - $core.String get symbol => $_getSZ(2); - @$pb.TagNumber(3) - set symbol($core.String v) { $_setString(2, v); } - @$pb.TagNumber(3) - $core.bool hasSymbol() => $_has(2); - @$pb.TagNumber(3) - void clearSymbol() => clearField(3); - - @$pb.TagNumber(4) - $core.bool get signPositive => $_getBF(3); - @$pb.TagNumber(4) - set signPositive($core.bool v) { $_setBool(3, v); } - @$pb.TagNumber(4) - $core.bool hasSignPositive() => $_has(3); - @$pb.TagNumber(4) - void clearSignPositive() => clearField(4); - - @$pb.TagNumber(5) - $core.String get name => $_getSZ(4); - @$pb.TagNumber(5) - set name($core.String v) { $_setString(4, v); } - @$pb.TagNumber(5) - $core.bool hasName() => $_has(4); - @$pb.TagNumber(5) - void clearName() => clearField(5); -} - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbenum.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbenum.dart deleted file mode 100644 index c3815cf5e1..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbenum.dart +++ /dev/null @@ -1,62 +0,0 @@ -/// -// Generated code. Do not modify. -// source: type_options.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 DateFormat extends $pb.ProtobufEnum { - static const DateFormat Local = DateFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Local'); - static const DateFormat US = DateFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'US'); - static const DateFormat ISO = DateFormat._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ISO'); - static const DateFormat Friendly = DateFormat._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Friendly'); - - static const $core.List values = [ - Local, - US, - ISO, - Friendly, - ]; - - static final $core.Map<$core.int, DateFormat> _byValue = $pb.ProtobufEnum.initByValue(values); - static DateFormat? valueOf($core.int value) => _byValue[value]; - - const DateFormat._($core.int v, $core.String n) : super(v, n); -} - -class TimeFormat extends $pb.ProtobufEnum { - static const TimeFormat TwelveHour = TimeFormat._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TwelveHour'); - static const TimeFormat TwentyFourHour = TimeFormat._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'TwentyFourHour'); - - static const $core.List values = [ - TwelveHour, - TwentyFourHour, - ]; - - static final $core.Map<$core.int, TimeFormat> _byValue = $pb.ProtobufEnum.initByValue(values); - static TimeFormat? valueOf($core.int value) => _byValue[value]; - - const TimeFormat._($core.int v, $core.String n) : super(v, n); -} - -class MoneySymbol extends $pb.ProtobufEnum { - static const MoneySymbol CNY = MoneySymbol._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CNY'); - static const MoneySymbol EUR = MoneySymbol._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EUR'); - static const MoneySymbol USD = MoneySymbol._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'USD'); - - static const $core.List values = [ - CNY, - EUR, - USD, - ]; - - static final $core.Map<$core.int, MoneySymbol> _byValue = $pb.ProtobufEnum.initByValue(values); - static MoneySymbol? valueOf($core.int value) => _byValue[value]; - - const MoneySymbol._($core.int v, $core.String n) : super(v, n); -} - diff --git a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbjson.dart b/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbjson.dart deleted file mode 100644 index 71e0cf884b..0000000000 --- a/frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-grid/type_options.pbjson.dart +++ /dev/null @@ -1,125 +0,0 @@ -/// -// Generated code. Do not modify. -// source: type_options.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 dateFormatDescriptor instead') -const DateFormat$json = const { - '1': 'DateFormat', - '2': const [ - const {'1': 'Local', '2': 0}, - const {'1': 'US', '2': 1}, - const {'1': 'ISO', '2': 2}, - const {'1': 'Friendly', '2': 3}, - ], -}; - -/// Descriptor for `DateFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List dateFormatDescriptor = $convert.base64Decode('CgpEYXRlRm9ybWF0EgkKBUxvY2FsEAASBgoCVVMQARIHCgNJU08QAhIMCghGcmllbmRseRAD'); -@$core.Deprecated('Use timeFormatDescriptor instead') -const TimeFormat$json = const { - '1': 'TimeFormat', - '2': const [ - const {'1': 'TwelveHour', '2': 0}, - const {'1': 'TwentyFourHour', '2': 1}, - ], -}; - -/// Descriptor for `TimeFormat`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List timeFormatDescriptor = $convert.base64Decode('CgpUaW1lRm9ybWF0Eg4KClR3ZWx2ZUhvdXIQABISCg5Ud2VudHlGb3VySG91chAB'); -@$core.Deprecated('Use moneySymbolDescriptor instead') -const MoneySymbol$json = const { - '1': 'MoneySymbol', - '2': const [ - const {'1': 'CNY', '2': 0}, - const {'1': 'EUR', '2': 1}, - const {'1': 'USD', '2': 2}, - ], -}; - -/// Descriptor for `MoneySymbol`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List moneySymbolDescriptor = $convert.base64Decode('CgtNb25leVN5bWJvbBIHCgNDTlkQABIHCgNFVVIQARIHCgNVU0QQAg=='); -@$core.Deprecated('Use richTextDescriptionDescriptor instead') -const RichTextDescription$json = const { - '1': 'RichTextDescription', - '2': const [ - const {'1': 'format', '3': 1, '4': 1, '5': 9, '10': 'format'}, - ], -}; - -/// Descriptor for `RichTextDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List richTextDescriptionDescriptor = $convert.base64Decode('ChNSaWNoVGV4dERlc2NyaXB0aW9uEhYKBmZvcm1hdBgBIAEoCVIGZm9ybWF0'); -@$core.Deprecated('Use checkboxDescriptionDescriptor instead') -const CheckboxDescription$json = const { - '1': 'CheckboxDescription', - '2': const [ - const {'1': 'is_selected', '3': 1, '4': 1, '5': 8, '10': 'isSelected'}, - ], -}; - -/// Descriptor for `CheckboxDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List checkboxDescriptionDescriptor = $convert.base64Decode('ChNDaGVja2JveERlc2NyaXB0aW9uEh8KC2lzX3NlbGVjdGVkGAEgASgIUgppc1NlbGVjdGVk'); -@$core.Deprecated('Use dateDescriptionDescriptor instead') -const DateDescription$json = const { - '1': 'DateDescription', - '2': const [ - const {'1': 'date_format', '3': 1, '4': 1, '5': 14, '6': '.DateFormat', '10': 'dateFormat'}, - const {'1': 'time_format', '3': 2, '4': 1, '5': 14, '6': '.TimeFormat', '10': 'timeFormat'}, - ], -}; - -/// Descriptor for `DateDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List dateDescriptionDescriptor = $convert.base64Decode('Cg9EYXRlRGVzY3JpcHRpb24SLAoLZGF0ZV9mb3JtYXQYASABKA4yCy5EYXRlRm9ybWF0UgpkYXRlRm9ybWF0EiwKC3RpbWVfZm9ybWF0GAIgASgOMgsuVGltZUZvcm1hdFIKdGltZUZvcm1hdA=='); -@$core.Deprecated('Use singleSelectDescriptionDescriptor instead') -const SingleSelectDescription$json = const { - '1': 'SingleSelectDescription', - '2': const [ - const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, - const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, - ], -}; - -/// Descriptor for `SingleSelectDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List singleSelectDescriptionDescriptor = $convert.base64Decode('ChdTaW5nbGVTZWxlY3REZXNjcmlwdGlvbhInCgdvcHRpb25zGAEgAygLMg0uU2VsZWN0T3B0aW9uUgdvcHRpb25zEiMKDWRpc2FibGVfY29sb3IYAiABKAhSDGRpc2FibGVDb2xvcg=='); -@$core.Deprecated('Use multiSelectDescriptionDescriptor instead') -const MultiSelectDescription$json = const { - '1': 'MultiSelectDescription', - '2': const [ - const {'1': 'options', '3': 1, '4': 3, '5': 11, '6': '.SelectOption', '10': 'options'}, - const {'1': 'disable_color', '3': 2, '4': 1, '5': 8, '10': 'disableColor'}, - ], -}; - -/// Descriptor for `MultiSelectDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List multiSelectDescriptionDescriptor = $convert.base64Decode('ChZNdWx0aVNlbGVjdERlc2NyaXB0aW9uEicKB29wdGlvbnMYASADKAsyDS5TZWxlY3RPcHRpb25SB29wdGlvbnMSIwoNZGlzYWJsZV9jb2xvchgCIAEoCFIMZGlzYWJsZUNvbG9y'); -@$core.Deprecated('Use selectOptionDescriptor instead') -const SelectOption$json = const { - '1': 'SelectOption', - '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': 'color', '3': 3, '4': 1, '5': 9, '10': 'color'}, - ], -}; - -/// Descriptor for `SelectOption`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List selectOptionDescriptor = $convert.base64Decode('CgxTZWxlY3RPcHRpb24SDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFY29sb3IYAyABKAlSBWNvbG9y'); -@$core.Deprecated('Use numberDescriptionDescriptor instead') -const NumberDescription$json = const { - '1': 'NumberDescription', - '2': const [ - const {'1': 'money', '3': 1, '4': 1, '5': 14, '6': '.MoneySymbol', '10': 'money'}, - const {'1': 'scale', '3': 2, '4': 1, '5': 13, '10': 'scale'}, - const {'1': 'symbol', '3': 3, '4': 1, '5': 9, '10': 'symbol'}, - const {'1': 'sign_positive', '3': 4, '4': 1, '5': 8, '10': 'signPositive'}, - const {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'}, - ], -}; - -/// Descriptor for `NumberDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List numberDescriptionDescriptor = $convert.base64Decode('ChFOdW1iZXJEZXNjcmlwdGlvbhIiCgVtb25leRgBIAEoDjIMLk1vbmV5U3ltYm9sUgVtb25leRIUCgVzY2FsZRgCIAEoDVIFc2NhbGUSFgoGc3ltYm9sGAMgASgJUgZzeW1ib2wSIwoNc2lnbl9wb3NpdGl2ZRgEIAEoCFIMc2lnblBvc2l0aXZlEhIKBG5hbWUYBSABKAlSBG5hbWU='); diff --git a/frontend/app_flowy/pubspec.lock b/frontend/app_flowy/pubspec.lock index abd76b4448..90e6dda24c 100644 --- a/frontend/app_flowy/pubspec.lock +++ b/frontend/app_flowy/pubspec.lock @@ -1148,6 +1148,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.11" + textfield_tags: + dependency: "direct main" + description: + name: textfield_tags + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" textstyle_extensions: dependency: transitive description: diff --git a/frontend/app_flowy/pubspec.yaml b/frontend/app_flowy/pubspec.yaml index 41ee902083..4d8ec095d5 100644 --- a/frontend/app_flowy/pubspec.yaml +++ b/frontend/app_flowy/pubspec.yaml @@ -67,7 +67,7 @@ dependencies: clipboard: ^0.1.3 connectivity_plus: 2.2.0 easy_localization: ^3.0.0 - + textfield_tags: ^2.0.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 @@ -111,6 +111,9 @@ flutter: - assets/images/ - assets/images/home/ - assets/images/editor/ + - assets/images/grid/ + - assets/images/grid/field/ + - assets/images/grid/setting/ - assets/translations/ # - images/a_dot_ham.jpeg diff --git a/frontend/rust-lib/Cargo.lock b/frontend/rust-lib/Cargo.lock index e99f1b541b..1a996b2a43 100755 --- a/frontend/rust-lib/Cargo.lock +++ b/frontend/rust-lib/Cargo.lock @@ -956,6 +956,7 @@ dependencies = [ "rusty-money", "serde", "serde_json", + "serde_repr", "strum", "strum_macros", "tokio", diff --git a/frontend/rust-lib/flowy-database/migrations/2022-04-05-015536_flowy-grid-block-index/down.sql b/frontend/rust-lib/flowy-database/migrations/2022-04-05-015536_flowy-grid-block-index/down.sql new file mode 100644 index 0000000000..06daaca7de --- /dev/null +++ b/frontend/rust-lib/flowy-database/migrations/2022-04-05-015536_flowy-grid-block-index/down.sql @@ -0,0 +1,3 @@ +-- This file should undo anything in `up.sql` +DROP TABLE grid_block_index_table; +-- DROP TABLE grid_block_fts_table; \ No newline at end of file diff --git a/frontend/rust-lib/flowy-database/migrations/2022-04-05-015536_flowy-grid-block-index/up.sql b/frontend/rust-lib/flowy-database/migrations/2022-04-05-015536_flowy-grid-block-index/up.sql new file mode 100644 index 0000000000..f55bc82f64 --- /dev/null +++ b/frontend/rust-lib/flowy-database/migrations/2022-04-05-015536_flowy-grid-block-index/up.sql @@ -0,0 +1,7 @@ +-- Your SQL goes here +CREATE TABLE grid_block_index_table ( + row_id TEXT NOT NULL PRIMARY KEY, + block_id TEXT NOT NULL +); + +-- CREATE VIRTUAL TABLE grid_block_fts_table USING FTS5(content, grid_id, block_id, row_id); \ No newline at end of file diff --git a/frontend/rust-lib/flowy-database/src/schema.rs b/frontend/rust-lib/flowy-database/src/schema.rs index 6be116e806..8fddd037e0 100644 --- a/frontend/rust-lib/flowy-database/src/schema.rs +++ b/frontend/rust-lib/flowy-database/src/schema.rs @@ -21,6 +21,13 @@ table! { } } +table! { + grid_block_index_table (row_id) { + row_id -> Text, + block_id -> Text, + } +} + table! { grid_meta_rev_table (id) { id -> Integer, @@ -113,6 +120,7 @@ table! { allow_tables_to_appear_in_same_query!( app_table, doc_table, + grid_block_index_table, grid_meta_rev_table, grid_rev_table, kv_table, diff --git a/frontend/rust-lib/flowy-grid/Cargo.toml b/frontend/rust-lib/flowy-grid/Cargo.toml index 3549bedd08..de0320f062 100644 --- a/frontend/rust-lib/flowy-grid/Cargo.toml +++ b/frontend/rust-lib/flowy-grid/Cargo.toml @@ -33,6 +33,7 @@ tokio = {version = "1", features = ["sync"]} rayon = "1.5" serde = { version = "1.0", features = ["derive"] } serde_json = {version = "1.0"} +serde_repr = "0.1" [dev-dependencies] flowy-test = { path = "../flowy-test" } diff --git a/frontend/rust-lib/flowy-grid/Flowy.toml b/frontend/rust-lib/flowy-grid/Flowy.toml index b310e3fcd7..b0b15a1a2a 100644 --- a/frontend/rust-lib/flowy-grid/Flowy.toml +++ b/frontend/rust-lib/flowy-grid/Flowy.toml @@ -1,3 +1,10 @@ -proto_crates = ["src/event_map.rs", "src/services/cell/description", "src/dart_notification.rs"] +proto_crates = [ + "src/event_map.rs", + "src/services/field/type_options", + "src/services/field/field_entities.rs", + "src/services/cell/cell_entities.rs", + "src/services/row/row_entities.rs", + "src/dart_notification.rs" +] event_files = ["src/event_map.rs"] \ No newline at end of file diff --git a/frontend/rust-lib/flowy-grid/src/dart_notification.rs b/frontend/rust-lib/flowy-grid/src/dart_notification.rs index 82ab35bdee..cc910e30c6 100644 --- a/frontend/rust-lib/flowy-grid/src/dart_notification.rs +++ b/frontend/rust-lib/flowy-grid/src/dart_notification.rs @@ -5,11 +5,12 @@ const OBSERVABLE_CATEGORY: &str = "Grid"; #[derive(ProtoBuf_Enum, Debug)] pub enum GridNotification { Unknown = 0, - GridDidUpdateBlock = 10, - GridDidCreateBlock = 11, - - GridDidUpdateCells = 20, - GridDidUpdateFields = 30, + DidCreateBlock = 11, + DidUpdateBlock = 20, + DidUpdateRow = 30, + DidUpdateCell = 31, + DidUpdateGrid = 40, + DidUpdateField = 41, } impl std::default::Default for GridNotification { diff --git a/frontend/rust-lib/flowy-grid/src/event_handler.rs b/frontend/rust-lib/flowy-grid/src/event_handler.rs index 73aed6da43..ec6dc9659e 100644 --- a/frontend/rust-lib/flowy-grid/src/event_handler.rs +++ b/frontend/rust-lib/flowy-grid/src/event_handler.rs @@ -1,10 +1,12 @@ use crate::manager::GridManager; -use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{ - CellMetaChangeset, CreateRowPayload, Field, Grid, GridId, QueryFieldPayload, QueryGridBlocksPayload, - QueryRowPayload, RepeatedField, RepeatedGridBlock, Row, -}; -use flowy_grid_data_model::parser::{CreateRowParams, QueryFieldParams, QueryGridBlocksParams, QueryRowParams}; +use crate::services::cell::cell_entities::*; +use crate::services::field::field_entities::*; +use crate::services::field::type_options::*; +use crate::services::field::{default_type_option_builder_from_type, type_option_builder_from_json_str}; +use crate::services::grid_editor::ClientGridEditor; +use crate::services::row::row_entities::*; +use flowy_error::{ErrorCode, FlowyError, FlowyResult}; +use flowy_grid_data_model::entities::*; use lib_dispatch::prelude::{data_result, AppData, Data, DataResult}; use std::sync::Arc; @@ -35,19 +37,6 @@ pub(crate) async fn get_grid_blocks_handler( data_result(repeated_grid_block) } -#[tracing::instrument(level = "debug", skip(data, manager), err)] -pub(crate) async fn get_row_handler( - data: Data, - manager: AppData>, -) -> DataResult { - let params: QueryRowParams = data.into_inner().try_into()?; - let editor = manager.get_grid_editor(¶ms.grid_id)?; - match editor.get_row(¶ms.block_id, ¶ms.row_id).await? { - None => Err(FlowyError::record_not_found().context("Can not find the row")), - Some(row) => data_result(row), - } -} - #[tracing::instrument(level = "debug", skip(data, manager), err)] pub(crate) async fn get_fields_handler( data: Data, @@ -55,11 +44,141 @@ pub(crate) async fn get_fields_handler( ) -> DataResult { let params: QueryFieldParams = data.into_inner().try_into()?; let editor = manager.get_grid_editor(¶ms.grid_id)?; - let field_metas = editor.get_field_metas(Some(params.field_orders)).await?; + let field_orders = params.field_orders.items; + let field_metas = editor.get_field_metas(Some(field_orders)).await?; let repeated_field: RepeatedField = field_metas.into_iter().map(Field::from).collect::>().into(); data_result(repeated_field) } +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn update_field_handler( + data: Data, + manager: AppData>, +) -> Result<(), FlowyError> { + let changeset: FieldChangesetParams = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(&changeset.grid_id)?; + let _ = editor.update_field(changeset).await?; + Ok(()) +} + +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn create_field_handler( + data: Data, + manager: AppData>, +) -> Result<(), FlowyError> { + let params: CreateFieldParams = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + let _ = editor.create_field(params).await?; + Ok(()) +} + +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn delete_field_handler( + data: Data, + manager: AppData>, +) -> Result<(), FlowyError> { + let params: FieldIdentifier = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + let _ = editor.delete_field(¶ms.field_id).await?; + Ok(()) +} + +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn switch_to_field_handler( + data: Data, + manager: AppData>, +) -> DataResult { + let params: EditFieldParams = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + editor + .switch_to_field_type(¶ms.field_id, ¶ms.field_type) + .await?; + + let field_meta = editor.get_field_meta(¶ms.field_id).await; + let edit_context = make_field_edit_context( + ¶ms.grid_id, + Some(params.field_id), + params.field_type, + editor, + field_meta, + ) + .await?; + data_result(edit_context) +} + +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn duplicate_field_handler( + data: Data, + manager: AppData>, +) -> Result<(), FlowyError> { + let params: FieldIdentifier = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + let _ = editor.duplicate_field(¶ms.field_id).await?; + Ok(()) +} + +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn get_field_context_handler( + data: Data, + manager: AppData>, +) -> DataResult { + let params = data.into_inner(); + let editor = manager.get_grid_editor(¶ms.grid_id)?; + let edit_context = + make_field_edit_context(¶ms.grid_id, params.field_id, params.field_type, editor, None).await?; + + data_result(edit_context) +} + +async fn make_field_edit_context( + grid_id: &str, + field_id: Option, + field_type: FieldType, + editor: Arc, + field_meta: Option, +) -> FlowyResult { + let field_meta = field_meta.unwrap_or(get_or_create_field_meta(field_id, &field_type, editor).await?); + let s = field_meta + .get_type_option_str(None) + .unwrap_or_else(|| default_type_option_builder_from_type(&field_type).entry().json_str()); + + let builder = type_option_builder_from_json_str(&s, &field_meta.field_type); + let type_option_data = builder.entry().protobuf_bytes().to_vec(); + let field: Field = field_meta.into(); + Ok(EditFieldContext { + grid_id: grid_id.to_string(), + grid_field: field, + type_option_data, + }) +} + +async fn get_or_create_field_meta( + field_id: Option, + field_type: &FieldType, + editor: Arc, +) -> FlowyResult { + match field_id { + None => editor.create_next_field_meta(field_type).await, + Some(field_id) => match editor.get_field_meta(&field_id).await { + None => editor.create_next_field_meta(field_type).await, + Some(field_meta) => Ok(field_meta), + }, + } +} + +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn get_row_handler( + data: Data, + manager: AppData>, +) -> DataResult { + let params: RowIdentifier = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + match editor.get_row(¶ms.row_id).await? { + None => Err(FlowyError::record_not_found().context("Can not find the row")), + Some(row) => data_result(row), + } +} + #[tracing::instrument(level = "debug", skip(data, manager), err)] pub(crate) async fn create_row_handler( data: Data, @@ -71,6 +190,19 @@ pub(crate) async fn create_row_handler( Ok(()) } +#[tracing::instrument(level = "debug", skip_all, err)] +pub(crate) async fn get_cell_handler( + data: Data, + manager: AppData>, +) -> DataResult { + let params: CellIdentifier = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + match editor.get_cell(¶ms).await { + None => data_result(Cell::new(¶ms.field_id, "".to_owned())), + Some(cell) => data_result(cell), + } +} + #[tracing::instrument(level = "debug", skip_all, err)] pub(crate) async fn update_cell_handler( data: Data, @@ -81,3 +213,94 @@ pub(crate) async fn update_cell_handler( let _ = editor.update_cell(changeset).await?; Ok(()) } + +#[tracing::instrument(level = "debug", skip_all, err)] +pub(crate) async fn new_select_option_handler(data: Data) -> DataResult { + let params = data.into_inner(); + data_result(SelectOption::new(¶ms.name)) +} + +#[tracing::instrument(level = "debug", skip_all, err)] +pub(crate) async fn select_option_changeset_handler( + data: Data, + manager: AppData>, +) -> Result<(), FlowyError> { + let changeset: SelectOptionChangeset = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(&changeset.cell_identifier.grid_id)?; + + if let Some(mut field_meta) = editor.get_field_meta(&changeset.cell_identifier.field_id).await { + let mut type_option = select_option_operation(&field_meta)?; + let mut cell_data = None; + if let Some(option) = changeset.insert_option { + cell_data = Some(SelectOptionCellChangeset::from_insert(&option.id).cell_data()); + type_option.insert_option(option); + } + + if let Some(option) = changeset.delete_option { + cell_data = Some(SelectOptionCellChangeset::from_delete(&option.id).cell_data()); + type_option.delete_option(option); + } + + field_meta.insert_type_option_entry(&*type_option); + let _ = editor.replace_field(field_meta).await?; + + let changeset = CellMetaChangeset { + grid_id: changeset.cell_identifier.grid_id, + row_id: changeset.cell_identifier.row_id, + field_id: changeset.cell_identifier.field_id, + data: cell_data, + }; + let _ = editor.update_cell(changeset).await?; + } + Ok(()) +} + +#[tracing::instrument(level = "debug", skip(data, manager), err)] +pub(crate) async fn get_select_option_handler( + data: Data, + manager: AppData>, +) -> DataResult { + let params: CellIdentifier = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + match editor.get_field_meta(¶ms.field_id).await { + None => { + tracing::error!("Can't find the corresponding field with id: {}", params.field_id); + data_result(SelectOptionContext::default()) + } + Some(field_meta) => { + let cell_meta = editor.get_cell_meta(¶ms.row_id, ¶ms.field_id).await?; + let type_option = select_option_operation(&field_meta)?; + let option_context = type_option.option_context(&cell_meta); + data_result(option_context) + } + } +} + +#[tracing::instrument(level = "debug", skip_all, err)] +pub(crate) async fn select_option_cell_changeset_handler( + data: Data, + manager: AppData>, +) -> Result<(), FlowyError> { + let params: SelectOptionCellChangesetParams = data.into_inner().try_into()?; + let editor = manager.get_grid_editor(¶ms.grid_id)?; + let changeset: CellMetaChangeset = params.into(); + let _ = editor.update_cell(changeset).await?; + Ok(()) +} + +fn select_option_operation(field_meta: &FieldMeta) -> FlowyResult> { + match &field_meta.field_type { + FieldType::SingleSelect => { + let type_option = SingleSelectTypeOption::from(field_meta); + Ok(Box::new(type_option)) + } + FieldType::MultiSelect => { + let type_option = MultiSelectTypeOption::from(field_meta); + Ok(Box::new(type_option)) + } + ty => { + tracing::error!("Unsupported field type: {:?} for this handler", ty); + Err(ErrorCode::FieldInvalidOperation.into()) + } + } +} diff --git a/frontend/rust-lib/flowy-grid/src/event_map.rs b/frontend/rust-lib/flowy-grid/src/event_map.rs index 03b27f4c70..8a4c68e468 100644 --- a/frontend/rust-lib/flowy-grid/src/event_map.rs +++ b/frontend/rust-lib/flowy-grid/src/event_map.rs @@ -10,10 +10,28 @@ pub fn create(grid_manager: Arc) -> Module { module = module .event(GridEvent::GetGridData, get_grid_data_handler) .event(GridEvent::GetGridBlocks, get_grid_blocks_handler) + // Field .event(GridEvent::GetFields, get_fields_handler) + .event(GridEvent::UpdateField, update_field_handler) + .event(GridEvent::CreateField, create_field_handler) + .event(GridEvent::DeleteField, delete_field_handler) + .event(GridEvent::SwitchToField, switch_to_field_handler) + .event(GridEvent::DuplicateField, duplicate_field_handler) + // Row .event(GridEvent::CreateRow, create_row_handler) .event(GridEvent::GetRow, get_row_handler) - .event(GridEvent::UpdateCell, update_cell_handler); + // Cell + .event(GridEvent::GetCell, get_cell_handler) + .event(GridEvent::UpdateCell, update_cell_handler) + // SelectOption + .event(GridEvent::NewSelectOption, new_select_option_handler) + .event(GridEvent::ApplySelectOptionChangeset, select_option_changeset_handler) + .event(GridEvent::GetSelectOptionContext, get_select_option_handler) + .event( + GridEvent::ApplySelectOptionCellChangeset, + select_option_cell_changeset_handler, + ) + .event(GridEvent::GetEditFieldContext, get_field_context_handler); module } @@ -30,12 +48,45 @@ pub enum GridEvent { #[event(input = "QueryFieldPayload", output = "RepeatedField")] GetFields = 10, - #[event(input = "CreateRowPayload", output = "Row")] - CreateRow = 11, + #[event(input = "FieldChangesetPayload")] + UpdateField = 11, - #[event(input = "QueryRowPayload", output = "Row")] - GetRow = 12, + #[event(input = "CreateFieldPayload")] + CreateField = 12, + + #[event(input = "FieldIdentifierPayload")] + DeleteField = 13, + + #[event(input = "EditFieldPayload", output = "EditFieldContext")] + SwitchToField = 14, + + #[event(input = "FieldIdentifierPayload")] + DuplicateField = 15, + + #[event(input = "GetEditFieldContextPayload", output = "EditFieldContext")] + GetEditFieldContext = 16, + + #[event(input = "SelectOptionName", output = "SelectOption")] + NewSelectOption = 30, + + #[event(input = "CellIdentifierPayload", output = "SelectOptionContext")] + GetSelectOptionContext = 31, + + #[event(input = "SelectOptionChangesetPayload")] + ApplySelectOptionChangeset = 32, + + #[event(input = "CreateRowPayload", output = "Row")] + CreateRow = 50, + + #[event(input = "RowIdentifierPayload", output = "Row")] + GetRow = 51, + + #[event(input = "CellIdentifierPayload", output = "Cell")] + GetCell = 70, #[event(input = "CellMetaChangeset")] - UpdateCell = 20, + UpdateCell = 71, + + #[event(input = "SelectOptionCellChangesetPayload")] + ApplySelectOptionCellChangeset = 72, } diff --git a/frontend/rust-lib/flowy-grid/src/macros.rs b/frontend/rust-lib/flowy-grid/src/macros.rs index d7a5fc8bf8..e635e63790 100644 --- a/frontend/rust-lib/flowy-grid/src/macros.rs +++ b/frontend/rust-lib/flowy-grid/src/macros.rs @@ -1,17 +1,71 @@ #[macro_export] -macro_rules! impl_from_and_to_type_option { - ($target: ident, $field_type:expr) => { - impl_from_field_type_option!($target); - impl_to_field_type_option!($target, $field_type); +macro_rules! impl_into_box_type_option_builder { + ($target: ident) => { + impl std::convert::From<$target> for BoxTypeOptionBuilder { + fn from(target: $target) -> BoxTypeOptionBuilder { + Box::new(target) + } + } + }; +} + +macro_rules! impl_builder_from_json_str_and_from_bytes { + ($target: ident,$type_option: ident) => { + impl $target { + pub fn from_protobuf_bytes(bytes: Bytes) -> $target { + let type_option = $type_option::from_protobuf_bytes(bytes); + $target(type_option) + } + + pub fn from_json_str(s: &str) -> $target { + let type_option = $type_option::from_json_str(s); + $target(type_option) + } + } }; } #[macro_export] -macro_rules! impl_from_field_type_option { - ($target: ident) => { +macro_rules! impl_type_option { + ($target: ident, $field_type:expr) => { impl std::convert::From<&FieldMeta> for $target { fn from(field_meta: &FieldMeta) -> $target { - match serde_json::from_str(&field_meta.type_options) { + match field_meta.get_type_option_entry::<$target>(Some($field_type)) { + None => $target::default(), + Some(target) => target, + } + } + } + + impl std::convert::From<$target> for String { + fn from(type_option: $target) -> String { + type_option.json_str() + } + } + + impl TypeOptionDataEntry for $target { + fn field_type(&self) -> FieldType { + $field_type + } + + fn json_str(&self) -> String { + match serde_json::to_string(&self) { + Ok(s) => s, + Err(e) => { + tracing::error!("Field type data serialize to json fail, error: {:?}", e); + serde_json::to_string(&$target::default()).unwrap() + } + } + } + + fn protobuf_bytes(&self) -> Bytes { + self.clone().try_into().unwrap() + } + } + + impl TypeOptionDataEntity for $target { + fn from_json_str(s: &str) -> $target { + match serde_json::from_str(s) { Ok(obj) => obj, Err(err) => { tracing::error!("{} convert from any data failed, {:?}", stringify!($target), err); @@ -19,28 +73,9 @@ macro_rules! impl_from_field_type_option { } } } - } - }; -} -#[macro_export] -macro_rules! impl_to_field_type_option { - ($target: ident, $field_type:expr) => { - impl $target { - pub fn field_type(&self) -> FieldType { - $field_type - } - } - - impl std::convert::From<$target> for String { - fn from(field_description: $target) -> Self { - match serde_json::to_string(&field_description) { - Ok(s) => s, - Err(e) => { - tracing::error!("Field type data convert to AnyData fail, error: {:?}", e); - serde_json::to_string(&$target::default()).unwrap() - } - } + fn from_protobuf_bytes(bytes: Bytes) -> $target { + $target::try_from(bytes).unwrap_or($target::default()) } } }; diff --git a/frontend/rust-lib/flowy-grid/src/manager.rs b/frontend/rust-lib/flowy-grid/src/manager.rs index 75499acdac..d35ad334c9 100644 --- a/frontend/rust-lib/flowy-grid/src/manager.rs +++ b/frontend/rust-lib/flowy-grid/src/manager.rs @@ -1,5 +1,7 @@ use crate::services::grid_editor::ClientGridEditor; -use crate::services::kv_persistence::GridKVPersistence; +use crate::services::persistence::block_index::BlockIndexPersistence; +use crate::services::persistence::kv::GridKVPersistence; +use crate::services::persistence::GridDatabase; use bytes::Bytes; use dashmap::DashMap; use flowy_database::ConnectionPool; @@ -10,7 +12,6 @@ use flowy_revision::{RevisionManager, RevisionPersistence, RevisionWebSocket}; use flowy_sync::client_grid::{make_block_meta_delta, make_grid_delta}; use flowy_sync::entities::revision::{RepeatedRevision, Revision}; use std::sync::Arc; -use tokio::sync::RwLock; pub trait GridUser: Send + Sync { fn user_id(&self) -> Result; @@ -21,20 +22,25 @@ pub trait GridUser: Send + Sync { pub struct GridManager { editor_map: Arc, grid_user: Arc, - kv_persistence: Arc>>>, + block_index_persistence: Arc, + #[allow(dead_code)] + kv_persistence: Arc, } impl GridManager { - pub fn new(grid_user: Arc, _rev_web_socket: Arc) -> Self { + pub fn new( + grid_user: Arc, + _rev_web_socket: Arc, + database: Arc, + ) -> Self { let grid_editors = Arc::new(GridEditorMap::new()); - - // kv_persistence will be initialized after first access. - // See get_kv_persistence function below - let kv_persistence = Arc::new(RwLock::new(None)); + let kv_persistence = Arc::new(GridKVPersistence::new(database.clone())); + let block_index_persistence = Arc::new(BlockIndexPersistence::new(database)); Self { editor_map: grid_editors, grid_user, kv_persistence, + block_index_persistence, } } @@ -83,7 +89,7 @@ impl GridManager { Ok(()) } - #[tracing::instrument(level = "debug", skip(self), err)] + // #[tracing::instrument(level = "debug", skip(self), err)] pub fn get_grid_editor(&self, grid_id: &str) -> FlowyResult> { match self.editor_map.get(grid_id) { None => Err(FlowyError::internal().context("Should call open_grid function first")), @@ -111,7 +117,8 @@ impl GridManager { ) -> Result, FlowyError> { let user = self.grid_user.clone(); let rev_manager = self.make_grid_rev_manager(grid_id, pool.clone())?; - let grid_editor = ClientGridEditor::new(grid_id, user, rev_manager).await?; + let grid_editor = + ClientGridEditor::new(grid_id, user, rev_manager, self.block_index_persistence.clone()).await?; Ok(grid_editor) } @@ -135,20 +142,6 @@ impl GridManager { let rev_manager = RevisionManager::new(&user_id, block_d, rev_persistence); Ok(rev_manager) } - - #[allow(dead_code)] - async fn get_kv_persistence(&self) -> FlowyResult> { - let read_guard = self.kv_persistence.read().await; - if read_guard.is_some() { - return Ok(read_guard.clone().unwrap()); - } - drop(read_guard); - - let pool = self.grid_user.db_pool()?; - let kv_persistence = Arc::new(GridKVPersistence::new(pool)); - *self.kv_persistence.write().await = Some(kv_persistence.clone()); - Ok(kv_persistence) - } } pub struct GridEditorMap { @@ -189,12 +182,21 @@ pub async fn make_grid_view_data( block_metas: vec![build_context.block_metas], }; + // Create grid let grid_meta_delta = make_grid_delta(&grid_meta); let grid_delta_data = grid_meta_delta.to_delta_bytes(); let repeated_revision: RepeatedRevision = Revision::initial_revision(user_id, view_id, grid_delta_data.clone()).into(); let _ = grid_manager.create_grid(view_id, repeated_revision).await?; + // Indexing the block's rows + build_context.block_meta_data.row_metas.iter().for_each(|row| { + let _ = grid_manager + .block_index_persistence + .insert_or_update(&row.block_id, &row.id); + }); + + // Create grid's block let grid_block_meta_delta = make_block_meta_delta(&build_context.block_meta_data); let block_meta_delta_data = grid_block_meta_delta.to_delta_bytes(); let repeated_revision: RepeatedRevision = diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/selection_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/cell_entities.rs similarity index 55% rename from frontend/rust-lib/flowy-grid/src/protobuf/model/selection_description.rs rename to frontend/rust-lib/flowy-grid/src/protobuf/model/cell_entities.rs index 9feda09402..107f783e59 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/selection_description.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/cell_entities.rs @@ -17,463 +17,492 @@ #![allow(trivial_casts)] #![allow(unused_imports)] #![allow(unused_results)] -//! Generated file from `selection_description.proto` +//! Generated file from `cell_entities.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 SingleSelectDescription { +pub struct CreateSelectOptionPayload { // message fields - pub options: ::protobuf::RepeatedField, - pub disable_color: bool, + pub cell_identifier: ::protobuf::SingularPtrField, + pub option_name: ::std::string::String, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a SingleSelectDescription { - fn default() -> &'a SingleSelectDescription { - ::default_instance() +impl<'a> ::std::default::Default for &'a CreateSelectOptionPayload { + fn default() -> &'a CreateSelectOptionPayload { + ::default_instance() } } -impl SingleSelectDescription { - pub fn new() -> SingleSelectDescription { +impl CreateSelectOptionPayload { + pub fn new() -> CreateSelectOptionPayload { ::std::default::Default::default() } - // repeated .SelectOption options = 1; + // .CellIdentifierPayload cell_identifier = 1; - pub fn get_options(&self) -> &[SelectOption] { - &self.options + pub fn get_cell_identifier(&self) -> &CellIdentifierPayload { + self.cell_identifier.as_ref().unwrap_or_else(|| ::default_instance()) } - pub fn clear_options(&mut self) { - self.options.clear(); + pub fn clear_cell_identifier(&mut self) { + self.cell_identifier.clear(); + } + + pub fn has_cell_identifier(&self) -> bool { + self.cell_identifier.is_some() } // Param is passed by value, moved - pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { - self.options = v; - } - - // Mutable pointer to the field. - pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { - &mut self.options - } - - // Take field - pub fn take_options(&mut self) -> ::protobuf::RepeatedField { - ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) - } - - // bool disable_color = 2; - - - pub fn get_disable_color(&self) -> bool { - self.disable_color - } - pub fn clear_disable_color(&mut self) { - self.disable_color = false; - } - - // Param is passed by value, moved - pub fn set_disable_color(&mut self, v: bool) { - self.disable_color = v; - } -} - -impl ::protobuf::Message for SingleSelectDescription { - fn is_initialized(&self) -> bool { - for v in &self.options { - 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.options)?; - }, - 2 => { - 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.disable_color = 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; - for value in &self.options { - let len = value.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - }; - if self.disable_color != 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<()> { - for v in &self.options { - os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; - }; - if self.disable_color != false { - os.write_bool(2, self.disable_color)?; - } - 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) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> SingleSelectDescription { - SingleSelectDescription::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>( - "options", - |m: &SingleSelectDescription| { &m.options }, - |m: &mut SingleSelectDescription| { &mut m.options }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( - "disable_color", - |m: &SingleSelectDescription| { &m.disable_color }, - |m: &mut SingleSelectDescription| { &mut m.disable_color }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "SingleSelectDescription", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static SingleSelectDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(SingleSelectDescription::new) - } -} - -impl ::protobuf::Clear for SingleSelectDescription { - fn clear(&mut self) { - self.options.clear(); - self.disable_color = false; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for SingleSelectDescription { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for SingleSelectDescription { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct MultiSelectDescription { - // message fields - pub options: ::protobuf::RepeatedField, - pub disable_color: bool, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a MultiSelectDescription { - fn default() -> &'a MultiSelectDescription { - ::default_instance() - } -} - -impl MultiSelectDescription { - pub fn new() -> MultiSelectDescription { - ::std::default::Default::default() - } - - // repeated .SelectOption options = 1; - - - pub fn get_options(&self) -> &[SelectOption] { - &self.options - } - pub fn clear_options(&mut self) { - self.options.clear(); - } - - // Param is passed by value, moved - pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { - self.options = v; - } - - // Mutable pointer to the field. - pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { - &mut self.options - } - - // Take field - pub fn take_options(&mut self) -> ::protobuf::RepeatedField { - ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) - } - - // bool disable_color = 2; - - - pub fn get_disable_color(&self) -> bool { - self.disable_color - } - pub fn clear_disable_color(&mut self) { - self.disable_color = false; - } - - // Param is passed by value, moved - pub fn set_disable_color(&mut self, v: bool) { - self.disable_color = v; - } -} - -impl ::protobuf::Message for MultiSelectDescription { - fn is_initialized(&self) -> bool { - for v in &self.options { - 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.options)?; - }, - 2 => { - 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.disable_color = 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; - for value in &self.options { - let len = value.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - }; - if self.disable_color != 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<()> { - for v in &self.options { - os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; - }; - if self.disable_color != false { - os.write_bool(2, self.disable_color)?; - } - 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) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> MultiSelectDescription { - MultiSelectDescription::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>( - "options", - |m: &MultiSelectDescription| { &m.options }, - |m: &mut MultiSelectDescription| { &mut m.options }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( - "disable_color", - |m: &MultiSelectDescription| { &m.disable_color }, - |m: &mut MultiSelectDescription| { &mut m.disable_color }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "MultiSelectDescription", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static MultiSelectDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(MultiSelectDescription::new) - } -} - -impl ::protobuf::Clear for MultiSelectDescription { - fn clear(&mut self) { - self.options.clear(); - self.disable_color = false; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for MultiSelectDescription { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for MultiSelectDescription { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -pub struct SelectOption { - // message fields - pub id: ::std::string::String, - pub name: ::std::string::String, - pub color: ::std::string::String, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a SelectOption { - fn default() -> &'a SelectOption { - ::default_instance() - } -} - -impl SelectOption { - pub fn new() -> SelectOption { - ::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; + pub fn set_cell_identifier(&mut self, v: CellIdentifierPayload) { + self.cell_identifier = ::protobuf::SingularPtrField::some(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 + pub fn mut_cell_identifier(&mut self) -> &mut CellIdentifierPayload { + if self.cell_identifier.is_none() { + self.cell_identifier.set_default(); + } + self.cell_identifier.as_mut().unwrap() } // Take field - pub fn take_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.id, ::std::string::String::new()) + pub fn take_cell_identifier(&mut self) -> CellIdentifierPayload { + self.cell_identifier.take().unwrap_or_else(|| CellIdentifierPayload::new()) } - // string name = 2; + // string option_name = 2; + + + pub fn get_option_name(&self) -> &str { + &self.option_name + } + pub fn clear_option_name(&mut self) { + self.option_name.clear(); + } + + // Param is passed by value, moved + pub fn set_option_name(&mut self, v: ::std::string::String) { + self.option_name = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_option_name(&mut self) -> &mut ::std::string::String { + &mut self.option_name + } + + // Take field + pub fn take_option_name(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.option_name, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for CreateSelectOptionPayload { + fn is_initialized(&self) -> bool { + for v in &self.cell_identifier { + 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_message_into(wire_type, is, &mut self.cell_identifier)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.option_name)?; + }, + _ => { + ::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 let Some(ref v) = self.cell_identifier.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + if !self.option_name.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.option_name); + } + 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 let Some(ref v) = self.cell_identifier.as_ref() { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } + if !self.option_name.is_empty() { + os.write_string(2, &self.option_name)?; + } + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> CreateSelectOptionPayload { + CreateSelectOptionPayload::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_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "cell_identifier", + |m: &CreateSelectOptionPayload| { &m.cell_identifier }, + |m: &mut CreateSelectOptionPayload| { &mut m.cell_identifier }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "option_name", + |m: &CreateSelectOptionPayload| { &m.option_name }, + |m: &mut CreateSelectOptionPayload| { &mut m.option_name }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CreateSelectOptionPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static CreateSelectOptionPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CreateSelectOptionPayload::new) + } +} + +impl ::protobuf::Clear for CreateSelectOptionPayload { + fn clear(&mut self) { + self.cell_identifier.clear(); + self.option_name.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for CreateSelectOptionPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for CreateSelectOptionPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct CellIdentifierPayload { + // message fields + pub grid_id: ::std::string::String, + pub field_id: ::std::string::String, + pub row_id: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a CellIdentifierPayload { + fn default() -> &'a CellIdentifierPayload { + ::default_instance() + } +} + +impl CellIdentifierPayload { + pub fn new() -> CellIdentifierPayload { + ::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 field_id = 2; + + + 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 row_id = 3; + + + 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()) + } +} + +impl ::protobuf::Message for CellIdentifierPayload { + 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.field_id)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_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.grid_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.grid_id); + } + if !self.field_id.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.field_id); + } + if !self.row_id.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.row_id); + } + 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.field_id.is_empty() { + os.write_string(2, &self.field_id)?; + } + if !self.row_id.is_empty() { + os.write_string(3, &self.row_id)?; + } + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> CellIdentifierPayload { + CellIdentifierPayload::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: &CellIdentifierPayload| { &m.grid_id }, + |m: &mut CellIdentifierPayload| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "field_id", + |m: &CellIdentifierPayload| { &m.field_id }, + |m: &mut CellIdentifierPayload| { &mut m.field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "row_id", + |m: &CellIdentifierPayload| { &m.row_id }, + |m: &mut CellIdentifierPayload| { &mut m.row_id }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CellIdentifierPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static CellIdentifierPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CellIdentifierPayload::new) + } +} + +impl ::protobuf::Clear for CellIdentifierPayload { + fn clear(&mut self) { + self.grid_id.clear(); + self.field_id.clear(); + self.row_id.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for CellIdentifierPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for CellIdentifierPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct SelectOptionName { + // message fields + pub name: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a SelectOptionName { + fn default() -> &'a SelectOptionName { + ::default_instance() + } +} + +impl SelectOptionName { + pub fn new() -> SelectOptionName { + ::std::default::Default::default() + } + + // string name = 1; pub fn get_name(&self) -> &str { @@ -498,35 +527,9 @@ impl SelectOption { pub fn take_name(&mut self) -> ::std::string::String { ::std::mem::replace(&mut self.name, ::std::string::String::new()) } - - // string color = 3; - - - pub fn get_color(&self) -> &str { - &self.color - } - pub fn clear_color(&mut self) { - self.color.clear(); - } - - // Param is passed by value, moved - pub fn set_color(&mut self, v: ::std::string::String) { - self.color = v; - } - - // Mutable pointer to the field. - // If field is not initialized, it is initialized with default value first. - pub fn mut_color(&mut self) -> &mut ::std::string::String { - &mut self.color - } - - // Take field - pub fn take_color(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.color, ::std::string::String::new()) - } } -impl ::protobuf::Message for SelectOption { +impl ::protobuf::Message for SelectOptionName { fn is_initialized(&self) -> bool { true } @@ -536,14 +539,8 @@ impl ::protobuf::Message for SelectOption { 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.color)?; - }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; }, @@ -556,14 +553,8 @@ impl ::protobuf::Message for SelectOption { #[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.color.is_empty() { - my_size += ::protobuf::rt::string_size(3, &self.color); + my_size += ::protobuf::rt::string_size(1, &self.name); } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); @@ -571,14 +562,8 @@ impl ::protobuf::Message for SelectOption { } 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.color.is_empty() { - os.write_string(3, &self.color)?; + os.write_string(1, &self.name)?; } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) @@ -610,73 +595,60 @@ impl ::protobuf::Message for SelectOption { Self::descriptor_static() } - fn new() -> SelectOption { - SelectOption::new() + fn new() -> SelectOptionName { + SelectOptionName::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: &SelectOption| { &m.id }, - |m: &mut SelectOption| { &mut m.id }, - )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "name", - |m: &SelectOption| { &m.name }, - |m: &mut SelectOption| { &mut m.name }, + |m: &SelectOptionName| { &m.name }, + |m: &mut SelectOptionName| { &mut m.name }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "color", - |m: &SelectOption| { &m.color }, - |m: &mut SelectOption| { &mut m.color }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "SelectOption", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "SelectOptionName", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static SelectOption { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(SelectOption::new) + fn default_instance() -> &'static SelectOptionName { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(SelectOptionName::new) } } -impl ::protobuf::Clear for SelectOption { +impl ::protobuf::Clear for SelectOptionName { fn clear(&mut self) { - self.id.clear(); self.name.clear(); - self.color.clear(); self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for SelectOption { +impl ::std::fmt::Debug for SelectOptionName { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for SelectOption { +impl ::protobuf::reflect::ProtobufValue for SelectOptionName { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x1bselection_description.proto\"g\n\x17SingleSelectDescription\x12'\n\ - \x07options\x18\x01\x20\x03(\x0b2\r.SelectOptionR\x07options\x12#\n\rdis\ - able_color\x18\x02\x20\x01(\x08R\x0cdisableColor\"f\n\x16MultiSelectDesc\ - ription\x12'\n\x07options\x18\x01\x20\x03(\x0b2\r.SelectOptionR\x07optio\ - ns\x12#\n\rdisable_color\x18\x02\x20\x01(\x08R\x0cdisableColor\"H\n\x0cS\ - electOption\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x12\n\x04name\ - \x18\x02\x20\x01(\tR\x04name\x12\x14\n\x05color\x18\x03\x20\x01(\tR\x05c\ - olorb\x06proto3\ + \n\x13cell_entities.proto\"}\n\x19CreateSelectOptionPayload\x12?\n\x0fce\ + ll_identifier\x18\x01\x20\x01(\x0b2\x16.CellIdentifierPayloadR\x0ecellId\ + entifier\x12\x1f\n\x0boption_name\x18\x02\x20\x01(\tR\noptionName\"b\n\ + \x15CellIdentifierPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gr\ + idId\x12\x19\n\x08field_id\x18\x02\x20\x01(\tR\x07fieldId\x12\x15\n\x06r\ + ow_id\x18\x03\x20\x01(\tR\x05rowId\"&\n\x10SelectOptionName\x12\x12\n\ + \x04name\x18\x01\x20\x01(\tR\x04nameb\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_type_option.rs similarity index 82% rename from frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_description.rs rename to frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_type_option.rs index 276617efbd..95612e4765 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_description.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/checkbox_type_option.rs @@ -17,14 +17,14 @@ #![allow(trivial_casts)] #![allow(unused_imports)] #![allow(unused_results)] -//! Generated file from `checkbox_description.proto` +//! Generated file from `checkbox_type_option.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 CheckboxDescription { +pub struct CheckboxTypeOption { // message fields pub is_selected: bool, // special fields @@ -32,14 +32,14 @@ pub struct CheckboxDescription { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a CheckboxDescription { - fn default() -> &'a CheckboxDescription { - ::default_instance() +impl<'a> ::std::default::Default for &'a CheckboxTypeOption { + fn default() -> &'a CheckboxTypeOption { + ::default_instance() } } -impl CheckboxDescription { - pub fn new() -> CheckboxDescription { +impl CheckboxTypeOption { + pub fn new() -> CheckboxTypeOption { ::std::default::Default::default() } @@ -59,7 +59,7 @@ impl CheckboxDescription { } } -impl ::protobuf::Message for CheckboxDescription { +impl ::protobuf::Message for CheckboxTypeOption { fn is_initialized(&self) -> bool { true } @@ -129,8 +129,8 @@ impl ::protobuf::Message for CheckboxDescription { Self::descriptor_static() } - fn new() -> CheckboxDescription { - CheckboxDescription::new() + fn new() -> CheckboxTypeOption { + CheckboxTypeOption::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -139,44 +139,44 @@ impl ::protobuf::Message for CheckboxDescription { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( "is_selected", - |m: &CheckboxDescription| { &m.is_selected }, - |m: &mut CheckboxDescription| { &mut m.is_selected }, + |m: &CheckboxTypeOption| { &m.is_selected }, + |m: &mut CheckboxTypeOption| { &mut m.is_selected }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "CheckboxDescription", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CheckboxTypeOption", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static CheckboxDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(CheckboxDescription::new) + fn default_instance() -> &'static CheckboxTypeOption { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CheckboxTypeOption::new) } } -impl ::protobuf::Clear for CheckboxDescription { +impl ::protobuf::Clear for CheckboxTypeOption { fn clear(&mut self) { self.is_selected = false; self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for CheckboxDescription { +impl ::std::fmt::Debug for CheckboxTypeOption { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for CheckboxDescription { +impl ::protobuf::reflect::ProtobufValue for CheckboxTypeOption { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x1acheckbox_description.proto\"6\n\x13CheckboxDescription\x12\x1f\n\ + \n\x1acheckbox_type_option.proto\"5\n\x12CheckboxTypeOption\x12\x1f\n\ \x0bis_selected\x18\x01\x20\x01(\x08R\nisSelectedb\x06proto3\ "; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/dart_notification.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/dart_notification.rs index 72b3f12abd..d5eaa2a6d8 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/dart_notification.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/dart_notification.rs @@ -26,10 +26,12 @@ #[derive(Clone,PartialEq,Eq,Debug,Hash)] pub enum GridNotification { Unknown = 0, - GridDidUpdateBlock = 10, - GridDidCreateBlock = 11, - GridDidUpdateCells = 20, - GridDidUpdateFields = 30, + DidCreateBlock = 11, + DidUpdateBlock = 20, + DidUpdateRow = 30, + DidUpdateCell = 31, + DidUpdateGrid = 40, + DidUpdateField = 41, } impl ::protobuf::ProtobufEnum for GridNotification { @@ -40,10 +42,12 @@ impl ::protobuf::ProtobufEnum for GridNotification { fn from_i32(value: i32) -> ::std::option::Option { match value { 0 => ::std::option::Option::Some(GridNotification::Unknown), - 10 => ::std::option::Option::Some(GridNotification::GridDidUpdateBlock), - 11 => ::std::option::Option::Some(GridNotification::GridDidCreateBlock), - 20 => ::std::option::Option::Some(GridNotification::GridDidUpdateCells), - 30 => ::std::option::Option::Some(GridNotification::GridDidUpdateFields), + 11 => ::std::option::Option::Some(GridNotification::DidCreateBlock), + 20 => ::std::option::Option::Some(GridNotification::DidUpdateBlock), + 30 => ::std::option::Option::Some(GridNotification::DidUpdateRow), + 31 => ::std::option::Option::Some(GridNotification::DidUpdateCell), + 40 => ::std::option::Option::Some(GridNotification::DidUpdateGrid), + 41 => ::std::option::Option::Some(GridNotification::DidUpdateField), _ => ::std::option::Option::None } } @@ -51,10 +55,12 @@ impl ::protobuf::ProtobufEnum for GridNotification { fn values() -> &'static [Self] { static values: &'static [GridNotification] = &[ GridNotification::Unknown, - GridNotification::GridDidUpdateBlock, - GridNotification::GridDidCreateBlock, - GridNotification::GridDidUpdateCells, - GridNotification::GridDidUpdateFields, + GridNotification::DidCreateBlock, + GridNotification::DidUpdateBlock, + GridNotification::DidUpdateRow, + GridNotification::DidUpdateCell, + GridNotification::DidUpdateGrid, + GridNotification::DidUpdateField, ]; values } @@ -83,10 +89,11 @@ impl ::protobuf::reflect::ProtobufValue for GridNotification { } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x17dart_notification.proto*\x80\x01\n\x10GridNotification\x12\x0b\n\ - \x07Unknown\x10\0\x12\x16\n\x12GridDidUpdateBlock\x10\n\x12\x16\n\x12Gri\ - dDidCreateBlock\x10\x0b\x12\x16\n\x12GridDidUpdateCells\x10\x14\x12\x17\ - \n\x13GridDidUpdateFields\x10\x1eb\x06proto3\ + \n\x17dart_notification.proto*\x93\x01\n\x10GridNotification\x12\x0b\n\ + \x07Unknown\x10\0\x12\x12\n\x0eDidCreateBlock\x10\x0b\x12\x12\n\x0eDidUp\ + dateBlock\x10\x14\x12\x10\n\x0cDidUpdateRow\x10\x1e\x12\x11\n\rDidUpdate\ + Cell\x10\x1f\x12\x11\n\rDidUpdateGrid\x10(\x12\x12\n\x0eDidUpdateField\ + \x10)b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/date_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/date_type_option.rs similarity index 87% rename from frontend/rust-lib/flowy-grid/src/protobuf/model/date_description.rs rename to frontend/rust-lib/flowy-grid/src/protobuf/model/date_type_option.rs index 05b2bc6a0f..5287fa32d6 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/date_description.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/date_type_option.rs @@ -17,14 +17,14 @@ #![allow(trivial_casts)] #![allow(unused_imports)] #![allow(unused_results)] -//! Generated file from `date_description.proto` +//! Generated file from `date_type_option.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 DateDescription { +pub struct DateTypeOption { // message fields pub date_format: DateFormat, pub time_format: TimeFormat, @@ -33,14 +33,14 @@ pub struct DateDescription { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a DateDescription { - fn default() -> &'a DateDescription { - ::default_instance() +impl<'a> ::std::default::Default for &'a DateTypeOption { + fn default() -> &'a DateTypeOption { + ::default_instance() } } -impl DateDescription { - pub fn new() -> DateDescription { +impl DateTypeOption { + pub fn new() -> DateTypeOption { ::std::default::Default::default() } @@ -75,7 +75,7 @@ impl DateDescription { } } -impl ::protobuf::Message for DateDescription { +impl ::protobuf::Message for DateTypeOption { fn is_initialized(&self) -> bool { true } @@ -150,8 +150,8 @@ impl ::protobuf::Message for DateDescription { Self::descriptor_static() } - fn new() -> DateDescription { - DateDescription::new() + fn new() -> DateTypeOption { + DateTypeOption::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -160,29 +160,29 @@ impl ::protobuf::Message for DateDescription { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( "date_format", - |m: &DateDescription| { &m.date_format }, - |m: &mut DateDescription| { &mut m.date_format }, + |m: &DateTypeOption| { &m.date_format }, + |m: &mut DateTypeOption| { &mut m.date_format }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( "time_format", - |m: &DateDescription| { &m.time_format }, - |m: &mut DateDescription| { &mut m.time_format }, + |m: &DateTypeOption| { &m.time_format }, + |m: &mut DateTypeOption| { &mut m.time_format }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "DateDescription", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "DateTypeOption", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static DateDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(DateDescription::new) + fn default_instance() -> &'static DateTypeOption { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(DateTypeOption::new) } } -impl ::protobuf::Clear for DateDescription { +impl ::protobuf::Clear for DateTypeOption { fn clear(&mut self) { self.date_format = DateFormat::Local; self.time_format = TimeFormat::TwelveHour; @@ -190,13 +190,13 @@ impl ::protobuf::Clear for DateDescription { } } -impl ::std::fmt::Debug for DateDescription { +impl ::std::fmt::Debug for DateTypeOption { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for DateDescription { +impl ::protobuf::reflect::ProtobufValue for DateTypeOption { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -309,9 +309,9 @@ impl ::protobuf::reflect::ProtobufValue for TimeFormat { } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x16date_description.proto\"m\n\x0fDateDescription\x12,\n\x0bdate_form\ - at\x18\x01\x20\x01(\x0e2\x0b.DateFormatR\ndateFormat\x12,\n\x0btime_form\ - at\x18\x02\x20\x01(\x0e2\x0b.TimeFormatR\ntimeFormat*6\n\nDateFormat\x12\ + \n\x16date_type_option.proto\"l\n\x0eDateTypeOption\x12,\n\x0bdate_forma\ + t\x18\x01\x20\x01(\x0e2\x0b.DateFormatR\ndateFormat\x12,\n\x0btime_forma\ + t\x18\x02\x20\x01(\x0e2\x0b.TimeFormatR\ntimeFormat*6\n\nDateFormat\x12\ \t\n\x05Local\x10\0\x12\x06\n\x02US\x10\x01\x12\x07\n\x03ISO\x10\x02\x12\ \x0c\n\x08Friendly\x10\x03*0\n\nTimeFormat\x12\x0e\n\nTwelveHour\x10\0\ \x12\x12\n\x0eTwentyFourHour\x10\x01b\x06proto3\ diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/event_map.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/event_map.rs index 9feb87fec5..d9cfbac578 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/event_map.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/event_map.rs @@ -28,9 +28,20 @@ pub enum GridEvent { GetGridData = 0, GetGridBlocks = 1, GetFields = 10, - CreateRow = 11, - GetRow = 12, - UpdateCell = 20, + UpdateField = 11, + CreateField = 12, + DeleteField = 13, + SwitchToField = 14, + DuplicateField = 15, + GetEditFieldContext = 16, + NewSelectOption = 30, + GetSelectOptionContext = 31, + ApplySelectOptionChangeset = 32, + CreateRow = 50, + GetRow = 51, + GetCell = 70, + UpdateCell = 71, + ApplySelectOptionCellChangeset = 72, } impl ::protobuf::ProtobufEnum for GridEvent { @@ -43,9 +54,20 @@ impl ::protobuf::ProtobufEnum for GridEvent { 0 => ::std::option::Option::Some(GridEvent::GetGridData), 1 => ::std::option::Option::Some(GridEvent::GetGridBlocks), 10 => ::std::option::Option::Some(GridEvent::GetFields), - 11 => ::std::option::Option::Some(GridEvent::CreateRow), - 12 => ::std::option::Option::Some(GridEvent::GetRow), - 20 => ::std::option::Option::Some(GridEvent::UpdateCell), + 11 => ::std::option::Option::Some(GridEvent::UpdateField), + 12 => ::std::option::Option::Some(GridEvent::CreateField), + 13 => ::std::option::Option::Some(GridEvent::DeleteField), + 14 => ::std::option::Option::Some(GridEvent::SwitchToField), + 15 => ::std::option::Option::Some(GridEvent::DuplicateField), + 16 => ::std::option::Option::Some(GridEvent::GetEditFieldContext), + 30 => ::std::option::Option::Some(GridEvent::NewSelectOption), + 31 => ::std::option::Option::Some(GridEvent::GetSelectOptionContext), + 32 => ::std::option::Option::Some(GridEvent::ApplySelectOptionChangeset), + 50 => ::std::option::Option::Some(GridEvent::CreateRow), + 51 => ::std::option::Option::Some(GridEvent::GetRow), + 70 => ::std::option::Option::Some(GridEvent::GetCell), + 71 => ::std::option::Option::Some(GridEvent::UpdateCell), + 72 => ::std::option::Option::Some(GridEvent::ApplySelectOptionCellChangeset), _ => ::std::option::Option::None } } @@ -55,9 +77,20 @@ impl ::protobuf::ProtobufEnum for GridEvent { GridEvent::GetGridData, GridEvent::GetGridBlocks, GridEvent::GetFields, + GridEvent::UpdateField, + GridEvent::CreateField, + GridEvent::DeleteField, + GridEvent::SwitchToField, + GridEvent::DuplicateField, + GridEvent::GetEditFieldContext, + GridEvent::NewSelectOption, + GridEvent::GetSelectOptionContext, + GridEvent::ApplySelectOptionChangeset, GridEvent::CreateRow, GridEvent::GetRow, + GridEvent::GetCell, GridEvent::UpdateCell, + GridEvent::ApplySelectOptionCellChangeset, ]; values } @@ -86,10 +119,15 @@ impl ::protobuf::reflect::ProtobufValue for GridEvent { } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x0fevent_map.proto*i\n\tGridEvent\x12\x0f\n\x0bGetGridData\x10\0\x12\ - \x11\n\rGetGridBlocks\x10\x01\x12\r\n\tGetFields\x10\n\x12\r\n\tCreateRo\ - w\x10\x0b\x12\n\n\x06GetRow\x10\x0c\x12\x0e\n\nUpdateCell\x10\x14b\x06pr\ - oto3\ + \n\x0fevent_map.proto*\xde\x02\n\tGridEvent\x12\x0f\n\x0bGetGridData\x10\ + \0\x12\x11\n\rGetGridBlocks\x10\x01\x12\r\n\tGetFields\x10\n\x12\x0f\n\ + \x0bUpdateField\x10\x0b\x12\x0f\n\x0bCreateField\x10\x0c\x12\x0f\n\x0bDe\ + leteField\x10\r\x12\x11\n\rSwitchToField\x10\x0e\x12\x12\n\x0eDuplicateF\ + ield\x10\x0f\x12\x17\n\x13GetEditFieldContext\x10\x10\x12\x13\n\x0fNewSe\ + lectOption\x10\x1e\x12\x1a\n\x16GetSelectOptionContext\x10\x1f\x12\x1e\n\ + \x1aApplySelectOptionChangeset\x10\x20\x12\r\n\tCreateRow\x102\x12\n\n\ + \x06GetRow\x103\x12\x0b\n\x07GetCell\x10F\x12\x0e\n\nUpdateCell\x10G\x12\ + \"\n\x1eApplySelectOptionCellChangeset\x10Hb\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/field_entities.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/field_entities.rs new file mode 100644 index 0000000000..fa4edcc070 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/field_entities.rs @@ -0,0 +1,243 @@ +// 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 `field_entities.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 FieldIdentifierPayload { + // message fields + pub field_id: ::std::string::String, + pub grid_id: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a FieldIdentifierPayload { + fn default() -> &'a FieldIdentifierPayload { + ::default_instance() + } +} + +impl FieldIdentifierPayload { + pub fn new() -> FieldIdentifierPayload { + ::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()) + } +} + +impl ::protobuf::Message for FieldIdentifierPayload { + 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)?; + }, + _ => { + ::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); + } + 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)?; + } + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> FieldIdentifierPayload { + FieldIdentifierPayload::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: &FieldIdentifierPayload| { &m.field_id }, + |m: &mut FieldIdentifierPayload| { &mut m.field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "grid_id", + |m: &FieldIdentifierPayload| { &m.grid_id }, + |m: &mut FieldIdentifierPayload| { &mut m.grid_id }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "FieldIdentifierPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static FieldIdentifierPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(FieldIdentifierPayload::new) + } +} + +impl ::protobuf::Clear for FieldIdentifierPayload { + fn clear(&mut self) { + self.field_id.clear(); + self.grid_id.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for FieldIdentifierPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for FieldIdentifierPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x14field_entities.proto\"L\n\x16FieldIdentifierPayload\x12\x19\n\x08f\ + ield_id\x18\x01\x20\x01(\tR\x07fieldId\x12\x17\n\x07grid_id\x18\x02\x20\ + \x01(\tR\x06gridIdb\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() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/mod.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/mod.rs index a616a281d6..99d0ecd1b6 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/mod.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/mod.rs @@ -1,23 +1,32 @@ #![cfg_attr(rustfmt, rustfmt::skip)] // Auto-generated, do not edit -mod date_description; -pub use date_description::*; +mod field_entities; +pub use field_entities::*; -mod text_description; -pub use text_description::*; +mod number_type_option; +pub use number_type_option::*; mod dart_notification; pub use dart_notification::*; -mod checkbox_description; -pub use checkbox_description::*; +mod selection_type_option; +pub use selection_type_option::*; -mod selection_description; -pub use selection_description::*; +mod row_entities; +pub use row_entities::*; + +mod cell_entities; +pub use cell_entities::*; + +mod checkbox_type_option; +pub use checkbox_type_option::*; mod event_map; pub use event_map::*; -mod number_description; -pub use number_description::*; +mod text_type_option; +pub use text_type_option::*; + +mod date_type_option; +pub use date_type_option::*; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/number_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/number_type_option.rs similarity index 88% rename from frontend/rust-lib/flowy-grid/src/protobuf/model/number_description.rs rename to frontend/rust-lib/flowy-grid/src/protobuf/model/number_type_option.rs index 2137ea2be1..8fd65bc20b 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/number_description.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/number_type_option.rs @@ -17,14 +17,14 @@ #![allow(trivial_casts)] #![allow(unused_imports)] #![allow(unused_results)] -//! Generated file from `number_description.proto` +//! Generated file from `number_type_option.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 NumberDescription { +pub struct NumberTypeOption { // message fields pub format: NumberFormat, pub scale: u32, @@ -36,14 +36,14 @@ pub struct NumberDescription { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a NumberDescription { - fn default() -> &'a NumberDescription { - ::default_instance() +impl<'a> ::std::default::Default for &'a NumberTypeOption { + fn default() -> &'a NumberTypeOption { + ::default_instance() } } -impl NumberDescription { - pub fn new() -> NumberDescription { +impl NumberTypeOption { + pub fn new() -> NumberTypeOption { ::std::default::Default::default() } @@ -145,7 +145,7 @@ impl NumberDescription { } } -impl ::protobuf::Message for NumberDescription { +impl ::protobuf::Message for NumberTypeOption { fn is_initialized(&self) -> bool { true } @@ -255,8 +255,8 @@ impl ::protobuf::Message for NumberDescription { Self::descriptor_static() } - fn new() -> NumberDescription { - NumberDescription::new() + fn new() -> NumberTypeOption { + NumberTypeOption::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -265,44 +265,44 @@ impl ::protobuf::Message for NumberDescription { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( "format", - |m: &NumberDescription| { &m.format }, - |m: &mut NumberDescription| { &mut m.format }, + |m: &NumberTypeOption| { &m.format }, + |m: &mut NumberTypeOption| { &mut m.format }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint32>( "scale", - |m: &NumberDescription| { &m.scale }, - |m: &mut NumberDescription| { &mut m.scale }, + |m: &NumberTypeOption| { &m.scale }, + |m: &mut NumberTypeOption| { &mut m.scale }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "symbol", - |m: &NumberDescription| { &m.symbol }, - |m: &mut NumberDescription| { &mut m.symbol }, + |m: &NumberTypeOption| { &m.symbol }, + |m: &mut NumberTypeOption| { &mut m.symbol }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( "sign_positive", - |m: &NumberDescription| { &m.sign_positive }, - |m: &mut NumberDescription| { &mut m.sign_positive }, + |m: &NumberTypeOption| { &m.sign_positive }, + |m: &mut NumberTypeOption| { &mut m.sign_positive }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "name", - |m: &NumberDescription| { &m.name }, - |m: &mut NumberDescription| { &mut m.name }, + |m: &NumberTypeOption| { &m.name }, + |m: &mut NumberTypeOption| { &mut m.name }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "NumberDescription", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "NumberTypeOption", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static NumberDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(NumberDescription::new) + fn default_instance() -> &'static NumberTypeOption { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(NumberTypeOption::new) } } -impl ::protobuf::Clear for NumberDescription { +impl ::protobuf::Clear for NumberTypeOption { fn clear(&mut self) { self.format = NumberFormat::Number; self.scale = 0; @@ -313,13 +313,13 @@ impl ::protobuf::Clear for NumberDescription { } } -impl ::std::fmt::Debug for NumberDescription { +impl ::std::fmt::Debug for NumberTypeOption { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for NumberDescription { +impl ::protobuf::reflect::ProtobufValue for NumberTypeOption { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -382,7 +382,7 @@ impl ::protobuf::reflect::ProtobufValue for NumberFormat { } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x18number_description.proto\"\xa1\x01\n\x11NumberDescription\x12%\n\ + \n\x18number_type_option.proto\"\xa0\x01\n\x10NumberTypeOption\x12%\n\ \x06format\x18\x01\x20\x01(\x0e2\r.NumberFormatR\x06format\x12\x14\n\x05\ scale\x18\x02\x20\x01(\rR\x05scale\x12\x16\n\x06symbol\x18\x03\x20\x01(\ \tR\x06symbol\x12#\n\rsign_positive\x18\x04\x20\x01(\x08R\x0csignPositiv\ diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/row_entities.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/row_entities.rs new file mode 100644 index 0000000000..0bcf1323c6 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/row_entities.rs @@ -0,0 +1,243 @@ +// 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 `row_entities.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 RowIdentifierPayload { + // message fields + pub grid_id: ::std::string::String, + pub row_id: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a RowIdentifierPayload { + fn default() -> &'a RowIdentifierPayload { + ::default_instance() + } +} + +impl RowIdentifierPayload { + pub fn new() -> RowIdentifierPayload { + ::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 = 3; + + + 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()) + } +} + +impl ::protobuf::Message for RowIdentifierPayload { + 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)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_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.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(3, &self.row_id); + } + 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(3, &self.row_id)?; + } + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> RowIdentifierPayload { + RowIdentifierPayload::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: &RowIdentifierPayload| { &m.grid_id }, + |m: &mut RowIdentifierPayload| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "row_id", + |m: &RowIdentifierPayload| { &m.row_id }, + |m: &mut RowIdentifierPayload| { &mut m.row_id }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RowIdentifierPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static RowIdentifierPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RowIdentifierPayload::new) + } +} + +impl ::protobuf::Clear for RowIdentifierPayload { + fn clear(&mut self) { + self.grid_id.clear(); + self.row_id.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for RowIdentifierPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for RowIdentifierPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x12row_entities.proto\"F\n\x14RowIdentifierPayload\x12\x17\n\x07grid_\ + id\x18\x01\x20\x01(\tR\x06gridId\x12\x15\n\x06row_id\x18\x03\x20\x01(\tR\ + \x05rowIdb\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() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/selection_type_option.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/selection_type_option.rs new file mode 100644 index 0000000000..ea45e6ac6e --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/selection_type_option.rs @@ -0,0 +1,1743 @@ +// 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 `selection_type_option.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 SingleSelectTypeOption { + // message fields + pub options: ::protobuf::RepeatedField, + pub disable_color: bool, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a SingleSelectTypeOption { + fn default() -> &'a SingleSelectTypeOption { + ::default_instance() + } +} + +impl SingleSelectTypeOption { + pub fn new() -> SingleSelectTypeOption { + ::std::default::Default::default() + } + + // repeated .SelectOption options = 1; + + + pub fn get_options(&self) -> &[SelectOption] { + &self.options + } + pub fn clear_options(&mut self) { + self.options.clear(); + } + + // Param is passed by value, moved + pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { + self.options = v; + } + + // Mutable pointer to the field. + pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.options + } + + // Take field + pub fn take_options(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) + } + + // bool disable_color = 2; + + + pub fn get_disable_color(&self) -> bool { + self.disable_color + } + pub fn clear_disable_color(&mut self) { + self.disable_color = false; + } + + // Param is passed by value, moved + pub fn set_disable_color(&mut self, v: bool) { + self.disable_color = v; + } +} + +impl ::protobuf::Message for SingleSelectTypeOption { + fn is_initialized(&self) -> bool { + for v in &self.options { + 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.options)?; + }, + 2 => { + 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.disable_color = 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; + for value in &self.options { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if self.disable_color != 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<()> { + for v in &self.options { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if self.disable_color != false { + os.write_bool(2, self.disable_color)?; + } + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> SingleSelectTypeOption { + SingleSelectTypeOption::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>( + "options", + |m: &SingleSelectTypeOption| { &m.options }, + |m: &mut SingleSelectTypeOption| { &mut m.options }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "disable_color", + |m: &SingleSelectTypeOption| { &m.disable_color }, + |m: &mut SingleSelectTypeOption| { &mut m.disable_color }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "SingleSelectTypeOption", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static SingleSelectTypeOption { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(SingleSelectTypeOption::new) + } +} + +impl ::protobuf::Clear for SingleSelectTypeOption { + fn clear(&mut self) { + self.options.clear(); + self.disable_color = false; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for SingleSelectTypeOption { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for SingleSelectTypeOption { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct MultiSelectTypeOption { + // message fields + pub options: ::protobuf::RepeatedField, + pub disable_color: bool, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a MultiSelectTypeOption { + fn default() -> &'a MultiSelectTypeOption { + ::default_instance() + } +} + +impl MultiSelectTypeOption { + pub fn new() -> MultiSelectTypeOption { + ::std::default::Default::default() + } + + // repeated .SelectOption options = 1; + + + pub fn get_options(&self) -> &[SelectOption] { + &self.options + } + pub fn clear_options(&mut self) { + self.options.clear(); + } + + // Param is passed by value, moved + pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { + self.options = v; + } + + // Mutable pointer to the field. + pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.options + } + + // Take field + pub fn take_options(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) + } + + // bool disable_color = 2; + + + pub fn get_disable_color(&self) -> bool { + self.disable_color + } + pub fn clear_disable_color(&mut self) { + self.disable_color = false; + } + + // Param is passed by value, moved + pub fn set_disable_color(&mut self, v: bool) { + self.disable_color = v; + } +} + +impl ::protobuf::Message for MultiSelectTypeOption { + fn is_initialized(&self) -> bool { + for v in &self.options { + 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.options)?; + }, + 2 => { + 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.disable_color = 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; + for value in &self.options { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if self.disable_color != 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<()> { + for v in &self.options { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if self.disable_color != false { + os.write_bool(2, self.disable_color)?; + } + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> MultiSelectTypeOption { + MultiSelectTypeOption::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>( + "options", + |m: &MultiSelectTypeOption| { &m.options }, + |m: &mut MultiSelectTypeOption| { &mut m.options }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>( + "disable_color", + |m: &MultiSelectTypeOption| { &m.disable_color }, + |m: &mut MultiSelectTypeOption| { &mut m.disable_color }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "MultiSelectTypeOption", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static MultiSelectTypeOption { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(MultiSelectTypeOption::new) + } +} + +impl ::protobuf::Clear for MultiSelectTypeOption { + fn clear(&mut self) { + self.options.clear(); + self.disable_color = false; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for MultiSelectTypeOption { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for MultiSelectTypeOption { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct SelectOption { + // message fields + pub id: ::std::string::String, + pub name: ::std::string::String, + pub color: SelectOptionColor, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a SelectOption { + fn default() -> &'a SelectOption { + ::default_instance() + } +} + +impl SelectOption { + pub fn new() -> SelectOption { + ::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()) + } + + // .SelectOptionColor color = 3; + + + pub fn get_color(&self) -> SelectOptionColor { + self.color + } + pub fn clear_color(&mut self) { + self.color = SelectOptionColor::Purple; + } + + // Param is passed by value, moved + pub fn set_color(&mut self, v: SelectOptionColor) { + self.color = v; + } +} + +impl ::protobuf::Message for SelectOption { + 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_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.color, 3, &mut self.unknown_fields)? + }, + _ => { + ::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.color != SelectOptionColor::Purple { + my_size += ::protobuf::rt::enum_size(3, self.color); + } + 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.color != SelectOptionColor::Purple { + os.write_enum(3, ::protobuf::ProtobufEnum::value(&self.color))?; + } + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> SelectOption { + SelectOption::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: &SelectOption| { &m.id }, + |m: &mut SelectOption| { &mut m.id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "name", + |m: &SelectOption| { &m.name }, + |m: &mut SelectOption| { &mut m.name }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + "color", + |m: &SelectOption| { &m.color }, + |m: &mut SelectOption| { &mut m.color }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "SelectOption", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static SelectOption { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(SelectOption::new) + } +} + +impl ::protobuf::Clear for SelectOption { + fn clear(&mut self) { + self.id.clear(); + self.name.clear(); + self.color = SelectOptionColor::Purple; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for SelectOption { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for SelectOption { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct SelectOptionChangesetPayload { + // message fields + pub cell_identifier: ::protobuf::SingularPtrField, + // message oneof groups + pub one_of_insert_option: ::std::option::Option, + pub one_of_delete_option: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a SelectOptionChangesetPayload { + fn default() -> &'a SelectOptionChangesetPayload { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum SelectOptionChangesetPayload_oneof_one_of_insert_option { + insert_option(SelectOption), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum SelectOptionChangesetPayload_oneof_one_of_delete_option { + delete_option(SelectOption), +} + +impl SelectOptionChangesetPayload { + pub fn new() -> SelectOptionChangesetPayload { + ::std::default::Default::default() + } + + // .CellIdentifierPayload cell_identifier = 1; + + + pub fn get_cell_identifier(&self) -> &super::cell_entities::CellIdentifierPayload { + self.cell_identifier.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_cell_identifier(&mut self) { + self.cell_identifier.clear(); + } + + pub fn has_cell_identifier(&self) -> bool { + self.cell_identifier.is_some() + } + + // Param is passed by value, moved + pub fn set_cell_identifier(&mut self, v: super::cell_entities::CellIdentifierPayload) { + self.cell_identifier = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_cell_identifier(&mut self) -> &mut super::cell_entities::CellIdentifierPayload { + if self.cell_identifier.is_none() { + self.cell_identifier.set_default(); + } + self.cell_identifier.as_mut().unwrap() + } + + // Take field + pub fn take_cell_identifier(&mut self) -> super::cell_entities::CellIdentifierPayload { + self.cell_identifier.take().unwrap_or_else(|| super::cell_entities::CellIdentifierPayload::new()) + } + + // .SelectOption insert_option = 2; + + + pub fn get_insert_option(&self) -> &SelectOption { + match self.one_of_insert_option { + ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(ref v)) => v, + _ => ::default_instance(), + } + } + pub fn clear_insert_option(&mut self) { + self.one_of_insert_option = ::std::option::Option::None; + } + + pub fn has_insert_option(&self) -> bool { + match self.one_of_insert_option { + ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_insert_option(&mut self, v: SelectOption) { + self.one_of_insert_option = ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(v)) + } + + // Mutable pointer to the field. + pub fn mut_insert_option(&mut self) -> &mut SelectOption { + if let ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(_)) = self.one_of_insert_option { + } else { + self.one_of_insert_option = ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(SelectOption::new())); + } + match self.one_of_insert_option { + ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_insert_option(&mut self) -> SelectOption { + if self.has_insert_option() { + match self.one_of_insert_option.take() { + ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(v)) => v, + _ => panic!(), + } + } else { + SelectOption::new() + } + } + + // .SelectOption delete_option = 3; + + + pub fn get_delete_option(&self) -> &SelectOption { + match self.one_of_delete_option { + ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(ref v)) => v, + _ => ::default_instance(), + } + } + pub fn clear_delete_option(&mut self) { + self.one_of_delete_option = ::std::option::Option::None; + } + + pub fn has_delete_option(&self) -> bool { + match self.one_of_delete_option { + ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_delete_option(&mut self, v: SelectOption) { + self.one_of_delete_option = ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(v)) + } + + // Mutable pointer to the field. + pub fn mut_delete_option(&mut self) -> &mut SelectOption { + if let ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(_)) = self.one_of_delete_option { + } else { + self.one_of_delete_option = ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(SelectOption::new())); + } + match self.one_of_delete_option { + ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_delete_option(&mut self) -> SelectOption { + if self.has_delete_option() { + match self.one_of_delete_option.take() { + ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(v)) => v, + _ => panic!(), + } + } else { + SelectOption::new() + } + } +} + +impl ::protobuf::Message for SelectOptionChangesetPayload { + fn is_initialized(&self) -> bool { + for v in &self.cell_identifier { + if !v.is_initialized() { + return false; + } + }; + if let Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(ref v)) = self.one_of_insert_option { + if !v.is_initialized() { + return false; + } + } + if let Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(ref v)) = self.one_of_delete_option { + 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_message_into(wire_type, is, &mut self.cell_identifier)?; + }, + 2 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_insert_option = ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(is.read_message()?)); + }, + 3 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_delete_option = ::std::option::Option::Some(SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(is.read_message()?)); + }, + _ => { + ::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 let Some(ref v) = self.cell_identifier.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + if let ::std::option::Option::Some(ref v) = self.one_of_insert_option { + match v { + &SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(ref v) => { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_delete_option { + match v { + &SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(ref v) => { + 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<()> { + if let Some(ref v) = self.cell_identifier.as_ref() { + 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 ::std::option::Option::Some(ref v) = self.one_of_insert_option { + match v { + &SelectOptionChangesetPayload_oneof_one_of_insert_option::insert_option(ref v) => { + 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 ::std::option::Option::Some(ref v) = self.one_of_delete_option { + match v { + &SelectOptionChangesetPayload_oneof_one_of_delete_option::delete_option(ref v) => { + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> SelectOptionChangesetPayload { + SelectOptionChangesetPayload::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_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "cell_identifier", + |m: &SelectOptionChangesetPayload| { &m.cell_identifier }, + |m: &mut SelectOptionChangesetPayload| { &mut m.cell_identifier }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, SelectOption>( + "insert_option", + SelectOptionChangesetPayload::has_insert_option, + SelectOptionChangesetPayload::get_insert_option, + )); + fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, SelectOption>( + "delete_option", + SelectOptionChangesetPayload::has_delete_option, + SelectOptionChangesetPayload::get_delete_option, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "SelectOptionChangesetPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static SelectOptionChangesetPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(SelectOptionChangesetPayload::new) + } +} + +impl ::protobuf::Clear for SelectOptionChangesetPayload { + fn clear(&mut self) { + self.cell_identifier.clear(); + self.one_of_insert_option = ::std::option::Option::None; + self.one_of_delete_option = ::std::option::Option::None; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for SelectOptionChangesetPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for SelectOptionChangesetPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct SelectOptionCellChangesetPayload { + // 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_insert_option_id: ::std::option::Option, + pub one_of_delete_option_id: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a SelectOptionCellChangesetPayload { + fn default() -> &'a SelectOptionCellChangesetPayload { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id { + insert_option_id(::std::string::String), +} + +#[derive(Clone,PartialEq,Debug)] +pub enum SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id { + delete_option_id(::std::string::String), +} + +impl SelectOptionCellChangesetPayload { + pub fn new() -> SelectOptionCellChangesetPayload { + ::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 insert_option_id = 4; + + + pub fn get_insert_option_id(&self) -> &str { + match self.one_of_insert_option_id { + ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(ref v)) => v, + _ => "", + } + } + pub fn clear_insert_option_id(&mut self) { + self.one_of_insert_option_id = ::std::option::Option::None; + } + + pub fn has_insert_option_id(&self) -> bool { + match self.one_of_insert_option_id { + ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_insert_option_id(&mut self, v: ::std::string::String) { + self.one_of_insert_option_id = ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(v)) + } + + // Mutable pointer to the field. + pub fn mut_insert_option_id(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(_)) = self.one_of_insert_option_id { + } else { + self.one_of_insert_option_id = ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(::std::string::String::new())); + } + match self.one_of_insert_option_id { + ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_insert_option_id(&mut self) -> ::std::string::String { + if self.has_insert_option_id() { + match self.one_of_insert_option_id.take() { + ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } + + // string delete_option_id = 5; + + + pub fn get_delete_option_id(&self) -> &str { + match self.one_of_delete_option_id { + ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(ref v)) => v, + _ => "", + } + } + pub fn clear_delete_option_id(&mut self) { + self.one_of_delete_option_id = ::std::option::Option::None; + } + + pub fn has_delete_option_id(&self) -> bool { + match self.one_of_delete_option_id { + ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_delete_option_id(&mut self, v: ::std::string::String) { + self.one_of_delete_option_id = ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(v)) + } + + // Mutable pointer to the field. + pub fn mut_delete_option_id(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(_)) = self.one_of_delete_option_id { + } else { + self.one_of_delete_option_id = ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(::std::string::String::new())); + } + match self.one_of_delete_option_id { + ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_delete_option_id(&mut self) -> ::std::string::String { + if self.has_delete_option_id() { + match self.one_of_delete_option_id.take() { + ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } +} + +impl ::protobuf::Message for SelectOptionCellChangesetPayload { + 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_insert_option_id = ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(is.read_string()?)); + }, + 5 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_delete_option_id = ::std::option::Option::Some(SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(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_insert_option_id { + match v { + &SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(ref v) => { + my_size += ::protobuf::rt::string_size(4, &v); + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_delete_option_id { + match v { + &SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(ref v) => { + my_size += ::protobuf::rt::string_size(5, &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_insert_option_id { + match v { + &SelectOptionCellChangesetPayload_oneof_one_of_insert_option_id::insert_option_id(ref v) => { + os.write_string(4, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self.one_of_delete_option_id { + match v { + &SelectOptionCellChangesetPayload_oneof_one_of_delete_option_id::delete_option_id(ref v) => { + os.write_string(5, 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> SelectOptionCellChangesetPayload { + SelectOptionCellChangesetPayload::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: &SelectOptionCellChangesetPayload| { &m.grid_id }, + |m: &mut SelectOptionCellChangesetPayload| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "row_id", + |m: &SelectOptionCellChangesetPayload| { &m.row_id }, + |m: &mut SelectOptionCellChangesetPayload| { &mut m.row_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "field_id", + |m: &SelectOptionCellChangesetPayload| { &m.field_id }, + |m: &mut SelectOptionCellChangesetPayload| { &mut m.field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "insert_option_id", + SelectOptionCellChangesetPayload::has_insert_option_id, + SelectOptionCellChangesetPayload::get_insert_option_id, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "delete_option_id", + SelectOptionCellChangesetPayload::has_delete_option_id, + SelectOptionCellChangesetPayload::get_delete_option_id, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "SelectOptionCellChangesetPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static SelectOptionCellChangesetPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(SelectOptionCellChangesetPayload::new) + } +} + +impl ::protobuf::Clear for SelectOptionCellChangesetPayload { + fn clear(&mut self) { + self.grid_id.clear(); + self.row_id.clear(); + self.field_id.clear(); + self.one_of_insert_option_id = ::std::option::Option::None; + self.one_of_delete_option_id = ::std::option::Option::None; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for SelectOptionCellChangesetPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for SelectOptionCellChangesetPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct SelectOptionContext { + // message fields + pub options: ::protobuf::RepeatedField, + pub select_options: ::protobuf::RepeatedField, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a SelectOptionContext { + fn default() -> &'a SelectOptionContext { + ::default_instance() + } +} + +impl SelectOptionContext { + pub fn new() -> SelectOptionContext { + ::std::default::Default::default() + } + + // repeated .SelectOption options = 1; + + + pub fn get_options(&self) -> &[SelectOption] { + &self.options + } + pub fn clear_options(&mut self) { + self.options.clear(); + } + + // Param is passed by value, moved + pub fn set_options(&mut self, v: ::protobuf::RepeatedField) { + self.options = v; + } + + // Mutable pointer to the field. + pub fn mut_options(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.options + } + + // Take field + pub fn take_options(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.options, ::protobuf::RepeatedField::new()) + } + + // repeated .SelectOption select_options = 2; + + + pub fn get_select_options(&self) -> &[SelectOption] { + &self.select_options + } + pub fn clear_select_options(&mut self) { + self.select_options.clear(); + } + + // Param is passed by value, moved + pub fn set_select_options(&mut self, v: ::protobuf::RepeatedField) { + self.select_options = v; + } + + // Mutable pointer to the field. + pub fn mut_select_options(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.select_options + } + + // Take field + pub fn take_select_options(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.select_options, ::protobuf::RepeatedField::new()) + } +} + +impl ::protobuf::Message for SelectOptionContext { + fn is_initialized(&self) -> bool { + for v in &self.options { + if !v.is_initialized() { + return false; + } + }; + for v in &self.select_options { + 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.options)?; + }, + 2 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.select_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; + for value in &self.options { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + for value in &self.select_options { + 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<()> { + for v in &self.options { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + for v in &self.select_options { + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> SelectOptionContext { + SelectOptionContext::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>( + "options", + |m: &SelectOptionContext| { &m.options }, + |m: &mut SelectOptionContext| { &mut m.options }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "select_options", + |m: &SelectOptionContext| { &m.select_options }, + |m: &mut SelectOptionContext| { &mut m.select_options }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "SelectOptionContext", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static SelectOptionContext { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(SelectOptionContext::new) + } +} + +impl ::protobuf::Clear for SelectOptionContext { + fn clear(&mut self) { + self.options.clear(); + self.select_options.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for SelectOptionContext { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for SelectOptionContext { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +pub enum SelectOptionColor { + Purple = 0, + Pink = 1, + LightPink = 2, + Orange = 3, + Yellow = 4, + Lime = 5, + Green = 6, + Aqua = 7, + Blue = 8, +} + +impl ::protobuf::ProtobufEnum for SelectOptionColor { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(SelectOptionColor::Purple), + 1 => ::std::option::Option::Some(SelectOptionColor::Pink), + 2 => ::std::option::Option::Some(SelectOptionColor::LightPink), + 3 => ::std::option::Option::Some(SelectOptionColor::Orange), + 4 => ::std::option::Option::Some(SelectOptionColor::Yellow), + 5 => ::std::option::Option::Some(SelectOptionColor::Lime), + 6 => ::std::option::Option::Some(SelectOptionColor::Green), + 7 => ::std::option::Option::Some(SelectOptionColor::Aqua), + 8 => ::std::option::Option::Some(SelectOptionColor::Blue), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [SelectOptionColor] = &[ + SelectOptionColor::Purple, + SelectOptionColor::Pink, + SelectOptionColor::LightPink, + SelectOptionColor::Orange, + SelectOptionColor::Yellow, + SelectOptionColor::Lime, + SelectOptionColor::Green, + SelectOptionColor::Aqua, + SelectOptionColor::Blue, + ]; + 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::("SelectOptionColor", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for SelectOptionColor { +} + +impl ::std::default::Default for SelectOptionColor { + fn default() -> Self { + SelectOptionColor::Purple + } +} + +impl ::protobuf::reflect::ProtobufValue for SelectOptionColor { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x1bselection_type_option.proto\x1a\x13cell_entities.proto\"f\n\x16Sin\ + gleSelectTypeOption\x12'\n\x07options\x18\x01\x20\x03(\x0b2\r.SelectOpti\ + onR\x07options\x12#\n\rdisable_color\x18\x02\x20\x01(\x08R\x0cdisableCol\ + or\"e\n\x15MultiSelectTypeOption\x12'\n\x07options\x18\x01\x20\x03(\x0b2\ + \r.SelectOptionR\x07options\x12#\n\rdisable_color\x18\x02\x20\x01(\x08R\ + \x0cdisableColor\"\\\n\x0cSelectOption\x12\x0e\n\x02id\x18\x01\x20\x01(\ + \tR\x02id\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12(\n\x05color\ + \x18\x03\x20\x01(\x0e2\x12.SelectOptionColorR\x05color\"\xfb\x01\n\x1cSe\ + lectOptionChangesetPayload\x12?\n\x0fcell_identifier\x18\x01\x20\x01(\ + \x0b2\x16.CellIdentifierPayloadR\x0ecellIdentifier\x124\n\rinsert_option\ + \x18\x02\x20\x01(\x0b2\r.SelectOptionH\0R\x0cinsertOption\x124\n\rdelete\ + _option\x18\x03\x20\x01(\x0b2\r.SelectOptionH\x01R\x0cdeleteOptionB\x16\ + \n\x14one_of_insert_optionB\x16\n\x14one_of_delete_option\"\xfb\x01\n\ + \x20SelectOptionCellChangesetPayload\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*\n\x10insert_optio\ + n_id\x18\x04\x20\x01(\tH\0R\x0einsertOptionId\x12*\n\x10delete_option_id\ + \x18\x05\x20\x01(\tH\x01R\x0edeleteOptionIdB\x19\n\x17one_of_insert_opti\ + on_idB\x19\n\x17one_of_delete_option_id\"t\n\x13SelectOptionContext\x12'\ + \n\x07options\x18\x01\x20\x03(\x0b2\r.SelectOptionR\x07options\x124\n\ + \x0eselect_options\x18\x02\x20\x03(\x0b2\r.SelectOptionR\rselectOptions*\ + y\n\x11SelectOptionColor\x12\n\n\x06Purple\x10\0\x12\x08\n\x04Pink\x10\ + \x01\x12\r\n\tLightPink\x10\x02\x12\n\n\x06Orange\x10\x03\x12\n\n\x06Yel\ + low\x10\x04\x12\x08\n\x04Lime\x10\x05\x12\t\n\x05Green\x10\x06\x12\x08\n\ + \x04Aqua\x10\x07\x12\x08\n\x04Blue\x10\x08b\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() + }) +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/model/text_description.rs b/frontend/rust-lib/flowy-grid/src/protobuf/model/text_type_option.rs similarity index 82% rename from frontend/rust-lib/flowy-grid/src/protobuf/model/text_description.rs rename to frontend/rust-lib/flowy-grid/src/protobuf/model/text_type_option.rs index ca2d720e14..febc180e03 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/model/text_description.rs +++ b/frontend/rust-lib/flowy-grid/src/protobuf/model/text_type_option.rs @@ -17,14 +17,14 @@ #![allow(trivial_casts)] #![allow(unused_imports)] #![allow(unused_results)] -//! Generated file from `text_description.proto` +//! Generated file from `text_type_option.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 RichTextDescription { +pub struct RichTextTypeOption { // message fields pub format: ::std::string::String, // special fields @@ -32,14 +32,14 @@ pub struct RichTextDescription { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a RichTextDescription { - fn default() -> &'a RichTextDescription { - ::default_instance() +impl<'a> ::std::default::Default for &'a RichTextTypeOption { + fn default() -> &'a RichTextTypeOption { + ::default_instance() } } -impl RichTextDescription { - pub fn new() -> RichTextDescription { +impl RichTextTypeOption { + pub fn new() -> RichTextTypeOption { ::std::default::Default::default() } @@ -70,7 +70,7 @@ impl RichTextDescription { } } -impl ::protobuf::Message for RichTextDescription { +impl ::protobuf::Message for RichTextTypeOption { fn is_initialized(&self) -> bool { true } @@ -136,8 +136,8 @@ impl ::protobuf::Message for RichTextDescription { Self::descriptor_static() } - fn new() -> RichTextDescription { - RichTextDescription::new() + fn new() -> RichTextTypeOption { + RichTextTypeOption::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -146,45 +146,45 @@ impl ::protobuf::Message for RichTextDescription { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "format", - |m: &RichTextDescription| { &m.format }, - |m: &mut RichTextDescription| { &mut m.format }, + |m: &RichTextTypeOption| { &m.format }, + |m: &mut RichTextTypeOption| { &mut m.format }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "RichTextDescription", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "RichTextTypeOption", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static RichTextDescription { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(RichTextDescription::new) + fn default_instance() -> &'static RichTextTypeOption { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(RichTextTypeOption::new) } } -impl ::protobuf::Clear for RichTextDescription { +impl ::protobuf::Clear for RichTextTypeOption { fn clear(&mut self) { self.format.clear(); self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for RichTextDescription { +impl ::std::fmt::Debug for RichTextTypeOption { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for RichTextDescription { +impl ::protobuf::reflect::ProtobufValue for RichTextTypeOption { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x16text_description.proto\"-\n\x13RichTextDescription\x12\x16\n\x06fo\ - rmat\x18\x01\x20\x01(\tR\x06formatb\x06proto3\ + \n\x16text_type_option.proto\",\n\x12RichTextTypeOption\x12\x16\n\x06for\ + mat\x18\x01\x20\x01(\tR\x06formatb\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/cell_entities.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/cell_entities.proto new file mode 100644 index 0000000000..d20ec4e34c --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/cell_entities.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +message CreateSelectOptionPayload { + CellIdentifierPayload cell_identifier = 1; + string option_name = 2; +} +message CellIdentifierPayload { + string grid_id = 1; + string field_id = 2; + string row_id = 3; +} +message SelectOptionName { + string name = 1; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_type_option.proto similarity index 61% rename from frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_description.proto rename to frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_type_option.proto index 7c14ebc075..df721337c7 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_description.proto +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/checkbox_type_option.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -message CheckboxDescription { +message CheckboxTypeOption { bool is_selected = 1; } diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/dart_notification.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/dart_notification.proto index 0262b34477..cbda705483 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/dart_notification.proto +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/dart_notification.proto @@ -2,8 +2,10 @@ syntax = "proto3"; enum GridNotification { Unknown = 0; - GridDidUpdateBlock = 10; - GridDidCreateBlock = 11; - GridDidUpdateCells = 20; - GridDidUpdateFields = 30; + DidCreateBlock = 11; + DidUpdateBlock = 20; + DidUpdateRow = 30; + DidUpdateCell = 31; + DidUpdateGrid = 40; + DidUpdateField = 41; } diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/date_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/date_type_option.proto similarity index 89% rename from frontend/rust-lib/flowy-grid/src/protobuf/proto/date_description.proto rename to frontend/rust-lib/flowy-grid/src/protobuf/proto/date_type_option.proto index 9fe4c4acfd..be42570348 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/date_description.proto +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/date_type_option.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -message DateDescription { +message DateTypeOption { DateFormat date_format = 1; TimeFormat time_format = 2; } diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/event_map.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/event_map.proto index 6c39e618f5..1201bd759e 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/event_map.proto +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/event_map.proto @@ -4,7 +4,18 @@ enum GridEvent { GetGridData = 0; GetGridBlocks = 1; GetFields = 10; - CreateRow = 11; - GetRow = 12; - UpdateCell = 20; + UpdateField = 11; + CreateField = 12; + DeleteField = 13; + SwitchToField = 14; + DuplicateField = 15; + GetEditFieldContext = 16; + NewSelectOption = 30; + GetSelectOptionContext = 31; + ApplySelectOptionChangeset = 32; + CreateRow = 50; + GetRow = 51; + GetCell = 70; + UpdateCell = 71; + ApplySelectOptionCellChangeset = 72; } diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/field_entities.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/field_entities.proto new file mode 100644 index 0000000000..3c670c50af --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/field_entities.proto @@ -0,0 +1,6 @@ +syntax = "proto3"; + +message FieldIdentifierPayload { + string field_id = 1; + string grid_id = 2; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/number_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/number_type_option.proto similarity index 88% rename from frontend/rust-lib/flowy-grid/src/protobuf/proto/number_description.proto rename to frontend/rust-lib/flowy-grid/src/protobuf/proto/number_type_option.proto index 760f6623c4..8057b0c4a6 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/number_description.proto +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/number_type_option.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -message NumberDescription { +message NumberTypeOption { NumberFormat format = 1; uint32 scale = 2; string symbol = 3; diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/row_entities.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/row_entities.proto new file mode 100644 index 0000000000..d09d76e960 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/row_entities.proto @@ -0,0 +1,6 @@ +syntax = "proto3"; + +message RowIdentifierPayload { + string grid_id = 1; + string row_id = 3; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_description.proto deleted file mode 100644 index 7f3ee25661..0000000000 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_description.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -message SingleSelectDescription { - repeated SelectOption options = 1; - bool disable_color = 2; -} -message MultiSelectDescription { - repeated SelectOption options = 1; - bool disable_color = 2; -} -message SelectOption { - string id = 1; - string name = 2; - string color = 3; -} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_type_option.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_type_option.proto new file mode 100644 index 0000000000..aee0adcd5e --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/selection_type_option.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; +import "cell_entities.proto"; + +message SingleSelectTypeOption { + repeated SelectOption options = 1; + bool disable_color = 2; +} +message MultiSelectTypeOption { + repeated SelectOption options = 1; + bool disable_color = 2; +} +message SelectOption { + string id = 1; + string name = 2; + SelectOptionColor color = 3; +} +message SelectOptionChangesetPayload { + CellIdentifierPayload cell_identifier = 1; + oneof one_of_insert_option { SelectOption insert_option = 2; }; + oneof one_of_delete_option { SelectOption delete_option = 3; }; +} +message SelectOptionCellChangesetPayload { + string grid_id = 1; + string row_id = 2; + string field_id = 3; + oneof one_of_insert_option_id { string insert_option_id = 4; }; + oneof one_of_delete_option_id { string delete_option_id = 5; }; +} +message SelectOptionContext { + repeated SelectOption options = 1; + repeated SelectOption select_options = 2; +} +enum SelectOptionColor { + Purple = 0; + Pink = 1; + LightPink = 2; + Orange = 3; + Yellow = 4; + Lime = 5; + Green = 6; + Aqua = 7; + Blue = 8; +} diff --git a/frontend/rust-lib/flowy-grid/src/protobuf/proto/text_description.proto b/frontend/rust-lib/flowy-grid/src/protobuf/proto/text_type_option.proto similarity index 60% rename from frontend/rust-lib/flowy-grid/src/protobuf/proto/text_description.proto rename to frontend/rust-lib/flowy-grid/src/protobuf/proto/text_type_option.proto index c4ee8f8de6..67cfb438ea 100644 --- a/frontend/rust-lib/flowy-grid/src/protobuf/proto/text_description.proto +++ b/frontend/rust-lib/flowy-grid/src/protobuf/proto/text_type_option.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -message RichTextDescription { +message RichTextTypeOption { string format = 1; } diff --git a/frontend/rust-lib/flowy-grid/src/services/block_meta_editor.rs b/frontend/rust-lib/flowy-grid/src/services/block_meta_editor.rs index ca3f99b363..8518a70fb0 100644 --- a/frontend/rust-lib/flowy-grid/src/services/block_meta_editor.rs +++ b/frontend/rust-lib/flowy-grid/src/services/block_meta_editor.rs @@ -1,248 +1,16 @@ -use crate::manager::GridUser; -use crate::services::row::{make_cell, make_row_ids_per_block, GridBlockMetaData}; use bytes::Bytes; - -use crate::dart_notification::{send_dart_notification, GridNotification}; -use dashmap::DashMap; use flowy_error::{FlowyError, FlowyResult}; -use flowy_grid_data_model::entities::{ - FieldMeta, GridBlockId, GridBlockMeta, GridBlockMetaChangeset, RepeatedCell, RowMeta, RowMetaChangeset, RowOrder, -}; -use flowy_revision::disk::SQLiteGridBlockMetaRevisionPersistence; -use flowy_revision::{ - RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder, RevisionPersistence, -}; +use flowy_grid_data_model::entities::{CellMeta, RowMeta, RowMetaChangeset, RowOrder}; +use flowy_revision::{RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder}; use flowy_sync::client_grid::{GridBlockMetaChange, GridBlockMetaPad}; use flowy_sync::entities::revision::Revision; use flowy_sync::util::make_delta_from_revisions; use lib_infra::future::FutureResult; use lib_ot::core::PlainTextAttributes; -use std::collections::HashMap; + use std::sync::Arc; use tokio::sync::RwLock; -type RowId = String; -type BlockId = String; - -pub(crate) struct GridBlockMetaEditorManager { - grid_id: String, - user: Arc, - editor_map: DashMap>, - block_id_by_row_id: DashMap, -} - -impl GridBlockMetaEditorManager { - pub(crate) async fn new(grid_id: &str, user: &Arc, blocks: Vec) -> FlowyResult { - let editor_map = make_block_meta_editor_map(user, blocks).await?; - let user = user.clone(); - let block_id_by_row_id = DashMap::new(); - let grid_id = grid_id.to_owned(); - let manager = Self { - grid_id, - user, - editor_map, - block_id_by_row_id, - }; - Ok(manager) - } - - pub(crate) async fn get_editor(&self, block_id: &str) -> FlowyResult> { - match self.editor_map.get(block_id) { - None => { - tracing::error!("The is a fatal error, block is not exist"); - let editor = Arc::new(make_block_meta_editor(&self.user, block_id).await?); - self.editor_map.insert(block_id.to_owned(), editor.clone()); - Ok(editor) - } - Some(editor) => Ok(editor.clone()), - } - } - - pub(crate) async fn create_row( - &self, - block_id: &str, - row_meta: RowMeta, - start_row_id: Option, - ) -> FlowyResult { - self.block_id_by_row_id - .insert(row_meta.id.clone(), row_meta.block_id.clone()); - let editor = self.get_editor(&row_meta.block_id).await?; - let row_count = editor.create_row(row_meta, start_row_id).await?; - self.notify_did_update_block(block_id).await?; - Ok(row_count) - } - - pub(crate) async fn insert_row( - &self, - rows_by_block_id: HashMap>, - ) -> FlowyResult> { - let mut changesets = vec![]; - for (block_id, row_metas) in rows_by_block_id { - let editor = self.get_editor(&block_id).await?; - let mut row_count = 0; - for row in &row_metas { - self.block_id_by_row_id.insert(row.id.clone(), row.block_id.clone()); - row_count = editor.create_row(row.clone(), None).await?; - } - changesets.push(GridBlockMetaChangeset::from_row_count(&block_id, row_count)); - let _ = self.notify_did_update_block(&block_id).await?; - } - - Ok(changesets) - } - - pub(crate) async fn delete_rows(&self, row_orders: Vec) -> FlowyResult> { - let mut changesets = vec![]; - let row_ids_per_blocks = make_row_ids_per_block(&row_orders); - for row_ids_per_block in row_ids_per_blocks { - let editor = self.get_editor(&row_ids_per_block.block_id).await?; - let row_count = editor.delete_rows(row_ids_per_block.row_ids).await?; - - let changeset = GridBlockMetaChangeset::from_row_count(&row_ids_per_block.block_id, row_count); - changesets.push(changeset); - } - - Ok(changesets) - } - - pub async fn update_row(&self, changeset: RowMetaChangeset) -> FlowyResult<()> { - let editor = self.get_editor_from_row_id(&changeset.row_id).await?; - let _ = editor.update_row(changeset.clone()).await?; - let _ = self.notify_did_update_block(&editor.block_id).await?; - Ok(()) - } - - pub async fn get_row(&self, block_id: &str, row_id: &str) -> FlowyResult>> { - let editor = self.get_editor(block_id).await?; - let mut row_metas = editor.get_row_metas(Some(vec![row_id.to_owned()])).await?; - if row_metas.is_empty() { - Ok(None) - } else { - Ok(row_metas.pop()) - } - } - - pub async fn update_cells(&self, field_metas: &[FieldMeta], changeset: RowMetaChangeset) -> FlowyResult<()> { - let editor = self.get_editor_from_row_id(&changeset.row_id).await?; - let _ = editor.update_row(changeset.clone()).await?; - self.notify_did_update_cells(changeset, field_metas)?; - Ok(()) - } - - pub(crate) async fn get_block_meta_data_from_blocks( - &self, - grid_blocks: Vec, - ) -> FlowyResult> { - let mut snapshots = vec![]; - for grid_block in grid_blocks { - let editor = self.get_editor(&grid_block.block_id).await?; - let row_metas = editor.get_row_metas(None).await?; - row_metas.iter().for_each(|row_meta| { - self.block_id_by_row_id - .insert(row_meta.id.clone(), row_meta.block_id.clone()); - }); - - snapshots.push(GridBlockMetaData { - block_id: grid_block.block_id, - row_metas, - }); - } - Ok(snapshots) - } - - pub(crate) async fn get_block_meta_data(&self, block_ids: &[String]) -> FlowyResult> { - let mut snapshots = vec![]; - for block_id in block_ids { - let editor = self.get_editor(block_id).await?; - let row_metas = editor.get_row_metas(None).await?; - row_metas.iter().for_each(|row_meta| { - self.block_id_by_row_id - .insert(row_meta.id.clone(), row_meta.block_id.clone()); - }); - snapshots.push(GridBlockMetaData { - block_id: block_id.clone(), - row_metas, - }); - } - Ok(snapshots) - } - - async fn get_editor_from_row_id(&self, row_id: &str) -> FlowyResult> { - match self.block_id_by_row_id.get(row_id) { - None => { - let msg = format!( - "Update Row failed. Can't find the corresponding block with row_id: {}", - row_id - ); - Err(FlowyError::internal().context(msg)) - } - Some(block_id) => { - let editor = self.get_editor(&block_id).await?; - Ok(editor) - } - } - } - - async fn notify_did_update_block(&self, block_id: &str) -> FlowyResult<()> { - let block_id = GridBlockId { - value: block_id.to_owned(), - }; - send_dart_notification(&self.grid_id, GridNotification::GridDidUpdateBlock) - .payload(block_id) - .send(); - Ok(()) - } - - fn notify_did_update_cells(&self, changeset: RowMetaChangeset, field_metas: &[FieldMeta]) -> FlowyResult<()> { - let field_meta_map = field_metas - .iter() - .map(|field_meta| (&field_meta.id, field_meta)) - .collect::>(); - - let mut cells = vec![]; - changeset - .cell_by_field_id - .into_iter() - .for_each( - |(field_id, cell_meta)| match make_cell(&field_meta_map, field_id, cell_meta) { - None => {} - Some((_, cell)) => cells.push(cell), - }, - ); - - if !cells.is_empty() { - send_dart_notification(&changeset.row_id, GridNotification::GridDidUpdateCells) - .payload(RepeatedCell::from(cells)) - .send(); - } - Ok(()) - } -} - -async fn make_block_meta_editor_map( - user: &Arc, - blocks: Vec, -) -> FlowyResult>> { - let editor_map = DashMap::new(); - for block in blocks { - let editor = make_block_meta_editor(user, &block.block_id).await?; - editor_map.insert(block.block_id, Arc::new(editor)); - } - - Ok(editor_map) -} - -async fn make_block_meta_editor(user: &Arc, block_id: &str) -> FlowyResult { - let token = user.token()?; - let user_id = user.user_id()?; - let pool = user.db_pool()?; - - let disk_cache = Arc::new(SQLiteGridBlockMetaRevisionPersistence::new(&user_id, pool)); - let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, block_id, disk_cache)); - let rev_manager = RevisionManager::new(&user_id, block_id, rev_persistence); - ClientGridBlockMetaEditor::new(&user_id, &token, block_id, rev_manager).await -} - pub struct ClientGridBlockMetaEditor { user_id: String, pub block_id: String, @@ -273,11 +41,11 @@ impl ClientGridBlockMetaEditor { }) } - async fn create_row(&self, row: RowMeta, start_row_id: Option) -> FlowyResult { + pub(crate) async fn create_row(&self, row: RowMeta, start_row_id: Option) -> FlowyResult { let mut row_count = 0; let _ = self .modify(|pad| { - let change = pad.add_row(row, start_row_id)?; + let change = pad.add_row_meta(row, start_row_id)?; row_count = pad.number_of_rows(); Ok(change) }) @@ -304,16 +72,21 @@ impl ClientGridBlockMetaEditor { } pub async fn get_row_metas(&self, row_ids: Option>) -> FlowyResult>> { - let row_metas = self.pad.read().await.get_rows(row_ids)?; + let row_metas = self.pad.read().await.get_row_metas(&row_ids)?; Ok(row_metas) } - pub async fn get_row_orders(&self, row_ids: Option>) -> FlowyResult> { + pub async fn get_cell_metas(&self, field_id: &str, row_ids: &Option>) -> FlowyResult> { + let cell_metas = self.pad.read().await.get_cell_metas(field_id, row_ids)?; + Ok(cell_metas) + } + + pub async fn get_row_orders(&self, row_ids: &Option>) -> FlowyResult> { let row_orders = self .pad .read() .await - .get_rows(row_ids)? + .get_row_metas(row_ids)? .iter() .map(RowOrder::from) .collect::>(); diff --git a/frontend/rust-lib/flowy-grid/src/services/block_meta_manager.rs b/frontend/rust-lib/flowy-grid/src/services/block_meta_manager.rs new file mode 100644 index 0000000000..104b6fbbdb --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/block_meta_manager.rs @@ -0,0 +1,248 @@ +use crate::dart_notification::{send_dart_notification, GridNotification}; +use crate::manager::GridUser; +use crate::services::block_meta_editor::ClientGridBlockMetaEditor; +use crate::services::persistence::block_index::BlockIndexPersistence; +use crate::services::row::{make_block_row_ids, make_rows_from_row_metas, GridBlockSnapshot}; + +use dashmap::DashMap; +use flowy_error::FlowyResult; +use flowy_grid_data_model::entities::{ + CellMeta, CellMetaChangeset, CellNotificationData, FieldMeta, GridBlockMeta, GridBlockMetaChangeset, + GridBlockOrder, RowMeta, RowMetaChangeset, RowOrder, +}; +use flowy_revision::disk::SQLiteGridBlockMetaRevisionPersistence; +use flowy_revision::{RevisionManager, RevisionPersistence}; +use std::collections::HashMap; +use std::sync::Arc; + +pub(crate) struct GridBlockMetaEditorManager { + grid_id: String, + user: Arc, + editor_map: DashMap>, + persistence: Arc, +} + +impl GridBlockMetaEditorManager { + pub(crate) async fn new( + grid_id: &str, + user: &Arc, + blocks: Vec, + persistence: Arc, + ) -> FlowyResult { + let editor_map = make_block_meta_editor_map(user, blocks).await?; + let user = user.clone(); + let grid_id = grid_id.to_owned(); + let manager = Self { + grid_id, + user, + editor_map, + persistence, + }; + Ok(manager) + } + + // #[tracing::instrument(level = "trace", skip(self))] + pub(crate) async fn get_editor(&self, block_id: &str) -> FlowyResult> { + debug_assert!(!block_id.is_empty()); + match self.editor_map.get(block_id) { + None => { + tracing::error!("The is a fatal error, block is not exist"); + let editor = Arc::new(make_block_meta_editor(&self.user, block_id).await?); + self.editor_map.insert(block_id.to_owned(), editor.clone()); + Ok(editor) + } + Some(editor) => Ok(editor.clone()), + } + } + + async fn get_editor_from_row_id(&self, row_id: &str) -> FlowyResult> { + let block_id = self.persistence.get_block_id(row_id)?; + Ok(self.get_editor(&block_id).await?) + } + + pub(crate) async fn create_row( + &self, + block_id: &str, + row_meta: RowMeta, + start_row_id: Option, + ) -> FlowyResult { + let _ = self.persistence.insert_or_update(&row_meta.block_id, &row_meta.id)?; + let editor = self.get_editor(&row_meta.block_id).await?; + let row_count = editor.create_row(row_meta, start_row_id).await?; + self.notify_block_did_update_row(block_id).await?; + Ok(row_count) + } + + pub(crate) async fn insert_row( + &self, + rows_by_block_id: HashMap>, + ) -> FlowyResult> { + let mut changesets = vec![]; + for (block_id, row_metas) in rows_by_block_id { + let editor = self.get_editor(&block_id).await?; + let mut row_count = 0; + for row in &row_metas { + let _ = self.persistence.insert_or_update(&row.block_id, &row.id)?; + row_count = editor.create_row(row.clone(), None).await?; + } + changesets.push(GridBlockMetaChangeset::from_row_count(&block_id, row_count)); + let _ = self.notify_block_did_update_row(&block_id).await?; + } + + Ok(changesets) + } + + pub(crate) async fn delete_rows(&self, row_orders: Vec) -> FlowyResult> { + let mut changesets = vec![]; + for block_row_ids in make_block_row_ids(&row_orders) { + let editor = self.get_editor(&block_row_ids.block_id).await?; + let row_count = editor.delete_rows(block_row_ids.row_ids).await?; + + let changeset = GridBlockMetaChangeset::from_row_count(&block_row_ids.block_id, row_count); + changesets.push(changeset); + } + + Ok(changesets) + } + + pub async fn update_row(&self, changeset: RowMetaChangeset) -> FlowyResult<()> { + let editor = self.get_editor_from_row_id(&changeset.row_id).await?; + let _ = editor.update_row(changeset.clone()).await?; + let _ = self.notify_block_did_update_row(&editor.block_id).await?; + Ok(()) + } + + pub async fn update_cell(&self, changeset: CellMetaChangeset) -> 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(); + let _ = editor.update_row(row_changeset).await?; + + let cell_notification_data = CellNotificationData { + grid_id: changeset.grid_id, + field_id: changeset.field_id, + row_id: changeset.row_id, + content: changeset.data, + }; + self.notify_did_update_cell(cell_notification_data).await?; + Ok(()) + } + + pub async fn get_row_meta(&self, row_id: &str) -> FlowyResult>> { + let editor = self.get_editor_from_row_id(row_id).await?; + let row_ids = vec![row_id.to_owned()]; + let mut row_metas = editor.get_row_metas(Some(row_ids)).await?; + if row_metas.is_empty() { + Ok(None) + } else { + Ok(row_metas.pop()) + } + } + + pub(crate) async fn make_block_snapshots(&self, block_ids: Vec) -> FlowyResult> { + let mut snapshots = vec![]; + for block_id in block_ids { + let editor = self.get_editor(&block_id).await?; + let row_metas = editor.get_row_metas(None).await?; + snapshots.push(GridBlockSnapshot { block_id, row_metas }); + } + Ok(snapshots) + } + + // Optimization: Using the shared memory(Arc, Cow,etc.) to reduce memory usage. + #[allow(dead_code)] + pub async fn get_cell_metas( + &self, + block_ids: Vec, + field_id: &str, + row_ids: Option>, + ) -> FlowyResult> { + let mut block_cell_metas = vec![]; + for block_id in block_ids { + let editor = self.get_editor(&block_id).await?; + let cell_metas = editor.get_cell_metas(field_id, &row_ids).await?; + block_cell_metas.extend(cell_metas); + } + Ok(block_cell_metas) + } + + async fn notify_block_did_update_row(&self, block_id: &str) -> FlowyResult<()> { + let block_order: GridBlockOrder = block_id.into(); + send_dart_notification(&self.grid_id, GridNotification::DidUpdateBlock) + .payload(block_order) + .send(); + Ok(()) + } + + async fn notify_did_update_cell(&self, data: CellNotificationData) -> FlowyResult<()> { + let id = format!("{}:{}", data.row_id, data.field_id); + send_dart_notification(&id, GridNotification::DidUpdateCell) + .payload(data) + .send(); + Ok(()) + } + + #[allow(dead_code)] + async fn notify_did_update_row(&self, row_id: &str, field_metas: &[FieldMeta]) -> FlowyResult<()> { + match self.get_row_meta(row_id).await? { + None => {} + Some(row_meta) => { + let row_metas = vec![row_meta]; + if let Some(row) = make_rows_from_row_metas(field_metas, &row_metas).pop() { + send_dart_notification(row_id, GridNotification::DidUpdateRow) + .payload(row) + .send(); + } + } + } + Ok(()) + + // + // let field_meta_map = field_metas + // .iter() + // .map(|field_meta| (&field_meta.id, field_meta)) + // .collect::>(); + // + // let mut cells = vec![]; + // changeset + // .cell_by_field_id + // .into_iter() + // .for_each( + // |(field_id, cell_meta)| match make_cell_by_field_id(&field_meta_map, field_id, cell_meta) { + // None => {} + // Some((_, cell)) => cells.push(cell), + // }, + // ); + // + // if !cells.is_empty() { + // send_dart_notification(&changeset.row_id, GridNotification::DidUpdateRow) + // .payload(RepeatedCell::from(cells)) + // .send(); + // } + // Ok(()) + } +} + +async fn make_block_meta_editor_map( + user: &Arc, + blocks: Vec, +) -> FlowyResult>> { + let editor_map = DashMap::new(); + for block in blocks { + let editor = make_block_meta_editor(user, &block.block_id).await?; + editor_map.insert(block.block_id, Arc::new(editor)); + } + + Ok(editor_map) +} + +async fn make_block_meta_editor(user: &Arc, block_id: &str) -> FlowyResult { + let token = user.token()?; + let user_id = user.user_id()?; + let pool = user.db_pool()?; + + let disk_cache = Arc::new(SQLiteGridBlockMetaRevisionPersistence::new(&user_id, pool)); + let rev_persistence = Arc::new(RevisionPersistence::new(&user_id, block_id, disk_cache)); + let rev_manager = RevisionManager::new(&user_id, block_id, rev_persistence); + ClientGridBlockMetaEditor::new(&user_id, &token, block_id, rev_manager).await +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/builder/mod.rs b/frontend/rust-lib/flowy-grid/src/services/cell/builder/mod.rs deleted file mode 100644 index 6812d2c39d..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/cell/builder/mod.rs +++ /dev/null @@ -1,137 +0,0 @@ -use crate::services::cell::*; -use crate::services::field::TypeOptionsBuilder; -use flowy_grid_data_model::entities::FieldType; - -// Text -#[derive(Default)] -pub struct RichTextTypeOptionsBuilder(RichTextDescription); - -impl TypeOptionsBuilder for RichTextTypeOptionsBuilder { - fn field_type(&self) -> FieldType { - self.0.field_type() - } - - fn build(&self) -> String { - self.0.clone().into() - } -} - -// Number -#[derive(Default)] -pub struct NumberTypeOptionsBuilder(NumberDescription); - -impl NumberTypeOptionsBuilder { - pub fn name(mut self, name: &str) -> Self { - self.0.name = name.to_string(); - self - } - - pub fn set_format(mut self, format: NumberFormat) -> Self { - self.0.set_format(format); - self - } - - pub fn scale(mut self, scale: u32) -> Self { - self.0.scale = scale; - self - } - - pub fn positive(mut self, positive: bool) -> Self { - self.0.sign_positive = positive; - self - } -} - -impl TypeOptionsBuilder for NumberTypeOptionsBuilder { - fn field_type(&self) -> FieldType { - self.0.field_type() - } - - fn build(&self) -> String { - self.0.clone().into() - } -} - -// Date -#[derive(Default)] -pub struct DateTypeOptionsBuilder(DateDescription); -impl DateTypeOptionsBuilder { - pub fn date_format(mut self, date_format: DateFormat) -> Self { - self.0.date_format = date_format; - self - } - - pub fn time_format(mut self, time_format: TimeFormat) -> Self { - self.0.time_format = time_format; - self - } -} -impl TypeOptionsBuilder for DateTypeOptionsBuilder { - fn field_type(&self) -> FieldType { - self.0.field_type() - } - - fn build(&self) -> String { - self.0.clone().into() - } -} - -// Single Select -#[derive(Default)] -pub struct SingleSelectTypeOptionsBuilder(SingleSelectDescription); - -impl SingleSelectTypeOptionsBuilder { - pub fn option(mut self, opt: SelectOption) -> Self { - self.0.options.push(opt); - self - } -} -impl TypeOptionsBuilder for SingleSelectTypeOptionsBuilder { - fn field_type(&self) -> FieldType { - self.0.field_type() - } - - fn build(&self) -> String { - self.0.clone().into() - } -} - -// Multi Select -#[derive(Default)] -pub struct MultiSelectTypeOptionsBuilder(MultiSelectDescription); - -impl MultiSelectTypeOptionsBuilder { - pub fn option(mut self, opt: SelectOption) -> Self { - self.0.options.push(opt); - self - } -} - -impl TypeOptionsBuilder for MultiSelectTypeOptionsBuilder { - fn field_type(&self) -> FieldType { - self.0.field_type() - } - - fn build(&self) -> String { - self.0.clone().into() - } -} - -// Checkbox -#[derive(Default)] -pub struct CheckboxTypeOptionsBuilder(CheckboxDescription); -impl CheckboxTypeOptionsBuilder { - pub fn set_selected(mut self, is_selected: bool) -> Self { - self.0.is_selected = is_selected; - self - } -} -impl TypeOptionsBuilder for CheckboxTypeOptionsBuilder { - fn field_type(&self) -> FieldType { - self.0.field_type() - } - - fn build(&self) -> String { - self.0.clone().into() - } -} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/cell_entities.rs b/frontend/rust-lib/flowy-grid/src/services/cell/cell_entities.rs new file mode 100644 index 0000000000..28465d21e3 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/cell/cell_entities.rs @@ -0,0 +1,69 @@ +use flowy_derive::ProtoBuf; +use flowy_error::ErrorCode; +use flowy_grid_data_model::parser::{NotEmptyStr, NotEmptyUuid}; + +#[derive(ProtoBuf, Default)] +pub struct CreateSelectOptionPayload { + #[pb(index = 1)] + pub cell_identifier: CellIdentifierPayload, + + #[pb(index = 2)] + pub option_name: String, +} + +pub struct CreateSelectOptionParams { + pub cell_identifier: CellIdentifier, + pub option_name: String, +} + +impl TryInto for CreateSelectOptionPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let option_name = NotEmptyStr::parse(self.option_name).map_err(|_| ErrorCode::SelectOptionNameIsEmpty)?; + let cell_identifier = self.cell_identifier.try_into()?; + Ok(CreateSelectOptionParams { + cell_identifier, + option_name: option_name.0, + }) + } +} + +#[derive(Debug, Clone, Default, ProtoBuf)] +pub struct CellIdentifierPayload { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2)] + pub field_id: String, + + #[pb(index = 3)] + pub row_id: String, +} + +pub struct CellIdentifier { + pub grid_id: String, + pub field_id: String, + pub row_id: String, +} + +impl TryInto for CellIdentifierPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + 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)?; + Ok(CellIdentifier { + grid_id: grid_id.0, + field_id: field_id.0, + row_id: row_id.0, + }) + } +} + +#[derive(ProtoBuf, Default)] +pub struct SelectOptionName { + #[pb(index = 1)] + pub name: String, +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/checkbox_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/checkbox_description.rs deleted file mode 100644 index 87bd7f848c..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/cell/description/checkbox_description.rs +++ /dev/null @@ -1,60 +0,0 @@ -use crate::impl_from_and_to_type_option; -use crate::services::row::CellDataSerde; -use flowy_derive::ProtoBuf; -use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{FieldMeta, FieldType}; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize, Default, ProtoBuf)] -pub struct CheckboxDescription { - #[pb(index = 1)] - pub is_selected: bool, -} -impl_from_and_to_type_option!(CheckboxDescription, FieldType::Checkbox); - -impl CellDataSerde for CheckboxDescription { - fn deserialize_cell_data(&self, data: String) -> String { - data - } - - fn serialize_cell_data(&self, data: &str) -> Result { - let s = match string_to_bool(data) { - true => "1", - false => "0", - }; - Ok(s.to_owned()) - } -} - -fn string_to_bool(bool_str: &str) -> bool { - let lower_case_str: &str = &bool_str.to_lowercase(); - match lower_case_str { - "1" => true, - "true" => true, - "yes" => true, - "0" => false, - "false" => false, - "no" => false, - _ => false, - } -} - -#[cfg(test)] -mod tests { - use crate::services::cell::CheckboxDescription; - use crate::services::row::CellDataSerde; - - #[test] - fn checkout_box_description_test() { - let description = CheckboxDescription::default(); - assert_eq!(description.serialize_cell_data("true").unwrap(), "1".to_owned()); - assert_eq!(description.serialize_cell_data("1").unwrap(), "1".to_owned()); - assert_eq!(description.serialize_cell_data("yes").unwrap(), "1".to_owned()); - - assert_eq!(description.serialize_cell_data("false").unwrap(), "0".to_owned()); - assert_eq!(description.serialize_cell_data("no").unwrap(), "0".to_owned()); - assert_eq!(description.serialize_cell_data("123").unwrap(), "0".to_owned()); - - assert_eq!(description.deserialize_cell_data("1".to_owned()), "1".to_owned()); - } -} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/mod.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/mod.rs deleted file mode 100644 index faadd45f8c..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/cell/description/mod.rs +++ /dev/null @@ -1,11 +0,0 @@ -mod checkbox_description; -mod date_description; -mod number_description; -mod selection_description; -mod text_description; - -pub use checkbox_description::*; -pub use date_description::*; -pub use number_description::*; -pub use selection_description::*; -pub use text_description::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/number_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/number_description.rs deleted file mode 100644 index c3468786df..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/cell/description/number_description.rs +++ /dev/null @@ -1,269 +0,0 @@ -use crate::impl_from_and_to_type_option; -use crate::services::row::CellDataSerde; -use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; -use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{FieldMeta, FieldType}; -use lazy_static::lazy_static; -use rust_decimal::prelude::Zero; -use rust_decimal::Decimal; -use rusty_money::iso::{Currency, CNY, EUR, USD}; -use serde::{Deserialize, Serialize}; - -use std::str::FromStr; -use strum::IntoEnumIterator; -use strum_macros::EnumIter; - -lazy_static! { - static ref STRIP_SYMBOL: Vec = make_strip_symbol(); -} - -#[derive(Clone, Copy, Debug, EnumIter, Serialize, Deserialize, ProtoBuf_Enum)] -pub enum NumberFormat { - Number = 0, - USD = 1, - CNY = 2, - EUR = 3, -} - -impl std::default::Default for NumberFormat { - fn default() -> Self { - NumberFormat::Number - } -} - -impl NumberFormat { - pub fn symbol(&self) -> String { - match self { - NumberFormat::Number => "".to_string(), - NumberFormat::USD => USD.symbol.to_string(), - NumberFormat::CNY => CNY.symbol.to_string(), - NumberFormat::EUR => EUR.symbol.to_string(), - } - } - - #[allow(dead_code)] - pub fn code(&self) -> String { - match self { - NumberFormat::Number => "".to_string(), - NumberFormat::USD => USD.iso_alpha_code.to_string(), - NumberFormat::CNY => CNY.iso_alpha_code.to_string(), - NumberFormat::EUR => EUR.iso_alpha_code.to_string(), - } - } -} - -// Number -#[derive(Clone, Debug, Serialize, Deserialize, ProtoBuf)] -pub struct NumberDescription { - #[pb(index = 1)] - pub format: NumberFormat, - - #[pb(index = 2)] - pub scale: u32, - - #[pb(index = 3)] - pub symbol: String, - - #[pb(index = 4)] - pub sign_positive: bool, - - #[pb(index = 5)] - pub name: String, -} -impl_from_and_to_type_option!(NumberDescription, FieldType::Number); - -impl std::default::Default for NumberDescription { - fn default() -> Self { - let format = NumberFormat::default(); - let symbol = format.symbol(); - NumberDescription { - format, - scale: 0, - symbol, - sign_positive: true, - name: "Number".to_string(), - } - } -} - -impl NumberDescription { - pub fn set_format(&mut self, format: NumberFormat) { - self.format = format; - self.symbol = format.symbol(); - } - - fn decimal_from_str(&self, s: &str) -> Decimal { - let mut decimal = Decimal::from_str(s).unwrap_or_else(|_| Decimal::zero()); - match decimal.set_scale(self.scale) { - Ok(_) => {} - Err(e) => { - tracing::error!("Set decimal scale failed: {:?}", e); - } - } - decimal.set_sign_positive(self.sign_positive); - decimal - } - - fn money_from_str(&self, s: &str, currency: &'static Currency) -> String { - let decimal = self.decimal_from_str(s); - let money = rusty_money::Money::from_decimal(decimal, currency); - money.to_string() - } - - fn strip_symbol(&self, s: &str) -> String { - let mut s = String::from(s); - if !s.chars().all(char::is_numeric) { - s.retain(|c| !STRIP_SYMBOL.contains(&c.to_string())); - } - s - } -} - -impl CellDataSerde for NumberDescription { - fn deserialize_cell_data(&self, data: String) -> String { - match self.format { - NumberFormat::Number => data, - NumberFormat::USD => self.money_from_str(&data, USD), - NumberFormat::CNY => self.money_from_str(&data, CNY), - NumberFormat::EUR => self.money_from_str(&data, EUR), - } - } - - fn serialize_cell_data(&self, data: &str) -> Result { - let data = self.strip_symbol(data); - - if !data.chars().all(char::is_numeric) { - return Err(FlowyError::invalid_data().context("Should only contain numbers")); - } - Ok(data) - } -} - -fn make_strip_symbol() -> Vec { - let mut symbols = vec![",".to_owned(), ".".to_owned()]; - for format in NumberFormat::iter() { - symbols.push(format.symbol()); - } - symbols -} - -#[cfg(test)] -mod tests { - use crate::services::cell::{NumberDescription, NumberFormat}; - use crate::services::row::CellDataSerde; - use strum::IntoEnumIterator; - - #[test] - fn number_description_test() { - let mut description = NumberDescription::default(); - assert_eq!(description.serialize_cell_data("Â¥18,443").unwrap(), "18443".to_owned()); - assert_eq!(description.serialize_cell_data("$18,443").unwrap(), "18443".to_owned()); - assert_eq!(description.serialize_cell_data("€18.443").unwrap(), "18443".to_owned()); - - for format in NumberFormat::iter() { - description.format = format; - match format { - NumberFormat::Number => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "18443".to_owned() - ); - } - NumberFormat::USD => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "$18,443".to_owned() - ); - } - NumberFormat::CNY => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "Â¥18,443".to_owned() - ); - } - NumberFormat::EUR => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "€18.443".to_owned() - ); - } - } - } - } - - #[test] - fn number_description_scale_test() { - let mut description = NumberDescription { - scale: 1, - ..Default::default() - }; - - for format in NumberFormat::iter() { - description.format = format; - match format { - NumberFormat::Number => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "18443".to_owned() - ); - } - NumberFormat::USD => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "$1,844.3".to_owned() - ); - } - NumberFormat::CNY => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "Â¥1,844.3".to_owned() - ); - } - NumberFormat::EUR => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "€1.844,3".to_owned() - ); - } - } - } - } - - #[test] - fn number_description_sign_test() { - let mut description = NumberDescription { - sign_positive: false, - ..Default::default() - }; - - for format in NumberFormat::iter() { - description.format = format; - match format { - NumberFormat::Number => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "18443".to_owned() - ); - } - NumberFormat::USD => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "-$18,443".to_owned() - ); - } - NumberFormat::CNY => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "-Â¥18,443".to_owned() - ); - } - NumberFormat::EUR => { - assert_eq!( - description.deserialize_cell_data("18443".to_owned()), - "-€18.443".to_owned() - ); - } - } - } - } -} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/selection_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/selection_description.rs deleted file mode 100644 index 75a2d9feb2..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/cell/description/selection_description.rs +++ /dev/null @@ -1,127 +0,0 @@ -use crate::impl_from_and_to_type_option; -use crate::services::row::CellDataSerde; -use crate::services::util::*; -use flowy_derive::ProtoBuf; -use flowy_error::{FlowyError, FlowyResult}; -use flowy_grid_data_model::entities::{FieldMeta, FieldType}; -use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -pub const SELECTION_IDS_SEPARATOR: &str = ","; - -// Single select -#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] -pub struct SingleSelectDescription { - #[pb(index = 1)] - pub options: Vec, - - #[pb(index = 2)] - pub disable_color: bool, -} -impl_from_and_to_type_option!(SingleSelectDescription, FieldType::SingleSelect); - -impl CellDataSerde for SingleSelectDescription { - fn deserialize_cell_data(&self, data: String) -> String { - data - } - - fn serialize_cell_data(&self, data: &str) -> Result { - single_select_option_id_from_data(data.to_owned()) - } -} - -// Multiple select -#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] -pub struct MultiSelectDescription { - #[pb(index = 1)] - pub options: Vec, - - #[pb(index = 2)] - pub disable_color: bool, -} -impl_from_and_to_type_option!(MultiSelectDescription, FieldType::MultiSelect); -impl CellDataSerde for MultiSelectDescription { - fn deserialize_cell_data(&self, data: String) -> String { - data - } - - fn serialize_cell_data(&self, data: &str) -> Result { - multi_select_option_id_from_data(data.to_owned()) - } -} - -fn single_select_option_id_from_data(data: String) -> FlowyResult { - let select_option_ids = select_option_ids(data)?; - if select_option_ids.is_empty() { - return Ok("".to_owned()); - } - - Ok(select_option_ids.split_first().unwrap().0.to_string()) -} - -fn multi_select_option_id_from_data(data: String) -> FlowyResult { - let select_option_ids = select_option_ids(data)?; - Ok(select_option_ids.join(SELECTION_IDS_SEPARATOR)) -} - -fn select_option_ids(mut data: String) -> FlowyResult> { - data.retain(|c| !c.is_whitespace()); - let select_option_ids = data.split(SELECTION_IDS_SEPARATOR).collect::>(); - if select_option_ids - .par_iter() - .find_first(|option_id| match Uuid::parse_str(option_id) { - Ok(_) => false, - Err(e) => { - tracing::error!("{}", e); - true - } - }) - .is_some() - { - let msg = format!( - "Invalid selection id string: {}. It should consist of the uuid string and separated by comma", - data - ); - return Err(FlowyError::internal().context(msg)); - } - Ok(select_option_ids.iter().map(|id| id.to_string()).collect::>()) -} - -#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] -pub struct SelectOption { - #[pb(index = 1)] - pub id: String, - - #[pb(index = 2)] - pub name: String, - - #[pb(index = 3)] - pub color: String, -} - -impl SelectOption { - pub fn new(name: &str) -> Self { - SelectOption { - id: uuid(), - name: name.to_owned(), - color: "".to_string(), - } - } -} - -#[cfg(test)] -mod tests { - use crate::services::cell::{MultiSelectDescription, SingleSelectDescription}; - use crate::services::row::CellDataSerde; - - #[test] - #[should_panic] - fn selection_description_test() { - let description = SingleSelectDescription::default(); - assert_eq!(description.serialize_cell_data("1,2,3").unwrap(), "1".to_owned()); - - let description = MultiSelectDescription::default(); - assert_eq!(description.serialize_cell_data("1,2,3").unwrap(), "1,2,3".to_owned()); - } -} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/text_description.rs b/frontend/rust-lib/flowy-grid/src/services/cell/description/text_description.rs deleted file mode 100644 index 539b82402c..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/cell/description/text_description.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::impl_from_and_to_type_option; -use crate::services::row::CellDataSerde; - -use flowy_derive::ProtoBuf; -use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{FieldMeta, FieldType}; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)] -pub struct RichTextDescription { - #[pb(index = 1)] - pub format: String, -} -impl_from_and_to_type_option!(RichTextDescription, FieldType::RichText); - -impl CellDataSerde for RichTextDescription { - fn deserialize_cell_data(&self, data: String) -> String { - data - } - - fn serialize_cell_data(&self, data: &str) -> Result { - let data = data.to_owned(); - if data.len() > 10000 { - Err(FlowyError::text_too_long().context("The len of the text should not be more than 10000")) - } else { - Ok(data) - } - } -} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/mod.rs b/frontend/rust-lib/flowy-grid/src/services/cell/mod.rs index 0c28db7789..d2541866be 100644 --- a/frontend/rust-lib/flowy-grid/src/services/cell/mod.rs +++ b/frontend/rust-lib/flowy-grid/src/services/cell/mod.rs @@ -1,5 +1,3 @@ -mod builder; -mod description; +pub(crate) mod cell_entities; -pub use builder::*; -pub use description::*; +pub use cell_entities::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs b/frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs index 15f5b805d9..9a654d4c43 100644 --- a/frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs +++ b/frontend/rust-lib/flowy-grid/src/services/field/field_builder.rs @@ -1,16 +1,43 @@ -use flowy_grid_data_model::entities::{FieldMeta, FieldType}; +use crate::services::field::type_options::*; +use bytes::Bytes; +use flowy_grid_data_model::entities::{Field, FieldMeta, FieldType, TypeOptionDataByFieldTypeId, TypeOptionDataEntry}; pub struct FieldBuilder { field_meta: FieldMeta, - type_options_builder: Box, + type_option_builder: Box, } +pub type BoxTypeOptionBuilder = Box; + impl FieldBuilder { - pub fn new(type_options_builder: T) -> Self { - let field_meta = FieldMeta::new("Name", "", FieldType::RichText); + pub fn new>(type_option_builder: T) -> Self { + let type_option_builder = type_option_builder.into(); + let field_meta = FieldMeta::new("", "", type_option_builder.field_type()); Self { field_meta, - type_options_builder: Box::new(type_options_builder), + type_option_builder, + } + } + + pub fn from_field_type(field_type: &FieldType) -> Self { + let type_option_builder = default_type_option_builder_from_type(field_type); + Self::new(type_option_builder) + } + + pub fn from_field(field: Field, type_option_builder: Box) -> Self { + let field_meta = FieldMeta { + id: field.id, + name: field.name, + desc: field.desc, + field_type: field.field_type, + frozen: field.frozen, + visibility: field.visibility, + width: field.width, + type_option_by_field_type_id: TypeOptionDataByFieldTypeId::default(), + }; + Self { + field_meta, + type_option_builder, } } @@ -24,11 +51,6 @@ impl FieldBuilder { self } - pub fn field_type(mut self, field_type: FieldType) -> Self { - self.field_meta.field_type = field_type; - self - } - pub fn visibility(mut self, visibility: bool) -> Self { self.field_meta.visibility = visibility; self @@ -44,16 +66,51 @@ impl FieldBuilder { self } - pub fn build(mut self) -> FieldMeta { - assert_eq!(self.field_meta.field_type, self.type_options_builder.field_type()); - - let type_options = self.type_options_builder.build(); - self.field_meta.type_options = type_options; - self.field_meta + pub fn build(self) -> FieldMeta { + debug_assert_eq!(self.field_meta.field_type, self.type_option_builder.field_type()); + let mut field_meta = self.field_meta; + field_meta.insert_type_option_entry(self.type_option_builder.entry()); + field_meta } } -pub trait TypeOptionsBuilder { +pub trait TypeOptionBuilder { fn field_type(&self) -> FieldType; - fn build(&self) -> String; + fn entry(&self) -> &dyn TypeOptionDataEntry; +} + +pub fn default_type_option_builder_from_type(field_type: &FieldType) -> Box { + let s: String = match field_type { + FieldType::RichText => RichTextTypeOption::default().into(), + FieldType::Number => NumberTypeOption::default().into(), + FieldType::DateTime => DateTypeOption::default().into(), + FieldType::SingleSelect => SingleSelectTypeOption::default().into(), + FieldType::MultiSelect => MultiSelectTypeOption::default().into(), + FieldType::Checkbox => CheckboxTypeOption::default().into(), + }; + + type_option_builder_from_json_str(&s, field_type) +} + +pub fn type_option_builder_from_json_str(s: &str, field_type: &FieldType) -> Box { + match field_type { + FieldType::RichText => Box::new(RichTextTypeOptionBuilder::from_json_str(s)), + FieldType::Number => Box::new(NumberTypeOptionBuilder::from_json_str(s)), + FieldType::DateTime => Box::new(DateTypeOptionBuilder::from_json_str(s)), + FieldType::SingleSelect => Box::new(SingleSelectTypeOptionBuilder::from_json_str(s)), + FieldType::MultiSelect => Box::new(MultiSelectTypeOptionBuilder::from_json_str(s)), + FieldType::Checkbox => Box::new(CheckboxTypeOptionBuilder::from_json_str(s)), + } +} + +pub fn type_option_builder_from_bytes>(bytes: T, field_type: &FieldType) -> Box { + let bytes = bytes.into(); + match field_type { + FieldType::RichText => Box::new(RichTextTypeOptionBuilder::from_protobuf_bytes(bytes)), + FieldType::Number => Box::new(NumberTypeOptionBuilder::from_protobuf_bytes(bytes)), + FieldType::DateTime => Box::new(DateTypeOptionBuilder::from_protobuf_bytes(bytes)), + FieldType::SingleSelect => Box::new(SingleSelectTypeOptionBuilder::from_protobuf_bytes(bytes)), + FieldType::MultiSelect => Box::new(MultiSelectTypeOptionBuilder::from_protobuf_bytes(bytes)), + FieldType::Checkbox => Box::new(CheckboxTypeOptionBuilder::from_protobuf_bytes(bytes)), + } } diff --git a/frontend/rust-lib/flowy-grid/src/services/field/field_entities.rs b/frontend/rust-lib/flowy-grid/src/services/field/field_entities.rs new file mode 100644 index 0000000000..b8ac13f773 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/field_entities.rs @@ -0,0 +1,30 @@ +use flowy_derive::ProtoBuf; +use flowy_error::ErrorCode; +use flowy_grid_data_model::parser::NotEmptyUuid; + +#[derive(Debug, Clone, Default, ProtoBuf)] +pub struct FieldIdentifierPayload { + #[pb(index = 1)] + pub field_id: String, + + #[pb(index = 2)] + pub grid_id: String, +} + +pub struct FieldIdentifier { + pub field_id: String, + pub grid_id: String, +} + +impl TryInto for FieldIdentifierPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + let field_id = NotEmptyUuid::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?; + Ok(FieldIdentifier { + grid_id: grid_id.0, + field_id: field_id.0, + }) + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/field/mod.rs b/frontend/rust-lib/flowy-grid/src/services/field/mod.rs index 50d069cf9b..89a1f05c57 100644 --- a/frontend/rust-lib/flowy-grid/src/services/field/mod.rs +++ b/frontend/rust-lib/flowy-grid/src/services/field/mod.rs @@ -1,3 +1,7 @@ mod field_builder; +pub(crate) mod field_entities; +pub(crate) mod type_options; pub use field_builder::*; +pub use field_entities::*; +pub use type_options::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/field/type_options/checkbox_type_option.rs b/frontend/rust-lib/flowy-grid/src/services/field/type_options/checkbox_type_option.rs new file mode 100644 index 0000000000..b3e1eb37f9 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/type_options/checkbox_type_option.rs @@ -0,0 +1,116 @@ +use crate::impl_type_option; +use crate::services::field::{BoxTypeOptionBuilder, TypeOptionBuilder}; +use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellData}; +use bytes::Bytes; +use flowy_derive::ProtoBuf; +use flowy_error::FlowyError; +use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry}; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; + +#[derive(Default)] +pub struct CheckboxTypeOptionBuilder(CheckboxTypeOption); +impl_into_box_type_option_builder!(CheckboxTypeOptionBuilder); +impl_builder_from_json_str_and_from_bytes!(CheckboxTypeOptionBuilder, CheckboxTypeOption); + +impl CheckboxTypeOptionBuilder { + pub fn set_selected(mut self, is_selected: bool) -> Self { + self.0.is_selected = is_selected; + self + } +} + +impl TypeOptionBuilder for CheckboxTypeOptionBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn entry(&self) -> &dyn TypeOptionDataEntry { + &self.0 + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default, ProtoBuf)] +pub struct CheckboxTypeOption { + #[pb(index = 1)] + pub is_selected: bool, +} +impl_type_option!(CheckboxTypeOption, FieldType::Checkbox); + +const YES: &str = "Yes"; +const NO: &str = "No"; + +impl CellDataOperation for CheckboxTypeOption { + fn decode_cell_data(&self, data: String, _field_meta: &FieldMeta) -> String { + if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&data) { + if !type_option_cell_data.is_checkbox() { + return String::new(); + } + let cell_data = type_option_cell_data.data; + if cell_data == YES || cell_data == NO { + return cell_data; + } + } + + String::new() + } + + fn apply_changeset>( + &self, + changeset: T, + _cell_meta: Option, + ) -> Result { + let changeset = changeset.into(); + let s = match string_to_bool(&changeset) { + true => YES, + false => NO, + }; + Ok(TypeOptionCellData::new(s, self.field_type()).json()) + } +} + +fn string_to_bool(bool_str: &str) -> bool { + let lower_case_str: &str = &bool_str.to_lowercase(); + match lower_case_str { + "1" => true, + "true" => true, + "yes" => true, + "0" => false, + "false" => false, + "no" => false, + _ => false, + } +} + +#[cfg(test)] +mod tests { + use crate::services::field::type_options::checkbox_type_option::{NO, YES}; + use crate::services::field::CheckboxTypeOption; + use crate::services::field::FieldBuilder; + use crate::services::row::CellDataOperation; + use flowy_grid_data_model::entities::FieldType; + + #[test] + fn checkout_box_description_test() { + let type_option = CheckboxTypeOption::default(); + let field_meta = FieldBuilder::from_field_type(&FieldType::DateTime).build(); + + let data = type_option.apply_changeset("true", None).unwrap(); + assert_eq!(type_option.decode_cell_data(data, &field_meta), YES); + + let data = type_option.apply_changeset("1", None).unwrap(); + assert_eq!(type_option.decode_cell_data(data, &field_meta), YES); + + let data = type_option.apply_changeset("yes", None).unwrap(); + assert_eq!(type_option.decode_cell_data(data, &field_meta), YES); + + let data = type_option.apply_changeset("false", None).unwrap(); + assert_eq!(type_option.decode_cell_data(data, &field_meta), NO); + + let data = type_option.apply_changeset("no", None).unwrap(); + assert_eq!(type_option.decode_cell_data(data, &field_meta), NO); + + let data = type_option.apply_changeset("123", None).unwrap(); + assert_eq!(type_option.decode_cell_data(data, &field_meta), NO); + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/cell/description/date_description.rs b/frontend/rust-lib/flowy-grid/src/services/field/type_options/date_type_option.rs similarity index 54% rename from frontend/rust-lib/flowy-grid/src/services/cell/description/date_description.rs rename to frontend/rust-lib/flowy-grid/src/services/field/type_options/date_type_option.rs index 0ad2e3f6a9..b89431add8 100644 --- a/frontend/rust-lib/flowy-grid/src/services/cell/description/date_description.rs +++ b/frontend/rust-lib/flowy-grid/src/services/field/type_options/date_type_option.rs @@ -1,27 +1,29 @@ -use crate::impl_from_and_to_type_option; -use crate::services::row::CellDataSerde; - +use crate::impl_type_option; +use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellData}; +use bytes::Bytes; use chrono::format::strftime::StrftimeItems; use chrono::NaiveDateTime; use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{FieldMeta, FieldType}; +use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry}; use serde::{Deserialize, Serialize}; +use std::str::FromStr; +use crate::services::field::{BoxTypeOptionBuilder, TypeOptionBuilder}; use strum_macros::EnumIter; // Date #[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] -pub struct DateDescription { +pub struct DateTypeOption { #[pb(index = 1)] pub date_format: DateFormat, #[pb(index = 2)] pub time_format: TimeFormat, } -impl_from_and_to_type_option!(DateDescription, FieldType::DateTime); +impl_type_option!(DateTypeOption, FieldType::DateTime); -impl DateDescription { +impl DateTypeOption { #[allow(dead_code)] fn today_from_timestamp(&self, timestamp: i64) -> String { let native = chrono::NaiveDateTime::from_timestamp(timestamp, 0); @@ -31,33 +33,74 @@ impl DateDescription { fn today_from_native(&self, naive: chrono::NaiveDateTime) -> String { let utc: chrono::DateTime = chrono::DateTime::from_utc(naive, chrono::Utc); let local: chrono::DateTime = chrono::DateTime::from(utc); - - let fmt_str = format!("{} {}", self.date_format.format_str(), self.time_format.format_str()); - let output = format!("{}", local.format_with_items(StrftimeItems::new(&fmt_str))); + let output = format!("{}", local.format_with_items(StrftimeItems::new(&self.fmt_str()))); output } + + fn fmt_str(&self) -> String { + format!("{} {}", self.date_format.format_str(), self.time_format.format_str()) + } } -impl CellDataSerde for DateDescription { - fn deserialize_cell_data(&self, data: String) -> String { - match data.parse::() { - Ok(timestamp) => { - let native = NaiveDateTime::from_timestamp(timestamp, 0); - self.today_from_native(native) +impl CellDataOperation for DateTypeOption { + fn decode_cell_data(&self, data: String, _field_meta: &FieldMeta) -> String { + if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&data) { + if !type_option_cell_data.is_date() { + return String::new(); } - Err(e) => { - tracing::debug!("DateDescription format {} fail. error: {:?}", data, e); - String::new() + + let cell_data = type_option_cell_data.data; + if let Ok(timestamp) = cell_data.parse::() { + let native = NaiveDateTime::from_timestamp(timestamp, 0); + return self.today_from_native(native); + } + + if NaiveDateTime::parse_from_str(&cell_data, &self.fmt_str()).is_ok() { + return cell_data; } } + + String::new() } - fn serialize_cell_data(&self, data: &str) -> Result { - if let Err(e) = data.parse::() { - tracing::error!("Parse {} to i64 failed: {}", data, e); + fn apply_changeset>( + &self, + changeset: T, + _cell_meta: Option, + ) -> Result { + let changeset = changeset.into(); + if let Err(e) = changeset.parse::() { + tracing::error!("Parse {} to i64 failed: {}", changeset.to_string(), e); return Err(FlowyError::internal().context(e)); }; - Ok(data.to_owned()) + + Ok(TypeOptionCellData::new(changeset, self.field_type()).json()) + } +} + +#[derive(Default)] +pub struct DateTypeOptionBuilder(DateTypeOption); +impl_into_box_type_option_builder!(DateTypeOptionBuilder); +impl_builder_from_json_str_and_from_bytes!(DateTypeOptionBuilder, DateTypeOption); + +impl DateTypeOptionBuilder { + pub fn date_format(mut self, date_format: DateFormat) -> Self { + self.0.date_format = date_format; + self + } + + pub fn time_format(mut self, time_format: TimeFormat) -> Self { + self.0.time_format = time_format; + self + } +} +impl TypeOptionBuilder for DateTypeOptionBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn entry(&self) -> &dyn TypeOptionDataEntry { + &self.0 } } @@ -145,56 +188,59 @@ impl std::default::Default for TimeFormat { #[cfg(test)] mod tests { - use crate::services::cell::{DateDescription, DateFormat, TimeFormat}; - use crate::services::row::CellDataSerde; + use crate::services::field::FieldBuilder; + use crate::services::field::{DateFormat, DateTypeOption, TimeFormat}; + use crate::services::row::{CellDataOperation, TypeOptionCellData}; + use flowy_grid_data_model::entities::FieldType; use strum::IntoEnumIterator; #[test] - fn date_description_date_format_test() { - let mut description = DateDescription::default(); - let _timestamp = 1647251762; + fn date_description_invalid_input_test() { + let type_option = DateTypeOption::default(); + let field_meta = FieldBuilder::from_field_type(&FieldType::Number).build(); + assert_eq!( + "".to_owned(), + type_option.decode_cell_data("1e".to_owned(), &field_meta) + ); + } + #[test] + fn date_description_date_format_test() { + let mut type_option = DateTypeOption::default(); + let field_meta = FieldBuilder::from_field_type(&FieldType::Number).build(); for date_format in DateFormat::iter() { - description.date_format = date_format; + type_option.date_format = date_format; match date_format { DateFormat::Friendly => { assert_eq!( "Mar 14,2022 17:56".to_owned(), - description.today_from_timestamp(1647251762) + type_option.decode_cell_data(data("1647251762"), &field_meta) ); assert_eq!( "Mar 14,2022 17:56".to_owned(), - description.deserialize_cell_data("1647251762".to_owned()) + type_option.decode_cell_data(data("Mar 14,2022 17:56"), &field_meta) ); } DateFormat::US => { assert_eq!( "2022/03/14 17:56".to_owned(), - description.today_from_timestamp(1647251762) + type_option.decode_cell_data(data("1647251762"), &field_meta) ); assert_eq!( "2022/03/14 17:56".to_owned(), - description.deserialize_cell_data("1647251762".to_owned()) + type_option.decode_cell_data(data("2022/03/14 17:56"), &field_meta) ); } DateFormat::ISO => { assert_eq!( "2022-03-14 17:56".to_owned(), - description.today_from_timestamp(1647251762) - ); - assert_eq!( - "2022-03-14 17:56".to_owned(), - description.deserialize_cell_data("1647251762".to_owned()) + type_option.decode_cell_data(data("1647251762"), &field_meta) ); } DateFormat::Local => { assert_eq!( "2022/03/14 17:56".to_owned(), - description.today_from_timestamp(1647251762) - ); - assert_eq!( - "2022/03/14 17:56".to_owned(), - description.deserialize_cell_data("1647251762".to_owned()) + type_option.decode_cell_data(data("1647251762"), &field_meta) ); } } @@ -203,28 +249,29 @@ mod tests { #[test] fn date_description_time_format_test() { - let mut description = DateDescription::default(); + let mut type_option = DateTypeOption::default(); + let field_meta = FieldBuilder::from_field_type(&FieldType::Number).build(); for time_format in TimeFormat::iter() { - description.time_format = time_format; + type_option.time_format = time_format; match time_format { TimeFormat::TwentyFourHour => { assert_eq!( "Mar 14,2022 17:56".to_owned(), - description.today_from_timestamp(1647251762) + type_option.today_from_timestamp(1647251762) ); assert_eq!( "Mar 14,2022 17:56".to_owned(), - description.deserialize_cell_data("1647251762".to_owned()) + type_option.decode_cell_data(data("1647251762"), &field_meta) ); } TimeFormat::TwelveHour => { assert_eq!( "Mar 14,2022 05:56:02 PM".to_owned(), - description.today_from_timestamp(1647251762) + type_option.today_from_timestamp(1647251762) ); assert_eq!( "Mar 14,2022 05:56:02 PM".to_owned(), - description.deserialize_cell_data("1647251762".to_owned()) + type_option.decode_cell_data(data("1647251762"), &field_meta) ); } } @@ -234,7 +281,11 @@ mod tests { #[test] #[should_panic] fn date_description_invalid_data_test() { - let description = DateDescription::default(); - description.serialize_cell_data("he").unwrap(); + let type_option = DateTypeOption::default(); + type_option.apply_changeset("he", None).unwrap(); + } + + fn data(s: &str) -> String { + TypeOptionCellData::new(s, FieldType::DateTime).json() } } diff --git a/frontend/rust-lib/flowy-grid/src/services/field/type_options/mod.rs b/frontend/rust-lib/flowy-grid/src/services/field/type_options/mod.rs new file mode 100644 index 0000000000..b5cab79b97 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/type_options/mod.rs @@ -0,0 +1,12 @@ +mod checkbox_type_option; +mod date_type_option; +mod number_type_option; +mod selection_type_option; +mod text_type_option; +mod type_option_data; + +pub use checkbox_type_option::*; +pub use date_type_option::*; +pub use number_type_option::*; +pub use selection_type_option::*; +pub use text_type_option::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/field/type_options/number_type_option.rs b/frontend/rust-lib/flowy-grid/src/services/field/type_options/number_type_option.rs new file mode 100644 index 0000000000..7b03adfc74 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/type_options/number_type_option.rs @@ -0,0 +1,347 @@ +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 lazy_static::lazy_static; + +use rust_decimal::Decimal; +use rusty_money::iso::{Currency, CNY, EUR, USD}; +use serde::{Deserialize, Serialize}; + +use crate::services::field::{BoxTypeOptionBuilder, TypeOptionBuilder}; +use bytes::Bytes; +use std::str::FromStr; +use strum::IntoEnumIterator; +use strum_macros::EnumIter; + +lazy_static! { + static ref STRIP_SYMBOL: Vec = make_strip_symbol(); +} + +#[derive(Default)] +pub struct NumberTypeOptionBuilder(NumberTypeOption); +impl_into_box_type_option_builder!(NumberTypeOptionBuilder); +impl_builder_from_json_str_and_from_bytes!(NumberTypeOptionBuilder, NumberTypeOption); + +impl NumberTypeOptionBuilder { + pub fn name(mut self, name: &str) -> Self { + self.0.name = name.to_string(); + self + } + + pub fn set_format(mut self, format: NumberFormat) -> Self { + self.0.set_format(format); + self + } + + pub fn scale(mut self, scale: u32) -> Self { + self.0.scale = scale; + self + } + + pub fn positive(mut self, positive: bool) -> Self { + self.0.sign_positive = positive; + self + } +} + +impl TypeOptionBuilder for NumberTypeOptionBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn entry(&self) -> &dyn TypeOptionDataEntry { + &self.0 + } +} + +// Number +#[derive(Clone, Debug, Serialize, Deserialize, ProtoBuf)] +pub struct NumberTypeOption { + #[pb(index = 1)] + pub format: NumberFormat, + + #[pb(index = 2)] + pub scale: u32, + + #[pb(index = 3)] + pub symbol: String, + + #[pb(index = 4)] + pub sign_positive: bool, + + #[pb(index = 5)] + pub name: String, +} +impl_type_option!(NumberTypeOption, FieldType::Number); + +impl CellDataOperation for NumberTypeOption { + fn decode_cell_data(&self, data: String, _field_meta: &FieldMeta) -> String { + if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&data) { + if type_option_cell_data.is_date() { + return String::new(); + } + + let cell_data = type_option_cell_data.data; + match self.format { + NumberFormat::Number => { + if cell_data.parse::().is_ok() { + cell_data + } else { + String::new() + } + } + NumberFormat::USD => self.money_from_str(&cell_data, USD), + NumberFormat::CNY => self.money_from_str(&cell_data, CNY), + NumberFormat::EUR => self.money_from_str(&cell_data, EUR), + } + } else { + String::new() + } + } + + fn apply_changeset>( + &self, + changeset: T, + _cell_meta: Option, + ) -> Result { + let changeset = changeset.into(); + let data = self.strip_symbol(changeset); + + if !data.chars().all(char::is_numeric) { + return Err(FlowyError::invalid_data().context("Should only contain numbers")); + } + + Ok(TypeOptionCellData::new(&data, self.field_type()).json()) + } +} + +impl std::default::Default for NumberTypeOption { + fn default() -> Self { + let format = NumberFormat::default(); + let symbol = format.symbol(); + NumberTypeOption { + format, + scale: 0, + symbol, + sign_positive: true, + name: "Number".to_string(), + } + } +} + +impl NumberTypeOption { + pub fn set_format(&mut self, format: NumberFormat) { + self.format = format; + self.symbol = format.symbol(); + } + + fn money_from_str(&self, s: &str, currency: &'static Currency) -> String { + match Decimal::from_str(s) { + Ok(mut decimal) => { + match decimal.set_scale(self.scale) { + Ok(_) => {} + Err(e) => { + tracing::error!("Set decimal scale failed: {:?}", e); + } + } + decimal.set_sign_positive(self.sign_positive); + let money = rusty_money::Money::from_decimal(decimal, currency); + money.to_string() + } + Err(_) => String::new(), + } + } + + fn strip_symbol(&self, s: T) -> String { + let mut s = s.to_string(); + if !s.chars().all(char::is_numeric) { + s.retain(|c| !STRIP_SYMBOL.contains(&c.to_string())); + } + s + } +} + +#[derive(Clone, Copy, Debug, EnumIter, Serialize, Deserialize, ProtoBuf_Enum)] +pub enum NumberFormat { + Number = 0, + USD = 1, + CNY = 2, + EUR = 3, +} + +impl std::default::Default for NumberFormat { + fn default() -> Self { + NumberFormat::Number + } +} + +impl NumberFormat { + pub fn symbol(&self) -> String { + match self { + NumberFormat::Number => "".to_string(), + NumberFormat::USD => USD.symbol.to_string(), + NumberFormat::CNY => CNY.symbol.to_string(), + NumberFormat::EUR => EUR.symbol.to_string(), + } + } + + #[allow(dead_code)] + pub fn code(&self) -> String { + match self { + NumberFormat::Number => "".to_string(), + NumberFormat::USD => USD.iso_alpha_code.to_string(), + NumberFormat::CNY => CNY.iso_alpha_code.to_string(), + NumberFormat::EUR => EUR.iso_alpha_code.to_string(), + } + } +} + +fn make_strip_symbol() -> Vec { + let mut symbols = vec![",".to_owned(), ".".to_owned()]; + for format in NumberFormat::iter() { + symbols.push(format.symbol()); + } + symbols +} + +#[cfg(test)] +mod tests { + use crate::services::field::FieldBuilder; + use crate::services::field::{NumberFormat, NumberTypeOption}; + use crate::services::row::{CellDataOperation, TypeOptionCellData}; + use flowy_grid_data_model::entities::FieldType; + use strum::IntoEnumIterator; + + #[test] + fn number_description_invalid_input_test() { + let type_option = NumberTypeOption::default(); + let field_meta = FieldBuilder::from_field_type(&FieldType::Number).build(); + assert_eq!("".to_owned(), type_option.decode_cell_data(data(""), &field_meta)); + assert_eq!("".to_owned(), type_option.decode_cell_data(data("abc"), &field_meta)); + } + + #[test] + fn number_description_test() { + let mut type_option = NumberTypeOption::default(); + let field_meta = FieldBuilder::from_field_type(&FieldType::Number).build(); + assert_eq!(type_option.strip_symbol("Â¥18,443"), "18443".to_owned()); + assert_eq!(type_option.strip_symbol("$18,443"), "18443".to_owned()); + assert_eq!(type_option.strip_symbol("€18.443"), "18443".to_owned()); + + for format in NumberFormat::iter() { + type_option.format = format; + match format { + NumberFormat::Number => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "18443".to_owned() + ); + } + NumberFormat::USD => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "$18,443".to_owned() + ); + assert_eq!(type_option.decode_cell_data(data(""), &field_meta), "".to_owned()); + assert_eq!(type_option.decode_cell_data(data("abc"), &field_meta), "".to_owned()); + } + NumberFormat::CNY => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "Â¥18,443".to_owned() + ); + } + NumberFormat::EUR => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "€18.443".to_owned() + ); + } + } + } + } + + fn data(s: &str) -> String { + TypeOptionCellData::new(s, FieldType::Number).json() + } + + #[test] + fn number_description_scale_test() { + let mut type_option = NumberTypeOption { + scale: 1, + ..Default::default() + }; + let field_meta = FieldBuilder::from_field_type(&FieldType::Number).build(); + + for format in NumberFormat::iter() { + type_option.format = format; + match format { + NumberFormat::Number => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "18443".to_owned() + ); + } + NumberFormat::USD => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "$1,844.3".to_owned() + ); + } + NumberFormat::CNY => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "Â¥1,844.3".to_owned() + ); + } + NumberFormat::EUR => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "€1.844,3".to_owned() + ); + } + } + } + } + + #[test] + fn number_description_sign_test() { + let mut type_option = NumberTypeOption { + sign_positive: false, + ..Default::default() + }; + let field_meta = FieldBuilder::from_field_type(&FieldType::Number).build(); + + for format in NumberFormat::iter() { + type_option.format = format; + match format { + NumberFormat::Number => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "18443".to_owned() + ); + } + NumberFormat::USD => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "-$18,443".to_owned() + ); + } + NumberFormat::CNY => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "-Â¥18,443".to_owned() + ); + } + NumberFormat::EUR => { + assert_eq!( + type_option.decode_cell_data(data("18443"), &field_meta), + "-€18.443".to_owned() + ); + } + } + } + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/field/type_options/selection_type_option.rs b/frontend/rust-lib/flowy-grid/src/services/field/type_options/selection_type_option.rs new file mode 100644 index 0000000000..786cd2ce0d --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/type_options/selection_type_option.rs @@ -0,0 +1,547 @@ +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, +}; +use flowy_grid_data_model::parser::NotEmptyUuid; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; + +pub const SELECTION_IDS_SEPARATOR: &str = ","; + +pub trait SelectOptionOperation: TypeOptionDataEntry + Send + Sync { + fn insert_option(&mut self, new_option: SelectOption); + fn delete_option(&mut self, delete_option: SelectOption); + fn option_context(&self, cell_meta: &Option) -> SelectOptionContext; +} + +// Single select +#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] +pub struct SingleSelectTypeOption { + #[pb(index = 1)] + pub options: Vec, + + #[pb(index = 2)] + pub disable_color: bool, +} +impl_type_option!(SingleSelectTypeOption, FieldType::SingleSelect); + +impl SelectOptionOperation for SingleSelectTypeOption { + fn insert_option(&mut self, new_option: SelectOption) { + if let Some(index) = self.options.iter().position(|option| option.id == new_option.id) { + self.options.remove(index); + self.options.insert(index, new_option); + } else { + self.options.insert(0, new_option); + } + } + + fn delete_option(&mut self, delete_option: SelectOption) { + if let Some(index) = self.options.iter().position(|option| option.id == delete_option.id) { + self.options.remove(index); + } + } + + fn option_context(&self, cell_meta: &Option) -> SelectOptionContext { + let select_options = make_select_context_from(cell_meta, &self.options); + SelectOptionContext { + options: self.options.clone(), + select_options, + } + } +} + +impl CellDataOperation for SingleSelectTypeOption { + fn decode_cell_data(&self, data: String, _field_meta: &FieldMeta) -> String { + if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&data) { + if !type_option_cell_data.is_single_select() { + return String::new(); + } + + match select_option_ids(type_option_cell_data.data).first() { + None => String::new(), + Some(option_id) => match self.options.iter().find(|option| &option.id == option_id) { + None => String::new(), + Some(option) => option.name.clone(), + }, + } + } else { + String::new() + } + } + + fn apply_changeset>( + &self, + changeset: T, + _cell_meta: Option, + ) -> Result { + let changeset = changeset.into(); + let select_option_changeset: SelectOptionCellChangeset = serde_json::from_str(&changeset)?; + let new_cell_data: String; + if let Some(insert_option_id) = select_option_changeset.insert_option_id { + tracing::trace!("Insert single select option: {}", &insert_option_id); + new_cell_data = insert_option_id; + } else { + tracing::trace!("Delete single select option"); + new_cell_data = "".to_string() + } + + Ok(TypeOptionCellData::new(&new_cell_data, self.field_type()).json()) + } +} + +#[derive(Default)] +pub struct SingleSelectTypeOptionBuilder(SingleSelectTypeOption); +impl_into_box_type_option_builder!(SingleSelectTypeOptionBuilder); +impl_builder_from_json_str_and_from_bytes!(SingleSelectTypeOptionBuilder, SingleSelectTypeOption); + +impl SingleSelectTypeOptionBuilder { + pub fn option(mut self, opt: SelectOption) -> Self { + self.0.options.push(opt); + self + } +} + +impl TypeOptionBuilder for SingleSelectTypeOptionBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn entry(&self) -> &dyn TypeOptionDataEntry { + &self.0 + } +} + +// Multiple select +#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] +pub struct MultiSelectTypeOption { + #[pb(index = 1)] + pub options: Vec, + + #[pb(index = 2)] + pub disable_color: bool, +} +impl_type_option!(MultiSelectTypeOption, FieldType::MultiSelect); + +impl MultiSelectTypeOption { + pub fn get_cell_data(&self, cell_meta: &CellMeta) -> String { + match TypeOptionCellData::from_str(&cell_meta.data) { + Ok(type_option) => type_option.data, + Err(_) => String::new(), + } + } +} + +impl SelectOptionOperation for MultiSelectTypeOption { + fn insert_option(&mut self, new_option: SelectOption) { + if let Some(index) = self.options.iter().position(|option| option.id == new_option.id) { + self.options.remove(index); + self.options.insert(index, new_option); + } else { + self.options.insert(0, new_option); + } + } + + fn delete_option(&mut self, delete_option: SelectOption) { + if let Some(index) = self.options.iter().position(|option| option.id == delete_option.id) { + self.options.remove(index); + } + } + + fn option_context(&self, cell_meta: &Option) -> SelectOptionContext { + let select_options = make_select_context_from(cell_meta, &self.options); + SelectOptionContext { + options: self.options.clone(), + select_options, + } + } +} + +impl CellDataOperation for MultiSelectTypeOption { + fn decode_cell_data(&self, data: String, _field_meta: &FieldMeta) -> String { + if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&data) { + if !type_option_cell_data.is_multi_select() { + return String::new(); + } + let option_ids = select_option_ids(type_option_cell_data.data); + self.options + .iter() + .filter(|option| option_ids.contains(&option.id)) + .map(|option| option.name.clone()) + .collect::>() + .join(SELECTION_IDS_SEPARATOR) + } else { + String::new() + } + } + + fn apply_changeset>( + &self, + changeset: T, + cell_meta: Option, + ) -> Result { + let changeset = changeset.into(); + let select_option_changeset: SelectOptionCellChangeset = serde_json::from_str(&changeset)?; + let new_cell_data: String; + match cell_meta { + None => { + new_cell_data = select_option_changeset + .insert_option_id + .unwrap_or_else(|| "".to_owned()); + } + Some(cell_meta) => { + let cell_data = self.get_cell_data(&cell_meta); + let mut selected_options = select_option_ids(cell_data); + if let Some(insert_option_id) = select_option_changeset.insert_option_id { + tracing::trace!("Insert multi select option: {}", &insert_option_id); + if selected_options.contains(&insert_option_id) { + selected_options.retain(|id| id != &insert_option_id); + } else { + selected_options.push(insert_option_id); + } + } + + if let Some(delete_option_id) = select_option_changeset.delete_option_id { + tracing::trace!("Delete multi select option: {}", &delete_option_id); + selected_options.retain(|id| id != &delete_option_id); + } + + new_cell_data = selected_options.join(SELECTION_IDS_SEPARATOR); + tracing::trace!("Multi select cell data: {}", &new_cell_data); + } + } + + Ok(TypeOptionCellData::new(&new_cell_data, self.field_type()).json()) + } +} + +#[derive(Default)] +pub struct MultiSelectTypeOptionBuilder(MultiSelectTypeOption); +impl_into_box_type_option_builder!(MultiSelectTypeOptionBuilder); +impl_builder_from_json_str_and_from_bytes!(MultiSelectTypeOptionBuilder, MultiSelectTypeOption); +impl MultiSelectTypeOptionBuilder { + pub fn option(mut self, opt: SelectOption) -> Self { + self.0.options.push(opt); + self + } +} + +impl TypeOptionBuilder for MultiSelectTypeOptionBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn entry(&self) -> &dyn TypeOptionDataEntry { + &self.0 + } +} + +fn select_option_ids(data: String) -> Vec { + data.split(SELECTION_IDS_SEPARATOR) + .map(|id| id.to_string()) + .collect::>() +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] +pub struct SelectOption { + #[pb(index = 1)] + pub id: String, + + #[pb(index = 2)] + pub name: String, + + #[pb(index = 3)] + pub color: SelectOptionColor, +} + +impl SelectOption { + pub fn new(name: &str) -> Self { + SelectOption { + id: uuid(), + name: name.to_owned(), + color: SelectOptionColor::default(), + } + } +} + +#[derive(Clone, Debug, Default, ProtoBuf)] +pub struct SelectOptionChangesetPayload { + #[pb(index = 1)] + pub cell_identifier: CellIdentifierPayload, + + #[pb(index = 2, one_of)] + pub insert_option: Option, + + #[pb(index = 3, one_of)] + pub delete_option: Option, +} + +pub struct SelectOptionChangeset { + pub cell_identifier: CellIdentifier, + pub insert_option: Option, + pub delete_option: Option, +} + +impl TryInto for SelectOptionChangesetPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let cell_identifier = self.cell_identifier.try_into()?; + Ok(SelectOptionChangeset { + cell_identifier, + insert_option: self.insert_option, + delete_option: self.delete_option, + }) + } +} + +#[derive(Clone, Debug, Default, ProtoBuf)] +pub struct SelectOptionCellChangesetPayload { + #[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 insert_option_id: Option, + + #[pb(index = 5, one_of)] + pub delete_option_id: Option, +} + +pub struct SelectOptionCellChangesetParams { + pub grid_id: String, + pub field_id: String, + pub row_id: String, + pub insert_option_id: Option, + pub delete_option_id: Option, +} + +#[derive(Clone, Serialize, Deserialize)] +pub struct SelectOptionCellChangeset { + pub insert_option_id: Option, + pub delete_option_id: Option, +} + +impl SelectOptionCellChangeset { + pub fn from_insert(option_id: &str) -> Self { + SelectOptionCellChangeset { + insert_option_id: Some(option_id.to_string()), + delete_option_id: None, + } + } + + pub fn from_delete(option_id: &str) -> Self { + SelectOptionCellChangeset { + insert_option_id: None, + delete_option_id: Some(option_id.to_string()), + } + } + + pub fn cell_data(&self) -> String { + serde_json::to_string(self).unwrap() + } +} + +impl std::convert::From for CellMetaChangeset { + 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 { + grid_id: params.grid_id, + row_id: params.row_id, + field_id: params.field_id, + data: Some(s), + } + } +} + +impl TryInto for SelectOptionCellChangesetPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + 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 insert_option_id = match self.insert_option_id { + None => None, + Some(insert_option_id) => Some( + NotEmptyUuid::parse(insert_option_id) + .map_err(|_| ErrorCode::OptionIdIsEmpty)? + .0, + ), + }; + + let delete_option_id = match self.delete_option_id { + None => None, + Some(delete_option_id) => Some( + NotEmptyUuid::parse(delete_option_id) + .map_err(|_| ErrorCode::OptionIdIsEmpty)? + .0, + ), + }; + + Ok(SelectOptionCellChangesetParams { + grid_id: grid_id.0, + row_id: row_id.0, + field_id: field_id.0, + insert_option_id, + delete_option_id, + }) + } +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize, ProtoBuf)] +pub struct SelectOptionContext { + #[pb(index = 1)] + pub options: Vec, + + #[pb(index = 2)] + pub select_options: Vec, +} + +#[derive(ProtoBuf_Enum, Serialize, Deserialize, Debug, Clone)] +#[repr(u8)] +pub enum SelectOptionColor { + Purple = 0, + Pink = 1, + LightPink = 2, + Orange = 3, + Yellow = 4, + Lime = 5, + Green = 6, + Aqua = 7, + Blue = 8, +} + +impl std::default::Default for SelectOptionColor { + fn default() -> Self { + SelectOptionColor::Purple + } +} + +fn make_select_context_from(cell_meta: &Option, options: &[SelectOption]) -> Vec { + match cell_meta { + None => vec![], + Some(cell_meta) => { + if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&cell_meta.data) { + select_option_ids(type_option_cell_data.data) + .into_iter() + .flat_map(|option_id| options.iter().find(|option| option.id == option_id).cloned()) + .collect() + } else { + vec![] + } + } + } +} + +#[cfg(test)] +mod tests { + use crate::services::field::FieldBuilder; + use crate::services::field::{ + MultiSelectTypeOption, MultiSelectTypeOptionBuilder, SelectOption, SelectOptionCellChangeset, + SingleSelectTypeOption, SingleSelectTypeOptionBuilder, SELECTION_IDS_SEPARATOR, + }; + use crate::services::row::CellDataOperation; + + #[test] + fn single_select_test() { + let google_option = SelectOption::new("Google"); + let facebook_option = SelectOption::new("Facebook"); + let twitter_option = SelectOption::new("Twitter"); + let single_select = SingleSelectTypeOptionBuilder::default() + .option(google_option.clone()) + .option(facebook_option.clone()) + .option(twitter_option.clone()); + + let field_meta = FieldBuilder::new(single_select) + .name("Platform") + .visibility(true) + .build(); + + let type_option = SingleSelectTypeOption::from(&field_meta); + + let option_ids = vec![google_option.id.clone(), facebook_option.id.clone()].join(SELECTION_IDS_SEPARATOR); + let data = SelectOptionCellChangeset::from_insert(&option_ids).cell_data(); + let cell_data = type_option.apply_changeset(data, None).unwrap(); + assert_eq!(type_option.decode_cell_data(cell_data, &field_meta), google_option.name,); + + let data = SelectOptionCellChangeset::from_insert(&google_option.id).cell_data(); + let cell_data = type_option.apply_changeset(data, None).unwrap(); + assert_eq!(type_option.decode_cell_data(cell_data, &field_meta), google_option.name,); + + // Invalid option id + let cell_data = type_option + .apply_changeset(SelectOptionCellChangeset::from_insert("").cell_data(), None) + .unwrap(); + assert_eq!(type_option.decode_cell_data(cell_data, &field_meta), "",); + + // Invalid option id + let cell_data = type_option + .apply_changeset(SelectOptionCellChangeset::from_insert("123").cell_data(), None) + .unwrap(); + assert_eq!(type_option.decode_cell_data(cell_data, &field_meta), "",); + + // Invalid changeset + assert!(type_option.apply_changeset("123", None).is_err()); + } + + #[test] + fn multi_select_test() { + let google_option = SelectOption::new("Google"); + let facebook_option = SelectOption::new("Facebook"); + let twitter_option = SelectOption::new("Twitter"); + let multi_select = MultiSelectTypeOptionBuilder::default() + .option(google_option.clone()) + .option(facebook_option.clone()) + .option(twitter_option.clone()); + + let field_meta = FieldBuilder::new(multi_select) + .name("Platform") + .visibility(true) + .build(); + + let type_option = MultiSelectTypeOption::from(&field_meta); + + let option_ids = vec![google_option.id.clone(), facebook_option.id.clone()].join(SELECTION_IDS_SEPARATOR); + let data = SelectOptionCellChangeset::from_insert(&option_ids).cell_data(); + let cell_data = type_option.apply_changeset(data, None).unwrap(); + assert_eq!( + type_option.decode_cell_data(cell_data, &field_meta), + vec![google_option.name.clone(), facebook_option.name.clone()].join(SELECTION_IDS_SEPARATOR), + ); + + let data = SelectOptionCellChangeset::from_insert(&google_option.id).cell_data(); + let cell_data = type_option.apply_changeset(data, None).unwrap(); + assert_eq!(type_option.decode_cell_data(cell_data, &field_meta), google_option.name,); + + // Invalid option id + let cell_data = type_option + .apply_changeset(SelectOptionCellChangeset::from_insert("").cell_data(), None) + .unwrap(); + assert_eq!(type_option.decode_cell_data(cell_data, &field_meta), "",); + + // Invalid option id + let cell_data = type_option + .apply_changeset(SelectOptionCellChangeset::from_insert("123,456").cell_data(), None) + .unwrap(); + assert_eq!(type_option.decode_cell_data(cell_data, &field_meta), "",); + + // Invalid changeset + assert!(type_option.apply_changeset("123", None).is_err()); + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/field/type_options/text_type_option.rs b/frontend/rust-lib/flowy-grid/src/services/field/type_options/text_type_option.rs new file mode 100644 index 0000000000..46ce48db10 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/type_options/text_type_option.rs @@ -0,0 +1,119 @@ +use crate::impl_type_option; +use crate::services::field::{BoxTypeOptionBuilder, TypeOptionBuilder}; +use crate::services::row::{decode_cell_data, CellDataChangeset, CellDataOperation, TypeOptionCellData}; +use bytes::Bytes; +use flowy_derive::ProtoBuf; +use flowy_error::FlowyError; +use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry}; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; + +#[derive(Default)] +pub struct RichTextTypeOptionBuilder(RichTextTypeOption); +impl_into_box_type_option_builder!(RichTextTypeOptionBuilder); +impl_builder_from_json_str_and_from_bytes!(RichTextTypeOptionBuilder, RichTextTypeOption); + +impl TypeOptionBuilder for RichTextTypeOptionBuilder { + fn field_type(&self) -> FieldType { + self.0.field_type() + } + + fn entry(&self) -> &dyn TypeOptionDataEntry { + &self.0 + } +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)] +pub struct RichTextTypeOption { + #[pb(index = 1)] + pub format: String, +} +impl_type_option!(RichTextTypeOption, FieldType::RichText); + +impl CellDataOperation for RichTextTypeOption { + fn decode_cell_data(&self, data: String, field_meta: &FieldMeta) -> String { + if let Ok(type_option_cell_data) = TypeOptionCellData::from_str(&data) { + if type_option_cell_data.is_date() + || type_option_cell_data.is_single_select() + || type_option_cell_data.is_multi_select() + || type_option_cell_data.is_number() + { + decode_cell_data(data, field_meta).unwrap_or_else(|_| "".to_owned()) + } else { + type_option_cell_data.data + } + } else { + String::new() + } + } + + fn apply_changeset>( + &self, + changeset: T, + _cell_meta: Option, + ) -> Result { + let data = changeset.into(); + if data.len() > 10000 { + Err(FlowyError::text_too_long().context("The len of the text should not be more than 10000")) + } else { + Ok(TypeOptionCellData::new(&data, self.field_type()).json()) + } + } +} + +#[cfg(test)] +mod tests { + use crate::services::field::FieldBuilder; + use crate::services::field::*; + use crate::services::row::{CellDataOperation, TypeOptionCellData}; + use flowy_grid_data_model::entities::FieldType; + + #[test] + fn text_description_test() { + let type_option = RichTextTypeOption::default(); + + // date + let date_time_field_meta = FieldBuilder::from_field_type(&FieldType::DateTime).build(); + let data = TypeOptionCellData::new("1647251762", FieldType::DateTime).json(); + assert_eq!( + type_option.decode_cell_data(data, &date_time_field_meta), + "Mar 14,2022 17:56".to_owned() + ); + + // Single select + let done_option = SelectOption::new("Done"); + let done_option_id = done_option.id.clone(); + let single_select = SingleSelectTypeOptionBuilder::default().option(done_option); + let single_select_field_meta = FieldBuilder::new(single_select).build(); + let cell_data = TypeOptionCellData::new(&done_option_id, FieldType::SingleSelect).json(); + assert_eq!( + type_option.decode_cell_data(cell_data, &single_select_field_meta), + "Done".to_owned() + ); + + // Multiple select + let google_option = SelectOption::new("Google"); + let facebook_option = SelectOption::new("Facebook"); + let ids = vec![google_option.id.clone(), facebook_option.id.clone()].join(SELECTION_IDS_SEPARATOR); + let cell_data_changeset = SelectOptionCellChangeset::from_insert(&ids).cell_data(); + let multi_select = MultiSelectTypeOptionBuilder::default() + .option(google_option) + .option(facebook_option); + let multi_select_field_meta = FieldBuilder::new(multi_select).build(); + let multi_type_option = MultiSelectTypeOption::from(&multi_select_field_meta); + let cell_data = multi_type_option.apply_changeset(cell_data_changeset, None).unwrap(); + assert_eq!( + type_option.decode_cell_data(cell_data, &multi_select_field_meta), + "Google,Facebook".to_owned() + ); + + //Number + let number = NumberTypeOptionBuilder::default().set_format(NumberFormat::USD); + let number_field_meta = FieldBuilder::new(number).build(); + let data = TypeOptionCellData::new("18443", FieldType::Number).json(); + assert_eq!( + type_option.decode_cell_data(data, &number_field_meta), + "$18,443".to_owned() + ); + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/field/type_options/type_option_data.rs b/frontend/rust-lib/flowy-grid/src/services/field/type_options/type_option_data.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/field/type_options/type_option_data.rs @@ -0,0 +1 @@ + diff --git a/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs b/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs index 7bcbe39830..a91f0bb606 100644 --- a/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs +++ b/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs @@ -1,24 +1,21 @@ -use crate::manager::GridUser; -use crate::services::block_meta_editor::GridBlockMetaEditorManager; -use bytes::Bytes; -use flowy_error::{FlowyError, FlowyResult}; -use flowy_grid_data_model::entities::{ - CellMetaChangeset, Field, FieldChangeset, FieldMeta, Grid, GridBlockMeta, GridBlockMetaChangeset, GridBlockOrder, - RepeatedField, RepeatedFieldOrder, RepeatedGridBlock, RepeatedRow, Row, RowMeta, RowMetaChangeset, RowOrder, -}; -use flowy_sync::client_grid::{GridChangeset, GridMetaPad}; -use flowy_sync::entities::revision::Revision; -use flowy_sync::util::make_delta_from_revisions; -use std::collections::HashMap; - use crate::dart_notification::{send_dart_notification, GridNotification}; -use crate::services::row::{ - make_grid_block_from_block_metas, make_grid_blocks, make_row_meta_from_context, make_rows_from_row_metas, - serialize_cell_data, CreateRowMetaBuilder, CreateRowMetaPayload, GridBlockMetaData, -}; +use crate::manager::GridUser; +use crate::services::block_meta_manager::GridBlockMetaEditorManager; +use crate::services::cell::CellIdentifier; +use crate::services::field::{default_type_option_builder_from_type, type_option_builder_from_bytes, FieldBuilder}; +use crate::services::persistence::block_index::BlockIndexPersistence; +use crate::services::row::*; +use bytes::Bytes; +use flowy_error::{ErrorCode, FlowyError, FlowyResult}; +use flowy_grid_data_model::entities::*; use flowy_revision::{RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder}; +use flowy_sync::client_grid::{GridChangeset, GridMetaPad, JsonDeserializer}; +use flowy_sync::entities::revision::Revision; +use flowy_sync::errors::CollaborateResult; +use flowy_sync::util::make_delta_from_revisions; use lib_infra::future::FutureResult; use lib_ot::core::PlainTextAttributes; +use std::collections::HashMap; use std::sync::Arc; use tokio::sync::RwLock; @@ -35,16 +32,16 @@ impl ClientGridEditor { grid_id: &str, user: Arc, mut rev_manager: RevisionManager, + persistence: Arc, ) -> FlowyResult> { let token = user.token()?; let cloud = Arc::new(GridRevisionCloudService { token }); let grid_pad = rev_manager.load::(Some(cloud)).await?; let rev_manager = Arc::new(rev_manager); let pad = Arc::new(RwLock::new(grid_pad)); + let blocks = pad.read().await.get_block_metas(); - let block_meta_manager = - Arc::new(GridBlockMetaEditorManager::new(grid_id, &user, pad.read().await.get_blocks().clone()).await?); - + let block_meta_manager = Arc::new(GridBlockMetaEditorManager::new(grid_id, &user, blocks, persistence).await?); Ok(Arc::new(Self { grid_id: grid_id.to_owned(), user, @@ -54,33 +51,143 @@ impl ClientGridEditor { })) } - pub async fn create_field(&self, field_meta: FieldMeta) -> FlowyResult<()> { - let _ = self.modify(|grid| Ok(grid.create_field(field_meta)?)).await?; - let _ = self.notify_did_update_fields().await?; + pub async fn create_field(&self, params: CreateFieldParams) -> FlowyResult<()> { + let CreateFieldParams { + field, + type_option_data, + start_field_id, + grid_id, + } = params; + + let _ = self + .modify(|grid| { + if grid.contain_field(&field.id) { + let deserializer = TypeOptionJsonDeserializer(field.field_type.clone()); + let changeset = FieldChangesetParams { + field_id: field.id, + grid_id, + name: Some(field.name), + desc: Some(field.desc), + field_type: Some(field.field_type), + frozen: Some(field.frozen), + visibility: Some(field.visibility), + width: Some(field.width), + type_option_data: Some(type_option_data), + }; + Ok(grid.update_field(changeset, deserializer)?) + } else { + // let type_option_json = type_option_json_str_from_bytes(type_option_data, &field.field_type); + let builder = type_option_builder_from_bytes(type_option_data, &field.field_type); + let field_meta = FieldBuilder::from_field(field, builder).build(); + Ok(grid.create_field(field_meta, start_field_id)?) + } + }) + .await?; + let _ = self.notify_did_update_grid().await?; Ok(()) } - pub async fn contain_field(&self, field_meta: &FieldMeta) -> bool { - self.pad.read().await.contain_field(&field_meta.id) + pub async fn create_next_field_meta(&self, field_type: &FieldType) -> FlowyResult { + let name = format!("Property {}", self.pad.read().await.fields().len() + 1); + let field_meta = FieldBuilder::from_field_type(field_type).name(&name).build(); + Ok(field_meta) } - pub async fn update_field(&self, change: FieldChangeset) -> FlowyResult<()> { - let _ = self.modify(|grid| Ok(grid.update_field(change)?)).await?; + pub async fn contain_field(&self, field_id: &str) -> bool { + self.pad.read().await.contain_field(field_id) + } + + pub async fn update_field(&self, params: FieldChangesetParams) -> FlowyResult<()> { + let field_id = params.field_id.clone(); + let json_deserializer = match self.pad.read().await.get_field(params.field_id.as_str()) { + None => return Err(ErrorCode::FieldDoesNotExist.into()), + Some(field_meta) => TypeOptionJsonDeserializer(field_meta.field_type.clone()), + }; + + let _ = self + .modify(|grid| Ok(grid.update_field(params, json_deserializer)?)) + .await?; + let _ = self.notify_did_update_grid().await?; + let _ = self.notify_did_update_field(&field_id).await?; + Ok(()) + } + + pub async fn replace_field(&self, field_meta: FieldMeta) -> FlowyResult<()> { + let _ = self.modify(|pad| Ok(pad.replace_field(field_meta)?)).await?; Ok(()) } pub async fn delete_field(&self, field_id: &str) -> FlowyResult<()> { let _ = self.modify(|grid| Ok(grid.delete_field(field_id)?)).await?; + let _ = self.notify_did_update_grid().await?; Ok(()) } + pub async fn switch_to_field_type(&self, field_id: &str, field_type: &FieldType) -> FlowyResult<()> { + // let block_ids = self + // .get_block_metas() + // .await? + // .into_iter() + // .map(|block_meta| block_meta.block_id) + // .collect(); + // let cell_metas = self + // .block_meta_manager + // .get_cell_metas(block_ids, field_id, None) + // .await?; + + let type_option_json_builder = |field_type: &FieldType| -> String { + return default_type_option_builder_from_type(field_type).entry().json_str(); + }; + + let _ = self + .modify(|grid| Ok(grid.switch_to_field(field_id, field_type.clone(), type_option_json_builder)?)) + .await?; + let _ = self.notify_did_update_grid().await?; + let _ = self.notify_did_update_field(field_id).await?; + Ok(()) + } + + pub async fn duplicate_field(&self, field_id: &str) -> FlowyResult<()> { + let _ = self.modify(|grid| Ok(grid.duplicate_field(field_id)?)).await?; + let _ = self.notify_did_update_grid().await?; + Ok(()) + } + + pub async fn get_field_meta(&self, field_id: &str) -> Option { + let field_meta = self.pad.read().await.get_field(field_id)?.clone(); + Some(field_meta) + } + + pub async fn get_field_metas(&self, field_ids: Option>) -> FlowyResult> + where + T: Into, + { + if field_ids.is_none() { + let field_metas = self.pad.read().await.get_field_metas(None)?; + return Ok(field_metas); + } + + let to_field_orders = |item: Vec| item.into_iter().map(|data| data.into()).collect(); + let field_orders = field_ids.map_or(vec![], to_field_orders); + let expected_len = field_orders.len(); + let field_metas = self.pad.read().await.get_field_metas(Some(field_orders))?; + if expected_len != 0 && field_metas.len() != expected_len { + tracing::error!( + "This is a bug. The len of the field_metas should equal to {}", + expected_len + ); + debug_assert!(field_metas.len() == expected_len); + } + Ok(field_metas) + } + pub async fn create_block(&self, grid_block: GridBlockMeta) -> FlowyResult<()> { - let _ = self.modify(|grid| Ok(grid.create_block(grid_block)?)).await?; + let _ = self.modify(|grid| Ok(grid.create_block_meta(grid_block)?)).await?; Ok(()) } pub async fn update_block(&self, changeset: GridBlockMetaChangeset) -> FlowyResult<()> { - let _ = self.modify(|grid| Ok(grid.update_block(changeset)?)).await?; + let _ = self.modify(|grid| Ok(grid.update_block_meta(changeset)?)).await?; Ok(()) } @@ -130,24 +237,27 @@ impl ClientGridEditor { pub async fn get_rows(&self, block_id: &str) -> FlowyResult { let block_ids = vec![block_id.to_owned()]; - let mut block_meta_data_vec = self.get_block_meta_data_vec(Some(&block_ids)).await?; - debug_assert_eq!(block_meta_data_vec.len(), 1); - if block_meta_data_vec.len() == 1 { - let block_meta_data = block_meta_data_vec.pop().unwrap(); - let field_metas = self.get_field_metas(None).await?; - let rows = make_rows_from_row_metas(&field_metas, &block_meta_data.row_metas); + let mut grid_block_snapshot = self.grid_block_snapshots(Some(block_ids)).await?; + + // For the moment, we only support one block. + // We can save the rows into multiple blocks and load them asynchronously in the future. + debug_assert_eq!(grid_block_snapshot.len(), 1); + if grid_block_snapshot.len() == 1 { + let snapshot = grid_block_snapshot.pop().unwrap(); + let field_metas = self.get_field_metas::(None).await?; + let rows = make_rows_from_row_metas(&field_metas, &snapshot.row_metas); Ok(rows.into()) } else { Ok(vec![].into()) } } - pub async fn get_row(&self, block_id: &str, row_id: &str) -> FlowyResult> { - match self.block_meta_manager.get_row(block_id, row_id).await? { + pub async fn get_row(&self, row_id: &str) -> FlowyResult> { + match self.block_meta_manager.get_row_meta(row_id).await? { None => Ok(None), - Some(row) => { - let field_metas = self.get_field_metas(None).await?; - let row_metas = vec![row]; + Some(row_meta) => { + let field_metas = self.get_field_metas::(None).await?; + let row_metas = vec![row_meta]; let mut rows = make_rows_from_row_metas(&field_metas, &row_metas); debug_assert!(rows.len() == 1); Ok(rows.pop()) @@ -155,38 +265,51 @@ impl ClientGridEditor { } } - pub async fn update_cell(&self, changeset: CellMetaChangeset) -> FlowyResult<()> { - if let Some(cell_data) = changeset.data.as_ref() { - match self.pad.read().await.get_field(&changeset.field_id) { - None => { - return Err(FlowyError::internal() - .context(format!("Can not find the field with id: {}", &changeset.field_id))); - } - Some(field_meta) => { - let _ = serialize_cell_data(cell_data, field_meta)?; - } + pub async fn get_cell(&self, params: &CellIdentifier) -> Option { + let field_meta = self.get_field_meta(¶ms.field_id).await?; + let row_meta = self.block_meta_manager.get_row_meta(¶ms.row_id).await.ok()??; + make_cell(¶ms.field_id, &field_meta, &row_meta) + } + + pub async fn get_cell_meta(&self, row_id: &str, field_id: &str) -> FlowyResult> { + let row_meta = self.block_meta_manager.get_row_meta(row_id).await?; + match row_meta { + None => Ok(None), + Some(row_meta) => { + let cell_meta = row_meta.cell_by_field_id.get(field_id).cloned(); + Ok(cell_meta) } } + } - let field_metas = self.get_field_metas(None).await?; - let row_changeset: RowMetaChangeset = changeset.into(); - let _ = self - .block_meta_manager - .update_cells(&field_metas, row_changeset) - .await?; - Ok(()) + pub async fn update_cell(&self, mut changeset: CellMetaChangeset) -> 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?; + match self.pad.read().await.get_field(&changeset.field_id) { + None => { + let msg = format!("Field not found with id: {}", &changeset.field_id); + Err(FlowyError::internal().context(msg)) + } + Some(field_meta) => { + // Update the changeset.data property with the return value. + changeset.data = Some(apply_cell_data_changeset(cell_data_changeset, cell_meta, field_meta)?); + let _ = self.block_meta_manager.update_cell(changeset).await?; + Ok(()) + } + } } pub async fn get_blocks(&self, block_ids: Option>) -> FlowyResult { - let block_meta_data_vec = self.get_block_meta_data_vec(block_ids.as_ref()).await?; - match block_ids { - None => make_grid_blocks(block_meta_data_vec), - Some(block_ids) => make_grid_block_from_block_metas(&block_ids, block_meta_data_vec), - } + let block_snapshots = self.grid_block_snapshots(block_ids.clone()).await?; + make_grid_blocks(block_ids, block_snapshots) } pub async fn get_block_metas(&self) -> FlowyResult> { - let grid_blocks = self.pad.read().await.get_blocks(); + let grid_blocks = self.pad.read().await.get_block_metas(); Ok(grid_blocks) } @@ -204,7 +327,7 @@ impl ClientGridEditor { .pad .read() .await - .get_blocks() + .get_block_metas() .into_iter() .map(|grid_block_meta| GridBlockOrder { block_id: grid_block_meta.block_id, @@ -217,32 +340,20 @@ impl ClientGridEditor { }) } - pub async fn get_field_metas(&self, field_orders: Option) -> FlowyResult> { - let field_meta = self.pad.read().await.get_field_metas(field_orders)?; - Ok(field_meta) - } - - pub async fn get_block_meta_data_vec( - &self, - block_ids: Option<&Vec>, - ) -> FlowyResult> { - match block_ids { - None => { - let grid_blocks = self.pad.read().await.get_blocks(); - let row_metas_per_block = self - .block_meta_manager - .get_block_meta_data_from_blocks(grid_blocks) - .await?; - Ok(row_metas_per_block) - } - Some(block_ids) => { - let row_metas_per_block = self - .block_meta_manager - .get_block_meta_data(block_ids.as_slice()) - .await?; - Ok(row_metas_per_block) - } - } + pub async fn grid_block_snapshots(&self, block_ids: Option>) -> FlowyResult> { + let block_ids = match block_ids { + None => self + .pad + .read() + .await + .get_block_metas() + .into_iter() + .map(|block_meta| block_meta.block_id) + .collect::>(), + Some(block_ids) => block_ids, + }; + let snapshots = self.block_meta_manager.make_block_snapshots(block_ids).await?; + Ok(snapshots) } pub async fn delta_bytes(&self) -> Bytes { @@ -284,20 +395,33 @@ impl ClientGridEditor { } async fn block_id(&self) -> FlowyResult { - match self.pad.read().await.get_blocks().last() { + match self.pad.read().await.get_block_metas().last() { None => Err(FlowyError::internal().context("There is no grid block in this grid")), Some(grid_block) => Ok(grid_block.block_id.clone()), } } - async fn notify_did_update_fields(&self) -> FlowyResult<()> { - let field_metas = self.get_field_metas(None).await?; + async fn notify_did_update_grid(&self) -> FlowyResult<()> { + let field_metas = self.get_field_metas::(None).await?; let repeated_field: RepeatedField = field_metas.into_iter().map(Field::from).collect::>().into(); - send_dart_notification(&self.grid_id, GridNotification::GridDidUpdateFields) + send_dart_notification(&self.grid_id, GridNotification::DidUpdateGrid) .payload(repeated_field) .send(); Ok(()) } + + async fn notify_did_update_field(&self, field_id: &str) -> FlowyResult<()> { + let mut field_metas = self.get_field_metas(Some(vec![field_id])).await?; + debug_assert!(field_metas.len() == 1); + + if let Some(field_meta) = field_metas.pop() { + send_dart_notification(&self.grid_id, GridNotification::DidUpdateField) + .payload(field_meta) + .send(); + } + + Ok(()) + } } #[cfg(feature = "flowy_unit_test")] @@ -336,3 +460,12 @@ impl RevisionCompactor for GridRevisionCompactor { Ok(delta.to_delta_bytes()) } } + +struct TypeOptionJsonDeserializer(FieldType); +impl JsonDeserializer for TypeOptionJsonDeserializer { + fn deserialize(&self, type_option_data: Vec) -> CollaborateResult { + // The type_option_data sent from Dart is serialized by protobuf. + let builder = type_option_builder_from_bytes(type_option_data, &self.0); + Ok(builder.entry().json_str()) + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/mod.rs b/frontend/rust-lib/flowy-grid/src/services/mod.rs index f8b0422685..d6ca2d5c45 100644 --- a/frontend/rust-lib/flowy-grid/src/services/mod.rs +++ b/frontend/rust-lib/flowy-grid/src/services/mod.rs @@ -1,8 +1,9 @@ mod util; pub mod block_meta_editor; +mod block_meta_manager; pub mod cell; pub mod field; pub mod grid_editor; -pub mod kv_persistence; +pub mod persistence; pub mod row; diff --git a/frontend/rust-lib/flowy-grid/src/services/persistence/block_index.rs b/frontend/rust-lib/flowy-grid/src/services/persistence/block_index.rs new file mode 100644 index 0000000000..df75ec629c --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/persistence/block_index.rs @@ -0,0 +1,48 @@ +use crate::services::persistence::GridDatabase; +use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; +use flowy_database::{ + prelude::*, + schema::{grid_block_index_table, grid_block_index_table::dsl}, +}; +use flowy_error::FlowyResult; +use std::sync::Arc; + +pub struct BlockIndexPersistence { + database: Arc, +} + +impl BlockIndexPersistence { + pub fn new(database: Arc) -> Self { + Self { database } + } + + pub fn get_block_id(&self, row_id: &str) -> FlowyResult { + let conn = self.database.db_connection()?; + let block_id = dsl::grid_block_index_table + .filter(grid_block_index_table::row_id.eq(row_id)) + .select(grid_block_index_table::block_id) + .first::(&*conn)?; + + Ok(block_id) + } + + pub fn insert_or_update(&self, block_id: &str, row_id: &str) -> FlowyResult<()> { + let conn = self.database.db_connection()?; + let item = IndexItem { + row_id: row_id.to_string(), + block_id: block_id.to_string(), + }; + let _ = diesel::replace_into(grid_block_index_table::table) + .values(item) + .execute(&*conn)?; + Ok(()) + } +} + +#[derive(PartialEq, Clone, Debug, Queryable, Identifiable, Insertable, Associations)] +#[table_name = "grid_block_index_table"] +#[primary_key(row_id)] +struct IndexItem { + row_id: String, + block_id: String, +} diff --git a/frontend/rust-lib/flowy-grid/src/services/kv_persistence.rs b/frontend/rust-lib/flowy-grid/src/services/persistence/kv.rs similarity index 95% rename from frontend/rust-lib/flowy-grid/src/services/kv_persistence.rs rename to frontend/rust-lib/flowy-grid/src/services/persistence/kv.rs index 89961ace48..06a5a2d68f 100644 --- a/frontend/rust-lib/flowy-grid/src/services/kv_persistence.rs +++ b/frontend/rust-lib/flowy-grid/src/services/persistence/kv.rs @@ -1,10 +1,10 @@ +use crate::services::persistence::GridDatabase; use ::diesel::{query_dsl::*, ExpressionMethods}; use bytes::Bytes; use diesel::SqliteConnection; use flowy_database::{ prelude::*, schema::{kv_table, kv_table::dsl}, - ConnectionPool, }; use flowy_error::{FlowyError, FlowyResult}; use std::sync::Arc; @@ -29,19 +29,19 @@ pub trait KVTransaction { } pub struct GridKVPersistence { - pool: Arc, + database: Arc, } impl GridKVPersistence { - pub fn new(pool: Arc) -> Self { - Self { pool } + pub fn new(database: Arc) -> Self { + Self { database } } pub fn begin_transaction(&self, f: F) -> FlowyResult where F: for<'a> FnOnce(SqliteTransaction<'a>) -> FlowyResult, { - let conn = self.pool.get()?; + let conn = self.database.db_connection()?; conn.immediate_transaction::<_, FlowyError, _>(|| { let sql_transaction = SqliteTransaction { conn: &conn }; f(sql_transaction) diff --git a/frontend/rust-lib/flowy-grid/src/services/persistence/mod.rs b/frontend/rust-lib/flowy-grid/src/services/persistence/mod.rs new file mode 100644 index 0000000000..d6167cf8e6 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/persistence/mod.rs @@ -0,0 +1,16 @@ +use flowy_database::{ConnectionPool, DBConnection}; +use flowy_error::FlowyError; +use std::sync::Arc; + +pub mod block_index; +pub mod kv; + +pub trait GridDatabase: Send + Sync { + fn db_pool(&self) -> Result, FlowyError>; + + fn db_connection(&self) -> Result { + let pool = self.db_pool()?; + let conn = pool.get().map_err(|e| FlowyError::internal().context(e))?; + Ok(conn) + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/row/cell_data_operation.rs b/frontend/rust-lib/flowy-grid/src/services/row/cell_data_operation.rs new file mode 100644 index 0000000000..e34c25b488 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/row/cell_data_operation.rs @@ -0,0 +1,122 @@ +use crate::services::field::*; +use std::fmt::Formatter; + +use flowy_error::FlowyError; +use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType}; +use serde::{Deserialize, Serialize}; + +pub trait CellDataOperation { + fn decode_cell_data(&self, data: String, field_meta: &FieldMeta) -> String; + fn apply_changeset>( + &self, + changeset: T, + cell_meta: Option, + ) -> Result; +} + +#[derive(Debug)] +pub struct CellDataChangeset(String); + +impl std::fmt::Display for CellDataChangeset { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", &self.0) + } +} + +impl> std::convert::From for CellDataChangeset { + fn from(s: T) -> Self { + let s = s.as_ref().to_owned(); + CellDataChangeset(s) + } +} + +impl std::ops::Deref for CellDataChangeset { + type Target = str; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct TypeOptionCellData { + pub data: String, + pub field_type: FieldType, +} + +impl std::str::FromStr for TypeOptionCellData { + type Err = FlowyError; + + fn from_str(s: &str) -> Result { + let type_option_cell_data: TypeOptionCellData = serde_json::from_str(s)?; + Ok(type_option_cell_data) + } +} + +impl TypeOptionCellData { + pub fn new(data: T, field_type: FieldType) -> Self { + TypeOptionCellData { + data: data.to_string(), + field_type, + } + } + + pub fn json(&self) -> String { + serde_json::to_string(self).unwrap_or_else(|_| "".to_owned()) + } + + pub fn is_number(&self) -> bool { + self.field_type == FieldType::Number + } + + pub fn is_text(&self) -> bool { + self.field_type == FieldType::RichText + } + + pub fn is_checkbox(&self) -> bool { + self.field_type == FieldType::Checkbox + } + + pub fn is_date(&self) -> bool { + self.field_type == FieldType::DateTime + } + + pub fn is_single_select(&self) -> bool { + self.field_type == FieldType::SingleSelect + } + + pub fn is_multi_select(&self) -> bool { + self.field_type == FieldType::MultiSelect + } +} + +/// The changeset will be deserialized into specific data base on the FieldType. +/// For example, it's String on FieldType::RichText, and SelectOptionChangeset on FieldType::SingleSelect +pub fn apply_cell_data_changeset>( + changeset: T, + cell_meta: Option, + field_meta: &FieldMeta, +) -> Result { + match field_meta.field_type { + FieldType::RichText => RichTextTypeOption::from(field_meta).apply_changeset(changeset, cell_meta), + FieldType::Number => NumberTypeOption::from(field_meta).apply_changeset(changeset, cell_meta), + FieldType::DateTime => DateTypeOption::from(field_meta).apply_changeset(changeset, cell_meta), + FieldType::SingleSelect => SingleSelectTypeOption::from(field_meta).apply_changeset(changeset, cell_meta), + FieldType::MultiSelect => MultiSelectTypeOption::from(field_meta).apply_changeset(changeset, cell_meta), + 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 { + 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) +} diff --git a/frontend/rust-lib/flowy-grid/src/services/row/cell_data_serde.rs b/frontend/rust-lib/flowy-grid/src/services/row/cell_data_serde.rs deleted file mode 100644 index 148b5254ba..0000000000 --- a/frontend/rust-lib/flowy-grid/src/services/row/cell_data_serde.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::services::cell::*; -use flowy_error::FlowyError; -use flowy_grid_data_model::entities::{FieldMeta, FieldType}; - -pub trait CellDataSerde { - fn deserialize_cell_data(&self, data: String) -> String; - fn serialize_cell_data(&self, data: &str) -> Result; -} - -#[allow(dead_code)] -pub fn serialize_cell_data(data: &str, field: &FieldMeta) -> Result { - match field.field_type { - FieldType::RichText => RichTextDescription::from(field).serialize_cell_data(data), - FieldType::Number => NumberDescription::from(field).serialize_cell_data(data), - FieldType::DateTime => DateDescription::from(field).serialize_cell_data(data), - FieldType::SingleSelect => SingleSelectDescription::from(field).serialize_cell_data(data), - FieldType::MultiSelect => MultiSelectDescription::from(field).serialize_cell_data(data), - FieldType::Checkbox => CheckboxDescription::from(field).serialize_cell_data(data), - } -} - -pub fn deserialize_cell_data(data: String, field: &FieldMeta) -> Result { - let s = match field.field_type { - FieldType::RichText => RichTextDescription::from(field).deserialize_cell_data(data), - FieldType::Number => NumberDescription::from(field).deserialize_cell_data(data), - FieldType::DateTime => DateDescription::from(field).deserialize_cell_data(data), - FieldType::SingleSelect => SingleSelectDescription::from(field).deserialize_cell_data(data), - FieldType::MultiSelect => MultiSelectDescription::from(field).deserialize_cell_data(data), - FieldType::Checkbox => CheckboxDescription::from(field).deserialize_cell_data(data), - }; - Ok(s) -} diff --git a/frontend/rust-lib/flowy-grid/src/services/row/mod.rs b/frontend/rust-lib/flowy-grid/src/services/row/mod.rs index fec4ea8d8c..f9bf130e8b 100644 --- a/frontend/rust-lib/flowy-grid/src/services/row/mod.rs +++ b/frontend/rust-lib/flowy-grid/src/services/row/mod.rs @@ -1,7 +1,8 @@ -mod cell_data_serde; +mod cell_data_operation; mod row_builder; +pub mod row_entities; mod row_loader; -pub use cell_data_serde::*; +pub use cell_data_operation::*; pub use row_builder::*; pub(crate) use row_loader::*; diff --git a/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs b/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs index cbaae78fed..0a0da4df57 100644 --- a/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs +++ b/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs @@ -1,4 +1,6 @@ -use crate::services::row::serialize_cell_data; +use crate::services::row::apply_cell_data_changeset; + +use crate::services::field::SelectOptionCellChangeset; use flowy_error::{FlowyError, FlowyResult}; use flowy_grid_data_model::entities::{CellMeta, FieldMeta, RowMeta, DEFAULT_ROW_HEIGHT}; use std::collections::HashMap; @@ -35,7 +37,23 @@ impl<'a> CreateRowMetaBuilder<'a> { Err(FlowyError::internal().context(msg)) } Some(field_meta) => { - let data = serialize_cell_data(&data, field_meta)?; + let data = apply_cell_data_changeset(&data, None, field_meta)?; + let cell = CellMeta::new(field_id, data); + self.payload.cell_by_field_id.insert(field_id.to_owned(), cell); + Ok(()) + } + } + } + + pub fn add_select_option_cell(&mut self, field_id: &str, data: String) -> FlowyResult<()> { + match self.field_meta_map.get(&field_id.to_owned()) { + None => { + let msg = format!("Invalid field_id: {}", field_id); + Err(FlowyError::internal().context(msg)) + } + Some(field_meta) => { + let cell_data = SelectOptionCellChangeset::from_insert(&data).cell_data(); + let data = apply_cell_data_changeset(&cell_data, None, field_meta)?; let cell = CellMeta::new(field_id, data); self.payload.cell_by_field_id.insert(field_id.to_owned(), cell); Ok(()) diff --git a/frontend/rust-lib/flowy-grid/src/services/row/row_entities.rs b/frontend/rust-lib/flowy-grid/src/services/row/row_entities.rs new file mode 100644 index 0000000000..38a081f6e7 --- /dev/null +++ b/frontend/rust-lib/flowy-grid/src/services/row/row_entities.rs @@ -0,0 +1,31 @@ +use flowy_derive::ProtoBuf; +use flowy_error::ErrorCode; +use flowy_grid_data_model::parser::NotEmptyUuid; + +#[derive(ProtoBuf, Default)] +pub struct RowIdentifierPayload { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 3)] + pub row_id: String, +} + +pub struct RowIdentifier { + pub grid_id: String, + pub row_id: String, +} + +impl TryInto for RowIdentifierPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + let row_id = NotEmptyUuid::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?; + + Ok(RowIdentifier { + grid_id: grid_id.0, + row_id: row_id.0, + }) + } +} diff --git a/frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs b/frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs index bf2f62c776..b37d937c0f 100644 --- a/frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs +++ b/frontend/rust-lib/flowy-grid/src/services/row/row_loader.rs @@ -1,4 +1,4 @@ -use crate::services::row::deserialize_cell_data; +use crate::services::row::decode_cell_data; use flowy_error::FlowyResult; use flowy_grid_data_model::entities::{ Cell, CellMeta, FieldMeta, GridBlock, RepeatedGridBlock, Row, RowMeta, RowOrder, @@ -8,60 +8,46 @@ use std::collections::HashMap; use std::sync::Arc; -pub(crate) struct RowIdsPerBlock { +pub(crate) struct BlockRowIds { pub(crate) block_id: String, pub(crate) row_ids: Vec, } -impl RowIdsPerBlock { +impl BlockRowIds { pub fn new(block_id: &str) -> Self { - RowIdsPerBlock { + BlockRowIds { block_id: block_id.to_owned(), row_ids: vec![], } } } -pub struct GridBlockMetaData { +pub struct GridBlockSnapshot { pub(crate) block_id: String, pub row_metas: Vec>, } -pub(crate) fn make_row_ids_per_block(row_orders: &[RowOrder]) -> Vec { - let mut map: HashMap<&String, RowIdsPerBlock> = HashMap::new(); +pub(crate) fn make_block_row_ids(row_orders: &[RowOrder]) -> Vec { + let mut map: HashMap<&String, BlockRowIds> = HashMap::new(); row_orders.iter().for_each(|row_order| { let block_id = &row_order.block_id; let row_id = row_order.row_id.clone(); map.entry(block_id) - .or_insert_with(|| RowIdsPerBlock::new(block_id)) + .or_insert_with(|| BlockRowIds::new(block_id)) .row_ids .push(row_id); }); map.into_values().collect::>() } -pub(crate) fn make_grid_blocks(block_meta_snapshots: Vec) -> FlowyResult { - Ok(block_meta_snapshots - .into_iter() - .map(|row_metas_per_block| { - let row_orders = make_row_orders_from_row_metas(&row_metas_per_block.row_metas); - GridBlock { - block_id: row_metas_per_block.block_id, - row_orders, - } - }) - .collect::>() - .into()) -} - #[inline(always)] -pub fn make_cell( +pub fn make_cell_by_field_id( field_map: &HashMap<&String, &FieldMeta>, field_id: String, - raw_cell: CellMeta, + cell_meta: CellMeta, ) -> Option<(String, Cell)> { let field_meta = field_map.get(&field_id)?; - match deserialize_cell_data(raw_cell.data, field_meta) { + match decode_cell_data(cell_meta.data, field_meta) { Ok(content) => { let cell = Cell::new(&field_id, content); Some((field_id, cell)) @@ -73,6 +59,18 @@ pub fn make_cell( } } +#[allow(dead_code)] +pub fn make_cell(field_id: &str, field_meta: &FieldMeta, row_meta: &RowMeta) -> Option { + let cell_meta = row_meta.cell_by_field_id.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 + } + } +} + pub(crate) fn make_row_orders_from_row_metas(row_metas: &[Arc]) -> Vec { row_metas.iter().map(RowOrder::from).collect::>() } @@ -88,7 +86,7 @@ pub(crate) fn make_rows_from_row_metas(fields: &[FieldMeta], row_metas: &[Arc>(); Row { @@ -101,25 +99,36 @@ pub(crate) fn make_rows_from_row_metas(fields: &[FieldMeta], row_metas: &[Arc>() } -pub(crate) fn make_grid_block_from_block_metas( - block_ids: &[String], - block_meta_data_vec: Vec, +pub(crate) fn make_grid_blocks( + block_ids: Option>, + block_snapshots: Vec, ) -> FlowyResult { - let block_meta_data_map: HashMap<&String, &Vec>> = block_meta_data_vec - .iter() - .map(|data| (&data.block_id, &data.row_metas)) - .collect(); + match block_ids { + None => Ok(block_snapshots + .into_iter() + .map(|snapshot| { + let row_orders = make_row_orders_from_row_metas(&snapshot.row_metas); + GridBlock::new(&snapshot.block_id, row_orders) + }) + .collect::>() + .into()), + Some(block_ids) => { + let block_meta_data_map: HashMap<&String, &Vec>> = block_snapshots + .iter() + .map(|data| (&data.block_id, &data.row_metas)) + .collect(); - let mut grid_blocks = vec![]; - for block_id in block_ids { - match block_meta_data_map.get(&block_id) { - None => {} - Some(row_metas) => { - let row_orders = make_row_orders_from_row_metas(row_metas); - grid_blocks.push(GridBlock::new(block_id, row_orders)); + let mut grid_blocks = vec![]; + for block_id in block_ids { + match block_meta_data_map.get(&block_id) { + None => {} + Some(row_metas) => { + let row_orders = make_row_orders_from_row_metas(row_metas); + grid_blocks.push(GridBlock::new(&block_id, row_orders)); + } + } } + Ok(grid_blocks.into()) } } - - Ok(grid_blocks.into()) } diff --git a/frontend/rust-lib/flowy-grid/src/util.rs b/frontend/rust-lib/flowy-grid/src/util.rs index 1c10eb1726..bbc2d1b642 100644 --- a/frontend/rust-lib/flowy-grid/src/util.rs +++ b/frontend/rust-lib/flowy-grid/src/util.rs @@ -1,29 +1,40 @@ -use crate::services::cell::*; use crate::services::field::*; use flowy_grid_data_model::entities::{BuildGridContext, FieldType}; use flowy_sync::client_grid::GridBuilder; pub fn make_default_grid() -> BuildGridContext { - let text_field = FieldBuilder::new(RichTextTypeOptionsBuilder::default()) + let text_field = FieldBuilder::new(RichTextTypeOptionBuilder::default()) .name("Name") .visibility(true) - .field_type(FieldType::RichText) .build(); - let single_select = SingleSelectTypeOptionsBuilder::default() + // single select + let single_select = SingleSelectTypeOptionBuilder::default() .option(SelectOption::new("Done")) .option(SelectOption::new("Unknown")) .option(SelectOption::new("Progress")); + let single_select_field = FieldBuilder::new(single_select).name("Status").visibility(true).build(); - let single_select_field = FieldBuilder::new(single_select) - .name("Status") + //multiple select + let multi_select = MultiSelectTypeOptionBuilder::default() + .option(SelectOption::new("A")) + .option(SelectOption::new("B")) + .option(SelectOption::new("C")); + let multi_select_field = FieldBuilder::new(multi_select) + .name("Alphabet") + .visibility(true) + .build(); + + let checkbox_field = FieldBuilder::from_field_type(&FieldType::Checkbox) + .name("isReady") .visibility(true) - .field_type(FieldType::SingleSelect) .build(); GridBuilder::default() .add_field(text_field) .add_field(single_select_field) + .add_field(multi_select_field) + .add_field(checkbox_field) .add_empty_row() .add_empty_row() .add_empty_row() diff --git a/frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs b/frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs index abc00d5fb2..f031c00743 100644 --- a/frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs +++ b/frontend/rust-lib/flowy-grid/tests/grid/grid_test.rs @@ -1,32 +1,34 @@ use crate::grid::script::EditorScript::*; use crate::grid::script::*; use chrono::NaiveDateTime; -use flowy_grid::services::cell::*; -use flowy_grid::services::row::{deserialize_cell_data, serialize_cell_data, CellDataSerde, CreateRowMetaBuilder}; +use flowy_grid::services::field::{ + MultiSelectTypeOption, SelectOption, SelectOptionCellChangeset, SingleSelectTypeOption, SELECTION_IDS_SEPARATOR, +}; +use flowy_grid::services::row::{apply_cell_data_changeset, decode_cell_data, CellDataOperation, CreateRowMetaBuilder}; use flowy_grid_data_model::entities::{ - CellMetaChangeset, FieldChangeset, FieldType, GridBlockMeta, GridBlockMetaChangeset, RowMetaChangeset, + CellMetaChangeset, FieldChangesetParams, FieldType, GridBlockMeta, GridBlockMetaChangeset, RowMetaChangeset, + TypeOptionDataEntry, }; #[tokio::test] async fn grid_create_field() { let mut test = GridEditorTest::new().await; - let text_field = create_text_field(); - let single_select_field = create_single_select_field(); - + let (text_field_params, text_field_meta) = create_text_field(&test.grid_id); + let (single_select_params, single_select_field) = create_single_select_field(&test.grid_id); let scripts = vec![ CreateField { - field_meta: text_field.clone(), + params: text_field_params, }, AssertFieldEqual { field_index: test.field_count, - field_meta: text_field, + field_meta: text_field_meta, }, ]; test.run_scripts(scripts).await; let scripts = vec![ CreateField { - field_meta: single_select_field.clone(), + params: single_select_params, }, AssertFieldEqual { field_index: test.field_count, @@ -39,16 +41,12 @@ async fn grid_create_field() { #[tokio::test] async fn grid_create_duplicate_field() { let mut test = GridEditorTest::new().await; - let text_field = create_text_field(); + let (params, _) = create_text_field(&test.grid_id); let field_count = test.field_count; let expected_field_count = field_count + 1; let scripts = vec![ - CreateField { - field_meta: text_field.clone(), - }, - CreateField { - field_meta: text_field.clone(), - }, + CreateField { params: params.clone() }, + CreateField { params }, AssertFieldCount(expected_field_count), ]; test.run_scripts(scripts).await; @@ -57,26 +55,19 @@ async fn grid_create_duplicate_field() { #[tokio::test] async fn grid_update_field_with_empty_change() { let mut test = GridEditorTest::new().await; - let single_select_field = create_single_select_field(); - let changeset = FieldChangeset { - field_id: single_select_field.id.clone(), - name: None, - desc: None, - field_type: None, - frozen: None, - visibility: None, - width: None, - type_options: None, + let (params, field_meta) = create_single_select_field(&test.grid_id); + let changeset = FieldChangesetParams { + field_id: field_meta.id.clone(), + grid_id: test.grid_id.clone(), + ..Default::default() }; let scripts = vec![ - CreateField { - field_meta: single_select_field.clone(), - }, + CreateField { params }, UpdateField { changeset }, AssertFieldEqual { field_index: test.field_count, - field_meta: single_select_field, + field_meta, }, ]; test.run_scripts(scripts).await; @@ -85,29 +76,27 @@ async fn grid_update_field_with_empty_change() { #[tokio::test] async fn grid_update_field() { let mut test = GridEditorTest::new().await; - let single_select_field = create_single_select_field(); + let (single_select_params, single_select_field) = create_single_select_field(&test.grid_id); let mut cloned_field = single_select_field.clone(); - let mut single_select_type_options = SingleSelectDescription::from(&single_select_field); - single_select_type_options.options.push(SelectOption::new("Unknown")); - let changeset = FieldChangeset { + let mut single_select_type_option = SingleSelectTypeOption::from(&single_select_field); + single_select_type_option.options.push(SelectOption::new("Unknown")); + let changeset = FieldChangesetParams { field_id: single_select_field.id.clone(), - name: None, - desc: None, - field_type: None, + grid_id: test.grid_id.clone(), frozen: Some(true), - visibility: None, width: Some(1000), - type_options: Some(single_select_type_options.clone().into()), + type_option_data: Some(single_select_type_option.protobuf_bytes().to_vec()), + ..Default::default() }; cloned_field.frozen = true; cloned_field.width = 1000; - cloned_field.type_options = single_select_type_options.into(); + cloned_field.insert_type_option_entry(&single_select_type_option); let scripts = vec![ CreateField { - field_meta: single_select_field.clone(), + params: single_select_params, }, UpdateField { changeset }, AssertFieldEqual { @@ -122,11 +111,9 @@ async fn grid_update_field() { async fn grid_delete_field() { let mut test = GridEditorTest::new().await; let expected_field_count = test.field_count; - let text_field = create_text_field(); + let (text_params, text_field) = create_text_field(&test.grid_id); let scripts = vec![ - CreateField { - field_meta: text_field.clone(), - }, + CreateField { params: text_params }, DeleteField { field_meta: text_field }, AssertFieldCount(expected_field_count), ]; @@ -246,37 +233,31 @@ async fn grid_row_add_cells_test() { for field in &test.field_metas { match field.field_type { FieldType::RichText => { - let data = serialize_cell_data("hello world", field).unwrap(); - builder.add_cell(&field.id, data).unwrap(); + builder.add_cell(&field.id, "hello world".to_owned()).unwrap(); } FieldType::Number => { - let data = serialize_cell_data("Â¥18,443", field).unwrap(); - builder.add_cell(&field.id, data).unwrap(); + builder.add_cell(&field.id, "18,443".to_owned()).unwrap(); } FieldType::DateTime => { - let data = serialize_cell_data("1647251762", field).unwrap(); - builder.add_cell(&field.id, data).unwrap(); + builder.add_cell(&field.id, "1647251762".to_owned()).unwrap(); } FieldType::SingleSelect => { - let description = SingleSelectDescription::from(field); - let options = description.options.first().unwrap(); - let data = description.serialize_cell_data(&options.id).unwrap(); - builder.add_cell(&field.id, data).unwrap(); + let type_option = SingleSelectTypeOption::from(field); + let option = type_option.options.first().unwrap(); + builder.add_select_option_cell(&field.id, option.id.clone()).unwrap(); } FieldType::MultiSelect => { - let description = MultiSelectDescription::from(field); - let options = description + let type_option = MultiSelectTypeOption::from(field); + let ops_ids = type_option .options .iter() .map(|option| option.id.clone()) .collect::>() .join(SELECTION_IDS_SEPARATOR); - let data = description.serialize_cell_data(&options).unwrap(); - builder.add_cell(&field.id, data).unwrap(); + builder.add_select_option_cell(&field.id, ops_ids).unwrap(); } FieldType::Checkbox => { - let data = serialize_cell_data("false", field).unwrap(); - builder.add_cell(&field.id, data).unwrap(); + builder.add_cell(&field.id, "false".to_string()).unwrap(); } } } @@ -285,61 +266,6 @@ async fn grid_row_add_cells_test() { test.run_scripts(scripts).await; } -#[tokio::test] -async fn grid_row_add_selection_cell_test() { - let mut test = GridEditorTest::new().await; - let mut builder = CreateRowMetaBuilder::new(&test.field_metas); - let uuid = uuid::Uuid::new_v4().to_string(); - let mut single_select_field_id = "".to_string(); - let mut multi_select_field_id = "".to_string(); - for field in &test.field_metas { - match field.field_type { - FieldType::SingleSelect => { - single_select_field_id = field.id.clone(); - // The element must be parsed as uuid - assert!(builder.add_cell(&field.id, "data".to_owned()).is_err()); - // // The data should not be empty - assert!(builder.add_cell(&field.id, "".to_owned()).is_err()); - // The element must be parsed as uuid - assert!(builder.add_cell(&field.id, "1,2,3".to_owned()).is_err(),); - // The separator must be comma - assert!(builder.add_cell(&field.id, format!("{}. {}", &uuid, &uuid),).is_err()); - // - - assert!(builder.add_cell(&field.id, uuid.clone()).is_ok()); - assert!(builder.add_cell(&field.id, format!("{}, {}", &uuid, &uuid)).is_ok()); - } - FieldType::MultiSelect => { - multi_select_field_id = field.id.clone(); - assert!(builder.add_cell(&field.id, format!("{}, {}", &uuid, &uuid)).is_ok()); - } - _ => {} - } - } - let context = builder.build(); - assert_eq!( - &context - .cell_by_field_id - .get(&single_select_field_id) - .as_ref() - .unwrap() - .data, - &uuid - ); - assert_eq!( - context - .cell_by_field_id - .get(&multi_select_field_id) - .as_ref() - .unwrap() - .data, - format!("{},{}", &uuid, &uuid) - ); - - let scripts = vec![CreateRow { context }]; - test.run_scripts(scripts).await; -} - #[tokio::test] async fn grid_row_add_date_cell_test() { let mut test = GridEditorTest::new().await; @@ -361,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!( - deserialize_cell_data(cell_data.data.clone(), &date_field).unwrap(), + decode_cell_data(cell_data.data.clone(), &date_field).unwrap(), "2022/03/16 08:31", ); let scripts = vec![CreateRow { context }]; @@ -387,12 +313,12 @@ async fn grid_cell_update() { FieldType::Number => "123".to_string(), FieldType::DateTime => "123".to_string(), FieldType::SingleSelect => { - let description = SingleSelectDescription::from(field_meta); - description.options.first().unwrap().id.clone() + let type_option = SingleSelectTypeOption::from(field_meta); + SelectOptionCellChangeset::from_insert(&type_option.options.first().unwrap().id).cell_data() } FieldType::MultiSelect => { - let description = MultiSelectDescription::from(field_meta); - description.options.first().unwrap().id.clone() + let type_option = MultiSelectTypeOption::from(field_meta); + SelectOptionCellChangeset::from_insert(&type_option.options.first().unwrap().id).cell_data() } FieldType::Checkbox => "1".to_string(), }; @@ -413,8 +339,8 @@ async fn grid_cell_update() { FieldType::RichText => ("1".to_string().repeat(10001), true), FieldType::Number => ("abc".to_string(), true), FieldType::DateTime => ("abc".to_string(), true), - FieldType::SingleSelect => ("abc".to_string(), true), - FieldType::MultiSelect => ("abc".to_string(), true), + FieldType::SingleSelect => (SelectOptionCellChangeset::from_insert("abc").cell_data(), false), + FieldType::MultiSelect => (SelectOptionCellChangeset::from_insert("abc").cell_data(), false), FieldType::Checkbox => ("2".to_string(), false), }; diff --git a/frontend/rust-lib/flowy-grid/tests/grid/script.rs b/frontend/rust-lib/flowy-grid/tests/grid/script.rs index 0da0a911f1..9c3cfd53d7 100644 --- a/frontend/rust-lib/flowy-grid/tests/grid/script.rs +++ b/frontend/rust-lib/flowy-grid/tests/grid/script.rs @@ -1,18 +1,16 @@ use bytes::Bytes; -use flowy_sync::client_grid::GridBuilder; -use std::collections::HashMap; - -use flowy_grid::services::cell::*; 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, FieldChangeset, FieldMeta, FieldType, GridBlockMeta, GridBlockMetaChangeset, - RowMeta, RowMetaChangeset, RowOrder, + BuildGridContext, CellMetaChangeset, 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; use flowy_test::helper::ViewTest; use flowy_test::FlowySDKTest; +use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; use strum::EnumCount; @@ -20,10 +18,10 @@ use tokio::time::sleep; pub enum EditorScript { CreateField { - field_meta: FieldMeta, + params: CreateFieldParams, }, UpdateField { - changeset: FieldChangeset, + changeset: FieldChangesetParams, }, DeleteField { field_meta: FieldMeta, @@ -91,7 +89,7 @@ impl GridEditorTest { let view_data: Bytes = build_context.try_into().unwrap(); 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(None).await.unwrap(); + let field_metas = editor.get_field_metas::(None).await.unwrap(); let grid_blocks = editor.get_block_metas().await.unwrap(); let row_metas = get_row_metas(&editor).await; @@ -121,35 +119,39 @@ impl GridEditorTest { let _cache = rev_manager.revision_cache().await; match script { - EditorScript::CreateField { field_meta } => { - if !self.editor.contain_field(&field_meta).await { + EditorScript::CreateField { params } => { + if !self.editor.contain_field(¶ms.field.id).await { self.field_count += 1; } - self.editor.create_field(field_meta).await.unwrap(); - self.field_metas = self.editor.get_field_metas(None).await.unwrap(); + + self.editor.create_field(params).await.unwrap(); + self.field_metas = self.editor.get_field_metas::(None).await.unwrap(); assert_eq!(self.field_count, self.field_metas.len()); } EditorScript::UpdateField { changeset: change } => { self.editor.update_field(change).await.unwrap(); - self.field_metas = self.editor.get_field_metas(None).await.unwrap(); + self.field_metas = self.editor.get_field_metas::(None).await.unwrap(); } EditorScript::DeleteField { field_meta } => { - if self.editor.contain_field(&field_meta).await { + if self.editor.contain_field(&field_meta.id).await { self.field_count -= 1; } self.editor.delete_field(&field_meta.id).await.unwrap(); - self.field_metas = self.editor.get_field_metas(None).await.unwrap(); + self.field_metas = self.editor.get_field_metas::(None).await.unwrap(); assert_eq!(self.field_count, self.field_metas.len()); } EditorScript::AssertFieldCount(count) => { - assert_eq!(self.editor.get_field_metas(None).await.unwrap().len(), count); + assert_eq!( + self.editor.get_field_metas::(None).await.unwrap().len(), + count + ); } EditorScript::AssertFieldEqual { field_index, field_meta, } => { - let field_metas = self.editor.get_field_metas(None).await.unwrap(); + let field_metas = self.editor.get_field_metas::(None).await.unwrap(); assert_eq!(field_metas[field_index].clone(), field_meta); } EditorScript::CreateBlock { block } => { @@ -239,7 +241,7 @@ impl GridEditorTest { async fn get_row_metas(editor: &Arc) -> Vec> { editor - .get_block_meta_data_vec(None) + .grid_block_snapshots(None) .await .unwrap() .pop() @@ -247,81 +249,108 @@ async fn get_row_metas(editor: &Arc) -> Vec> { .row_metas } -pub fn create_text_field() -> FieldMeta { - FieldBuilder::new(RichTextTypeOptionsBuilder::default()) +pub fn create_text_field(grid_id: &str) -> (CreateFieldParams, FieldMeta) { + let field_meta = FieldBuilder::new(RichTextTypeOptionBuilder::default()) .name("Name") .visibility(true) - .field_type(FieldType::RichText) - .build() + .build(); + + let cloned_field_meta = field_meta.clone(); + + let type_option_data = field_meta + .get_type_option_entry::(None) + .unwrap() + .protobuf_bytes() + .to_vec(); + + let field = Field { + id: field_meta.id, + name: field_meta.name, + desc: field_meta.desc, + field_type: field_meta.field_type, + frozen: field_meta.frozen, + visibility: field_meta.visibility, + width: field_meta.width, + }; + + let params = CreateFieldParams { + grid_id: grid_id.to_owned(), + field, + type_option_data, + start_field_id: None, + }; + (params, cloned_field_meta) } -pub fn create_single_select_field() -> FieldMeta { - let single_select = SingleSelectTypeOptionsBuilder::default() +pub fn create_single_select_field(grid_id: &str) -> (CreateFieldParams, FieldMeta) { + let single_select = SingleSelectTypeOptionBuilder::default() .option(SelectOption::new("Done")) .option(SelectOption::new("Progress")); - FieldBuilder::new(single_select) - .name("Name") - .visibility(true) - .field_type(FieldType::SingleSelect) - .build() + 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::(None) + .unwrap() + .protobuf_bytes() + .to_vec(); + + let field = Field { + id: field_meta.id, + name: field_meta.name, + desc: field_meta.desc, + field_type: field_meta.field_type, + frozen: field_meta.frozen, + visibility: field_meta.visibility, + width: field_meta.width, + }; + + let params = CreateFieldParams { + grid_id: grid_id.to_owned(), + field, + type_option_data, + start_field_id: None, + }; + (params, cloned_field_meta) } fn make_template_1_grid() -> BuildGridContext { - let text_field = FieldBuilder::new(RichTextTypeOptionsBuilder::default()) + let text_field = FieldBuilder::new(RichTextTypeOptionBuilder::default()) .name("Name") .visibility(true) - .field_type(FieldType::RichText) .build(); // Single Select - let single_select = SingleSelectTypeOptionsBuilder::default() + let single_select = SingleSelectTypeOptionBuilder::default() .option(SelectOption::new("Live")) .option(SelectOption::new("Completed")) .option(SelectOption::new("Planned")) .option(SelectOption::new("Paused")); - let single_select_field = FieldBuilder::new(single_select) - .name("Status") - .visibility(true) - .field_type(FieldType::SingleSelect) - .build(); + let single_select_field = FieldBuilder::new(single_select).name("Status").visibility(true).build(); // MultiSelect - let multi_select = MultiSelectTypeOptionsBuilder::default() + let multi_select = MultiSelectTypeOptionBuilder::default() .option(SelectOption::new("Google")) .option(SelectOption::new("Facebook")) .option(SelectOption::new("Twitter")); let multi_select_field = FieldBuilder::new(multi_select) .name("Platform") .visibility(true) - .field_type(FieldType::MultiSelect) .build(); // Number - let number = NumberTypeOptionsBuilder::default().set_format(NumberFormat::USD); - let number_field = FieldBuilder::new(number) - .name("Price") - .visibility(true) - .field_type(FieldType::Number) - .build(); + let number = NumberTypeOptionBuilder::default().set_format(NumberFormat::USD); + let number_field = FieldBuilder::new(number).name("Price").visibility(true).build(); // Date - let date = DateTypeOptionsBuilder::default() + let date = DateTypeOptionBuilder::default() .date_format(DateFormat::US) .time_format(TimeFormat::TwentyFourHour); - let date_field = FieldBuilder::new(date) - .name("Time") - .visibility(true) - .field_type(FieldType::DateTime) - .build(); + let date_field = FieldBuilder::new(date).name("Time").visibility(true).build(); // Checkbox - let checkbox = CheckboxTypeOptionsBuilder::default(); - let checkbox_field = FieldBuilder::new(checkbox) - .name("is done") - .visibility(true) - .field_type(FieldType::Checkbox) - .build(); + let checkbox = CheckboxTypeOptionBuilder::default(); + let checkbox_field = FieldBuilder::new(checkbox).name("is done").visibility(true).build(); GridBuilder::default() .add_field(text_field) diff --git a/frontend/rust-lib/flowy-revision/src/rev_manager.rs b/frontend/rust-lib/flowy-revision/src/rev_manager.rs index 3cd9b54de0..68d8db6f27 100644 --- a/frontend/rust-lib/flowy-revision/src/rev_manager.rs +++ b/frontend/rust-lib/flowy-revision/src/rev_manager.rs @@ -67,6 +67,7 @@ impl RevisionManager { } } + #[tracing::instrument(level = "debug", skip_all, fields(object_id) err)] pub async fn load(&mut self, cloud: Option>) -> FlowyResult where B: RevisionObjectBuilder, @@ -80,6 +81,7 @@ impl RevisionManager { .load() .await?; self.rev_id_counter.set(rev_id); + tracing::Span::current().record("object_id", &self.object_id.as_str()); B::build_object(&self.object_id, revisions) } diff --git a/frontend/rust-lib/flowy-sdk/src/deps_resolve/grid_deps.rs b/frontend/rust-lib/flowy-sdk/src/deps_resolve/grid_deps.rs index 514c320511..88073a3107 100644 --- a/frontend/rust-lib/flowy-sdk/src/deps_resolve/grid_deps.rs +++ b/frontend/rust-lib/flowy-sdk/src/deps_resolve/grid_deps.rs @@ -2,6 +2,7 @@ use crate::FlowyError; use bytes::Bytes; use flowy_database::ConnectionPool; use flowy_grid::manager::{GridManager, GridUser}; +use flowy_grid::services::persistence::GridDatabase; use flowy_net::ws::connection::FlowyWebSocketConnect; use flowy_revision::{RevisionWebSocket, WSStateReceiver}; use flowy_sync::entities::ws_data::ClientRevisionWSData; @@ -16,9 +17,20 @@ pub struct GridDepsResolver(); impl GridDepsResolver { pub fn resolve(ws_conn: Arc, user_session: Arc) -> Arc { - let user = Arc::new(GridUserImpl(user_session)); + let user = Arc::new(GridUserImpl(user_session.clone())); let rev_web_socket = Arc::new(GridWebSocket(ws_conn)); - Arc::new(GridManager::new(user, rev_web_socket)) + Arc::new(GridManager::new( + user, + rev_web_socket, + Arc::new(GridDatabaseImpl(user_session)), + )) + } +} + +struct GridDatabaseImpl(Arc); +impl GridDatabase for GridDatabaseImpl { + fn db_pool(&self) -> Result, FlowyError> { + self.0.db_pool().map_err(|e| FlowyError::internal().context(e)) } } diff --git a/frontend/rust-lib/flowy-text-block/tests/editor/mod.rs b/frontend/rust-lib/flowy-text-block/tests/editor/mod.rs index d1c6f94380..f9ed7c72ac 100644 --- a/frontend/rust-lib/flowy-text-block/tests/editor/mod.rs +++ b/frontend/rust-lib/flowy-text-block/tests/editor/mod.rs @@ -4,6 +4,7 @@ mod op_test; mod serde_test; mod undo_redo_test; +use derive_more::Display; use flowy_sync::client_document::{ClientDocument, InitialDocumentText}; use lib_ot::{ core::*, diff --git a/shared-lib/flowy-error-code/src/code.rs b/shared-lib/flowy-error-code/src/code.rs index bccc0fefd9..0315306871 100644 --- a/shared-lib/flowy-error-code/src/code.rs +++ b/shared-lib/flowy-error-code/src/code.rs @@ -88,14 +88,31 @@ pub enum ErrorCode { UserNotExist = 312, #[display(fmt = "Text is too long")] TextTooLong = 400, - #[display(fmt = "Grid block id is empty")] - BlockIdIsEmpty = 401, - #[display(fmt = "Row id is empty")] - RowIdIsEmpty = 402, + #[display(fmt = "Grid id is empty")] - GridIdIsEmpty = 403, + GridIdIsEmpty = 410, + #[display(fmt = "Grid block id is empty")] + BlockIdIsEmpty = 420, + #[display(fmt = "Row id is empty")] + RowIdIsEmpty = 430, + #[display(fmt = "Select option id is empty")] + OptionIdIsEmpty = 431, + #[display(fmt = "Field id is empty")] + FieldIdIsEmpty = 440, + #[display(fmt = "Field doesn't exist")] + FieldDoesNotExist = 441, + #[display(fmt = "The name of the option should not be empty")] + SelectOptionNameIsEmpty = 442, + #[display(fmt = "Field not exists")] + FieldNotExists = 443, + #[display(fmt = "The operation in this field is invalid")] + FieldInvalidOperation = 444, + + #[display(fmt = "Field's type option data should not be empty")] + TypeOptionDataIsEmpty = 450, + #[display(fmt = "Invalid data")] - InvalidData = 404, + InvalidData = 500, } impl ErrorCode { diff --git a/shared-lib/flowy-error-code/src/protobuf/model/code.rs b/shared-lib/flowy-error-code/src/protobuf/model/code.rs index 63a645ea6c..5653852147 100644 --- a/shared-lib/flowy-error-code/src/protobuf/model/code.rs +++ b/shared-lib/flowy-error-code/src/protobuf/model/code.rs @@ -57,10 +57,17 @@ pub enum ErrorCode { UserIdInvalid = 311, UserNotExist = 312, TextTooLong = 400, - BlockIdIsEmpty = 401, - RowIdIsEmpty = 402, - GridIdIsEmpty = 403, - InvalidData = 404, + GridIdIsEmpty = 410, + BlockIdIsEmpty = 420, + RowIdIsEmpty = 430, + OptionIdIsEmpty = 431, + FieldIdIsEmpty = 440, + FieldDoesNotExist = 441, + SelectOptionNameIsEmpty = 442, + FieldNotExists = 443, + FieldInvalidOperation = 444, + TypeOptionDataIsEmpty = 450, + InvalidData = 500, } impl ::protobuf::ProtobufEnum for ErrorCode { @@ -102,10 +109,17 @@ impl ::protobuf::ProtobufEnum for ErrorCode { 311 => ::std::option::Option::Some(ErrorCode::UserIdInvalid), 312 => ::std::option::Option::Some(ErrorCode::UserNotExist), 400 => ::std::option::Option::Some(ErrorCode::TextTooLong), - 401 => ::std::option::Option::Some(ErrorCode::BlockIdIsEmpty), - 402 => ::std::option::Option::Some(ErrorCode::RowIdIsEmpty), - 403 => ::std::option::Option::Some(ErrorCode::GridIdIsEmpty), - 404 => ::std::option::Option::Some(ErrorCode::InvalidData), + 410 => ::std::option::Option::Some(ErrorCode::GridIdIsEmpty), + 420 => ::std::option::Option::Some(ErrorCode::BlockIdIsEmpty), + 430 => ::std::option::Option::Some(ErrorCode::RowIdIsEmpty), + 431 => ::std::option::Option::Some(ErrorCode::OptionIdIsEmpty), + 440 => ::std::option::Option::Some(ErrorCode::FieldIdIsEmpty), + 441 => ::std::option::Option::Some(ErrorCode::FieldDoesNotExist), + 442 => ::std::option::Option::Some(ErrorCode::SelectOptionNameIsEmpty), + 443 => ::std::option::Option::Some(ErrorCode::FieldNotExists), + 444 => ::std::option::Option::Some(ErrorCode::FieldInvalidOperation), + 450 => ::std::option::Option::Some(ErrorCode::TypeOptionDataIsEmpty), + 500 => ::std::option::Option::Some(ErrorCode::InvalidData), _ => ::std::option::Option::None } } @@ -144,9 +158,16 @@ impl ::protobuf::ProtobufEnum for ErrorCode { ErrorCode::UserIdInvalid, ErrorCode::UserNotExist, ErrorCode::TextTooLong, + ErrorCode::GridIdIsEmpty, ErrorCode::BlockIdIsEmpty, ErrorCode::RowIdIsEmpty, - ErrorCode::GridIdIsEmpty, + ErrorCode::OptionIdIsEmpty, + ErrorCode::FieldIdIsEmpty, + ErrorCode::FieldDoesNotExist, + ErrorCode::SelectOptionNameIsEmpty, + ErrorCode::FieldNotExists, + ErrorCode::FieldInvalidOperation, + ErrorCode::TypeOptionDataIsEmpty, ErrorCode::InvalidData, ]; values @@ -176,7 +197,7 @@ impl ::protobuf::reflect::ProtobufValue for ErrorCode { } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\ncode.proto*\xb7\x06\n\tErrorCode\x12\x0c\n\x08Internal\x10\0\x12\x14\ + \n\ncode.proto*\xe5\x07\n\tErrorCode\x12\x0c\n\x08Internal\x10\0\x12\x14\ \n\x10UserUnauthorized\x10\x02\x12\x12\n\x0eRecordNotFound\x10\x03\x12\ \x11\n\rUserIdIsEmpty\x10\x04\x12\x18\n\x14WorkspaceNameInvalid\x10d\x12\ \x16\n\x12WorkspaceIdInvalid\x10e\x12\x18\n\x14AppColorStyleInvalid\x10f\ @@ -193,10 +214,14 @@ static file_descriptor_proto_data: &'static [u8] = b"\ swordNotMatch\x10\xb3\x02\x12\x14\n\x0fUserNameTooLong\x10\xb4\x02\x12'\ \n\"UserNameContainForbiddenCharacters\x10\xb5\x02\x12\x14\n\x0fUserName\ IsEmpty\x10\xb6\x02\x12\x12\n\rUserIdInvalid\x10\xb7\x02\x12\x11\n\x0cUs\ - erNotExist\x10\xb8\x02\x12\x10\n\x0bTextTooLong\x10\x90\x03\x12\x13\n\ - \x0eBlockIdIsEmpty\x10\x91\x03\x12\x11\n\x0cRowIdIsEmpty\x10\x92\x03\x12\ - \x12\n\rGridIdIsEmpty\x10\x93\x03\x12\x10\n\x0bInvalidData\x10\x94\x03b\ - \x06proto3\ + erNotExist\x10\xb8\x02\x12\x10\n\x0bTextTooLong\x10\x90\x03\x12\x12\n\rG\ + ridIdIsEmpty\x10\x9a\x03\x12\x13\n\x0eBlockIdIsEmpty\x10\xa4\x03\x12\x11\ + \n\x0cRowIdIsEmpty\x10\xae\x03\x12\x14\n\x0fOptionIdIsEmpty\x10\xaf\x03\ + \x12\x13\n\x0eFieldIdIsEmpty\x10\xb8\x03\x12\x16\n\x11FieldDoesNotExist\ + \x10\xb9\x03\x12\x1c\n\x17SelectOptionNameIsEmpty\x10\xba\x03\x12\x13\n\ + \x0eFieldNotExists\x10\xbb\x03\x12\x1a\n\x15FieldInvalidOperation\x10\ + \xbc\x03\x12\x1a\n\x15TypeOptionDataIsEmpty\x10\xc2\x03\x12\x10\n\x0bInv\ + alidData\x10\xf4\x03b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/shared-lib/flowy-error-code/src/protobuf/proto/code.proto b/shared-lib/flowy-error-code/src/protobuf/proto/code.proto index f8b8acb8e6..aca3309526 100644 --- a/shared-lib/flowy-error-code/src/protobuf/proto/code.proto +++ b/shared-lib/flowy-error-code/src/protobuf/proto/code.proto @@ -33,8 +33,15 @@ enum ErrorCode { UserIdInvalid = 311; UserNotExist = 312; TextTooLong = 400; - BlockIdIsEmpty = 401; - RowIdIsEmpty = 402; - GridIdIsEmpty = 403; - InvalidData = 404; + GridIdIsEmpty = 410; + BlockIdIsEmpty = 420; + RowIdIsEmpty = 430; + OptionIdIsEmpty = 431; + FieldIdIsEmpty = 440; + FieldDoesNotExist = 441; + SelectOptionNameIsEmpty = 442; + FieldNotExists = 443; + FieldInvalidOperation = 444; + TypeOptionDataIsEmpty = 450; + InvalidData = 500; } diff --git a/shared-lib/flowy-grid-data-model/src/entities/grid.rs b/shared-lib/flowy-grid-data-model/src/entities/grid.rs index c195a85c24..d3cb9f7f69 100644 --- a/shared-lib/flowy-grid-data-model/src/entities/grid.rs +++ b/shared-lib/flowy-grid-data-model/src/entities/grid.rs @@ -1,5 +1,7 @@ use crate::entities::{FieldMeta, FieldType, RowMeta}; +use crate::parser::NotEmptyUuid; use flowy_derive::ProtoBuf; +use flowy_error_code::ErrorCode; use std::collections::HashMap; use std::sync::Arc; @@ -39,6 +41,20 @@ pub struct Field { pub width: i32, } +impl std::convert::From for Field { + fn from(field_meta: FieldMeta) -> Self { + Self { + id: field_meta.id, + name: field_meta.name, + desc: field_meta.desc, + field_type: field_meta.field_type, + frozen: field_meta.frozen, + visibility: field_meta.visibility, + width: field_meta.width, + } + } +} + #[derive(Debug, Clone, Default, ProtoBuf)] pub struct FieldOrder { #[pb(index = 1)] @@ -53,20 +69,74 @@ impl std::convert::From<&FieldMeta> for FieldOrder { } } -impl std::convert::From for Field { - fn from(field_meta: FieldMeta) -> Self { - Self { - id: field_meta.id, - name: field_meta.name, - desc: field_meta.desc, - field_type: field_meta.field_type, - frozen: field_meta.frozen, - visibility: field_meta.visibility, - width: field_meta.width, - } +impl std::convert::From<&str> for FieldOrder { + fn from(s: &str) -> Self { + FieldOrder { field_id: s.to_owned() } } } +impl std::convert::From for FieldOrder { + fn from(s: String) -> Self { + FieldOrder { field_id: s } + } +} + +#[derive(Debug, Default, ProtoBuf)] +pub struct GetEditFieldContextPayload { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2, one_of)] + pub field_id: Option, + + #[pb(index = 3)] + pub field_type: FieldType, +} + +#[derive(Debug, Default, ProtoBuf)] +pub struct EditFieldPayload { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2)] + pub field_id: String, + + #[pb(index = 3)] + pub field_type: FieldType, +} + +pub struct EditFieldParams { + pub grid_id: String, + pub field_id: String, + pub field_type: FieldType, +} + +impl TryInto for EditFieldPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + let field_id = NotEmptyUuid::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?; + Ok(EditFieldParams { + grid_id: grid_id.0, + field_id: field_id.0, + field_type: self.field_type, + }) + } +} + +#[derive(Debug, Default, ProtoBuf)] +pub struct EditFieldContext { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2)] + pub grid_field: Field, + + #[pb(index = 3)] + pub type_option_data: Vec, +} + #[derive(Debug, Default, ProtoBuf)] pub struct RepeatedField { #[pb(index = 1)] @@ -104,6 +174,20 @@ impl std::ops::Deref for RepeatedFieldOrder { } } +impl std::convert::From> for RepeatedFieldOrder { + fn from(field_orders: Vec) -> Self { + RepeatedFieldOrder { items: field_orders } + } +} + +impl std::convert::From for RepeatedFieldOrder { + fn from(s: String) -> Self { + RepeatedFieldOrder { + items: vec![FieldOrder::from(s)], + } + } +} + #[derive(Debug, Default, Clone, ProtoBuf)] pub struct RowOrder { #[pb(index = 1)] @@ -178,10 +262,16 @@ pub struct GridBlockOrder { pub block_id: String, } +impl std::convert::From<&str> for GridBlockOrder { + fn from(s: &str) -> Self { + GridBlockOrder { block_id: s.to_owned() } + } +} + #[derive(Debug, Default, ProtoBuf)] pub struct GridBlock { #[pb(index = 1)] - pub block_id: String, + pub id: String, #[pb(index = 2)] pub row_orders: Vec, @@ -190,7 +280,7 @@ pub struct GridBlock { impl GridBlock { pub fn new(block_id: &str, row_orders: Vec) -> Self { Self { - block_id: block_id.to_owned(), + id: block_id.to_owned(), row_orders, } } @@ -214,6 +304,21 @@ impl Cell { } } +#[derive(Debug, Clone, Default, ProtoBuf)] +pub struct CellNotificationData { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2)] + pub field_id: String, + + #[pb(index = 3)] + pub row_id: String, + + #[pb(index = 4, one_of)] + pub content: Option, +} + #[derive(Debug, Default, ProtoBuf)] pub struct RepeatedCell { #[pb(index = 1)] @@ -269,6 +374,12 @@ impl AsRef for GridBlockId { } } +impl std::convert::From<&str> for GridBlockId { + fn from(s: &str) -> Self { + GridBlockId { value: s.to_owned() } + } +} + #[derive(ProtoBuf, Default)] pub struct CreateRowPayload { #[pb(index = 1)] @@ -278,6 +389,68 @@ pub struct CreateRowPayload { pub start_row_id: Option, } +#[derive(Default)] +pub struct CreateRowParams { + pub grid_id: String, + pub start_row_id: Option, +} + +impl TryInto for CreateRowPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + Ok(CreateRowParams { + grid_id: grid_id.0, + start_row_id: self.start_row_id, + }) + } +} + +#[derive(ProtoBuf, Default)] +pub struct CreateFieldPayload { + #[pb(index = 1)] + pub grid_id: String, + + #[pb(index = 2)] + pub field: Field, + + #[pb(index = 3)] + pub type_option_data: Vec, + + #[pb(index = 4, one_of)] + pub start_field_id: Option, +} + +#[derive(Clone)] +pub struct CreateFieldParams { + pub grid_id: String, + pub field: Field, + pub type_option_data: Vec, + pub start_field_id: Option, +} + +impl TryInto for CreateFieldPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + let _ = NotEmptyUuid::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), + }; + + Ok(CreateFieldParams { + grid_id: grid_id.0, + field: self.field, + type_option_data: self.type_option_data, + start_field_id, + }) + } +} + #[derive(ProtoBuf, Default)] pub struct QueryFieldPayload { #[pb(index = 1)] @@ -287,6 +460,23 @@ pub struct QueryFieldPayload { pub field_orders: RepeatedFieldOrder, } +pub struct QueryFieldParams { + pub grid_id: String, + pub field_orders: RepeatedFieldOrder, +} + +impl TryInto for QueryFieldPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + Ok(QueryFieldParams { + grid_id: grid_id.0, + field_orders: self.field_orders, + }) + } +} + #[derive(ProtoBuf, Default)] pub struct QueryGridBlocksPayload { #[pb(index = 1)] @@ -296,14 +486,19 @@ pub struct QueryGridBlocksPayload { pub block_orders: Vec, } -#[derive(ProtoBuf, Default)] -pub struct QueryRowPayload { - #[pb(index = 1)] +pub struct QueryGridBlocksParams { pub grid_id: String, - - #[pb(index = 2)] - pub block_id: String, - - #[pb(index = 3)] - pub row_id: String, + pub block_orders: Vec, +} + +impl TryInto for QueryGridBlocksPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let grid_id = NotEmptyUuid::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; + Ok(QueryGridBlocksParams { + grid_id: grid_id.0, + block_orders: self.block_orders, + }) + } } diff --git a/shared-lib/flowy-grid-data-model/src/entities/meta.rs b/shared-lib/flowy-grid-data-model/src/entities/meta.rs index 9ba374169c..cf48a70823 100644 --- a/shared-lib/flowy-grid-data-model/src/entities/meta.rs +++ b/shared-lib/flowy-grid-data-model/src/entities/meta.rs @@ -1,9 +1,12 @@ +use crate::parser::NotEmptyUuid; +use bytes::Bytes; use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; +use flowy_error_code::ErrorCode; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use strum_macros::{Display, EnumCount as EnumCountMacro, EnumIter, EnumString}; -pub const DEFAULT_ROW_HEIGHT: i32 = 36; +pub const DEFAULT_ROW_HEIGHT: i32 = 42; pub const DEFAULT_FIELD_WIDTH: i32 = 150; #[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)] @@ -66,7 +69,7 @@ impl GridBlockMetaChangeset { } #[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf)] -pub struct GridBlockMetaSerde { +pub struct GridBlockMetaData { #[pb(index = 1)] pub block_id: String, @@ -74,7 +77,7 @@ pub struct GridBlockMetaSerde { pub row_metas: Vec, } -#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf, PartialEq, Eq)] +#[derive(Debug, Clone, Default, Serialize, Deserialize, ProtoBuf, Eq, PartialEq)] pub struct FieldMeta { #[pb(index = 1)] pub id: String, @@ -98,7 +101,7 @@ pub struct FieldMeta { pub width: i32, #[pb(index = 8)] - pub type_options: String, + pub type_option_by_field_type_id: TypeOptionDataByFieldTypeId, } impl FieldMeta { @@ -111,41 +114,139 @@ impl FieldMeta { frozen: false, visibility: true, width: DEFAULT_FIELD_WIDTH, - type_options: Default::default(), + type_option_by_field_type_id: Default::default(), } } + + pub fn insert_type_option_entry(&mut self, entry: &T) { + self.type_option_by_field_type_id + .insert(entry.field_type().type_id(), entry.json_str()); + } + + pub fn get_type_option_entry(&self, field_type: Option) -> Option { + let field_type = field_type.as_ref().unwrap_or(&self.field_type); + self.type_option_by_field_type_id + .get(&field_type.type_id()) + .map(|s| T::from_json_str(s)) + } + + pub fn insert_type_option_str(&mut self, field_type: &FieldType, json_str: String) { + self.type_option_by_field_type_id.insert(field_type.type_id(), json_str); + } + + pub fn get_type_option_str(&self, field_type: Option) -> Option { + let field_type = field_type.as_ref().unwrap_or(&self.field_type); + self.type_option_by_field_type_id + .get(&field_type.type_id()) + .map(|s| s.to_owned()) + } +} + +pub trait TypeOptionDataEntry { + fn field_type(&self) -> FieldType; + fn json_str(&self) -> String; + fn protobuf_bytes(&self) -> Bytes; +} + +pub trait TypeOptionDataEntity { + fn from_json_str(s: &str) -> Self; + fn from_protobuf_bytes(bytes: Bytes) -> Self; +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default, ProtoBuf, PartialEq, Eq)] +pub struct TypeOptionDataByFieldTypeId { + #[pb(index = 1)] + pub map: HashMap, +} + +impl std::ops::Deref for TypeOptionDataByFieldTypeId { + type Target = HashMap; + + fn deref(&self) -> &Self::Target { + &self.map + } +} + +impl std::ops::DerefMut for TypeOptionDataByFieldTypeId { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.map + } } #[derive(Debug, Clone, Default, ProtoBuf)] -pub struct FieldChangeset { +pub struct FieldChangesetPayload { #[pb(index = 1)] pub field_id: String, - #[pb(index = 2, one_of)] - pub name: Option, + #[pb(index = 2)] + pub grid_id: String, #[pb(index = 3, one_of)] - pub desc: Option, + pub name: Option, #[pb(index = 4, one_of)] - pub field_type: Option, + pub desc: Option, #[pb(index = 5, one_of)] - pub frozen: Option, + pub field_type: Option, #[pb(index = 6, one_of)] - pub visibility: Option, + pub frozen: Option, #[pb(index = 7, one_of)] - pub width: Option, + pub visibility: Option, #[pb(index = 8, one_of)] - pub type_options: Option, + pub width: Option, + + #[pb(index = 9, one_of)] + pub type_option_data: Option>, +} + +#[derive(Debug, Clone, Default)] +pub struct FieldChangesetParams { + pub field_id: String, + pub grid_id: String, + pub name: Option, + pub desc: Option, + pub field_type: Option, + pub frozen: Option, + pub visibility: Option, + pub width: Option, + pub type_option_data: Option>, +} + +impl TryInto for FieldChangesetPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + 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, Deserialize, )] +#[repr(u8)] pub enum FieldType { RichText = 0, Number = 1, @@ -178,18 +279,6 @@ impl FieldType { let ty = self.clone(); format!("{}", ty as u8) } - - pub fn from_type_id(type_id: &str) -> Result { - match type_id { - "0" => Ok(FieldType::RichText), - "1" => Ok(FieldType::Number), - "2" => Ok(FieldType::DateTime), - "3" => Ok(FieldType::SingleSelect), - "4" => Ok(FieldType::MultiSelect), - "5" => Ok(FieldType::Checkbox), - _ => Err(format!("Invalid type_id: {}", type_id)), - } - } } #[derive(Debug, Clone, Serialize, Deserialize, Default, ProtoBuf)] @@ -304,14 +393,12 @@ pub struct CellMetaChangeset { impl std::convert::From for RowMetaChangeset { fn from(changeset: CellMetaChangeset) -> Self { let mut cell_by_field_id = HashMap::with_capacity(1); - if let Some(data) = changeset.data { - let field_id = changeset.field_id; - let cell_meta = CellMeta { - field_id: field_id.clone(), - data, - }; - cell_by_field_id.insert(field_id, cell_meta); - } + let field_id = changeset.field_id; + let cell_meta = CellMeta { + field_id: field_id.clone(), + data: changeset.data.unwrap_or_else(|| "".to_owned()), + }; + cell_by_field_id.insert(field_id, cell_meta); RowMetaChangeset { row_id: changeset.row_id, @@ -331,13 +418,13 @@ pub struct BuildGridContext { pub block_metas: GridBlockMeta, #[pb(index = 3)] - pub block_meta_data: GridBlockMetaSerde, + pub block_meta_data: GridBlockMetaData, } impl std::default::Default for BuildGridContext { fn default() -> Self { let grid_block = GridBlockMeta::new(); - let grid_block_meta_data = GridBlockMetaSerde { + let grid_block_meta_data = GridBlockMetaData { block_id: grid_block.block_id.clone(), row_metas: vec![], }; diff --git a/shared-lib/flowy-grid-data-model/src/parser/grid.rs b/shared-lib/flowy-grid-data-model/src/parser/grid.rs deleted file mode 100644 index 49a202cf70..0000000000 --- a/shared-lib/flowy-grid-data-model/src/parser/grid.rs +++ /dev/null @@ -1,82 +0,0 @@ -use crate::entities::{ - CreateRowPayload, GridBlockOrder, QueryFieldPayload, QueryGridBlocksPayload, QueryRowPayload, RepeatedFieldOrder, -}; -use crate::parser::NonEmptyId; -use flowy_error_code::ErrorCode; - -#[derive(Default)] -pub struct CreateRowParams { - pub grid_id: String, - pub start_row_id: Option, -} - -impl TryInto for CreateRowPayload { - type Error = ErrorCode; - - fn try_into(self) -> Result { - let grid_id = NonEmptyId::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; - Ok(CreateRowParams { - grid_id: grid_id.0, - start_row_id: self.start_row_id, - }) - } -} - -#[derive(Default)] -pub struct QueryFieldParams { - pub grid_id: String, - pub field_orders: RepeatedFieldOrder, -} - -impl TryInto for QueryFieldPayload { - type Error = ErrorCode; - - fn try_into(self) -> Result { - let grid_id = NonEmptyId::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; - Ok(QueryFieldParams { - grid_id: grid_id.0, - field_orders: self.field_orders, - }) - } -} - -#[derive(Default)] -pub struct QueryGridBlocksParams { - pub grid_id: String, - pub block_orders: Vec, -} - -impl TryInto for QueryGridBlocksPayload { - type Error = ErrorCode; - - fn try_into(self) -> Result { - let grid_id = NonEmptyId::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; - Ok(QueryGridBlocksParams { - grid_id: grid_id.0, - block_orders: self.block_orders, - }) - } -} - -#[derive(Default)] -pub struct QueryRowParams { - pub grid_id: String, - pub block_id: String, - pub row_id: String, -} - -impl TryInto for QueryRowPayload { - type Error = ErrorCode; - - fn try_into(self) -> Result { - let grid_id = NonEmptyId::parse(self.grid_id).map_err(|_| ErrorCode::GridIdIsEmpty)?; - let block_id = NonEmptyId::parse(self.block_id).map_err(|_| ErrorCode::BlockIdIsEmpty)?; - let row_id = NonEmptyId::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?; - - Ok(QueryRowParams { - grid_id: grid_id.0, - block_id: block_id.0, - row_id: row_id.0, - }) - } -} diff --git a/shared-lib/flowy-grid-data-model/src/parser/id.rs b/shared-lib/flowy-grid-data-model/src/parser/id.rs deleted file mode 100644 index 5dbe65cf04..0000000000 --- a/shared-lib/flowy-grid-data-model/src/parser/id.rs +++ /dev/null @@ -1,18 +0,0 @@ -#[derive(Debug)] -pub struct NonEmptyId(pub String); - -impl NonEmptyId { - pub fn parse(s: String) -> Result { - if s.trim().is_empty() { - return Err(()); - } - - Ok(Self(s)) - } -} - -impl AsRef for NonEmptyId { - fn as_ref(&self) -> &str { - &self.0 - } -} diff --git a/shared-lib/flowy-grid-data-model/src/parser/mod.rs b/shared-lib/flowy-grid-data-model/src/parser/mod.rs index ec81801043..3c43c76f39 100644 --- a/shared-lib/flowy-grid-data-model/src/parser/mod.rs +++ b/shared-lib/flowy-grid-data-model/src/parser/mod.rs @@ -1,5 +1,3 @@ -mod grid; -mod id; +mod str_parser; -pub use grid::*; -pub use id::*; +pub use str_parser::*; diff --git a/shared-lib/flowy-grid-data-model/src/parser/str_parser.rs b/shared-lib/flowy-grid-data-model/src/parser/str_parser.rs new file mode 100644 index 0000000000..3e5e3c622b --- /dev/null +++ b/shared-lib/flowy-grid-data-model/src/parser/str_parser.rs @@ -0,0 +1,39 @@ +use uuid::Uuid; + +#[derive(Debug)] +pub struct NotEmptyUuid(pub String); + +impl NotEmptyUuid { + pub fn parse(s: String) -> Result { + 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 for NotEmptyUuid { + fn as_ref(&self) -> &str { + &self.0 + } +} + +#[derive(Debug)] +pub struct NotEmptyStr(pub String); + +impl NotEmptyStr { + pub fn parse(s: String) -> Result { + if s.trim().is_empty() { + return Err("Input string is empty".to_owned()); + } + Ok(Self(s)) + } +} + +impl AsRef for NotEmptyStr { + fn as_ref(&self) -> &str { + &self.0 + } +} diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs b/shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs index fc538875c9..c31a2def27 100644 --- a/shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs +++ b/shared-lib/flowy-grid-data-model/src/protobuf/model/grid.rs @@ -818,6 +818,768 @@ impl ::protobuf::reflect::ProtobufValue for FieldOrder { } } +#[derive(PartialEq,Clone,Default)] +pub struct GetEditFieldContextPayload { + // message fields + pub grid_id: ::std::string::String, + pub field_type: super::meta::FieldType, + // message oneof groups + pub one_of_field_id: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a GetEditFieldContextPayload { + fn default() -> &'a GetEditFieldContextPayload { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum GetEditFieldContextPayload_oneof_one_of_field_id { + field_id(::std::string::String), +} + +impl GetEditFieldContextPayload { + pub fn new() -> GetEditFieldContextPayload { + ::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 field_id = 2; + + + pub fn get_field_id(&self) -> &str { + match self.one_of_field_id { + ::std::option::Option::Some(GetEditFieldContextPayload_oneof_one_of_field_id::field_id(ref v)) => v, + _ => "", + } + } + pub fn clear_field_id(&mut self) { + self.one_of_field_id = ::std::option::Option::None; + } + + pub fn has_field_id(&self) -> bool { + match self.one_of_field_id { + ::std::option::Option::Some(GetEditFieldContextPayload_oneof_one_of_field_id::field_id(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_field_id(&mut self, v: ::std::string::String) { + self.one_of_field_id = ::std::option::Option::Some(GetEditFieldContextPayload_oneof_one_of_field_id::field_id(v)) + } + + // Mutable pointer to the field. + pub fn mut_field_id(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(GetEditFieldContextPayload_oneof_one_of_field_id::field_id(_)) = self.one_of_field_id { + } else { + self.one_of_field_id = ::std::option::Option::Some(GetEditFieldContextPayload_oneof_one_of_field_id::field_id(::std::string::String::new())); + } + match self.one_of_field_id { + ::std::option::Option::Some(GetEditFieldContextPayload_oneof_one_of_field_id::field_id(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_field_id(&mut self) -> ::std::string::String { + if self.has_field_id() { + match self.one_of_field_id.take() { + ::std::option::Option::Some(GetEditFieldContextPayload_oneof_one_of_field_id::field_id(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } + + // .FieldType field_type = 3; + + + pub fn get_field_type(&self) -> super::meta::FieldType { + self.field_type + } + pub fn clear_field_type(&mut self) { + self.field_type = super::meta::FieldType::RichText; + } + + // Param is passed by value, moved + pub fn set_field_type(&mut self, v: super::meta::FieldType) { + self.field_type = v; + } +} + +impl ::protobuf::Message for GetEditFieldContextPayload { + 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 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_field_id = ::std::option::Option::Some(GetEditFieldContextPayload_oneof_one_of_field_id::field_id(is.read_string()?)); + }, + 3 => { + ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.field_type, 3, &mut self.unknown_fields)? + }, + _ => { + ::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.field_type != super::meta::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 { + match v { + &GetEditFieldContextPayload_oneof_one_of_field_id::field_id(ref v) => { + my_size += ::protobuf::rt::string_size(2, &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.field_type != super::meta::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 { + match v { + &GetEditFieldContextPayload_oneof_one_of_field_id::field_id(ref v) => { + os.write_string(2, 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> GetEditFieldContextPayload { + GetEditFieldContextPayload::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: &GetEditFieldContextPayload| { &m.grid_id }, + |m: &mut GetEditFieldContextPayload| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "field_id", + GetEditFieldContextPayload::has_field_id, + GetEditFieldContextPayload::get_field_id, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + "field_type", + |m: &GetEditFieldContextPayload| { &m.field_type }, + |m: &mut GetEditFieldContextPayload| { &mut m.field_type }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "GetEditFieldContextPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static GetEditFieldContextPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(GetEditFieldContextPayload::new) + } +} + +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.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for GetEditFieldContextPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for GetEditFieldContextPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct EditFieldPayload { + // message fields + pub grid_id: ::std::string::String, + pub field_id: ::std::string::String, + pub field_type: super::meta::FieldType, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a EditFieldPayload { + fn default() -> &'a EditFieldPayload { + ::default_instance() + } +} + +impl EditFieldPayload { + pub fn new() -> EditFieldPayload { + ::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 field_id = 2; + + + 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()) + } + + // .FieldType field_type = 3; + + + pub fn get_field_type(&self) -> super::meta::FieldType { + self.field_type + } + pub fn clear_field_type(&mut self) { + self.field_type = super::meta::FieldType::RichText; + } + + // Param is passed by value, moved + pub fn set_field_type(&mut self, v: super::meta::FieldType) { + self.field_type = v; + } +} + +impl ::protobuf::Message for EditFieldPayload { + 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.field_id)?; + }, + 3 => { + ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.field_type, 3, &mut self.unknown_fields)? + }, + _ => { + ::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.field_id.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.field_id); + } + if self.field_type != super::meta::FieldType::RichText { + my_size += ::protobuf::rt::enum_size(3, self.field_type); + } + 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.field_id.is_empty() { + os.write_string(2, &self.field_id)?; + } + if self.field_type != super::meta::FieldType::RichText { + os.write_enum(3, ::protobuf::ProtobufEnum::value(&self.field_type))?; + } + 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> EditFieldPayload { + EditFieldPayload::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: &EditFieldPayload| { &m.grid_id }, + |m: &mut EditFieldPayload| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "field_id", + |m: &EditFieldPayload| { &m.field_id }, + |m: &mut EditFieldPayload| { &mut m.field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + "field_type", + |m: &EditFieldPayload| { &m.field_type }, + |m: &mut EditFieldPayload| { &mut m.field_type }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "EditFieldPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static EditFieldPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(EditFieldPayload::new) + } +} + +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.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for EditFieldPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for EditFieldPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +pub struct EditFieldContext { + // message fields + pub grid_id: ::std::string::String, + pub grid_field: ::protobuf::SingularPtrField, + pub type_option_data: ::std::vec::Vec, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a EditFieldContext { + fn default() -> &'a EditFieldContext { + ::default_instance() + } +} + +impl EditFieldContext { + pub fn new() -> EditFieldContext { + ::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()) + } + + // .Field grid_field = 2; + + + pub fn get_grid_field(&self) -> &Field { + self.grid_field.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_grid_field(&mut self) { + self.grid_field.clear(); + } + + pub fn has_grid_field(&self) -> bool { + self.grid_field.is_some() + } + + // Param is passed by value, moved + pub fn set_grid_field(&mut self, v: Field) { + self.grid_field = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_grid_field(&mut self) -> &mut Field { + if self.grid_field.is_none() { + self.grid_field.set_default(); + } + self.grid_field.as_mut().unwrap() + } + + // Take field + pub fn take_grid_field(&mut self) -> Field { + self.grid_field.take().unwrap_or_else(|| Field::new()) + } + + // bytes type_option_data = 3; + + + pub fn get_type_option_data(&self) -> &[u8] { + &self.type_option_data + } + pub fn clear_type_option_data(&mut self) { + self.type_option_data.clear(); + } + + // Param is passed by value, moved + pub fn set_type_option_data(&mut self, v: ::std::vec::Vec) { + self.type_option_data = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_type_option_data(&mut self) -> &mut ::std::vec::Vec { + &mut self.type_option_data + } + + // Take field + pub fn take_type_option_data(&mut self) -> ::std::vec::Vec { + ::std::mem::replace(&mut self.type_option_data, ::std::vec::Vec::new()) + } +} + +impl ::protobuf::Message for EditFieldContext { + fn is_initialized(&self) -> bool { + for v in &self.grid_field { + 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_singular_message_into(wire_type, is, &mut self.grid_field)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.type_option_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.grid_id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.grid_id); + } + if let Some(ref v) = self.grid_field.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + if !self.type_option_data.is_empty() { + my_size += ::protobuf::rt::bytes_size(3, &self.type_option_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.grid_id.is_empty() { + os.write_string(1, &self.grid_id)?; + } + if let Some(ref v) = self.grid_field.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 !self.type_option_data.is_empty() { + os.write_bytes(3, &self.type_option_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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> EditFieldContext { + EditFieldContext::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: &EditFieldContext| { &m.grid_id }, + |m: &mut EditFieldContext| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "grid_field", + |m: &EditFieldContext| { &m.grid_field }, + |m: &mut EditFieldContext| { &mut m.grid_field }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>( + "type_option_data", + |m: &EditFieldContext| { &m.type_option_data }, + |m: &mut EditFieldContext| { &mut m.type_option_data }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "EditFieldContext", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static EditFieldContext { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(EditFieldContext::new) + } +} + +impl ::protobuf::Clear for EditFieldContext { + fn clear(&mut self) { + self.grid_id.clear(); + self.grid_field.clear(); + self.type_option_data.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for EditFieldContext { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for EditFieldContext { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + #[derive(PartialEq,Clone,Default)] pub struct RepeatedField { // message fields @@ -2111,7 +2873,7 @@ impl ::protobuf::reflect::ProtobufValue for GridBlockOrder { #[derive(PartialEq,Clone,Default)] pub struct GridBlock { // message fields - pub block_id: ::std::string::String, + pub id: ::std::string::String, pub row_orders: ::protobuf::RepeatedField, // special fields pub unknown_fields: ::protobuf::UnknownFields, @@ -2129,30 +2891,30 @@ impl GridBlock { ::std::default::Default::default() } - // string block_id = 1; + // string id = 1; - pub fn get_block_id(&self) -> &str { - &self.block_id + pub fn get_id(&self) -> &str { + &self.id } - pub fn clear_block_id(&mut self) { - self.block_id.clear(); + pub fn clear_id(&mut self) { + self.id.clear(); } // Param is passed by value, moved - pub fn set_block_id(&mut self, v: ::std::string::String) { - self.block_id = v; + 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_block_id(&mut self) -> &mut ::std::string::String { - &mut self.block_id + pub fn mut_id(&mut self) -> &mut ::std::string::String { + &mut self.id } // Take field - pub fn take_block_id(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.block_id, ::std::string::String::new()) + pub fn take_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.id, ::std::string::String::new()) } // repeated .RowOrder row_orders = 2; @@ -2196,7 +2958,7 @@ impl ::protobuf::Message for GridBlock { 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)?; + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; }, 2 => { ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.row_orders)?; @@ -2213,8 +2975,8 @@ impl ::protobuf::Message for GridBlock { #[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.id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.id); } for value in &self.row_orders { let len = value.compute_size(); @@ -2226,8 +2988,8 @@ impl ::protobuf::Message for GridBlock { } 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.id.is_empty() { + os.write_string(1, &self.id)?; } for v in &self.row_orders { os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; @@ -2273,9 +3035,9 @@ impl ::protobuf::Message for GridBlock { descriptor.get(|| { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "block_id", - |m: &GridBlock| { &m.block_id }, - |m: &mut GridBlock| { &mut m.block_id }, + "id", + |m: &GridBlock| { &m.id }, + |m: &mut GridBlock| { &mut m.id }, )); fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( "row_orders", @@ -2298,7 +3060,7 @@ impl ::protobuf::Message for GridBlock { impl ::protobuf::Clear for GridBlock { fn clear(&mut self) { - self.block_id.clear(); + self.id.clear(); self.row_orders.clear(); self.unknown_fields.clear(); } @@ -2517,6 +3279,331 @@ impl ::protobuf::reflect::ProtobufValue for Cell { } } +#[derive(PartialEq,Clone,Default)] +pub struct CellNotificationData { + // message fields + pub grid_id: ::std::string::String, + pub field_id: ::std::string::String, + pub row_id: ::std::string::String, + // message oneof groups + pub one_of_content: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a CellNotificationData { + fn default() -> &'a CellNotificationData { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum CellNotificationData_oneof_one_of_content { + content(::std::string::String), +} + +impl CellNotificationData { + pub fn new() -> CellNotificationData { + ::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 field_id = 2; + + + 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 row_id = 3; + + + 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 content = 4; + + + pub fn get_content(&self) -> &str { + match self.one_of_content { + ::std::option::Option::Some(CellNotificationData_oneof_one_of_content::content(ref v)) => v, + _ => "", + } + } + pub fn clear_content(&mut self) { + self.one_of_content = ::std::option::Option::None; + } + + pub fn has_content(&self) -> bool { + match self.one_of_content { + ::std::option::Option::Some(CellNotificationData_oneof_one_of_content::content(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_content(&mut self, v: ::std::string::String) { + self.one_of_content = ::std::option::Option::Some(CellNotificationData_oneof_one_of_content::content(v)) + } + + // Mutable pointer to the field. + pub fn mut_content(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(CellNotificationData_oneof_one_of_content::content(_)) = self.one_of_content { + } else { + self.one_of_content = ::std::option::Option::Some(CellNotificationData_oneof_one_of_content::content(::std::string::String::new())); + } + match self.one_of_content { + ::std::option::Option::Some(CellNotificationData_oneof_one_of_content::content(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_content(&mut self) -> ::std::string::String { + if self.has_content() { + match self.one_of_content.take() { + ::std::option::Option::Some(CellNotificationData_oneof_one_of_content::content(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } +} + +impl ::protobuf::Message for CellNotificationData { + 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.field_id)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_id)?; + }, + 4 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_content = ::std::option::Option::Some(CellNotificationData_oneof_one_of_content::content(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.field_id.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.field_id); + } + if !self.row_id.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.row_id); + } + if let ::std::option::Option::Some(ref v) = self.one_of_content { + match v { + &CellNotificationData_oneof_one_of_content::content(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.field_id.is_empty() { + os.write_string(2, &self.field_id)?; + } + if !self.row_id.is_empty() { + os.write_string(3, &self.row_id)?; + } + if let ::std::option::Option::Some(ref v) = self.one_of_content { + match v { + &CellNotificationData_oneof_one_of_content::content(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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> CellNotificationData { + CellNotificationData::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: &CellNotificationData| { &m.grid_id }, + |m: &mut CellNotificationData| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "field_id", + |m: &CellNotificationData| { &m.field_id }, + |m: &mut CellNotificationData| { &mut m.field_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "row_id", + |m: &CellNotificationData| { &m.row_id }, + |m: &mut CellNotificationData| { &mut m.row_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "content", + CellNotificationData::has_content, + CellNotificationData::get_content, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CellNotificationData", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static CellNotificationData { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CellNotificationData::new) + } +} + +impl ::protobuf::Clear for CellNotificationData { + fn clear(&mut self) { + self.grid_id.clear(); + self.field_id.clear(); + self.row_id.clear(); + self.one_of_content = ::std::option::Option::None; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for CellNotificationData { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for CellNotificationData { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + #[derive(PartialEq,Clone,Default)] pub struct RepeatedCell { // message fields @@ -3401,6 +4488,346 @@ impl ::protobuf::reflect::ProtobufValue for CreateRowPayload { } } +#[derive(PartialEq,Clone,Default)] +pub struct CreateFieldPayload { + // message fields + pub grid_id: ::std::string::String, + pub field: ::protobuf::SingularPtrField, + pub type_option_data: ::std::vec::Vec, + // message oneof groups + pub one_of_start_field_id: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a CreateFieldPayload { + fn default() -> &'a CreateFieldPayload { + ::default_instance() + } +} + +#[derive(Clone,PartialEq,Debug)] +pub enum CreateFieldPayload_oneof_one_of_start_field_id { + start_field_id(::std::string::String), +} + +impl CreateFieldPayload { + pub fn new() -> CreateFieldPayload { + ::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()) + } + + // .Field field = 2; + + + pub fn get_field(&self) -> &Field { + self.field.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_field(&mut self) { + self.field.clear(); + } + + pub fn has_field(&self) -> bool { + self.field.is_some() + } + + // Param is passed by value, moved + pub fn set_field(&mut self, v: Field) { + self.field = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_field(&mut self) -> &mut Field { + if self.field.is_none() { + self.field.set_default(); + } + self.field.as_mut().unwrap() + } + + // Take field + pub fn take_field(&mut self) -> Field { + self.field.take().unwrap_or_else(|| Field::new()) + } + + // bytes type_option_data = 3; + + + pub fn get_type_option_data(&self) -> &[u8] { + &self.type_option_data + } + pub fn clear_type_option_data(&mut self) { + self.type_option_data.clear(); + } + + // Param is passed by value, moved + pub fn set_type_option_data(&mut self, v: ::std::vec::Vec) { + self.type_option_data = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_type_option_data(&mut self) -> &mut ::std::vec::Vec { + &mut self.type_option_data + } + + // Take field + pub fn take_type_option_data(&mut self) -> ::std::vec::Vec { + ::std::mem::replace(&mut self.type_option_data, ::std::vec::Vec::new()) + } + + // string start_field_id = 4; + + + pub fn get_start_field_id(&self) -> &str { + match self.one_of_start_field_id { + ::std::option::Option::Some(CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(ref v)) => v, + _ => "", + } + } + pub fn clear_start_field_id(&mut self) { + self.one_of_start_field_id = ::std::option::Option::None; + } + + pub fn has_start_field_id(&self) -> bool { + match self.one_of_start_field_id { + ::std::option::Option::Some(CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_start_field_id(&mut self, v: ::std::string::String) { + self.one_of_start_field_id = ::std::option::Option::Some(CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(v)) + } + + // Mutable pointer to the field. + pub fn mut_start_field_id(&mut self) -> &mut ::std::string::String { + if let ::std::option::Option::Some(CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(_)) = self.one_of_start_field_id { + } else { + self.one_of_start_field_id = ::std::option::Option::Some(CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(::std::string::String::new())); + } + match self.one_of_start_field_id { + ::std::option::Option::Some(CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(ref mut v)) => v, + _ => panic!(), + } + } + + // Take field + pub fn take_start_field_id(&mut self) -> ::std::string::String { + if self.has_start_field_id() { + match self.one_of_start_field_id.take() { + ::std::option::Option::Some(CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(v)) => v, + _ => panic!(), + } + } else { + ::std::string::String::new() + } + } +} + +impl ::protobuf::Message for CreateFieldPayload { + fn is_initialized(&self) -> bool { + for v in &self.field { + 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_singular_message_into(wire_type, is, &mut self.field)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.type_option_data)?; + }, + 4 => { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self.one_of_start_field_id = ::std::option::Option::Some(CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(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 let Some(ref v) = self.field.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + if !self.type_option_data.is_empty() { + my_size += ::protobuf::rt::bytes_size(3, &self.type_option_data); + } + if let ::std::option::Option::Some(ref v) = self.one_of_start_field_id { + match v { + &CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(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 let Some(ref v) = self.field.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 !self.type_option_data.is_empty() { + os.write_bytes(3, &self.type_option_data)?; + } + if let ::std::option::Option::Some(ref v) = self.one_of_start_field_id { + match v { + &CreateFieldPayload_oneof_one_of_start_field_id::start_field_id(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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> CreateFieldPayload { + CreateFieldPayload::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: &CreateFieldPayload| { &m.grid_id }, + |m: &mut CreateFieldPayload| { &mut m.grid_id }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "field", + |m: &CreateFieldPayload| { &m.field }, + |m: &mut CreateFieldPayload| { &mut m.field }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>( + "type_option_data", + |m: &CreateFieldPayload| { &m.type_option_data }, + |m: &mut CreateFieldPayload| { &mut m.type_option_data }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( + "start_field_id", + CreateFieldPayload::has_start_field_id, + CreateFieldPayload::get_start_field_id, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "CreateFieldPayload", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static CreateFieldPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(CreateFieldPayload::new) + } +} + +impl ::protobuf::Clear for CreateFieldPayload { + fn clear(&mut self) { + self.grid_id.clear(); + self.field.clear(); + self.type_option_data.clear(); + self.one_of_start_field_id = ::std::option::Option::None; + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for CreateFieldPayload { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for CreateFieldPayload { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + #[derive(PartialEq,Clone,Default)] pub struct QueryFieldPayload { // message fields @@ -3825,249 +5252,6 @@ impl ::protobuf::reflect::ProtobufValue for QueryGridBlocksPayload { } } -#[derive(PartialEq,Clone,Default)] -pub struct QueryRowPayload { - // message fields - pub grid_id: ::std::string::String, - pub block_id: ::std::string::String, - pub row_id: ::std::string::String, - // special fields - pub unknown_fields: ::protobuf::UnknownFields, - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a QueryRowPayload { - fn default() -> &'a QueryRowPayload { - ::default_instance() - } -} - -impl QueryRowPayload { - pub fn new() -> QueryRowPayload { - ::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 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()) - } - - // string row_id = 3; - - - 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()) - } -} - -impl ::protobuf::Message for QueryRowPayload { - 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.block_id)?; - }, - 3 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.row_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.grid_id.is_empty() { - my_size += ::protobuf::rt::string_size(1, &self.grid_id); - } - if !self.block_id.is_empty() { - my_size += ::protobuf::rt::string_size(2, &self.block_id); - } - if !self.row_id.is_empty() { - my_size += ::protobuf::rt::string_size(3, &self.row_id); - } - 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.block_id.is_empty() { - os.write_string(2, &self.block_id)?; - } - if !self.row_id.is_empty() { - os.write_string(3, &self.row_id)?; - } - 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) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> QueryRowPayload { - QueryRowPayload::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: &QueryRowPayload| { &m.grid_id }, - |m: &mut QueryRowPayload| { &mut m.grid_id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "block_id", - |m: &QueryRowPayload| { &m.block_id }, - |m: &mut QueryRowPayload| { &mut m.block_id }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "row_id", - |m: &QueryRowPayload| { &m.row_id }, - |m: &mut QueryRowPayload| { &mut m.row_id }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "QueryRowPayload", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static QueryRowPayload { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(QueryRowPayload::new) - } -} - -impl ::protobuf::Clear for QueryRowPayload { - fn clear(&mut self) { - self.grid_id.clear(); - self.block_id.clear(); - self.row_id.clear(); - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for QueryRowPayload { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for QueryRowPayload { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(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\ @@ -4078,37 +5262,52 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \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\"-\n\rRepeatedField\ - \x12\x1c\n\x05items\x18\x01\x20\x03(\x0b2\x06.FieldR\x05items\"7\n\x12Re\ - peatedFieldOrder\x12!\n\x05items\x18\x01\x20\x03(\x0b2\x0b.FieldOrderR\ - \x05items\"T\n\x08RowOrder\x12\x15\n\x06row_id\x18\x01\x20\x01(\tR\x05ro\ - wId\x12\x19\n\x08block_id\x18\x02\x20\x01(\tR\x07blockId\x12\x16\n\x06he\ - ight\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\x03k\ - ey\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\"+\n\x0eGridBlockO\ - rder\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\"P\n\tGridBloc\ - k\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12(\n\nrow_order\ - s\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\"+\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\x05valu\ - e\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\"d\n\x11QueryField\ - Payload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\x126\n\x0cfie\ - ld_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.GridBlockOrd\ - erR\x0bblockOrders\"\\\n\x0fQueryRowPayload\x12\x17\n\x07grid_id\x18\x01\ - \x20\x01(\tR\x06gridId\x12\x19\n\x08block_id\x18\x02\x20\x01(\tR\x07bloc\ - kId\x12\x15\n\x06row_id\x18\x03\x20\x01(\tR\x05rowIdb\x06proto3\ + \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\"+\n\x0eGridBlockOrder\ + \x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\"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\x07content\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_id\x18\x02\x20\x01(\tR\x07\ + fieldId\x12\x15\n\x06row_id\x18\x03\x20\x01(\tR\x05rowId\x12\x1a\n\x07co\ + ntent\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\x05i\ + tems\"'\n\x11CreateGridPayload\x12\x12\n\x04name\x18\x01\x20\x01(\tR\x04\ + name\"\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\0R\nstartRowIdB\x15\n\x13on\ + e_of_start_row_id\"\xb6\x01\n\x12CreateFieldPayload\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_field_id\x18\x04\x20\x01(\tH\0R\x0cst\ + artFieldIdB\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\x16Qu\ + eryGridBlocksPayload\x12\x17\n\x07grid_id\x18\x01\x20\x01(\tR\x06gridId\ + \x122\n\x0cblock_orders\x18\x02\x20\x03(\x0b2\x0f.GridBlockOrderR\x0bblo\ + ckOrdersb\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs b/shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs index 2e27686c00..97e14eb738 100644 --- a/shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs +++ b/shared-lib/flowy-grid-data-model/src/protobuf/model/meta.rs @@ -510,7 +510,7 @@ impl ::protobuf::reflect::ProtobufValue for GridBlockMeta { } #[derive(PartialEq,Clone,Default)] -pub struct GridBlockMetaSerde { +pub struct GridBlockMetaData { // message fields pub block_id: ::std::string::String, pub row_metas: ::protobuf::RepeatedField, @@ -519,14 +519,14 @@ pub struct GridBlockMetaSerde { pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a GridBlockMetaSerde { - fn default() -> &'a GridBlockMetaSerde { - ::default_instance() +impl<'a> ::std::default::Default for &'a GridBlockMetaData { + fn default() -> &'a GridBlockMetaData { + ::default_instance() } } -impl GridBlockMetaSerde { - pub fn new() -> GridBlockMetaSerde { +impl GridBlockMetaData { + pub fn new() -> GridBlockMetaData { ::std::default::Default::default() } @@ -582,7 +582,7 @@ impl GridBlockMetaSerde { } } -impl ::protobuf::Message for GridBlockMetaSerde { +impl ::protobuf::Message for GridBlockMetaData { fn is_initialized(&self) -> bool { for v in &self.row_metas { if !v.is_initialized() { @@ -665,8 +665,8 @@ impl ::protobuf::Message for GridBlockMetaSerde { Self::descriptor_static() } - fn new() -> GridBlockMetaSerde { - GridBlockMetaSerde::new() + fn new() -> GridBlockMetaData { + GridBlockMetaData::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -675,29 +675,29 @@ impl ::protobuf::Message for GridBlockMetaSerde { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "block_id", - |m: &GridBlockMetaSerde| { &m.block_id }, - |m: &mut GridBlockMetaSerde| { &mut m.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>( "row_metas", - |m: &GridBlockMetaSerde| { &m.row_metas }, - |m: &mut GridBlockMetaSerde| { &mut m.row_metas }, + |m: &GridBlockMetaData| { &m.row_metas }, + |m: &mut GridBlockMetaData| { &mut m.row_metas }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "GridBlockMetaSerde", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "GridBlockMetaData", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static GridBlockMetaSerde { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(GridBlockMetaSerde::new) + fn default_instance() -> &'static GridBlockMetaData { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(GridBlockMetaData::new) } } -impl ::protobuf::Clear for GridBlockMetaSerde { +impl ::protobuf::Clear for GridBlockMetaData { fn clear(&mut self) { self.block_id.clear(); self.row_metas.clear(); @@ -705,13 +705,13 @@ impl ::protobuf::Clear for GridBlockMetaSerde { } } -impl ::std::fmt::Debug for GridBlockMetaSerde { +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 GridBlockMetaSerde { +impl ::protobuf::reflect::ProtobufValue for GridBlockMetaData { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -727,7 +727,7 @@ pub struct FieldMeta { pub frozen: bool, pub visibility: bool, pub width: i32, - pub type_options: ::std::string::String, + pub type_option_by_field_type_id: ::protobuf::SingularPtrField, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, @@ -882,35 +882,47 @@ impl FieldMeta { self.width = v; } - // string type_options = 8; + // .TypeOptionDataByFieldTypeId type_option_by_field_type_id = 8; - pub fn get_type_options(&self) -> &str { - &self.type_options + pub fn get_type_option_by_field_type_id(&self) -> &TypeOptionDataByFieldTypeId { + self.type_option_by_field_type_id.as_ref().unwrap_or_else(|| ::default_instance()) } - pub fn clear_type_options(&mut self) { - self.type_options.clear(); + pub fn clear_type_option_by_field_type_id(&mut self) { + self.type_option_by_field_type_id.clear(); + } + + pub fn has_type_option_by_field_type_id(&self) -> bool { + self.type_option_by_field_type_id.is_some() } // Param is passed by value, moved - pub fn set_type_options(&mut self, v: ::std::string::String) { - self.type_options = v; + pub fn set_type_option_by_field_type_id(&mut self, v: TypeOptionDataByFieldTypeId) { + self.type_option_by_field_type_id = ::protobuf::SingularPtrField::some(v); } // Mutable pointer to the field. // If field is not initialized, it is initialized with default value first. - pub fn mut_type_options(&mut self) -> &mut ::std::string::String { - &mut self.type_options + pub fn mut_type_option_by_field_type_id(&mut self) -> &mut TypeOptionDataByFieldTypeId { + if self.type_option_by_field_type_id.is_none() { + self.type_option_by_field_type_id.set_default(); + } + self.type_option_by_field_type_id.as_mut().unwrap() } // Take field - pub fn take_type_options(&mut self) -> ::std::string::String { - ::std::mem::replace(&mut self.type_options, ::std::string::String::new()) + pub fn take_type_option_by_field_type_id(&mut self) -> TypeOptionDataByFieldTypeId { + self.type_option_by_field_type_id.take().unwrap_or_else(|| TypeOptionDataByFieldTypeId::new()) } } impl ::protobuf::Message for FieldMeta { fn is_initialized(&self) -> bool { + for v in &self.type_option_by_field_type_id { + if !v.is_initialized() { + return false; + } + }; true } @@ -952,7 +964,7 @@ impl ::protobuf::Message for FieldMeta { self.width = tmp; }, 8 => { - ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.type_options)?; + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.type_option_by_field_type_id)?; }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; @@ -987,8 +999,9 @@ impl ::protobuf::Message for FieldMeta { if self.width != 0 { my_size += ::protobuf::rt::value_size(7, self.width, ::protobuf::wire_format::WireTypeVarint); } - if !self.type_options.is_empty() { - my_size += ::protobuf::rt::string_size(8, &self.type_options); + if let Some(ref v) = self.type_option_by_field_type_id.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); @@ -1017,8 +1030,10 @@ impl ::protobuf::Message for FieldMeta { if self.width != 0 { os.write_int32(7, self.width)?; } - if !self.type_options.is_empty() { - os.write_string(8, &self.type_options)?; + if let Some(ref v) = self.type_option_by_field_type_id.as_ref() { + os.write_tag(8, ::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(()) @@ -1093,10 +1108,10 @@ impl ::protobuf::Message for FieldMeta { |m: &FieldMeta| { &m.width }, |m: &mut FieldMeta| { &mut m.width }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( - "type_options", - |m: &FieldMeta| { &m.type_options }, - |m: &mut FieldMeta| { &mut m.type_options }, + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "type_option_by_field_type_id", + |m: &FieldMeta| { &m.type_option_by_field_type_id }, + |m: &mut FieldMeta| { &mut m.type_option_by_field_type_id }, )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "FieldMeta", @@ -1121,7 +1136,7 @@ impl ::protobuf::Clear for FieldMeta { self.frozen = false; self.visibility = false; self.width = 0; - self.type_options.clear(); + self.type_option_by_field_type_id.clear(); self.unknown_fields.clear(); } } @@ -1139,65 +1154,220 @@ impl ::protobuf::reflect::ProtobufValue for FieldMeta { } #[derive(PartialEq,Clone,Default)] -pub struct FieldChangeset { +pub struct TypeOptionDataByFieldTypeId { // message fields - pub field_id: ::std::string::String, - // message oneof groups - pub one_of_name: ::std::option::Option, - pub one_of_desc: ::std::option::Option, - pub one_of_field_type: ::std::option::Option, - pub one_of_frozen: ::std::option::Option, - pub one_of_visibility: ::std::option::Option, - pub one_of_width: ::std::option::Option, - pub one_of_type_options: ::std::option::Option, + pub map: ::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 FieldChangeset { - fn default() -> &'a FieldChangeset { - ::default_instance() +impl<'a> ::std::default::Default for &'a TypeOptionDataByFieldTypeId { + fn default() -> &'a TypeOptionDataByFieldTypeId { + ::default_instance() + } +} + +impl TypeOptionDataByFieldTypeId { + pub fn new() -> TypeOptionDataByFieldTypeId { + ::std::default::Default::default() + } + + // repeated .TypeOptionDataByFieldTypeId.MapEntry map = 1; + + + pub fn get_map(&self) -> &::std::collections::HashMap<::std::string::String, ::std::string::String> { + &self.map + } + pub fn clear_map(&mut self) { + self.map.clear(); + } + + // Param is passed by value, moved + pub fn set_map(&mut self, v: ::std::collections::HashMap<::std::string::String, ::std::string::String>) { + self.map = v; + } + + // Mutable pointer to the field. + pub fn mut_map(&mut self) -> &mut ::std::collections::HashMap<::std::string::String, ::std::string::String> { + &mut self.map + } + + // Take field + pub fn take_map(&mut self) -> ::std::collections::HashMap<::std::string::String, ::std::string::String> { + ::std::mem::replace(&mut self.map, ::std::collections::HashMap::new()) + } +} + +impl ::protobuf::Message for TypeOptionDataByFieldTypeId { + 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_map_into::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeString>(wire_type, is, &mut self.map)?; + }, + _ => { + ::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; + my_size += ::protobuf::rt::compute_map_size::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeString>(1, &self.map); + 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<()> { + ::protobuf::rt::write_map_with_cached_sizes::<::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeString>(1, &self.map, 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) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> TypeOptionDataByFieldTypeId { + TypeOptionDataByFieldTypeId::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_map_accessor::<_, ::protobuf::types::ProtobufTypeString, ::protobuf::types::ProtobufTypeString>( + "map", + |m: &TypeOptionDataByFieldTypeId| { &m.map }, + |m: &mut TypeOptionDataByFieldTypeId| { &mut m.map }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "TypeOptionDataByFieldTypeId", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static TypeOptionDataByFieldTypeId { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(TypeOptionDataByFieldTypeId::new) + } +} + +impl ::protobuf::Clear for TypeOptionDataByFieldTypeId { + fn clear(&mut self) { + self.map.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for TypeOptionDataByFieldTypeId { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for TypeOptionDataByFieldTypeId { + 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, + pub one_of_desc: ::std::option::Option, + pub one_of_field_type: ::std::option::Option, + pub one_of_frozen: ::std::option::Option, + pub one_of_visibility: ::std::option::Option, + pub one_of_width: ::std::option::Option, + pub one_of_type_option_data: ::std::option::Option, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a FieldChangesetPayload { + fn default() -> &'a FieldChangesetPayload { + ::default_instance() } } #[derive(Clone,PartialEq,Debug)] -pub enum FieldChangeset_oneof_one_of_name { +pub enum FieldChangesetPayload_oneof_one_of_name { name(::std::string::String), } #[derive(Clone,PartialEq,Debug)] -pub enum FieldChangeset_oneof_one_of_desc { +pub enum FieldChangesetPayload_oneof_one_of_desc { desc(::std::string::String), } #[derive(Clone,PartialEq,Debug)] -pub enum FieldChangeset_oneof_one_of_field_type { +pub enum FieldChangesetPayload_oneof_one_of_field_type { field_type(FieldType), } #[derive(Clone,PartialEq,Debug)] -pub enum FieldChangeset_oneof_one_of_frozen { +pub enum FieldChangesetPayload_oneof_one_of_frozen { frozen(bool), } #[derive(Clone,PartialEq,Debug)] -pub enum FieldChangeset_oneof_one_of_visibility { +pub enum FieldChangesetPayload_oneof_one_of_visibility { visibility(bool), } #[derive(Clone,PartialEq,Debug)] -pub enum FieldChangeset_oneof_one_of_width { +pub enum FieldChangesetPayload_oneof_one_of_width { width(i32), } #[derive(Clone,PartialEq,Debug)] -pub enum FieldChangeset_oneof_one_of_type_options { - type_options(::std::string::String), +pub enum FieldChangesetPayload_oneof_one_of_type_option_data { + type_option_data(::std::vec::Vec), } -impl FieldChangeset { - pub fn new() -> FieldChangeset { +impl FieldChangesetPayload { + pub fn new() -> FieldChangesetPayload { ::std::default::Default::default() } @@ -1227,12 +1397,38 @@ impl FieldChangeset { ::std::mem::replace(&mut self.field_id, ::std::string::String::new()) } - // string name = 2; + // 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(FieldChangeset_oneof_one_of_name::name(ref v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(ref v)) => v, _ => "", } } @@ -1242,24 +1438,24 @@ impl FieldChangeset { pub fn has_name(&self) -> bool { match self.one_of_name { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(..)) => true, + ::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(FieldChangeset_oneof_one_of_name::name(v)) + 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(FieldChangeset_oneof_one_of_name::name(_)) = self.one_of_name { + 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(FieldChangeset_oneof_one_of_name::name(::std::string::String::new())); + 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(FieldChangeset_oneof_one_of_name::name(ref mut v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(ref mut v)) => v, _ => panic!(), } } @@ -1268,7 +1464,7 @@ impl FieldChangeset { pub fn take_name(&mut self) -> ::std::string::String { if self.has_name() { match self.one_of_name.take() { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_name::name(v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(v)) => v, _ => panic!(), } } else { @@ -1276,12 +1472,12 @@ impl FieldChangeset { } } - // string desc = 3; + // string desc = 4; pub fn get_desc(&self) -> &str { match self.one_of_desc { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(ref v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(ref v)) => v, _ => "", } } @@ -1291,24 +1487,24 @@ impl FieldChangeset { pub fn has_desc(&self) -> bool { match self.one_of_desc { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(..)) => true, + ::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(FieldChangeset_oneof_one_of_desc::desc(v)) + 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(FieldChangeset_oneof_one_of_desc::desc(_)) = self.one_of_desc { + 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(FieldChangeset_oneof_one_of_desc::desc(::std::string::String::new())); + 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(FieldChangeset_oneof_one_of_desc::desc(ref mut v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(ref mut v)) => v, _ => panic!(), } } @@ -1317,7 +1513,7 @@ impl FieldChangeset { pub fn take_desc(&mut self) -> ::std::string::String { if self.has_desc() { match self.one_of_desc.take() { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_desc::desc(v)) => v, _ => panic!(), } } else { @@ -1325,12 +1521,12 @@ impl FieldChangeset { } } - // .FieldType field_type = 4; + // .FieldType field_type = 5; pub fn get_field_type(&self) -> FieldType { match self.one_of_field_type { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_field_type::field_type(v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(v)) => v, _ => FieldType::RichText, } } @@ -1340,22 +1536,22 @@ impl FieldChangeset { pub fn has_field_type(&self) -> bool { match self.one_of_field_type { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_field_type::field_type(..)) => true, + ::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(FieldChangeset_oneof_one_of_field_type::field_type(v)) + self.one_of_field_type = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_field_type::field_type(v)) } - // bool frozen = 5; + // bool frozen = 6; pub fn get_frozen(&self) -> bool { match self.one_of_frozen { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_frozen::frozen(v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(v)) => v, _ => false, } } @@ -1365,22 +1561,22 @@ impl FieldChangeset { pub fn has_frozen(&self) -> bool { match self.one_of_frozen { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_frozen::frozen(..)) => true, + ::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(FieldChangeset_oneof_one_of_frozen::frozen(v)) + self.one_of_frozen = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_frozen::frozen(v)) } - // bool visibility = 6; + // bool visibility = 7; pub fn get_visibility(&self) -> bool { match self.one_of_visibility { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_visibility::visibility(v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(v)) => v, _ => false, } } @@ -1390,22 +1586,22 @@ impl FieldChangeset { pub fn has_visibility(&self) -> bool { match self.one_of_visibility { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_visibility::visibility(..)) => true, + ::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(FieldChangeset_oneof_one_of_visibility::visibility(v)) + self.one_of_visibility = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_visibility::visibility(v)) } - // int32 width = 7; + // int32 width = 8; pub fn get_width(&self) -> i32 { match self.one_of_width { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_width::width(v)) => v, + ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(v)) => v, _ => 0, } } @@ -1415,67 +1611,67 @@ impl FieldChangeset { pub fn has_width(&self) -> bool { match self.one_of_width { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_width::width(..)) => true, + ::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(FieldChangeset_oneof_one_of_width::width(v)) + self.one_of_width = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_width::width(v)) } - // string type_options = 8; + // bytes type_option_data = 9; - pub fn get_type_options(&self) -> &str { - match self.one_of_type_options { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(ref v)) => v, - _ => "", + 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_options(&mut self) { - self.one_of_type_options = ::std::option::Option::None; + pub fn clear_type_option_data(&mut self) { + self.one_of_type_option_data = ::std::option::Option::None; } - pub fn has_type_options(&self) -> bool { - match self.one_of_type_options { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(..)) => true, + 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_options(&mut self, v: ::std::string::String) { - self.one_of_type_options = ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(v)) + pub fn set_type_option_data(&mut self, v: ::std::vec::Vec) { + 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_options(&mut self) -> &mut ::std::string::String { - if let ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(_)) = self.one_of_type_options { + pub fn mut_type_option_data(&mut self) -> &mut ::std::vec::Vec { + 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_options = ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(::std::string::String::new())); + 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_options { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(ref mut v)) => v, + 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_options(&mut self) -> ::std::string::String { - if self.has_type_options() { - match self.one_of_type_options.take() { - ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(v)) => v, + pub fn take_type_option_data(&mut self) -> ::std::vec::Vec { + 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::string::String::new() + ::std::vec::Vec::new() } } } -impl ::protobuf::Message for FieldChangeset { +impl ::protobuf::Message for FieldChangesetPayload { fn is_initialized(&self) -> bool { true } @@ -1488,46 +1684,49 @@ impl ::protobuf::Message for FieldChangeset { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field_id)?; }, 2 => { - 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(FieldChangeset_oneof_one_of_name::name(is.read_string()?)); + ::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_desc = ::std::option::Option::Some(FieldChangeset_oneof_one_of_desc::desc(is.read_string()?)); + self.one_of_name = ::std::option::Option::Some(FieldChangesetPayload_oneof_one_of_name::name(is.read_string()?)); }, 4 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { + if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); } - self.one_of_field_type = ::std::option::Option::Some(FieldChangeset_oneof_one_of_field_type::field_type(is.read_enum()?)); + 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_frozen = ::std::option::Option::Some(FieldChangeset_oneof_one_of_frozen::frozen(is.read_bool()?)); + 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_visibility = ::std::option::Option::Some(FieldChangeset_oneof_one_of_visibility::visibility(is.read_bool()?)); + 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_width = ::std::option::Option::Some(FieldChangeset_oneof_one_of_width::width(is.read_int32()?)); + 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_options = ::std::option::Option::Some(FieldChangeset_oneof_one_of_type_options::type_options(is.read_string()?)); + 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())?; @@ -1544,52 +1743,55 @@ impl ::protobuf::Message for FieldChangeset { 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 { - &FieldChangeset_oneof_one_of_name::name(ref v) => { - my_size += ::protobuf::rt::string_size(2, &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 { - &FieldChangeset_oneof_one_of_desc::desc(ref v) => { - my_size += ::protobuf::rt::string_size(3, &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 { - &FieldChangeset_oneof_one_of_field_type::field_type(v) => { - my_size += ::protobuf::rt::enum_size(4, 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 { - &FieldChangeset_oneof_one_of_frozen::frozen(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 { - &FieldChangeset_oneof_one_of_visibility::visibility(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 { - &FieldChangeset_oneof_one_of_width::width(v) => { - my_size += ::protobuf::rt::value_size(7, v, ::protobuf::wire_format::WireTypeVarint); + &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_options { + if let ::std::option::Option::Some(ref v) = self.one_of_type_option_data { match v { - &FieldChangeset_oneof_one_of_type_options::type_options(ref v) => { - my_size += ::protobuf::rt::string_size(8, &v); + &FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref v) => { + my_size += ::protobuf::rt::bytes_size(9, &v); }, }; } @@ -1602,52 +1804,55 @@ impl ::protobuf::Message for FieldChangeset { 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 { - &FieldChangeset_oneof_one_of_name::name(ref v) => { - os.write_string(2, 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 { - &FieldChangeset_oneof_one_of_desc::desc(ref v) => { - os.write_string(3, 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 { - &FieldChangeset_oneof_one_of_field_type::field_type(v) => { - os.write_enum(4, ::protobuf::ProtobufEnum::value(&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 { - &FieldChangeset_oneof_one_of_frozen::frozen(v) => { - os.write_bool(5, 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 { - &FieldChangeset_oneof_one_of_visibility::visibility(v) => { - os.write_bool(6, 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 { - &FieldChangeset_oneof_one_of_width::width(v) => { - os.write_int32(7, 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_options { + if let ::std::option::Option::Some(ref v) = self.one_of_type_option_data { match v { - &FieldChangeset_oneof_one_of_type_options::type_options(ref v) => { - os.write_string(8, v)?; + &FieldChangesetPayload_oneof_one_of_type_option_data::type_option_data(ref v) => { + os.write_bytes(9, v)?; }, }; } @@ -1681,8 +1886,8 @@ impl ::protobuf::Message for FieldChangeset { Self::descriptor_static() } - fn new() -> FieldChangeset { - FieldChangeset::new() + fn new() -> FieldChangesetPayload { + FieldChangesetPayload::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -1691,79 +1896,85 @@ impl ::protobuf::Message for FieldChangeset { let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "field_id", - |m: &FieldChangeset| { &m.field_id }, - |m: &mut FieldChangeset| { &mut m.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", - FieldChangeset::has_name, - FieldChangeset::get_name, + FieldChangesetPayload::has_name, + FieldChangesetPayload::get_name, )); fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( "desc", - FieldChangeset::has_desc, - FieldChangeset::get_desc, + FieldChangesetPayload::has_desc, + FieldChangesetPayload::get_desc, )); fields.push(::protobuf::reflect::accessor::make_singular_enum_accessor::<_, FieldType>( "field_type", - FieldChangeset::has_field_type, - FieldChangeset::get_field_type, + FieldChangesetPayload::has_field_type, + FieldChangesetPayload::get_field_type, )); fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>( "frozen", - FieldChangeset::has_frozen, - FieldChangeset::get_frozen, + FieldChangesetPayload::has_frozen, + FieldChangesetPayload::get_frozen, )); fields.push(::protobuf::reflect::accessor::make_singular_bool_accessor::<_>( "visibility", - FieldChangeset::has_visibility, - FieldChangeset::get_visibility, + FieldChangesetPayload::has_visibility, + FieldChangesetPayload::get_visibility, )); fields.push(::protobuf::reflect::accessor::make_singular_i32_accessor::<_>( "width", - FieldChangeset::has_width, - FieldChangeset::get_width, + FieldChangesetPayload::has_width, + FieldChangesetPayload::get_width, )); - fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>( - "type_options", - FieldChangeset::has_type_options, - FieldChangeset::get_type_options, + 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::( - "FieldChangeset", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "FieldChangesetPayload", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static FieldChangeset { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(FieldChangeset::new) + fn default_instance() -> &'static FieldChangesetPayload { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(FieldChangesetPayload::new) } } -impl ::protobuf::Clear for FieldChangeset { +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_options = ::std::option::Option::None; + self.one_of_type_option_data = ::std::option::Option::None; self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for FieldChangeset { +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 FieldChangeset { +impl ::protobuf::reflect::ProtobufValue for FieldChangesetPayload { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -3120,7 +3331,7 @@ pub struct BuildGridContext { // message fields pub field_metas: ::protobuf::RepeatedField, pub block_metas: ::protobuf::SingularPtrField, - pub block_meta_data: ::protobuf::SingularPtrField, + pub block_meta_data: ::protobuf::SingularPtrField, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, @@ -3195,11 +3406,11 @@ impl BuildGridContext { self.block_metas.take().unwrap_or_else(|| GridBlockMeta::new()) } - // .GridBlockMetaSerde block_meta_data = 3; + // .GridBlockMetaData block_meta_data = 3; - pub fn get_block_meta_data(&self) -> &GridBlockMetaSerde { - self.block_meta_data.as_ref().unwrap_or_else(|| ::default_instance()) + pub fn get_block_meta_data(&self) -> &GridBlockMetaData { + self.block_meta_data.as_ref().unwrap_or_else(|| ::default_instance()) } pub fn clear_block_meta_data(&mut self) { self.block_meta_data.clear(); @@ -3210,13 +3421,13 @@ impl BuildGridContext { } // Param is passed by value, moved - pub fn set_block_meta_data(&mut self, v: GridBlockMetaSerde) { + 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 GridBlockMetaSerde { + pub fn mut_block_meta_data(&mut self) -> &mut GridBlockMetaData { if self.block_meta_data.is_none() { self.block_meta_data.set_default(); } @@ -3224,8 +3435,8 @@ impl BuildGridContext { } // Take field - pub fn take_block_meta_data(&mut self) -> GridBlockMetaSerde { - self.block_meta_data.take().unwrap_or_else(|| GridBlockMetaSerde::new()) + pub fn take_block_meta_data(&mut self) -> GridBlockMetaData { + self.block_meta_data.take().unwrap_or_else(|| GridBlockMetaData::new()) } } @@ -3355,7 +3566,7 @@ impl ::protobuf::Message for BuildGridContext { |m: &BuildGridContext| { &m.block_metas }, |m: &mut BuildGridContext| { &mut m.block_metas }, )); - fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( "block_meta_data", |m: &BuildGridContext| { &m.block_meta_data }, |m: &mut BuildGridContext| { &mut m.block_meta_data }, @@ -3463,51 +3674,57 @@ static file_descriptor_proto_data: &'static [u8] = b"\ s\x12/\n\x0bblock_metas\x18\x03\x20\x03(\x0b2\x0e.GridBlockMetaR\nblockM\ etas\"o\n\rGridBlockMeta\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07bl\ ockId\x12&\n\x0fstart_row_index\x18\x02\x20\x01(\x05R\rstartRowIndex\x12\ - \x1b\n\trow_count\x18\x03\x20\x01(\x05R\x08rowCount\"V\n\x12GridBlockMet\ - aSerde\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12%\n\trow_\ - metas\x18\x02\x20\x03(\x0b2\x08.RowMetaR\x08rowMetas\"\xdf\x01\n\tFieldM\ - eta\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x12\n\x04name\x18\x02\ + \x1b\n\trow_count\x18\x03\x20\x01(\x05R\x08rowCount\"U\n\x11GridBlockMet\ + aData\x12\x19\n\x08block_id\x18\x01\x20\x01(\tR\x07blockId\x12%\n\trow_m\ + etas\x18\x02\x20\x03(\x0b2\x08.RowMetaR\x08rowMetas\"\x99\x02\n\tFieldMe\ + ta\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\x05w\ - idth\x12!\n\x0ctype_options\x18\x08\x20\x01(\tR\x0btypeOptions\"\xfd\x02\ - \n\x0eFieldChangeset\x12\x19\n\x08field_id\x18\x01\x20\x01(\tR\x07fieldI\ - d\x12\x14\n\x04name\x18\x02\x20\x01(\tH\0R\x04name\x12\x14\n\x04desc\x18\ - \x03\x20\x01(\tH\x01R\x04desc\x12+\n\nfield_type\x18\x04\x20\x01(\x0e2\n\ - .FieldTypeH\x02R\tfieldType\x12\x18\n\x06frozen\x18\x05\x20\x01(\x08H\ - \x03R\x06frozen\x12\x20\n\nvisibility\x18\x06\x20\x01(\x08H\x04R\nvisibi\ - lity\x12\x16\n\x05width\x18\x07\x20\x01(\x05H\x05R\x05width\x12#\n\x0cty\ - pe_options\x18\x08\x20\x01(\tH\x06R\x0btypeOptionsB\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\x15\n\x13one_of_type\ - _options\"8\n\x07AnyData\x12\x17\n\x07type_id\x18\x01\x20\x01(\tR\x06typ\ - eId\x12\x14\n\x05value\x18\x02\x20\x01(\x0cR\x05value\"\xff\x01\n\x07Row\ - Meta\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02id\x12\x19\n\x08block_id\x18\ - \x02\x20\x01(\tR\x07blockId\x12D\n\x10cell_by_field_id\x18\x03\x20\x03(\ - \x0b2\x1b.RowMeta.CellByFieldIdEntryR\rcellByFieldId\x12\x16\n\x06height\ - \x18\x04\x20\x01(\x05R\x06height\x12\x1e\n\nvisibility\x18\x05\x20\x01(\ - \x08R\nvisibility\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\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\nvisibili\ - ty\x12M\n\x10cell_by_field_id\x18\x04\x20\x03(\x0b2$.RowMetaChangeset.Ce\ - llByFieldIdEntryR\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\"9\n\x08CellMeta\x12\x19\n\x08field_id\x18\x01\x20\x01(\t\ - R\x07fieldId\x12\x12\n\x04data\x18\x02\x20\x01(\tR\x04data\"\x83\x01\n\ - \x11CellMetaChangeset\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\"\xad\x01\n\x10BuildGridContext\x12+\n\x0bf\ - ield_metas\x18\x01\x20\x03(\x0b2\n.FieldMetaR\nfieldMetas\x12/\n\x0bbloc\ - k_metas\x18\x02\x20\x01(\x0b2\x0e.GridBlockMetaR\nblockMetas\x12;\n\x0fb\ - lock_meta_data\x18\x03\x20\x01(\x0b2\x13.GridBlockMetaSerdeR\rblockMetaD\ - ata*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\ + idth\x12[\n\x1ctype_option_by_field_type_id\x18\x08\x20\x01(\x0b2\x1c.Ty\ + peOptionDataByFieldTypeIdR\x17typeOptionByFieldTypeId\"\x8e\x01\n\x1bTyp\ + eOptionDataByFieldTypeId\x127\n\x03map\x18\x01\x20\x03(\x0b2%.TypeOption\ + DataByFieldTypeId.MapEntryR\x03map\x1a6\n\x08MapEntry\x12\x10\n\x03key\ + \x18\x01\x20\x01(\tR\x03key\x12\x14\n\x05value\x18\x02\x20\x01(\tR\x05va\ + lue:\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\ + \x06gridId\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\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\"8\n\x07AnyData\x12\x17\n\x07type_id\ + \x18\x01\x20\x01(\tR\x06typeId\x12\x14\n\x05value\x18\x02\x20\x01(\x0cR\ + \x05value\"\xff\x01\n\x07RowMeta\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\x02\ + id\x12\x19\n\x08block_id\x18\x02\x20\x01(\tR\x07blockId\x12D\n\x10cell_b\ + y_field_id\x18\x03\x20\x03(\x0b2\x1b.RowMeta.CellByFieldIdEntryR\rcellBy\ + FieldId\x12\x16\n\x06height\x18\x04\x20\x01(\x05R\x06height\x12\x1e\n\nv\ + isibility\x18\x05\x20\x01(\x08R\nvisibility\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\x01\"\xa7\x02\n\x10RowMetaChan\ + geset\x12\x15\n\x06row_id\x18\x01\x20\x01(\tR\x05rowId\x12\x18\n\x06heig\ + ht\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\x12Cel\ + lByFieldIdEntry\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\ro\ + ne_of_heightB\x13\n\x11one_of_visibility\"9\n\x08CellMeta\x12\x19\n\x08f\ + ield_id\x18\x01\x20\x01(\tR\x07fieldId\x12\x12\n\x04data\x18\x02\x20\x01\ + (\tR\x04data\"\x83\x01\n\x11CellMetaChangeset\x12\x17\n\x07grid_id\x18\ + \x01\x20\x01(\tR\x06gridId\x12\x15\n\x06row_id\x18\x02\x20\x01(\tR\x05ro\ + wId\x12\x19\n\x08field_id\x18\x03\x20\x01(\tR\x07fieldId\x12\x14\n\x04da\ + ta\x18\x04\x20\x01(\tH\0R\x04dataB\r\n\x0bone_of_data\"\xac\x01\n\x10Bui\ + ldGridContext\x12+\n\x0bfield_metas\x18\x01\x20\x03(\x0b2\n.FieldMetaR\n\ + fieldMetas\x12/\n\x0bblock_metas\x18\x02\x20\x01(\x0b2\x0e.GridBlockMeta\ + R\nblockMetas\x12:\n\x0fblock_meta_data\x18\x03\x20\x01(\x0b2\x12.GridBl\ + ockMetaDataR\rblockMetaData*d\n\tFieldType\x12\x0c\n\x08RichText\x10\0\ + \x12\n\n\x06Number\x10\x01\x12\x0c\n\x08DateTime\x10\x02\x12\x10\n\x0cSi\ + ngleSelect\x10\x03\x12\x0f\n\x0bMultiSelect\x10\x04\x12\x0c\n\x08Checkbo\ + x\x10\x05b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto b/shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto index 2ce7c429d5..c1166a3ae1 100644 --- a/shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto +++ b/shared-lib/flowy-grid-data-model/src/protobuf/proto/grid.proto @@ -18,6 +18,21 @@ message Field { message FieldOrder { string field_id = 1; } +message GetEditFieldContextPayload { + string grid_id = 1; + oneof one_of_field_id { string field_id = 2; }; + FieldType field_type = 3; +} +message EditFieldPayload { + string grid_id = 1; + string field_id = 2; + FieldType field_type = 3; +} +message EditFieldContext { + string grid_id = 1; + Field grid_field = 2; + bytes type_option_data = 3; +} message RepeatedField { repeated Field items = 1; } @@ -44,13 +59,19 @@ message GridBlockOrder { string block_id = 1; } message GridBlock { - string block_id = 1; + string id = 1; repeated RowOrder row_orders = 2; } message Cell { string field_id = 1; string content = 2; } +message CellNotificationData { + string grid_id = 1; + string field_id = 2; + string row_id = 3; + oneof one_of_content { string content = 4; }; +} message RepeatedCell { repeated Cell items = 1; } @@ -67,6 +88,12 @@ message CreateRowPayload { string grid_id = 1; oneof one_of_start_row_id { string start_row_id = 2; }; } +message CreateFieldPayload { + string grid_id = 1; + Field field = 2; + bytes type_option_data = 3; + oneof one_of_start_field_id { string start_field_id = 4; }; +} message QueryFieldPayload { string grid_id = 1; RepeatedFieldOrder field_orders = 2; @@ -75,8 +102,3 @@ message QueryGridBlocksPayload { string grid_id = 1; repeated GridBlockOrder block_orders = 2; } -message QueryRowPayload { - string grid_id = 1; - string block_id = 2; - string row_id = 3; -} diff --git a/shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto b/shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto index 24e1d22696..ca00b88b57 100644 --- a/shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto +++ b/shared-lib/flowy-grid-data-model/src/protobuf/proto/meta.proto @@ -10,7 +10,7 @@ message GridBlockMeta { int32 start_row_index = 2; int32 row_count = 3; } -message GridBlockMetaSerde { +message GridBlockMetaData { string block_id = 1; repeated RowMeta row_metas = 2; } @@ -22,17 +22,21 @@ message FieldMeta { bool frozen = 5; bool visibility = 6; int32 width = 7; - string type_options = 8; + TypeOptionDataByFieldTypeId type_option_by_field_type_id = 8; } -message FieldChangeset { +message TypeOptionDataByFieldTypeId { + map map = 1; +} +message FieldChangesetPayload { string field_id = 1; - oneof one_of_name { string name = 2; }; - oneof one_of_desc { string desc = 3; }; - oneof one_of_field_type { FieldType field_type = 4; }; - oneof one_of_frozen { bool frozen = 5; }; - oneof one_of_visibility { bool visibility = 6; }; - oneof one_of_width { int32 width = 7; }; - oneof one_of_type_options { string type_options = 8; }; + 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; @@ -64,7 +68,7 @@ message CellMetaChangeset { message BuildGridContext { repeated FieldMeta field_metas = 1; GridBlockMeta block_metas = 2; - GridBlockMetaSerde block_meta_data = 3; + GridBlockMetaData block_meta_data = 3; } enum FieldType { RichText = 0; diff --git a/shared-lib/flowy-sync/src/client_grid/grid_block_meta_pad.rs b/shared-lib/flowy-sync/src/client_grid/grid_block_meta_pad.rs index 7bfef998c2..688b32cccc 100644 --- a/shared-lib/flowy-sync/src/client_grid/grid_block_meta_pad.rs +++ b/shared-lib/flowy-sync/src/client_grid/grid_block_meta_pad.rs @@ -1,10 +1,11 @@ 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::{GridBlockMetaSerde, RowMeta, RowMetaChangeset}; +use flowy_grid_data_model::entities::{CellMeta, GridBlockMetaData, RowMeta, RowMetaChangeset}; use lib_infra::uuid; use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder}; use serde::{Deserialize, Serialize}; + use std::collections::HashMap; use std::sync::Arc; @@ -23,14 +24,13 @@ pub struct GridBlockMetaPad { impl GridBlockMetaPad { pub fn from_delta(delta: GridBlockMetaDelta) -> CollaborateResult { let s = delta.to_str()?; - tracing::info!("delta: {}", delta); - tracing::info!("{}", s); - let block_meta: GridBlockMetaSerde = serde_json::from_str(&s).map_err(|e| { + tracing::trace!("{}", s); + let meta_data: GridBlockMetaData = serde_json::from_str(&s).map_err(|e| { let msg = format!("Deserialize delta to block meta failed: {}", e); CollaborateError::internal().context(msg) })?; - let block_id = block_meta.block_id; - let rows = block_meta + let block_id = meta_data.block_id; + let rows = meta_data .row_metas .into_iter() .map(Arc::new) @@ -47,20 +47,21 @@ impl GridBlockMetaPad { Self::from_delta(block_delta) } - pub fn add_row( + #[tracing::instrument(level = "trace", skip(self, row), err)] + pub fn add_row_meta( &mut self, row: RowMeta, start_row_id: Option, ) -> CollaborateResult> { self.modify(|rows| { - if let Some(upper_row_id) = start_row_id { - if upper_row_id.is_empty() { + if let Some(start_row_id) = start_row_id { + if start_row_id.is_empty() { rows.insert(0, Arc::new(row)); return Ok(Some(())); } - if let Some(index) = rows.iter().position(|row| row.id == upper_row_id) { - rows.insert(index, Arc::new(row)); + if let Some(index) = rows.iter().position(|row| row.id == start_row_id) { + rows.insert(index + 1, Arc::new(row)); return Ok(Some(())); } } @@ -77,7 +78,7 @@ impl GridBlockMetaPad { }) } - pub fn get_rows(&self, row_ids: Option>) -> CollaborateResult>> { + pub fn get_row_metas(&self, row_ids: &Option>) -> CollaborateResult>> { match row_ids { None => Ok(self.row_metas.to_vec()), Some(row_ids) => { @@ -101,6 +102,18 @@ impl GridBlockMetaPad { } } + pub fn get_cell_metas(&self, field_id: &str, row_ids: &Option>) -> CollaborateResult> { + let rows = self.get_row_metas(row_ids)?; + let cell_metas = rows + .iter() + .flat_map(|row| { + let cell_meta = row.cell_by_field_id.get(field_id)?; + Some(cell_meta.clone()) + }) + .collect::>(); + Ok(cell_metas) + } + pub fn number_of_rows(&self) -> i32 { self.row_metas.len() as i32 } @@ -185,12 +198,12 @@ pub struct GridBlockMetaChange { pub md5: String, } -pub fn make_block_meta_delta(grid_block_meta_data: &GridBlockMetaSerde) -> GridBlockMetaDelta { +pub fn make_block_meta_delta(grid_block_meta_data: &GridBlockMetaData) -> GridBlockMetaDelta { let json = serde_json::to_string(&grid_block_meta_data).unwrap(); PlainTextDeltaBuilder::new().insert(&json).build() } -pub fn make_block_meta_revisions(user_id: &str, grid_block_meta_data: &GridBlockMetaSerde) -> RepeatedRevision { +pub fn make_block_meta_revisions(user_id: &str, grid_block_meta_data: &GridBlockMetaData) -> RepeatedRevision { let delta = make_block_meta_delta(grid_block_meta_data); let bytes = delta.to_delta_bytes(); let revision = Revision::initial_revision(user_id, &grid_block_meta_data.block_id, bytes); @@ -199,7 +212,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 = GridBlockMetaSerde { + let block_meta_data = GridBlockMetaData { block_id: uuid(), row_metas: vec![], }; @@ -229,7 +242,7 @@ mod tests { visibility: false, }; - let change = pad.add_row(row, None).unwrap().unwrap(); + let change = pad.add_row_meta(row, None).unwrap().unwrap(); assert_eq!( change.delta.to_delta_str(), r#"[{"retain":29},{"insert":"{\"id\":\"1\",\"block_id\":\"1\",\"cell_by_field_id\":{},\"height\":0,\"visibility\":false}"},{"retain":2}]"# @@ -243,19 +256,19 @@ mod tests { let row_2 = test_row_meta("2", &pad); let row_3 = test_row_meta("3", &pad); - let change = pad.add_row(row_1.clone(), None).unwrap().unwrap(); + let change = pad.add_row_meta(row_1.clone(), None).unwrap().unwrap(); assert_eq!( change.delta.to_delta_str(), r#"[{"retain":29},{"insert":"{\"id\":\"1\",\"block_id\":\"1\",\"cell_by_field_id\":{},\"height\":0,\"visibility\":false}"},{"retain":2}]"# ); - let change = pad.add_row(row_2.clone(), None).unwrap().unwrap(); + let change = pad.add_row_meta(row_2.clone(), None).unwrap().unwrap(); assert_eq!( change.delta.to_delta_str(), r#"[{"retain":106},{"insert":",{\"id\":\"2\",\"block_id\":\"1\",\"cell_by_field_id\":{},\"height\":0,\"visibility\":false}"},{"retain":2}]"# ); - let change = pad.add_row(row_3.clone(), Some("2".to_string())).unwrap().unwrap(); + let change = pad.add_row_meta(row_3.clone(), Some("2".to_string())).unwrap().unwrap(); assert_eq!( change.delta.to_delta_str(), r#"[{"retain":114},{"insert":"3\",\"block_id\":\"1\",\"cell_by_field_id\":{},\"height\":0,\"visibility\":false},{\"id\":\""},{"retain":72}]"# @@ -283,9 +296,9 @@ mod tests { let row_2 = test_row_meta("2", &pad); let row_3 = test_row_meta("3", &pad); - let _ = pad.add_row(row_1.clone(), None).unwrap().unwrap(); - let _ = pad.add_row(row_2.clone(), None).unwrap().unwrap(); - let _ = pad.add_row(row_3.clone(), Some("1".to_string())).unwrap().unwrap(); + let _ = pad.add_row_meta(row_1.clone(), None).unwrap().unwrap(); + let _ = pad.add_row_meta(row_2.clone(), None).unwrap().unwrap(); + let _ = pad.add_row_meta(row_3.clone(), Some("1".to_string())).unwrap().unwrap(); assert_eq!(*pad.row_metas[0], row_3); assert_eq!(*pad.row_metas[1], row_1); @@ -299,9 +312,9 @@ mod tests { let row_2 = test_row_meta("2", &pad); let row_3 = test_row_meta("3", &pad); - let _ = pad.add_row(row_1.clone(), None).unwrap().unwrap(); - let _ = pad.add_row(row_2.clone(), None).unwrap().unwrap(); - let _ = pad.add_row(row_3.clone(), Some("".to_string())).unwrap().unwrap(); + let _ = pad.add_row_meta(row_1.clone(), None).unwrap().unwrap(); + let _ = pad.add_row_meta(row_2.clone(), None).unwrap().unwrap(); + let _ = pad.add_row_meta(row_3.clone(), Some("".to_string())).unwrap().unwrap(); assert_eq!(*pad.row_metas[0], row_3); assert_eq!(*pad.row_metas[1], row_1); @@ -320,7 +333,7 @@ mod tests { visibility: false, }; - let _ = pad.add_row(row.clone(), None).unwrap().unwrap(); + let _ = pad.add_row_meta(row.clone(), None).unwrap().unwrap(); let change = pad.delete_rows(&[row.id]).unwrap().unwrap(); assert_eq!( change.delta.to_delta_str(), @@ -348,7 +361,7 @@ mod tests { cell_by_field_id: Default::default(), }; - let _ = pad.add_row(row, None).unwrap().unwrap(); + let _ = pad.add_row_meta(row, None).unwrap().unwrap(); let change = pad.update_row(changeset).unwrap().unwrap(); assert_eq!( diff --git a/shared-lib/flowy-sync/src/client_grid/grid_builder.rs b/shared-lib/flowy-sync/src/client_grid/grid_builder.rs index 2875a8968c..2b91e1352c 100644 --- a/shared-lib/flowy-sync/src/client_grid/grid_builder.rs +++ b/shared-lib/flowy-sync/src/client_grid/grid_builder.rs @@ -41,7 +41,7 @@ fn check_rows(fields: &[FieldMeta], rows: &[RowMeta]) -> CollaborateResult<()> { mod tests { use crate::client_grid::{make_block_meta_delta, make_grid_delta, GridBuilder}; - use flowy_grid_data_model::entities::{FieldMeta, FieldType, GridBlockMetaSerde, GridMeta}; + use flowy_grid_data_model::entities::{FieldMeta, FieldType, GridBlockMetaData, GridMeta}; #[test] fn create_default_grid_test() { @@ -64,6 +64,6 @@ mod tests { let _: GridMeta = serde_json::from_str(&grid_meta_delta.to_str().unwrap()).unwrap(); let grid_block_meta_delta = make_block_meta_delta(&build_context.block_meta_data); - let _: GridBlockMetaSerde = serde_json::from_str(&grid_block_meta_delta.to_str().unwrap()).unwrap(); + let _: GridBlockMetaData = serde_json::from_str(&grid_block_meta_delta.to_str().unwrap()).unwrap(); } } diff --git a/shared-lib/flowy-sync/src/client_grid/grid_meta_pad.rs b/shared-lib/flowy-sync/src/client_grid/grid_meta_pad.rs index 8d4ab37b6d..8329d9cc9c 100644 --- a/shared-lib/flowy-sync/src/client_grid/grid_meta_pad.rs +++ b/shared-lib/flowy-sync/src/client_grid/grid_meta_pad.rs @@ -3,11 +3,13 @@ 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::{ - FieldChangeset, FieldMeta, FieldOrder, GridBlockMeta, GridBlockMetaChangeset, GridMeta, RepeatedFieldOrder, + FieldChangesetParams, FieldMeta, FieldOrder, FieldType, GridBlockMeta, GridBlockMetaChangeset, GridMeta, }; + use lib_infra::uuid; use lib_ot::core::{OperationTransformable, PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder}; use std::collections::HashMap; + use std::sync::Arc; pub type GridMetaDelta = PlainTextDelta; @@ -18,6 +20,10 @@ pub struct GridMetaPad { pub(crate) delta: GridMetaDelta, } +pub trait JsonDeserializer { + fn deserialize(&self, type_option_data: Vec) -> CollaborateResult; +} + impl GridMetaPad { pub fn from_delta(delta: GridMetaDelta) -> CollaborateResult { let s = delta.to_str()?; @@ -35,67 +41,97 @@ impl GridMetaPad { Self::from_delta(grid_delta) } - pub fn create_field(&mut self, field_meta: FieldMeta) -> CollaborateResult> { - self.modify_grid(|grid| { - if grid.fields.contains(&field_meta) { - tracing::warn!("Duplicate grid field"); - Ok(None) - } else { - grid.fields.push(field_meta); - Ok(Some(())) + #[tracing::instrument(level = "debug", skip_all, err)] + pub fn create_field( + &mut self, + new_field_meta: FieldMeta, + start_field_id: Option, + ) -> CollaborateResult> { + self.modify_grid(|grid_meta| { + // Check if the field exists or not + if grid_meta + .fields + .iter() + .any(|field_meta| field_meta.id == new_field_meta.id) + { + tracing::error!("Duplicate grid field"); + return Ok(None); } + + let insert_index = match start_field_id { + None => None, + Some(start_field_id) => grid_meta.fields.iter().position(|field| field.id == start_field_id), + }; + + match insert_index { + None => grid_meta.fields.push(new_field_meta), + Some(index) => grid_meta.fields.insert(index, new_field_meta), + } + Ok(Some(())) }) } pub fn delete_field(&mut self, field_id: &str) -> CollaborateResult> { - self.modify_grid(|grid| match grid.fields.iter().position(|field| field.id == field_id) { - None => Ok(None), - Some(index) => { - grid.fields.remove(index); - Ok(Some(())) + self.modify_grid( + |grid_meta| match grid_meta.fields.iter().position(|field| field.id == field_id) { + None => Ok(None), + Some(index) => { + grid_meta.fields.remove(index); + Ok(Some(())) + } + }, + ) + } + + pub fn duplicate_field(&mut self, field_id: &str) -> CollaborateResult> { + self.modify_grid( + |grid_meta| match grid_meta.fields.iter().position(|field| field.id == field_id) { + None => Ok(None), + Some(index) => { + let mut duplicate_field_meta = grid_meta.fields[index].clone(); + duplicate_field_meta.id = uuid(); + duplicate_field_meta.name = format!("{} (copy)", duplicate_field_meta.name); + grid_meta.fields.insert(index + 1, duplicate_field_meta); + Ok(Some(())) + } + }, + ) + } + + pub fn switch_to_field( + &mut self, + field_id: &str, + field_type: FieldType, + type_option_json_builder: B, + ) -> CollaborateResult> + where + B: FnOnce(&FieldType) -> String, + { + self.modify_grid(|grid_meta| { + // + match grid_meta.fields.iter_mut().find(|field_meta| field_meta.id == field_id) { + None => { + tracing::warn!("Can not find the field with id: {}", field_id); + Ok(None) + } + Some(field_meta) => { + if field_meta.get_type_option_str(Some(field_type.clone())).is_none() { + let type_option_json = type_option_json_builder(&field_type); + field_meta.insert_type_option_str(&field_type, type_option_json); + } + + field_meta.field_type = field_type; + Ok(Some(())) + } } }) } - pub fn contain_field(&self, field_id: &str) -> bool { - self.grid_meta.fields.iter().any(|field| field.id == field_id) - } - - pub fn get_field(&self, field_id: &str) -> Option<&FieldMeta> { - self.grid_meta.fields.iter().find(|field| field.id == field_id) - } - - pub fn get_field_orders(&self) -> Vec { - self.grid_meta.fields.iter().map(FieldOrder::from).collect() - } - - pub fn get_field_metas(&self, field_orders: Option) -> CollaborateResult> { - match field_orders { - None => Ok(self.grid_meta.fields.clone()), - Some(field_orders) => { - let field_by_field_id = self - .grid_meta - .fields - .iter() - .map(|field| (&field.id, field)) - .collect::>(); - - let fields = field_orders - .iter() - .flat_map(|field_order| match field_by_field_id.get(&field_order.field_id) { - None => { - tracing::error!("Can't find the field with id: {}", field_order.field_id); - None - } - Some(field) => Some((*field).clone()), - }) - .collect::>(); - Ok(fields) - } - } - } - - pub fn update_field(&mut self, changeset: FieldChangeset) -> CollaborateResult> { + pub fn update_field( + &mut self, + changeset: FieldChangesetParams, + deserializer: T, + ) -> CollaborateResult> { let field_id = changeset.field_id.clone(); self.modify_field(&field_id, |field| { let mut is_changed = None; @@ -129,23 +165,82 @@ impl GridMetaPad { is_changed = Some(()) } - if let Some(type_options) = changeset.type_options { - field.type_options = type_options; - is_changed = Some(()) + if let Some(type_option_data) = changeset.type_option_data { + match deserializer.deserialize(type_option_data) { + Ok(json_str) => { + let field_type = field.field_type.clone(); + field.insert_type_option_str(&field_type, json_str); + is_changed = Some(()) + } + Err(err) => { + tracing::error!("Deserialize data to type option json failed: {}", err); + } + } } Ok(is_changed) }) } - pub fn create_block(&mut self, block: GridBlockMeta) -> CollaborateResult> { - self.modify_grid(|grid| { - if grid.block_metas.iter().any(|b| b.block_id == block.block_id) { + pub fn get_field(&self, field_id: &str) -> Option<&FieldMeta> { + self.grid_meta.fields.iter().find(|field| field.id == field_id) + } + + pub fn replace_field(&mut self, field_meta: FieldMeta) -> CollaborateResult> { + self.modify_grid( + |grid_meta| match grid_meta.fields.iter().position(|field| field.id == field_meta.id) { + None => Ok(None), + Some(index) => { + grid_meta.fields.remove(index); + grid_meta.fields.insert(index, field_meta); + Ok(Some(())) + } + }, + ) + } + + pub fn contain_field(&self, field_id: &str) -> bool { + self.grid_meta.fields.iter().any(|field| field.id == field_id) + } + + pub fn get_field_orders(&self) -> Vec { + self.grid_meta.fields.iter().map(FieldOrder::from).collect() + } + + pub fn get_field_metas(&self, field_orders: Option>) -> CollaborateResult> { + match field_orders { + None => Ok(self.grid_meta.fields.clone()), + Some(field_orders) => { + let field_by_field_id = self + .grid_meta + .fields + .iter() + .map(|field| (&field.id, field)) + .collect::>(); + + let fields = field_orders + .iter() + .flat_map(|field_order| match field_by_field_id.get(&field_order.field_id) { + None => { + tracing::error!("Can't find the field with id: {}", field_order.field_id); + None + } + Some(field) => Some((*field).clone()), + }) + .collect::>(); + Ok(fields) + } + } + } + + pub fn create_block_meta(&mut self, block: GridBlockMeta) -> CollaborateResult> { + self.modify_grid(|grid_meta| { + if grid_meta.block_metas.iter().any(|b| b.block_id == block.block_id) { tracing::warn!("Duplicate grid block"); Ok(None) } else { - match grid.block_metas.last() { - None => grid.block_metas.push(block), + match grid_meta.block_metas.last() { + None => grid_meta.block_metas.push(block), Some(last_block) => { if last_block.start_row_index > block.start_row_index && last_block.len() > block.start_row_index @@ -153,7 +248,7 @@ impl GridMetaPad { let msg = "GridBlock's start_row_index should be greater than the last_block's start_row_index and its len".to_string(); return Err(CollaborateError::internal().context(msg)) } - grid.block_metas.push(block); + grid_meta.block_metas.push(block); } } Ok(Some(())) @@ -161,11 +256,11 @@ impl GridMetaPad { }) } - pub fn get_blocks(&self) -> Vec { + pub fn get_block_metas(&self) -> Vec { self.grid_meta.block_metas.clone() } - pub fn update_block(&mut self, changeset: GridBlockMetaChangeset) -> CollaborateResult> { + pub fn update_block_meta(&mut self, changeset: GridBlockMetaChangeset) -> CollaborateResult> { let block_id = changeset.block_id.clone(); self.modify_block(&block_id, |block| { let mut is_changed = None; @@ -225,28 +320,34 @@ impl GridMetaPad { where F: FnOnce(&mut GridBlockMeta) -> CollaborateResult>, { - self.modify_grid( - |grid| match grid.block_metas.iter().position(|block| block.block_id == block_id) { + self.modify_grid(|grid_meta| { + match grid_meta + .block_metas + .iter() + .position(|block| block.block_id == block_id) + { None => { tracing::warn!("[GridMetaPad]: Can't find any block with id: {}", block_id); Ok(None) } - Some(index) => f(&mut grid.block_metas[index]), - }, - ) + Some(index) => f(&mut grid_meta.block_metas[index]), + } + }) } pub fn modify_field(&mut self, field_id: &str, f: F) -> CollaborateResult> where F: FnOnce(&mut FieldMeta) -> CollaborateResult>, { - self.modify_grid(|grid| match grid.fields.iter().position(|field| field.id == field_id) { - None => { - tracing::warn!("[GridMetaPad]: Can't find any field with id: {}", field_id); - Ok(None) - } - Some(index) => f(&mut grid.fields[index]), - }) + self.modify_grid( + |grid_meta| match grid_meta.fields.iter().position(|field| field.id == field_id) { + None => { + tracing::warn!("[GridMetaPad]: Can't find any field with id: {}", field_id); + Ok(None) + } + Some(index) => f(&mut grid_meta.fields[index]), + }, + ) } }