Skip to content

Commit 5e6b949

Browse files
authored
Merge pull request #882 from AppFlowy-IO/feat/board_configuration
Feat/board configuration
2 parents 3564d65 + 074c497 commit 5e6b949

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+2212
-1459
lines changed

frontend/.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"program": "./lib/main.dart",
3030
"type": "dart",
3131
"env": {
32-
"RUST_LOG": "trace"
32+
"RUST_LOG": "debug"
3333
},
3434
"cwd": "${workspaceRoot}/app_flowy"
3535
},

frontend/app_flowy/lib/plugins/board/application/board_bloc.dart

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
2323
final BoardDataController _dataController;
2424
late final AFBoardDataController afBoardDataController;
2525
final MoveRowFFIService _rowService;
26-
Map<String, GroupController> groupControllers = {};
26+
LinkedHashMap<String, GroupController> groupControllers = LinkedHashMap.new();
2727

2828
GridFieldCache get fieldCache => _dataController.fieldCache;
2929
String get gridId => _dataController.gridId;
@@ -34,17 +34,21 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
3434
super(BoardState.initial(view.id)) {
3535
afBoardDataController = AFBoardDataController(
3636
onMoveColumn: (
37+
fromColumnId,
3738
fromIndex,
39+
toColumnId,
3840
toIndex,
39-
) {},
41+
) {
42+
_moveGroup(fromColumnId, toColumnId);
43+
},
4044
onMoveColumnItem: (
4145
columnId,
4246
fromIndex,
4347
toIndex,
4448
) {
4549
final fromRow = groupControllers[columnId]?.rowAtIndex(fromIndex);
4650
final toRow = groupControllers[columnId]?.rowAtIndex(toIndex);
47-
_moveRow(fromRow, toRow);
51+
_moveRow(fromRow, columnId, toRow);
4852
},
4953
onMoveColumnItemToColumn: (
5054
fromColumnId,
@@ -54,7 +58,7 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
5458
) {
5559
final fromRow = groupControllers[fromColumnId]?.rowAtIndex(fromIndex);
5660
final toRow = groupControllers[toColumnId]?.rowAtIndex(toIndex);
57-
_moveRow(fromRow, toRow);
61+
_moveRow(fromRow, toColumnId, toRow);
5862
},
5963
);
6064

@@ -95,19 +99,31 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
9599
);
96100
}
97101

98-
void _moveRow(RowPB? fromRow, RowPB? toRow) {
99-
if (fromRow != null && toRow != null) {
102+
void _moveRow(RowPB? fromRow, String columnId, RowPB? toRow) {
103+
if (fromRow != null) {
100104
_rowService
101-
.moveRow(
105+
.moveGroupRow(
102106
fromRowId: fromRow.id,
103-
toRowId: toRow.id,
107+
toGroupId: columnId,
108+
toRowId: toRow?.id,
104109
)
105110
.then((result) {
106111
result.fold((l) => null, (r) => add(BoardEvent.didReceiveError(r)));
107112
});
108113
}
109114
}
110115

116+
void _moveGroup(String fromColumnId, String toColumnId) {
117+
_rowService
118+
.moveGroup(
119+
fromGroupId: fromColumnId,
120+
toGroupId: toColumnId,
121+
)
122+
.then((result) {
123+
result.fold((l) => null, (r) => add(BoardEvent.didReceiveError(r)));
124+
});
125+
}
126+
111127
@override
112128
Future<void> close() async {
113129
await _dataController.dispose();

frontend/app_flowy/lib/plugins/board/application/group_controller.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ class GroupController {
3737
(GroupRowsChangesetPB changeset) {
3838
for (final insertedRow in changeset.insertedRows) {
3939
final index = insertedRow.hasIndex() ? insertedRow.index : null;
40+
41+
if (insertedRow.hasIndex() &&
42+
group.rows.length > insertedRow.index) {
43+
group.rows.insert(insertedRow.index, insertedRow.row);
44+
} else {
45+
group.rows.add(insertedRow.row);
46+
}
47+
4048
delegate.insertRow(
4149
group.groupId,
4250
insertedRow.row,
@@ -45,10 +53,19 @@ class GroupController {
4553
}
4654

4755
for (final deletedRow in changeset.deletedRows) {
56+
group.rows.removeWhere((rowPB) => rowPB.id == deletedRow);
4857
delegate.removeRow(group.groupId, deletedRow);
4958
}
5059

5160
for (final updatedRow in changeset.updatedRows) {
61+
final index = group.rows.indexWhere(
62+
(rowPB) => rowPB.id == updatedRow.id,
63+
);
64+
65+
if (index != -1) {
66+
group.rows[index] = updatedRow;
67+
}
68+
5269
delegate.updateRow(group.groupId, updatedRow);
5370
}
5471
},

frontend/app_flowy/lib/plugins/grid/application/grid_service.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import 'package:flowy_sdk/dispatch/dispatch.dart';
33
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
44
import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
55
import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart';
6-
import 'package:flowy_sdk/protobuf/flowy-grid/board_card.pb.dart';
76
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
87
import 'package:flowy_sdk/protobuf/flowy-grid/grid_entities.pb.dart';
98
import 'package:flowy_sdk/protobuf/flowy-grid/group.pb.dart';

frontend/app_flowy/lib/plugins/grid/application/row/row_service.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flowy_sdk/dispatch/dispatch.dart';
33
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
44
import 'package:flowy_sdk/protobuf/flowy-grid/block_entities.pb.dart';
55
import 'package:flowy_sdk/protobuf/flowy-grid/grid_entities.pb.dart';
6+
import 'package:flowy_sdk/protobuf/flowy-grid/group_changeset.pb.dart';
67
import 'package:flowy_sdk/protobuf/flowy-grid/row_entities.pb.dart';
78

89
class RowFFIService {
@@ -68,4 +69,33 @@ class MoveRowFFIService {
6869

6970
return GridEventMoveRow(payload).send();
7071
}
72+
73+
Future<Either<Unit, FlowyError>> moveGroupRow({
74+
required String fromRowId,
75+
required String toGroupId,
76+
required String? toRowId,
77+
}) {
78+
var payload = MoveGroupRowPayloadPB.create()
79+
..viewId = gridId
80+
..fromRowId = fromRowId
81+
..toGroupId = toGroupId;
82+
83+
if (toRowId != null) {
84+
payload.toRowId = toRowId;
85+
}
86+
87+
return GridEventMoveGroupRow(payload).send();
88+
}
89+
90+
Future<Either<Unit, FlowyError>> moveGroup({
91+
required String fromGroupId,
92+
required String toGroupId,
93+
}) {
94+
final payload = MoveGroupPayloadPB.create()
95+
..viewId = gridId
96+
..fromGroupId = fromGroupId
97+
..toGroupId = toGroupId;
98+
99+
return GridEventMoveGroup(payload).send();
100+
}
71101
}

frontend/app_flowy/packages/appflowy_board/example/lib/multi_board_list_example.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class MultiBoardListExample extends StatefulWidget {
1010

1111
class _MultiBoardListExampleState extends State<MultiBoardListExample> {
1212
final AFBoardDataController boardDataController = AFBoardDataController(
13-
onMoveColumn: (fromIndex, toIndex) {
13+
onMoveColumn: (fromColumnId, fromIndex, toColumnId, toIndex) {
1414
debugPrint('Move column from $fromIndex to $toIndex');
1515
},
1616
onMoveColumnItem: (columnId, fromIndex, toIndex) {

frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board_column/board_column_data.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ class AFBoardColumnData<CustomData> extends ReoderFlexItem with EquatableMixin {
145145
}) : _items = items;
146146

147147
/// Returns the readonly List<ColumnItem>
148-
UnmodifiableListView<AFColumnItem> get items => UnmodifiableListView(_items);
148+
UnmodifiableListView<AFColumnItem> get items =>
149+
UnmodifiableListView([..._items]);
149150

150151
@override
151152
List<Object?> get props => [id, ..._items];

frontend/app_flowy/packages/appflowy_board/lib/src/widgets/board_data.dart

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import 'reorder_flex/reorder_flex.dart';
88
import 'package:flutter/material.dart';
99
import 'reorder_phantom/phantom_controller.dart';
1010

11-
typedef OnMoveColumn = void Function(int fromIndex, int toIndex);
11+
typedef OnMoveColumn = void Function(
12+
String fromColumnId,
13+
int fromIndex,
14+
String toColumnId,
15+
int toIndex,
16+
);
1217

1318
typedef OnMoveColumnItem = void Function(
1419
String columnId,
@@ -98,9 +103,11 @@ class AFBoardDataController extends ChangeNotifier
98103
}
99104

100105
void moveColumn(int fromIndex, int toIndex, {bool notify = true}) {
101-
final columnData = _columnDatas.removeAt(fromIndex);
102-
_columnDatas.insert(toIndex, columnData);
103-
onMoveColumn?.call(fromIndex, toIndex);
106+
final toColumnData = _columnDatas[toIndex];
107+
final fromColumnData = _columnDatas.removeAt(fromIndex);
108+
109+
_columnDatas.insert(toIndex, fromColumnData);
110+
onMoveColumn?.call(fromColumnData.id, fromIndex, toColumnData.id, toIndex);
104111
if (notify) notifyListeners();
105112
}
106113

frontend/rust-lib/flowy-error/src/errors.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ impl FlowyError {
6666
static_flowy_error!(user_not_exist, ErrorCode::UserNotExist);
6767
static_flowy_error!(text_too_long, ErrorCode::TextTooLong);
6868
static_flowy_error!(invalid_data, ErrorCode::InvalidData);
69+
static_flowy_error!(out_of_bounds, ErrorCode::OutOfBounds);
6970
}
7071

7172
impl std::convert::From<ErrorCode> for FlowyError {

frontend/rust-lib/flowy-grid/src/dart_notification.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ pub enum GridNotification {
1111
DidUpdateRow = 30,
1212
DidUpdateCell = 40,
1313
DidUpdateField = 50,
14-
DidUpdateGroup = 60,
14+
DidUpdateGroupView = 60,
15+
DidUpdateGroup = 61,
1516
}
1617

1718
impl std::default::Default for GridNotification {

0 commit comments

Comments
 (0)