From 24ca8da8c82bf4ad6e246ddd1c9dc76a9ac0db0e Mon Sep 17 00:00:00 2001 From: appflowy Date: Sun, 14 Aug 2022 15:15:56 +0800 Subject: [PATCH] chore: add create card notification --- .../flowy-grid/src/dart_notification.rs | 1 + .../rust-lib/flowy-grid/src/event_handler.rs | 5 +- .../flowy-grid/src/services/block_manager.rs | 39 +++++------ .../flowy-grid/src/services/grid_editor.rs | 22 ++++-- .../group/group_generator/checkbox_group.rs | 4 +- .../group/group_generator/generator.rs | 17 ++--- .../group_generator/select_option_group.rs | 10 +-- .../src/services/group/group_service.rs | 68 +++++++++++++------ .../src/services/row/row_builder.rs | 6 +- frontend/rust-lib/flowy-grid/src/util.rs | 2 +- 10 files changed, 101 insertions(+), 73 deletions(-) diff --git a/frontend/rust-lib/flowy-grid/src/dart_notification.rs b/frontend/rust-lib/flowy-grid/src/dart_notification.rs index 202b12eb81..4108da1f11 100644 --- a/frontend/rust-lib/flowy-grid/src/dart_notification.rs +++ b/frontend/rust-lib/flowy-grid/src/dart_notification.rs @@ -11,6 +11,7 @@ pub enum GridNotification { DidUpdateRow = 30, DidUpdateCell = 40, DidUpdateField = 50, + DidUpdateBoard = 60, } impl std::default::Default for GridNotification { diff --git a/frontend/rust-lib/flowy-grid/src/event_handler.rs b/frontend/rust-lib/flowy-grid/src/event_handler.rs index fa23e1f4cf..2c119c55dc 100644 --- a/frontend/rust-lib/flowy-grid/src/event_handler.rs +++ b/frontend/rust-lib/flowy-grid/src/event_handler.rs @@ -232,10 +232,7 @@ pub(crate) async fn get_row_handler( ) -> DataResult { let params: RowIdParams = data.into_inner().try_into()?; let editor = manager.get_grid_editor(¶ms.grid_id)?; - let row = editor - .get_row_rev(¶ms.row_id) - .await? - .and_then(|row_rev| Some(make_row_from_row_rev(row_rev))); + let row = editor.get_row_rev(¶ms.row_id).await?.map(make_row_from_row_rev); data_result(OptionalRowPB { row }) } 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 8da912534f..b2b6ce63fc 100644 --- a/frontend/rust-lib/flowy-grid/src/services/block_manager.rs +++ b/frontend/rust-lib/flowy-grid/src/services/block_manager.rs @@ -161,31 +161,26 @@ impl GridBlockManager { Ok(changesets) } - pub(crate) async fn move_row(&self, row_id: &str, from: usize, to: usize) -> FlowyResult<()> { - let editor = self.get_editor_from_row_id(row_id).await?; - let _ = editor.move_row(row_id, from, to).await?; + pub(crate) async fn move_row(&self, row_rev: Arc, from: usize, to: usize) -> FlowyResult<()> { + let editor = self.get_editor_from_row_id(&row_rev.id).await?; + let _ = editor.move_row(&row_rev.id, from, to).await?; - match editor.get_row_revs(Some(vec![Cow::Borrowed(row_id)])).await?.pop() { - None => {} - Some(row_rev) => { - let delete_row_id = row_rev.id.clone(); - let insert_row = InsertedRowPB { - index: Some(to as i32), - row: make_row_from_row_rev(row_rev), - }; + let delete_row_id = row_rev.id.clone(); + let insert_row = InsertedRowPB { + index: Some(to as i32), + row: make_row_from_row_rev(row_rev), + }; - let notified_changeset = GridBlockChangesetPB { - block_id: editor.block_id.clone(), - inserted_rows: vec![insert_row], - deleted_rows: vec![delete_row_id], - ..Default::default() - }; + let notified_changeset = GridBlockChangesetPB { + block_id: editor.block_id.clone(), + inserted_rows: vec![insert_row], + deleted_rows: vec![delete_row_id], + ..Default::default() + }; - let _ = self - .notify_did_update_block(&editor.block_id, notified_changeset) - .await?; - } - } + let _ = self + .notify_did_update_block(&editor.block_id, notified_changeset) + .await?; Ok(()) } 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 53c9a681bd..0bdf92ec96 100644 --- a/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs +++ b/frontend/rust-lib/flowy-grid/src/services/grid_editor.rs @@ -326,6 +326,7 @@ impl GridRevisionEditor { pub async fn delete_row(&self, row_id: &str) -> FlowyResult<()> { let _ = self.block_manager.delete_row(row_id).await?; + self.group_service.read().await.did_delete_card(row_id.to_owned()).await; Ok(()) } @@ -517,10 +518,22 @@ impl GridRevisionEditor { } pub async fn move_row(&self, row_id: &str, from: i32, to: i32) -> FlowyResult<()> { - let _ = self.block_manager.move_row(row_id, from as usize, to as usize).await?; + match self.block_manager.get_row_rev(row_id).await? { + None => tracing::warn!("Move row failed, can not find the row:{}", row_id), + Some(row_rev) => { + let _ = self + .block_manager + .move_row(row_rev.clone(), from as usize, to as usize) + .await?; + } + } Ok(()) } + pub async fn move_board_card(&self, group_id: &str, from: i32, to: i32) -> FlowyResult<()> { + self.group_service.write().await.move_card(group_id, from, to).await; + Ok(()) + } pub async fn delta_bytes(&self) -> Bytes { self.grid_pad.read().await.delta_bytes() } @@ -558,10 +571,12 @@ impl GridRevisionEditor { .group_service .write() .await - .create_board_card(&mut row_rev, group_id) + .update_board_card(&mut row_rev, group_id) .await; - self.create_row_pb(row_rev, None).await + let row_pb = self.create_row_pb(row_rev, None).await?; + self.group_service.read().await.did_create_card(group_id, &row_pb).await; + Ok(row_pb) } #[tracing::instrument(level = "trace", skip_all, err)] @@ -579,7 +594,6 @@ impl GridRevisionEditor { Ok(row_rev) } - #[tracing::instrument(level = "trace", skip_all, err)] async fn create_row_pb(&self, row_rev: RowRevision, start_row_id: Option) -> FlowyResult { let row_pb = RowPB::from(&row_rev); let block_id = row_rev.block_id.clone(); diff --git a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/checkbox_group.rs b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/checkbox_group.rs index acc8cf8715..85c135d0ee 100644 --- a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/checkbox_group.rs +++ b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/checkbox_group.rs @@ -1,4 +1,4 @@ -use crate::entities::{CheckboxGroupConfigurationPB, RowPB}; +use crate::entities::CheckboxGroupConfigurationPB; use flowy_error::FlowyResult; use flowy_grid_data_model::revision::{FieldRevision, RowRevision}; use std::sync::Arc; @@ -32,7 +32,7 @@ impl GroupActionHandler for CheckboxGroupController { self.handle_rows(row_revs, field_rev) } - fn create_card(&self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str) { + fn update_card(&self, _row_rev: &mut RowRevision, _field_rev: &FieldRevision, _group_id: &str) { todo!() } } diff --git a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/generator.rs b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/generator.rs index 856c026a80..a351913546 100644 --- a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/generator.rs +++ b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/generator.rs @@ -1,13 +1,13 @@ use crate::entities::{GroupPB, RowPB}; use crate::services::cell::{decode_any_cell_data, CellBytesParser}; use bytes::Bytes; -use flowy_error::{FlowyError, FlowyResult}; +use flowy_error::FlowyResult; use flowy_grid_data_model::revision::{ FieldRevision, GroupConfigurationRevision, RowRevision, TypeOptionDataDeserializer, }; -use futures::future::BoxFuture; + use indexmap::IndexMap; -use lib_infra::future::{BoxResultFuture, FutureResult}; + use std::marker::PhantomData; use std::sync::Arc; @@ -39,7 +39,7 @@ pub trait GroupActionHandler: Send + Sync { fn field_id(&self) -> &str; fn get_groups(&self) -> Vec; fn group_rows(&mut self, row_revs: &[Arc], field_rev: &FieldRevision) -> FlowyResult<()>; - fn create_card(&self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str); + fn update_card(&self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str); } pub trait GroupActionHandler2: Send + Sync { @@ -141,7 +141,7 @@ where for row in rows { if let Some(cell_rev) = row.cells.get(&self.field_id) { let mut records: Vec = vec![]; - let cell_bytes = decode_any_cell_data(cell_rev.data.clone(), &field_rev); + let cell_bytes = decode_any_cell_data(cell_rev.data.clone(), field_rev); let cell_data = cell_bytes.parser::

()?; for group in self.groups_map.values() { if self.can_group(&group.content, &cell_data) { @@ -168,13 +168,6 @@ where Ok(()) } - - pub fn group_rows(&mut self, rows: &[Arc]) -> FlowyResult<()> { - for row in rows { - // let _ = self.handle_row(row)?; - } - Ok(()) - } } struct GroupRecord { diff --git a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/select_option_group.rs b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/select_option_group.rs index a3a133b24c..50628875a8 100644 --- a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/select_option_group.rs +++ b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/select_option_group.rs @@ -1,8 +1,8 @@ -use crate::entities::{RowPB, SelectOptionGroupConfigurationPB}; +use crate::entities::SelectOptionGroupConfigurationPB; use crate::services::cell::insert_select_option_cell; -use flowy_error::{FlowyError, FlowyResult}; +use flowy_error::FlowyResult; use flowy_grid_data_model::revision::{FieldRevision, RowRevision}; -use lib_infra::future::FutureResult; + use std::sync::Arc; use crate::services::field::{ @@ -40,7 +40,7 @@ impl GroupActionHandler for SingleSelectGroupController { self.handle_rows(row_revs, field_rev) } - fn create_card(&self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str) { + fn update_card(&self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str) { let group: Option<&Group> = self.groups_map.get(group_id); match group { None => {} @@ -105,7 +105,7 @@ impl GroupActionHandler for MultiSelectGroupController { self.handle_rows(row_revs, field_rev) } - fn create_card(&self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str) { + fn update_card(&self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str) { let group: Option<&Group> = self.groups_map.get(group_id); match group { None => tracing::warn!("Can not find the group: {}", group_id), diff --git a/frontend/rust-lib/flowy-grid/src/services/group/group_service.rs b/frontend/rust-lib/flowy-grid/src/services/group/group_service.rs index fa5f805b7f..3fd84d014c 100644 --- a/frontend/rust-lib/flowy-grid/src/services/group/group_service.rs +++ b/frontend/rust-lib/flowy-grid/src/services/group/group_service.rs @@ -1,20 +1,21 @@ -use crate::services::block_manager::GridBlockManager; -use crate::services::grid_editor_task::GridServiceTaskScheduler; -use crate::services::group::{ - CheckboxGroupController, Group, GroupActionHandler, GroupCellContentProvider, MultiSelectGroupController, - SingleSelectGroupController, -}; - +use crate::dart_notification::{send_dart_notification, GridNotification}; use crate::entities::{ - CheckboxGroupConfigurationPB, CreateBoardCardParams, DateGroupConfigurationPB, FieldType, GroupPB, + BoardCardChangesetPB, CheckboxGroupConfigurationPB, DateGroupConfigurationPB, FieldType, GroupPB, NumberGroupConfigurationPB, RowPB, SelectOptionGroupConfigurationPB, TextGroupConfigurationPB, UrlGroupConfigurationPB, }; +use crate::services::block_manager::GridBlockManager; +use crate::services::grid_editor_task::GridServiceTaskScheduler; +use crate::services::group::{ + CheckboxGroupController, GroupActionHandler, GroupCellContentProvider, MultiSelectGroupController, + SingleSelectGroupController, +}; + use bytes::Bytes; use flowy_error::FlowyResult; use flowy_grid_data_model::revision::{gen_grid_group_id, FieldRevision, GroupConfigurationRevision, RowRevision}; use flowy_sync::client_grid::GridRevisionPad; -use futures::future::BoxFuture; + use std::sync::Arc; use tokio::sync::RwLock; @@ -63,21 +64,17 @@ impl GridGroupService { } #[tracing::instrument(level = "debug", skip(self, row_rev))] - pub(crate) async fn create_board_card(&self, row_rev: &mut RowRevision, group_id: &str) { + pub(crate) async fn update_board_card(&self, row_rev: &mut RowRevision, group_id: &str) { if let Some(group_action_handler) = self.group_action_handler.as_ref() { - match self - .grid_pad - .read() - .await - .get_field_rev(group_action_handler.read().await.field_id()) - { + let field_id = group_action_handler.read().await.field_id().to_owned(); + + match self.grid_pad.read().await.get_field_rev(&field_id) { None => tracing::warn!("Fail to create card because the field does not exist"), Some((_, field_rev)) => { - tracing::trace!("Create card"); group_action_handler .write() .await - .create_card(row_rev, field_rev, group_id); + .update_card(row_rev, field_rev, group_id); } } } @@ -97,6 +94,37 @@ impl GridGroupService { } } + pub async fn move_card(&self, _group_id: &str, _from: i32, _to: i32) { + // BoardCardChangesetPB { + // group_id: "".to_string(), + // inserted_cards: vec![], + // deleted_cards: vec![], + // updated_cards: vec![] + // } + // let row_pb = make_row_from_row_rev(row_rev); + todo!() + } + + pub async fn did_delete_card(&self, _row_id: String) { + // let changeset = BoardCardChangesetPB::delete(group_id.to_owned(), vec![row_id]); + // self.notify_did_update_board(changeset).await; + todo!() + } + + pub async fn did_create_card(&self, group_id: &str, row_pb: &RowPB) { + let changeset = BoardCardChangesetPB::insert(group_id.to_owned(), vec![row_pb.clone()]); + self.notify_did_update_board(changeset).await; + } + + pub async fn notify_did_update_board(&self, changeset: BoardCardChangesetPB) { + if self.group_action_handler.is_none() { + return; + } + send_dart_notification(&changeset.group_id, GridNotification::DidUpdateBoard) + .payload(changeset) + .send(); + } + #[tracing::instrument(level = "trace", skip_all, err)] async fn build_groups( &mut self, @@ -158,7 +186,7 @@ fn find_group_field(field_revs: &[Arc]) -> Option> {} fn default_group_configuration(field_rev: &FieldRevision) -> GroupConfigurationRevision { - let field_type: FieldType = field_rev.field_type_rev.clone().into(); + let field_type: FieldType = field_rev.field_type_rev.into(); let bytes: Bytes = match field_type { FieldType::RichText => TextGroupConfigurationPB::default().try_into().unwrap(), FieldType::Number => NumberGroupConfigurationPB::default().try_into().unwrap(), @@ -171,7 +199,7 @@ fn default_group_configuration(field_rev: &FieldRevision) -> GroupConfigurationR GroupConfigurationRevision { id: gen_grid_group_id(), field_id: field_rev.id.clone(), - field_type_rev: field_rev.field_type_rev.clone(), + field_type_rev: field_rev.field_type_rev, content: Some(bytes.to_vec()), } } diff --git a/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs b/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs index 016bbea128..ee586b3851 100644 --- a/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs +++ b/frontend/rust-lib/flowy-grid/src/services/row/row_builder.rs @@ -1,8 +1,8 @@ use crate::services::cell::{ - apply_cell_data_changeset, insert_checkbox_cell, insert_date_cell, insert_number_cell, insert_select_option_cell, - insert_text_cell, insert_url_cell, + insert_checkbox_cell, insert_date_cell, insert_number_cell, insert_select_option_cell, insert_text_cell, + insert_url_cell, }; -use crate::services::field::{DateCellChangesetPB, SelectOptionCellChangeset}; + use flowy_grid_data_model::revision::{gen_row_id, CellRevision, FieldRevision, RowRevision, DEFAULT_ROW_HEIGHT}; use indexmap::IndexMap; use std::collections::HashMap; diff --git a/frontend/rust-lib/flowy-grid/src/util.rs b/frontend/rust-lib/flowy-grid/src/util.rs index 047c81ab02..90bf2f2a26 100644 --- a/frontend/rust-lib/flowy-grid/src/util.rs +++ b/frontend/rust-lib/flowy-grid/src/util.rs @@ -76,7 +76,7 @@ pub fn make_default_board() -> BuildGridContext { let multi_select_type_option = MultiSelectTypeOptionBuilder::default() .add_option(banana_option.clone()) .add_option(apple_option.clone()) - .add_option(pear_option.clone()); + .add_option(pear_option); let multi_select_field = FieldBuilder::new(multi_select_type_option) .name("Fruit") .visibility(true)