|  | @@ -0,0 +1,125 @@
 | 
											
												
													
														|  | 
 |  | +use crate::document::document_event::DocumentEventTest;
 | 
											
												
													
														|  | 
 |  | +use crate::document::utils::{gen_id, gen_text_block_data};
 | 
											
												
													
														|  | 
 |  | +use flowy_document2::entities::*;
 | 
											
												
													
														|  | 
 |  | +use std::sync::Arc;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +const TEXT_BLOCK_TY: &str = "paragraph";
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +pub struct TextBlockEventTest {
 | 
											
												
													
														|  | 
 |  | +  doc: Arc<DocumentEventTest>,
 | 
											
												
													
														|  | 
 |  | +  doc_id: String,
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +impl TextBlockEventTest {
 | 
											
												
													
														|  | 
 |  | +  pub async fn new() -> Self {
 | 
											
												
													
														|  | 
 |  | +    let doc = DocumentEventTest::new().await;
 | 
											
												
													
														|  | 
 |  | +    let doc_id = doc.create_document().await.id;
 | 
											
												
													
														|  | 
 |  | +    Self {
 | 
											
												
													
														|  | 
 |  | +      doc: Arc::new(doc),
 | 
											
												
													
														|  | 
 |  | +      doc_id,
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  pub async fn get(&self, block_id: &str) -> Option<BlockPB> {
 | 
											
												
													
														|  | 
 |  | +    let doc = self.doc.clone();
 | 
											
												
													
														|  | 
 |  | +    let doc_id = self.doc_id.clone();
 | 
											
												
													
														|  | 
 |  | +    doc.get_block(&doc_id, block_id).await
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  /// Insert a new text block at the index of parent's children.
 | 
											
												
													
														|  | 
 |  | +  pub async fn insert_index(&self, text: String, index: usize, parent_id: Option<&str>) -> String {
 | 
											
												
													
														|  | 
 |  | +    let doc = self.doc.clone();
 | 
											
												
													
														|  | 
 |  | +    let doc_id = self.doc_id.clone();
 | 
											
												
													
														|  | 
 |  | +    let page_id = self.doc.get_page_id(&doc_id).await;
 | 
											
												
													
														|  | 
 |  | +    let parent_id = parent_id
 | 
											
												
													
														|  | 
 |  | +      .map(|id| id.to_string())
 | 
											
												
													
														|  | 
 |  | +      .unwrap_or_else(|| page_id);
 | 
											
												
													
														|  | 
 |  | +    let parent_children = self.doc.get_block_children(&doc_id, &parent_id).await;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    let prev_id = {
 | 
											
												
													
														|  | 
 |  | +      // If index is 0, then the new block will be the first child of parent.
 | 
											
												
													
														|  | 
 |  | +      if index == 0 {
 | 
											
												
													
														|  | 
 |  | +        None
 | 
											
												
													
														|  | 
 |  | +      } else {
 | 
											
												
													
														|  | 
 |  | +        parent_children.and_then(|children| {
 | 
											
												
													
														|  | 
 |  | +          // If index is greater than the length of children, then the new block will be the last child of parent.
 | 
											
												
													
														|  | 
 |  | +          if index >= children.len() {
 | 
											
												
													
														|  | 
 |  | +            children.last().cloned()
 | 
											
												
													
														|  | 
 |  | +          } else {
 | 
											
												
													
														|  | 
 |  | +            children.get(index - 1).cloned()
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +        })
 | 
											
												
													
														|  | 
 |  | +      }
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    let new_block_id = gen_id();
 | 
											
												
													
														|  | 
 |  | +    let data = gen_text_block_data(text);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    let new_block = BlockPB {
 | 
											
												
													
														|  | 
 |  | +      id: new_block_id.clone(),
 | 
											
												
													
														|  | 
 |  | +      ty: TEXT_BLOCK_TY.to_string(),
 | 
											
												
													
														|  | 
 |  | +      data,
 | 
											
												
													
														|  | 
 |  | +      parent_id: parent_id.clone(),
 | 
											
												
													
														|  | 
 |  | +      children_id: gen_id(),
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +    let action = BlockActionPB {
 | 
											
												
													
														|  | 
 |  | +      action: BlockActionTypePB::Insert,
 | 
											
												
													
														|  | 
 |  | +      payload: BlockActionPayloadPB {
 | 
											
												
													
														|  | 
 |  | +        block: new_block,
 | 
											
												
													
														|  | 
 |  | +        prev_id,
 | 
											
												
													
														|  | 
 |  | +        parent_id: Some(parent_id),
 | 
											
												
													
														|  | 
 |  | +      },
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +    let payload = ApplyActionPayloadPB {
 | 
											
												
													
														|  | 
 |  | +      document_id: doc_id,
 | 
											
												
													
														|  | 
 |  | +      actions: vec![action],
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +    doc.apply_actions(payload).await;
 | 
											
												
													
														|  | 
 |  | +    new_block_id
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  pub async fn update(&self, block_id: &str, text: String) {
 | 
											
												
													
														|  | 
 |  | +    let doc = self.doc.clone();
 | 
											
												
													
														|  | 
 |  | +    let doc_id = self.doc_id.clone();
 | 
											
												
													
														|  | 
 |  | +    let block = self.get(block_id).await.unwrap();
 | 
											
												
													
														|  | 
 |  | +    let data = gen_text_block_data(text);
 | 
											
												
													
														|  | 
 |  | +    let new_block = {
 | 
											
												
													
														|  | 
 |  | +      let mut new_block = block.clone();
 | 
											
												
													
														|  | 
 |  | +      new_block.data = data;
 | 
											
												
													
														|  | 
 |  | +      new_block
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +    let action = BlockActionPB {
 | 
											
												
													
														|  | 
 |  | +      action: BlockActionTypePB::Update,
 | 
											
												
													
														|  | 
 |  | +      payload: BlockActionPayloadPB {
 | 
											
												
													
														|  | 
 |  | +        block: new_block,
 | 
											
												
													
														|  | 
 |  | +        prev_id: None,
 | 
											
												
													
														|  | 
 |  | +        parent_id: Some(block.parent_id.clone()),
 | 
											
												
													
														|  | 
 |  | +      },
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +    let payload = ApplyActionPayloadPB {
 | 
											
												
													
														|  | 
 |  | +      document_id: doc_id,
 | 
											
												
													
														|  | 
 |  | +      actions: vec![action],
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +    doc.apply_actions(payload).await;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +  pub async fn delete(&self, block_id: &str) {
 | 
											
												
													
														|  | 
 |  | +    let doc = self.doc.clone();
 | 
											
												
													
														|  | 
 |  | +    let doc_id = self.doc_id.clone();
 | 
											
												
													
														|  | 
 |  | +    let block = self.get(block_id).await.unwrap();
 | 
											
												
													
														|  | 
 |  | +    let parent_id = block.parent_id.clone();
 | 
											
												
													
														|  | 
 |  | +    let action = BlockActionPB {
 | 
											
												
													
														|  | 
 |  | +      action: BlockActionTypePB::Delete,
 | 
											
												
													
														|  | 
 |  | +      payload: BlockActionPayloadPB {
 | 
											
												
													
														|  | 
 |  | +        block,
 | 
											
												
													
														|  | 
 |  | +        prev_id: None,
 | 
											
												
													
														|  | 
 |  | +        parent_id: Some(parent_id),
 | 
											
												
													
														|  | 
 |  | +      },
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +    let payload = ApplyActionPayloadPB {
 | 
											
												
													
														|  | 
 |  | +      document_id: doc_id,
 | 
											
												
													
														|  | 
 |  | +      actions: vec![action],
 | 
											
												
													
														|  | 
 |  | +    };
 | 
											
												
													
														|  | 
 |  | +    doc.apply_actions(payload).await;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +}
 |