mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2025-11-10 15:38:08 +00:00
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:
parent
93885bad7b
commit
29dc46a993
@ -189,15 +189,46 @@ void main() {
|
|||||||
|
|
||||||
await tester.createNewPageWithNameUnderParent(layout: ViewLayoutPB.Grid);
|
await tester.createNewPageWithNameUnderParent(layout: ViewLayoutPB.Grid);
|
||||||
await tester.hoverOnFirstRowOfGrid(() async {
|
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.tapRowMenuButtonInGrid();
|
||||||
await tester.pumpAndSettle();
|
|
||||||
await tester.tapDeleteOnRowMenu();
|
await tester.tapDeleteOnRowMenu();
|
||||||
await tester.pumpAndSettle();
|
});
|
||||||
|
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
|
// 3 initial rows - 1 deleted
|
||||||
tester.assertNumberOfRowsInGridPage(2);
|
tester.assertNumberOfRowsInGridPage(2);
|
||||||
|
|
||||||
|
await tester.tapTabBarLinkedViewByViewName('grid 1');
|
||||||
|
tester.assertNumberOfRowsInGridPage(2);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -119,7 +119,6 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
editorBloc.add(const FieldEditorEvent.insertLeft());
|
editorBloc.add(const FieldEditorEvent.insertLeft());
|
||||||
// TODO(RS): Shouldn't need to wait here!?
|
|
||||||
await gridResponseFuture();
|
await gridResponseFuture();
|
||||||
editorBloc.add(const FieldEditorEvent.insertRight());
|
editorBloc.add(const FieldEditorEvent.insertRight());
|
||||||
await gridResponseFuture();
|
await gridResponseFuture();
|
||||||
|
|||||||
@ -131,13 +131,14 @@ pub(crate) async fn observe_view_change(database_id: &str, database_editor: &Arc
|
|||||||
DatabaseViewChange::DidDeleteView { .. } => {},
|
DatabaseViewChange::DidDeleteView { .. } => {},
|
||||||
DatabaseViewChange::LayoutSettingChanged { .. } => {},
|
DatabaseViewChange::LayoutSettingChanged { .. } => {},
|
||||||
DatabaseViewChange::DidUpdateRowOrders {
|
DatabaseViewChange::DidUpdateRowOrders {
|
||||||
database_view_id: _,
|
database_view_id,
|
||||||
is_local_change,
|
is_local_change,
|
||||||
insert_row_orders,
|
insert_row_orders,
|
||||||
delete_row_indexes,
|
delete_row_indexes,
|
||||||
} => {
|
} => {
|
||||||
handle_did_update_row_orders(
|
handle_did_update_row_orders(
|
||||||
database_editor,
|
database_editor,
|
||||||
|
&database_view_id,
|
||||||
is_local_change,
|
is_local_change,
|
||||||
insert_row_orders,
|
insert_row_orders,
|
||||||
delete_row_indexes,
|
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(
|
async fn handle_did_update_row_orders(
|
||||||
database_editor: Arc<DatabaseEditor>,
|
database_editor: Arc<DatabaseEditor>,
|
||||||
|
view_id: &str,
|
||||||
is_local_change: bool,
|
is_local_change: bool,
|
||||||
insert_row_orders: Vec<(RowOrder, u32)>,
|
insert_row_orders: Vec<(RowOrder, u32)>,
|
||||||
delete_row_indexes: Vec<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!(
|
trace!(
|
||||||
"[RowOrder]: insert row:{} at index:{}, is_local:{}",
|
"[RowOrder]: insert row:{} at index:{}, is_local:{}",
|
||||||
row_order.id,
|
row_order.id,
|
||||||
@ -209,13 +215,11 @@ async fn handle_did_update_row_orders(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// insert row order in database view cache
|
// insert row order in database view cache
|
||||||
database_view
|
view_editor.insert_row(row.clone(), index, &row_order).await;
|
||||||
.insert_row(row.clone(), index, &row_order)
|
|
||||||
.await;
|
|
||||||
|
|
||||||
let is_move_row = is_move_row(&database_view, &row_order, &delete_row_indexes).await;
|
let is_move_row = is_move_row(&view_editor, &row_order, &delete_row_indexes).await;
|
||||||
if let Some((index, row_detail)) = database_view.v_get_row(&row_order.id).await {
|
if let Some((index, row_detail)) = view_editor.v_get_row(&row_order.id).await {
|
||||||
database_view
|
view_editor
|
||||||
.v_did_create_row(
|
.v_did_create_row(
|
||||||
&row_detail,
|
&row_detail,
|
||||||
index as u32,
|
index as u32,
|
||||||
@ -231,19 +235,21 @@ async fn handle_did_update_row_orders(
|
|||||||
// handle delete row orders
|
// handle delete row orders
|
||||||
for index in delete_row_indexes {
|
for index in delete_row_indexes {
|
||||||
let index = index as usize;
|
let index = index as usize;
|
||||||
for database_view in database_editor.database_views.editors().await {
|
if let Some(view_editor) = database_editor
|
||||||
let mut view_row_orders = database_view.row_orders.write().await;
|
.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 {
|
if view_row_orders.len() > index {
|
||||||
let lazy_row = view_row_orders.remove(index);
|
let lazy_row = view_row_orders.remove(index);
|
||||||
// Update changeset in RowsChangePB
|
// Update changeset in RowsChangePB
|
||||||
let row_id = lazy_row.id.to_string();
|
let row_id = lazy_row.id.to_string();
|
||||||
let mut row_change = row_changes
|
let mut row_change = row_changes.entry(view_editor.view_id.clone()).or_default();
|
||||||
.entry(database_view.view_id.clone())
|
|
||||||
.or_default();
|
|
||||||
row_change.deleted_rows.push(row_id);
|
row_change.deleted_rows.push(row_id);
|
||||||
|
|
||||||
// notify the view
|
// 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!(
|
trace!(
|
||||||
"[RowOrder]: delete row:{} at index:{}, is_move_row: {}, is_local:{}",
|
"[RowOrder]: delete row:{} at index:{}, is_move_row: {}, is_local:{}",
|
||||||
row.id,
|
row.id,
|
||||||
@ -251,7 +257,7 @@ async fn handle_did_update_row_orders(
|
|||||||
row_change.is_move_row,
|
row_change.is_move_row,
|
||||||
is_local_change
|
is_local_change
|
||||||
);
|
);
|
||||||
database_view
|
view_editor
|
||||||
.v_did_delete_row(&row, row_change.is_move_row, is_local_change)
|
.v_did_delete_row(&row, row_change.is_move_row, is_local_change)
|
||||||
.await;
|
.await;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user