| 
									
										
										
										
											2022-09-08 11:17:37 +08:00
										 |  |  | import 'package:app_flowy/generated/locale_keys.g.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-04 15:33:07 +08:00
										 |  |  | import 'package:app_flowy/plugins/grid/application/field/field_controller.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  | import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | import 'package:app_flowy/startup/startup.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  | import 'package:app_flowy/plugins/grid/application/grid_bloc.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-08 11:17:37 +08:00
										 |  |  | import 'package:easy_localization/easy_localization.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-29 22:14:53 +05:30
										 |  |  | import 'package:flowy_infra/theme.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-25 10:16:41 +08:00
										 |  |  | import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart'; | 
					
						
							|  |  |  | import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart'; | 
					
						
							|  |  |  | import 'package:flowy_infra_ui/style_widget/scrolling/styled_scrollview.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-29 22:14:53 +05:30
										 |  |  | import 'package:flowy_infra_ui/style_widget/text.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | import 'package:flowy_infra_ui/widget/error_page.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-04 15:00:54 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | import 'package:flutter_bloc/flutter_bloc.dart'; | 
					
						
							|  |  |  | import 'package:flutter/material.dart'; | 
					
						
							| 
									
										
										
										
											2022-04-15 15:41:55 +08:00
										 |  |  | import 'package:linked_scroll_controller/linked_scroll_controller.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 19:06:15 +08:00
										 |  |  | import '../application/row/row_cache.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-04 08:22:49 +08:00
										 |  |  | import 'controller/grid_scroll.dart'; | 
					
						
							|  |  |  | import 'layout/layout.dart'; | 
					
						
							|  |  |  | import 'layout/sizes.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  | import 'widgets/cell/cell_builder.dart'; | 
					
						
							| 
									
										
										
										
											2022-04-03 22:22:54 +08:00
										 |  |  | import 'widgets/row/grid_row.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-04 08:22:49 +08:00
										 |  |  | import 'widgets/footer/grid_footer.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-27 11:14:21 +08:00
										 |  |  | import 'widgets/header/grid_header.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  | import 'widgets/row/row_detail.dart'; | 
					
						
							| 
									
										
										
										
											2022-06-04 11:04:43 +08:00
										 |  |  | import 'widgets/shortcuts.dart'; | 
					
						
							| 
									
										
										
										
											2022-04-03 10:53:24 +08:00
										 |  |  | import 'widgets/toolbar/grid_toolbar.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class GridPage extends StatefulWidget { | 
					
						
							| 
									
										
										
										
											2022-07-19 14:11:29 +08:00
										 |  |  |   final ViewPB view; | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   GridPage({Key? key, required this.view}) : super(key: ValueKey(view.id)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   State<GridPage> createState() => _GridPageState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _GridPageState extends State<GridPage> { | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return MultiBlocProvider( | 
					
						
							|  |  |  |       providers: [ | 
					
						
							| 
									
										
										
										
											2022-03-06 11:28:24 +08:00
										 |  |  |         BlocProvider<GridBloc>( | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |           create: (context) => getIt<GridBloc>(param1: widget.view) | 
					
						
							|  |  |  |             ..add(const GridEvent.initial()), | 
					
						
							| 
									
										
										
										
											2022-03-06 11:28:24 +08:00
										 |  |  |         ), | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  |       ], | 
					
						
							|  |  |  |       child: BlocBuilder<GridBloc, GridState>( | 
					
						
							|  |  |  |         builder: (context, state) { | 
					
						
							|  |  |  |           return state.loadingState.map( | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |             loading: (_) => | 
					
						
							|  |  |  |                 const Center(child: CircularProgressIndicator.adaptive()), | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  |             finish: (result) => result.successOrFail.fold( | 
					
						
							| 
									
										
										
										
											2022-06-04 11:04:43 +08:00
										 |  |  |               (_) => const GridShortcuts(child: FlowyGrid()), | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  |               (err) => FlowyErrorPage(err.toString()), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							|  |  |  |     super.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void deactivate() { | 
					
						
							|  |  |  |     super.deactivate(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void didUpdateWidget(covariant GridPage oldWidget) { | 
					
						
							|  |  |  |     super.didUpdateWidget(oldWidget); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-14 21:16:29 +08:00
										 |  |  | class FlowyGrid extends StatefulWidget { | 
					
						
							|  |  |  |   const FlowyGrid({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   State<FlowyGrid> createState() => _FlowyGridState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _FlowyGridState extends State<FlowyGrid> { | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |   final _scrollController = GridScrollController( | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  |       scrollGroupController: LinkedScrollControllerGroup()); | 
					
						
							| 
									
										
										
										
											2022-04-15 19:56:44 +08:00
										 |  |  |   late ScrollController headerScrollController; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void initState() { | 
					
						
							|  |  |  |     headerScrollController = _scrollController.linkHorizontalController(); | 
					
						
							|  |  |  |     super.initState(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-04-15 15:41:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							|  |  |  |     _scrollController.dispose(); | 
					
						
							|  |  |  |     super.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return BlocBuilder<GridBloc, GridState>( | 
					
						
							| 
									
										
										
										
											2022-06-03 10:51:24 +08:00
										 |  |  |       buildWhen: (previous, current) => previous.fields != current.fields, | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  |       builder: (context, state) { | 
					
						
							| 
									
										
										
										
											2022-06-03 10:51:24 +08:00
										 |  |  |         final contentWidth = GridLayout.headerWidth(state.fields.value); | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |         final child = _wrapScrollView( | 
					
						
							| 
									
										
										
										
											2022-04-15 15:41:55 +08:00
										 |  |  |           contentWidth, | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |           [ | 
					
						
							| 
									
										
										
										
											2022-04-14 21:57:51 +08:00
										 |  |  |             const _GridRows(), | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |             const _GridFooter(), | 
					
						
							|  |  |  |           ], | 
					
						
							| 
									
										
										
										
											2022-03-26 20:27:32 +08:00
										 |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-15 19:56:44 +08:00
										 |  |  |         return Column( | 
					
						
							|  |  |  |           crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							|  |  |  |           children: [ | 
					
						
							|  |  |  |             const _GridToolbarAdaptor(), | 
					
						
							| 
									
										
										
										
											2022-04-16 09:25:12 +08:00
										 |  |  |             _gridHeader(context, state.gridId), | 
					
						
							| 
									
										
										
										
											2022-04-15 19:56:44 +08:00
										 |  |  |             Flexible(child: child), | 
					
						
							| 
									
										
										
										
											2022-09-08 11:17:37 +08:00
										 |  |  |             const RowCountBadge(), | 
					
						
							| 
									
										
										
										
											2022-04-15 19:56:44 +08:00
										 |  |  |           ], | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |   Widget _wrapScrollView( | 
					
						
							| 
									
										
										
										
											2022-04-15 15:41:55 +08:00
										 |  |  |     double contentWidth, | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |     List<Widget> slivers, | 
					
						
							|  |  |  |   ) { | 
					
						
							|  |  |  |     final verticalScrollView = ScrollConfiguration( | 
					
						
							|  |  |  |       behavior: const ScrollBehavior().copyWith(scrollbars: false), | 
					
						
							|  |  |  |       child: CustomScrollView( | 
					
						
							|  |  |  |         physics: StyledScrollPhysics(), | 
					
						
							|  |  |  |         controller: _scrollController.verticalController, | 
					
						
							|  |  |  |         slivers: slivers, | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     final sizedVerticalScrollView = SizedBox( | 
					
						
							| 
									
										
										
										
											2022-04-15 15:41:55 +08:00
										 |  |  |       width: contentWidth, | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |       child: verticalScrollView, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     final horizontalScrollView = StyledSingleChildScrollView( | 
					
						
							|  |  |  |       controller: _scrollController.horizontalController, | 
					
						
							|  |  |  |       axis: Axis.horizontal, | 
					
						
							|  |  |  |       child: sizedVerticalScrollView, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  |     return ScrollbarListStack( | 
					
						
							|  |  |  |       axis: Axis.vertical, | 
					
						
							|  |  |  |       controller: _scrollController.verticalController, | 
					
						
							|  |  |  |       barSize: GridSize.scrollBarSize, | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |       child: horizontalScrollView, | 
					
						
							| 
									
										
										
										
											2022-03-26 20:27:32 +08:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-04-15 15:41:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-16 09:25:12 +08:00
										 |  |  |   Widget _gridHeader(BuildContext context, String gridId) { | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |     final fieldController = | 
					
						
							|  |  |  |         context.read<GridBloc>().dataController.fieldController; | 
					
						
							| 
									
										
										
										
											2022-04-16 09:25:12 +08:00
										 |  |  |     return GridHeaderSliverAdaptor( | 
					
						
							|  |  |  |       gridId: gridId, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |       fieldController: fieldController, | 
					
						
							| 
									
										
										
										
											2022-04-16 09:25:12 +08:00
										 |  |  |       anchorScrollController: headerScrollController, | 
					
						
							| 
									
										
										
										
											2022-04-15 15:41:55 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-04-12 21:31:38 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-12 21:31:38 +08:00
										 |  |  | class _GridToolbarAdaptor extends StatelessWidget { | 
					
						
							|  |  |  |   const _GridToolbarAdaptor({Key? key}) : super(key: key); | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-12 21:31:38 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return BlocSelector<GridBloc, GridState, GridToolbarContext>( | 
					
						
							|  |  |  |       selector: (state) { | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |         final fieldController = | 
					
						
							|  |  |  |             context.read<GridBloc>().dataController.fieldController; | 
					
						
							| 
									
										
										
										
											2022-04-12 21:31:38 +08:00
										 |  |  |         return GridToolbarContext( | 
					
						
							|  |  |  |           gridId: state.gridId, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |           fieldController: fieldController, | 
					
						
							| 
									
										
										
										
											2022-04-03 17:05:28 +08:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-04-12 21:31:38 +08:00
										 |  |  |       }, | 
					
						
							|  |  |  |       builder: (context, toolbarContext) { | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |         return GridToolbar(toolbarContext: toolbarContext); | 
					
						
							| 
									
										
										
										
											2022-04-03 17:05:28 +08:00
										 |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-04-12 21:31:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-14 21:16:29 +08:00
										 |  |  | class _GridRows extends StatefulWidget { | 
					
						
							|  |  |  |   const _GridRows({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   State<_GridRows> createState() => _GridRowsState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _GridRowsState extends State<_GridRows> { | 
					
						
							| 
									
										
										
										
											2022-04-12 21:31:38 +08:00
										 |  |  |   final _key = GlobalKey<SliverAnimatedListState>(); | 
					
						
							| 
									
										
										
										
											2022-04-03 17:05:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-12 21:31:38 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |     return BlocConsumer<GridBloc, GridState>( | 
					
						
							| 
									
										
										
										
											2022-07-03 15:53:28 +08:00
										 |  |  |       listenWhen: (previous, current) => previous.reason != current.reason, | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |       listener: (context, state) { | 
					
						
							| 
									
										
										
										
											2022-07-03 15:53:28 +08:00
										 |  |  |         state.reason.mapOrNull( | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |           insert: (value) { | 
					
						
							| 
									
										
										
										
											2022-04-16 16:58:26 +08:00
										 |  |  |             for (final item in value.items) { | 
					
						
							| 
									
										
										
										
											2022-04-17 09:46:38 +08:00
										 |  |  |               _key.currentState?.insertItem(item.index); | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           delete: (value) { | 
					
						
							| 
									
										
										
										
											2022-04-16 16:58:26 +08:00
										 |  |  |             for (final item in value.items) { | 
					
						
							| 
									
										
										
										
											2022-04-14 13:29:42 +08:00
										 |  |  |               _key.currentState?.removeItem( | 
					
						
							| 
									
										
										
										
											2022-04-17 09:46:38 +08:00
										 |  |  |                 item.index, | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |                 (context, animation) => | 
					
						
							|  |  |  |                     _renderRow(context, item.row, animation), | 
					
						
							| 
									
										
										
										
											2022-04-14 13:29:42 +08:00
										 |  |  |               ); | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-03-26 20:27:32 +08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |       buildWhen: (previous, current) => false, | 
					
						
							| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  |       builder: (context, state) { | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |         return SliverAnimatedList( | 
					
						
							|  |  |  |           key: _key, | 
					
						
							| 
									
										
										
										
											2022-07-17 11:29:02 +08:00
										 |  |  |           initialItemCount: context.read<GridBloc>().state.rowInfos.length, | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |           itemBuilder: | 
					
						
							|  |  |  |               (BuildContext context, int index, Animation<double> animation) { | 
					
						
							| 
									
										
										
										
											2022-08-11 13:25:55 +08:00
										 |  |  |             final RowInfo rowInfo = | 
					
						
							| 
									
										
										
										
											2022-08-09 10:35:27 +08:00
										 |  |  |                 context.read<GridBloc>().state.rowInfos[index]; | 
					
						
							| 
									
										
										
										
											2022-07-17 11:29:02 +08:00
										 |  |  |             return _renderRow(context, rowInfo, animation); | 
					
						
							| 
									
										
										
										
											2022-04-09 22:07:48 +08:00
										 |  |  |           }, | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-04-09 22:07:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-19 11:41:37 +08:00
										 |  |  |   Widget _renderRow( | 
					
						
							|  |  |  |     BuildContext context, | 
					
						
							| 
									
										
										
										
											2022-08-11 13:25:55 +08:00
										 |  |  |     RowInfo rowInfo, | 
					
						
							| 
									
										
										
										
											2022-04-19 11:41:37 +08:00
										 |  |  |     Animation<double> animation, | 
					
						
							|  |  |  |   ) { | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  |     final rowCache = context.read<GridBloc>().getRowCache( | 
					
						
							|  |  |  |           rowInfo.rowPB.blockId, | 
					
						
							|  |  |  |           rowInfo.rowPB.id, | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  |     /// Return placeholder widget if the rowCache is null.
 | 
					
						
							|  |  |  |     if (rowCache == null) return const SizedBox(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |     final fieldController = | 
					
						
							|  |  |  |         context.read<GridBloc>().dataController.fieldController; | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  |     final dataController = GridRowDataController( | 
					
						
							|  |  |  |       rowInfo: rowInfo, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |       fieldController: fieldController, | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  |       rowCache: rowCache, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return SizeTransition( | 
					
						
							|  |  |  |       sizeFactor: animation, | 
					
						
							|  |  |  |       child: GridRowWidget( | 
					
						
							|  |  |  |         rowInfo: rowInfo, | 
					
						
							|  |  |  |         dataController: dataController, | 
					
						
							|  |  |  |         cellBuilder: GridCellBuilder(delegate: dataController), | 
					
						
							|  |  |  |         openDetailPage: (context, cellBuilder) { | 
					
						
							|  |  |  |           _openRowDetailPage( | 
					
						
							|  |  |  |             context, | 
					
						
							|  |  |  |             rowInfo, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |             fieldController, | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  |             rowCache, | 
					
						
							|  |  |  |             cellBuilder, | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2022-08-13 14:59:50 +08:00
										 |  |  |         key: ValueKey(rowInfo.rowPB.id), | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void _openRowDetailPage( | 
					
						
							|  |  |  |     BuildContext context, | 
					
						
							| 
									
										
										
										
											2022-08-11 13:25:55 +08:00
										 |  |  |     RowInfo rowInfo, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |     GridFieldController fieldController, | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  |     GridRowCache rowCache, | 
					
						
							|  |  |  |     GridCellBuilder cellBuilder, | 
					
						
							|  |  |  |   ) { | 
					
						
							|  |  |  |     final dataController = GridRowDataController( | 
					
						
							|  |  |  |       rowInfo: rowInfo, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |       fieldController: fieldController, | 
					
						
							| 
									
										
										
										
											2022-08-09 20:19:43 +08:00
										 |  |  |       rowCache: rowCache, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-25 10:16:41 +08:00
										 |  |  |     FlowyOverlay.show( | 
					
						
							|  |  |  |         context: context, | 
					
						
							|  |  |  |         builder: (BuildContext context) { | 
					
						
							|  |  |  |           return RowDetailPage( | 
					
						
							|  |  |  |             cellBuilder: cellBuilder, | 
					
						
							|  |  |  |             dataController: dataController, | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2022-04-11 20:52:15 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-03-03 10:51:52 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class _GridFooter extends StatelessWidget { | 
					
						
							|  |  |  |   const _GridFooter({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return SliverPadding( | 
					
						
							|  |  |  |       padding: const EdgeInsets.only(bottom: 200), | 
					
						
							|  |  |  |       sliver: SliverToBoxAdapter( | 
					
						
							|  |  |  |         child: SizedBox( | 
					
						
							|  |  |  |           height: GridSize.footerHeight, | 
					
						
							|  |  |  |           child: Padding( | 
					
						
							| 
									
										
										
										
											2022-09-08 11:17:37 +08:00
										 |  |  |             padding: GridSize.footerContentInsets, | 
					
						
							|  |  |  |             child: const Expanded( | 
					
						
							|  |  |  |               child: SizedBox(height: 40, child: GridAddRowButton()), | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  |             ), | 
					
						
							|  |  |  |           ), | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-09-08 11:17:37 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-07-29 22:14:53 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 11:17:37 +08:00
										 |  |  | class RowCountBadge extends StatelessWidget { | 
					
						
							|  |  |  |   const RowCountBadge({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     final theme = context.watch<AppTheme>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return BlocSelector<GridBloc, GridState, int>( | 
					
						
							|  |  |  |       selector: (state) => state.rowCount, | 
					
						
							|  |  |  |       builder: (context, rowCount) { | 
					
						
							|  |  |  |         return Padding( | 
					
						
							|  |  |  |           padding: GridSize.footerContentInsets, | 
					
						
							|  |  |  |           child: Row( | 
					
						
							|  |  |  |             mainAxisAlignment: MainAxisAlignment.start, | 
					
						
							|  |  |  |             children: [ | 
					
						
							|  |  |  |               FlowyText.regular( | 
					
						
							|  |  |  |                 '${LocaleKeys.grid_row_count.tr()} : ', | 
					
						
							|  |  |  |                 fontSize: 13, | 
					
						
							|  |  |  |                 color: theme.shader3, | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |               FlowyText.regular(rowCount.toString(), fontSize: 13), | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |           ), | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2022-07-29 22:14:53 +05:30
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-04-13 10:47:07 +08:00
										 |  |  | } |