2022-03-24 17:09:05 +08:00
use crate ::dart_notification ::{ send_dart_notification , GridNotification } ;
2022-07-25 13:15:11 +08:00
use crate ::entities ::GridCellIdParams ;
2022-07-08 15:06:50 +08:00
use crate ::entities ::* ;
2022-06-29 16:55:52 +08:00
use crate ::manager ::{ GridTaskSchedulerRwLock , GridUser } ;
2022-06-15 15:13:50 +08:00
use crate ::services ::block_manager ::GridBlockManager ;
2022-08-17 14:33:45 +08:00
2022-07-13 17:25:03 +08:00
use crate ::services ::cell ::{ apply_cell_data_changeset , decode_any_cell_data , CellBytes } ;
2022-04-21 20:37:05 +08:00
use crate ::services ::field ::{ default_type_option_builder_from_type , type_option_builder_from_bytes , FieldBuilder } ;
2022-08-15 20:07:01 +08:00
use crate ::services ::filter ::GridFilterService ;
use crate ::services ::grid_view_manager ::GridViewManager ;
2022-05-26 17:28:44 +08:00
use crate ::services ::persistence ::block_index ::BlockIndexCache ;
2022-08-18 21:43:05 +08:00
use crate ::services ::row ::{ make_grid_blocks , make_rows_from_row_revs , GridBlockSnapshot , RowRevisionBuilder } ;
2022-03-11 21:36:00 +08:00
use bytes ::Bytes ;
2022-03-27 09:35:10 +08:00
use flowy_error ::{ ErrorCode , FlowyError , FlowyResult } ;
2022-06-15 15:13:50 +08:00
use flowy_grid_data_model ::revision ::* ;
2022-03-24 17:09:05 +08:00
use flowy_revision ::{ RevisionCloudService , RevisionCompactor , RevisionManager , RevisionObjectBuilder } ;
2022-08-14 23:01:53 +08:00
use flowy_sync ::client_grid ::{ GridRevisionChangeset , GridRevisionPad , JsonDeserializer } ;
2022-03-19 16:52:28 +08:00
use flowy_sync ::entities ::revision ::Revision ;
2022-10-11 01:04:13 +08:00
use flowy_sync ::errors ::{ CollaborateError , CollaborateResult } ;
2022-10-10 11:56:48 +08:00
use flowy_sync ::util ::make_operations_from_revisions ;
2022-08-26 16:07:51 +08:00
use lib_infra ::future ::{ wrap_future , FutureResult } ;
2022-08-15 20:07:01 +08:00
2022-10-10 11:56:48 +08:00
use lib_ot ::core ::EmptyAttributes ;
2022-03-24 17:09:05 +08:00
use std ::collections ::HashMap ;
2022-03-04 18:11:12 +08:00
use std ::sync ::Arc ;
2022-03-05 10:59:44 +08:00
use tokio ::sync ::RwLock ;
2022-03-04 18:11:12 +08:00
2022-06-20 09:37:52 +08:00
pub struct GridRevisionEditor {
2022-08-15 20:07:01 +08:00
pub grid_id : String ,
2022-03-05 10:59:44 +08:00
user : Arc < dyn GridUser > ,
2022-06-15 15:13:50 +08:00
grid_pad : Arc < RwLock < GridRevisionPad > > ,
2022-08-15 20:07:01 +08:00
view_manager : Arc < GridViewManager > ,
2022-03-04 18:11:12 +08:00
rev_manager : Arc < RevisionManager > ,
2022-05-26 17:28:44 +08:00
block_manager : Arc < GridBlockManager > ,
2022-08-14 23:11:30 +08:00
2022-06-29 16:55:52 +08:00
#[ allow(dead_code) ]
2022-06-29 13:44:15 +08:00
pub ( crate ) filter_service : Arc < GridFilterService > ,
2022-03-04 18:11:12 +08:00
}
2022-06-20 09:37:52 +08:00
impl Drop for GridRevisionEditor {
2022-05-26 17:28:44 +08:00
fn drop ( & mut self ) {
2022-06-29 13:44:15 +08:00
tracing ::trace! ( " Drop GridRevisionEditor " ) ;
2022-05-26 17:28:44 +08:00
}
}
2022-06-20 09:37:52 +08:00
impl GridRevisionEditor {
2022-03-04 18:11:12 +08:00
pub async fn new (
2022-03-04 22:09:16 +08:00
grid_id : & str ,
2022-03-05 10:59:44 +08:00
user : Arc < dyn GridUser > ,
mut rev_manager : RevisionManager ,
2022-05-26 17:28:44 +08:00
persistence : Arc < BlockIndexCache > ,
2022-06-29 16:55:52 +08:00
task_scheduler : GridTaskSchedulerRwLock ,
2022-03-04 22:09:16 +08:00
) -> FlowyResult < Arc < Self > > {
2022-03-05 10:59:44 +08:00
let token = user . token ( ) ? ;
let cloud = Arc ::new ( GridRevisionCloudService { token } ) ;
2022-03-12 21:06:15 +08:00
let grid_pad = rev_manager . load ::< GridPadBuilder > ( Some ( cloud ) ) . await ? ;
2022-03-04 18:11:12 +08:00
let rev_manager = Arc ::new ( rev_manager ) ;
2022-04-18 17:17:42 +08:00
let grid_pad = Arc ::new ( RwLock ::new ( grid_pad ) ) ;
2022-08-14 23:11:30 +08:00
2022-08-15 20:07:01 +08:00
// Block manager
2022-06-29 13:44:15 +08:00
let block_meta_revs = grid_pad . read ( ) . await . get_block_meta_revs ( ) ;
2022-08-15 20:07:01 +08:00
let block_manager = Arc ::new ( GridBlockManager ::new ( & user , block_meta_revs , persistence ) . await ? ) ;
2022-06-30 23:00:03 +08:00
let filter_service =
2022-08-13 23:26:42 +08:00
GridFilterService ::new ( grid_pad . clone ( ) , block_manager . clone ( ) , task_scheduler . clone ( ) ) . await ;
2022-08-15 20:07:01 +08:00
// View manager
let view_manager = Arc ::new (
GridViewManager ::new (
2022-08-17 08:14:25 +08:00
grid_id . to_owned ( ) ,
2022-08-15 20:07:01 +08:00
user . clone ( ) ,
2022-08-17 08:14:25 +08:00
Arc ::new ( grid_pad . clone ( ) ) ,
Arc ::new ( block_manager . clone ( ) ) ,
2022-08-15 20:07:01 +08:00
Arc ::new ( task_scheduler . clone ( ) ) ,
)
. await ? ,
) ;
2022-06-29 13:44:15 +08:00
let editor = Arc ::new ( Self {
2022-03-05 10:59:44 +08:00
grid_id : grid_id . to_owned ( ) ,
user ,
2022-04-18 17:17:42 +08:00
grid_pad ,
2022-03-04 18:11:12 +08:00
rev_manager ,
2022-06-29 13:44:15 +08:00
block_manager ,
2022-08-15 20:07:01 +08:00
view_manager ,
2022-08-13 23:26:42 +08:00
filter_service : Arc ::new ( filter_service ) ,
2022-06-29 13:44:15 +08:00
} ) ;
Ok ( editor )
2022-03-04 18:11:12 +08:00
}
2022-05-10 09:33:34 +08:00
pub async fn update_field_type_option (
& self ,
grid_id : & str ,
field_id : & str ,
type_option_data : Vec < u8 > ,
) -> FlowyResult < ( ) > {
2022-06-15 15:13:50 +08:00
let result = self . get_field_rev ( field_id ) . await ;
2022-05-10 09:33:34 +08:00
if result . is_none ( ) {
tracing ::warn! ( " Can't find the field with id: {} " , field_id ) ;
return Ok ( ( ) ) ;
}
2022-06-15 15:13:50 +08:00
let field_rev = result . unwrap ( ) ;
2022-08-19 23:11:05 +08:00
let changeset = FieldChangesetParams {
field_id : field_id . to_owned ( ) ,
grid_id : grid_id . to_owned ( ) ,
type_option_data : Some ( type_option_data ) ,
.. Default ::default ( )
} ;
let _ = self . update_field_rev ( changeset , field_rev . ty . into ( ) ) . await ? ;
2022-05-11 11:34:13 +08:00
let _ = self . notify_did_update_grid_field ( field_id ) . await ? ;
2022-05-10 09:33:34 +08:00
Ok ( ( ) )
}
2022-06-15 15:13:50 +08:00
pub async fn next_field_rev ( & self , field_type : & FieldType ) -> FlowyResult < FieldRevision > {
2022-10-10 11:56:48 +08:00
let name = format! ( " Property {} " , self . grid_pad . read ( ) . await . get_fields ( ) . len ( ) + 1 ) ;
2022-06-15 15:13:50 +08:00
let field_rev = FieldBuilder ::from_field_type ( field_type ) . name ( & name ) . build ( ) ;
Ok ( field_rev )
2022-03-24 17:09:05 +08:00
}
2022-10-10 21:21:29 +08:00
pub async fn create_new_field_rev (
& self ,
field_type : & FieldType ,
type_option_data : Option < Vec < u8 > > ,
) -> FlowyResult < FieldRevision > {
let mut field_rev = self . next_field_rev ( field_type ) . await ? ;
if let Some ( type_option_data ) = type_option_data {
let type_option_builder = type_option_builder_from_bytes ( type_option_data , field_type ) ;
field_rev . insert_type_option ( type_option_builder . data_format ( ) ) ;
}
2022-05-19 10:41:00 +08:00
let _ = self
2022-06-15 15:13:50 +08:00
. modify ( | grid | Ok ( grid . create_field_rev ( field_rev . clone ( ) , None ) ? ) )
2022-05-19 10:41:00 +08:00
. await ? ;
2022-06-15 15:13:50 +08:00
let _ = self . notify_did_insert_grid_field ( & field_rev . id ) . await ? ;
2022-05-19 10:41:00 +08:00
2022-06-15 15:13:50 +08:00
Ok ( field_rev )
2022-05-19 10:41:00 +08:00
}
2022-03-23 22:10:31 +08:00
pub async fn contain_field ( & self , field_id : & str ) -> bool {
2022-04-18 17:17:42 +08:00
self . grid_pad . read ( ) . await . contain_field ( field_id )
2022-03-15 19:00:28 +08:00
}
2022-04-01 22:46:01 +08:00
pub async fn update_field ( & self , params : FieldChangesetParams ) -> FlowyResult < ( ) > {
2022-04-03 22:22:54 +08:00
let field_id = params . field_id . clone ( ) ;
2022-08-20 23:54:51 +08:00
let field_type : Option < FieldType > = self
. grid_pad
. read ( )
. await
. get_field_rev ( params . field_id . as_str ( ) )
. map ( | ( _ , field_rev ) | field_rev . ty . into ( ) ) ;
2022-03-27 09:35:10 +08:00
2022-08-19 23:11:05 +08:00
match field_type {
None = > Err ( ErrorCode ::FieldDoesNotExist . into ( ) ) ,
Some ( field_type ) = > {
let _ = self . update_field_rev ( params , field_type ) . await ? ;
let _ = self . notify_did_update_grid_field ( & field_id ) . await ? ;
Ok ( ( ) )
}
}
2022-03-12 22:52:24 +08:00
}
2022-10-11 01:04:13 +08:00
pub async fn modify_field_rev < F > ( & self , field_id : & str , f : F ) -> FlowyResult < ( ) >
where
F : for < ' a > FnOnce ( & ' a mut FieldRevision ) -> FlowyResult < Option < ( ) > > ,
{
let mut is_changed = false ;
2022-06-20 09:37:52 +08:00
let _ = self
2022-10-11 01:04:13 +08:00
. modify ( | grid | {
let changeset = grid . modify_field ( field_id , | field_rev | {
Ok ( f ( field_rev ) . map_err ( | e | CollaborateError ::internal ( ) . context ( e ) ) ? )
} ) ? ;
is_changed = changeset . is_some ( ) ;
Ok ( changeset )
} )
2022-06-20 09:37:52 +08:00
. await ? ;
2022-08-24 16:57:53 +08:00
2022-10-11 01:04:13 +08:00
if is_changed {
match self . view_manager . did_update_view_field_type_option ( field_id ) . await {
Ok ( _ ) = > { }
Err ( e ) = > tracing ::error! ( " View manager update field failed: {:?} " , e ) ,
}
let _ = self . notify_did_update_grid_field ( field_id ) . await ? ;
2022-08-24 16:57:53 +08:00
}
2022-04-07 08:33:10 +08:00
Ok ( ( ) )
}
2022-03-12 21:06:15 +08:00
pub async fn delete_field ( & self , field_id : & str ) -> FlowyResult < ( ) > {
2022-06-20 09:37:52 +08:00
let _ = self . modify ( | grid_pad | Ok ( grid_pad . delete_field_rev ( field_id ) ? ) ) . await ? ;
2022-08-11 13:25:55 +08:00
let field_order = FieldIdPB ::from ( field_id ) ;
let notified_changeset = FieldChangesetPB ::delete ( & self . grid_id , vec! [ field_order ] ) ;
2022-04-14 13:29:42 +08:00
let _ = self . notify_did_update_grid ( notified_changeset ) . await ? ;
2022-03-04 21:26:32 +08:00
Ok ( ( ) )
}
2022-09-04 15:33:07 +08:00
pub async fn group_by_field ( & self , field_id : & str ) -> FlowyResult < ( ) > {
2022-09-02 21:34:00 +08:00
let _ = self . view_manager . group_by_field ( field_id ) . await ? ;
Ok ( ( ) )
2022-09-01 09:03:33 +08:00
}
2022-10-10 19:44:41 +08:00
/// Switch the field with id to a new field type.
///
/// If the field type is not exist before, the default type option data will be created.
/// Each field type has its corresponding data, aka, the type option data. Check out [this](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/architecture/frontend/grid#fieldtype)
/// for more information
///
/// # Arguments
///
/// * `field_id`: the id of the field
/// * `field_type`: the new field type of the field
///
2022-04-01 22:46:01 +08:00
pub async fn switch_to_field_type ( & self , field_id : & str , field_type : & FieldType ) -> FlowyResult < ( ) > {
2022-10-10 19:44:41 +08:00
let type_option_builder = | field_type : & FieldTypeRevision | -> String {
2022-07-01 20:32:11 +08:00
let field_type : FieldType = field_type . into ( ) ;
2022-10-10 19:44:41 +08:00
2022-09-02 09:49:26 +08:00
return default_type_option_builder_from_type ( & field_type )
. data_format ( )
. json_str ( ) ;
2022-04-02 10:54:01 +08:00
} ;
2022-04-01 22:46:01 +08:00
let _ = self
2022-10-10 19:44:41 +08:00
. modify ( | grid | Ok ( grid . switch_to_field ( field_id , field_type . clone ( ) , type_option_builder ) ? ) )
2022-04-01 22:46:01 +08:00
. await ? ;
2022-04-14 13:29:42 +08:00
2022-04-17 09:46:38 +08:00
let _ = self . notify_did_update_grid_field ( field_id ) . await ? ;
2022-04-14 13:29:42 +08:00
2022-04-01 22:46:01 +08:00
Ok ( ( ) )
2022-04-01 09:31:10 +08:00
}
2022-03-27 11:14:21 +08:00
pub async fn duplicate_field ( & self , field_id : & str ) -> FlowyResult < ( ) > {
2022-04-14 13:29:42 +08:00
let duplicated_field_id = gen_field_id ( ) ;
2022-04-13 21:26:27 +08:00
let _ = self
2022-06-15 15:13:50 +08:00
. modify ( | grid | Ok ( grid . duplicate_field_rev ( field_id , & duplicated_field_id ) ? ) )
2022-04-13 21:26:27 +08:00
. await ? ;
2022-04-17 15:39:33 +08:00
let _ = self . notify_did_insert_grid_field ( & duplicated_field_id ) . await ? ;
2022-03-27 11:14:21 +08:00
Ok ( ( ) )
}
2022-07-01 10:36:07 +08:00
pub async fn get_field_rev ( & self , field_id : & str ) -> Option < Arc < FieldRevision > > {
2022-06-15 15:13:50 +08:00
let field_rev = self . grid_pad . read ( ) . await . get_field_rev ( field_id ) ? . 1. clone ( ) ;
Some ( field_rev )
2022-04-07 08:33:10 +08:00
}
2022-07-01 20:32:11 +08:00
pub async fn get_field_revs ( & self , field_ids : Option < Vec < String > > ) -> FlowyResult < Vec < Arc < FieldRevision > > > {
2022-04-07 08:33:10 +08:00
if field_ids . is_none ( ) {
2022-06-15 15:13:50 +08:00
let field_revs = self . grid_pad . read ( ) . await . get_field_revs ( None ) ? ;
return Ok ( field_revs ) ;
2022-04-05 21:25:59 +08:00
}
2022-07-01 20:32:11 +08:00
let field_ids = field_ids . unwrap_or_default ( ) ;
let expected_len = field_ids . len ( ) ;
let field_revs = self . grid_pad . read ( ) . await . get_field_revs ( Some ( field_ids ) ) ? ;
2022-06-15 15:13:50 +08:00
if expected_len ! = 0 & & field_revs . len ( ) ! = expected_len {
2022-04-05 21:25:59 +08:00
tracing ::error! (
2022-06-15 15:13:50 +08:00
" This is a bug. The len of the field_revs should equal to {} " ,
2022-04-05 21:25:59 +08:00
expected_len
) ;
2022-06-15 15:13:50 +08:00
debug_assert! ( field_revs . len ( ) = = expected_len ) ;
2022-03-31 22:51:46 +08:00
}
2022-06-15 15:13:50 +08:00
Ok ( field_revs )
2022-03-31 22:51:46 +08:00
}
2022-10-10 19:44:41 +08:00
#[ tracing::instrument(level = " debug " , skip_all, err) ]
2022-08-19 23:11:05 +08:00
async fn update_field_rev ( & self , params : FieldChangesetParams , field_type : FieldType ) -> FlowyResult < ( ) > {
2022-09-24 21:48:48 +08:00
let mut is_type_option_changed = false ;
2022-08-24 16:57:53 +08:00
let _ = self
. modify ( | grid | {
let deserializer = TypeOptionJsonDeserializer ( field_type ) ;
let changeset = grid . modify_field ( & params . field_id , | field | {
let mut is_changed = None ;
if let Some ( name ) = params . name {
field . name = name ;
is_changed = Some ( ( ) )
}
2022-08-20 15:40:13 +08:00
2022-08-24 16:57:53 +08:00
if let Some ( desc ) = params . desc {
field . desc = desc ;
is_changed = Some ( ( ) )
}
2022-08-20 15:40:13 +08:00
2022-08-24 16:57:53 +08:00
if let Some ( field_type ) = params . field_type {
field . ty = field_type ;
is_changed = Some ( ( ) )
}
2022-08-20 15:40:13 +08:00
2022-08-24 16:57:53 +08:00
if let Some ( frozen ) = params . frozen {
field . frozen = frozen ;
is_changed = Some ( ( ) )
}
2022-08-20 15:40:13 +08:00
2022-08-24 16:57:53 +08:00
if let Some ( visibility ) = params . visibility {
field . visibility = visibility ;
is_changed = Some ( ( ) )
}
2022-08-20 15:40:13 +08:00
2022-08-24 16:57:53 +08:00
if let Some ( width ) = params . width {
field . width = width ;
is_changed = Some ( ( ) )
}
2022-08-20 15:40:13 +08:00
2022-08-24 16:57:53 +08:00
if let Some ( type_option_data ) = params . type_option_data {
match deserializer . deserialize ( type_option_data ) {
Ok ( json_str ) = > {
let field_type = field . ty ;
field . insert_type_option_str ( & field_type , json_str ) ;
2022-09-24 21:48:48 +08:00
is_type_option_changed = true ;
2022-08-24 16:57:53 +08:00
is_changed = Some ( ( ) )
}
Err ( err ) = > {
tracing ::error! ( " Deserialize data to type option json failed: {} " , err ) ;
}
2022-08-19 23:11:05 +08:00
}
}
2022-08-24 16:57:53 +08:00
Ok ( is_changed )
} ) ? ;
Ok ( changeset )
} )
. await ? ;
2022-10-10 19:44:41 +08:00
if is_type_option_changed {
let _ = self
. view_manager
. did_update_view_field_type_option ( & params . field_id )
. await ? ;
} else {
let _ = self . view_manager . did_update_view_field ( & params . field_id ) . await ? ;
2022-08-24 16:57:53 +08:00
}
2022-10-10 19:44:41 +08:00
2022-08-24 16:57:53 +08:00
Ok ( ( ) )
2022-08-19 23:11:05 +08:00
}
2022-06-26 15:14:24 +08:00
pub async fn create_block ( & self , block_meta_rev : GridBlockMetaRevision ) -> FlowyResult < ( ) > {
2022-06-20 09:37:52 +08:00
let _ = self
2022-06-26 15:14:24 +08:00
. modify ( | grid_pad | Ok ( grid_pad . create_block_meta_rev ( block_meta_rev ) ? ) )
2022-06-20 09:37:52 +08:00
. await ? ;
2022-03-13 11:06:28 +08:00
Ok ( ( ) )
}
2022-06-26 15:14:24 +08:00
pub async fn update_block ( & self , changeset : GridBlockMetaRevisionChangeset ) -> FlowyResult < ( ) > {
2022-06-20 09:37:52 +08:00
let _ = self
. modify ( | grid_pad | Ok ( grid_pad . update_block_rev ( changeset ) ? ) )
. await ? ;
2022-03-13 11:06:28 +08:00
Ok ( ( ) )
}
2022-08-15 20:07:01 +08:00
pub async fn create_row ( & self , params : CreateRowParams ) -> FlowyResult < RowPB > {
let mut row_rev = self . create_row_rev ( ) . await ? ;
2022-08-17 16:48:16 +08:00
self . view_manager . will_create_row ( & mut row_rev , & params ) . await ;
2022-08-15 20:07:01 +08:00
let row_pb = self . create_row_pb ( row_rev , params . start_row_id . clone ( ) ) . await ? ;
self . view_manager . did_create_row ( & row_pb , & params ) . await ;
Ok ( row_pb )
2022-03-14 17:24:25 +08:00
}
2022-03-13 23:16:52 +08:00
2022-10-01 11:00:15 +08:00
#[ tracing::instrument(level = " trace " , skip_all, err) ]
2022-08-21 13:56:06 +08:00
pub async fn move_group ( & self , params : MoveGroupParams ) -> FlowyResult < ( ) > {
let _ = self . view_manager . move_group ( params ) . await ? ;
Ok ( ( ) )
2022-08-19 19:59:09 +08:00
}
2022-08-11 13:25:55 +08:00
pub async fn insert_rows ( & self , row_revs : Vec < RowRevision > ) -> FlowyResult < Vec < RowPB > > {
2022-03-17 17:25:43 +08:00
let block_id = self . block_id ( ) . await ? ;
2022-06-15 15:13:50 +08:00
let mut rows_by_block_id : HashMap < String , Vec < RowRevision > > = HashMap ::new ( ) ;
2022-03-18 21:04:01 +08:00
let mut row_orders = vec! [ ] ;
2022-07-12 15:49:14 +08:00
for row_rev in row_revs {
2022-08-11 13:25:55 +08:00
row_orders . push ( RowPB ::from ( & row_rev ) ) ;
2022-03-14 17:24:25 +08:00
rows_by_block_id
. entry ( block_id . clone ( ) )
2022-03-16 10:02:37 +08:00
. or_insert_with ( Vec ::new )
2022-06-15 15:13:50 +08:00
. push ( row_rev ) ;
2022-03-14 17:24:25 +08:00
}
2022-05-26 17:28:44 +08:00
let changesets = self . block_manager . insert_row ( rows_by_block_id ) . await ? ;
2022-03-14 17:24:25 +08:00
for changeset in changesets {
let _ = self . update_block ( changeset ) . await ? ;
}
2022-03-18 21:04:01 +08:00
Ok ( row_orders )
2022-03-11 21:36:00 +08:00
}
2022-03-05 17:52:25 +08:00
2022-08-18 15:02:44 +08:00
pub async fn update_row ( & self , changeset : RowChangeset ) -> FlowyResult < ( ) > {
2022-08-16 20:34:12 +08:00
let row_id = changeset . row_id . clone ( ) ;
2022-08-18 15:02:44 +08:00
let _ = self . block_manager . update_row ( changeset ) . await ? ;
2022-08-16 20:34:12 +08:00
self . view_manager . did_update_row ( & row_id ) . await ;
Ok ( ( ) )
2022-03-14 17:24:25 +08:00
}
2022-07-17 13:38:53 +08:00
pub async fn get_rows ( & self , block_id : & str ) -> FlowyResult < RepeatedRowPB > {
2022-03-18 17:14:46 +08:00
let block_ids = vec! [ block_id . to_owned ( ) ] ;
2022-04-02 10:54:01 +08:00
let mut grid_block_snapshot = self . grid_block_snapshots ( Some ( block_ids ) ) . await ? ;
// For the moment, we only support one block.
// We can save the rows into multiple blocks and load them asynchronously in the future.
debug_assert_eq! ( grid_block_snapshot . len ( ) , 1 ) ;
if grid_block_snapshot . len ( ) = = 1 {
let snapshot = grid_block_snapshot . pop ( ) . unwrap ( ) ;
2022-07-12 15:49:14 +08:00
let rows = make_rows_from_row_revs ( & snapshot . row_revs ) ;
2022-03-18 17:14:46 +08:00
Ok ( rows . into ( ) )
} else {
Ok ( vec! [ ] . into ( ) )
}
}
2022-07-12 15:49:14 +08:00
pub async fn get_row_rev ( & self , row_id : & str ) -> FlowyResult < Option < Arc < RowRevision > > > {
2022-06-15 15:13:50 +08:00
match self . block_manager . get_row_rev ( row_id ) . await ? {
2022-03-18 17:14:46 +08:00
None = > Ok ( None ) ,
2022-07-12 15:49:14 +08:00
Some ( row_rev ) = > Ok ( Some ( row_rev ) ) ,
2022-03-18 17:14:46 +08:00
}
}
2022-07-12 15:49:14 +08:00
2022-04-09 22:42:42 +08:00
pub async fn delete_row ( & self , row_id : & str ) -> FlowyResult < ( ) > {
2022-08-17 16:48:16 +08:00
let row_rev = self . block_manager . delete_row ( row_id ) . await ? ;
2022-09-16 20:00:51 +08:00
tracing ::trace! ( " Did delete row:{:?} " , row_rev ) ;
2022-08-17 16:48:16 +08:00
if let Some ( row_rev ) = row_rev {
self . view_manager . did_delete_row ( row_rev ) . await ;
}
2022-04-10 14:24:12 +08:00
Ok ( ( ) )
2022-04-09 22:42:42 +08:00
}
2022-04-10 14:24:12 +08:00
pub async fn duplicate_row ( & self , _row_id : & str ) -> FlowyResult < ( ) > {
Ok ( ( ) )
2022-04-09 22:42:42 +08:00
}
2022-03-18 17:14:46 +08:00
2022-07-25 13:15:11 +08:00
pub async fn get_cell ( & self , params : & GridCellIdParams ) -> Option < GridCellPB > {
2022-09-27 17:26:22 +08:00
let ( field_type , cell_bytes ) = self . decode_any_cell_data ( params ) . await ? ;
Some ( GridCellPB ::new ( & params . field_id , field_type , cell_bytes . to_vec ( ) ) )
2022-07-13 17:25:03 +08:00
}
2022-07-25 13:15:11 +08:00
pub async fn get_cell_bytes ( & self , params : & GridCellIdParams ) -> Option < CellBytes > {
2022-09-27 17:26:22 +08:00
let ( _ , cell_data ) = self . decode_any_cell_data ( params ) . await ? ;
Some ( cell_data )
}
async fn decode_any_cell_data ( & self , params : & GridCellIdParams ) -> Option < ( FieldType , CellBytes ) > {
2022-06-15 15:13:50 +08:00
let field_rev = self . get_field_rev ( & params . field_id ) . await ? ;
let row_rev = self . block_manager . get_row_rev ( & params . row_id ) . await . ok ( ) ? ? ;
2022-06-24 18:13:40 +08:00
let cell_rev = row_rev . cells . get ( & params . field_id ) ? . clone ( ) ;
2022-07-13 17:25:03 +08:00
Some ( decode_any_cell_data ( cell_rev . data , & field_rev ) )
2022-04-07 20:15:00 +08:00
}
2022-06-15 15:13:50 +08:00
pub async fn get_cell_rev ( & self , row_id : & str , field_id : & str ) -> FlowyResult < Option < CellRevision > > {
let row_rev = self . block_manager . get_row_rev ( row_id ) . await ? ;
match row_rev {
2022-04-05 14:25:07 +08:00
None = > Ok ( None ) ,
2022-06-15 15:13:50 +08:00
Some ( row_rev ) = > {
let cell_rev = row_rev . cells . get ( field_id ) . cloned ( ) ;
Ok ( cell_rev )
2022-04-05 14:25:07 +08:00
}
}
}
2022-04-11 14:09:50 +08:00
#[ tracing::instrument(level = " trace " , skip_all, err) ]
2022-07-17 14:13:12 +08:00
pub async fn update_cell ( & self , cell_changeset : CellChangesetPB ) -> FlowyResult < ( ) > {
let CellChangesetPB {
2022-05-11 11:34:13 +08:00
grid_id ,
row_id ,
field_id ,
2022-07-08 14:54:11 +08:00
mut content ,
2022-05-11 11:34:13 +08:00
} = cell_changeset ;
2022-06-15 15:13:50 +08:00
match self . grid_pad . read ( ) . await . get_field_rev ( & field_id ) {
2022-04-05 21:25:59 +08:00
None = > {
2022-08-18 15:02:44 +08:00
let msg = format! ( " Field: {} not found " , & field_id ) ;
2022-04-07 15:34:00 +08:00
Err ( FlowyError ::internal ( ) . context ( msg ) )
2022-04-05 21:25:59 +08:00
}
2022-06-15 15:13:50 +08:00
Some ( ( _ , field_rev ) ) = > {
2022-07-08 14:54:11 +08:00
tracing ::trace! ( " field changeset: id:{} / value:{:?} " , & field_id , content ) ;
2022-06-15 15:13:50 +08:00
let cell_rev = self . get_cell_rev ( & row_id , & field_id ) . await ? ;
2022-04-05 21:25:59 +08:00
// Update the changeset.data property with the return value.
2022-08-19 11:56:47 +08:00
content = apply_cell_data_changeset ( content , cell_rev , field_rev ) ? ;
2022-07-17 14:13:12 +08:00
let cell_changeset = CellChangesetPB {
2022-05-11 11:34:13 +08:00
grid_id ,
2022-08-17 14:33:45 +08:00
row_id : row_id . clone ( ) ,
2022-08-19 11:56:47 +08:00
field_id : field_id . clone ( ) ,
2022-07-08 14:54:11 +08:00
content ,
2022-05-11 11:34:13 +08:00
} ;
2022-08-18 15:02:44 +08:00
let _ = self . block_manager . update_cell ( cell_changeset ) . await ? ;
2022-08-19 11:56:47 +08:00
self . view_manager . did_update_cell ( & row_id , & field_id ) . await ;
2022-04-05 21:25:59 +08:00
Ok ( ( ) )
}
}
2022-03-05 17:52:25 +08:00
}
2022-08-11 13:25:55 +08:00
pub async fn get_blocks ( & self , block_ids : Option < Vec < String > > ) -> FlowyResult < RepeatedBlockPB > {
2022-04-02 10:54:01 +08:00
let block_snapshots = self . grid_block_snapshots ( block_ids . clone ( ) ) . await ? ;
make_grid_blocks ( block_ids , block_snapshots )
2022-03-13 23:16:52 +08:00
}
2022-06-26 15:14:24 +08:00
pub async fn get_block_meta_revs ( & self ) -> FlowyResult < Vec < Arc < GridBlockMetaRevision > > > {
let block_meta_revs = self . grid_pad . read ( ) . await . get_block_meta_revs ( ) ;
Ok ( block_meta_revs )
2022-03-14 17:24:25 +08:00
}
2022-03-13 11:06:28 +08:00
2022-08-11 13:25:55 +08:00
pub async fn delete_rows ( & self , row_orders : Vec < RowPB > ) -> FlowyResult < ( ) > {
2022-05-26 17:28:44 +08:00
let changesets = self . block_manager . delete_rows ( row_orders ) . await ? ;
2022-03-14 17:24:25 +08:00
for changeset in changesets {
let _ = self . update_block ( changeset ) . await ? ;
}
2022-03-13 11:06:28 +08:00
Ok ( ( ) )
2022-03-05 17:52:25 +08:00
}
2022-07-17 13:38:53 +08:00
pub async fn get_grid_data ( & self ) -> FlowyResult < GridPB > {
2022-04-18 17:17:42 +08:00
let pad_read_guard = self . grid_pad . read ( ) . await ;
2022-07-01 20:32:11 +08:00
let field_orders = pad_read_guard
. get_field_revs ( None ) ?
. iter ( )
2022-08-11 13:25:55 +08:00
. map ( FieldIdPB ::from )
2022-07-01 20:32:11 +08:00
. collect ( ) ;
2022-04-10 08:25:01 +08:00
let mut block_orders = vec! [ ] ;
2022-06-26 15:14:24 +08:00
for block_rev in pad_read_guard . get_block_meta_revs ( ) {
2022-06-24 18:13:40 +08:00
let row_orders = self . block_manager . get_row_orders ( & block_rev . block_id ) . await ? ;
2022-08-11 13:25:55 +08:00
let block_order = BlockPB {
2022-06-24 18:13:40 +08:00
id : block_rev . block_id . clone ( ) ,
2022-07-17 11:29:02 +08:00
rows : row_orders ,
2022-04-10 08:25:01 +08:00
} ;
block_orders . push ( block_order ) ;
}
2022-07-17 13:38:53 +08:00
Ok ( GridPB {
2022-03-15 11:07:18 +08:00
id : self . grid_id . clone ( ) ,
2022-07-17 11:29:02 +08:00
fields : field_orders ,
2022-06-24 15:23:39 +08:00
blocks : block_orders ,
2022-03-15 11:07:18 +08:00
} )
2022-03-11 21:36:00 +08:00
}
2022-07-17 13:38:53 +08:00
pub async fn get_grid_setting ( & self ) -> FlowyResult < GridSettingPB > {
2022-08-15 20:07:01 +08:00
self . view_manager . get_setting ( ) . await
2022-06-22 17:11:56 +08:00
}
2022-09-03 16:47:58 +08:00
pub async fn get_grid_filter ( & self ) -> FlowyResult < Vec < GridFilterConfigurationPB > > {
2022-08-15 20:07:01 +08:00
self . view_manager . get_filters ( ) . await
2022-06-20 09:37:52 +08:00
}
2022-09-24 21:48:48 +08:00
pub async fn insert_group ( & self , params : InsertGroupParams ) -> FlowyResult < ( ) > {
2022-09-04 15:33:07 +08:00
self . view_manager . insert_or_update_group ( params ) . await
}
pub async fn delete_group ( & self , params : DeleteGroupParams ) -> FlowyResult < ( ) > {
self . view_manager . delete_group ( params ) . await
}
pub async fn create_filter ( & self , params : InsertFilterParams ) -> FlowyResult < ( ) > {
let _ = self . view_manager . insert_or_update_filter ( params ) . await ? ;
2022-08-21 13:56:06 +08:00
Ok ( ( ) )
}
pub async fn delete_filter ( & self , params : DeleteFilterParams ) -> FlowyResult < ( ) > {
let _ = self . view_manager . delete_filter ( params ) . await ? ;
2022-06-20 09:37:52 +08:00
Ok ( ( ) )
2022-06-19 21:10:07 +08:00
}
2022-04-02 10:54:01 +08:00
pub async fn grid_block_snapshots ( & self , block_ids : Option < Vec < String > > ) -> FlowyResult < Vec < GridBlockSnapshot > > {
2022-04-02 21:17:20 +08:00
let block_ids = match block_ids {
2022-04-02 23:48:56 +08:00
None = > self
2022-04-18 17:17:42 +08:00
. grid_pad
2022-04-02 10:54:01 +08:00
. read ( )
. await
2022-06-26 15:14:24 +08:00
. get_block_meta_revs ( )
2022-06-24 18:13:40 +08:00
. iter ( )
. map ( | block_rev | block_rev . block_id . clone ( ) )
2022-04-02 10:54:01 +08:00
. collect ::< Vec < String > > ( ) ,
2022-04-02 21:17:20 +08:00
Some ( block_ids ) = > block_ids ,
} ;
2022-06-30 23:00:03 +08:00
let snapshots = self . block_manager . get_block_snapshots ( Some ( block_ids ) ) . await ? ;
2022-04-02 10:54:01 +08:00
Ok ( snapshots )
2022-03-13 11:06:28 +08:00
}
2022-08-16 15:49:54 +08:00
pub async fn move_row ( & self , params : MoveRowParams ) -> FlowyResult < ( ) > {
2022-08-17 19:29:14 +08:00
let MoveRowParams {
view_id : _ ,
2022-08-17 20:15:10 +08:00
from_row_id ,
to_row_id ,
2022-08-17 19:29:14 +08:00
} = params ;
2022-08-17 20:15:10 +08:00
match self . block_manager . get_row_rev ( & from_row_id ) . await ? {
None = > tracing ::warn! ( " Move row failed, can not find the row:{} " , from_row_id ) ,
Some ( row_rev ) = > {
match (
self . block_manager . index_of_row ( & from_row_id ) . await ,
self . block_manager . index_of_row ( & to_row_id ) . await ,
) {
( Some ( from_index ) , Some ( to_index ) ) = > {
tracing ::trace! ( " Move row from {} to {} " , from_index , to_index ) ;
2022-08-17 19:29:14 +08:00
let _ = self
. block_manager
2022-08-17 20:15:10 +08:00
. move_row ( row_rev . clone ( ) , from_index , to_index )
2022-08-17 19:29:14 +08:00
. await ? ;
}
2022-08-18 15:02:44 +08:00
( _ , None ) = > tracing ::warn! ( " Can not find the from row id: {} " , from_row_id ) ,
( None , _ ) = > tracing ::warn! ( " Can not find the to row id: {} " , to_row_id ) ,
2022-08-17 20:15:10 +08:00
}
}
2022-08-17 19:29:14 +08:00
}
Ok ( ( ) )
2022-04-13 14:24:54 +08:00
}
2022-08-22 16:16:15 +08:00
pub async fn move_group_row ( & self , params : MoveGroupRowParams ) -> FlowyResult < ( ) > {
let MoveGroupRowParams {
2022-08-24 21:06:10 +08:00
view_id ,
2022-08-22 16:16:15 +08:00
from_row_id ,
to_group_id ,
to_row_id ,
} = params ;
match self . block_manager . get_row_rev ( & from_row_id ) . await ? {
None = > tracing ::warn! ( " Move row failed, can not find the row:{} " , from_row_id ) ,
Some ( row_rev ) = > {
2022-08-26 16:07:51 +08:00
let block_manager = self . block_manager . clone ( ) ;
self . view_manager
. move_group_row ( row_rev , to_group_id , to_row_id . clone ( ) , | row_changeset | {
wrap_future ( async move {
2022-10-07 14:42:40 +08:00
tracing ::trace! ( " Row data changed: {:?} " , row_changeset ) ;
2022-08-26 16:07:51 +08:00
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 block_manager . update_cell ( cell_changeset ) . await {
Ok ( _ ) = > { }
Err ( e ) = > tracing ::error! ( " Apply cell changeset error:{:?} " , e ) ,
}
}
2022-08-24 21:06:10 +08:00
} )
2022-08-26 16:07:51 +08:00
} )
. await ? ;
2022-08-22 16:16:15 +08:00
}
}
Ok ( ( ) )
}
2022-08-16 15:49:54 +08:00
pub async fn move_field ( & self , params : MoveFieldParams ) -> FlowyResult < ( ) > {
let MoveFieldParams {
grid_id : _ ,
field_id ,
from_index ,
to_index ,
} = params ;
2022-04-15 19:56:44 +08:00
let _ = self
2022-08-16 15:49:54 +08:00
. modify ( | grid_pad | Ok ( grid_pad . move_field ( & field_id , from_index as usize , to_index as usize ) ? ) )
2022-04-15 19:56:44 +08:00
. await ? ;
2022-08-16 15:49:54 +08:00
if let Some ( ( index , field_rev ) ) = self . grid_pad . read ( ) . await . get_field_rev ( & field_id ) {
2022-08-11 13:25:55 +08:00
let delete_field_order = FieldIdPB ::from ( field_id ) ;
2022-07-17 13:38:53 +08:00
let insert_field = IndexFieldPB ::from_field_rev ( field_rev , index ) ;
2022-08-11 13:25:55 +08:00
let notified_changeset = FieldChangesetPB {
2022-04-15 19:56:44 +08:00
grid_id : self . grid_id . clone ( ) ,
inserted_fields : vec ! [ insert_field ] ,
deleted_fields : vec ! [ delete_field_order ] ,
updated_fields : vec ! [ ] ,
} ;
let _ = self . notify_did_update_grid ( notified_changeset ) . await ? ;
}
Ok ( ( ) )
2022-04-13 14:24:54 +08:00
}
2022-06-06 20:06:08 +08:00
pub async fn duplicate_grid ( & self ) -> FlowyResult < BuildGridContext > {
let grid_pad = self . grid_pad . read ( ) . await ;
2022-09-24 20:34:31 +08:00
let grid_view_revision_data = self . view_manager . duplicate_grid_view ( ) . await ? ;
2022-06-26 15:14:24 +08:00
let original_blocks = grid_pad . get_block_meta_revs ( ) ;
let ( duplicated_fields , duplicated_blocks ) = grid_pad . duplicate_grid_block_meta ( ) . await ;
2022-06-06 20:06:08 +08:00
let mut blocks_meta_data = vec! [ ] ;
if original_blocks . len ( ) = = duplicated_blocks . len ( ) {
for ( index , original_block_meta ) in original_blocks . iter ( ) . enumerate ( ) {
2022-08-15 20:07:01 +08:00
let grid_block_meta_editor = self
. block_manager
. get_block_editor ( & original_block_meta . block_id )
. await ? ;
2022-06-06 20:06:08 +08:00
let duplicated_block_id = & duplicated_blocks [ index ] . block_id ;
tracing ::trace! ( " Duplicate block:{} meta data " , duplicated_block_id ) ;
2022-06-24 18:13:40 +08:00
let duplicated_block_meta_data = grid_block_meta_editor . duplicate_block ( duplicated_block_id ) . await ;
2022-06-06 20:06:08 +08:00
blocks_meta_data . push ( duplicated_block_meta_data ) ;
}
} else {
debug_assert_eq! ( original_blocks . len ( ) , duplicated_blocks . len ( ) ) ;
}
drop ( grid_pad ) ;
Ok ( BuildGridContext {
2022-07-14 09:29:05 +08:00
field_revs : duplicated_fields . into_iter ( ) . map ( Arc ::new ) . collect ( ) ,
2022-08-16 11:24:37 +08:00
block_metas : duplicated_blocks ,
blocks : blocks_meta_data ,
2022-09-24 20:34:31 +08:00
grid_view_revision_data ,
2022-06-06 20:06:08 +08:00
} )
}
2022-08-12 16:05:56 +08:00
#[ tracing::instrument(level = " trace " , skip_all, err) ]
2022-08-11 21:18:27 +08:00
pub async fn load_groups ( & self ) -> FlowyResult < RepeatedGridGroupPB > {
2022-08-15 20:07:01 +08:00
self . view_manager . load_groups ( ) . await
2022-08-11 13:04:45 +08:00
}
2022-08-13 23:26:42 +08:00
async fn create_row_rev ( & self ) -> FlowyResult < RowRevision > {
let field_revs = self . grid_pad . read ( ) . await . get_field_revs ( None ) ? ;
let block_id = self . block_id ( ) . await ? ;
// insert empty row below the row whose id is upper_row_id
let row_rev = RowRevisionBuilder ::new ( & block_id , & field_revs ) . build ( ) ;
Ok ( row_rev )
}
async fn create_row_pb ( & self , row_rev : RowRevision , start_row_id : Option < String > ) -> FlowyResult < RowPB > {
let row_pb = RowPB ::from ( & row_rev ) ;
let block_id = row_rev . block_id . clone ( ) ;
// insert the row
let row_count = self . block_manager . create_row ( row_rev , start_row_id ) . await ? ;
// update block row count
let changeset = GridBlockMetaRevisionChangeset ::from_row_count ( block_id , row_count ) ;
let _ = self . update_block ( changeset ) . await ? ;
Ok ( row_pb )
}
2022-03-04 21:26:32 +08:00
async fn modify < F > ( & self , f : F ) -> FlowyResult < ( ) >
2022-03-04 18:11:12 +08:00
where
2022-08-14 23:01:53 +08:00
F : for < ' a > FnOnce ( & ' a mut GridRevisionPad ) -> FlowyResult < Option < GridRevisionChangeset > > ,
2022-03-04 18:11:12 +08:00
{
2022-04-18 17:17:42 +08:00
let mut write_guard = self . grid_pad . write ( ) . await ;
2022-04-08 15:13:53 +08:00
if let Some ( changeset ) = f ( & mut * write_guard ) ? {
let _ = self . apply_change ( changeset ) . await ? ;
2022-03-04 18:11:12 +08:00
}
Ok ( ( ) )
}
2022-08-14 23:01:53 +08:00
async fn apply_change ( & self , change : GridRevisionChangeset ) -> FlowyResult < ( ) > {
2022-10-10 11:56:48 +08:00
let GridRevisionChangeset { operations : delta , md5 } = change ;
2022-03-05 10:59:44 +08:00
let user_id = self . user . user_id ( ) ? ;
2022-03-04 18:11:12 +08:00
let ( base_rev_id , rev_id ) = self . rev_manager . next_rev_id_pair ( ) ;
2022-08-02 09:11:04 +08:00
let delta_data = delta . json_bytes ( ) ;
2022-03-04 18:11:12 +08:00
let revision = Revision ::new (
& self . rev_manager . object_id ,
base_rev_id ,
rev_id ,
delta_data ,
2022-03-05 10:59:44 +08:00
& user_id ,
2022-03-04 18:11:12 +08:00
md5 ,
) ;
2022-06-09 20:58:56 +08:00
let _ = self . rev_manager . add_local_revision ( & revision ) . await ? ;
2022-03-04 18:11:12 +08:00
Ok ( ( ) )
}
2022-03-14 17:24:25 +08:00
2022-03-17 17:25:43 +08:00
async fn block_id ( & self ) -> FlowyResult < String > {
2022-06-26 15:14:24 +08:00
match self . grid_pad . read ( ) . await . get_block_meta_revs ( ) . last ( ) {
2022-03-14 17:24:25 +08:00
None = > Err ( FlowyError ::internal ( ) . context ( " There is no grid block in this grid " ) ) ,
2022-03-17 17:25:43 +08:00
Some ( grid_block ) = > Ok ( grid_block . block_id . clone ( ) ) ,
2022-03-14 17:24:25 +08:00
}
}
2022-03-16 21:19:51 +08:00
2022-04-14 13:29:42 +08:00
#[ tracing::instrument(level = " trace " , skip_all, err) ]
2022-04-17 09:46:38 +08:00
async fn notify_did_insert_grid_field ( & self , field_id : & str ) -> FlowyResult < ( ) > {
2022-06-15 15:13:50 +08:00
if let Some ( ( index , field_rev ) ) = self . grid_pad . read ( ) . await . get_field_rev ( field_id ) {
2022-07-17 13:38:53 +08:00
let index_field = IndexFieldPB ::from_field_rev ( field_rev , index ) ;
2022-08-11 13:25:55 +08:00
let notified_changeset = FieldChangesetPB ::insert ( & self . grid_id , vec! [ index_field ] ) ;
2022-04-14 13:29:42 +08:00
let _ = self . notify_did_update_grid ( notified_changeset ) . await ? ;
}
2022-04-13 21:26:27 +08:00
Ok ( ( ) )
}
2022-04-08 22:38:38 +08:00
#[ tracing::instrument(level = " trace " , skip_all, err) ]
2022-04-17 09:46:38 +08:00
async fn notify_did_update_grid_field ( & self , field_id : & str ) -> FlowyResult < ( ) > {
2022-06-15 15:13:50 +08:00
if let Some ( ( _ , field_rev ) ) = self
2022-04-18 17:17:42 +08:00
. grid_pad
. read ( )
. await
2022-06-15 15:13:50 +08:00
. get_field_rev ( field_id )
2022-04-18 17:17:42 +08:00
. map ( | ( index , field ) | ( index , field . clone ( ) ) )
{
2022-08-11 13:25:55 +08:00
let updated_field = FieldPB ::from ( field_rev ) ;
let notified_changeset = FieldChangesetPB ::update ( & self . grid_id , vec! [ updated_field . clone ( ) ] ) ;
2022-04-14 13:29:42 +08:00
let _ = self . notify_did_update_grid ( notified_changeset ) . await ? ;
2022-04-10 14:24:12 +08:00
send_dart_notification ( field_id , GridNotification ::DidUpdateField )
2022-04-14 13:29:42 +08:00
. payload ( updated_field )
2022-04-03 22:22:54 +08:00
. send ( ) ;
}
Ok ( ( ) )
}
2022-04-14 13:29:42 +08:00
2022-08-11 13:25:55 +08:00
async fn notify_did_update_grid ( & self , changeset : FieldChangesetPB ) -> FlowyResult < ( ) > {
2022-04-14 21:16:29 +08:00
send_dart_notification ( & self . grid_id , GridNotification ::DidUpdateGridField )
2022-04-14 13:29:42 +08:00
. payload ( changeset )
. send ( ) ;
Ok ( ( ) )
}
2022-03-04 18:11:12 +08:00
}
2022-03-12 21:06:15 +08:00
#[ cfg(feature = " flowy_unit_test " ) ]
2022-06-20 09:37:52 +08:00
impl GridRevisionEditor {
2022-03-12 21:06:15 +08:00
pub fn rev_manager ( & self ) -> Arc < RevisionManager > {
self . rev_manager . clone ( )
}
}
pub struct GridPadBuilder ( ) ;
2022-03-04 18:11:12 +08:00
impl RevisionObjectBuilder for GridPadBuilder {
2022-06-15 15:13:50 +08:00
type Output = GridRevisionPad ;
2022-03-04 18:11:12 +08:00
2022-07-20 18:27:12 +08:00
fn build_object ( _object_id : & str , revisions : Vec < Revision > ) -> FlowyResult < Self ::Output > {
let pad = GridRevisionPad ::from_revisions ( revisions ) ? ;
2022-03-04 18:11:12 +08:00
Ok ( pad )
}
}
struct GridRevisionCloudService {
#[ allow(dead_code) ]
token : String ,
}
impl RevisionCloudService for GridRevisionCloudService {
#[ tracing::instrument(level = " trace " , skip(self)) ]
fn fetch_object ( & self , _user_id : & str , _object_id : & str ) -> FutureResult < Vec < Revision > , FlowyError > {
FutureResult ::new ( async move { Ok ( vec! [ ] ) } )
}
}
2022-07-20 14:07:54 +08:00
pub struct GridRevisionCompactor ( ) ;
2022-03-11 21:36:00 +08:00
impl RevisionCompactor for GridRevisionCompactor {
fn bytes_from_revisions ( & self , revisions : Vec < Revision > ) -> FlowyResult < Bytes > {
2022-10-10 11:56:48 +08:00
let operations = make_operations_from_revisions ::< EmptyAttributes > ( revisions ) ? ;
Ok ( operations . json_bytes ( ) )
2022-03-11 21:36:00 +08:00
}
}
2022-04-01 09:31:10 +08:00
2022-04-07 08:33:10 +08:00
struct TypeOptionJsonDeserializer ( FieldType ) ;
impl JsonDeserializer for TypeOptionJsonDeserializer {
2022-04-01 09:31:10 +08:00
fn deserialize ( & self , type_option_data : Vec < u8 > ) -> CollaborateResult < String > {
2022-04-07 08:33:10 +08:00
// The type_option_data sent from Dart is serialized by protobuf.
2022-04-01 16:38:51 +08:00
let builder = type_option_builder_from_bytes ( type_option_data , & self . 0 ) ;
2022-09-02 09:49:26 +08:00
let json = builder . data_format ( ) . json_str ( ) ;
2022-04-12 10:06:47 +08:00
tracing ::trace! ( " Deserialize type option data to: {} " , json ) ;
Ok ( json )
2022-04-01 09:31:10 +08:00
}
}