grid_editor.rs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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::SelectOption;
  7. use flowy_grid::services::field::*;
  8. use flowy_grid::services::grid_editor::{GridPadBuilder, GridRevisionEditor};
  9. use flowy_grid::services::row::{CreateRowRevisionPayload, RowRevisionBuilder};
  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 strum::IntoEnumIterator;
  24. use tokio::time::sleep;
  25. pub struct GridEditorTest {
  26. pub sdk: FlowySDKTest,
  27. pub grid_id: String,
  28. pub editor: Arc<GridRevisionEditor>,
  29. pub field_revs: Vec<Arc<FieldRevision>>,
  30. pub block_meta_revs: Vec<Arc<GridBlockMetaRevision>>,
  31. pub row_revs: Vec<Arc<RowRevision>>,
  32. pub field_count: usize,
  33. pub row_order_by_row_id: HashMap<String, RowInfo>,
  34. }
  35. impl GridEditorTest {
  36. pub async fn new() -> Self {
  37. let sdk = FlowySDKTest::default();
  38. let _ = sdk.init_user().await;
  39. let build_context = make_test_grid();
  40. let view_data: Bytes = build_context.into();
  41. let test = ViewTest::new_grid_view(&sdk, view_data.to_vec()).await;
  42. let editor = sdk.grid_manager.open_grid(&test.view.id).await.unwrap();
  43. let field_revs = editor.get_field_revs(None).await.unwrap();
  44. let block_meta_revs = editor.get_block_meta_revs().await.unwrap();
  45. let row_revs = editor.grid_block_snapshots(None).await.unwrap().pop().unwrap().row_revs;
  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. pub fn block_id(&self) -> &str {
  87. &self.block_meta_revs.last().unwrap().block_id
  88. }
  89. }
  90. // This grid is assumed to contain all the Fields.
  91. fn make_test_grid() -> BuildGridContext {
  92. let mut grid_builder = GridBuilder::new();
  93. // Iterate through the FieldType to create the corresponding Field.
  94. for field_type in FieldType::iter() {
  95. let field_type: FieldType = field_type;
  96. // The
  97. match field_type {
  98. FieldType::RichText => {
  99. let text_field = FieldBuilder::new(RichTextTypeOptionBuilder::default())
  100. .name("Name")
  101. .visibility(true)
  102. .build();
  103. grid_builder.add_field(text_field);
  104. }
  105. FieldType::Number => {
  106. // Number
  107. let number = NumberTypeOptionBuilder::default().set_format(NumberFormat::USD);
  108. let number_field = FieldBuilder::new(number).name("Price").visibility(true).build();
  109. grid_builder.add_field(number_field);
  110. }
  111. FieldType::DateTime => {
  112. // Date
  113. let date = DateTypeOptionBuilder::default()
  114. .date_format(DateFormat::US)
  115. .time_format(TimeFormat::TwentyFourHour);
  116. let date_field = FieldBuilder::new(date).name("Time").visibility(true).build();
  117. grid_builder.add_field(date_field);
  118. }
  119. FieldType::SingleSelect => {
  120. // Single Select
  121. let single_select = SingleSelectTypeOptionBuilder::default()
  122. .option(SelectOption::new("Live"))
  123. .option(SelectOption::new("Completed"))
  124. .option(SelectOption::new("Planned"))
  125. .option(SelectOption::new("Paused"));
  126. let single_select_field = FieldBuilder::new(single_select).name("Status").visibility(true).build();
  127. grid_builder.add_field(single_select_field);
  128. }
  129. FieldType::MultiSelect => {
  130. // MultiSelect
  131. let multi_select = MultiSelectTypeOptionBuilder::default()
  132. .option(SelectOption::new("Google"))
  133. .option(SelectOption::new("Facebook"))
  134. .option(SelectOption::new("Twitter"));
  135. let multi_select_field = FieldBuilder::new(multi_select)
  136. .name("Platform")
  137. .visibility(true)
  138. .build();
  139. grid_builder.add_field(multi_select_field);
  140. }
  141. FieldType::Checkbox => {
  142. // Checkbox
  143. let checkbox = CheckboxTypeOptionBuilder::default();
  144. let checkbox_field = FieldBuilder::new(checkbox).name("is done").visibility(true).build();
  145. grid_builder.add_field(checkbox_field);
  146. }
  147. FieldType::URL => {
  148. // URL
  149. let url = URLTypeOptionBuilder::default();
  150. let url_field = FieldBuilder::new(url).name("link").visibility(true).build();
  151. grid_builder.add_field(url_field);
  152. }
  153. }
  154. }
  155. // We have many assumptions base on the number of the rows, so do not change the number of the loop.
  156. for _i in 0..10 {
  157. for field_type in FieldType::iter() {
  158. let field_type: FieldType = field_type;
  159. // let mut row_builder = RowRevisionBuilder::new()
  160. match field_type {
  161. FieldType::RichText => {}
  162. FieldType::Number => {}
  163. FieldType::DateTime => {}
  164. FieldType::SingleSelect => {}
  165. FieldType::MultiSelect => {}
  166. FieldType::Checkbox => {}
  167. FieldType::URL => {}
  168. }
  169. }
  170. }
  171. // assert_eq!(row_revs.len(), 10);
  172. // .add_empty_row()
  173. // .add_empty_row()
  174. // .add_empty_row()
  175. grid_builder.build()
  176. }