row_builder.rs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. use crate::services::field::select_option::SelectOptionCellChangeset;
  2. use crate::services::row::apply_cell_data_changeset;
  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 CreateRowRevisionBuilder<'a> {
  9. field_rev_map: HashMap<&'a String, &'a Arc<FieldRevision>>,
  10. payload: CreateRowRevisionPayload,
  11. }
  12. impl<'a> CreateRowRevisionBuilder<'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 add_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!("Invalid field_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 add_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) -> CreateRowRevisionPayload {
  66. self.payload
  67. }
  68. }
  69. pub fn make_row_rev_from_context(block_id: &str, payload: CreateRowRevisionPayload) -> RowRevision {
  70. RowRevision {
  71. id: payload.row_id,
  72. block_id: block_id.to_owned(),
  73. cells: payload.cell_by_field_id,
  74. height: payload.height,
  75. visibility: payload.visibility,
  76. }
  77. }
  78. pub struct CreateRowRevisionPayload {
  79. pub row_id: String,
  80. pub cell_by_field_id: IndexMap<String, CellRevision>,
  81. pub height: i32,
  82. pub visibility: bool,
  83. }