row_builder.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. use crate::services::cell::apply_cell_data_changeset;
  2. use crate::services::field::select_option::SelectOptionCellChangeset;
  3. use flowy_error::{FlowyError, FlowyResult};
  4. use flowy_grid_data_model::revision::{gen_row_id, CellRevision, FieldRevision, RowRevision, DEFAULT_ROW_HEIGHT};
  5. use indexmap::IndexMap;
  6. use std::collections::HashMap;
  7. use std::sync::Arc;
  8. pub struct RowRevisionBuilder<'a> {
  9. field_rev_map: HashMap<&'a String, &'a Arc<FieldRevision>>,
  10. payload: CreateRowRevisionPayload,
  11. }
  12. impl<'a> RowRevisionBuilder<'a> {
  13. pub fn new(fields: &'a [Arc<FieldRevision>]) -> Self {
  14. let field_rev_map = fields
  15. .iter()
  16. .map(|field| (&field.id, field))
  17. .collect::<HashMap<&String, &Arc<FieldRevision>>>();
  18. let payload = CreateRowRevisionPayload {
  19. row_id: gen_row_id(),
  20. cell_by_field_id: Default::default(),
  21. height: DEFAULT_ROW_HEIGHT,
  22. visibility: true,
  23. };
  24. Self { field_rev_map, payload }
  25. }
  26. pub fn insert_cell(&mut self, field_id: &str, data: String) -> FlowyResult<()> {
  27. match self.field_rev_map.get(&field_id.to_owned()) {
  28. None => {
  29. let msg = format!("Can't find the field with id: {}", field_id);
  30. Err(FlowyError::internal().context(msg))
  31. }
  32. Some(field_rev) => {
  33. let data = apply_cell_data_changeset(data, None, field_rev)?;
  34. let cell = CellRevision::new(data);
  35. self.payload.cell_by_field_id.insert(field_id.to_owned(), cell);
  36. Ok(())
  37. }
  38. }
  39. }
  40. pub fn insert_select_option_cell(&mut self, field_id: &str, data: String) -> FlowyResult<()> {
  41. match self.field_rev_map.get(&field_id.to_owned()) {
  42. None => {
  43. let msg = format!("Invalid field_id: {}", field_id);
  44. Err(FlowyError::internal().context(msg))
  45. }
  46. Some(field_rev) => {
  47. let cell_data = SelectOptionCellChangeset::from_insert(&data).to_str();
  48. let data = apply_cell_data_changeset(cell_data, None, field_rev)?;
  49. let cell = CellRevision::new(data);
  50. self.payload.cell_by_field_id.insert(field_id.to_owned(), cell);
  51. Ok(())
  52. }
  53. }
  54. }
  55. #[allow(dead_code)]
  56. pub fn height(mut self, height: i32) -> Self {
  57. self.payload.height = height;
  58. self
  59. }
  60. #[allow(dead_code)]
  61. pub fn visibility(mut self, visibility: bool) -> Self {
  62. self.payload.visibility = visibility;
  63. self
  64. }
  65. pub fn build(self, block_id: &str) -> RowRevision {
  66. RowRevision {
  67. id: self.payload.row_id,
  68. block_id: block_id.to_owned(),
  69. cells: self.payload.cell_by_field_id,
  70. height: self.payload.height,
  71. visibility: self.payload.visibility,
  72. }
  73. }
  74. }
  75. pub struct CreateRowRevisionPayload {
  76. pub row_id: String,
  77. pub cell_by_field_id: IndexMap<String, CellRevision>,
  78. pub height: i32,
  79. pub visibility: bool,
  80. }