group_util.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. LayoutRevision, 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>], layout: &LayoutRevision) -> Option<Arc<FieldRevision>> {
  61. match layout {
  62. LayoutRevision::Table => field_revs.iter().find(|field_rev| field_rev.is_primary).cloned(),
  63. LayoutRevision::Board => field_revs
  64. .iter()
  65. .find(|field_rev| {
  66. let field_type: FieldType = field_rev.ty.into();
  67. field_type.can_be_group()
  68. })
  69. .cloned(),
  70. }
  71. }
  72. pub fn default_group_configuration(field_rev: &FieldRevision) -> GroupConfigurationRevision {
  73. let field_id = field_rev.id.clone();
  74. let field_type_rev = field_rev.ty;
  75. let field_type: FieldType = field_rev.ty.into();
  76. match field_type {
  77. FieldType::RichText => {
  78. GroupConfigurationRevision::new(field_id, field_type_rev, TextGroupConfigurationRevision::default())
  79. .unwrap()
  80. }
  81. FieldType::Number => {
  82. GroupConfigurationRevision::new(field_id, field_type_rev, NumberGroupConfigurationRevision::default())
  83. .unwrap()
  84. }
  85. FieldType::DateTime => {
  86. GroupConfigurationRevision::new(field_id, field_type_rev, DateGroupConfigurationRevision::default())
  87. .unwrap()
  88. }
  89. FieldType::SingleSelect => GroupConfigurationRevision::new(
  90. field_id,
  91. field_type_rev,
  92. SelectOptionGroupConfigurationRevision::default(),
  93. )
  94. .unwrap(),
  95. FieldType::MultiSelect => GroupConfigurationRevision::new(
  96. field_id,
  97. field_type_rev,
  98. SelectOptionGroupConfigurationRevision::default(),
  99. )
  100. .unwrap(),
  101. FieldType::Checkbox => {
  102. GroupConfigurationRevision::new(field_id, field_type_rev, CheckboxGroupConfigurationRevision::default())
  103. .unwrap()
  104. }
  105. FieldType::URL => {
  106. GroupConfigurationRevision::new(field_id, field_type_rev, UrlGroupConfigurationRevision::default()).unwrap()
  107. }
  108. }
  109. }