diff --git a/frontend/app_flowy/lib/plugins/board/application/board_bloc.dart b/frontend/app_flowy/lib/plugins/board/application/board_bloc.dart
index 11f4cf6910..903df92f78 100644
--- a/frontend/app_flowy/lib/plugins/board/application/board_bloc.dart
+++ b/frontend/app_flowy/lib/plugins/board/application/board_bloc.dart
@@ -22,7 +22,7 @@ part 'board_bloc.freezed.dart';
class BoardBloc extends Bloc {
final BoardDataController _gridDataController;
- late final AFBoardDataController boardController;
+ late final AppFlowyBoardController boardController;
final MoveRowFFIService _rowService;
LinkedHashMap groupControllers = LinkedHashMap();
@@ -34,8 +34,8 @@ class BoardBloc extends Bloc {
: _rowService = MoveRowFFIService(gridId: view.id),
_gridDataController = BoardDataController(view: view),
super(BoardState.initial(view.id)) {
- boardController = AFBoardDataController(
- onMoveColumn: (
+ boardController = AppFlowyBoardController(
+ onMoveGroup: (
fromColumnId,
fromIndex,
toColumnId,
@@ -43,7 +43,7 @@ class BoardBloc extends Bloc {
) {
_moveGroup(fromColumnId, toColumnId);
},
- onMoveColumnItem: (
+ onMoveGroupItem: (
columnId,
fromIndex,
toIndex,
@@ -52,15 +52,15 @@ class BoardBloc extends Bloc {
final toRow = groupControllers[columnId]?.rowAtIndex(toIndex);
_moveRow(fromRow, columnId, toRow);
},
- onMoveColumnItemToColumn: (
- fromColumnId,
+ onMoveGroupItemToGroup: (
+ fromGroupId,
fromIndex,
- toColumnId,
+ toGroupId,
toIndex,
) {
- final fromRow = groupControllers[fromColumnId]?.rowAtIndex(fromIndex);
- final toRow = groupControllers[toColumnId]?.rowAtIndex(toIndex);
- _moveRow(fromRow, toColumnId, toRow);
+ final fromRow = groupControllers[fromGroupId]?.rowAtIndex(fromIndex);
+ final toRow = groupControllers[toGroupId]?.rowAtIndex(toIndex);
+ _moveRow(fromRow, toGroupId, toRow);
},
);
@@ -165,10 +165,10 @@ class BoardBloc extends Bloc {
boardController.clear();
//
- List columns = groups
+ List columns = groups
.where((group) => fieldController.getField(group.fieldId) != null)
.map((group) {
- return AFBoardColumnData(
+ return AppFlowyGroupData(
id: group.groupId,
name: group.desc,
items: _buildRows(group),
@@ -178,7 +178,7 @@ class BoardBloc extends Bloc {
),
);
}).toList();
- boardController.addColumns(columns);
+ boardController.addGroups(columns);
for (final group in groups) {
final delegate = GroupControllerDelegateImpl(
@@ -227,8 +227,8 @@ class BoardBloc extends Bloc {
if (isClosed) return;
for (final group in updatedGroups) {
final columnController =
- boardController.getColumnController(group.groupId);
- columnController?.updateColumnName(group.desc);
+ boardController.getGroupController(group.groupId);
+ columnController?.updateGroupName(group.desc);
}
},
onError: (err) {
@@ -243,13 +243,13 @@ class BoardBloc extends Bloc {
);
}
- List _buildRows(GroupPB group) {
+ List _buildRows(GroupPB group) {
final items = group.rows.map((row) {
final fieldContext = fieldController.getField(group.fieldId);
return BoardColumnItem(row: row, fieldContext: fieldContext!);
}).toList();
- return [...items];
+ return [...items];
}
Future _loadGrid(Emitter emit) async {
@@ -335,7 +335,7 @@ class GridFieldEquatable extends Equatable {
UnmodifiableListView get value => UnmodifiableListView(_fields);
}
-class BoardColumnItem extends AFColumnItem {
+class BoardColumnItem extends AppFlowyGroupItem {
final RowPB row;
final GridFieldContext fieldContext;
@@ -350,7 +350,7 @@ class BoardColumnItem extends AFColumnItem {
class GroupControllerDelegateImpl extends GroupControllerDelegate {
final GridFieldController fieldController;
- final AFBoardDataController controller;
+ final AppFlowyBoardController controller;
final void Function(String, RowPB, int?) onNewColumnItem;
GroupControllerDelegateImpl({
@@ -369,16 +369,16 @@ class GroupControllerDelegateImpl extends GroupControllerDelegate {
if (index != null) {
final item = BoardColumnItem(row: row, fieldContext: fieldContext);
- controller.insertColumnItem(group.groupId, index, item);
+ controller.insertGroupItem(group.groupId, index, item);
} else {
final item = BoardColumnItem(row: row, fieldContext: fieldContext);
- controller.addColumnItem(group.groupId, item);
+ controller.addGroupItem(group.groupId, item);
}
}
@override
void removeRow(GroupPB group, String rowId) {
- controller.removeColumnItem(group.groupId, rowId);
+ controller.removeGroupItem(group.groupId, rowId);
}
@override
@@ -388,7 +388,7 @@ class GroupControllerDelegateImpl extends GroupControllerDelegate {
Log.warn("FieldContext should not be null");
return;
}
- controller.updateColumnItem(
+ controller.updateGroupItem(
group.groupId,
BoardColumnItem(row: row, fieldContext: fieldContext),
);
@@ -404,9 +404,9 @@ class GroupControllerDelegateImpl extends GroupControllerDelegate {
final item = BoardColumnItem(row: row, fieldContext: fieldContext);
if (index != null) {
- controller.insertColumnItem(group.groupId, index, item);
+ controller.insertGroupItem(group.groupId, index, item);
} else {
- controller.addColumnItem(group.groupId, item);
+ controller.addGroupItem(group.groupId, item);
}
onNewColumnItem(group.groupId, row, index);
}
diff --git a/frontend/app_flowy/lib/plugins/board/presentation/board_page.dart b/frontend/app_flowy/lib/plugins/board/presentation/board_page.dart
index 233917ec8c..d40a2f5ea9 100644
--- a/frontend/app_flowy/lib/plugins/board/presentation/board_page.dart
+++ b/frontend/app_flowy/lib/plugins/board/presentation/board_page.dart
@@ -62,17 +62,15 @@ class BoardContent extends StatefulWidget {
}
class _BoardContentState extends State {
- late ScrollController scrollController;
- late AFBoardScrollManager scrollManager;
+ late AppFlowyBoardScrollController scrollManager;
- final config = AFBoardConfig(
- columnBackgroundColor: HexColor.fromHex('#F7F8FC'),
+ final config = AppFlowyBoardConfig(
+ groupBackgroundColor: HexColor.fromHex('#F7F8FC'),
);
@override
void initState() {
- scrollController = ScrollController();
- scrollManager = AFBoardScrollManager();
+ scrollManager = AppFlowyBoardScrollController();
super.initState();
}
@@ -101,10 +99,10 @@ class _BoardContentState extends State {
Expanded _buildBoard(BuildContext context) {
return Expanded(
- child: AFBoard(
- scrollManager: scrollManager,
- scrollController: scrollController,
- dataController: context.read().boardController,
+ child: AppFlowyBoard(
+ boardScrollController: scrollManager,
+ scrollController: ScrollController(),
+ controller: context.read().boardController,
headerBuilder: _buildHeader,
footerBuilder: _buildFooter,
cardBuilder: (_, column, columnItem) => _buildCard(
@@ -112,9 +110,9 @@ class _BoardContentState extends State {
column,
columnItem,
),
- columnConstraints: const BoxConstraints.tightFor(width: 300),
- config: AFBoardConfig(
- columnBackgroundColor: HexColor.fromHex('#F7F8FC'),
+ groupConstraints: const BoxConstraints.tightFor(width: 300),
+ config: AppFlowyBoardConfig(
+ groupBackgroundColor: HexColor.fromHex('#F7F8FC'),
),
),
);
@@ -143,20 +141,19 @@ class _BoardContentState extends State {
@override
void dispose() {
- scrollController.dispose();
super.dispose();
}
Widget _buildHeader(
BuildContext context,
- AFBoardColumnData columnData,
+ AppFlowyGroupData columnData,
) {
final boardCustomData = columnData.customData as BoardCustomData;
- return AppFlowyColumnHeader(
+ return AppFlowyGroupHeader(
title: Flexible(
fit: FlexFit.tight,
child: FlowyText.medium(
- columnData.headerData.columnName,
+ columnData.headerData.groupName,
fontSize: 14,
overflow: TextOverflow.clip,
color: context.read().textColor,
@@ -181,14 +178,14 @@ class _BoardContentState extends State {
);
}
- Widget _buildFooter(BuildContext context, AFBoardColumnData columnData) {
+ Widget _buildFooter(BuildContext context, AppFlowyGroupData columnData) {
final boardCustomData = columnData.customData as BoardCustomData;
final group = boardCustomData.group;
if (group.isDefault) {
return const SizedBox();
} else {
- return AppFlowyColumnFooter(
+ return AppFlowyGroupFooter(
icon: SizedBox(
height: 20,
width: 20,
@@ -215,8 +212,8 @@ class _BoardContentState extends State {
Widget _buildCard(
BuildContext context,
- AFBoardColumnData column,
- AFColumnItem columnItem,
+ AppFlowyGroupData column,
+ AppFlowyGroupItem columnItem,
) {
final boardColumnItem = columnItem as BoardColumnItem;
final rowPB = boardColumnItem.row;
@@ -242,7 +239,7 @@ class _BoardContentState extends State {
},
);
- return AppFlowyColumnItemCard(
+ return AppFlowyGroupCard(
key: ValueKey(columnItem.id),
margin: config.cardPadding,
decoration: _makeBoxDecoration(context),
diff --git a/frontend/app_flowy/packages/appflowy_board/CHANGELOG.md b/frontend/app_flowy/packages/appflowy_board/CHANGELOG.md
index d8eceeefee..56115c698b 100644
--- a/frontend/app_flowy/packages/appflowy_board/CHANGELOG.md
+++ b/frontend/app_flowy/packages/appflowy_board/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 0.0.7
+* Rename some classes
+* Add documentation
# 0.0.6
* Support scroll to bottom
* Fix some bugs
diff --git a/frontend/app_flowy/packages/appflowy_board/README.md b/frontend/app_flowy/packages/appflowy_board/README.md
index 8da1064699..7d879a491b 100644
--- a/frontend/app_flowy/packages/appflowy_board/README.md
+++ b/frontend/app_flowy/packages/appflowy_board/README.md
@@ -9,6 +9,7 @@
Twitter
+
@@ -30,30 +31,101 @@ Add the AppFlowy Board [Flutter package](https://docs.flutter.dev/development/pa
With Flutter:
```dart
flutter pub add appflowy_board
+flutter pub get
```
-This will add a line like this to your package's pubspec.yaml (and run an implicit flutter pub get):
+This will add a line like this to your package's pubspec.yaml:
```dart
dependencies:
appflowy_board: ^0.0.6
```
-Import the package in your Dart file:
+## Create your first board
+
+Initialize an `AppFlowyBoardController` for the board. It contains the data used by the board. You can
+register callbacks to receive the changes of the board.
+
```dart
-import 'package:appflowy_board/appflowy_board.dart';
+
+final AppFlowyBoardController controller = AppFlowyBoardController(
+ onMoveGroup: (fromGroupId, fromIndex, toGroupId, toIndex) {
+ debugPrint('Move item from $fromIndex to $toIndex');
+ },
+ onMoveGroupItem: (groupId, fromIndex, toIndex) {
+ debugPrint('Move $groupId:$fromIndex to $groupId:$toIndex');
+ },
+ onMoveGroupItemToGroup: (fromGroupId, fromIndex, toGroupId, toIndex) {
+ debugPrint('Move $fromGroupId:$fromIndex to $toGroupId:$toIndex');
+ },
+);
+```
+
+Provide an initial value of the board by initializing the `AppFlowyGroupData`. It represents a group data and contains list of items. Each item displayed in the group requires to implement the `AppFlowyGroupItem` class.
+
+```dart
+
+void initState() {
+ final group1 = AppFlowyGroupData(id: "To Do", items: [
+ TextItem("Card 1"),
+ TextItem("Card 2"),
+ ]);
+ final group2 = AppFlowyGroupData(id: "In Progress", items: [
+ TextItem("Card 3"),
+ TextItem("Card 4"),
+ ]);
+
+ final group3 = AppFlowyGroupData(id: "Done", items: []);
+
+ controller.addGroup(group1);
+ controller.addGroup(group2);
+ controller.addGroup(group3);
+ super.initState();
+}
+
+class TextItem extends AppFlowyGroupItem {
+ final String s;
+ TextItem(this.s);
+
+ @override
+ String get id => s;
+}
+
+```
+
+Finally, return a `AppFlowyBoard` widget in the build method.
+
+```dart
+
+@override
+Widget build(BuildContext context) {
+ return AppFlowyBoard(
+ controller: controller,
+ cardBuilder: (context, group, groupItem) {
+ final textItem = groupItem as TextItem;
+ return AppFlowyGroupCard(
+ key: ObjectKey(textItem),
+ child: Text(textItem.s),
+ );
+ },
+ groupConstraints: const BoxConstraints.tightFor(width: 240),
+ );
+}
+
```
## Usage Example
To quickly grasp how it can be used, look at the /example/lib folder.
First, run main.dart to play with the demo.
+
Second, let's delve into multi_board_list_example.dart to understand a few key components:
-* A Board widget is created via instantiating an AFBoard() object.
-* In the AFBoard() object, you can find:
- * AFBoardDataController, which is defined in board_data.dart, is feeded with prepopulated mock data. It also contains callback functions to materialize future user data.
- * Three builders: AppFlowyColumnHeader, AppFlowyColumnFooter, AppFlowyColumnItemCard. See below image for what they are used for.
+* A Board widget is created via instantiating an `AppFlowyBoard` object.
+* In the `AppFlowyBoard` object, you can find the `AppFlowyBoardController`, which is defined in board_data.dart, is fed with pre-populated mock data. It also contains callback functions to materialize future user data.
+* Three builders: AppFlowyBoardHeaderBuilder, AppFlowyBoardFooterBuilder, AppFlowyBoardCardBuilder. See below image for what they are used for.
+
+
-
+
## Glossary
@@ -66,6 +138,3 @@ Please look at [CONTRIBUTING.md](https://appflowy.gitbook.io/docs/essential-docu
## License
Distributed under the AGPLv3 License. See [LICENSE](https://github.com/AppFlowy-IO/AppFlowy-Docs/blob/main/LICENSE) for more information.
-
-
-
diff --git a/frontend/app_flowy/packages/appflowy_board/example/lib/multi_board_list_example.dart b/frontend/app_flowy/packages/appflowy_board/example/lib/multi_board_list_example.dart
index c0fc62f8e2..8bd7ae98e3 100644
--- a/frontend/app_flowy/packages/appflowy_board/example/lib/multi_board_list_example.dart
+++ b/frontend/app_flowy/packages/appflowy_board/example/lib/multi_board_list_example.dart
@@ -9,21 +9,21 @@ class MultiBoardListExample extends StatefulWidget {
}
class _MultiBoardListExampleState extends State {
- final AFBoardDataController boardDataController = AFBoardDataController(
- onMoveColumn: (fromColumnId, fromIndex, toColumnId, toIndex) {
- // debugPrint('Move column from $fromIndex to $toIndex');
+ final AppFlowyBoardController controller = AppFlowyBoardController(
+ onMoveGroup: (fromGroupId, fromIndex, toGroupId, toIndex) {
+ debugPrint('Move item from $fromIndex to $toIndex');
},
- onMoveColumnItem: (columnId, fromIndex, toIndex) {
- // debugPrint('Move $columnId:$fromIndex to $columnId:$toIndex');
+ onMoveGroupItem: (groupId, fromIndex, toIndex) {
+ debugPrint('Move $groupId:$fromIndex to $groupId:$toIndex');
},
- onMoveColumnItemToColumn: (fromColumnId, fromIndex, toColumnId, toIndex) {
- // debugPrint('Move $fromColumnId:$fromIndex to $toColumnId:$toIndex');
+ onMoveGroupItemToGroup: (fromGroupId, fromIndex, toGroupId, toIndex) {
+ debugPrint('Move $fromGroupId:$fromIndex to $toGroupId:$toIndex');
},
);
@override
void initState() {
- List a = [
+ final group1 = AppFlowyGroupData(id: "To Do", name: "To Do", items: [
TextItem("Card 1"),
TextItem("Card 2"),
RichTextItem(title: "Card 3", subtitle: 'Aug 1, 2020 4:05 PM'),
@@ -33,84 +33,74 @@ class _MultiBoardListExampleState extends State {
RichTextItem(title: "Card 7", subtitle: 'Aug 1, 2020 4:05 PM'),
RichTextItem(title: "Card 8", subtitle: 'Aug 1, 2020 4:05 PM'),
TextItem("Card 9"),
- ];
+ ]);
- final column1 = AFBoardColumnData(id: "To Do", name: "To Do", items: a);
- final column2 = AFBoardColumnData(
+ final group2 = AppFlowyGroupData(
id: "In Progress",
name: "In Progress",
- items: [
+ items: [
RichTextItem(title: "Card 10", subtitle: 'Aug 1, 2020 4:05 PM'),
TextItem("Card 11"),
],
);
- final column3 =
- AFBoardColumnData(id: "Done", name: "Done", items: []);
+ final group3 = AppFlowyGroupData(
+ id: "Done", name: "Done", items: []);
- boardDataController.addColumn(column1);
- boardDataController.addColumn(column2);
- boardDataController.addColumn(column3);
+ controller.addGroup(group1);
+ controller.addGroup(group2);
+ controller.addGroup(group3);
super.initState();
}
@override
Widget build(BuildContext context) {
- final config = AFBoardConfig(
- columnBackgroundColor: HexColor.fromHex('#F7F8FC'),
+ final config = AppFlowyBoardConfig(
+ groupBackgroundColor: HexColor.fromHex('#F7F8FC'),
);
- return Container(
- color: Colors.white,
- child: Padding(
- padding: const EdgeInsets.symmetric(vertical: 30, horizontal: 20),
- child: AFBoard(
- dataController: boardDataController,
- footerBuilder: (context, columnData) {
- return AppFlowyColumnFooter(
- icon: const Icon(Icons.add, size: 20),
- title: const Text('New'),
- height: 50,
- margin: config.columnItemPadding,
- );
- },
- headerBuilder: (context, columnData) {
- return AppFlowyColumnHeader(
- icon: const Icon(Icons.lightbulb_circle),
- title: SizedBox(
- width: 60,
- child: TextField(
- controller: TextEditingController()
- ..text = columnData.headerData.columnName,
- onSubmitted: (val) {
- boardDataController
- .getColumnController(columnData.headerData.columnId)!
- .updateColumnName(val);
- },
- ),
+ return AppFlowyBoard(
+ controller: controller,
+ cardBuilder: (context, group, groupItem) {
+ return AppFlowyGroupCard(
+ key: ValueKey(groupItem.id),
+ child: _buildCard(groupItem),
+ );
+ },
+ footerBuilder: (context, columnData) {
+ return AppFlowyGroupFooter(
+ icon: const Icon(Icons.add, size: 20),
+ title: const Text('New'),
+ height: 50,
+ margin: config.groupItemPadding,
+ );
+ },
+ headerBuilder: (context, columnData) {
+ return AppFlowyGroupHeader(
+ icon: const Icon(Icons.lightbulb_circle),
+ title: SizedBox(
+ width: 60,
+ child: TextField(
+ controller: TextEditingController()
+ ..text = columnData.headerData.groupName,
+ onSubmitted: (val) {
+ controller
+ .getGroupController(columnData.headerData.groupId)!
+ .updateGroupName(val);
+ },
),
- addIcon: const Icon(Icons.add, size: 20),
- moreIcon: const Icon(Icons.more_horiz, size: 20),
- height: 50,
- margin: config.columnItemPadding,
- );
- },
- cardBuilder: (context, column, columnItem) {
- return AppFlowyColumnItemCard(
- key: ValueKey(columnItem.id),
- child: _buildCard(columnItem),
- );
- },
- columnConstraints: const BoxConstraints.tightFor(width: 240),
- config: AFBoardConfig(
- columnBackgroundColor: HexColor.fromHex('#F7F8FC'),
- ),
- ),
- ),
- );
+ ),
+ addIcon: const Icon(Icons.add, size: 20),
+ moreIcon: const Icon(Icons.more_horiz, size: 20),
+ height: 50,
+ margin: config.groupItemPadding,
+ );
+ },
+ groupConstraints: const BoxConstraints.tightFor(width: 240),
+ config: config);
}
- Widget _buildCard(AFColumnItem item) {
+ Widget _buildCard(AppFlowyGroupItem item) {
if (item is TextItem) {
return Align(
alignment: Alignment.centerLeft,
@@ -172,7 +162,7 @@ class _RichTextCardState extends State {
}
}
-class TextItem extends AFColumnItem {
+class TextItem extends AppFlowyGroupItem {
final String s;
TextItem(this.s);
@@ -181,7 +171,7 @@ class TextItem extends AFColumnItem {
String get id => s;
}
-class RichTextItem extends AFColumnItem {
+class RichTextItem extends AppFlowyGroupItem {
final String title;
final String subtitle;
diff --git a/frontend/app_flowy/packages/appflowy_board/example/lib/single_board_list_example.dart b/frontend/app_flowy/packages/appflowy_board/example/lib/single_board_list_example.dart
index f22c562343..c222856efa 100644
--- a/frontend/app_flowy/packages/appflowy_board/example/lib/single_board_list_example.dart
+++ b/frontend/app_flowy/packages/appflowy_board/example/lib/single_board_list_example.dart
@@ -9,11 +9,11 @@ class SingleBoardListExample extends StatefulWidget {
}
class _SingleBoardListExampleState extends State {
- final AFBoardDataController boardData = AFBoardDataController();
+ final AppFlowyBoardController boardData = AppFlowyBoardController();
@override
void initState() {
- final column = AFBoardColumnData(
+ final column = AppFlowyGroupData(
id: "1",
name: "1",
items: [
@@ -24,14 +24,14 @@ class _SingleBoardListExampleState extends State {
],
);
- boardData.addColumn(column);
+ boardData.addGroup(column);
super.initState();
}
@override
Widget build(BuildContext context) {
- return AFBoard(
- dataController: boardData,
+ return AppFlowyBoard(
+ controller: boardData,
cardBuilder: (context, column, columnItem) {
return _RowWidget(
item: columnItem as TextItem, key: ObjectKey(columnItem));
@@ -55,7 +55,7 @@ class _RowWidget extends StatelessWidget {
}
}
-class TextItem extends AFColumnItem {
+class TextItem extends AppFlowyGroupItem {
final String s;
TextItem(this.s);
diff --git a/frontend/app_flowy/packages/appflowy_board/lib/appflowy_board.dart b/frontend/app_flowy/packages/appflowy_board/lib/appflowy_board.dart
index fc8f3c662f..6125cf29e6 100644
--- a/frontend/app_flowy/packages/appflowy_board/lib/appflowy_board.dart
+++ b/frontend/app_flowy/packages/appflowy_board/lib/appflowy_board.dart
@@ -1,6 +1,7 @@
+/// AppFlowyBoard library
library appflowy_board;
-export 'src/widgets/board_column/board_column_data.dart';
+export 'src/widgets/board_group/group_data.dart';
export 'src/widgets/board_data.dart';
-export 'src/widgets/styled_widgets/appflowy_styled_widgets.dart';
+export 'src/widgets/styled_widgets/widgets.dart';
export 'src/widgets/board.dart';
diff --git a/frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board.dart b/frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board.dart
index 96874a1425..4a71595ea6 100644
--- a/frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board.dart
+++ b/frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board.dart
@@ -1,121 +1,147 @@
import 'package:appflowy_board/src/utils/log.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
-import 'board_column/board_column.dart';
-import 'board_column/board_column_data.dart';
import 'board_data.dart';
+import 'board_group/group.dart';
+import 'board_group/group_data.dart';
import 'reorder_flex/drag_state.dart';
import 'reorder_flex/drag_target_interceptor.dart';
import 'reorder_flex/reorder_flex.dart';
import 'reorder_phantom/phantom_controller.dart';
import '../rendering/board_overlay.dart';
-class AFBoardScrollManager {
- BoardColumnsState? _columnState;
+class AppFlowyBoardScrollController {
+ AppFlowyBoardState? _groupState;
- // AFBoardScrollManager();
-
- void scrollToBottom(String columnId, VoidCallback? completed) {
- _columnState
- ?.getReorderFlexState(columnId: columnId)
+ void scrollToBottom(String groupId, VoidCallback? completed) {
+ _groupState
+ ?.getReorderFlexState(groupId: groupId)
?.scrollToBottom(completed);
}
}
-class AFBoardConfig {
+class AppFlowyBoardConfig {
final double cornerRadius;
- final EdgeInsets columnPadding;
- final EdgeInsets columnItemPadding;
+ final EdgeInsets groupPadding;
+ final EdgeInsets groupItemPadding;
final EdgeInsets footerPadding;
final EdgeInsets headerPadding;
final EdgeInsets cardPadding;
- final Color columnBackgroundColor;
+ final Color groupBackgroundColor;
- const AFBoardConfig({
+ const AppFlowyBoardConfig({
this.cornerRadius = 6.0,
- this.columnPadding = const EdgeInsets.symmetric(horizontal: 8),
- this.columnItemPadding = const EdgeInsets.symmetric(horizontal: 12),
+ this.groupPadding = const EdgeInsets.symmetric(horizontal: 8),
+ this.groupItemPadding = const EdgeInsets.symmetric(horizontal: 12),
this.footerPadding = const EdgeInsets.symmetric(horizontal: 12),
this.headerPadding = const EdgeInsets.symmetric(horizontal: 16),
this.cardPadding = const EdgeInsets.symmetric(horizontal: 3, vertical: 4),
- this.columnBackgroundColor = Colors.transparent,
+ this.groupBackgroundColor = Colors.transparent,
});
}
-class AFBoard extends StatelessWidget {
+class AppFlowyBoard extends StatelessWidget {
/// The direction to use as the main axis.
final Axis direction = Axis.vertical;
- ///
+ /// The widget that will be rendered as the background of the board.
final Widget? background;
+ /// The [cardBuilder] function which will be invoked on each card build.
+ /// The [cardBuilder] takes the [BuildContext],[AppFlowyGroupData] and
+ /// the corresponding [AppFlowyGroupItem].
///
- final AFBoardColumnCardBuilder cardBuilder;
+ /// must return a widget.
+ final AppFlowyBoardCardBuilder cardBuilder;
+ /// The [headerBuilder] function which will be invoked on each group build.
+ /// The [headerBuilder] takes the [BuildContext] and [AppFlowyGroupData].
///
- final AFBoardColumnHeaderBuilder? headerBuilder;
+ /// must return a widget.
+ final AppFlowyBoardHeaderBuilder? headerBuilder;
+ /// The [footerBuilder] function which will be invoked on each group build.
+ /// The [footerBuilder] takes the [BuildContext] and [AppFlowyGroupData].
///
- final AFBoardColumnFooterBuilder? footerBuilder;
+ /// must return a widget.
+ final AppFlowyBoardFooterBuilder? footerBuilder;
+ /// A controller for [AppFlowyBoard] widget.
///
- final AFBoardDataController dataController;
-
- final BoxConstraints columnConstraints;
-
+ /// A [AppFlowyBoardController] can be used to provide an initial value of
+ /// the board by calling `addGroup` method with the passed in parameter
+ /// [AppFlowyGroupData]. A [AppFlowyGroupData] represents one
+ /// group data. Whenever the user modifies the board, this controller will
+ /// update the corresponding group data.
///
- late final BoardPhantomController phantomController;
+ /// Also, you can register the callbacks that receive the changes. Check out
+ /// the [AppFlowyBoardController] for more information.
+ ///
+ final AppFlowyBoardController controller;
+ /// A constraints applied to [AppFlowyBoardGroup] widget.
+ final BoxConstraints groupConstraints;
+
+ /// A controller is used by the [ReorderFlex].
+ ///
+ /// The [ReorderFlex] will used the primary scrollController of the current
+ /// [BuildContext] by using PrimaryScrollController.of(context).
+ /// If the primary scrollController is null, we will assign a new [ScrollController].
final ScrollController? scrollController;
- final AFBoardConfig config;
+ ///
+ final AppFlowyBoardConfig config;
- final AFBoardScrollManager? scrollManager;
+ /// A controller is used to control each group scroll actions.
+ ///
+ final AppFlowyBoardScrollController? boardScrollController;
- final BoardColumnsState _columnState = BoardColumnsState();
+ final AppFlowyBoardState _groupState = AppFlowyBoardState();
- AFBoard({
- required this.dataController,
+ late final BoardPhantomController _phantomController;
+
+ AppFlowyBoard({
+ required this.controller,
required this.cardBuilder,
this.background,
this.footerBuilder,
this.headerBuilder,
this.scrollController,
- this.scrollManager,
- this.columnConstraints = const BoxConstraints(maxWidth: 200),
- this.config = const AFBoardConfig(),
+ this.boardScrollController,
+ this.groupConstraints = const BoxConstraints(maxWidth: 200),
+ this.config = const AppFlowyBoardConfig(),
Key? key,
}) : super(key: key) {
- phantomController = BoardPhantomController(
- delegate: dataController,
- columnsState: _columnState,
+ _phantomController = BoardPhantomController(
+ delegate: controller,
+ groupsState: _groupState,
);
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider.value(
- value: dataController,
- child: Consumer(
+ value: controller,
+ child: Consumer(
builder: (context, notifier, child) {
- if (scrollManager != null) {
- scrollManager!._columnState = _columnState;
+ if (boardScrollController != null) {
+ boardScrollController!._groupState = _groupState;
}
- return AFBoardContent(
+ return _AppFlowyBoardContent(
config: config,
- dataController: dataController,
+ dataController: controller,
scrollController: scrollController,
- scrollManager: scrollManager,
- columnsState: _columnState,
+ scrollManager: boardScrollController,
+ columnsState: _groupState,
background: background,
- delegate: phantomController,
- columnConstraints: columnConstraints,
+ delegate: _phantomController,
+ groupConstraints: groupConstraints,
cardBuilder: cardBuilder,
- footBuilder: footerBuilder,
+ footerBuilder: footerBuilder,
headerBuilder: headerBuilder,
- phantomController: phantomController,
- onReorder: dataController.moveColumn,
+ phantomController: _phantomController,
+ onReorder: controller.moveGroup,
);
},
),
@@ -123,46 +149,34 @@ class AFBoard extends StatelessWidget {
}
}
-class AFBoardContent extends StatefulWidget {
+class _AppFlowyBoardContent extends StatefulWidget {
final ScrollController? scrollController;
- final OnDragStarted? onDragStarted;
final OnReorder onReorder;
- final OnDragEnded? onDragEnded;
- final AFBoardDataController dataController;
+ final AppFlowyBoardController dataController;
final Widget? background;
- final AFBoardConfig config;
+ final AppFlowyBoardConfig config;
final ReorderFlexConfig reorderFlexConfig;
- final BoxConstraints columnConstraints;
- final AFBoardScrollManager? scrollManager;
- final BoardColumnsState columnsState;
-
- ///
- final AFBoardColumnCardBuilder cardBuilder;
-
- ///
- final AFBoardColumnHeaderBuilder? headerBuilder;
-
- ///
- final AFBoardColumnFooterBuilder? footBuilder;
-
+ final BoxConstraints groupConstraints;
+ final AppFlowyBoardScrollController? scrollManager;
+ final AppFlowyBoardState columnsState;
+ final AppFlowyBoardCardBuilder cardBuilder;
+ final AppFlowyBoardHeaderBuilder? headerBuilder;
+ final AppFlowyBoardFooterBuilder? footerBuilder;
final OverlapDragTargetDelegate delegate;
-
final BoardPhantomController phantomController;
- const AFBoardContent({
+ const _AppFlowyBoardContent({
required this.config,
required this.onReorder,
required this.delegate,
required this.dataController,
required this.scrollManager,
required this.columnsState,
- this.onDragStarted,
- this.onDragEnded,
this.scrollController,
this.background,
- required this.columnConstraints,
+ required this.groupConstraints,
required this.cardBuilder,
- this.footBuilder,
+ this.footerBuilder,
this.headerBuilder,
required this.phantomController,
Key? key,
@@ -170,21 +184,23 @@ class AFBoardContent extends StatefulWidget {
super(key: key);
@override
- State createState() => _AFBoardContentState();
+ State<_AppFlowyBoardContent> createState() => _AppFlowyBoardContentState();
}
-class _AFBoardContentState extends State {
+class _AppFlowyBoardContentState extends State<_AppFlowyBoardContent> {
final GlobalKey _boardContentKey =
- GlobalKey(debugLabel: '$AFBoardContent overlay key');
+ GlobalKey(debugLabel: '$_AppFlowyBoardContent overlay key');
late BoardOverlayEntry _overlayEntry;
+ final Map _reorderFlexKeys = {};
+
@override
void initState() {
_overlayEntry = BoardOverlayEntry(
builder: (BuildContext context) {
final interceptor = OverlappingDragTargetInterceptor(
reorderFlexId: widget.dataController.identifier,
- acceptedReorderFlexId: widget.dataController.columnIds,
+ acceptedReorderFlexId: widget.dataController.groupIds,
delegate: widget.delegate,
columnsState: widget.columnsState,
);
@@ -192,9 +208,7 @@ class _AFBoardContentState extends State {
final reorderFlex = ReorderFlex(
config: widget.reorderFlexConfig,
scrollController: widget.scrollController,
- onDragStarted: widget.onDragStarted,
onReorder: widget.onReorder,
- onDragEnded: widget.onDragEnded,
dataSource: widget.dataController,
direction: Axis.horizontal,
interceptor: interceptor,
@@ -233,42 +247,47 @@ class _AFBoardContentState extends State {
List _buildColumns() {
final List children =
- widget.dataController.columnDatas.asMap().entries.map(
+ widget.dataController.groupDatas.asMap().entries.map(
(item) {
final columnData = item.value;
final columnIndex = item.key;
- final dataSource = _BoardColumnDataSourceImpl(
- columnId: columnData.id,
+ final dataSource = _BoardGroupDataSourceImpl(
+ groupId: columnData.id,
dataController: widget.dataController,
);
+ if (_reorderFlexKeys[columnData.id] == null) {
+ _reorderFlexKeys[columnData.id] = GlobalObjectKey(columnData.id);
+ }
+
+ GlobalObjectKey reorderFlexKey = _reorderFlexKeys[columnData.id]!;
return ChangeNotifierProvider.value(
key: ValueKey(columnData.id),
- value: widget.dataController.getColumnController(columnData.id),
- child: Consumer(
+ value: widget.dataController.getGroupController(columnData.id),
+ child: Consumer(
builder: (context, value, child) {
- final boardColumn = AFBoardColumnWidget(
+ final boardColumn = AppFlowyBoardGroup(
+ reorderFlexKey: reorderFlexKey,
// key: PageStorageKey(columnData.id),
margin: _marginFromIndex(columnIndex),
- itemMargin: widget.config.columnItemPadding,
+ itemMargin: widget.config.groupItemPadding,
headerBuilder: _buildHeader,
- footBuilder: widget.footBuilder,
+ footerBuilder: widget.footerBuilder,
cardBuilder: widget.cardBuilder,
dataSource: dataSource,
scrollController: ScrollController(),
phantomController: widget.phantomController,
- onReorder: widget.dataController.moveColumnItem,
+ onReorder: widget.dataController.moveGroupItem,
cornerRadius: widget.config.cornerRadius,
- backgroundColor: widget.config.columnBackgroundColor,
+ backgroundColor: widget.config.groupBackgroundColor,
dragStateStorage: widget.columnsState,
dragTargetIndexKeyStorage: widget.columnsState,
);
- widget.columnsState.addColumn(columnData.id, boardColumn);
-
+ widget.columnsState.addGroup(columnData.id, boardColumn);
return ConstrainedBox(
- constraints: widget.columnConstraints,
+ constraints: widget.groupConstraints,
child: boardColumn,
);
},
@@ -282,79 +301,82 @@ class _AFBoardContentState extends State {
Widget? _buildHeader(
BuildContext context,
- AFBoardColumnData columnData,
+ AppFlowyGroupData groupData,
) {
if (widget.headerBuilder == null) {
return null;
}
- return Selector(
- selector: (context, controller) => controller.columnData.headerData,
+ return Selector(
+ selector: (context, controller) => controller.groupData.headerData,
builder: (context, headerData, _) {
- return widget.headerBuilder!(context, columnData)!;
+ return widget.headerBuilder!(context, groupData)!;
},
);
}
EdgeInsets _marginFromIndex(int index) {
- if (widget.dataController.columnDatas.isEmpty) {
- return widget.config.columnPadding;
+ if (widget.dataController.groupDatas.isEmpty) {
+ return widget.config.groupPadding;
}
if (index == 0) {
- return EdgeInsets.only(right: widget.config.columnPadding.right);
+ return EdgeInsets.only(right: widget.config.groupPadding.right);
}
- if (index == widget.dataController.columnDatas.length - 1) {
- return EdgeInsets.only(left: widget.config.columnPadding.left);
+ if (index == widget.dataController.groupDatas.length - 1) {
+ return EdgeInsets.only(left: widget.config.groupPadding.left);
}
- return widget.config.columnPadding;
+ return widget.config.groupPadding;
}
}
-class _BoardColumnDataSourceImpl extends AFBoardColumnDataDataSource {
- String columnId;
- final AFBoardDataController dataController;
+class _BoardGroupDataSourceImpl extends AppFlowyGroupDataDataSource {
+ String groupId;
+ final AppFlowyBoardController dataController;
- _BoardColumnDataSourceImpl({
- required this.columnId,
+ _BoardGroupDataSourceImpl({
+ required this.groupId,
required this.dataController,
});
@override
- AFBoardColumnData get columnData =>
- dataController.getColumnController(columnId)!.columnData;
+ AppFlowyGroupData get groupData =>
+ dataController.getGroupController(groupId)!.groupData;
@override
- List get acceptedColumnIds => dataController.columnIds;
+ List get acceptedGroupIds => dataController.groupIds;
}
-class BoardColumnContext {
- GlobalKey? columnKey;
+/// A context contains the group states including the draggingState.
+///
+/// [draggingState] represents the dragging state of the group.
+class AppFlowyGroupContext {
DraggingState? draggingState;
}
-class BoardColumnsState extends DraggingStateStorage
+class AppFlowyBoardState extends DraggingStateStorage
with ReorderDragTargetIndexKeyStorage {
- /// Quick access to the [AFBoardColumnWidget]
- final Map columnKeys = {};
- final Map columnDragStates = {};
- final Map> columnDragDragTargets = {};
+ /// Quick access to the [AppFlowyBoardGroup], the [GlobalKey] is bind to the
+ /// AppFlowyBoardGroup's [ReorderFlex] widget.
+ final Map groupReorderFlexKeys = {};
+ final Map groupDragStates = {};
+ final Map> groupDragDragTargets = {};
- void addColumn(String columnId, AFBoardColumnWidget columnWidget) {
- columnKeys[columnId] = columnWidget.globalKey;
+ void addGroup(String groupId, AppFlowyBoardGroup groupWidget) {
+ groupReorderFlexKeys[groupId] = groupWidget.reorderFlexKey;
}
- ReorderFlexState? getReorderFlexState({required String columnId}) {
- final flexGlobalKey = columnKeys[columnId];
+ ReorderFlexState? getReorderFlexState({required String groupId}) {
+ final flexGlobalKey = groupReorderFlexKeys[groupId];
if (flexGlobalKey == null) return null;
if (flexGlobalKey.currentState is! ReorderFlexState) return null;
final state = flexGlobalKey.currentState as ReorderFlexState;
return state;
}
- ReorderFlex? getReorderFlex({required String columnId}) {
- final flexGlobalKey = columnKeys[columnId];
+ ReorderFlex? getReorderFlex({required String groupId}) {
+ final flexGlobalKey = groupReorderFlexKeys[groupId];
if (flexGlobalKey == null) return null;
if (flexGlobalKey.currentWidget is! ReorderFlex) return null;
final widget = flexGlobalKey.currentWidget as ReorderFlex;
@@ -363,18 +385,18 @@ class BoardColumnsState extends DraggingStateStorage
@override
DraggingState? read(String reorderFlexId) {
- return columnDragStates[reorderFlexId];
+ return groupDragStates[reorderFlexId];
}
@override
void write(String reorderFlexId, DraggingState state) {
Log.trace('$reorderFlexId Write dragging state: $state');
- columnDragStates[reorderFlexId] = state;
+ groupDragStates[reorderFlexId] = state;
}
@override
void remove(String reorderFlexId) {
- columnDragStates.remove(reorderFlexId);
+ groupDragStates.remove(reorderFlexId);
}
@override
@@ -383,20 +405,20 @@ class BoardColumnsState extends DraggingStateStorage
String key,
GlobalObjectKey> value,
) {
- Map? column = columnDragDragTargets[reorderFlexId];
- if (column == null) {
- column = {};
- columnDragDragTargets[reorderFlexId] = column;
+ Map? group = groupDragDragTargets[reorderFlexId];
+ if (group == null) {
+ group = {};
+ groupDragDragTargets[reorderFlexId] = group;
}
- column[key] = value;
+ group[key] = value;
}
@override
GlobalObjectKey>? readKey(
String reorderFlexId, String key) {
- Map? column = columnDragDragTargets[reorderFlexId];
- if (column != null) {
- return column[key];
+ Map? group = groupDragDragTargets[reorderFlexId];
+ if (group != null) {
+ return group[key];
} else {
return null;
}
diff --git a/frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board_column/board_column_data.dart b/frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board_column/board_column_data.dart
deleted file mode 100644
index bc442acd2a..0000000000
--- a/frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board_column/board_column_data.dart
+++ /dev/null
@@ -1,192 +0,0 @@
-import 'dart:collection';
-
-import 'package:equatable/equatable.dart';
-import 'package:flutter/material.dart';
-import '../../utils/log.dart';
-import '../reorder_flex/reorder_flex.dart';
-
-abstract class AFColumnItem extends ReoderFlexItem {
- bool get isPhantom => false;
-
- @override
- String toString() => id;
-}
-
-/// [AFBoardColumnDataController] is used to handle the [AFBoardColumnData].
-/// * Remove an item by calling [removeAt] method.
-/// * Move item to another position by calling [move] method.
-/// * Insert item to index by calling [insert] method
-/// * Replace item at index by calling [replace] method.
-///
-/// All there operations will notify listeners by default.
-///
-class AFBoardColumnDataController extends ChangeNotifier with EquatableMixin {
- final AFBoardColumnData columnData;
-
- AFBoardColumnDataController({
- required this.columnData,
- });
-
- @override
- List