view_rev.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. use crate::{FilterConfiguration, GroupConfiguration, SortConfiguration};
  2. use indexmap::IndexMap;
  3. use nanoid::nanoid;
  4. use serde::{Deserialize, Serialize};
  5. use serde_repr::*;
  6. #[allow(dead_code)]
  7. pub fn gen_grid_view_id() -> String {
  8. nanoid!(6)
  9. }
  10. #[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize_repr, Deserialize_repr)]
  11. #[repr(u8)]
  12. pub enum LayoutRevision {
  13. Grid = 0,
  14. Board = 1,
  15. Calendar = 2,
  16. }
  17. impl ToString for LayoutRevision {
  18. fn to_string(&self) -> String {
  19. let layout_rev = self.clone() as u8;
  20. layout_rev.to_string()
  21. }
  22. }
  23. impl std::default::Default for LayoutRevision {
  24. fn default() -> Self {
  25. LayoutRevision::Grid
  26. }
  27. }
  28. #[derive(Debug, Clone, Default, Serialize, Deserialize)]
  29. pub struct DatabaseViewRevision {
  30. pub view_id: String,
  31. #[serde(rename = "grid_id")]
  32. pub database_id: String,
  33. #[serde(skip_serializing_if = "String::is_empty")]
  34. #[serde(default)]
  35. pub name: String,
  36. #[serde(default = "DEFAULT_BASE_VALUE")]
  37. pub is_base: bool,
  38. pub layout: LayoutRevision,
  39. #[serde(default)]
  40. #[serde(skip_serializing_if = "LayoutSetting::is_empty")]
  41. pub layout_settings: LayoutSetting,
  42. #[serde(default)]
  43. pub filters: FilterConfiguration,
  44. #[serde(default)]
  45. pub groups: GroupConfiguration,
  46. #[serde(default)]
  47. pub sorts: SortConfiguration,
  48. }
  49. const DEFAULT_BASE_VALUE: fn() -> bool = || true;
  50. impl DatabaseViewRevision {
  51. pub fn new(
  52. database_id: String,
  53. view_id: String,
  54. is_base: bool,
  55. name: String,
  56. layout: LayoutRevision,
  57. ) -> Self {
  58. DatabaseViewRevision {
  59. database_id,
  60. view_id,
  61. layout,
  62. is_base,
  63. name,
  64. layout_settings: Default::default(),
  65. filters: Default::default(),
  66. groups: Default::default(),
  67. sorts: Default::default(),
  68. }
  69. }
  70. pub fn from_json(json: String) -> Result<Self, serde_json::Error> {
  71. serde_json::from_str(&json)
  72. }
  73. }
  74. #[derive(Debug, Clone, Default, Serialize, Deserialize)]
  75. #[serde(transparent)]
  76. pub struct LayoutSetting {
  77. #[serde(with = "indexmap::serde_seq")]
  78. inner: IndexMap<LayoutRevision, String>,
  79. }
  80. impl LayoutSetting {
  81. pub fn new() -> Self {
  82. Self {
  83. inner: Default::default(),
  84. }
  85. }
  86. pub fn is_empty(&self) -> bool {
  87. self.inner.is_empty()
  88. }
  89. }
  90. impl std::ops::Deref for LayoutSetting {
  91. type Target = IndexMap<LayoutRevision, String>;
  92. fn deref(&self) -> &Self::Target {
  93. &self.inner
  94. }
  95. }
  96. impl std::ops::DerefMut for LayoutSetting {
  97. fn deref_mut(&mut self) -> &mut Self::Target {
  98. &mut self.inner
  99. }
  100. }
  101. #[derive(Debug, Clone, Default, Serialize, Deserialize)]
  102. pub struct RowOrderRevision {
  103. pub row_id: String,
  104. }
  105. #[cfg(test)]
  106. mod tests {
  107. use crate::DatabaseViewRevision;
  108. #[test]
  109. fn grid_view_revision_serde_test() {
  110. let grid_view_revision = DatabaseViewRevision {
  111. view_id: "1".to_string(),
  112. database_id: "1".to_string(),
  113. name: "".to_string(),
  114. is_base: true,
  115. layout: Default::default(),
  116. layout_settings: Default::default(),
  117. filters: Default::default(),
  118. groups: Default::default(),
  119. sorts: Default::default(),
  120. };
  121. let s = serde_json::to_string(&grid_view_revision).unwrap();
  122. assert_eq!(
  123. s,
  124. r#"{"view_id":"1","grid_id":"1","is_base":true,"layout":0,"filters":[],"groups":[],"sorts":[]}"#
  125. );
  126. }
  127. }