grid_editor.rs 11 KB

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