| 
									
										
										
										
											2022-06-14 08:37:44 +08:00
										 |  |  | // ignore_for_file: unused_field
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  | import 'dart:collection'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-30 15:26:15 +08:00
										 |  |  | import 'package:app_flowy/generated/locale_keys.g.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  | import 'package:app_flowy/plugins/board/application/card/card_data_controller.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  | import 'package:app_flowy/plugins/grid/application/row/row_cache.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-04 15:33:07 +08:00
										 |  |  | import 'package:app_flowy/plugins/grid/application/field/field_controller.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  | import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart'; | 
					
						
							|  |  |  | import 'package:app_flowy/plugins/grid/presentation/widgets/cell/cell_builder.dart'; | 
					
						
							|  |  |  | import 'package:app_flowy/plugins/grid/presentation/widgets/row/row_detail.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-07 20:52:25 +08:00
										 |  |  | import 'package:app_flowy/workspace/application/appearance.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  | import 'package:appflowy_board/appflowy_board.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-30 15:26:15 +08:00
										 |  |  | import 'package:easy_localization/easy_localization.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-25 09:46:26 +08:00
										 |  |  | import 'package:flowy_infra/image.dart'; | 
					
						
							|  |  |  | import 'package:flowy_infra/theme.dart'; | 
					
						
							|  |  |  | import 'package:flowy_infra_ui/style_widget/text.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-25 10:16:41 +08:00
										 |  |  | import 'package:flowy_infra_ui/flowy_infra_ui_web.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +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-08-16 18:02:39 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart'; | 
					
						
							| 
									
										
										
										
											2022-06-11 15:51:53 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  | import 'package:flutter_bloc/flutter_bloc.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-07 20:52:25 +08:00
										 |  |  | import 'package:provider/provider.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  | import '../../grid/application/row/row_cache.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  | import '../application/board_bloc.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-12 16:06:30 +08:00
										 |  |  | import 'card/card.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  | import 'card/card_cell_builder.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-31 16:25:00 +08:00
										 |  |  | import 'toolbar/board_toolbar.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-10 12:58:07 +08:00
										 |  |  | class BoardPage extends StatelessWidget { | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  |   final ViewPB view; | 
					
						
							| 
									
										
										
										
											2022-08-10 17:59:28 +08:00
										 |  |  |   BoardPage({required this.view, Key? key}) : super(key: ValueKey(view.id)); | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return BlocProvider( | 
					
						
							| 
									
										
										
										
											2022-08-10 12:58:07 +08:00
										 |  |  |       create: (context) => | 
					
						
							|  |  |  |           BoardBloc(view: view)..add(const BoardEvent.initial()), | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  |       child: BlocBuilder<BoardBloc, BoardState>( | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  |         buildWhen: (p, c) => p.loadingState != c.loadingState, | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  |         builder: (context, state) { | 
					
						
							|  |  |  |           return state.loadingState.map( | 
					
						
							|  |  |  |             loading: (_) => | 
					
						
							|  |  |  |                 const Center(child: CircularProgressIndicator.adaptive()), | 
					
						
							|  |  |  |             finish: (result) { | 
					
						
							|  |  |  |               return result.successOrFail.fold( | 
					
						
							| 
									
										
										
										
											2022-08-26 11:51:42 +08:00
										 |  |  |                 (_) => const BoardContent(), | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  |                 (err) => FlowyErrorPage(err.toString()), | 
					
						
							|  |  |  |               ); | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 11:51:42 +08:00
										 |  |  | class BoardContent extends StatefulWidget { | 
					
						
							|  |  |  |   const BoardContent({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   State<BoardContent> createState() => _BoardContentState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _BoardContentState extends State<BoardContent> { | 
					
						
							| 
									
										
										
										
											2022-09-06 14:25:39 +08:00
										 |  |  |   late AppFlowyBoardScrollController scrollManager; | 
					
						
							| 
									
										
										
										
											2022-09-06 20:43:49 +08:00
										 |  |  |   final Map<String, ValueKey> cardKeysCache = {}; | 
					
						
							| 
									
										
										
										
											2022-08-27 09:52:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-05 16:29:16 +08:00
										 |  |  |   final config = AppFlowyBoardConfig( | 
					
						
							|  |  |  |     groupBackgroundColor: HexColor.fromHex('#F7F8FC'), | 
					
						
							| 
									
										
										
										
											2022-08-10 12:58:07 +08:00
										 |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 11:51:42 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void initState() { | 
					
						
							| 
									
										
										
										
											2022-09-06 14:25:39 +08:00
										 |  |  |     scrollManager = AppFlowyBoardScrollController(); | 
					
						
							| 
									
										
										
										
											2022-08-26 11:51:42 +08:00
										 |  |  |     super.initState(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-08-27 09:52:08 +08:00
										 |  |  |     return BlocListener<BoardBloc, BoardState>( | 
					
						
							| 
									
										
										
										
											2022-08-31 23:01:26 +08:00
										 |  |  |       listener: (context, state) => _handleEditState(state, context), | 
					
						
							| 
									
										
										
										
											2022-08-27 09:52:08 +08:00
										 |  |  |       child: BlocBuilder<BoardBloc, BoardState>( | 
					
						
							| 
									
										
										
										
											2022-09-04 15:33:07 +08:00
										 |  |  |         buildWhen: (previous, current) => previous.groupIds != current.groupIds, | 
					
						
							| 
									
										
										
										
											2022-08-27 09:52:08 +08:00
										 |  |  |         builder: (context, state) { | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  |           final column = Column( | 
					
						
							| 
									
										
										
										
											2022-09-07 12:29:26 +08:00
										 |  |  |             crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  |             children: [const _ToolbarBlocAdaptor(), _buildBoard(context)], | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-07 20:52:25 +08:00
										 |  |  |           return Padding( | 
					
						
							|  |  |  |             padding: const EdgeInsets.symmetric(horizontal: 20), | 
					
						
							|  |  |  |             child: column, | 
					
						
							| 
									
										
										
										
											2022-08-27 09:52:08 +08:00
										 |  |  |           ); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ), | 
					
						
							| 
									
										
										
										
											2022-08-10 12:58:07 +08:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-08-09 20:37:01 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-07 20:52:25 +08:00
										 |  |  |   Widget _buildBoard(BuildContext context) { | 
					
						
							|  |  |  |     return ChangeNotifierProvider.value( | 
					
						
							|  |  |  |       value: Provider.of<AppearanceSettingModel>(context, listen: true), | 
					
						
							|  |  |  |       child: Selector<AppearanceSettingModel, AppTheme>( | 
					
						
							|  |  |  |         selector: (ctx, notifier) => notifier.theme, | 
					
						
							|  |  |  |         builder: (ctx, theme, child) => Expanded( | 
					
						
							|  |  |  |           child: AppFlowyBoard( | 
					
						
							|  |  |  |             boardScrollController: scrollManager, | 
					
						
							|  |  |  |             scrollController: ScrollController(), | 
					
						
							|  |  |  |             controller: context.read<BoardBloc>().boardController, | 
					
						
							|  |  |  |             headerBuilder: _buildHeader, | 
					
						
							|  |  |  |             footerBuilder: _buildFooter, | 
					
						
							|  |  |  |             cardBuilder: (_, column, columnItem) => _buildCard( | 
					
						
							|  |  |  |               context, | 
					
						
							|  |  |  |               column, | 
					
						
							|  |  |  |               columnItem, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             groupConstraints: const BoxConstraints.tightFor(width: 300), | 
					
						
							|  |  |  |             config: AppFlowyBoardConfig( | 
					
						
							|  |  |  |               groupBackgroundColor: theme.bg1, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           ), | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 23:01:26 +08:00
										 |  |  |   void _handleEditState(BoardState state, BuildContext context) { | 
					
						
							|  |  |  |     state.editingRow.fold( | 
					
						
							|  |  |  |       () => null, | 
					
						
							|  |  |  |       (editingRow) { | 
					
						
							|  |  |  |         WidgetsBinding.instance.addPostFrameCallback((_) { | 
					
						
							|  |  |  |           if (editingRow.index != null) { | 
					
						
							|  |  |  |             context | 
					
						
							|  |  |  |                 .read<BoardBloc>() | 
					
						
							|  |  |  |                 .add(BoardEvent.endEditRow(editingRow.row.id)); | 
					
						
							|  |  |  |           } else { | 
					
						
							|  |  |  |             scrollManager.scrollToBottom(editingRow.columnId, () { | 
					
						
							|  |  |  |               context | 
					
						
							|  |  |  |                   .read<BoardBloc>() | 
					
						
							|  |  |  |                   .add(BoardEvent.endEditRow(editingRow.row.id)); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-26 11:51:42 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							|  |  |  |     super.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-24 16:57:53 +08:00
										 |  |  |   Widget _buildHeader( | 
					
						
							| 
									
										
										
										
											2022-08-31 14:56:03 +08:00
										 |  |  |     BuildContext context, | 
					
						
							| 
									
										
										
										
											2022-09-06 11:55:53 +08:00
										 |  |  |     AppFlowyGroupData columnData, | 
					
						
							| 
									
										
										
										
											2022-08-31 14:56:03 +08:00
										 |  |  |   ) { | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  |     final boardCustomData = columnData.customData as BoardCustomData; | 
					
						
							| 
									
										
										
										
											2022-09-05 16:29:16 +08:00
										 |  |  |     return AppFlowyGroupHeader( | 
					
						
							| 
									
										
										
										
											2022-08-25 09:46:26 +08:00
										 |  |  |       title: Flexible( | 
					
						
							|  |  |  |         fit: FlexFit.tight, | 
					
						
							|  |  |  |         child: FlowyText.medium( | 
					
						
							| 
									
										
										
										
											2022-09-05 16:29:16 +08:00
										 |  |  |           columnData.headerData.groupName, | 
					
						
							| 
									
										
										
										
											2022-08-25 09:46:26 +08:00
										 |  |  |           fontSize: 14, | 
					
						
							|  |  |  |           overflow: TextOverflow.clip, | 
					
						
							|  |  |  |           color: context.read<AppTheme>().textColor, | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  |       icon: _buildHeaderIcon(boardCustomData), | 
					
						
							| 
									
										
										
										
											2022-08-31 14:56:03 +08:00
										 |  |  |       addIcon: SizedBox( | 
					
						
							|  |  |  |         height: 20, | 
					
						
							|  |  |  |         width: 20, | 
					
						
							|  |  |  |         child: svgWidget( | 
					
						
							|  |  |  |           "home/add", | 
					
						
							|  |  |  |           color: context.read<AppTheme>().iconColor, | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       onAddButtonClick: () { | 
					
						
							|  |  |  |         context.read<BoardBloc>().add( | 
					
						
							|  |  |  |               BoardEvent.createHeaderRow(columnData.id), | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2022-08-10 12:58:07 +08:00
										 |  |  |       height: 50, | 
					
						
							| 
									
										
										
										
											2022-08-25 09:46:26 +08:00
										 |  |  |       margin: config.headerPadding, | 
					
						
							| 
									
										
										
										
											2022-08-10 12:58:07 +08:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-06 11:55:53 +08:00
										 |  |  |   Widget _buildFooter(BuildContext context, AppFlowyGroupData columnData) { | 
					
						
							| 
									
										
										
										
											2022-09-16 18:55:54 +08:00
										 |  |  |     // final boardCustomData = columnData.customData as BoardCustomData;
 | 
					
						
							|  |  |  |     // final group = boardCustomData.group;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return AppFlowyGroupFooter( | 
					
						
							|  |  |  |       icon: SizedBox( | 
					
						
							|  |  |  |         height: 20, | 
					
						
							|  |  |  |         width: 20, | 
					
						
							|  |  |  |         child: svgWidget( | 
					
						
							|  |  |  |           "home/add", | 
					
						
							|  |  |  |           color: context.read<AppTheme>().iconColor, | 
					
						
							| 
									
										
										
										
											2022-08-25 09:46:26 +08:00
										 |  |  |         ), | 
					
						
							| 
									
										
										
										
											2022-09-16 18:55:54 +08:00
										 |  |  |       ), | 
					
						
							|  |  |  |       title: FlowyText.medium( | 
					
						
							|  |  |  |         LocaleKeys.board_column_create_new_card.tr(), | 
					
						
							|  |  |  |         fontSize: 14, | 
					
						
							|  |  |  |         color: context.read<AppTheme>().textColor, | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       height: 50, | 
					
						
							|  |  |  |       margin: config.footerPadding, | 
					
						
							|  |  |  |       onAddButtonClick: () { | 
					
						
							|  |  |  |         context.read<BoardBloc>().add( | 
					
						
							|  |  |  |               BoardEvent.createBottomRow(columnData.id), | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-25 16:17:19 +08:00
										 |  |  |   Widget _buildCard( | 
					
						
							|  |  |  |     BuildContext context, | 
					
						
							| 
									
										
										
										
											2022-09-07 15:51:40 +08:00
										 |  |  |     AppFlowyGroupData group, | 
					
						
							| 
									
										
										
										
											2022-09-05 16:29:16 +08:00
										 |  |  |     AppFlowyGroupItem columnItem, | 
					
						
							| 
									
										
										
										
											2022-08-25 16:17:19 +08:00
										 |  |  |   ) { | 
					
						
							| 
									
										
										
										
											2022-08-26 16:07:51 +08:00
										 |  |  |     final boardColumnItem = columnItem as BoardColumnItem; | 
					
						
							|  |  |  |     final rowPB = boardColumnItem.row; | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  |     final rowCache = context.read<BoardBloc>().getRowCache(rowPB.blockId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /// Return placeholder widget if the rowCache is null.
 | 
					
						
							| 
									
										
										
										
											2022-08-25 16:17:19 +08:00
										 |  |  |     if (rowCache == null) return SizedBox(key: ObjectKey(columnItem)); | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |     final fieldController = context.read<BoardBloc>().fieldController; | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  |     final gridId = context.read<BoardBloc>().gridId; | 
					
						
							|  |  |  |     final cardController = CardDataController( | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |       fieldController: fieldController, | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  |       rowCache: rowCache, | 
					
						
							|  |  |  |       rowPB: rowPB, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     final cellBuilder = BoardCellBuilder(cardController); | 
					
						
							| 
									
										
										
										
											2022-08-31 14:56:03 +08:00
										 |  |  |     bool isEditing = false; | 
					
						
							|  |  |  |     context.read<BoardBloc>().state.editingRow.fold( | 
					
						
							|  |  |  |       () => null, | 
					
						
							|  |  |  |       (editingRow) { | 
					
						
							|  |  |  |         isEditing = editingRow.row.id == columnItem.row.id; | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-07 15:51:40 +08:00
										 |  |  |     final groupItemId = columnItem.id + group.id; | 
					
						
							|  |  |  |     ValueKey? key = cardKeysCache[groupItemId]; | 
					
						
							| 
									
										
										
										
											2022-09-06 20:43:49 +08:00
										 |  |  |     if (key == null) { | 
					
						
							| 
									
										
										
										
											2022-09-07 15:51:40 +08:00
										 |  |  |       final newKey = ValueKey(groupItemId); | 
					
						
							|  |  |  |       cardKeysCache[groupItemId] = newKey; | 
					
						
							| 
									
										
										
										
											2022-09-06 20:43:49 +08:00
										 |  |  |       key = newKey; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-06 11:55:53 +08:00
										 |  |  |     return AppFlowyGroupCard( | 
					
						
							| 
									
										
										
										
											2022-09-06 20:43:49 +08:00
										 |  |  |       key: key, | 
					
						
							| 
									
										
										
										
											2022-08-25 09:46:26 +08:00
										 |  |  |       margin: config.cardPadding, | 
					
						
							|  |  |  |       decoration: _makeBoxDecoration(context), | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  |       child: BoardCard( | 
					
						
							| 
									
										
										
										
											2022-08-13 16:23:44 +08:00
										 |  |  |         gridId: gridId, | 
					
						
							| 
									
										
										
										
											2022-09-07 15:51:40 +08:00
										 |  |  |         groupId: group.id, | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  |         fieldId: boardColumnItem.fieldContext.id, | 
					
						
							| 
									
										
										
										
											2022-08-13 16:23:44 +08:00
										 |  |  |         isEditing: isEditing, | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  |         cellBuilder: cellBuilder, | 
					
						
							|  |  |  |         dataController: cardController, | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  |         openCard: (context) => _openCard( | 
					
						
							|  |  |  |           gridId, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |           fieldController, | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  |           rowPB, | 
					
						
							|  |  |  |           rowCache, | 
					
						
							|  |  |  |           context, | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2022-08-12 20:10:56 +08:00
										 |  |  |       ), | 
					
						
							| 
									
										
										
										
											2022-08-10 17:59:28 +08:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-25 09:46:26 +08:00
										 |  |  |   BoxDecoration _makeBoxDecoration(BuildContext context) { | 
					
						
							|  |  |  |     final theme = context.read<AppTheme>(); | 
					
						
							|  |  |  |     final borderSide = BorderSide(color: theme.shader6, width: 1.0); | 
					
						
							|  |  |  |     return BoxDecoration( | 
					
						
							|  |  |  |       color: theme.surface, | 
					
						
							|  |  |  |       border: Border.fromBorderSide(borderSide), | 
					
						
							|  |  |  |       borderRadius: const BorderRadius.all(Radius.circular(6)), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-14 16:35:29 +08:00
										 |  |  |   void _openCard( | 
					
						
							|  |  |  |     String gridId, | 
					
						
							|  |  |  |     GridFieldController fieldController, | 
					
						
							|  |  |  |     RowPB rowPB, | 
					
						
							|  |  |  |     GridRowCache rowCache, | 
					
						
							|  |  |  |     BuildContext context, | 
					
						
							|  |  |  |   ) { | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  |     final rowInfo = RowInfo( | 
					
						
							|  |  |  |       gridId: gridId, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |       fields: UnmodifiableListView(fieldController.fieldContexts), | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  |       rowPB: rowPB, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     final dataController = GridRowDataController( | 
					
						
							|  |  |  |       rowInfo: rowInfo, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |       fieldController: fieldController, | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  |       rowCache: rowCache, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-25 10:16:41 +08:00
										 |  |  |     FlowyOverlay.show( | 
					
						
							| 
									
										
										
										
											2022-09-01 14:37:16 +08:00
										 |  |  |       context: context, | 
					
						
							|  |  |  |       builder: (BuildContext context) { | 
					
						
							|  |  |  |         return RowDetailPage( | 
					
						
							|  |  |  |           cellBuilder: GridCellBuilder(delegate: dataController), | 
					
						
							|  |  |  |           dataController: dataController, | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-08-16 18:02:39 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 16:25:00 +08:00
										 |  |  | class _ToolbarBlocAdaptor extends StatelessWidget { | 
					
						
							|  |  |  |   const _ToolbarBlocAdaptor({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     return BlocBuilder<BoardBloc, BoardState>( | 
					
						
							|  |  |  |       builder: (context, state) { | 
					
						
							|  |  |  |         final bloc = context.read<BoardBloc>(); | 
					
						
							|  |  |  |         final toolbarContext = BoardToolbarContext( | 
					
						
							|  |  |  |           viewId: bloc.gridId, | 
					
						
							| 
									
										
										
										
											2022-09-03 17:16:48 +08:00
										 |  |  |           fieldController: bloc.fieldController, | 
					
						
							| 
									
										
										
										
											2022-08-31 16:25:00 +08:00
										 |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-07 20:52:25 +08:00
										 |  |  |         return ChangeNotifierProvider.value( | 
					
						
							|  |  |  |           value: Provider.of<AppearanceSettingModel>(context, listen: true), | 
					
						
							|  |  |  |           child: Selector<AppearanceSettingModel, AppTheme>( | 
					
						
							|  |  |  |             selector: (ctx, notifier) => notifier.theme, | 
					
						
							|  |  |  |             builder: (ctx, theme, child) { | 
					
						
							|  |  |  |               return BoardToolbar(toolbarContext: toolbarContext); | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ), | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-08-31 16:25:00 +08:00
										 |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 18:04:23 +08:00
										 |  |  | extension HexColor on Color { | 
					
						
							|  |  |  |   static Color fromHex(String hexString) { | 
					
						
							|  |  |  |     final buffer = StringBuffer(); | 
					
						
							|  |  |  |     if (hexString.length == 6 || hexString.length == 7) buffer.write('ff'); | 
					
						
							|  |  |  |     buffer.write(hexString.replaceFirst('#', '')); | 
					
						
							|  |  |  |     return Color(int.parse(buffer.toString(), radix: 16)); | 
					
						
							| 
									
										
										
										
											2022-06-11 15:51:53 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-09-05 09:24:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Widget? _buildHeaderIcon(BoardCustomData customData) { | 
					
						
							|  |  |  |   Widget? widget; | 
					
						
							|  |  |  |   switch (customData.fieldType) { | 
					
						
							|  |  |  |     case FieldType.Checkbox: | 
					
						
							|  |  |  |       final group = customData.asCheckboxGroup()!; | 
					
						
							|  |  |  |       if (group.isCheck) { | 
					
						
							|  |  |  |         widget = svgWidget('editor/editor_check'); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         widget = svgWidget('editor/editor_uncheck'); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case FieldType.DateTime: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case FieldType.MultiSelect: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case FieldType.Number: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case FieldType.RichText: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case FieldType.SingleSelect: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case FieldType.URL: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (widget != null) { | 
					
						
							|  |  |  |     widget = SizedBox( | 
					
						
							|  |  |  |       width: 20, | 
					
						
							|  |  |  |       height: 20, | 
					
						
							|  |  |  |       child: widget, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return widget; | 
					
						
							|  |  |  | } |