editor.rs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. use crate::dart_notification::{send_dart_notification, GridDartNotification};
  2. use crate::entities::*;
  3. use crate::services::block_manager::GridBlockEvent;
  4. use crate::services::filter::{FilterChangeset, FilterController, FilterTaskHandler, FilterType, UpdatedFilterType};
  5. use crate::services::group::{
  6. default_group_configuration, find_group_field, make_group_controller, Group, GroupConfigurationReader,
  7. GroupController, MoveGroupRowContext,
  8. };
  9. use crate::services::row::GridBlockRowRevision;
  10. use crate::services::sort::{SortChangeset, SortController, SortTaskHandler, SortType};
  11. use crate::services::view_editor::changed_notifier::GridViewChangedNotifier;
  12. use crate::services::view_editor::trait_impl::*;
  13. use crate::services::view_editor::GridViewChangedReceiverRunner;
  14. use flowy_database::ConnectionPool;
  15. use flowy_error::FlowyResult;
  16. use flowy_http_model::revision::Revision;
  17. use flowy_revision::RevisionManager;
  18. use flowy_sync::client_grid::{make_grid_view_operations, GridViewRevisionChangeset, GridViewRevisionPad};
  19. use flowy_task::TaskDispatcher;
  20. use grid_rev_model::{
  21. gen_grid_filter_id, gen_grid_sort_id, FieldRevision, FieldTypeRevision, FilterRevision, LayoutRevision,
  22. RowChangeset, RowRevision, SortRevision,
  23. };
  24. use lib_infra::async_trait::async_trait;
  25. use lib_infra::future::Fut;
  26. use lib_infra::ref_map::RefCountValue;
  27. use nanoid::nanoid;
  28. use std::borrow::Cow;
  29. use std::future::Future;
  30. use std::sync::Arc;
  31. use tokio::sync::{broadcast, RwLock};
  32. pub trait GridViewEditorDelegate: Send + Sync + 'static {
  33. /// If the field_ids is None, then it will return all the field revisions
  34. fn get_field_revs(&self, field_ids: Option<Vec<String>>) -> Fut<Vec<Arc<FieldRevision>>>;
  35. /// Returns the field with the field_id
  36. fn get_field_rev(&self, field_id: &str) -> Fut<Option<Arc<FieldRevision>>>;
  37. /// Returns the index of the row with row_id
  38. fn index_of_row(&self, row_id: &str) -> Fut<Option<usize>>;
  39. /// Returns the `index` and `RowRevision` with row_id
  40. fn get_row_rev(&self, row_id: &str) -> Fut<Option<(usize, Arc<RowRevision>)>>;
  41. /// Returns all the rows that the block has. If the passed-in block_ids is None, then will return all the rows
  42. /// The relationship between the grid and the block is:
  43. /// A grid has a list of blocks
  44. /// A block has a list of rows
  45. /// A row has a list of cells
  46. ///
  47. fn get_row_revs(&self, block_ids: Option<Vec<String>>) -> Fut<Vec<Arc<RowRevision>>>;
  48. /// Get all the blocks that the current Grid has.
  49. /// One grid has a list of blocks
  50. fn get_blocks(&self) -> Fut<Vec<GridBlockRowRevision>>;
  51. /// Returns a `TaskDispatcher` used to poll a `Task`
  52. fn get_task_scheduler(&self) -> Arc<RwLock<TaskDispatcher>>;
  53. }
  54. pub struct GridViewRevisionEditor {
  55. user_id: String,
  56. view_id: String,
  57. pad: Arc<RwLock<GridViewRevisionPad>>,
  58. rev_manager: Arc<RevisionManager<Arc<ConnectionPool>>>,
  59. delegate: Arc<dyn GridViewEditorDelegate>,
  60. group_controller: Arc<RwLock<Box<dyn GroupController>>>,
  61. filter_controller: Arc<RwLock<FilterController>>,
  62. sort_controller: Arc<RwLock<SortController>>,
  63. pub notifier: GridViewChangedNotifier,
  64. }
  65. impl GridViewRevisionEditor {
  66. #[tracing::instrument(level = "trace", skip_all, err)]
  67. pub async fn new(
  68. user_id: &str,
  69. token: &str,
  70. view_id: String,
  71. delegate: Arc<dyn GridViewEditorDelegate>,
  72. mut rev_manager: RevisionManager<Arc<ConnectionPool>>,
  73. ) -> FlowyResult<Self> {
  74. let (notifier, _) = broadcast::channel(100);
  75. tokio::spawn(GridViewChangedReceiverRunner(Some(notifier.subscribe())).run());
  76. let cloud = Arc::new(GridViewRevisionCloudService {
  77. token: token.to_owned(),
  78. });
  79. let view_rev_pad = match rev_manager.initialize::<GridViewRevisionSerde>(Some(cloud)).await {
  80. Ok(pad) => pad,
  81. Err(err) => {
  82. // It shouldn't be here, because the snapshot should come to recue.
  83. tracing::error!("Deserialize grid view revisions failed: {}", err);
  84. let view = GridViewRevisionPad::new(view_id.to_owned(), view_id.to_owned(), LayoutRevision::Table);
  85. let bytes = make_grid_view_operations(&view).json_bytes();
  86. let reset_revision = Revision::initial_revision(&view_id, bytes);
  87. let _ = rev_manager.reset_object(vec![reset_revision]).await;
  88. view
  89. }
  90. };
  91. let view_rev_pad = Arc::new(RwLock::new(view_rev_pad));
  92. let rev_manager = Arc::new(rev_manager);
  93. let group_controller = new_group_controller(
  94. user_id.to_owned(),
  95. view_id.clone(),
  96. view_rev_pad.clone(),
  97. rev_manager.clone(),
  98. delegate.clone(),
  99. )
  100. .await?;
  101. let sort_controller = make_sort_controller(&view_id, delegate.clone(), view_rev_pad.clone()).await;
  102. let user_id = user_id.to_owned();
  103. let group_controller = Arc::new(RwLock::new(group_controller));
  104. let filter_controller =
  105. make_filter_controller(&view_id, delegate.clone(), notifier.clone(), view_rev_pad.clone()).await;
  106. Ok(Self {
  107. pad: view_rev_pad,
  108. user_id,
  109. view_id,
  110. rev_manager,
  111. delegate,
  112. group_controller,
  113. filter_controller,
  114. sort_controller,
  115. notifier,
  116. })
  117. }
  118. #[tracing::instrument(name = "close grid view editor", level = "trace", skip_all)]
  119. pub async fn close(&self) {
  120. self.rev_manager.generate_snapshot().await;
  121. self.rev_manager.close().await;
  122. self.filter_controller.read().await.close().await;
  123. self.sort_controller.read().await.close().await;
  124. }
  125. pub async fn handle_block_event(&self, event: Cow<'_, GridBlockEvent>) {
  126. let changeset = match event.into_owned() {
  127. GridBlockEvent::InsertRow { block_id: _, row } => {
  128. //
  129. GridViewRowsChangesetPB::from_insert(self.view_id.clone(), vec![row])
  130. }
  131. GridBlockEvent::UpdateRow { block_id: _, row } => {
  132. //
  133. GridViewRowsChangesetPB::from_update(self.view_id.clone(), vec![row])
  134. }
  135. GridBlockEvent::DeleteRow { block_id: _, row_id } => {
  136. //
  137. GridViewRowsChangesetPB::from_delete(self.view_id.clone(), vec![row_id])
  138. }
  139. GridBlockEvent::Move {
  140. block_id: _,
  141. deleted_row_id,
  142. inserted_row,
  143. } => {
  144. //
  145. GridViewRowsChangesetPB::from_move(self.view_id.clone(), vec![deleted_row_id], vec![inserted_row])
  146. }
  147. };
  148. send_dart_notification(&self.view_id, GridDartNotification::DidUpdateGridViewRows)
  149. .payload(changeset)
  150. .send();
  151. }
  152. pub async fn sort_rows(&self, rows: &mut Vec<Arc<RowRevision>>) {
  153. self.sort_controller.read().await.sort_rows(rows)
  154. }
  155. pub async fn filter_rows(&self, _block_id: &str, mut rows: Vec<Arc<RowRevision>>) -> Vec<Arc<RowRevision>> {
  156. self.filter_controller.write().await.filter_row_revs(&mut rows).await;
  157. rows
  158. }
  159. pub async fn duplicate_view_data(&self) -> FlowyResult<String> {
  160. let json_str = self.pad.read().await.json_str()?;
  161. Ok(json_str)
  162. }
  163. pub async fn will_create_view_row(&self, row_rev: &mut RowRevision, params: &CreateRowParams) {
  164. if params.group_id.is_none() {
  165. return;
  166. }
  167. let group_id = params.group_id.as_ref().unwrap();
  168. let _ = self
  169. .mut_group_controller(|group_controller, field_rev| {
  170. group_controller.will_create_row(row_rev, &field_rev, group_id);
  171. Ok(())
  172. })
  173. .await;
  174. }
  175. pub async fn did_create_view_row(&self, row_pb: &RowPB, params: &CreateRowParams) {
  176. // Send the group notification if the current view has groups
  177. match params.group_id.as_ref() {
  178. None => {}
  179. Some(group_id) => {
  180. let index = match params.start_row_id {
  181. None => Some(0),
  182. Some(_) => None,
  183. };
  184. self.group_controller.write().await.did_create_row(row_pb, group_id);
  185. let inserted_row = InsertedRowPB {
  186. row: row_pb.clone(),
  187. index,
  188. is_new: true,
  189. };
  190. let changeset = GroupRowsNotificationPB::insert(group_id.clone(), vec![inserted_row]);
  191. self.notify_did_update_group_rows(changeset).await;
  192. }
  193. }
  194. }
  195. #[tracing::instrument(level = "trace", skip_all)]
  196. pub async fn did_delete_view_row(&self, row_rev: &RowRevision) {
  197. // Send the group notification if the current view has groups;
  198. let changesets = self
  199. .mut_group_controller(|group_controller, field_rev| {
  200. group_controller.did_delete_delete_row(row_rev, &field_rev)
  201. })
  202. .await;
  203. tracing::trace!("Delete row in view changeset: {:?}", changesets);
  204. if let Some(changesets) = changesets {
  205. for changeset in changesets {
  206. self.notify_did_update_group_rows(changeset).await;
  207. }
  208. }
  209. }
  210. pub async fn did_update_view_cell(&self, row_rev: &RowRevision) {
  211. let changesets = self
  212. .mut_group_controller(|group_controller, field_rev| {
  213. group_controller.did_update_group_row(row_rev, &field_rev)
  214. })
  215. .await;
  216. if let Some(changesets) = changesets {
  217. for changeset in changesets {
  218. self.notify_did_update_group_rows(changeset).await;
  219. }
  220. }
  221. let filter_controller = self.filter_controller.clone();
  222. let row_id = row_rev.id.clone();
  223. tokio::spawn(async move {
  224. filter_controller.write().await.did_receive_row_changed(&row_id).await;
  225. });
  226. }
  227. pub async fn move_view_group_row(
  228. &self,
  229. row_rev: &RowRevision,
  230. row_changeset: &mut RowChangeset,
  231. to_group_id: &str,
  232. to_row_id: Option<String>,
  233. ) -> Vec<GroupRowsNotificationPB> {
  234. let changesets = self
  235. .mut_group_controller(|group_controller, field_rev| {
  236. let move_row_context = MoveGroupRowContext {
  237. row_rev,
  238. row_changeset,
  239. field_rev: field_rev.as_ref(),
  240. to_group_id,
  241. to_row_id,
  242. };
  243. let changesets = group_controller.move_group_row(move_row_context)?;
  244. Ok(changesets)
  245. })
  246. .await;
  247. changesets.unwrap_or_default()
  248. }
  249. /// Only call once after grid view editor initialized
  250. #[tracing::instrument(level = "trace", skip(self))]
  251. pub async fn load_view_groups(&self) -> FlowyResult<Vec<GroupPB>> {
  252. let groups = self
  253. .group_controller
  254. .read()
  255. .await
  256. .groups()
  257. .into_iter()
  258. .cloned()
  259. .collect::<Vec<Group>>();
  260. tracing::trace!("Number of groups: {}", groups.len());
  261. Ok(groups.into_iter().map(GroupPB::from).collect())
  262. }
  263. #[tracing::instrument(level = "trace", skip(self), err)]
  264. pub async fn move_view_group(&self, params: MoveGroupParams) -> FlowyResult<()> {
  265. let _ = self
  266. .group_controller
  267. .write()
  268. .await
  269. .move_group(&params.from_group_id, &params.to_group_id)?;
  270. match self.group_controller.read().await.get_group(&params.from_group_id) {
  271. None => tracing::warn!("Can not find the group with id: {}", params.from_group_id),
  272. Some((index, group)) => {
  273. let inserted_group = InsertedGroupPB {
  274. group: GroupPB::from(group),
  275. index: index as i32,
  276. };
  277. let changeset = GroupViewChangesetPB {
  278. view_id: self.view_id.clone(),
  279. inserted_groups: vec![inserted_group],
  280. deleted_groups: vec![params.from_group_id.clone()],
  281. update_groups: vec![],
  282. new_groups: vec![],
  283. };
  284. self.notify_did_update_view(changeset).await;
  285. }
  286. }
  287. Ok(())
  288. }
  289. pub async fn group_id(&self) -> String {
  290. self.group_controller.read().await.field_id().to_string()
  291. }
  292. pub async fn get_view_setting(&self) -> GridSettingPB {
  293. let field_revs = self.delegate.get_field_revs(None).await;
  294. let grid_setting = make_grid_setting(&*self.pad.read().await, &field_revs);
  295. grid_setting
  296. }
  297. pub async fn get_all_view_filters(&self) -> Vec<Arc<FilterRevision>> {
  298. let field_revs = self.delegate.get_field_revs(None).await;
  299. self.pad.read().await.get_all_filters(&field_revs)
  300. }
  301. pub async fn get_view_filters(&self, filter_type: &FilterType) -> Vec<Arc<FilterRevision>> {
  302. let field_type_rev: FieldTypeRevision = filter_type.field_type.clone().into();
  303. self.pad
  304. .read()
  305. .await
  306. .get_filters(&filter_type.field_id, &field_type_rev)
  307. }
  308. /// Initialize new group when grouping by a new field
  309. ///
  310. pub async fn initialize_new_group(&self, params: InsertGroupParams) -> FlowyResult<()> {
  311. if let Some(field_rev) = self.delegate.get_field_rev(&params.field_id).await {
  312. let _ = self
  313. .modify(|pad| {
  314. let configuration = default_group_configuration(&field_rev);
  315. let changeset = pad.insert_or_update_group_configuration(
  316. &params.field_id,
  317. &params.field_type_rev,
  318. configuration,
  319. )?;
  320. Ok(changeset)
  321. })
  322. .await?;
  323. }
  324. if self.group_controller.read().await.field_id() != params.field_id {
  325. let _ = self.group_by_view_field(&params.field_id).await?;
  326. self.notify_did_update_setting().await;
  327. }
  328. Ok(())
  329. }
  330. pub async fn delete_view_group(&self, params: DeleteGroupParams) -> FlowyResult<()> {
  331. self.modify(|pad| {
  332. let changeset = pad.delete_group(&params.group_id, &params.field_id, &params.field_type_rev)?;
  333. Ok(changeset)
  334. })
  335. .await
  336. }
  337. pub async fn insert_view_sort(&self, params: AlterSortParams) -> FlowyResult<()> {
  338. let sort_type = SortType::from(&params);
  339. let is_exist = params.sort_id.is_some();
  340. let sort_id = match params.sort_id {
  341. None => gen_grid_sort_id(),
  342. Some(sort_id) => sort_id,
  343. };
  344. let sort_rev = SortRevision {
  345. id: sort_id,
  346. field_id: params.field_id.clone(),
  347. field_type: params.field_type,
  348. condition: params.condition,
  349. };
  350. let mut sort_controller = self.sort_controller.write().await;
  351. let changeset = if is_exist {
  352. self.modify(|pad| {
  353. let changeset = pad.update_sort(&params.field_id, sort_rev)?;
  354. Ok(changeset)
  355. })
  356. .await?;
  357. sort_controller
  358. .did_receive_changes(SortChangeset::from_update(sort_type))
  359. .await
  360. } else {
  361. self.modify(|pad| {
  362. let changeset = pad.insert_sort(&params.field_id, sort_rev)?;
  363. Ok(changeset)
  364. })
  365. .await?;
  366. sort_controller
  367. .did_receive_changes(SortChangeset::from_insert(sort_type))
  368. .await
  369. };
  370. if let Some(changeset) = changeset {
  371. self.notify_did_update_sort(changeset).await;
  372. }
  373. Ok(())
  374. }
  375. pub async fn delete_view_sort(&self, params: DeleteSortParams) -> FlowyResult<()> {
  376. let sort_type = params.sort_type;
  377. let changeset = self
  378. .sort_controller
  379. .write()
  380. .await
  381. .did_receive_changes(SortChangeset::from_delete(sort_type.clone()))
  382. .await;
  383. let _ = self
  384. .modify(|pad| {
  385. let changeset = pad.delete_sort(&params.sort_id, &sort_type.field_id, sort_type.field_type)?;
  386. Ok(changeset)
  387. })
  388. .await?;
  389. if changeset.is_some() {
  390. self.notify_did_update_sort(changeset.unwrap()).await;
  391. }
  392. Ok(())
  393. }
  394. #[tracing::instrument(level = "trace", skip(self), err)]
  395. pub async fn insert_view_filter(&self, params: AlterFilterParams) -> FlowyResult<()> {
  396. let filter_type = FilterType::from(&params);
  397. let is_exist = params.filter_id.is_some();
  398. let filter_id = match params.filter_id {
  399. None => gen_grid_filter_id(),
  400. Some(filter_id) => filter_id,
  401. };
  402. let filter_rev = FilterRevision {
  403. id: filter_id.clone(),
  404. field_id: params.field_id.clone(),
  405. field_type: params.field_type,
  406. condition: params.condition,
  407. content: params.content,
  408. };
  409. let mut filter_controller = self.filter_controller.write().await;
  410. let changeset = if is_exist {
  411. let old_filter_type = self
  412. .delegate
  413. .get_field_rev(&params.field_id)
  414. .await
  415. .map(|field| FilterType::from(&field));
  416. self.modify(|pad| {
  417. let changeset = pad.update_filter(&params.field_id, filter_rev)?;
  418. Ok(changeset)
  419. })
  420. .await?;
  421. filter_controller
  422. .did_receive_changes(FilterChangeset::from_update(UpdatedFilterType::new(
  423. old_filter_type,
  424. filter_type,
  425. )))
  426. .await
  427. } else {
  428. self.modify(|pad| {
  429. let changeset = pad.insert_filter(&params.field_id, filter_rev)?;
  430. Ok(changeset)
  431. })
  432. .await?;
  433. filter_controller
  434. .did_receive_changes(FilterChangeset::from_insert(filter_type))
  435. .await
  436. };
  437. if let Some(changeset) = changeset {
  438. self.notify_did_update_filter(changeset).await;
  439. }
  440. Ok(())
  441. }
  442. #[tracing::instrument(level = "trace", skip(self), err)]
  443. pub async fn delete_view_filter(&self, params: DeleteFilterParams) -> FlowyResult<()> {
  444. let filter_type = params.filter_type;
  445. let changeset = self
  446. .filter_controller
  447. .write()
  448. .await
  449. .did_receive_changes(FilterChangeset::from_delete(filter_type.clone()))
  450. .await;
  451. let _ = self
  452. .modify(|pad| {
  453. let changeset = pad.delete_filter(&params.filter_id, &filter_type.field_id, filter_type.field_type)?;
  454. Ok(changeset)
  455. })
  456. .await?;
  457. if changeset.is_some() {
  458. self.notify_did_update_filter(changeset.unwrap()).await;
  459. }
  460. Ok(())
  461. }
  462. #[tracing::instrument(level = "trace", skip_all, err)]
  463. pub async fn did_update_view_field_type_option(
  464. &self,
  465. field_id: &str,
  466. old_field_rev: Option<Arc<FieldRevision>>,
  467. ) -> FlowyResult<()> {
  468. if let Some(field_rev) = self.delegate.get_field_rev(field_id).await {
  469. let old = old_field_rev.map(|old_field_rev| FilterType::from(&old_field_rev));
  470. let new = FilterType::from(&field_rev);
  471. let filter_type = UpdatedFilterType::new(old, new);
  472. let filter_changeset = FilterChangeset::from_update(filter_type);
  473. if let Some(changeset) = self
  474. .filter_controller
  475. .write()
  476. .await
  477. .did_receive_changes(filter_changeset)
  478. .await
  479. {
  480. self.notify_did_update_filter(changeset).await;
  481. }
  482. }
  483. Ok(())
  484. }
  485. ///
  486. ///
  487. /// # Arguments
  488. ///
  489. /// * `field_id`:
  490. ///
  491. #[tracing::instrument(level = "debug", skip_all, err)]
  492. pub async fn group_by_view_field(&self, field_id: &str) -> FlowyResult<()> {
  493. if let Some(field_rev) = self.delegate.get_field_rev(field_id).await {
  494. let row_revs = self.delegate.get_row_revs(None).await;
  495. let new_group_controller = new_group_controller_with_field_rev(
  496. self.user_id.clone(),
  497. self.view_id.clone(),
  498. self.pad.clone(),
  499. self.rev_manager.clone(),
  500. field_rev,
  501. row_revs,
  502. )
  503. .await?;
  504. let new_groups = new_group_controller
  505. .groups()
  506. .into_iter()
  507. .map(|group| GroupPB::from(group.clone()))
  508. .collect();
  509. *self.group_controller.write().await = new_group_controller;
  510. let changeset = GroupViewChangesetPB {
  511. view_id: self.view_id.clone(),
  512. new_groups,
  513. ..Default::default()
  514. };
  515. debug_assert!(!changeset.is_empty());
  516. if !changeset.is_empty() {
  517. send_dart_notification(&changeset.view_id, GridDartNotification::DidGroupByNewField)
  518. .payload(changeset)
  519. .send();
  520. }
  521. }
  522. Ok(())
  523. }
  524. async fn notify_did_update_setting(&self) {
  525. let setting = self.get_view_setting().await;
  526. send_dart_notification(&self.view_id, GridDartNotification::DidUpdateGridSetting)
  527. .payload(setting)
  528. .send();
  529. }
  530. pub async fn notify_did_update_group_rows(&self, payload: GroupRowsNotificationPB) {
  531. send_dart_notification(&payload.group_id, GridDartNotification::DidUpdateGroup)
  532. .payload(payload)
  533. .send();
  534. }
  535. pub async fn notify_did_update_filter(&self, changeset: FilterChangesetNotificationPB) {
  536. send_dart_notification(&changeset.view_id, GridDartNotification::DidUpdateFilter)
  537. .payload(changeset)
  538. .send();
  539. }
  540. pub async fn notify_did_update_sort(&self, changeset: SortChangesetNotificationPB) {
  541. send_dart_notification(&changeset.view_id, GridDartNotification::DidUpdateSort)
  542. .payload(changeset)
  543. .send();
  544. }
  545. async fn notify_did_update_view(&self, changeset: GroupViewChangesetPB) {
  546. send_dart_notification(&self.view_id, GridDartNotification::DidUpdateGroupView)
  547. .payload(changeset)
  548. .send();
  549. }
  550. async fn modify<F>(&self, f: F) -> FlowyResult<()>
  551. where
  552. F: for<'a> FnOnce(&'a mut GridViewRevisionPad) -> FlowyResult<Option<GridViewRevisionChangeset>>,
  553. {
  554. let mut write_guard = self.pad.write().await;
  555. match f(&mut *write_guard)? {
  556. None => {}
  557. Some(change) => {
  558. let _ = apply_change(&self.user_id, self.rev_manager.clone(), change).await?;
  559. }
  560. }
  561. Ok(())
  562. }
  563. async fn mut_group_controller<F, T>(&self, f: F) -> Option<T>
  564. where
  565. F: FnOnce(&mut Box<dyn GroupController>, Arc<FieldRevision>) -> FlowyResult<T>,
  566. {
  567. let group_field_id = self.group_controller.read().await.field_id().to_owned();
  568. match self.delegate.get_field_rev(&group_field_id).await {
  569. None => None,
  570. Some(field_rev) => {
  571. let mut write_guard = self.group_controller.write().await;
  572. f(&mut write_guard, field_rev).ok()
  573. }
  574. }
  575. }
  576. #[allow(dead_code)]
  577. async fn async_mut_group_controller<F, O, T>(&self, f: F) -> Option<T>
  578. where
  579. F: FnOnce(Arc<RwLock<Box<dyn GroupController>>>, Arc<FieldRevision>) -> O,
  580. O: Future<Output = FlowyResult<T>> + Sync + 'static,
  581. {
  582. let group_field_id = self.group_controller.read().await.field_id().to_owned();
  583. match self.delegate.get_field_rev(&group_field_id).await {
  584. None => None,
  585. Some(field_rev) => {
  586. let _write_guard = self.group_controller.write().await;
  587. f(self.group_controller.clone(), field_rev).await.ok()
  588. }
  589. }
  590. }
  591. }
  592. #[async_trait]
  593. impl RefCountValue for GridViewRevisionEditor {
  594. async fn did_remove(&self) {
  595. self.close().await;
  596. }
  597. }
  598. async fn new_group_controller(
  599. user_id: String,
  600. view_id: String,
  601. view_rev_pad: Arc<RwLock<GridViewRevisionPad>>,
  602. rev_manager: Arc<RevisionManager<Arc<ConnectionPool>>>,
  603. delegate: Arc<dyn GridViewEditorDelegate>,
  604. ) -> FlowyResult<Box<dyn GroupController>> {
  605. let configuration_reader = GroupConfigurationReaderImpl(view_rev_pad.clone());
  606. let field_revs = delegate.get_field_revs(None).await;
  607. let row_revs = delegate.get_row_revs(None).await;
  608. let layout = view_rev_pad.read().await.layout();
  609. // Read the group field or find a new group field
  610. let field_rev = configuration_reader
  611. .get_configuration()
  612. .await
  613. .and_then(|configuration| {
  614. field_revs
  615. .iter()
  616. .find(|field_rev| field_rev.id == configuration.field_id)
  617. .cloned()
  618. })
  619. .unwrap_or_else(|| find_group_field(&field_revs, &layout).unwrap());
  620. new_group_controller_with_field_rev(user_id, view_id, view_rev_pad, rev_manager, field_rev, row_revs).await
  621. }
  622. /// Returns a [GroupController]
  623. ///
  624. async fn new_group_controller_with_field_rev(
  625. user_id: String,
  626. view_id: String,
  627. view_rev_pad: Arc<RwLock<GridViewRevisionPad>>,
  628. rev_manager: Arc<RevisionManager<Arc<ConnectionPool>>>,
  629. field_rev: Arc<FieldRevision>,
  630. row_revs: Vec<Arc<RowRevision>>,
  631. ) -> FlowyResult<Box<dyn GroupController>> {
  632. let configuration_reader = GroupConfigurationReaderImpl(view_rev_pad.clone());
  633. let configuration_writer = GroupConfigurationWriterImpl {
  634. user_id,
  635. rev_manager,
  636. view_pad: view_rev_pad,
  637. };
  638. make_group_controller(view_id, field_rev, row_revs, configuration_reader, configuration_writer).await
  639. }
  640. async fn make_filter_controller(
  641. view_id: &str,
  642. delegate: Arc<dyn GridViewEditorDelegate>,
  643. notifier: GridViewChangedNotifier,
  644. pad: Arc<RwLock<GridViewRevisionPad>>,
  645. ) -> Arc<RwLock<FilterController>> {
  646. let field_revs = delegate.get_field_revs(None).await;
  647. let filter_revs = pad.read().await.get_all_filters(&field_revs);
  648. let task_scheduler = delegate.get_task_scheduler();
  649. let filter_delegate = GridViewFilterDelegateImpl {
  650. editor_delegate: delegate.clone(),
  651. view_revision_pad: pad,
  652. };
  653. let handler_id = gen_handler_id();
  654. let filter_controller = FilterController::new(
  655. view_id,
  656. &handler_id,
  657. filter_delegate,
  658. task_scheduler.clone(),
  659. filter_revs,
  660. notifier,
  661. )
  662. .await;
  663. let filter_controller = Arc::new(RwLock::new(filter_controller));
  664. task_scheduler
  665. .write()
  666. .await
  667. .register_handler(FilterTaskHandler::new(handler_id, filter_controller.clone()));
  668. filter_controller
  669. }
  670. async fn make_sort_controller(
  671. view_id: &str,
  672. delegate: Arc<dyn GridViewEditorDelegate>,
  673. pad: Arc<RwLock<GridViewRevisionPad>>,
  674. ) -> Arc<RwLock<SortController>> {
  675. let handler_id = gen_handler_id();
  676. let sort_delegate = GridViewSortDelegateImpl {
  677. editor_delegate: delegate.clone(),
  678. view_revision_pad: pad,
  679. };
  680. let task_scheduler = delegate.get_task_scheduler();
  681. let sort_controller = Arc::new(RwLock::new(SortController::new(
  682. view_id,
  683. &handler_id,
  684. sort_delegate,
  685. task_scheduler.clone(),
  686. )));
  687. task_scheduler
  688. .write()
  689. .await
  690. .register_handler(SortTaskHandler::new(handler_id, sort_controller.clone()));
  691. sort_controller
  692. }
  693. fn gen_handler_id() -> String {
  694. nanoid!(10)
  695. }
  696. #[cfg(test)]
  697. mod tests {
  698. use flowy_sync::client_grid::GridOperations;
  699. #[test]
  700. fn test() {
  701. let s1 = r#"[{"insert":"{\"view_id\":\"fTURELffPr\",\"grid_id\":\"fTURELffPr\",\"layout\":0,\"filters\":[],\"groups\":[]}"}]"#;
  702. let _delta_1 = GridOperations::from_json(s1).unwrap();
  703. let s2 = r#"[{"retain":195},{"insert":"{\\\"group_id\\\":\\\"wD9i\\\",\\\"visible\\\":true},{\\\"group_id\\\":\\\"xZtv\\\",\\\"visible\\\":true},{\\\"group_id\\\":\\\"tFV2\\\",\\\"visible\\\":true}"},{"retain":10}]"#;
  704. let _delta_2 = GridOperations::from_json(s2).unwrap();
  705. }
  706. }