fix: dont edit every view while handling database view row change (#6506)

* fix: don't process on every view while only handling one view

* test: add test
This commit is contained in:
Richard Shiue 2024-10-09 11:01:09 +08:00 committed by GitHub
parent 93885bad7b
commit 29dc46a993
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 58 additions and 22 deletions

View File

@ -189,15 +189,46 @@ void main() {
await tester.createNewPageWithNameUnderParent(layout: ViewLayoutPB.Grid);
await tester.hoverOnFirstRowOfGrid(() async {
// Open the row menu and then click the delete
// Open the row menu and click the delete button
await tester.tapRowMenuButtonInGrid();
await tester.pumpAndSettle();
await tester.tapDeleteOnRowMenu();
await tester.pumpAndSettle();
// 3 initial rows - 1 deleted
tester.assertNumberOfRowsInGridPage(2);
});
expect(find.byType(ConfirmPopup), findsOneWidget);
await tester.tapButtonWithName(LocaleKeys.button_delete.tr());
tester.assertNumberOfRowsInGridPage(2);
});
testWidgets('delete row in two views', (tester) async {
await tester.initializeAppFlowy();
await tester.tapAnonymousSignInButton();
await tester.createNewPageWithNameUnderParent(layout: ViewLayoutPB.Grid);
await tester.renameLinkedView(
tester.findTabBarLinkViewByViewLayout(ViewLayoutPB.Grid),
'grid 1',
);
tester.assertNumberOfRowsInGridPage(3);
await tester.tapCreateLinkedDatabaseViewButton(DatabaseLayoutPB.Grid);
await tester.renameLinkedView(
tester.findTabBarLinkViewByViewLayout(ViewLayoutPB.Grid).at(1),
'grid 2',
);
tester.assertNumberOfRowsInGridPage(3);
await tester.hoverOnFirstRowOfGrid(() async {
// Open the row menu and click the delete button
await tester.tapRowMenuButtonInGrid();
await tester.tapDeleteOnRowMenu();
});
expect(find.byType(ConfirmPopup), findsOneWidget);
await tester.tapButtonWithName(LocaleKeys.button_delete.tr());
// 3 initial rows - 1 deleted
tester.assertNumberOfRowsInGridPage(2);
await tester.tapTabBarLinkedViewByViewName('grid 1');
tester.assertNumberOfRowsInGridPage(2);
});
});
}

View File

@ -119,7 +119,6 @@ void main() {
);
editorBloc.add(const FieldEditorEvent.insertLeft());
// TODO(RS): Shouldn't need to wait here!?
await gridResponseFuture();
editorBloc.add(const FieldEditorEvent.insertRight());
await gridResponseFuture();

View File

@ -131,13 +131,14 @@ pub(crate) async fn observe_view_change(database_id: &str, database_editor: &Arc
DatabaseViewChange::DidDeleteView { .. } => {},
DatabaseViewChange::LayoutSettingChanged { .. } => {},
DatabaseViewChange::DidUpdateRowOrders {
database_view_id: _,
database_view_id,
is_local_change,
insert_row_orders,
delete_row_indexes,
} => {
handle_did_update_row_orders(
database_editor,
&database_view_id,
is_local_change,
insert_row_orders,
delete_row_indexes,
@ -161,6 +162,7 @@ pub(crate) async fn observe_view_change(database_id: &str, database_editor: &Arc
async fn handle_did_update_row_orders(
database_editor: Arc<DatabaseEditor>,
view_id: &str,
is_local_change: bool,
insert_row_orders: Vec<(RowOrder, u32)>,
delete_row_indexes: Vec<u32>,
@ -200,7 +202,11 @@ async fn handle_did_update_row_orders(
},
};
for database_view in database_editor.database_views.editors().await {
if let Some(view_editor) = database_editor
.database_views
.get_view_editor(view_id)
.await
{
trace!(
"[RowOrder]: insert row:{} at index:{}, is_local:{}",
row_order.id,
@ -209,13 +215,11 @@ async fn handle_did_update_row_orders(
);
// insert row order in database view cache
database_view
.insert_row(row.clone(), index, &row_order)
.await;
view_editor.insert_row(row.clone(), index, &row_order).await;
let is_move_row = is_move_row(&database_view, &row_order, &delete_row_indexes).await;
if let Some((index, row_detail)) = database_view.v_get_row(&row_order.id).await {
database_view
let is_move_row = is_move_row(&view_editor, &row_order, &delete_row_indexes).await;
if let Some((index, row_detail)) = view_editor.v_get_row(&row_order.id).await {
view_editor
.v_did_create_row(
&row_detail,
index as u32,
@ -231,19 +235,21 @@ async fn handle_did_update_row_orders(
// handle delete row orders
for index in delete_row_indexes {
let index = index as usize;
for database_view in database_editor.database_views.editors().await {
let mut view_row_orders = database_view.row_orders.write().await;
if let Some(view_editor) = database_editor
.database_views
.get_view_editor(view_id)
.await
{
let mut view_row_orders = view_editor.row_orders.write().await;
if view_row_orders.len() > index {
let lazy_row = view_row_orders.remove(index);
// Update changeset in RowsChangePB
let row_id = lazy_row.id.to_string();
let mut row_change = row_changes
.entry(database_view.view_id.clone())
.or_default();
let mut row_change = row_changes.entry(view_editor.view_id.clone()).or_default();
row_change.deleted_rows.push(row_id);
// notify the view
if let Some(row) = database_view.row_by_row_id.get(lazy_row.id.as_str()) {
if let Some(row) = view_editor.row_by_row_id.get(lazy_row.id.as_str()) {
trace!(
"[RowOrder]: delete row:{} at index:{}, is_move_row: {}, is_local:{}",
row.id,
@ -251,7 +257,7 @@ async fn handle_did_update_row_orders(
row_change.is_move_row,
is_local_change
);
database_view
view_editor
.v_did_delete_row(&row, row_change.is_move_row, is_local_change)
.await;
} else {