view_group.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. use std::sync::Arc;
  2. use collab_database::fields::Field;
  3. use collab_database::rows::RowId;
  4. use flowy_error::{FlowyError, FlowyResult};
  5. use lib_infra::future::{to_fut, Fut};
  6. use tracing::trace;
  7. use crate::entities::FieldType;
  8. use crate::services::database_view::DatabaseViewData;
  9. use crate::services::field::RowSingleCellData;
  10. use crate::services::group::{
  11. find_new_grouping_field, make_group_controller, GroupController, GroupSetting,
  12. GroupSettingReader, GroupSettingWriter,
  13. };
  14. pub async fn new_group_controller_with_field(
  15. view_id: String,
  16. delegate: Arc<dyn DatabaseViewData>,
  17. grouping_field: Arc<Field>,
  18. ) -> FlowyResult<Box<dyn GroupController>> {
  19. let setting_reader = GroupSettingReaderImpl(delegate.clone());
  20. let rows = delegate.get_rows(&view_id).await;
  21. let setting_writer = GroupSettingWriterImpl(delegate.clone());
  22. make_group_controller(
  23. view_id,
  24. grouping_field,
  25. rows,
  26. setting_reader,
  27. setting_writer,
  28. )
  29. .await
  30. }
  31. pub async fn new_group_controller(
  32. view_id: String,
  33. delegate: Arc<dyn DatabaseViewData>,
  34. ) -> FlowyResult<Box<dyn GroupController>> {
  35. let setting_reader = GroupSettingReaderImpl(delegate.clone());
  36. let setting_writer = GroupSettingWriterImpl(delegate.clone());
  37. let fields = delegate.get_fields(&view_id, None).await;
  38. let rows = delegate.get_rows(&view_id).await;
  39. let layout = delegate.get_layout_for_view(&view_id);
  40. trace!(?fields, ?rows, ?layout, "new_group_controller");
  41. // Read the grouping field or find a new grouping field
  42. let mut grouping_field = setting_reader
  43. .get_group_setting(&view_id)
  44. .await
  45. .and_then(|setting| {
  46. fields
  47. .iter()
  48. .find(|field| field.id == setting.field_id)
  49. .cloned()
  50. });
  51. if grouping_field.is_none() {
  52. grouping_field = find_new_grouping_field(&fields, &layout);
  53. }
  54. match grouping_field {
  55. None => Err(FlowyError::internal().context("No grouping field found".to_owned())),
  56. Some(_) => {
  57. make_group_controller(
  58. view_id,
  59. grouping_field.unwrap(),
  60. rows,
  61. setting_reader,
  62. setting_writer,
  63. )
  64. .await
  65. },
  66. }
  67. }
  68. pub(crate) struct GroupSettingReaderImpl(pub Arc<dyn DatabaseViewData>);
  69. impl GroupSettingReader for GroupSettingReaderImpl {
  70. fn get_group_setting(&self, view_id: &str) -> Fut<Option<Arc<GroupSetting>>> {
  71. let mut settings = self.0.get_group_setting(view_id);
  72. to_fut(async move {
  73. if settings.is_empty() {
  74. None
  75. } else {
  76. Some(Arc::new(settings.remove(0)))
  77. }
  78. })
  79. }
  80. fn get_configuration_cells(&self, view_id: &str, field_id: &str) -> Fut<Vec<RowSingleCellData>> {
  81. let field_id = field_id.to_owned();
  82. let view_id = view_id.to_owned();
  83. let delegate = self.0.clone();
  84. to_fut(async move { get_cells_for_field(delegate, &view_id, &field_id).await })
  85. }
  86. }
  87. pub(crate) async fn get_cell_for_row(
  88. delegate: Arc<dyn DatabaseViewData>,
  89. field_id: &str,
  90. row_id: &RowId,
  91. ) -> Option<RowSingleCellData> {
  92. let field = delegate.get_field(field_id).await?;
  93. let cell = delegate.get_cell_in_row(field_id, row_id).await?;
  94. let field_type = FieldType::from(field.field_type);
  95. if let Some(handler) = delegate.get_type_option_cell_handler(&field, &field_type) {
  96. return match handler.get_cell_data(&cell, &field_type, &field) {
  97. Ok(cell_data) => Some(RowSingleCellData {
  98. row_id: cell.row_id.clone(),
  99. field_id: field.id.clone(),
  100. field_type: field_type.clone(),
  101. cell_data,
  102. }),
  103. Err(_) => None,
  104. };
  105. }
  106. None
  107. }
  108. // Returns the list of cells corresponding to the given field.
  109. pub(crate) async fn get_cells_for_field(
  110. delegate: Arc<dyn DatabaseViewData>,
  111. view_id: &str,
  112. field_id: &str,
  113. ) -> Vec<RowSingleCellData> {
  114. if let Some(field) = delegate.get_field(field_id).await {
  115. let field_type = FieldType::from(field.field_type);
  116. if let Some(handler) = delegate.get_type_option_cell_handler(&field, &field_type) {
  117. let cells = delegate.get_cells_for_field(view_id, field_id).await;
  118. return cells
  119. .iter()
  120. .flat_map(
  121. |cell| match handler.get_cell_data(cell, &field_type, &field) {
  122. Ok(cell_data) => Some(RowSingleCellData {
  123. row_id: cell.row_id.clone(),
  124. field_id: field.id.clone(),
  125. field_type: field_type.clone(),
  126. cell_data,
  127. }),
  128. Err(_) => None,
  129. },
  130. )
  131. .collect();
  132. }
  133. }
  134. vec![]
  135. }
  136. struct GroupSettingWriterImpl(Arc<dyn DatabaseViewData>);
  137. impl GroupSettingWriter for GroupSettingWriterImpl {
  138. fn save_configuration(&self, view_id: &str, group_setting: GroupSetting) -> Fut<FlowyResult<()>> {
  139. self.0.insert_group_setting(view_id, group_setting);
  140. to_fut(async move { Ok(()) })
  141. }
  142. }