diff --git a/frontend/app_flowy/lib/startup/home_deps_resolver.dart b/frontend/app_flowy/lib/startup/home_deps_resolver.dart index c006c9de88..f8c8d60e8f 100644 --- a/frontend/app_flowy/lib/startup/home_deps_resolver.dart +++ b/frontend/app_flowy/lib/startup/home_deps_resolver.dart @@ -7,6 +7,8 @@ import 'package:app_flowy/workspace/application/doc/doc_bloc.dart'; import 'package:app_flowy/workspace/application/doc/doc_service.dart'; import 'package:app_flowy/workspace/application/doc/share_bloc.dart'; import 'package:app_flowy/workspace/application/doc/share_service.dart'; +import 'package:app_flowy/workspace/application/grid/grid_bloc.dart'; +import 'package:app_flowy/workspace/application/grid/grid_service.dart'; import 'package:app_flowy/workspace/application/home/home_listen_bloc.dart'; import 'package:app_flowy/workspace/application/menu/menu_bloc.dart'; import 'package:app_flowy/workspace/application/menu/menu_user_bloc.dart'; @@ -97,6 +99,14 @@ class HomeDepsResolver { ), ); + // Grid + getIt.registerFactoryParam( + (view, _) => GridBloc( + view: view, + service: GridService(), + ), + ); + // trash getIt.registerLazySingleton(() => TrashService()); getIt.registerLazySingleton(() => TrashListener()); diff --git a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart index f858113fcc..b915435343 100644 --- a/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart +++ b/frontend/app_flowy/lib/workspace/application/grid/grid_bloc.dart @@ -14,8 +14,8 @@ part 'grid_bloc.freezed.dart'; class GridBloc extends Bloc { final GridService service; final View view; - late Grid? _grid; - late List? _fields; + Grid? _grid; + List? _fields; GridBloc({required this.view, required this.service}) : super(GridState.initial()) { on( diff --git a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart index 33b8c94fa5..e53a2f01e2 100755 --- a/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart +++ b/frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/grid_page.dart @@ -31,7 +31,9 @@ class _GridPageState extends State { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider(create: (context) => getIt()), + BlocProvider( + create: (context) => getIt(param1: widget.view)..add(const GridEvent.initial()), + ), ], child: BlocBuilder( builder: (context, state) { diff --git a/frontend/rust-lib/flowy-folder/src/manager.rs b/frontend/rust-lib/flowy-folder/src/manager.rs index 713ab9e3b3..db81ca3144 100644 --- a/frontend/rust-lib/flowy-folder/src/manager.rs +++ b/frontend/rust-lib/flowy-folder/src/manager.rs @@ -241,7 +241,7 @@ pub trait ViewDataProcessor { fn delta_str(&self, view_id: &str) -> FutureResult; - fn default_view_data(&self) -> String; + fn default_view_data(&self, view_id: &str) -> String; fn data_type(&self) -> ViewDataType; } diff --git a/frontend/rust-lib/flowy-folder/src/services/view/controller.rs b/frontend/rust-lib/flowy-folder/src/services/view/controller.rs index 455bd78c44..5412f7d0b6 100644 --- a/frontend/rust-lib/flowy-folder/src/services/view/controller.rs +++ b/frontend/rust-lib/flowy-folder/src/services/view/controller.rs @@ -59,7 +59,7 @@ impl ViewController { pub(crate) async fn create_view_from_params(&self, mut params: CreateViewParams) -> Result { let processor = self.get_data_processor(¶ms.data_type)?; let content = if params.data.is_empty() { - let default_view_data = processor.default_view_data(); + let default_view_data = processor.default_view_data(¶ms.view_id); params.data = default_view_data.clone(); default_view_data } else { diff --git a/frontend/rust-lib/flowy-grid/src/event_handler.rs b/frontend/rust-lib/flowy-grid/src/event_handler.rs index 72e2272c03..26e871db05 100644 --- a/frontend/rust-lib/flowy-grid/src/event_handler.rs +++ b/frontend/rust-lib/flowy-grid/src/event_handler.rs @@ -4,7 +4,7 @@ use flowy_grid_data_model::entities::{Grid, GridId, QueryFieldPayload, QueryRowP use lib_dispatch::prelude::{data_result, AppData, Data, DataResult}; use std::sync::Arc; -#[tracing::instrument(skip(data, manager), err)] +#[tracing::instrument(level = "debug", skip(data, manager), err)] pub(crate) async fn open_grid_handler( data: Data, manager: AppData>, @@ -15,7 +15,7 @@ pub(crate) async fn open_grid_handler( data_result(grid) } -#[tracing::instrument(skip(data, manager), err)] +#[tracing::instrument(level = "debug", skip(data, manager), err)] pub(crate) async fn get_rows_handler( data: Data, manager: AppData>, @@ -26,7 +26,7 @@ pub(crate) async fn get_rows_handler( data_result(repeated_row) } -#[tracing::instrument(skip(data, manager), err)] +#[tracing::instrument(level = "debug", skip(data, manager), err)] pub(crate) async fn get_fields_handler( data: Data, manager: AppData>, @@ -37,7 +37,7 @@ pub(crate) async fn get_fields_handler( data_result(repeated_field) } -#[tracing::instrument(skip(data, manager), err)] +#[tracing::instrument(level = "debug", skip(data, manager), err)] pub(crate) async fn create_row_handler( data: Data, manager: AppData>, diff --git a/frontend/rust-lib/flowy-grid/src/manager.rs b/frontend/rust-lib/flowy-grid/src/manager.rs index 17acaad3fa..c55507e59f 100644 --- a/frontend/rust-lib/flowy-grid/src/manager.rs +++ b/frontend/rust-lib/flowy-grid/src/manager.rs @@ -17,20 +17,20 @@ pub trait GridUser: Send + Sync { } pub struct GridManager { - grid_editors: Arc, + editor_map: Arc, grid_user: Arc, kv_persistence: Arc>>>, } impl GridManager { pub fn new(grid_user: Arc, _rev_web_socket: Arc) -> Self { - let grid_editors = Arc::new(GridEditors::new()); + let grid_editors = Arc::new(GridEditorMap::new()); // kv_persistence will be initialized after first access. // See get_kv_persistence function below let kv_persistence = Arc::new(RwLock::new(None)); Self { - grid_editors, + editor_map: grid_editors, grid_user, kv_persistence, } @@ -56,7 +56,7 @@ impl GridManager { pub fn close_grid>(&self, grid_id: T) -> FlowyResult<()> { let grid_id = grid_id.as_ref(); tracing::Span::current().record("grid_id", &grid_id); - self.grid_editors.remove(grid_id); + self.editor_map.remove(grid_id); Ok(()) } @@ -64,22 +64,26 @@ impl GridManager { pub fn delete_grid>(&self, grid_id: T) -> FlowyResult<()> { let grid_id = grid_id.as_ref(); tracing::Span::current().record("grid_id", &grid_id); - self.grid_editors.remove(grid_id); + self.editor_map.remove(grid_id); Ok(()) } + #[tracing::instrument(level = "debug", skip(self), err)] pub fn get_grid_editor(&self, grid_id: &str) -> FlowyResult> { - match self.grid_editors.get(grid_id) { + match self.editor_map.get(grid_id) { None => Err(FlowyError::internal().context("Should call open_grid function first")), Some(editor) => Ok(editor), } } async fn get_or_create_grid_editor(&self, grid_id: &str) -> FlowyResult> { - match self.grid_editors.get(grid_id) { + match self.editor_map.get(grid_id) { None => { + tracing::trace!("Create grid editor with id: {}", grid_id); let db_pool = self.grid_user.db_pool()?; - self.make_grid_editor(grid_id, db_pool).await + let editor = self.make_grid_editor(grid_id, db_pool).await?; + self.editor_map.insert(grid_id, &editor); + Ok(editor) } Some(editor) => Ok(editor), } @@ -94,7 +98,6 @@ impl GridManager { let rev_manager = self.make_grid_rev_manager(grid_id, pool.clone())?; let kv_persistence = self.get_kv_persistence()?; let grid_editor = ClientGridEditor::new(grid_id, user, rev_manager, kv_persistence).await?; - self.grid_editors.insert(grid_id, &grid_editor); Ok(grid_editor) } @@ -120,8 +123,7 @@ impl GridManager { } use lib_infra::uuid; -pub fn default_grid() -> String { - let grid_id = uuid(); +pub fn default_grid(grid_id: &str) -> String { let fields = vec![ Field { id: uuid(), @@ -146,12 +148,12 @@ pub fn default_grid() -> String { let rows = vec![ RawRow { id: uuid(), - grid_id: grid_id.clone(), + grid_id: grid_id.to_string(), cell_by_field_id: Default::default(), }, RawRow { id: uuid(), - grid_id: grid_id.clone(), + grid_id: grid_id.to_string(), cell_by_field_id: Default::default(), }, ]; @@ -172,11 +174,11 @@ pub fn make_grid(grid_id: &str, fields: Vec, rows: Vec) -> String delta.to_delta_str() } -pub struct GridEditors { +pub struct GridEditorMap { inner: DashMap>, } -impl GridEditors { +impl GridEditorMap { fn new() -> Self { Self { inner: DashMap::new() } } @@ -188,16 +190,8 @@ impl GridEditors { self.inner.insert(grid_id.to_string(), grid_editor.clone()); } - pub(crate) fn contains(&self, grid_id: &str) -> bool { - self.inner.get(grid_id).is_some() - } - pub(crate) fn get(&self, grid_id: &str) -> Option> { - if !self.contains(grid_id) { - return None; - } - let opened_grid = self.inner.get(grid_id).unwrap(); - Some(opened_grid.clone()) + Some(self.inner.get(grid_id)?.clone()) } pub(crate) fn remove(&self, grid_id: &str) { diff --git a/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs b/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs index fc979937ad..e2148daa31 100644 --- a/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs +++ b/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs @@ -173,7 +173,7 @@ impl ViewDataProcessor for BlockManagerViewDataImpl { }) } - fn default_view_data(&self) -> String { + fn default_view_data(&self, _view_id: &str) -> String { initial_quill_delta_string() } @@ -225,8 +225,8 @@ impl ViewDataProcessor for GridManagerViewDataImpl { }) } - fn default_view_data(&self) -> String { - default_grid() + fn default_view_data(&self, view_id: &str) -> String { + default_grid(view_id) } fn data_type(&self) -> ViewDataType { diff --git a/frontend/rust-lib/flowy-sdk/src/lib.rs b/frontend/rust-lib/flowy-sdk/src/lib.rs index bb3b12aa6e..7c254acd66 100644 --- a/frontend/rust-lib/flowy-sdk/src/lib.rs +++ b/frontend/rust-lib/flowy-sdk/src/lib.rs @@ -67,7 +67,8 @@ fn crate_log_filter(level: String) -> String { filters.push(format!("flowy_sdk={}", level)); filters.push(format!("flowy_folder={}", level)); filters.push(format!("flowy_user={}", level)); - filters.push(format!("flowy_document={}", level)); + filters.push(format!("flowy_block={}", level)); + filters.push(format!("flowy_grid={}", level)); filters.push(format!("flowy_collaboration={}", "debug")); filters.push(format!("dart_notify={}", level)); filters.push(format!("lib_ot={}", level)); @@ -78,7 +79,7 @@ fn crate_log_filter(level: String) -> String { filters.push(format!("flowy_database={}", "info")); filters.push(format!("flowy_net={}", "info")); filters.push(format!("flowy_sync={}", "info")); - filters.push(format!("flowy_sync={}", "info")); + filters.join(",") } diff --git a/shared-lib/flowy-collaboration/src/synchronizer.rs b/shared-lib/flowy-collaboration/src/synchronizer.rs index 2141b84952..1305c471b2 100644 --- a/shared-lib/flowy-collaboration/src/synchronizer.rs +++ b/shared-lib/flowy-collaboration/src/synchronizer.rs @@ -83,7 +83,7 @@ where } } - #[tracing::instrument(level = "debug", skip(self, user, repeated_revision), err)] + #[tracing::instrument(level = "trace", skip(self, user, repeated_revision), err)] pub async fn sync_revisions( &self, user: Arc,