diff --git a/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart b/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart index c31a0660aa..8a683e8d91 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/row/row_service.dart @@ -43,7 +43,7 @@ class GridRowCacheService { _delegate = delegate { // delegate.onFieldsChanged(() => _notifier.receive(const GridRowChangeReason.fieldDidChange())); - _rows = block.rowInfos.map((rowInfo) => buildGridRow(rowInfo)).toList(); + _rows = block.rowInfos.map((rowInfo) => buildGridRow(rowInfo.rowId, rowInfo.height.toDouble())).toList(); } Future dispose() async { @@ -52,7 +52,7 @@ class GridRowCacheService { await _cellCache.dispose(); } - void applyChangesets(List changesets) { + void applyChangesets(List changesets) { for (final changeset in changesets) { _deleteRows(changeset.deletedRows); _insertRows(changeset.insertedRows); @@ -80,7 +80,7 @@ class GridRowCacheService { _notifier.receive(GridRowChangeReason.delete(deletedIndex)); } - void _insertRows(List insertRows) { + void _insertRows(List insertRows) { if (insertRows.isEmpty) { return; } @@ -90,16 +90,16 @@ class GridRowCacheService { for (final insertRow in insertRows) { final insertIndex = InsertedIndex( index: insertRow.index, - rowId: insertRow.rowInfo.rowId, + rowId: insertRow.rowId, ); insertIndexs.add(insertIndex); - newRows.insert(insertRow.index, (buildGridRow(insertRow.rowInfo))); + newRows.insert(insertRow.index, (buildGridRow(insertRow.rowId, insertIndex.row.height))); } _notifier.receive(GridRowChangeReason.insert(insertIndexs)); } - void _updateRows(List updatedRows) { + void _updateRows(List updatedRows) { if (updatedRows.isEmpty) { return; } @@ -107,14 +107,13 @@ class GridRowCacheService { final UpdatedIndexs updatedIndexs = UpdatedIndexs(); final List newRows = _rows; for (final updatedRow in updatedRows) { - final rowOrder = updatedRow.rowInfo; - final rowId = updatedRow.rowInfo.rowId; + final rowId = updatedRow.rowId; final index = newRows.indexWhere((row) => row.rowId == rowId); if (index != -1) { _rowByRowId[rowId] = updatedRow.row; newRows.removeAt(index); - newRows.insert(index, buildGridRow(rowOrder)); + newRows.insert(index, buildGridRow(rowId, updatedRow.row.height.toDouble())); updatedIndexs[rowId] = UpdatedIndex(index: index, rowId: rowId); } } @@ -226,13 +225,13 @@ class GridRowCacheService { } } - GridRow buildGridRow(BlockRowInfo rowInfo) { + GridRow buildGridRow(String rowId, double rowHeight) { return GridRow( gridId: gridId, blockId: block.id, fields: _delegate.fields, - rowId: rowInfo.rowId, - height: rowInfo.height.toDouble(), + rowId: rowId, + height: rowHeight, ); } } diff --git a/frontend/rust-lib/flowy-grid/src/entities/block_entities.rs b/frontend/rust-lib/flowy-grid/src/entities/block_entities.rs index 5ff7fea0f4..9c856340ac 100644 --- a/frontend/rust-lib/flowy-grid/src/entities/block_entities.rs +++ b/frontend/rust-lib/flowy-grid/src/entities/block_entities.rs @@ -104,39 +104,54 @@ impl std::convert::From> for RepeatedGridBlock { } #[derive(Debug, Clone, Default, ProtoBuf)] -pub struct IndexRowOrder { +pub struct InsertedRow { #[pb(index = 1)] - pub row_info: BlockRowInfo, + pub block_id: String, - #[pb(index = 2, one_of)] + #[pb(index = 2)] + pub row_id: String, + + #[pb(index = 3)] + pub height: i32, + + #[pb(index = 4, one_of)] pub index: Option, } #[derive(Debug, Default, ProtoBuf)] -pub struct UpdatedRowOrder { +pub struct UpdatedRow { #[pb(index = 1)] - pub row_info: BlockRowInfo, + pub block_id: String, #[pb(index = 2)] + pub row_id: String, + + #[pb(index = 3)] pub row: Row, } -impl UpdatedRowOrder { +impl UpdatedRow { pub fn new(row_rev: &RowRevision, row: Row) -> Self { Self { - row_info: BlockRowInfo::from(row_rev), + row_id: row_rev.id.clone(), + block_id: row_rev.block_id.clone(), row, } } } -impl std::convert::From for IndexRowOrder { +impl std::convert::From for InsertedRow { fn from(row_info: BlockRowInfo) -> Self { - Self { row_info, index: None } + Self { + row_id: row_info.row_id, + block_id: row_info.block_id, + height: row_info.height, + index: None, + } } } -impl std::convert::From<&RowRevision> for IndexRowOrder { +impl std::convert::From<&RowRevision> for InsertedRow { fn from(row: &RowRevision) -> Self { let row_order = BlockRowInfo::from(row); Self::from(row_order) @@ -144,21 +159,21 @@ impl std::convert::From<&RowRevision> for IndexRowOrder { } #[derive(Debug, Default, ProtoBuf)] -pub struct GridRowsChangeset { +pub struct GridBlockChangeset { #[pb(index = 1)] pub block_id: String, #[pb(index = 2)] - pub inserted_rows: Vec, + pub inserted_rows: Vec, #[pb(index = 3)] pub deleted_rows: Vec, #[pb(index = 4)] - pub updated_rows: Vec, + pub updated_rows: Vec, } -impl GridRowsChangeset { - pub fn insert(block_id: &str, inserted_rows: Vec) -> Self { +impl GridBlockChangeset { + pub fn insert(block_id: &str, inserted_rows: Vec) -> Self { Self { block_id: block_id.to_owned(), inserted_rows, @@ -176,7 +191,7 @@ impl GridRowsChangeset { } } - pub fn update(block_id: &str, updated_rows: Vec) -> Self { + pub fn update(block_id: &str, updated_rows: Vec) -> Self { Self { block_id: block_id.to_owned(), inserted_rows: vec![], diff --git a/frontend/rust-lib/flowy-grid/src/services/block_manager.rs b/frontend/rust-lib/flowy-grid/src/services/block_manager.rs index 9594beab33..31e0632370 100644 --- a/frontend/rust-lib/flowy-grid/src/services/block_manager.rs +++ b/frontend/rust-lib/flowy-grid/src/services/block_manager.rs @@ -1,5 +1,5 @@ use crate::dart_notification::{send_dart_notification, GridNotification}; -use crate::entities::{BlockRowInfo, CellChangeset, GridRowId, GridRowsChangeset, IndexRowOrder, Row, UpdatedRowOrder}; +use crate::entities::{BlockRowInfo, CellChangeset, GridBlockChangeset, GridRowId, InsertedRow, Row, UpdatedRow}; use crate::manager::GridUser; use crate::services::block_revision_editor::GridBlockRevisionEditor; use crate::services::persistence::block_index::BlockIndexCache; @@ -71,12 +71,12 @@ impl GridBlockManager { let _ = self.persistence.insert(&row_rev.block_id, &row_rev.id)?; let editor = self.get_editor(&row_rev.block_id).await?; - let mut index_row_order = IndexRowOrder::from(&row_rev); + let mut index_row_order = InsertedRow::from(&row_rev); let (row_count, row_index) = editor.create_row(row_rev, start_row_id).await?; index_row_order.index = row_index; let _ = self - .notify_did_update_block(block_id, GridRowsChangeset::insert(block_id, vec![index_row_order])) + .notify_did_update_block(block_id, GridBlockChangeset::insert(block_id, vec![index_row_order])) .await?; Ok(row_count) } @@ -92,7 +92,7 @@ impl GridBlockManager { let mut row_count = 0; for row in row_revs { let _ = self.persistence.insert(&row.block_id, &row.id)?; - let mut row_order = IndexRowOrder::from(&row); + let mut row_order = InsertedRow::from(&row); let (count, index) = editor.create_row(row, None).await?; row_count = count; row_order.index = index; @@ -101,7 +101,7 @@ impl GridBlockManager { changesets.push(GridBlockMetaRevisionChangeset::from_row_count(&block_id, row_count)); let _ = self - .notify_did_update_block(&block_id, GridRowsChangeset::insert(&block_id, inserted_row_orders)) + .notify_did_update_block(&block_id, GridBlockChangeset::insert(&block_id, inserted_row_orders)) .await?; } @@ -118,8 +118,8 @@ impl GridBlockManager { None => tracing::error!("Internal error: can't find the row with id: {}", changeset.row_id), Some(row_rev) => { if let Some(row) = row_builder(row_rev.clone()) { - let row_order = UpdatedRowOrder::new(&row_rev, row); - let block_order_changeset = GridRowsChangeset::update(&editor.block_id, vec![row_order]); + let row_order = UpdatedRow::new(&row_rev, row); + let block_order_changeset = GridBlockChangeset::update(&editor.block_id, vec![row_order]); let _ = self .notify_did_update_block(&editor.block_id, block_order_changeset) .await?; @@ -144,7 +144,7 @@ impl GridBlockManager { row_id: row_info.row_id, }; let _ = self - .notify_did_update_block(&block_id, GridRowsChangeset::delete(&block_id, vec![row_identifier])) + .notify_did_update_block(&block_id, GridBlockChangeset::delete(&block_id, vec![row_identifier])) .await?; } } @@ -179,18 +179,19 @@ impl GridBlockManager { match editor.get_row_revs(Some(vec![Cow::Borrowed(row_id)])).await?.pop() { None => {} Some(row_rev) => { - let row_info = BlockRowInfo::from(&row_rev); - let insert_row = IndexRowOrder { - row_info: row_info.clone(), + let insert_row = InsertedRow { + block_id: row_rev.block_id.clone(), + row_id: row_rev.id.clone(), index: Some(to as i32), + height: row_rev.height, }; let deleted_row = GridRowId { grid_id: self.grid_id.clone(), - block_id: row_info.block_id, - row_id: row_info.row_id, + block_id: row_rev.block_id.clone(), + row_id: row_rev.id.clone(), }; - let notified_changeset = GridRowsChangeset { + let notified_changeset = GridBlockChangeset { block_id: editor.block_id.clone(), inserted_rows: vec![insert_row], deleted_rows: vec![deleted_row], @@ -257,7 +258,7 @@ impl GridBlockManager { Ok(snapshots) } - async fn notify_did_update_block(&self, block_id: &str, changeset: GridRowsChangeset) -> FlowyResult<()> { + async fn notify_did_update_block(&self, block_id: &str, changeset: GridBlockChangeset) -> FlowyResult<()> { send_dart_notification(block_id, GridNotification::DidUpdateGridBlock) .payload(changeset) .send(); diff --git a/frontend/rust-lib/flowy-grid/src/services/filter/filter_service.rs b/frontend/rust-lib/flowy-grid/src/services/filter/filter_service.rs index 54e2984bd9..28a5bae255 100644 --- a/frontend/rust-lib/flowy-grid/src/services/filter/filter_service.rs +++ b/frontend/rust-lib/flowy-grid/src/services/filter/filter_service.rs @@ -1,5 +1,7 @@ +use crate::dart_notification::{send_dart_notification, GridNotification}; use crate::entities::{ - FieldType, GridCheckboxFilter, GridDateFilter, GridNumberFilter, GridSelectOptionFilter, GridTextFilter, + FieldType, GridBlockChangeset, GridCheckboxFilter, GridDateFilter, GridNumberFilter, GridRowId, + GridSelectOptionFilter, GridTextFilter, InsertedRow, }; use crate::services::block_manager::GridBlockManager; use crate::services::grid_editor_task::GridServiceTaskScheduler; @@ -51,20 +53,43 @@ impl GridFilterService { .map(|field_rev| (field_rev.id.clone(), field_rev)) .collect::>>(); - let mut show_rows = vec![]; - let mut hide_rows = vec![]; - for block in task_context.blocks { + let mut changesets = vec![]; + for (index, block) in task_context.blocks.into_iter().enumerate() { + let mut inserted_rows = vec![]; + let mut deleted_rows = vec![]; block.row_revs.iter().for_each(|row_rev| { - let result = filter_row(row_rev, &self.filter_cache, &self.filter_result_cache, &field_revs); - - if result.is_row_hidden() { - hide_rows.push(result.row_id); + let result = filter_row( + index, + row_rev, + &self.filter_cache, + &self.filter_result_cache, + &field_revs, + ); + if result.is_visible() { + inserted_rows.push(InsertedRow { + row_id: Default::default(), + block_id: Default::default(), + height: 1, + index: Some(result.row_index), + }); } else { - show_rows.push(result.row_id); + deleted_rows.push(GridRowId { + grid_id: self.grid_id.clone(), + block_id: block.block_id.clone(), + row_id: result.row_id, + }); } }); + + let changeset = GridBlockChangeset { + block_id: block.block_id, + inserted_rows, + deleted_rows, + updated_rows: vec![], + }; + changesets.push(changeset); } - self.notify(hide_rows, show_rows).await; + self.notify(changesets).await; Ok(()) } @@ -101,21 +126,23 @@ impl GridFilterService { } } - async fn notify(&self, _hide_rows: Vec, _show_rows: Vec) { - // let notification = GridNotification {}; - // send_dart_notification(grid_id, GridNotification::DidUpdateGridBlock) - // .payload(notification) - // .send(); + async fn notify(&self, changesets: Vec) { + for changeset in changesets { + send_dart_notification(&self.grid_id, GridNotification::DidUpdateGridBlock) + .payload(changeset) + .send(); + } } } fn filter_row( + index: usize, row_rev: &Arc, _filter_cache: &Arc>, _filter_result_cache: &Arc>, _field_revs: &HashMap>, ) -> FilterResult { - let filter_result = FilterResult::new(row_rev); + let filter_result = FilterResult::new(index as i32, row_rev); row_rev.cells.iter().for_each(|(_k, cell_rev)| { let _cell_rev: &CellRevision = cell_rev; }); @@ -167,13 +194,14 @@ impl FilterResultCache { #[derive(Default)] struct FilterResult { row_id: String, - #[allow(dead_code)] + row_index: i32, cell_by_field_id: HashMap, } impl FilterResult { - fn new(row_rev: &RowRevision) -> Self { + fn new(index: i32, row_rev: &RowRevision) -> Self { Self { + row_index: index, row_id: row_rev.id.clone(), cell_by_field_id: row_rev.cells.iter().map(|(k, _)| (k.clone(), true)).collect(), } @@ -184,7 +212,7 @@ impl FilterResult { self.cell_by_field_id.insert(cell_id.to_owned(), exist); } - fn is_row_hidden(&self) -> bool { + fn is_visible(&self) -> bool { todo!() } }