From c7f73551c725e0e823421ad1a39603dc4443ca10 Mon Sep 17 00:00:00 2001 From: "Nathan.fooo" <86001920+appflowy@users.noreply.github.com> Date: Sun, 11 Jun 2023 08:49:10 +0800 Subject: [PATCH] fix: update database layout in document (#2757) * fix: update database layout in document * feat: create or ref calendar * Update frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/calendar/calendar_menu_item.dart Co-authored-by: Mathias Mogensen <42929161+Xazin@users.noreply.github.com> * fix: stop listen * feat: remove the redundant database view files * chore: rename the grid state --------- Co-authored-by: Mathias Mogensen <42929161+Xazin@users.noreply.github.com> Co-authored-by: Lucas.Xu --- .../assets/images/editor/calendar.svg | 7 ++ .../assets/translations/en.json | 8 +- .../lib/plugins/blank/blank.dart | 2 +- .../plugins/database_view/board/board.dart | 4 +- .../database_view/calendar/calendar.dart | 4 +- .../plugins/database_view/database_view.dart | 6 ++ .../lib/plugins/database_view/grid/grid.dart | 4 +- .../widgets/database_view_widget.dart | 75 ++++++++++++++++ .../lib/plugins/document/document.dart | 4 +- .../document/presentation/editor_page.dart | 14 ++- .../base/built_in_page_widget.dart | 2 +- .../base/insert_page_command.dart | 18 ++-- .../base/link_to_page_widget.dart | 6 ++ .../editor_plugins/board/board_menu_item.dart | 26 ------ .../board/board_view_menu_item.dart | 35 -------- .../database_view_block_component.dart} | 33 ++++--- .../database/inline_database_menu_item.dart | 90 +++++++++++++++++++ .../referenced_database_menu_tem.dart | 63 +++++++++++++ .../editor_plugins/grid/grid_menu_item.dart | 26 ------ .../editor_plugins/grid/grid_node_widget.dart | 90 ------------------- .../grid/grid_view_menu_item.dart | 36 -------- .../presentation/editor_plugins/plugins.dart | 8 +- .../lib/plugins/trash/trash.dart | 2 +- .../lib/startup/plugin/plugin.dart | 2 +- .../presentation/home/home_stack.dart | 2 +- .../src/services/database/database_editor.rs | 10 +-- 26 files changed, 310 insertions(+), 267 deletions(-) create mode 100644 frontend/appflowy_flutter/assets/images/editor/calendar.svg create mode 100644 frontend/appflowy_flutter/lib/plugins/database_view/widgets/database_view_widget.dart delete mode 100644 frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_menu_item.dart delete mode 100644 frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_view_menu_item.dart rename frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/{board/board_node_widget.dart => database/database_view_block_component.dart} (68%) create mode 100644 frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/inline_database_menu_item.dart create mode 100644 frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/referenced_database_menu_tem.dart delete mode 100644 frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_menu_item.dart delete mode 100644 frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_node_widget.dart delete mode 100644 frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_view_menu_item.dart diff --git a/frontend/appflowy_flutter/assets/images/editor/calendar.svg b/frontend/appflowy_flutter/assets/images/editor/calendar.svg new file mode 100644 index 0000000000..c69687bc2a --- /dev/null +++ b/frontend/appflowy_flutter/assets/images/editor/calendar.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/appflowy_flutter/assets/translations/en.json b/frontend/appflowy_flutter/assets/translations/en.json index 50bc5a4838..de558f56a1 100644 --- a/frontend/appflowy_flutter/assets/translations/en.json +++ b/frontend/appflowy_flutter/assets/translations/en.json @@ -368,11 +368,16 @@ "grid": { "selectAGridToLinkTo": "Select a Grid to link to", "createANewGrid": "Create a new Grid" + }, + "calendar": { + "selectACalendarToLinkTo": "Select a Calendar to link to", + "createANewCalendar": "Create a new Calendar" } }, "plugins": { "referencedBoard": "Referenced Board", "referencedGrid": "Referenced Grid", + "referencedCalendar": "Referenced Calendar", "autoGeneratorMenuItemName": "OpenAI Writer", "autoGeneratorTitleName": "OpenAI: Ask AI to write anything...", "autoGeneratorLearnMore": "Learn more", @@ -461,6 +466,7 @@ "noDateHint": "Unscheduled events will show up here", "clickToAdd": "Click to add to the calendar", "name": "Calendar layout" - } + }, + "referencedCalendarPrefix": "View of" } } \ No newline at end of file diff --git a/frontend/appflowy_flutter/lib/plugins/blank/blank.dart b/frontend/appflowy_flutter/lib/plugins/blank/blank.dart index 385f6d52a2..afd1ef5545 100644 --- a/frontend/appflowy_flutter/lib/plugins/blank/blank.dart +++ b/frontend/appflowy_flutter/lib/plugins/blank/blank.dart @@ -43,7 +43,7 @@ class BlankPagePluginWidgetBuilder extends PluginWidgetBuilder Widget get leftBarItem => FlowyText.medium(LocaleKeys.blankPageTitle.tr()); @override - Widget buildWidget(PluginContext context) => const BlankPage(); + Widget buildWidget({PluginContext? context}) => const BlankPage(); @override List get navigationItems => [this]; diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/board/board.dart b/frontend/appflowy_flutter/lib/plugins/database_view/board/board.dart index 05a583c792..8259b39e20 100644 --- a/frontend/appflowy_flutter/lib/plugins/database_view/board/board.dart +++ b/frontend/appflowy_flutter/lib/plugins/database_view/board/board.dart @@ -69,11 +69,11 @@ class BoardPluginWidgetBuilder extends PluginWidgetBuilder { Widget get leftBarItem => ViewLeftBarItem(view: view); @override - Widget buildWidget(PluginContext context) { + Widget buildWidget({PluginContext? context}) { notifier.isDeleted.addListener(() { notifier.isDeleted.value.fold(() => null, (deletedView) { if (deletedView.hasIndex()) { - context.onDeleted(view, deletedView.index); + context?.onDeleted(view, deletedView.index); } }); }); diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/calendar.dart b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/calendar.dart index 242f204258..7990932a1f 100644 --- a/frontend/appflowy_flutter/lib/plugins/database_view/calendar/calendar.dart +++ b/frontend/appflowy_flutter/lib/plugins/database_view/calendar/calendar.dart @@ -69,11 +69,11 @@ class CalendarPluginWidgetBuilder extends PluginWidgetBuilder { Widget get leftBarItem => ViewLeftBarItem(view: view); @override - Widget buildWidget(PluginContext context) { + Widget buildWidget({PluginContext? context}) { notifier.isDeleted.addListener(() { notifier.isDeleted.value.fold(() => null, (deletedView) { if (deletedView.hasIndex()) { - context.onDeleted(view, deletedView.index); + context?.onDeleted(view, deletedView.index); } }); }); diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/database_view.dart b/frontend/appflowy_flutter/lib/plugins/database_view/database_view.dart index db750907e6..4b9ddfe4bf 100644 --- a/frontend/appflowy_flutter/lib/plugins/database_view/database_view.dart +++ b/frontend/appflowy_flutter/lib/plugins/database_view/database_view.dart @@ -31,6 +31,12 @@ class DatabaseViewPlugin extends Plugin { @override PluginWidgetBuilder get widgetBuilder => _innerPlugin.widgetBuilder; + @override + void dispose() { + _viewListener.stop(); + super.dispose(); + } + void _listenOnLayoutChanged() { _viewListener.start( onViewUpdated: (result) { diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/grid/grid.dart b/frontend/appflowy_flutter/lib/plugins/database_view/grid/grid.dart index 6f12f1cd88..579051cbee 100644 --- a/frontend/appflowy_flutter/lib/plugins/database_view/grid/grid.dart +++ b/frontend/appflowy_flutter/lib/plugins/database_view/grid/grid.dart @@ -69,11 +69,11 @@ class GridPluginWidgetBuilder extends PluginWidgetBuilder { Widget get leftBarItem => ViewLeftBarItem(view: view); @override - Widget buildWidget(PluginContext context) { + Widget buildWidget({PluginContext? context}) { notifier.isDeleted.addListener(() { notifier.isDeleted.value.fold(() => null, (deletedView) { if (deletedView.hasIndex()) { - context.onDeleted(view, deletedView.index); + context?.onDeleted(view, deletedView.index); } }); }); diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/widgets/database_view_widget.dart b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/database_view_widget.dart new file mode 100644 index 0000000000..69321d3c45 --- /dev/null +++ b/frontend/appflowy_flutter/lib/plugins/database_view/widgets/database_view_widget.dart @@ -0,0 +1,75 @@ +import 'package:appflowy/startup/plugin/plugin.dart'; +import 'package:appflowy/workspace/application/view/view_ext.dart'; +import 'package:appflowy/workspace/application/view/view_listener.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; +import 'package:flutter/material.dart'; + +class DatabaseViewWidget extends StatefulWidget { + const DatabaseViewWidget({ + super.key, + required this.view, + }); + + final ViewPB view; + + @override + State createState() => _DatabaseViewWidgetState(); +} + +class _DatabaseViewWidgetState extends State { + /// Listens to the view updates. + late final ViewListener _listener; + + /// Notifies the view layout type changes. When the layout type changes, + /// the widget of the view will be updated. + late final ValueNotifier _layoutTypeChangeNotifier; + + /// The view will be updated by the [ViewListener]. + late ViewPB view; + + @override + void initState() { + super.initState(); + + view = widget.view; + _listenOnViewUpdated(); + } + + @override + void dispose() { + _layoutTypeChangeNotifier.dispose(); + _listener.stop(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: _layoutTypeChangeNotifier, + builder: (_, __, ___) { + return makePlugin(pluginType: view.pluginType, data: view) + .widgetBuilder + .buildWidget(); + }, + ); + } + + void _listenOnViewUpdated() { + _listener = ViewListener(view: widget.view) + ..start( + onViewUpdated: (result) { + result.fold( + (updatedView) { + if (mounted) { + view = updatedView; + _layoutTypeChangeNotifier.value = view.layout; + } + }, + (r) => null, + ); + }, + ); + + _layoutTypeChangeNotifier = ValueNotifier(widget.view.layout); + } +} diff --git a/frontend/appflowy_flutter/lib/plugins/document/document.dart b/frontend/appflowy_flutter/lib/plugins/document/document.dart index b6d4605ea7..34cea94b75 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/document.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/document.dart @@ -92,7 +92,7 @@ class DocumentPluginWidgetBuilder extends PluginWidgetBuilder EdgeInsets get contentPadding => EdgeInsets.zero; @override - Widget buildWidget(PluginContext context) { + Widget buildWidget({PluginContext? context}) { notifier.isDeleted.addListener(() { notifier.isDeleted.value.fold(() => null, (deletedView) { if (deletedView.hasIndex()) { @@ -107,7 +107,7 @@ class DocumentPluginWidgetBuilder extends PluginWidgetBuilder builder: (_, state) { return DocumentPage( view: view, - onDeleted: () => context.onDeleted(view, deletedViewIndex), + onDeleted: () => context?.onDeleted(view, deletedViewIndex), key: ValueKey(view.id), ); }, diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart index c98683be31..892a4857e9 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_page.dart @@ -1,6 +1,7 @@ import 'package:appflowy/plugins/document/application/doc_bloc.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/actions/option_action.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/actions/block_action_list.dart'; +import 'package:appflowy/plugins/document/presentation/editor_plugins/database/referenced_database_menu_tem.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart'; import 'package:appflowy/plugins/document/presentation/editor_style.dart'; import 'package:appflowy_editor/appflowy_editor.dart'; @@ -45,9 +46,11 @@ class _AppFlowyEditorPageState extends State { late final slashMenuItems = [ inlineGridMenuItem(documentBloc), - referenceGridMenuItem, + referencedGridMenuItem, inlineBoardMenuItem(documentBloc), - boardMenuItem, + referencedBoardMenuItem, + inlineCalendarMenuItem(documentBloc), + referencedCalendarMenuItem, calloutItem, mathEquationItem, codeBlockItem, @@ -174,10 +177,13 @@ class _AppFlowyEditorPageState extends State { ImageBlockKeys.type: ImageBlockComponentBuilder( configuration: configuration, ), - BoardBlockKeys.type: BoardBlockComponentBuilder( + DatabaseBlockKeys.gridType: DatabaseViewBlockComponentBuilder( configuration: configuration, ), - GridBlockKeys.type: GridBlockComponentBuilder( + DatabaseBlockKeys.boardType: DatabaseViewBlockComponentBuilder( + configuration: configuration, + ), + DatabaseBlockKeys.calendarType: DatabaseViewBlockComponentBuilder( configuration: configuration, ), CalloutBlockKeys.type: CalloutBlockComponentBuilder( diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart index 8fef6b674a..ce29cc7bea 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart @@ -1,4 +1,4 @@ -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/insert_page_command.dart'; +import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart'; import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/workspace/application/view/view_service.dart'; import 'package:appflowy/workspace/presentation/widgets/pop_up_action.dart'; diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/insert_page_command.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/insert_page_command.dart index 614cc7f618..2b17919788 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/insert_page_command.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/insert_page_command.dart @@ -1,19 +1,11 @@ import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/plugins/database_view/application/database_view_service.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/board/board_node_widget.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/grid/grid_node_widget.dart'; +import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart'; import 'package:appflowy/workspace/application/view/view_service.dart'; import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; import 'package:appflowy_editor/appflowy_editor.dart'; import 'package:easy_localization/easy_localization.dart'; -class DatabaseBlockKeys { - const DatabaseBlockKeys._(); - - static const String parentID = 'parent_id'; - static const String viewID = 'view_id'; -} - extension InsertDatabase on EditorState { Future insertInlinePage(String parentViewId, ViewPB childView) async { final selection = this.selection; @@ -93,6 +85,8 @@ extension InsertDatabase on EditorState { return LocaleKeys.grid_referencedGridPrefix.tr(); case ViewLayoutPB.Board: return LocaleKeys.board_referencedBoardPrefix.tr(); + case ViewLayoutPB.Calendar: + return LocaleKeys.calendar_referencedCalendarPrefix.tr(); default: throw UnimplementedError(); } @@ -101,9 +95,11 @@ extension InsertDatabase on EditorState { String _convertPageType(ViewPB viewPB) { switch (viewPB.layout) { case ViewLayoutPB.Grid: - return GridBlockKeys.type; + return DatabaseBlockKeys.gridType; case ViewLayoutPB.Board: - return BoardBlockKeys.type; + return DatabaseBlockKeys.boardType; + case ViewLayoutPB.Calendar: + return DatabaseBlockKeys.calendarType; default: throw Exception('Unknown layout type'); } diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/link_to_page_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/link_to_page_widget.dart index d4925b5920..2d4f247f3d 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/link_to_page_widget.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/link_to_page_widget.dart @@ -243,6 +243,8 @@ class _LinkToPageMenuState extends State { return 'editor/grid'; case ViewLayoutPB.Board: return 'editor/board'; + case ViewLayoutPB.Calendar: + return 'editor/calendar'; default: throw Exception('Unknown layout type'); } @@ -258,6 +260,10 @@ extension on ViewLayoutPB { case ViewLayoutPB.Board: return LocaleKeys.document_slashMenu_board_selectABoardToLinkTo.tr(); + case ViewLayoutPB.Calendar: + return LocaleKeys.document_slashMenu_calendar_selectACalendarToLinkTo + .tr(); + default: throw Exception('Unknown layout type'); } diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_menu_item.dart deleted file mode 100644 index 4b61b6c231..0000000000 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_menu_item.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:appflowy/generated/locale_keys.g.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/link_to_page_widget.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/selectable_svg_widget.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; -import 'package:appflowy_editor/appflowy_editor.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; - -SelectionMenuItem boardMenuItem = SelectionMenuItem( - name: LocaleKeys.document_plugins_referencedBoard.tr(), - icon: (editorState, onSelected, style) => SelectableSvgWidget( - name: 'editor/board', - isSelected: onSelected, - style: style, - ), - keywords: ['referenced', 'board', 'kanban'], - handler: (editorState, menuService, context) { - final container = Overlay.of(context); - showLinkToPageMenu( - container, - editorState, - menuService, - ViewLayoutPB.Board, - ); - }, -); diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_view_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_view_menu_item.dart deleted file mode 100644 index 1fa4cbe5c9..0000000000 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_view_menu_item.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/selectable_svg_widget.dart'; -import 'package:appflowy/workspace/application/view/view_service.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; -import 'package:appflowy_editor/appflowy_editor.dart'; -import 'package:appflowy/generated/locale_keys.g.dart'; -import 'package:appflowy/plugins/document/application/prelude.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/insert_page_command.dart'; -import 'package:easy_localization/easy_localization.dart'; - -SelectionMenuItem inlineBoardMenuItem(DocumentBloc documentBloc) => - SelectionMenuItem( - name: LocaleKeys.document_slashMenu_board_createANewBoard.tr(), - icon: (editorState, onSelected, style) => SelectableSvgWidget( - name: 'editor/board', - isSelected: onSelected, - style: style, - ), - keywords: ['board', 'kanban', 'database'], - handler: (editorState, menuService, context) async { - if (!documentBloc.view.hasParentViewId()) { - return; - } - - final parentViewId = documentBloc.view.parentViewId; - ViewBackendService.createView( - parentViewId: parentViewId, - name: LocaleKeys.menuAppHeader_defaultNewPageName.tr(), - layoutType: ViewLayoutPB.Board, - ).then( - (value) => value - .swap() - .map((r) => editorState.insertInlinePage(parentViewId, r)), - ); - }, - ); diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_node_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/database_view_block_component.dart similarity index 68% rename from frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_node_widget.dart rename to frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/database_view_block_component.dart index 6491148aed..c9242dc4e7 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/board/board_node_widget.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/database_view_block_component.dart @@ -1,18 +1,22 @@ -import 'package:appflowy/plugins/database_view/board/presentation/board_page.dart'; +import 'package:appflowy/plugins/database_view/widgets/database_view_widget.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/insert_page_command.dart'; import 'package:appflowy_editor/appflowy_editor.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -class BoardBlockKeys { - const BoardBlockKeys._(); +class DatabaseBlockKeys { + const DatabaseBlockKeys._(); - static const String type = 'board'; + static const String gridType = 'grid'; + static const String boardType = 'board'; + static const String calendarType = 'calendar'; + + static const String parentID = 'parent_id'; + static const String viewID = 'view_id'; } -class BoardBlockComponentBuilder extends BlockComponentBuilder { - BoardBlockComponentBuilder({ +class DatabaseViewBlockComponentBuilder extends BlockComponentBuilder { + DatabaseViewBlockComponentBuilder({ this.configuration = const BlockComponentConfiguration(), }); @@ -22,7 +26,7 @@ class BoardBlockComponentBuilder extends BlockComponentBuilder { @override BlockComponentWidget build(BlockComponentContext blockComponentContext) { final node = blockComponentContext.node; - return BoardBlockComponentWidget( + return DatabaseBlockComponentWidget( key: node.key, node: node, configuration: configuration, @@ -41,8 +45,8 @@ class BoardBlockComponentBuilder extends BlockComponentBuilder { node.attributes[DatabaseBlockKeys.viewID] is String; } -class BoardBlockComponentWidget extends BlockComponentStatefulWidget { - const BoardBlockComponentWidget({ +class DatabaseBlockComponentWidget extends BlockComponentStatefulWidget { + const DatabaseBlockComponentWidget({ super.key, required super.node, super.showActions, @@ -51,11 +55,12 @@ class BoardBlockComponentWidget extends BlockComponentStatefulWidget { }); @override - State createState() => - _BoardBlockComponentWidgetState(); + State createState() => + _DatabaseBlockComponentWidgetState(); } -class _BoardBlockComponentWidgetState extends State +class _DatabaseBlockComponentWidgetState + extends State with BlockComponentConfigurable { @override Node get node => widget.node; @@ -70,7 +75,7 @@ class _BoardBlockComponentWidgetState extends State node: widget.node, editorState: editorState, builder: (viewPB) { - return BoardPage( + return DatabaseViewWidget( key: ValueKey(viewPB.id), view: viewPB, ); diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/inline_database_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/inline_database_menu_item.dart new file mode 100644 index 0000000000..c07b0b47b3 --- /dev/null +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/inline_database_menu_item.dart @@ -0,0 +1,90 @@ +import 'package:appflowy/generated/locale_keys.g.dart'; +import 'package:appflowy/plugins/document/application/doc_bloc.dart'; +import 'package:appflowy/plugins/document/presentation/editor_plugins/base/insert_page_command.dart'; +import 'package:appflowy/plugins/document/presentation/editor_plugins/base/selectable_svg_widget.dart'; +import 'package:appflowy/workspace/application/view/view_service.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; +import 'package:appflowy_editor/appflowy_editor.dart'; +import 'package:easy_localization/easy_localization.dart'; + +SelectionMenuItem inlineGridMenuItem(DocumentBloc documentBloc) => + SelectionMenuItem( + name: LocaleKeys.document_slashMenu_grid_createANewGrid.tr(), + icon: (editorState, onSelected, style) => SelectableSvgWidget( + name: 'editor/grid', + isSelected: onSelected, + style: style, + ), + keywords: ['grid', 'database'], + handler: (editorState, menuService, context) async { + if (!documentBloc.view.hasParentViewId()) { + return; + } + + final parentViewId = documentBloc.view.parentViewId; + ViewBackendService.createView( + parentViewId: parentViewId, + openAfterCreate: false, + name: LocaleKeys.menuAppHeader_defaultNewPageName.tr(), + layoutType: ViewLayoutPB.Grid, + ).then( + (value) => value + .swap() + .map((r) => editorState.insertInlinePage(parentViewId, r)), + ); + }, + ); + +SelectionMenuItem inlineBoardMenuItem(DocumentBloc documentBloc) => + SelectionMenuItem( + name: LocaleKeys.document_slashMenu_board_createANewBoard.tr(), + icon: (editorState, onSelected, style) => SelectableSvgWidget( + name: 'editor/board', + isSelected: onSelected, + style: style, + ), + keywords: ['board', 'kanban', 'database'], + handler: (editorState, menuService, context) async { + if (!documentBloc.view.hasParentViewId()) { + return; + } + + final parentViewId = documentBloc.view.parentViewId; + ViewBackendService.createView( + parentViewId: parentViewId, + name: LocaleKeys.menuAppHeader_defaultNewPageName.tr(), + layoutType: ViewLayoutPB.Board, + ).then( + (value) => value + .swap() + .map((r) => editorState.insertInlinePage(parentViewId, r)), + ); + }, + ); + +SelectionMenuItem inlineCalendarMenuItem(DocumentBloc documentBloc) => + SelectionMenuItem( + name: LocaleKeys.document_slashMenu_calendar_createANewCalendar.tr(), + icon: (editorState, onSelected, style) => SelectableSvgWidget( + name: 'editor/calendar', + isSelected: onSelected, + style: style, + ), + keywords: ['calendar', 'database'], + handler: (editorState, menuService, context) async { + if (!documentBloc.view.hasParentViewId()) { + return; + } + + final parentViewId = documentBloc.view.parentViewId; + ViewBackendService.createView( + parentViewId: parentViewId, + name: LocaleKeys.menuAppHeader_defaultNewPageName.tr(), + layoutType: ViewLayoutPB.Calendar, + ).then( + (value) => value + .swap() + .map((r) => editorState.insertInlinePage(parentViewId, r)), + ); + }, + ); diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/referenced_database_menu_tem.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/referenced_database_menu_tem.dart new file mode 100644 index 0000000000..ca82324813 --- /dev/null +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/database/referenced_database_menu_tem.dart @@ -0,0 +1,63 @@ +import 'package:appflowy/generated/locale_keys.g.dart'; +import 'package:appflowy/plugins/document/presentation/editor_plugins/base/link_to_page_widget.dart'; +import 'package:appflowy/plugins/document/presentation/editor_plugins/base/selectable_svg_widget.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; +import 'package:appflowy_editor/appflowy_editor.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; + +SelectionMenuItem referencedGridMenuItem = SelectionMenuItem( + name: LocaleKeys.document_plugins_referencedGrid.tr(), + icon: (editorState, onSelected, style) => SelectableSvgWidget( + name: 'editor/grid', + isSelected: onSelected, + style: style, + ), + keywords: ['referenced', 'grid', 'database'], + handler: (editorState, menuService, context) { + final container = Overlay.of(context); + showLinkToPageMenu( + container, + editorState, + menuService, + ViewLayoutPB.Grid, + ); + }, +); + +SelectionMenuItem referencedBoardMenuItem = SelectionMenuItem( + name: LocaleKeys.document_plugins_referencedBoard.tr(), + icon: (editorState, onSelected, style) => SelectableSvgWidget( + name: 'editor/board', + isSelected: onSelected, + style: style, + ), + keywords: ['referenced', 'board', 'kanban'], + handler: (editorState, menuService, context) { + final container = Overlay.of(context); + showLinkToPageMenu( + container, + editorState, + menuService, + ViewLayoutPB.Board, + ); + }, +); + +SelectionMenuItem referencedCalendarMenuItem = SelectionMenuItem( + name: LocaleKeys.document_plugins_referencedCalendar.tr(), + icon: (editorState, onSelected, style) => SelectableSvgWidget( + name: 'editor/calendar', + isSelected: onSelected, + style: style, + ), + keywords: ['referenced', 'calendar', 'database'], + handler: (editorState, menuService, context) { + showLinkToPageMenu( + Overlay.of(context), + editorState, + menuService, + ViewLayoutPB.Calendar, + ); + }, +); diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_menu_item.dart deleted file mode 100644 index 0b6b1450ba..0000000000 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_menu_item.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:appflowy/generated/locale_keys.g.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/link_to_page_widget.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/selectable_svg_widget.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; -import 'package:appflowy_editor/appflowy_editor.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; - -SelectionMenuItem referenceGridMenuItem = SelectionMenuItem( - name: LocaleKeys.document_plugins_referencedGrid.tr(), - icon: (editorState, onSelected, style) => SelectableSvgWidget( - name: 'editor/grid', - isSelected: onSelected, - style: style, - ), - keywords: ['referenced', 'grid', 'database'], - handler: (editorState, menuService, context) { - final container = Overlay.of(context); - showLinkToPageMenu( - container, - editorState, - menuService, - ViewLayoutPB.Grid, - ); - }, -); diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_node_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_node_widget.dart deleted file mode 100644 index 63e25235e0..0000000000 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_node_widget.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'package:appflowy/plugins/database_view/grid/presentation/grid_page.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/insert_page_command.dart'; -import 'package:appflowy_editor/appflowy_editor.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class GridBlockKeys { - const GridBlockKeys._(); - - static const String type = 'grid'; -} - -class GridBlockComponentBuilder extends BlockComponentBuilder { - GridBlockComponentBuilder({ - this.configuration = const BlockComponentConfiguration(), - }); - - @override - final BlockComponentConfiguration configuration; - - @override - BlockComponentWidget build(BlockComponentContext blockComponentContext) { - final node = blockComponentContext.node; - return GridBlockComponentWidget( - key: node.key, - node: node, - configuration: configuration, - showActions: showActions(node), - actionBuilder: (context, state) => actionBuilder( - blockComponentContext, - state, - ), - ); - } - - @override - bool validate(Node node) => - node.children.isEmpty && - node.attributes[DatabaseBlockKeys.parentID] is String && - node.attributes[DatabaseBlockKeys.viewID] is String; -} - -class GridBlockComponentWidget extends BlockComponentStatefulWidget { - const GridBlockComponentWidget({ - super.key, - required super.node, - super.showActions, - super.actionBuilder, - super.configuration = const BlockComponentConfiguration(), - }); - - @override - State createState() => - _GridBlockComponentWidgetState(); -} - -class _GridBlockComponentWidgetState extends State - with BlockComponentConfigurable { - @override - Node get node => widget.node; - - @override - BlockComponentConfiguration get configuration => widget.configuration; - - @override - Widget build(BuildContext context) { - final editorState = Provider.of(context, listen: false); - Widget child = BuiltInPageWidget( - node: widget.node, - editorState: editorState, - builder: (viewPB) { - return GridPage( - key: ValueKey(viewPB.id), - view: viewPB, - ); - }, - ); - - if (widget.actionBuilder != null) { - child = BlockComponentActionWrapper( - node: widget.node, - actionBuilder: widget.actionBuilder!, - child: child, - ); - } - - return child; - } -} diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_view_menu_item.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_view_menu_item.dart deleted file mode 100644 index e12499e013..0000000000 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/grid/grid_view_menu_item.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:appflowy/generated/locale_keys.g.dart'; -import 'package:appflowy/plugins/document/application/doc_bloc.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/insert_page_command.dart'; -import 'package:appflowy/plugins/document/presentation/editor_plugins/base/selectable_svg_widget.dart'; -import 'package:appflowy/workspace/application/view/view_service.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; -import 'package:appflowy_editor/appflowy_editor.dart'; -import 'package:easy_localization/easy_localization.dart'; - -SelectionMenuItem inlineGridMenuItem(DocumentBloc documentBloc) => - SelectionMenuItem( - name: LocaleKeys.document_slashMenu_grid_createANewGrid.tr(), - icon: (editorState, onSelected, style) => SelectableSvgWidget( - name: 'editor/grid', - isSelected: onSelected, - style: style, - ), - keywords: ['grid', 'database'], - handler: (editorState, menuService, context) async { - if (!documentBloc.view.hasParentViewId()) { - return; - } - - final parentViewId = documentBloc.view.parentViewId; - ViewBackendService.createView( - parentViewId: parentViewId, - openAfterCreate: false, - name: LocaleKeys.menuAppHeader_defaultNewPageName.tr(), - layoutType: ViewLayoutPB.Grid, - ).then( - (value) => value - .swap() - .map((r) => editorState.insertInlinePage(parentViewId, r)), - ); - }, - ); diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/plugins.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/plugins.dart index 68b27850be..79267e2c32 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/plugins.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/plugins.dart @@ -1,6 +1,3 @@ -export 'board/board_node_widget.dart'; -export 'board/board_menu_item.dart'; -export 'board/board_view_menu_item.dart'; export 'callout/callout_block_component.dart'; export 'code_block/code_block_component.dart'; export 'code_block/code_block_shortcut_event.dart'; @@ -9,9 +6,8 @@ export 'cover/cover_node_widget.dart'; export 'cover/cover_image_picker.dart'; export 'emoji_picker/emoji_menu_item.dart'; export 'extensions/flowy_tint_extension.dart'; -export 'grid/grid_menu_item.dart'; -export 'grid/grid_node_widget.dart'; -export 'grid/grid_view_menu_item.dart'; +export 'database/inline_database_menu_item.dart'; +export 'database/database_view_block_component.dart'; export 'math_equation/math_equation_block_component.dart'; export 'openai/widgets/auto_completion_node_widget.dart'; export 'openai/widgets/smart_edit_node_widget.dart'; diff --git a/frontend/appflowy_flutter/lib/plugins/trash/trash.dart b/frontend/appflowy_flutter/lib/plugins/trash/trash.dart index e4e6e724b9..768a660ed2 100644 --- a/frontend/appflowy_flutter/lib/plugins/trash/trash.dart +++ b/frontend/appflowy_flutter/lib/plugins/trash/trash.dart @@ -55,7 +55,7 @@ class TrashPluginDisplay extends PluginWidgetBuilder { Widget? get rightBarItem => null; @override - Widget buildWidget(PluginContext context) => const TrashPage( + Widget buildWidget({PluginContext? context}) => const TrashPage( key: ValueKey('TrashPage'), ); diff --git a/frontend/appflowy_flutter/lib/startup/plugin/plugin.dart b/frontend/appflowy_flutter/lib/startup/plugin/plugin.dart index 0d07a92926..2ea7ce5e0a 100644 --- a/frontend/appflowy_flutter/lib/startup/plugin/plugin.dart +++ b/frontend/appflowy_flutter/lib/startup/plugin/plugin.dart @@ -69,7 +69,7 @@ abstract class PluginWidgetBuilder with NavigationItem { EdgeInsets get contentPadding => const EdgeInsets.symmetric(horizontal: 40, vertical: 28); - Widget buildWidget(PluginContext context); + Widget buildWidget({PluginContext? context}); } class PluginContext { diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart index 4ad376e59b..7155c4c385 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart @@ -180,7 +180,7 @@ class HomeStackManager { if (pluginType == notifier.plugin.pluginType) { final builder = notifier.plugin.widgetBuilder; final pluginWidget = builder.buildWidget( - PluginContext(onDeleted: onDeleted), + context: PluginContext(onDeleted: onDeleted), ); return Padding( diff --git a/frontend/rust-lib/flowy-database2/src/services/database/database_editor.rs b/frontend/rust-lib/flowy-database2/src/services/database/database_editor.rs index 892d519579..5654271537 100644 --- a/frontend/rust-lib/flowy-database2/src/services/database/database_editor.rs +++ b/frontend/rust-lib/flowy-database2/src/services/database/database_editor.rs @@ -16,11 +16,11 @@ use lib_infra::future::{to_fut, Fut}; use crate::entities::{ CalendarEventPB, CellChangesetNotifyPB, CellPB, ChecklistCellDataPB, DatabaseFieldChangesetPB, - DatabaseLayoutSettingPB, DatabasePB, DatabaseViewSettingPB, DeleteFilterParams, - DeleteGroupParams, DeleteSortParams, FieldChangesetParams, FieldIdPB, FieldPB, FieldType, - GroupPB, IndexFieldPB, InsertedRowPB, LayoutSettingParams, NoDateCalendarEventPB, - RepeatedFilterPB, RepeatedGroupPB, RepeatedSortPB, RowPB, RowsChangePB, SelectOptionCellDataPB, - SelectOptionPB, UpdateFilterParams, UpdateSortParams, UpdatedRowPB, + DatabasePB, DatabaseViewSettingPB, DeleteFilterParams, DeleteGroupParams, DeleteSortParams, + FieldChangesetParams, FieldIdPB, FieldPB, FieldType, GroupPB, IndexFieldPB, InsertedRowPB, + LayoutSettingParams, NoDateCalendarEventPB, RepeatedFilterPB, RepeatedGroupPB, RepeatedSortPB, + RowPB, RowsChangePB, SelectOptionCellDataPB, SelectOptionPB, UpdateFilterParams, + UpdateSortParams, UpdatedRowPB, }; use crate::notification::{send_notification, DatabaseNotification}; use crate::services::cell::{