From a896637eab991a9f6c176e78890f5b4cd5bb6016 Mon Sep 17 00:00:00 2001
From: appflowy <annie@appflowy.io>
Date: Wed, 24 Aug 2022 21:06:10 +0800
Subject: [PATCH] fix: reload card content

---
 .../plugins/board/application/board_bloc.dart |  5 +++-
 .../app_flowy/lib/plugins/board/board.dart    |  2 +-
 .../card/board_select_option_cell.dart        | 16 +++++------
 .../plugins/board/presentation/card/card.dart |  8 +++++-
 .../cell/cell_service/cell_data_loader.dart   | 28 +++++++++++--------
 .../cell/cell_service/context_builder.dart    |  3 +-
 .../board_column/board_column_data.dart       |  2 --
 .../flowy-grid/src/services/grid_editor.rs    | 22 +++++++++++----
 8 files changed, 54 insertions(+), 32 deletions(-)

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 7c04dec814..422f1dff2b 100644
--- a/frontend/app_flowy/lib/plugins/board/application/board_bloc.dart
+++ b/frontend/app_flowy/lib/plugins/board/application/board_bloc.dart
@@ -317,6 +317,9 @@ class GroupControllerDelegateImpl extends GroupControllerDelegate {
 
   @override
   void updateRow(String groupId, RowPB row) {
-    controller.updateColumnItem(groupId, BoardColumnItem(row: row));
+    // workaround: fix the board card reload timing issue.
+    Future.delayed(const Duration(milliseconds: 300), () {
+      controller.updateColumnItem(groupId, BoardColumnItem(row: row));
+    });
   }
 }
diff --git a/frontend/app_flowy/lib/plugins/board/board.dart b/frontend/app_flowy/lib/plugins/board/board.dart
index 213cc8bc3c..c55d7f2e17 100644
--- a/frontend/app_flowy/lib/plugins/board/board.dart
+++ b/frontend/app_flowy/lib/plugins/board/board.dart
@@ -31,7 +31,7 @@ class BoardPluginBuilder implements PluginBuilder {
 
 class BoardPluginConfig implements PluginConfig {
   @override
-  bool get creatable => true;
+  bool get creatable => false;
 }
 
 class BoardPlugin extends Plugin {
diff --git a/frontend/app_flowy/lib/plugins/board/presentation/card/board_select_option_cell.dart b/frontend/app_flowy/lib/plugins/board/presentation/card/board_select_option_cell.dart
index 373bb3c850..a51a36f99f 100644
--- a/frontend/app_flowy/lib/plugins/board/presentation/card/board_select_option_cell.dart
+++ b/frontend/app_flowy/lib/plugins/board/presentation/card/board_select_option_cell.dart
@@ -35,19 +35,17 @@ class _BoardSelectOptionCellState extends State<BoardSelectOptionCell> {
       child: BlocBuilder<BoardSelectOptionCellBloc, BoardSelectOptionCellState>(
         builder: (context, state) {
           final children = state.selectedOptions
-              .map((option) => SelectOptionTag.fromOption(
-                    context: context,
-                    option: option,
-                  ))
+              .map(
+                (option) => SelectOptionTag.fromOption(
+                  context: context,
+                  option: option,
+                ),
+              )
               .toList();
           return Align(
             alignment: Alignment.centerLeft,
             child: AbsorbPointer(
-              child: Wrap(
-                children: children,
-                spacing: 4,
-                runSpacing: 2,
-              ),
+              child: Wrap(children: children, spacing: 4, runSpacing: 2),
             ),
           );
         },
diff --git a/frontend/app_flowy/lib/plugins/board/presentation/card/card.dart b/frontend/app_flowy/lib/plugins/board/presentation/card/card.dart
index a5c7b7ba2c..226a9e8241 100644
--- a/frontend/app_flowy/lib/plugins/board/presentation/card/card.dart
+++ b/frontend/app_flowy/lib/plugins/board/presentation/card/card.dart
@@ -42,7 +42,7 @@ class _BoardCardState extends State<BoardCard> {
     _cardBloc = BoardCardBloc(
       gridId: widget.gridId,
       dataController: widget.dataController,
-    );
+    )..add(const BoardCardEvent.initial());
     super.initState();
   }
 
@@ -79,6 +79,12 @@ class _BoardCardState extends State<BoardCard> {
       },
     ).toList();
   }
+
+  @override
+  Future<void> dispose() async {
+    _cardBloc.close();
+    super.dispose();
+  }
 }
 
 class _CardMoreOption extends StatelessWidget with CardAccessory {
diff --git a/frontend/app_flowy/lib/plugins/grid/application/cell/cell_service/cell_data_loader.dart b/frontend/app_flowy/lib/plugins/grid/application/cell/cell_service/cell_data_loader.dart
index c4b3430199..a6a1ba43a9 100644
--- a/frontend/app_flowy/lib/plugins/grid/application/cell/cell_service/cell_data_loader.dart
+++ b/frontend/app_flowy/lib/plugins/grid/application/cell/cell_service/cell_data_loader.dart
@@ -24,18 +24,21 @@ class GridCellDataLoader<T> {
   Future<T?> loadData() {
     final fut = service.getCell(cellId: cellId);
     return fut.then(
-      (result) => result.fold((GridCellPB cell) {
-        try {
-          return parser.parserData(cell.data);
-        } catch (e, s) {
-          Log.error('$parser parser cellData failed, $e');
-          Log.error('Stack trace \n $s');
+      (result) => result.fold(
+        (GridCellPB cell) {
+          try {
+            return parser.parserData(cell.data);
+          } catch (e, s) {
+            Log.error('$parser parser cellData failed, $e');
+            Log.error('Stack trace \n $s');
+            return null;
+          }
+        },
+        (err) {
+          Log.error(err);
           return null;
-        }
-      }, (err) {
-        Log.error(err);
-        return null;
-      }),
+        },
+      ),
     );
   }
 }
@@ -58,7 +61,8 @@ class DateCellDataParser implements IGridCellDataParser<DateCellDataPB> {
   }
 }
 
-class SelectOptionCellDataParser implements IGridCellDataParser<SelectOptionCellDataPB> {
+class SelectOptionCellDataParser
+    implements IGridCellDataParser<SelectOptionCellDataPB> {
   @override
   SelectOptionCellDataPB? parserData(List<int> data) {
     if (data.isEmpty) {
diff --git a/frontend/app_flowy/lib/plugins/grid/application/cell/cell_service/context_builder.dart b/frontend/app_flowy/lib/plugins/grid/application/cell/cell_service/context_builder.dart
index 1068cbf36b..f3ed73b449 100644
--- a/frontend/app_flowy/lib/plugins/grid/application/cell/cell_service/context_builder.dart
+++ b/frontend/app_flowy/lib/plugins/grid/application/cell/cell_service/context_builder.dart
@@ -279,8 +279,9 @@ class IGridCellController<T, D> extends Equatable {
     _loadDataOperation?.cancel();
     _loadDataOperation = Timer(const Duration(milliseconds: 10), () {
       _cellDataLoader.loadData().then((data) {
-        _cellDataNotifier?.value = data;
+        Log.debug('$fieldId CellData: Did Get cell data');
         _cellsCache.insert(_cacheKey, GridCell(object: data));
+        _cellDataNotifier?.value = data;
       });
     });
   }
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
index 8cf03d96c1..0015ebd479 100644
--- 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
@@ -133,8 +133,6 @@ class AFBoardColumnDataController extends ChangeNotifier with EquatableMixin {
   void replaceOrInsertItem(AFColumnItem newItem) {
     final index = columnData._items.indexWhere((item) => item.id == newItem.id);
     if (index != -1) {
-      removeAt(index);
-
       columnData._items.removeAt(index);
       columnData._items.insert(index, newItem);
       notifyListeners();
diff --git a/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs b/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs
index 8974cf0539..cdc6cf6e6b 100644
--- a/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs
+++ b/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs
@@ -582,7 +582,7 @@ impl GridRevisionEditor {
 
     pub async fn move_group_row(&self, params: MoveGroupRowParams) -> FlowyResult<()> {
         let MoveGroupRowParams {
-            view_id: _,
+            view_id,
             from_row_id,
             to_group_id,
             to_row_id,
@@ -597,10 +597,22 @@ impl GridRevisionEditor {
                     .await
                 {
                     tracing::trace!("Move group row cause row data changed: {:?}", row_changeset);
-                    match self.block_manager.update_row(row_changeset).await {
-                        Ok(_) => {}
-                        Err(e) => {
-                            tracing::error!("Apply row changeset error:{:?}", e);
+
+                    let cell_changesets = row_changeset
+                        .cell_by_field_id
+                        .into_iter()
+                        .map(|(field_id, cell_rev)| CellChangesetPB {
+                            grid_id: view_id.clone(),
+                            row_id: row_changeset.row_id.clone(),
+                            field_id,
+                            content: cell_rev.data,
+                        })
+                        .collect::<Vec<CellChangesetPB>>();
+
+                    for cell_changeset in cell_changesets {
+                        match self.block_manager.update_cell(cell_changeset).await {
+                            Ok(_) => {}
+                            Err(e) => tracing::error!("Apply cell changeset error:{:?}", e),
                         }
                     }
                 }