fix: open row as full page launch review issues (#5254)

* perf: improve getting database speed

* fix: navigate to incorrect origin database view from full-width row

* fix: import row detail page action placement
This commit is contained in:
Richard Shiue
2024-05-02 22:00:35 +08:00
committed by GitHub
parent 813d024810
commit 2eb88821ca
6 changed files with 131 additions and 113 deletions

View File

@ -1,26 +1,19 @@
import 'package:flutter/material.dart';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/database/application/cell/bloc/text_cell_bloc.dart';
import 'package:appflowy/plugins/database/application/cell/cell_controller.dart';
import 'package:appflowy/plugins/database/application/field/field_controller.dart';
import 'package:appflowy/plugins/database/application/database_controller.dart';
import 'package:appflowy/plugins/database/application/row/row_banner_bloc.dart';
import 'package:appflowy/plugins/database/application/row/row_controller.dart';
import 'package:appflowy/plugins/database/domain/database_view_service.dart';
import 'package:appflowy/plugins/database/widgets/cell/editable_cell_builder.dart';
import 'package:appflowy/plugins/database/widgets/cell/editable_cell_skeleton/text.dart';
import 'package:appflowy/plugins/database/widgets/row/cells/cell_container.dart';
import 'package:appflowy/plugins/database/widgets/row/row_action.dart';
import 'package:appflowy/plugins/database_document/database_document_plugin.dart';
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';
import 'package:appflowy/workspace/application/view/view_bloc.dart';
import 'package:appflowy/workspace/presentation/settings/widgets/emoji_picker/emoji_picker.dart';
import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
const _kBannerActionHeight = 40.0;
@ -28,13 +21,13 @@ const _kBannerActionHeight = 40.0;
class RowBanner extends StatefulWidget {
const RowBanner({
super.key,
required this.fieldController,
required this.databaseController,
required this.rowController,
required this.cellBuilder,
this.allowOpenAsFullPage = true,
});
final FieldController fieldController;
final DatabaseController databaseController;
final RowController rowController;
final EditableCellBuilder cellBuilder;
final bool allowOpenAsFullPage;
@ -58,77 +51,32 @@ class _RowBannerState extends State<RowBanner> {
return BlocProvider<RowBannerBloc>(
create: (context) => RowBannerBloc(
viewId: widget.rowController.viewId,
fieldController: widget.fieldController,
fieldController: widget.databaseController.fieldController,
rowMeta: widget.rowController.rowMeta,
)..add(const RowBannerEvent.initial()),
child: MouseRegion(
onEnter: (event) => _isHovering.value = true,
onExit: (event) => _isHovering.value = false,
child: Stack(
children: [
Padding(
padding: const EdgeInsets.fromLTRB(60, 34, 60, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 30,
child: _BannerAction(
isHovering: _isHovering,
popoverController: popoverController,
),
),
const VSpace(4),
_BannerTitle(
cellBuilder: widget.cellBuilder,
popoverController: popoverController,
rowController: widget.rowController,
),
],
),
),
Positioned(
top: 12,
right: 12,
child: RowActionButton(rowController: widget.rowController),
),
if (widget.allowOpenAsFullPage)
Positioned(
top: 12,
left: 12,
child: FlowyIconButton(
width: 20,
height: 20,
icon: const FlowySvg(FlowySvgs.full_view_s),
onPressed: () async {
Navigator.of(context).pop();
final viewBloc = context.read<ViewBloc>();
final databaseId = await DatabaseViewBackendService(
viewId: widget.cellBuilder.databaseController.viewId,
)
.getDatabaseId()
.then((value) => value.fold((s) => s, (f) => null));
final documentId = widget.rowController.rowMeta.documentId;
if (databaseId != null) {
getIt<TabsBloc>().add(
TabsEvent.openPlugin(
plugin: DatabaseDocumentPlugin(
data: DatabaseDocumentContext(
view: viewBloc.state.view,
databaseId: databaseId,
rowId: widget.rowController.rowId,
documentId: documentId,
),
pluginType: PluginType.databaseDocument,
),
setLatest: false,
),
);
}
},
child: Padding(
padding: const EdgeInsets.fromLTRB(60, 34, 60, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 30,
child: _BannerAction(
isHovering: _isHovering,
popoverController: popoverController,
),
),
],
const VSpace(4),
_BannerTitle(
cellBuilder: widget.cellBuilder,
popoverController: popoverController,
rowController: widget.rowController,
),
],
),
),
),
);

View File

@ -1,12 +1,16 @@
import 'package:flutter/material.dart';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/plugins/database/application/database_controller.dart';
import 'package:appflowy/plugins/database/application/row/row_controller.dart';
import 'package:appflowy/plugins/database/domain/database_view_service.dart';
import 'package:appflowy/plugins/database/grid/application/row/row_detail_bloc.dart';
import 'package:appflowy/plugins/database/widgets/row/row_document.dart';
import 'package:appflowy/plugins/database_document/database_document_plugin.dart';
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/user/application/reminder/reminder_bloc.dart';
import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../cell/editable_cell_builder.dart';
@ -55,37 +59,87 @@ class _RowDetailPageState extends State<RowDetailPage> {
),
BlocProvider.value(value: getIt<ReminderBloc>()),
],
child: ListView(
controller: scrollController,
child: Stack(
children: [
RowBanner(
fieldController: widget.databaseController.fieldController,
rowController: widget.rowController,
cellBuilder: cellBuilder,
allowOpenAsFullPage: widget.allowOpenAsFullPage,
ListView(
controller: scrollController,
children: [
RowBanner(
databaseController: widget.databaseController,
rowController: widget.rowController,
cellBuilder: cellBuilder,
allowOpenAsFullPage: widget.allowOpenAsFullPage,
),
const VSpace(16),
Padding(
padding: const EdgeInsets.only(left: 40, right: 60),
child: RowPropertyList(
cellBuilder: cellBuilder,
viewId: widget.databaseController.viewId,
fieldController: widget.databaseController.fieldController,
),
),
const VSpace(20),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 60),
child: Divider(height: 1.0),
),
const VSpace(20),
RowDocument(
viewId: widget.rowController.viewId,
rowId: widget.rowController.rowId,
),
],
),
const VSpace(16),
Padding(
padding: const EdgeInsets.only(left: 40, right: 60),
child: RowPropertyList(
cellBuilder: cellBuilder,
viewId: widget.databaseController.viewId,
fieldController: widget.databaseController.fieldController,
Positioned(
top: 12,
right: 12,
child: Row(
children: _actions(context),
),
),
const VSpace(20),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 60),
child: Divider(height: 1.0),
),
const VSpace(20),
RowDocument(
viewId: widget.rowController.viewId,
rowId: widget.rowController.rowId,
),
],
),
),
);
}
List<Widget> _actions(BuildContext context) {
return [
if (widget.allowOpenAsFullPage) ...[
FlowyIconButton(
width: 20,
height: 20,
icon: const FlowySvg(FlowySvgs.full_view_s),
onPressed: () async {
Navigator.of(context).pop();
final databaseId = await DatabaseViewBackendService(
viewId: widget.databaseController.viewId,
)
.getDatabaseId()
.then((value) => value.fold((s) => s, (f) => null));
final documentId = widget.rowController.rowMeta.documentId;
if (databaseId != null) {
getIt<TabsBloc>().add(
TabsEvent.openPlugin(
plugin: DatabaseDocumentPlugin(
data: DatabaseDocumentContext(
view: widget.databaseController.view,
databaseId: databaseId,
rowId: widget.rowController.rowId,
documentId: documentId,
),
pluginType: PluginType.databaseDocument,
),
setLatest: false,
),
);
}
},
),
const HSpace(4),
],
RowActionButton(rowController: widget.rowController),
];
}
}