grid_editor.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #![allow(clippy::all)]
  2. #![allow(dead_code)]
  3. #![allow(unused_imports)]
  4. use crate::grid::block_test::util::GridRowTestBuilder;
  5. use bytes::Bytes;
  6. use flowy_grid::entities::*;
  7. use flowy_grid::services::field::SelectOptionPB;
  8. use flowy_grid::services::field::*;
  9. use flowy_grid::services::grid_editor::{GridPadBuilder, GridRevisionEditor};
  10. use flowy_grid::services::row::{CreateRowRevisionPayload, RowRevisionBuilder};
  11. use flowy_grid::services::setting::GridSettingChangesetBuilder;
  12. use flowy_grid_data_model::revision::*;
  13. use flowy_revision::REVISION_WRITE_INTERVAL_IN_MILLIS;
  14. use flowy_sync::client_grid::GridBuilder;
  15. use flowy_sync::entities::grid::{
  16. CreateGridFilterParams, DeleteFilterParams, FieldChangesetParams, GridSettingChangesetParams,
  17. };
  18. use flowy_test::helper::ViewTest;
  19. use flowy_test::FlowySDKTest;
  20. use std::collections::HashMap;
  21. use std::sync::Arc;
  22. use std::time::Duration;
  23. use strum::EnumCount;
  24. use strum::IntoEnumIterator;
  25. use tokio::time::sleep;
  26. pub struct GridEditorTest {
  27. pub sdk: FlowySDKTest,
  28. pub grid_id: String,
  29. pub editor: Arc<GridRevisionEditor>,
  30. pub field_revs: Vec<Arc<FieldRevision>>,
  31. pub block_meta_revs: Vec<Arc<GridBlockMetaRevision>>,
  32. pub row_revs: Vec<Arc<RowRevision>>,
  33. pub field_count: usize,
  34. pub row_order_by_row_id: HashMap<String, RowPB>,
  35. }
  36. impl GridEditorTest {
  37. pub async fn new() -> Self {
  38. let sdk = FlowySDKTest::default();
  39. let _ = sdk.init_user().await;
  40. let build_context = make_test_grid();
  41. let view_data: Bytes = build_context.into();
  42. let test = ViewTest::new_grid_view(&sdk, view_data.to_vec()).await;
  43. let editor = sdk.grid_manager.open_grid(&test.view.id).await.unwrap();
  44. let field_revs = editor.get_field_revs(None).await.unwrap();
  45. let block_meta_revs = editor.get_block_meta_revs().await.unwrap();
  46. let row_revs = editor.grid_block_snapshots(None).await.unwrap().pop().unwrap().row_revs;
  47. assert_eq!(block_meta_revs.len(), 1);
  48. // It seems like you should add the field in the make_test_grid() function.
  49. // Because we assert the initialize count of the fields is equal to FieldType::COUNT.
  50. assert_eq!(field_revs.len(), FieldType::COUNT);
  51. let grid_id = test.view.id;
  52. Self {
  53. sdk,
  54. grid_id,
  55. editor,
  56. field_revs,
  57. block_meta_revs,
  58. row_revs,
  59. field_count: FieldType::COUNT,
  60. row_order_by_row_id: HashMap::default(),
  61. }
  62. }
  63. pub async fn get_row_revs(&self) -> Vec<Arc<RowRevision>> {
  64. self.editor
  65. .grid_block_snapshots(None)
  66. .await
  67. .unwrap()
  68. .pop()
  69. .unwrap()
  70. .row_revs
  71. }
  72. pub async fn grid_filters(&self) -> Vec<GridFilterConfiguration> {
  73. self.editor.get_grid_filter().await.unwrap()
  74. }
  75. pub fn get_field_rev(&self, field_type: FieldType) -> &Arc<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 == field_type
  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. pub const GOOGLE: &str = "Google";
  91. pub const FACEBOOK: &str = "Facebook";
  92. pub const TWITTER: &str = "Twitter";
  93. pub const COMPLETED: &str = "Completed";
  94. pub const PLANNED: &str = "Planned";
  95. pub const PAUSED: &str = "Paused";
  96. // This grid is assumed to contain all the Fields.
  97. fn make_test_grid() -> BuildGridContext {
  98. let mut grid_builder = GridBuilder::new();
  99. // Iterate through the FieldType to create the corresponding Field.
  100. for field_type in FieldType::iter() {
  101. let field_type: FieldType = field_type;
  102. // The
  103. match field_type {
  104. FieldType::RichText => {
  105. let text_field = FieldBuilder::new(RichTextTypeOptionBuilder::default())
  106. .name("Name")
  107. .visibility(true)
  108. .build();
  109. grid_builder.add_field(text_field);
  110. }
  111. FieldType::Number => {
  112. // Number
  113. let number = NumberTypeOptionBuilder::default().set_format(NumberFormat::USD);
  114. let number_field = FieldBuilder::new(number).name("Price").visibility(true).build();
  115. grid_builder.add_field(number_field);
  116. }
  117. FieldType::DateTime => {
  118. // Date
  119. let date = DateTypeOptionBuilder::default()
  120. .date_format(DateFormat::US)
  121. .time_format(TimeFormat::TwentyFourHour);
  122. let date_field = FieldBuilder::new(date).name("Time").visibility(true).build();
  123. grid_builder.add_field(date_field);
  124. }
  125. FieldType::SingleSelect => {
  126. // Single Select
  127. let single_select = SingleSelectTypeOptionBuilder::default()
  128. .add_option(SelectOptionPB::new(COMPLETED))
  129. .add_option(SelectOptionPB::new(PLANNED))
  130. .add_option(SelectOptionPB::new(PAUSED));
  131. let single_select_field = FieldBuilder::new(single_select).name("Status").visibility(true).build();
  132. grid_builder.add_field(single_select_field);
  133. }
  134. FieldType::MultiSelect => {
  135. // MultiSelect
  136. let multi_select = MultiSelectTypeOptionBuilder::default()
  137. .add_option(SelectOptionPB::new(GOOGLE))
  138. .add_option(SelectOptionPB::new(FACEBOOK))
  139. .add_option(SelectOptionPB::new(TWITTER));
  140. let multi_select_field = FieldBuilder::new(multi_select)
  141. .name("Platform")
  142. .visibility(true)
  143. .build();
  144. grid_builder.add_field(multi_select_field);
  145. }
  146. FieldType::Checkbox => {
  147. // Checkbox
  148. let checkbox = CheckboxTypeOptionBuilder::default();
  149. let checkbox_field = FieldBuilder::new(checkbox).name("is urgent").visibility(true).build();
  150. grid_builder.add_field(checkbox_field);
  151. }
  152. FieldType::URL => {
  153. // URL
  154. let url = URLTypeOptionBuilder::default();
  155. let url_field = FieldBuilder::new(url).name("link").visibility(true).build();
  156. grid_builder.add_field(url_field);
  157. }
  158. }
  159. }
  160. // We have many assumptions base on the number of the rows, so do not change the number of the loop.
  161. for i in 0..5 {
  162. let block_id = grid_builder.block_id().to_owned();
  163. let field_revs = grid_builder.field_revs();
  164. let mut row_builder = GridRowTestBuilder::new(&block_id, field_revs);
  165. match i {
  166. 0 => {
  167. for field_type in FieldType::iter() {
  168. match field_type {
  169. FieldType::RichText => row_builder.insert_text_cell("A"),
  170. FieldType::Number => row_builder.insert_number_cell("1"),
  171. FieldType::DateTime => row_builder.insert_date_cell("1647251762"),
  172. FieldType::SingleSelect => {
  173. row_builder.insert_single_select_cell(|mut options| options.remove(0))
  174. }
  175. FieldType::Checkbox => row_builder.insert_checkbox_cell("true"),
  176. _ => "".to_owned(),
  177. };
  178. }
  179. }
  180. 1 => {
  181. for field_type in FieldType::iter() {
  182. match field_type {
  183. FieldType::RichText => row_builder.insert_text_cell("B"),
  184. FieldType::Number => row_builder.insert_number_cell("2"),
  185. FieldType::DateTime => row_builder.insert_date_cell("1647251762"),
  186. FieldType::SingleSelect => {
  187. row_builder.insert_single_select_cell(|mut options| options.remove(0))
  188. }
  189. FieldType::Checkbox => row_builder.insert_checkbox_cell("true"),
  190. _ => "".to_owned(),
  191. };
  192. }
  193. }
  194. 2 => {
  195. for field_type in FieldType::iter() {
  196. match field_type {
  197. FieldType::RichText => row_builder.insert_text_cell("C"),
  198. FieldType::Number => row_builder.insert_number_cell("3"),
  199. FieldType::DateTime => row_builder.insert_date_cell("1647251762"),
  200. FieldType::SingleSelect => {
  201. row_builder.insert_single_select_cell(|mut options| options.remove(1))
  202. }
  203. FieldType::Checkbox => row_builder.insert_checkbox_cell("false"),
  204. _ => "".to_owned(),
  205. };
  206. }
  207. }
  208. 3 => {
  209. for field_type in FieldType::iter() {
  210. match field_type {
  211. FieldType::RichText => row_builder.insert_text_cell("D"),
  212. FieldType::Number => row_builder.insert_number_cell("4"),
  213. FieldType::DateTime => row_builder.insert_date_cell("1647251762"),
  214. FieldType::SingleSelect => {
  215. row_builder.insert_single_select_cell(|mut options| options.remove(1))
  216. }
  217. FieldType::Checkbox => row_builder.insert_checkbox_cell("false"),
  218. _ => "".to_owned(),
  219. };
  220. }
  221. }
  222. 4 => {
  223. for field_type in FieldType::iter() {
  224. match field_type {
  225. FieldType::RichText => row_builder.insert_text_cell("E"),
  226. FieldType::Number => row_builder.insert_number_cell("5"),
  227. FieldType::DateTime => row_builder.insert_date_cell("1647251762"),
  228. FieldType::SingleSelect => {
  229. row_builder.insert_single_select_cell(|mut options| options.remove(2))
  230. }
  231. FieldType::Checkbox => row_builder.insert_checkbox_cell("false"),
  232. _ => "".to_owned(),
  233. };
  234. }
  235. }
  236. _ => {}
  237. }
  238. let row_rev = row_builder.build();
  239. grid_builder.add_row(row_rev);
  240. }
  241. grid_builder.build()
  242. }