setting_entities.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. use crate::entities::{
  2. CreateGridFilterPayload, CreateGridGroupPayload, CreateGridSortPayload, DeleteFilterPayload, GridFilter, GridGroup,
  3. GridSort, RepeatedGridFilter, RepeatedGridGroup, RepeatedGridSort,
  4. };
  5. use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
  6. use flowy_error::ErrorCode;
  7. use flowy_grid_data_model::parser::NotEmptyStr;
  8. use flowy_grid_data_model::revision::{GridLayoutRevision, GridSettingRevision};
  9. use flowy_sync::entities::grid::GridSettingChangesetParams;
  10. use std::collections::HashMap;
  11. use std::convert::TryInto;
  12. use strum::IntoEnumIterator;
  13. use strum_macros::EnumIter;
  14. #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
  15. pub struct GridSetting {
  16. #[pb(index = 1)]
  17. pub layouts: Vec<GridLayout>,
  18. #[pb(index = 2)]
  19. pub current_layout_type: GridLayoutType,
  20. #[pb(index = 3)]
  21. pub filters_by_field_id: HashMap<String, RepeatedGridFilter>,
  22. #[pb(index = 4)]
  23. pub groups_by_field_id: HashMap<String, RepeatedGridGroup>,
  24. #[pb(index = 5)]
  25. pub sorts_by_field_id: HashMap<String, RepeatedGridSort>,
  26. }
  27. #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
  28. pub struct GridLayout {
  29. #[pb(index = 1)]
  30. ty: GridLayoutType,
  31. }
  32. impl GridLayout {
  33. pub fn all() -> Vec<GridLayout> {
  34. let mut layouts = vec![];
  35. for layout_ty in GridLayoutType::iter() {
  36. layouts.push(GridLayout { ty: layout_ty })
  37. }
  38. layouts
  39. }
  40. }
  41. #[derive(Debug, Clone, PartialEq, Eq, ProtoBuf_Enum, EnumIter)]
  42. #[repr(u8)]
  43. pub enum GridLayoutType {
  44. Table = 0,
  45. Board = 1,
  46. }
  47. impl std::default::Default for GridLayoutType {
  48. fn default() -> Self {
  49. GridLayoutType::Table
  50. }
  51. }
  52. impl std::convert::From<GridLayoutRevision> for GridLayoutType {
  53. fn from(rev: GridLayoutRevision) -> Self {
  54. match rev {
  55. GridLayoutRevision::Table => GridLayoutType::Table,
  56. GridLayoutRevision::Board => GridLayoutType::Board,
  57. }
  58. }
  59. }
  60. impl std::convert::From<GridLayoutType> for GridLayoutRevision {
  61. fn from(layout: GridLayoutType) -> Self {
  62. match layout {
  63. GridLayoutType::Table => GridLayoutRevision::Table,
  64. GridLayoutType::Board => GridLayoutRevision::Board,
  65. }
  66. }
  67. }
  68. #[derive(Default, ProtoBuf)]
  69. pub struct GridSettingChangesetPayload {
  70. #[pb(index = 1)]
  71. pub grid_id: String,
  72. #[pb(index = 2)]
  73. pub layout_type: GridLayoutType,
  74. #[pb(index = 3, one_of)]
  75. pub insert_filter: Option<CreateGridFilterPayload>,
  76. #[pb(index = 4, one_of)]
  77. pub delete_filter: Option<DeleteFilterPayload>,
  78. #[pb(index = 5, one_of)]
  79. pub insert_group: Option<CreateGridGroupPayload>,
  80. #[pb(index = 6, one_of)]
  81. pub delete_group: Option<String>,
  82. #[pb(index = 7, one_of)]
  83. pub insert_sort: Option<CreateGridSortPayload>,
  84. #[pb(index = 8, one_of)]
  85. pub delete_sort: Option<String>,
  86. }
  87. impl TryInto<GridSettingChangesetParams> for GridSettingChangesetPayload {
  88. type Error = ErrorCode;
  89. fn try_into(self) -> Result<GridSettingChangesetParams, Self::Error> {
  90. let view_id = NotEmptyStr::parse(self.grid_id)
  91. .map_err(|_| ErrorCode::FieldIdIsEmpty)?
  92. .0;
  93. let insert_filter = match self.insert_filter {
  94. None => None,
  95. Some(payload) => Some(payload.try_into()?),
  96. };
  97. let delete_filter = match self.delete_filter {
  98. None => None,
  99. Some(payload) => Some(payload.try_into()?),
  100. };
  101. let insert_group = match self.insert_group {
  102. Some(payload) => Some(payload.try_into()?),
  103. None => None,
  104. };
  105. let delete_group = match self.delete_group {
  106. None => None,
  107. Some(filter_id) => Some(NotEmptyStr::parse(filter_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?.0),
  108. };
  109. let insert_sort = match self.insert_sort {
  110. None => None,
  111. Some(payload) => Some(payload.try_into()?),
  112. };
  113. let delete_sort = match self.delete_sort {
  114. None => None,
  115. Some(filter_id) => Some(NotEmptyStr::parse(filter_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?.0),
  116. };
  117. Ok(GridSettingChangesetParams {
  118. grid_id: view_id,
  119. layout_type: self.layout_type.into(),
  120. insert_filter,
  121. delete_filter,
  122. insert_group,
  123. delete_group,
  124. insert_sort,
  125. delete_sort,
  126. })
  127. }
  128. }