grid_block.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. use indexmap::IndexMap;
  2. use nanoid::nanoid;
  3. use serde::{Deserialize, Serialize};
  4. use std::collections::HashMap;
  5. use std::sync::Arc;
  6. pub fn gen_row_id() -> String {
  7. nanoid!(6)
  8. }
  9. pub const DEFAULT_ROW_HEIGHT: i32 = 42;
  10. #[derive(Debug, Clone, Default, Serialize, Deserialize)]
  11. pub struct GridBlockRevision {
  12. pub block_id: String,
  13. pub rows: Vec<Arc<RowRevision>>,
  14. }
  15. pub type FieldId = String;
  16. #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
  17. pub struct RowRevision {
  18. pub id: String,
  19. pub block_id: String,
  20. /// cells contains key/value pairs.
  21. /// key: field id,
  22. /// value: CellMeta
  23. #[serde(with = "indexmap::serde_seq")]
  24. pub cells: IndexMap<FieldId, CellRevision>,
  25. pub height: i32,
  26. pub visibility: bool,
  27. }
  28. impl RowRevision {
  29. pub fn new(block_id: &str) -> Self {
  30. Self {
  31. id: gen_row_id(),
  32. block_id: block_id.to_owned(),
  33. cells: Default::default(),
  34. height: DEFAULT_ROW_HEIGHT,
  35. visibility: true,
  36. }
  37. }
  38. }
  39. #[derive(Debug, Clone, Default)]
  40. pub struct RowChangeset {
  41. pub row_id: String,
  42. pub height: Option<i32>,
  43. pub visibility: Option<bool>,
  44. pub cell_by_field_id: HashMap<FieldId, CellRevision>,
  45. }
  46. impl RowChangeset {
  47. pub fn new(row_id: String) -> Self {
  48. Self {
  49. row_id,
  50. height: None,
  51. visibility: None,
  52. cell_by_field_id: Default::default(),
  53. }
  54. }
  55. pub fn is_empty(&self) -> bool {
  56. self.height.is_none() && self.visibility.is_none() && self.cell_by_field_id.is_empty()
  57. }
  58. }
  59. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  60. pub struct CellRevision {
  61. pub data: String,
  62. }
  63. impl CellRevision {
  64. pub fn new(data: String) -> Self {
  65. Self { data }
  66. }
  67. pub fn is_empty(&self) -> bool {
  68. self.data.is_empty()
  69. }
  70. }