group_util.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. use crate::entities::FieldType;
  2. use crate::services::group::configuration::GroupConfigurationReader;
  3. use crate::services::group::controller::GroupController;
  4. use crate::services::group::{
  5. CheckboxGroupContext, CheckboxGroupController, DefaultGroupController, GroupConfigurationWriter,
  6. MultiSelectGroupController, SelectOptionGroupContext, SingleSelectGroupController,
  7. };
  8. use flowy_error::FlowyResult;
  9. use flowy_grid_data_model::revision::{
  10. CheckboxGroupConfigurationRevision, DateGroupConfigurationRevision, FieldRevision, GroupConfigurationRevision,
  11. NumberGroupConfigurationRevision, RowRevision, SelectOptionGroupConfigurationRevision,
  12. TextGroupConfigurationRevision, UrlGroupConfigurationRevision,
  13. };
  14. use std::sync::Arc;
  15. #[tracing::instrument(level = "trace", skip_all, err)]
  16. pub async fn make_group_controller<R, W>(
  17. view_id: String,
  18. field_rev: Arc<FieldRevision>,
  19. row_revs: Vec<Arc<RowRevision>>,
  20. configuration_reader: R,
  21. configuration_writer: W,
  22. ) -> FlowyResult<Box<dyn GroupController>>
  23. where
  24. R: GroupConfigurationReader,
  25. W: GroupConfigurationWriter,
  26. {
  27. let field_type: FieldType = field_rev.ty.into();
  28. let mut group_controller: Box<dyn GroupController>;
  29. let configuration_reader = Arc::new(configuration_reader);
  30. let configuration_writer = Arc::new(configuration_writer);
  31. match field_type {
  32. FieldType::SingleSelect => {
  33. let configuration =
  34. SelectOptionGroupContext::new(view_id, field_rev.clone(), configuration_reader, configuration_writer)
  35. .await?;
  36. let controller = SingleSelectGroupController::new(&field_rev, configuration).await?;
  37. group_controller = Box::new(controller);
  38. }
  39. FieldType::MultiSelect => {
  40. let configuration =
  41. SelectOptionGroupContext::new(view_id, field_rev.clone(), configuration_reader, configuration_writer)
  42. .await?;
  43. let controller = MultiSelectGroupController::new(&field_rev, configuration).await?;
  44. group_controller = Box::new(controller);
  45. }
  46. FieldType::Checkbox => {
  47. let configuration =
  48. CheckboxGroupContext::new(view_id, field_rev.clone(), configuration_reader, configuration_writer)
  49. .await?;
  50. let controller = CheckboxGroupController::new(&field_rev, configuration).await?;
  51. group_controller = Box::new(controller);
  52. }
  53. _ => {
  54. group_controller = Box::new(DefaultGroupController::new(&field_rev));
  55. }
  56. }
  57. let _ = group_controller.fill_groups(&row_revs, &field_rev)?;
  58. Ok(group_controller)
  59. }
  60. pub fn find_group_field(field_revs: &[Arc<FieldRevision>]) -> Option<Arc<FieldRevision>> {
  61. let field_rev = field_revs
  62. .iter()
  63. .find(|field_rev| {
  64. let field_type: FieldType = field_rev.ty.into();
  65. field_type.can_be_group()
  66. })
  67. .cloned();
  68. field_rev
  69. }
  70. pub fn default_group_configuration(field_rev: &FieldRevision) -> GroupConfigurationRevision {
  71. let field_id = field_rev.id.clone();
  72. let field_type_rev = field_rev.ty;
  73. let field_type: FieldType = field_rev.ty.into();
  74. match field_type {
  75. FieldType::RichText => {
  76. GroupConfigurationRevision::new(field_id, field_type_rev, TextGroupConfigurationRevision::default())
  77. .unwrap()
  78. }
  79. FieldType::Number => {
  80. GroupConfigurationRevision::new(field_id, field_type_rev, NumberGroupConfigurationRevision::default())
  81. .unwrap()
  82. }
  83. FieldType::DateTime => {
  84. GroupConfigurationRevision::new(field_id, field_type_rev, DateGroupConfigurationRevision::default())
  85. .unwrap()
  86. }
  87. FieldType::SingleSelect => GroupConfigurationRevision::new(
  88. field_id,
  89. field_type_rev,
  90. SelectOptionGroupConfigurationRevision::default(),
  91. )
  92. .unwrap(),
  93. FieldType::MultiSelect => GroupConfigurationRevision::new(
  94. field_id,
  95. field_type_rev,
  96. SelectOptionGroupConfigurationRevision::default(),
  97. )
  98. .unwrap(),
  99. FieldType::Checkbox => {
  100. GroupConfigurationRevision::new(field_id, field_type_rev, CheckboxGroupConfigurationRevision::default())
  101. .unwrap()
  102. }
  103. FieldType::URL => {
  104. GroupConfigurationRevision::new(field_id, field_type_rev, UrlGroupConfigurationRevision::default()).unwrap()
  105. }
  106. }
  107. }