group_service.rs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. use crate::entities::{
  2. CheckboxGroupConfigurationPB, DateGroupConfigurationPB, FieldType, NumberGroupConfigurationPB,
  3. SelectOptionGroupConfigurationPB, TextGroupConfigurationPB, UrlGroupConfigurationPB,
  4. };
  5. use crate::services::group::{
  6. CheckboxGroupController, Group, GroupActionHandler, MultiSelectGroupController, SingleSelectGroupController,
  7. };
  8. use bytes::Bytes;
  9. use flowy_error::FlowyResult;
  10. use flowy_grid_data_model::revision::{gen_grid_group_id, FieldRevision, GroupConfigurationRevision, RowRevision};
  11. use lib_infra::future::AFFuture;
  12. use std::future::Future;
  13. use std::sync::Arc;
  14. use tokio::sync::RwLock;
  15. pub trait GroupConfigurationDelegate: Send + Sync + 'static {
  16. fn get_group_configuration(&self, field_rev: Arc<FieldRevision>) -> AFFuture<GroupConfigurationRevision>;
  17. }
  18. pub(crate) struct GroupService {
  19. delegate: Box<dyn GroupConfigurationDelegate>,
  20. action_handler: Option<Arc<RwLock<dyn GroupActionHandler>>>,
  21. }
  22. impl GroupService {
  23. pub(crate) async fn new(delegate: Box<dyn GroupConfigurationDelegate>) -> Self {
  24. Self {
  25. delegate,
  26. action_handler: None,
  27. }
  28. }
  29. pub(crate) async fn load_groups(
  30. &mut self,
  31. field_revs: &[Arc<FieldRevision>],
  32. row_revs: Vec<Arc<RowRevision>>,
  33. ) -> Option<Vec<Group>> {
  34. let field_rev = find_group_field(field_revs).unwrap();
  35. let field_type: FieldType = field_rev.field_type_rev.into();
  36. let configuration = self.delegate.get_group_configuration(field_rev.clone()).await;
  37. match self
  38. .build_groups(&field_type, &field_rev, row_revs, configuration)
  39. .await
  40. {
  41. Ok(groups) => Some(groups),
  42. Err(_) => None,
  43. }
  44. }
  45. pub(crate) async fn update_row<F, O>(&self, row_rev: &mut RowRevision, group_id: &str, f: F)
  46. where
  47. F: FnOnce(String) -> O,
  48. O: Future<Output = Option<Arc<FieldRevision>>> + Send + Sync + 'static,
  49. {
  50. if let Some(group_action_handler) = self.action_handler.as_ref() {
  51. let field_id = group_action_handler.read().await.field_id().to_owned();
  52. match f(field_id).await {
  53. None => {}
  54. Some(field_rev) => {
  55. group_action_handler
  56. .write()
  57. .await
  58. .update_card(row_rev, &field_rev, group_id);
  59. }
  60. }
  61. }
  62. }
  63. #[allow(dead_code)]
  64. pub async fn move_card(&self, _group_id: &str, _from: i32, _to: i32) {
  65. // BoardCardChangesetPB {
  66. // group_id: "".to_string(),
  67. // inserted_cards: vec![],
  68. // deleted_cards: vec![],
  69. // updated_cards: vec![]
  70. // }
  71. // let row_pb = make_row_from_row_rev(row_rev);
  72. todo!()
  73. }
  74. #[tracing::instrument(level = "trace", skip_all, err)]
  75. async fn build_groups(
  76. &mut self,
  77. field_type: &FieldType,
  78. field_rev: &Arc<FieldRevision>,
  79. row_revs: Vec<Arc<RowRevision>>,
  80. configuration: GroupConfigurationRevision,
  81. ) -> FlowyResult<Vec<Group>> {
  82. match field_type {
  83. FieldType::RichText => {
  84. // let generator = GroupGenerator::<TextGroupConfigurationPB>::from_configuration(configuration);
  85. }
  86. FieldType::Number => {
  87. // let generator = GroupGenerator::<NumberGroupConfigurationPB>::from_configuration(configuration);
  88. }
  89. FieldType::DateTime => {
  90. // let generator = GroupGenerator::<DateGroupConfigurationPB>::from_configuration(configuration);
  91. }
  92. FieldType::SingleSelect => {
  93. let controller = SingleSelectGroupController::new(field_rev, configuration)?;
  94. self.action_handler = Some(Arc::new(RwLock::new(controller)));
  95. }
  96. FieldType::MultiSelect => {
  97. let controller = MultiSelectGroupController::new(field_rev, configuration)?;
  98. self.action_handler = Some(Arc::new(RwLock::new(controller)));
  99. }
  100. FieldType::Checkbox => {
  101. let controller = CheckboxGroupController::new(field_rev, configuration)?;
  102. self.action_handler = Some(Arc::new(RwLock::new(controller)));
  103. }
  104. FieldType::URL => {
  105. // let generator = GroupGenerator::<UrlGroupConfigurationPB>::from_configuration(configuration);
  106. }
  107. };
  108. let mut groups = vec![];
  109. if let Some(group_action_handler) = self.action_handler.as_ref() {
  110. let mut write_guard = group_action_handler.write().await;
  111. let _ = write_guard.group_rows(&row_revs, field_rev)?;
  112. groups = write_guard.build_groups();
  113. drop(write_guard);
  114. }
  115. Ok(groups)
  116. }
  117. }
  118. fn find_group_field(field_revs: &[Arc<FieldRevision>]) -> Option<Arc<FieldRevision>> {
  119. let field_rev = field_revs
  120. .iter()
  121. .find(|field_rev| {
  122. let field_type: FieldType = field_rev.field_type_rev.into();
  123. field_type.can_be_group()
  124. })
  125. .cloned();
  126. field_rev
  127. }
  128. pub fn default_group_configuration(field_rev: &FieldRevision) -> GroupConfigurationRevision {
  129. let field_type: FieldType = field_rev.field_type_rev.into();
  130. let bytes: Bytes = match field_type {
  131. FieldType::RichText => TextGroupConfigurationPB::default().try_into().unwrap(),
  132. FieldType::Number => NumberGroupConfigurationPB::default().try_into().unwrap(),
  133. FieldType::DateTime => DateGroupConfigurationPB::default().try_into().unwrap(),
  134. FieldType::SingleSelect => SelectOptionGroupConfigurationPB::default().try_into().unwrap(),
  135. FieldType::MultiSelect => SelectOptionGroupConfigurationPB::default().try_into().unwrap(),
  136. FieldType::Checkbox => CheckboxGroupConfigurationPB::default().try_into().unwrap(),
  137. FieldType::URL => UrlGroupConfigurationPB::default().try_into().unwrap(),
  138. };
  139. GroupConfigurationRevision {
  140. id: gen_grid_group_id(),
  141. field_id: field_rev.id.clone(),
  142. field_type_rev: field_rev.field_type_rev,
  143. content: Some(bytes.to_vec()),
  144. }
  145. }