grid_editor.rs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #![allow(clippy::all)]
  2. #![allow(dead_code)]
  3. #![allow(unused_imports)]
  4. use bytes::Bytes;
  5. use flowy_grid::entities::*;
  6. use flowy_grid::services::field::select_option::SelectOption;
  7. use flowy_grid::services::field::*;
  8. use flowy_grid::services::grid_editor::{GridPadBuilder, GridRevisionEditor};
  9. use flowy_grid::services::row::CreateRowRevisionPayload;
  10. use flowy_grid::services::setting::GridSettingChangesetBuilder;
  11. use flowy_grid_data_model::revision::*;
  12. use flowy_revision::REVISION_WRITE_INTERVAL_IN_MILLIS;
  13. use flowy_sync::client_grid::GridBuilder;
  14. use flowy_sync::entities::grid::{
  15. CreateGridFilterParams, DeleteFilterParams, FieldChangesetParams, GridSettingChangesetParams,
  16. };
  17. use flowy_test::helper::ViewTest;
  18. use flowy_test::FlowySDKTest;
  19. use std::collections::HashMap;
  20. use std::sync::Arc;
  21. use std::time::Duration;
  22. use strum::EnumCount;
  23. use tokio::time::sleep;
  24. pub struct GridEditorTest {
  25. pub sdk: FlowySDKTest,
  26. pub grid_id: String,
  27. pub editor: Arc<GridRevisionEditor>,
  28. pub field_revs: Vec<Arc<FieldRevision>>,
  29. pub block_meta_revs: Vec<Arc<GridBlockMetaRevision>>,
  30. pub row_revs: Vec<Arc<RowRevision>>,
  31. pub field_count: usize,
  32. pub row_order_by_row_id: HashMap<String, RowInfo>,
  33. }
  34. impl GridEditorTest {
  35. pub async fn new() -> Self {
  36. let sdk = FlowySDKTest::default();
  37. let _ = sdk.init_user().await;
  38. let build_context = make_all_field_test_grid();
  39. let view_data: Bytes = build_context.into();
  40. let test = ViewTest::new_grid_view(&sdk, view_data.to_vec()).await;
  41. let editor = sdk.grid_manager.open_grid(&test.view.id).await.unwrap();
  42. let field_revs = editor.get_field_revs(None).await.unwrap();
  43. let block_meta_revs = editor.get_block_meta_revs().await.unwrap();
  44. let row_revs = editor.grid_block_snapshots(None).await.unwrap().pop().unwrap().row_revs;
  45. assert_eq!(row_revs.len(), 3);
  46. assert_eq!(block_meta_revs.len(), 1);
  47. // It seems like you should add the field in the make_test_grid() function.
  48. // Because we assert the initialize count of the fields is equal to FieldType::COUNT.
  49. assert_eq!(field_revs.len(), FieldType::COUNT);
  50. let grid_id = test.view.id;
  51. Self {
  52. sdk,
  53. grid_id,
  54. editor,
  55. field_revs,
  56. block_meta_revs,
  57. row_revs,
  58. field_count: FieldType::COUNT,
  59. row_order_by_row_id: HashMap::default(),
  60. }
  61. }
  62. pub(crate) async fn get_row_revs(&self) -> Vec<Arc<RowRevision>> {
  63. self.editor
  64. .grid_block_snapshots(None)
  65. .await
  66. .unwrap()
  67. .pop()
  68. .unwrap()
  69. .row_revs
  70. }
  71. pub async fn grid_filters(&self) -> Vec<GridFilter> {
  72. let layout_type = GridLayoutType::Table;
  73. self.editor.get_grid_filter(&layout_type).await.unwrap()
  74. }
  75. pub fn text_field(&self) -> &FieldRevision {
  76. self.field_revs
  77. .iter()
  78. .filter(|field_rev| {
  79. let t_field_type: FieldType = field_rev.field_type_rev.into();
  80. t_field_type == FieldType::RichText
  81. })
  82. .collect::<Vec<_>>()
  83. .pop()
  84. .unwrap()
  85. }
  86. }
  87. fn make_all_field_test_grid() -> BuildGridContext {
  88. let text_field = FieldBuilder::new(RichTextTypeOptionBuilder::default())
  89. .name("Name")
  90. .visibility(true)
  91. .build();
  92. // Single Select
  93. let single_select = SingleSelectTypeOptionBuilder::default()
  94. .option(SelectOption::new("Live"))
  95. .option(SelectOption::new("Completed"))
  96. .option(SelectOption::new("Planned"))
  97. .option(SelectOption::new("Paused"));
  98. let single_select_field = FieldBuilder::new(single_select).name("Status").visibility(true).build();
  99. // MultiSelect
  100. let multi_select = MultiSelectTypeOptionBuilder::default()
  101. .option(SelectOption::new("Google"))
  102. .option(SelectOption::new("Facebook"))
  103. .option(SelectOption::new("Twitter"));
  104. let multi_select_field = FieldBuilder::new(multi_select)
  105. .name("Platform")
  106. .visibility(true)
  107. .build();
  108. // Number
  109. let number = NumberTypeOptionBuilder::default().set_format(NumberFormat::USD);
  110. let number_field = FieldBuilder::new(number).name("Price").visibility(true).build();
  111. // Date
  112. let date = DateTypeOptionBuilder::default()
  113. .date_format(DateFormat::US)
  114. .time_format(TimeFormat::TwentyFourHour);
  115. let date_field = FieldBuilder::new(date).name("Time").visibility(true).build();
  116. // Checkbox
  117. let checkbox = CheckboxTypeOptionBuilder::default();
  118. let checkbox_field = FieldBuilder::new(checkbox).name("is done").visibility(true).build();
  119. // URL
  120. let url = URLTypeOptionBuilder::default();
  121. let url_field = FieldBuilder::new(url).name("link").visibility(true).build();
  122. // for i in 0..3 {
  123. // for field_type in FieldType::iter() {
  124. // let field_type: FieldType = field_type;
  125. // match field_type {
  126. // FieldType::RichText => {}
  127. // FieldType::Number => {}
  128. // FieldType::DateTime => {}
  129. // FieldType::SingleSelect => {}
  130. // FieldType::MultiSelect => {}
  131. // FieldType::Checkbox => {}
  132. // FieldType::URL => {}
  133. // }
  134. // }
  135. // }
  136. GridBuilder::default()
  137. .add_field(text_field)
  138. .add_field(single_select_field)
  139. .add_field(multi_select_field)
  140. .add_field(number_field)
  141. .add_field(date_field)
  142. .add_field(checkbox_field)
  143. .add_field(url_field)
  144. .add_empty_row()
  145. .add_empty_row()
  146. .add_empty_row()
  147. .build()
  148. }