checkbox_controller.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. use crate::entities::{GroupChangesetPB, InsertedRowPB, RowPB};
  2. use crate::services::field::{CheckboxCellData, CheckboxCellDataParser, CheckboxTypeOptionPB, CHECK, UNCHECK};
  3. use crate::services::group::action::GroupAction;
  4. use crate::services::group::configuration::GroupContext;
  5. use crate::services::group::controller::{
  6. GenericGroupController, GroupController, GroupGenerator, MoveGroupRowContext,
  7. };
  8. use crate::services::cell::insert_checkbox_cell;
  9. use crate::services::group::{move_group_row, GeneratedGroup};
  10. use flowy_grid_data_model::revision::{
  11. CellRevision, CheckboxGroupConfigurationRevision, FieldRevision, GroupRevision, RowRevision,
  12. };
  13. pub type CheckboxGroupController = GenericGroupController<
  14. CheckboxGroupConfigurationRevision,
  15. CheckboxTypeOptionPB,
  16. CheckboxGroupGenerator,
  17. CheckboxCellDataParser,
  18. >;
  19. pub type CheckboxGroupContext = GroupContext<CheckboxGroupConfigurationRevision>;
  20. impl GroupAction for CheckboxGroupController {
  21. type CellDataType = CheckboxCellData;
  22. fn default_cell_rev(&self) -> Option<CellRevision> {
  23. Some(CellRevision::new(UNCHECK.to_string()))
  24. }
  25. fn use_default_group(&self) -> bool {
  26. false
  27. }
  28. fn can_group(&self, content: &str, cell_data: &Self::CellDataType) -> bool {
  29. if cell_data.is_check() {
  30. content == CHECK
  31. } else {
  32. content == UNCHECK
  33. }
  34. }
  35. fn add_row_if_match(&mut self, row_rev: &RowRevision, cell_data: &Self::CellDataType) -> Vec<GroupChangesetPB> {
  36. let mut changesets = vec![];
  37. self.group_ctx.iter_mut_all_groups(|group| {
  38. let mut changeset = GroupChangesetPB::new(group.id.clone());
  39. let is_contained = group.contains_row(&row_rev.id);
  40. if group.id == CHECK && cell_data.is_check() {
  41. if !is_contained {
  42. let row_pb = RowPB::from(row_rev);
  43. changeset.inserted_rows.push(InsertedRowPB::new(row_pb.clone()));
  44. group.add_row(row_pb);
  45. }
  46. } else if is_contained {
  47. changeset.deleted_rows.push(row_rev.id.clone());
  48. group.remove_row(&row_rev.id);
  49. }
  50. if !changeset.is_empty() {
  51. changesets.push(changeset);
  52. }
  53. });
  54. changesets
  55. }
  56. fn remove_row_if_match(&mut self, row_rev: &RowRevision, _cell_data: &Self::CellDataType) -> Vec<GroupChangesetPB> {
  57. let mut changesets = vec![];
  58. self.group_ctx.iter_mut_all_groups(|group| {
  59. let mut changeset = GroupChangesetPB::new(group.id.clone());
  60. if group.contains_row(&row_rev.id) {
  61. changeset.deleted_rows.push(row_rev.id.clone());
  62. group.remove_row(&row_rev.id);
  63. }
  64. if !changeset.is_empty() {
  65. changesets.push(changeset);
  66. }
  67. });
  68. changesets
  69. }
  70. fn move_row(&mut self, _cell_data: &Self::CellDataType, mut context: MoveGroupRowContext) -> Vec<GroupChangesetPB> {
  71. let mut group_changeset = vec![];
  72. self.group_ctx.iter_mut_all_groups(|group| {
  73. if let Some(changeset) = move_group_row(group, &mut context) {
  74. group_changeset.push(changeset);
  75. }
  76. });
  77. group_changeset
  78. }
  79. }
  80. impl GroupController for CheckboxGroupController {
  81. fn will_create_row(&mut self, row_rev: &mut RowRevision, field_rev: &FieldRevision, group_id: &str) {
  82. match self.group_ctx.get_group(group_id) {
  83. None => tracing::warn!("Can not find the group: {}", group_id),
  84. Some((_, group)) => {
  85. let is_check = group.id == CHECK;
  86. let cell_rev = insert_checkbox_cell(is_check, field_rev);
  87. row_rev.cells.insert(field_rev.id.clone(), cell_rev);
  88. }
  89. }
  90. }
  91. fn did_create_row(&mut self, row_pb: &RowPB, group_id: &str) {
  92. if let Some(group) = self.group_ctx.get_mut_group(group_id) {
  93. group.add_row(row_pb.clone())
  94. }
  95. }
  96. }
  97. pub struct CheckboxGroupGenerator();
  98. impl GroupGenerator for CheckboxGroupGenerator {
  99. type Context = CheckboxGroupContext;
  100. type TypeOptionType = CheckboxTypeOptionPB;
  101. fn generate_groups(
  102. _field_id: &str,
  103. _group_ctx: &Self::Context,
  104. _type_option: &Option<Self::TypeOptionType>,
  105. ) -> Vec<GeneratedGroup> {
  106. let check_group = GeneratedGroup {
  107. group_rev: GroupRevision::new(CHECK.to_string(), "".to_string()),
  108. filter_content: CHECK.to_string(),
  109. };
  110. let uncheck_group = GeneratedGroup {
  111. group_rev: GroupRevision::new(UNCHECK.to_string(), "".to_string()),
  112. filter_content: UNCHECK.to_string(),
  113. };
  114. vec![check_group, uncheck_group]
  115. }
  116. }