view_editor.rs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953
  1. use std::borrow::Cow;
  2. use std::collections::HashMap;
  3. use std::sync::Arc;
  4. use collab_database::database::{gen_database_filter_id, gen_database_sort_id, MutexDatabase};
  5. use collab_database::fields::{Field, TypeOptionData};
  6. use collab_database::rows::{Cells, Row, RowCell, RowDetail, RowId};
  7. use collab_database::views::{DatabaseLayout, DatabaseView, LayoutSetting};
  8. use tokio::sync::{broadcast, RwLock};
  9. use flowy_error::{FlowyError, FlowyResult};
  10. use flowy_task::TaskDispatcher;
  11. use lib_infra::future::Fut;
  12. use crate::entities::{
  13. CalendarEventPB, DatabaseLayoutMetaPB, DatabaseLayoutSettingPB, DeleteFilterParams,
  14. DeleteGroupParams, DeleteSortParams, FieldType, FieldVisibility, GroupChangesPB, GroupPB,
  15. GroupRowsNotificationPB, InsertedRowPB, LayoutSettingParams, RowMetaPB, RowsChangePB,
  16. SortChangesetNotificationPB, SortPB, UpdateFilterParams, UpdateSortParams,
  17. };
  18. use crate::notification::{send_notification, DatabaseNotification};
  19. use crate::services::cell::CellCache;
  20. use crate::services::database::{database_view_setting_pb_from_view, DatabaseRowEvent, UpdatedRow};
  21. use crate::services::database_view::view_filter::make_filter_controller;
  22. use crate::services::database_view::view_group::{
  23. get_cell_for_row, get_cells_for_field, new_group_controller, new_group_controller_with_field,
  24. };
  25. use crate::services::database_view::view_sort::make_sort_controller;
  26. use crate::services::database_view::{
  27. notify_did_update_filter, notify_did_update_group_rows, notify_did_update_num_of_groups,
  28. notify_did_update_setting, notify_did_update_sort, DatabaseLayoutDepsResolver,
  29. DatabaseViewChangedNotifier, DatabaseViewChangedReceiverRunner,
  30. };
  31. use crate::services::field::TypeOptionCellDataHandler;
  32. use crate::services::field_settings::FieldSettings;
  33. use crate::services::filter::{
  34. Filter, FilterChangeset, FilterController, FilterType, UpdatedFilterType,
  35. };
  36. use crate::services::group::{
  37. GroupController, GroupSetting, GroupSettingChangeset, MoveGroupRowContext, RowChangeset,
  38. };
  39. use crate::services::setting::CalendarLayoutSetting;
  40. use crate::services::sort::{DeletedSortType, Sort, SortChangeset, SortController, SortType};
  41. pub trait DatabaseViewData: Send + Sync + 'static {
  42. fn get_database(&self) -> Arc<MutexDatabase>;
  43. fn get_view(&self, view_id: &str) -> Fut<Option<DatabaseView>>;
  44. /// If the field_ids is None, then it will return all the field revisions
  45. fn get_fields(&self, view_id: &str, field_ids: Option<Vec<String>>) -> Fut<Vec<Arc<Field>>>;
  46. /// Returns the field with the field_id
  47. fn get_field(&self, field_id: &str) -> Fut<Option<Arc<Field>>>;
  48. fn create_field(
  49. &self,
  50. view_id: &str,
  51. name: &str,
  52. field_type: FieldType,
  53. type_option_data: TypeOptionData,
  54. ) -> Fut<Field>;
  55. fn get_primary_field(&self) -> Fut<Option<Arc<Field>>>;
  56. /// Returns the index of the row with row_id
  57. fn index_of_row(&self, view_id: &str, row_id: &RowId) -> Fut<Option<usize>>;
  58. /// Returns the `index` and `RowRevision` with row_id
  59. fn get_row(&self, view_id: &str, row_id: &RowId) -> Fut<Option<(usize, Arc<RowDetail>)>>;
  60. /// Returns all the rows in the view
  61. fn get_rows(&self, view_id: &str) -> Fut<Vec<Arc<RowDetail>>>;
  62. fn get_cells_for_field(&self, view_id: &str, field_id: &str) -> Fut<Vec<Arc<RowCell>>>;
  63. fn get_cell_in_row(&self, field_id: &str, row_id: &RowId) -> Fut<Arc<RowCell>>;
  64. /// Return the database layout type for the view with given view_id
  65. /// The default layout type is [DatabaseLayout::Grid]
  66. fn get_layout_for_view(&self, view_id: &str) -> DatabaseLayout;
  67. fn get_group_setting(&self, view_id: &str) -> Vec<GroupSetting>;
  68. fn insert_group_setting(&self, view_id: &str, setting: GroupSetting);
  69. fn get_sort(&self, view_id: &str, sort_id: &str) -> Option<Sort>;
  70. fn insert_sort(&self, view_id: &str, sort: Sort);
  71. fn remove_sort(&self, view_id: &str, sort_id: &str);
  72. fn get_all_sorts(&self, view_id: &str) -> Vec<Sort>;
  73. fn remove_all_sorts(&self, view_id: &str);
  74. fn get_all_filters(&self, view_id: &str) -> Vec<Arc<Filter>>;
  75. fn delete_filter(&self, view_id: &str, filter_id: &str);
  76. fn insert_filter(&self, view_id: &str, filter: Filter);
  77. fn get_filter(&self, view_id: &str, filter_id: &str) -> Option<Filter>;
  78. fn get_filter_by_field_id(&self, view_id: &str, field_id: &str) -> Option<Filter>;
  79. fn get_layout_setting(&self, view_id: &str, layout_ty: &DatabaseLayout) -> Option<LayoutSetting>;
  80. fn insert_layout_setting(
  81. &self,
  82. view_id: &str,
  83. layout_ty: &DatabaseLayout,
  84. layout_setting: LayoutSetting,
  85. );
  86. fn update_layout_type(&self, view_id: &str, layout_type: &DatabaseLayout);
  87. /// Returns a `TaskDispatcher` used to poll a `Task`
  88. fn get_task_scheduler(&self) -> Arc<RwLock<TaskDispatcher>>;
  89. fn get_type_option_cell_handler(
  90. &self,
  91. field: &Field,
  92. field_type: &FieldType,
  93. ) -> Option<Box<dyn TypeOptionCellDataHandler>>;
  94. fn get_field_settings(
  95. &self,
  96. view_id: &str,
  97. field_ids: &[String],
  98. ) -> HashMap<String, FieldSettings>;
  99. fn get_all_field_settings(&self, view_id: &str) -> HashMap<String, FieldSettings>;
  100. fn update_field_settings(
  101. &self,
  102. view_id: &str,
  103. field_id: &str,
  104. visibility: Option<FieldVisibility>,
  105. );
  106. }
  107. pub struct DatabaseViewEditor {
  108. pub view_id: String,
  109. delegate: Arc<dyn DatabaseViewData>,
  110. group_controller: Arc<RwLock<Option<Box<dyn GroupController>>>>,
  111. filter_controller: Arc<FilterController>,
  112. sort_controller: Arc<RwLock<SortController>>,
  113. pub notifier: DatabaseViewChangedNotifier,
  114. }
  115. impl Drop for DatabaseViewEditor {
  116. fn drop(&mut self) {
  117. tracing::trace!("Drop {}", std::any::type_name::<Self>());
  118. }
  119. }
  120. impl DatabaseViewEditor {
  121. pub async fn new(
  122. view_id: String,
  123. delegate: Arc<dyn DatabaseViewData>,
  124. cell_cache: CellCache,
  125. ) -> FlowyResult<Self> {
  126. let (notifier, _) = broadcast::channel(100);
  127. tokio::spawn(DatabaseViewChangedReceiverRunner(Some(notifier.subscribe())).run());
  128. let group_controller = new_group_controller(view_id.clone(), delegate.clone()).await?;
  129. let group_controller = Arc::new(RwLock::new(group_controller));
  130. let filter_controller = make_filter_controller(
  131. &view_id,
  132. delegate.clone(),
  133. notifier.clone(),
  134. cell_cache.clone(),
  135. )
  136. .await;
  137. let sort_controller = make_sort_controller(
  138. &view_id,
  139. delegate.clone(),
  140. notifier.clone(),
  141. filter_controller.clone(),
  142. cell_cache,
  143. )
  144. .await;
  145. Ok(Self {
  146. view_id,
  147. delegate,
  148. group_controller,
  149. filter_controller,
  150. sort_controller,
  151. notifier,
  152. })
  153. }
  154. pub async fn close(&self) {
  155. self.sort_controller.write().await.close().await;
  156. self.filter_controller.close().await;
  157. }
  158. pub async fn get_view(&self) -> Option<DatabaseView> {
  159. self.delegate.get_view(&self.view_id).await
  160. }
  161. pub async fn v_will_create_row(&self, cells: &mut Cells, group_id: &Option<String>) {
  162. if group_id.is_none() {
  163. return;
  164. }
  165. let group_id = group_id.as_ref().unwrap();
  166. let _ = self
  167. .mut_group_controller(|group_controller, field| {
  168. group_controller.will_create_row(cells, &field, group_id);
  169. Ok(())
  170. })
  171. .await;
  172. }
  173. pub async fn v_did_update_row_meta(&self, row_id: &RowId, row_detail: &RowDetail) {
  174. let update_row = UpdatedRow::new(row_id.as_str()).with_row_meta(row_detail.clone());
  175. let changeset = RowsChangePB::from_update(update_row.into());
  176. send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
  177. .payload(changeset)
  178. .send();
  179. }
  180. pub async fn v_did_create_row(
  181. &self,
  182. row_detail: &RowDetail,
  183. group_id: &Option<String>,
  184. index: usize,
  185. ) {
  186. let changes: RowsChangePB;
  187. // Send the group notification if the current view has groups
  188. match group_id.as_ref() {
  189. None => {
  190. let row = InsertedRowPB::new(RowMetaPB::from(row_detail)).with_index(index as i32);
  191. changes = RowsChangePB::from_insert(row);
  192. },
  193. Some(group_id) => {
  194. self
  195. .mut_group_controller(|group_controller, _| {
  196. group_controller.did_create_row(row_detail, group_id);
  197. Ok(())
  198. })
  199. .await;
  200. let inserted_row = InsertedRowPB {
  201. row_meta: RowMetaPB::from(row_detail),
  202. index: Some(index as i32),
  203. is_new: true,
  204. };
  205. let changeset =
  206. GroupRowsNotificationPB::insert(group_id.clone(), vec![inserted_row.clone()]);
  207. notify_did_update_group_rows(changeset).await;
  208. changes = RowsChangePB::from_insert(inserted_row);
  209. },
  210. }
  211. send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
  212. .payload(changes)
  213. .send();
  214. }
  215. #[tracing::instrument(level = "trace", skip_all)]
  216. pub async fn v_did_delete_row(&self, row: &Row) {
  217. // Send the group notification if the current view has groups;
  218. let result = self
  219. .mut_group_controller(|group_controller, field| {
  220. group_controller.did_delete_delete_row(row, &field)
  221. })
  222. .await;
  223. if let Some(result) = result {
  224. tracing::trace!("Delete row in view changeset: {:?}", result.row_changesets);
  225. for changeset in result.row_changesets {
  226. notify_did_update_group_rows(changeset).await;
  227. }
  228. }
  229. let changes = RowsChangePB::from_delete(row.id.clone().into_inner());
  230. send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
  231. .payload(changes)
  232. .send();
  233. }
  234. /// Notify the view that the row has been updated. If the view has groups,
  235. /// send the group notification with [GroupRowsNotificationPB]. Otherwise,
  236. /// send the view notification with [RowsChangePB]
  237. pub async fn v_did_update_row(
  238. &self,
  239. old_row: &Option<RowDetail>,
  240. row_detail: &RowDetail,
  241. field_id: &str,
  242. ) {
  243. let result = self
  244. .mut_group_controller(|group_controller, field| {
  245. Ok(group_controller.did_update_group_row(old_row, row_detail, &field))
  246. })
  247. .await;
  248. if let Some(Ok(result)) = result {
  249. let mut group_changes = GroupChangesPB {
  250. view_id: self.view_id.clone(),
  251. ..Default::default()
  252. };
  253. if let Some(inserted_group) = result.inserted_group {
  254. tracing::trace!("Create group after editing the row: {:?}", inserted_group);
  255. group_changes.inserted_groups.push(inserted_group);
  256. }
  257. if let Some(delete_group) = result.deleted_group {
  258. tracing::trace!("Delete group after editing the row: {:?}", delete_group);
  259. group_changes.deleted_groups.push(delete_group.group_id);
  260. }
  261. if !group_changes.is_empty() {
  262. notify_did_update_num_of_groups(&self.view_id, group_changes).await;
  263. }
  264. for changeset in result.row_changesets {
  265. if !changeset.is_empty() {
  266. tracing::trace!("Group change after editing the row: {:?}", changeset);
  267. notify_did_update_group_rows(changeset).await;
  268. }
  269. }
  270. } else {
  271. let update_row =
  272. UpdatedRow::new(&row_detail.row.id).with_field_ids(vec![field_id.to_string()]);
  273. let changeset = RowsChangePB::from_update(update_row.into());
  274. send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
  275. .payload(changeset)
  276. .send();
  277. }
  278. // Each row update will trigger a filter and sort operation. We don't want
  279. // to block the main thread, so we spawn a new task to do the work.
  280. let row_id = row_detail.row.id.clone();
  281. let weak_filter_controller = Arc::downgrade(&self.filter_controller);
  282. let weak_sort_controller = Arc::downgrade(&self.sort_controller);
  283. tokio::spawn(async move {
  284. if let Some(filter_controller) = weak_filter_controller.upgrade() {
  285. filter_controller
  286. .did_receive_row_changed(row_id.clone())
  287. .await;
  288. }
  289. if let Some(sort_controller) = weak_sort_controller.upgrade() {
  290. sort_controller
  291. .read()
  292. .await
  293. .did_receive_row_changed(row_id)
  294. .await;
  295. }
  296. });
  297. }
  298. pub async fn v_filter_rows(&self, row_details: &mut Vec<Arc<RowDetail>>) {
  299. self.filter_controller.filter_rows(row_details).await
  300. }
  301. pub async fn v_sort_rows(&self, row_details: &mut Vec<Arc<RowDetail>>) {
  302. self
  303. .sort_controller
  304. .write()
  305. .await
  306. .sort_rows(row_details)
  307. .await
  308. }
  309. pub async fn v_get_rows(&self) -> Vec<Arc<RowDetail>> {
  310. let mut rows = self.delegate.get_rows(&self.view_id).await;
  311. self.v_filter_rows(&mut rows).await;
  312. self.v_sort_rows(&mut rows).await;
  313. rows
  314. }
  315. pub async fn v_move_group_row(
  316. &self,
  317. row_detail: &RowDetail,
  318. row_changeset: &mut RowChangeset,
  319. to_group_id: &str,
  320. to_row_id: Option<RowId>,
  321. ) {
  322. let result = self
  323. .mut_group_controller(|group_controller, field| {
  324. let move_row_context = MoveGroupRowContext {
  325. row_detail,
  326. row_changeset,
  327. field: field.as_ref(),
  328. to_group_id,
  329. to_row_id,
  330. };
  331. group_controller.move_group_row(move_row_context)
  332. })
  333. .await;
  334. if let Some(result) = result {
  335. if let Some(delete_group) = result.deleted_group {
  336. tracing::trace!("Delete group after moving the row: {:?}", delete_group);
  337. let mut changes = GroupChangesPB {
  338. view_id: self.view_id.clone(),
  339. ..Default::default()
  340. };
  341. changes.deleted_groups.push(delete_group.group_id);
  342. notify_did_update_num_of_groups(&self.view_id, changes).await;
  343. }
  344. for changeset in result.row_changesets {
  345. notify_did_update_group_rows(changeset).await;
  346. }
  347. }
  348. }
  349. /// Only call once after database view editor initialized
  350. #[tracing::instrument(level = "trace", skip(self))]
  351. pub async fn v_load_groups(&self) -> Option<Vec<GroupPB>> {
  352. let groups = self
  353. .group_controller
  354. .read()
  355. .await
  356. .as_ref()?
  357. .groups()
  358. .into_iter()
  359. .filter(|group| group.is_visible)
  360. .map(|group_data| GroupPB::from(group_data.clone()))
  361. .collect::<Vec<_>>();
  362. tracing::trace!("Number of groups: {}", groups.len());
  363. Some(groups)
  364. }
  365. #[tracing::instrument(level = "trace", skip(self))]
  366. pub async fn v_get_group(&self, group_id: &str) -> FlowyResult<GroupPB> {
  367. match self
  368. .group_controller
  369. .read()
  370. .await
  371. .as_ref()
  372. .and_then(|group| group.get_group(group_id))
  373. {
  374. None => Err(FlowyError::record_not_found().with_context("Can't find the group")),
  375. Some((_, group)) => Ok(GroupPB::from(group)),
  376. }
  377. }
  378. #[tracing::instrument(level = "trace", skip(self), err)]
  379. pub async fn v_move_group(&self, from_group: &str, to_group: &str) -> FlowyResult<()> {
  380. self
  381. .mut_group_controller(|group_controller, _| group_controller.move_group(from_group, to_group))
  382. .await;
  383. Ok(())
  384. }
  385. pub async fn is_grouping_field(&self, field_id: &str) -> bool {
  386. match self.group_controller.read().await.as_ref() {
  387. Some(group_controller) => group_controller.field_id() == field_id,
  388. None => false,
  389. }
  390. }
  391. /// Called when the user changes the grouping field
  392. pub async fn v_initialize_new_group(&self, field_id: &str) -> FlowyResult<()> {
  393. let is_grouping_field = self.is_grouping_field(field_id).await;
  394. if !is_grouping_field {
  395. self.v_grouping_by_field(field_id).await?;
  396. if let Some(view) = self.delegate.get_view(&self.view_id).await {
  397. let setting = database_view_setting_pb_from_view(view);
  398. notify_did_update_setting(&self.view_id, setting).await;
  399. }
  400. }
  401. Ok(())
  402. }
  403. pub async fn v_delete_group(&self, _params: DeleteGroupParams) -> FlowyResult<()> {
  404. Ok(())
  405. }
  406. pub async fn update_group_setting(&self, changeset: GroupSettingChangeset) -> FlowyResult<()> {
  407. self
  408. .mut_group_controller(|group_controller, _| {
  409. group_controller.apply_group_setting_changeset(changeset)
  410. })
  411. .await;
  412. Ok(())
  413. }
  414. pub async fn v_get_all_sorts(&self) -> Vec<Sort> {
  415. self.delegate.get_all_sorts(&self.view_id)
  416. }
  417. #[tracing::instrument(level = "trace", skip(self), err)]
  418. pub async fn v_insert_sort(&self, params: UpdateSortParams) -> FlowyResult<Sort> {
  419. let is_exist = params.sort_id.is_some();
  420. let sort_id = match params.sort_id {
  421. None => gen_database_sort_id(),
  422. Some(sort_id) => sort_id,
  423. };
  424. let sort = Sort {
  425. id: sort_id,
  426. field_id: params.field_id.clone(),
  427. field_type: params.field_type,
  428. condition: params.condition,
  429. };
  430. let sort_type = SortType::from(&sort);
  431. let mut sort_controller = self.sort_controller.write().await;
  432. self.delegate.insert_sort(&self.view_id, sort.clone());
  433. let changeset = if is_exist {
  434. sort_controller
  435. .did_receive_changes(SortChangeset::from_update(sort_type))
  436. .await
  437. } else {
  438. sort_controller
  439. .did_receive_changes(SortChangeset::from_insert(sort_type))
  440. .await
  441. };
  442. drop(sort_controller);
  443. notify_did_update_sort(changeset).await;
  444. Ok(sort)
  445. }
  446. pub async fn v_delete_sort(&self, params: DeleteSortParams) -> FlowyResult<()> {
  447. let notification = self
  448. .sort_controller
  449. .write()
  450. .await
  451. .did_receive_changes(SortChangeset::from_delete(DeletedSortType::from(
  452. params.clone(),
  453. )))
  454. .await;
  455. self.delegate.remove_sort(&self.view_id, &params.sort_id);
  456. notify_did_update_sort(notification).await;
  457. Ok(())
  458. }
  459. pub async fn v_delete_all_sorts(&self) -> FlowyResult<()> {
  460. let all_sorts = self.v_get_all_sorts().await;
  461. self.sort_controller.write().await.delete_all_sorts().await;
  462. self.delegate.remove_all_sorts(&self.view_id);
  463. let mut notification = SortChangesetNotificationPB::new(self.view_id.clone());
  464. notification.delete_sorts = all_sorts.into_iter().map(SortPB::from).collect();
  465. notify_did_update_sort(notification).await;
  466. Ok(())
  467. }
  468. pub async fn v_get_all_filters(&self) -> Vec<Arc<Filter>> {
  469. self.delegate.get_all_filters(&self.view_id)
  470. }
  471. #[tracing::instrument(level = "trace", skip(self), err)]
  472. pub async fn v_insert_filter(&self, params: UpdateFilterParams) -> FlowyResult<()> {
  473. let is_exist = params.filter_id.is_some();
  474. let filter_id = match params.filter_id {
  475. None => gen_database_filter_id(),
  476. Some(filter_id) => filter_id,
  477. };
  478. let filter = Filter {
  479. id: filter_id.clone(),
  480. field_id: params.field_id.clone(),
  481. field_type: params.field_type,
  482. condition: params.condition,
  483. content: params.content,
  484. };
  485. let filter_type = FilterType::from(&filter);
  486. let filter_controller = self.filter_controller.clone();
  487. let changeset = if is_exist {
  488. let old_filter_type = self
  489. .delegate
  490. .get_filter(&self.view_id, &filter.id)
  491. .map(|field| FilterType::from(&field));
  492. self.delegate.insert_filter(&self.view_id, filter);
  493. filter_controller
  494. .did_receive_changes(FilterChangeset::from_update(UpdatedFilterType::new(
  495. old_filter_type,
  496. filter_type,
  497. )))
  498. .await
  499. } else {
  500. self.delegate.insert_filter(&self.view_id, filter);
  501. filter_controller
  502. .did_receive_changes(FilterChangeset::from_insert(filter_type))
  503. .await
  504. };
  505. drop(filter_controller);
  506. if let Some(changeset) = changeset {
  507. notify_did_update_filter(changeset).await;
  508. }
  509. Ok(())
  510. }
  511. #[tracing::instrument(level = "trace", skip(self), err)]
  512. pub async fn v_delete_filter(&self, params: DeleteFilterParams) -> FlowyResult<()> {
  513. let filter_type = params.filter_type;
  514. let changeset = self
  515. .filter_controller
  516. .did_receive_changes(FilterChangeset::from_delete(filter_type.clone()))
  517. .await;
  518. self
  519. .delegate
  520. .delete_filter(&self.view_id, &filter_type.filter_id);
  521. if changeset.is_some() {
  522. notify_did_update_filter(changeset.unwrap()).await;
  523. }
  524. Ok(())
  525. }
  526. pub async fn v_get_filter(&self, filter_id: &str) -> Option<Filter> {
  527. self.delegate.get_filter(&self.view_id, filter_id)
  528. }
  529. /// Returns the current calendar settings
  530. #[tracing::instrument(level = "trace", skip(self))]
  531. pub async fn v_get_layout_settings(&self, layout_ty: &DatabaseLayout) -> LayoutSettingParams {
  532. let mut layout_setting = LayoutSettingParams::default();
  533. match layout_ty {
  534. DatabaseLayout::Grid => {},
  535. DatabaseLayout::Board => {},
  536. DatabaseLayout::Calendar => {
  537. if let Some(value) = self.delegate.get_layout_setting(&self.view_id, layout_ty) {
  538. let calendar_setting = CalendarLayoutSetting::from(value);
  539. // Check the field exist or not
  540. if let Some(field) = self.delegate.get_field(&calendar_setting.field_id).await {
  541. let field_type = FieldType::from(field.field_type);
  542. // Check the type of field is Datetime or not
  543. if field_type == FieldType::DateTime {
  544. layout_setting.calendar = Some(calendar_setting);
  545. } else {
  546. tracing::warn!("The field of calendar setting is not datetime type")
  547. }
  548. } else {
  549. tracing::warn!("The field of calendar setting is not exist");
  550. }
  551. }
  552. },
  553. }
  554. layout_setting
  555. }
  556. /// Update the calendar settings and send the notification to refresh the UI
  557. pub async fn v_set_layout_settings(&self, params: LayoutSettingParams) -> FlowyResult<()> {
  558. // Maybe it needs no send notification to refresh the UI
  559. if let Some(new_calendar_setting) = params.calendar {
  560. if let Some(field) = self
  561. .delegate
  562. .get_field(&new_calendar_setting.field_id)
  563. .await
  564. {
  565. let field_type = FieldType::from(field.field_type);
  566. if field_type != FieldType::DateTime {
  567. return Err(FlowyError::unexpect_calendar_field_type());
  568. }
  569. let old_calender_setting = self
  570. .v_get_layout_settings(&params.layout_type)
  571. .await
  572. .calendar;
  573. self.delegate.insert_layout_setting(
  574. &self.view_id,
  575. &params.layout_type,
  576. new_calendar_setting.clone().into(),
  577. );
  578. let new_field_id = new_calendar_setting.field_id.clone();
  579. let layout_setting_pb: DatabaseLayoutSettingPB = LayoutSettingParams {
  580. layout_type: params.layout_type,
  581. calendar: Some(new_calendar_setting),
  582. }
  583. .into();
  584. if let Some(old_calendar_setting) = old_calender_setting {
  585. // compare the new layout field id is equal to old layout field id
  586. // if not equal, send the DidSetNewLayoutField notification
  587. // if equal, send the DidUpdateLayoutSettings notification
  588. if old_calendar_setting.field_id != new_field_id {
  589. send_notification(&self.view_id, DatabaseNotification::DidSetNewLayoutField)
  590. .payload(layout_setting_pb.clone())
  591. .send();
  592. }
  593. }
  594. send_notification(&self.view_id, DatabaseNotification::DidUpdateLayoutSettings)
  595. .payload(layout_setting_pb)
  596. .send();
  597. }
  598. }
  599. Ok(())
  600. }
  601. #[tracing::instrument(level = "trace", skip_all, err)]
  602. pub async fn v_did_update_field_type_option(
  603. &self,
  604. field_id: &str,
  605. old_field: &Field,
  606. ) -> FlowyResult<()> {
  607. if let Some(field) = self.delegate.get_field(field_id).await {
  608. self
  609. .sort_controller
  610. .read()
  611. .await
  612. .did_update_field_type_option(&field)
  613. .await;
  614. self
  615. .mut_group_controller(|group_controller, _| {
  616. group_controller.did_update_field_type_option(&field);
  617. Ok(())
  618. })
  619. .await;
  620. if let Some(filter) = self
  621. .delegate
  622. .get_filter_by_field_id(&self.view_id, field_id)
  623. {
  624. let mut old = FilterType::from(&filter);
  625. old.field_type = FieldType::from(old_field.field_type);
  626. let new = FilterType::from(&filter);
  627. let filter_type = UpdatedFilterType::new(Some(old), new);
  628. let filter_changeset = FilterChangeset::from_update(filter_type);
  629. let filter_controller = self.filter_controller.clone();
  630. tokio::spawn(async move {
  631. if let Some(notification) = filter_controller
  632. .did_receive_changes(filter_changeset)
  633. .await
  634. {
  635. notify_did_update_filter(notification).await;
  636. }
  637. });
  638. }
  639. }
  640. Ok(())
  641. }
  642. /// Called when a grouping field is updated.
  643. #[tracing::instrument(level = "debug", skip_all, err)]
  644. pub async fn v_grouping_by_field(&self, field_id: &str) -> FlowyResult<()> {
  645. if let Some(field) = self.delegate.get_field(field_id).await {
  646. let new_group_controller =
  647. new_group_controller_with_field(self.view_id.clone(), self.delegate.clone(), field).await?;
  648. let new_groups = new_group_controller
  649. .groups()
  650. .into_iter()
  651. .map(|group| GroupPB::from(group.clone()))
  652. .collect();
  653. *self.group_controller.write().await = Some(new_group_controller);
  654. let changeset = GroupChangesPB {
  655. view_id: self.view_id.clone(),
  656. initial_groups: new_groups,
  657. ..Default::default()
  658. };
  659. debug_assert!(!changeset.is_empty());
  660. if !changeset.is_empty() {
  661. send_notification(&changeset.view_id, DatabaseNotification::DidGroupByField)
  662. .payload(changeset)
  663. .send();
  664. }
  665. }
  666. Ok(())
  667. }
  668. pub async fn v_get_calendar_event(&self, row_id: RowId) -> Option<CalendarEventPB> {
  669. let layout_ty = DatabaseLayout::Calendar;
  670. let calendar_setting = self.v_get_layout_settings(&layout_ty).await.calendar?;
  671. // Text
  672. let primary_field = self.delegate.get_primary_field().await?;
  673. let text_cell = get_cell_for_row(self.delegate.clone(), &primary_field.id, &row_id).await?;
  674. // Date
  675. let date_field = self.delegate.get_field(&calendar_setting.field_id).await?;
  676. let date_cell = get_cell_for_row(self.delegate.clone(), &date_field.id, &row_id).await?;
  677. let title = text_cell
  678. .into_text_field_cell_data()
  679. .unwrap_or_default()
  680. .into();
  681. let timestamp = date_cell
  682. .into_date_field_cell_data()
  683. .unwrap_or_default()
  684. .timestamp
  685. .unwrap_or_default();
  686. let (_, row_detail) = self.delegate.get_row(&self.view_id, &row_id).await?;
  687. Some(CalendarEventPB {
  688. row_meta: RowMetaPB::from(row_detail.as_ref()),
  689. date_field_id: date_field.id.clone(),
  690. title,
  691. timestamp,
  692. is_scheduled: timestamp != 0,
  693. })
  694. }
  695. pub async fn v_get_all_calendar_events(&self) -> Option<Vec<CalendarEventPB>> {
  696. let layout_ty = DatabaseLayout::Calendar;
  697. let calendar_setting = match self.v_get_layout_settings(&layout_ty).await.calendar {
  698. None => {
  699. // When create a new calendar view, the calendar setting should be created
  700. tracing::error!(
  701. "Calendar layout setting not found in database view:{}",
  702. self.view_id
  703. );
  704. return None;
  705. },
  706. Some(calendar_setting) => calendar_setting,
  707. };
  708. // Text
  709. let primary_field = self.delegate.get_primary_field().await?;
  710. let text_cells =
  711. get_cells_for_field(self.delegate.clone(), &self.view_id, &primary_field.id).await;
  712. // Date
  713. let timestamp_by_row_id = get_cells_for_field(
  714. self.delegate.clone(),
  715. &self.view_id,
  716. &calendar_setting.field_id,
  717. )
  718. .await
  719. .into_iter()
  720. .map(|date_cell| {
  721. let row_id = date_cell.row_id.clone();
  722. // timestamp
  723. let timestamp = date_cell
  724. .into_date_field_cell_data()
  725. .map(|date_cell_data| date_cell_data.timestamp.unwrap_or_default())
  726. .unwrap_or_default();
  727. (row_id, timestamp)
  728. })
  729. .collect::<HashMap<RowId, i64>>();
  730. let mut events: Vec<CalendarEventPB> = vec![];
  731. for text_cell in text_cells {
  732. let row_id = text_cell.row_id.clone();
  733. let timestamp = timestamp_by_row_id
  734. .get(&row_id)
  735. .cloned()
  736. .unwrap_or_default();
  737. let title = text_cell
  738. .into_text_field_cell_data()
  739. .unwrap_or_default()
  740. .into();
  741. let (_, row_detail) = self.delegate.get_row(&self.view_id, &row_id).await?;
  742. let event = CalendarEventPB {
  743. row_meta: RowMetaPB::from(row_detail.as_ref()),
  744. date_field_id: calendar_setting.field_id.clone(),
  745. title,
  746. timestamp,
  747. is_scheduled: timestamp != 0,
  748. };
  749. events.push(event);
  750. }
  751. Some(events)
  752. }
  753. pub async fn v_get_layout_type(&self) -> DatabaseLayout {
  754. self.delegate.get_layout_for_view(&self.view_id)
  755. }
  756. #[tracing::instrument(level = "trace", skip_all)]
  757. pub async fn v_update_layout_type(&self, new_layout_type: DatabaseLayout) -> FlowyResult<()> {
  758. self
  759. .delegate
  760. .update_layout_type(&self.view_id, &new_layout_type);
  761. // using the {} brackets to denote the lifetime of the resolver. Because the DatabaseLayoutDepsResolver
  762. // is not sync and send, so we can't pass it to the async block.
  763. {
  764. let resolver = DatabaseLayoutDepsResolver::new(self.delegate.get_database(), new_layout_type);
  765. resolver.resolve_deps_when_update_layout_type(&self.view_id);
  766. }
  767. // initialize the group controller if the current layout support grouping
  768. *self.group_controller.write().await =
  769. new_group_controller(self.view_id.clone(), self.delegate.clone()).await?;
  770. let payload = DatabaseLayoutMetaPB {
  771. view_id: self.view_id.clone(),
  772. layout: new_layout_type.into(),
  773. };
  774. send_notification(&self.view_id, DatabaseNotification::DidUpdateDatabaseLayout)
  775. .payload(payload)
  776. .send();
  777. Ok(())
  778. }
  779. pub async fn handle_row_event(&self, event: Cow<'_, DatabaseRowEvent>) {
  780. let changeset = match event.into_owned() {
  781. DatabaseRowEvent::InsertRow(row) => RowsChangePB::from_insert(row.into()),
  782. DatabaseRowEvent::UpdateRow(row) => RowsChangePB::from_update(row.into()),
  783. DatabaseRowEvent::DeleteRow(row_id) => RowsChangePB::from_delete(row_id.into_inner()),
  784. DatabaseRowEvent::Move {
  785. deleted_row_id,
  786. inserted_row,
  787. } => RowsChangePB::from_move(vec![deleted_row_id.into_inner()], vec![inserted_row.into()]),
  788. };
  789. send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
  790. .payload(changeset)
  791. .send();
  792. }
  793. pub async fn v_get_field_settings(&self, field_ids: &[String]) -> HashMap<String, FieldSettings> {
  794. self.delegate.get_field_settings(&self.view_id, field_ids)
  795. }
  796. pub async fn v_get_all_field_settings(&self) -> HashMap<String, FieldSettings> {
  797. self.delegate.get_all_field_settings(&self.view_id)
  798. }
  799. pub async fn v_update_field_settings(
  800. &self,
  801. view_id: &str,
  802. field_id: &str,
  803. visibility: Option<FieldVisibility>,
  804. ) -> FlowyResult<()> {
  805. self
  806. .delegate
  807. .update_field_settings(view_id, field_id, visibility);
  808. Ok(())
  809. }
  810. async fn mut_group_controller<F, T>(&self, f: F) -> Option<T>
  811. where
  812. F: FnOnce(&mut Box<dyn GroupController>, Arc<Field>) -> FlowyResult<T>,
  813. {
  814. let group_field_id = self
  815. .group_controller
  816. .read()
  817. .await
  818. .as_ref()
  819. .map(|group| group.field_id().to_owned())?;
  820. let field = self.delegate.get_field(&group_field_id).await?;
  821. let mut write_guard = self.group_controller.write().await;
  822. if let Some(group_controller) = &mut *write_guard {
  823. f(group_controller, field).ok()
  824. } else {
  825. None
  826. }
  827. }
  828. }