grid_view_manager.rs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. use crate::entities::{
  2. CreateFilterParams, CreateRowParams, DeleteFilterParams, DeleteGroupParams, GridSettingPB, InsertGroupParams,
  3. MoveGroupParams, RepeatedGridGroupPB, RowPB,
  4. };
  5. use crate::manager::GridUser;
  6. use crate::services::grid_view_editor::{GridViewEditorDelegate, GridViewRevisionCompress, GridViewRevisionEditor};
  7. use crate::services::persistence::rev_sqlite::SQLiteGridViewRevisionPersistence;
  8. use dashmap::DashMap;
  9. use flowy_database::ConnectionPool;
  10. use flowy_error::FlowyResult;
  11. use flowy_revision::{
  12. RevisionManager, RevisionPersistence, RevisionPersistenceConfiguration, SQLiteRevisionSnapshotPersistence,
  13. };
  14. use crate::services::filter::FilterType;
  15. use grid_rev_model::{FilterRevision, RowChangeset, RowRevision};
  16. use lib_infra::future::Fut;
  17. use std::sync::Arc;
  18. type ViewId = String;
  19. pub(crate) struct GridViewManager {
  20. grid_id: String,
  21. user: Arc<dyn GridUser>,
  22. delegate: Arc<dyn GridViewEditorDelegate>,
  23. view_editors: DashMap<ViewId, Arc<GridViewRevisionEditor>>,
  24. }
  25. impl GridViewManager {
  26. pub(crate) async fn new(
  27. grid_id: String,
  28. user: Arc<dyn GridUser>,
  29. delegate: Arc<dyn GridViewEditorDelegate>,
  30. ) -> FlowyResult<Self> {
  31. Ok(Self {
  32. grid_id,
  33. user,
  34. delegate,
  35. view_editors: DashMap::default(),
  36. })
  37. }
  38. pub(crate) async fn close(&self, _view_id: &str) {
  39. if let Ok(editor) = self.get_default_view_editor().await {
  40. let _ = editor.close().await;
  41. }
  42. }
  43. pub async fn filter_rows(&self, block_id: &str, rows: Vec<Arc<RowRevision>>) -> FlowyResult<Vec<Arc<RowRevision>>> {
  44. let editor = self.get_default_view_editor().await?;
  45. let rows = editor.filter_rows(block_id, rows).await;
  46. Ok(rows)
  47. }
  48. pub(crate) async fn duplicate_grid_view(&self) -> FlowyResult<String> {
  49. let editor = self.get_default_view_editor().await?;
  50. let view_data = editor.duplicate_view_data().await?;
  51. Ok(view_data)
  52. }
  53. /// When the row was created, we may need to modify the [RowRevision] according to the [CreateRowParams].
  54. pub(crate) async fn will_create_row(&self, row_rev: &mut RowRevision, params: &CreateRowParams) {
  55. for view_editor in self.view_editors.iter() {
  56. view_editor.will_create_view_row(row_rev, params).await;
  57. }
  58. }
  59. /// Notify the view that the row was created. For the moment, the view is just sending notifications.
  60. pub(crate) async fn did_create_row(&self, row_pb: &RowPB, params: &CreateRowParams) {
  61. for view_editor in self.view_editors.iter() {
  62. view_editor.did_create_view_row(row_pb, params).await;
  63. }
  64. }
  65. /// Insert/Delete the group's row if the corresponding cell data was changed.
  66. pub(crate) async fn did_update_cell(&self, row_id: &str) {
  67. match self.delegate.get_row_rev(row_id).await {
  68. None => {
  69. tracing::warn!("Can not find the row in grid view");
  70. }
  71. Some(row_rev) => {
  72. for view_editor in self.view_editors.iter() {
  73. view_editor.did_update_view_cell(&row_rev).await;
  74. }
  75. }
  76. }
  77. }
  78. pub(crate) async fn group_by_field(&self, field_id: &str) -> FlowyResult<()> {
  79. let view_editor = self.get_default_view_editor().await?;
  80. let _ = view_editor.group_by_view_field(field_id).await?;
  81. Ok(())
  82. }
  83. pub(crate) async fn did_delete_row(&self, row_rev: Arc<RowRevision>) {
  84. for view_editor in self.view_editors.iter() {
  85. view_editor.did_delete_view_row(&row_rev).await;
  86. }
  87. }
  88. pub(crate) async fn get_setting(&self) -> FlowyResult<GridSettingPB> {
  89. let view_editor = self.get_default_view_editor().await?;
  90. Ok(view_editor.get_view_setting().await)
  91. }
  92. pub(crate) async fn get_all_filters(&self) -> FlowyResult<Vec<Arc<FilterRevision>>> {
  93. let view_editor = self.get_default_view_editor().await?;
  94. Ok(view_editor.get_all_view_filters().await)
  95. }
  96. pub(crate) async fn get_filters(&self, filter_id: &FilterType) -> FlowyResult<Vec<Arc<FilterRevision>>> {
  97. let view_editor = self.get_default_view_editor().await?;
  98. Ok(view_editor.get_view_filters(filter_id).await)
  99. }
  100. pub(crate) async fn insert_or_update_filter(&self, params: CreateFilterParams) -> FlowyResult<()> {
  101. let view_editor = self.get_default_view_editor().await?;
  102. view_editor.insert_view_filter(params).await
  103. }
  104. pub(crate) async fn delete_filter(&self, params: DeleteFilterParams) -> FlowyResult<()> {
  105. let view_editor = self.get_default_view_editor().await?;
  106. view_editor.delete_view_filter(params).await
  107. }
  108. pub(crate) async fn load_groups(&self) -> FlowyResult<RepeatedGridGroupPB> {
  109. let view_editor = self.get_default_view_editor().await?;
  110. let groups = view_editor.load_view_groups().await?;
  111. Ok(RepeatedGridGroupPB { items: groups })
  112. }
  113. pub(crate) async fn insert_or_update_group(&self, params: InsertGroupParams) -> FlowyResult<()> {
  114. let view_editor = self.get_default_view_editor().await?;
  115. view_editor.initialize_new_group(params).await
  116. }
  117. pub(crate) async fn delete_group(&self, params: DeleteGroupParams) -> FlowyResult<()> {
  118. let view_editor = self.get_default_view_editor().await?;
  119. view_editor.delete_view_group(params).await
  120. }
  121. pub(crate) async fn move_group(&self, params: MoveGroupParams) -> FlowyResult<()> {
  122. let view_editor = self.get_default_view_editor().await?;
  123. let _ = view_editor.move_view_group(params).await?;
  124. Ok(())
  125. }
  126. /// It may generate a RowChangeset when the Row was moved from one group to another.
  127. /// The return value, [RowChangeset], contains the changes made by the groups.
  128. ///
  129. pub(crate) async fn move_group_row(
  130. &self,
  131. row_rev: Arc<RowRevision>,
  132. to_group_id: String,
  133. to_row_id: Option<String>,
  134. recv_row_changeset: impl FnOnce(RowChangeset) -> Fut<()>,
  135. ) -> FlowyResult<()> {
  136. let mut row_changeset = RowChangeset::new(row_rev.id.clone());
  137. let view_editor = self.get_default_view_editor().await?;
  138. let group_changesets = view_editor
  139. .move_view_group_row(&row_rev, &mut row_changeset, &to_group_id, to_row_id.clone())
  140. .await;
  141. if !row_changeset.is_empty() {
  142. recv_row_changeset(row_changeset).await;
  143. }
  144. for group_changeset in group_changesets {
  145. view_editor.notify_did_update_group_rows(group_changeset).await;
  146. }
  147. Ok(())
  148. }
  149. /// Notifies the view's field type-option data is changed
  150. /// For the moment, only the groups will be generated after the type-option data changed. A
  151. /// [FieldRevision] has a property named type_options contains a list of type-option data.
  152. /// # Arguments
  153. ///
  154. /// * `field_id`: the id of the field in current view
  155. ///
  156. #[tracing::instrument(level = "trace", skip(self), err)]
  157. pub(crate) async fn did_update_view_field_type_option(&self, field_id: &str) -> FlowyResult<()> {
  158. let view_editor = self.get_default_view_editor().await?;
  159. if view_editor.group_id().await == field_id {
  160. let _ = view_editor.group_by_view_field(field_id).await?;
  161. }
  162. let _ = view_editor.did_update_view_field_type_option(field_id).await?;
  163. Ok(())
  164. }
  165. pub(crate) async fn get_view_editor(&self, view_id: &str) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  166. debug_assert!(!view_id.is_empty());
  167. match self.view_editors.get(view_id) {
  168. None => {
  169. let editor = Arc::new(make_view_editor(&self.user, view_id, self.delegate.clone()).await?);
  170. self.view_editors.insert(view_id.to_owned(), editor.clone());
  171. Ok(editor)
  172. }
  173. Some(view_editor) => Ok(view_editor.clone()),
  174. }
  175. }
  176. async fn get_default_view_editor(&self) -> FlowyResult<Arc<GridViewRevisionEditor>> {
  177. self.get_view_editor(&self.grid_id).await
  178. }
  179. }
  180. async fn make_view_editor(
  181. user: &Arc<dyn GridUser>,
  182. view_id: &str,
  183. delegate: Arc<dyn GridViewEditorDelegate>,
  184. ) -> FlowyResult<GridViewRevisionEditor> {
  185. let rev_manager = make_grid_view_rev_manager(user, view_id).await?;
  186. let user_id = user.user_id()?;
  187. let token = user.token()?;
  188. let view_id = view_id.to_owned();
  189. GridViewRevisionEditor::new(&user_id, &token, view_id, delegate, rev_manager).await
  190. }
  191. pub async fn make_grid_view_rev_manager(
  192. user: &Arc<dyn GridUser>,
  193. view_id: &str,
  194. ) -> FlowyResult<RevisionManager<Arc<ConnectionPool>>> {
  195. let user_id = user.user_id()?;
  196. let pool = user.db_pool()?;
  197. let disk_cache = SQLiteGridViewRevisionPersistence::new(&user_id, pool.clone());
  198. let configuration = RevisionPersistenceConfiguration::new(2, false);
  199. let rev_persistence = RevisionPersistence::new(&user_id, view_id, disk_cache, configuration);
  200. let rev_compactor = GridViewRevisionCompress();
  201. let snapshot_persistence = SQLiteRevisionSnapshotPersistence::new(view_id, pool);
  202. Ok(RevisionManager::new(
  203. &user_id,
  204. view_id,
  205. rev_persistence,
  206. rev_compactor,
  207. snapshot_persistence,
  208. ))
  209. }