mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
fix: infinite loop when getting ancestor for orphan view (#5375)
This commit is contained in:
parent
c67e266174
commit
24b3d69860
@ -139,6 +139,24 @@ impl EventIntegrationTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create orphan views in the folder.
|
||||||
|
/// Orphan view: the parent_view_id equal to the view_id
|
||||||
|
/// Normally, the orphan view will be created in nested database
|
||||||
|
pub async fn create_orphan_view(&self, name: &str, view_id: &str, layout: ViewLayoutPB) {
|
||||||
|
let payload = CreateOrphanViewPayloadPB {
|
||||||
|
name: name.to_string(),
|
||||||
|
desc: "".to_string(),
|
||||||
|
layout,
|
||||||
|
view_id: view_id.to_string(),
|
||||||
|
initial_data: vec![],
|
||||||
|
};
|
||||||
|
EventBuilder::new(self.clone())
|
||||||
|
.event(FolderEvent::CreateOrphanView)
|
||||||
|
.payload(payload)
|
||||||
|
.async_send()
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_folder_data(&self) -> FolderData {
|
pub fn get_folder_data(&self) -> FolderData {
|
||||||
let mutex_folder = self.appflowy_core.folder_manager.get_mutex_folder().clone();
|
let mutex_folder = self.appflowy_core.folder_manager.get_mutex_folder().clone();
|
||||||
let folder_lock_guard = mutex_folder.read();
|
let folder_lock_guard = mutex_folder.read();
|
||||||
@ -240,6 +258,18 @@ impl EventIntegrationTest {
|
|||||||
.await
|
.await
|
||||||
.parse::<ViewPB>()
|
.parse::<ViewPB>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn get_view_ancestors(&self, view_id: &str) -> Vec<ViewPB> {
|
||||||
|
EventBuilder::new(self.clone())
|
||||||
|
.event(FolderEvent::GetViewAncestors)
|
||||||
|
.payload(ViewIdPB {
|
||||||
|
value: view_id.to_string(),
|
||||||
|
})
|
||||||
|
.async_send()
|
||||||
|
.await
|
||||||
|
.parse::<RepeatedViewPB>()
|
||||||
|
.items
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ViewTest {
|
pub struct ViewTest {
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
use collab_folder::ViewLayout;
|
use collab_folder::ViewLayout;
|
||||||
|
|
||||||
|
use event_integration_test::EventIntegrationTest;
|
||||||
use flowy_folder::entities::icon::{ViewIconPB, ViewIconTypePB};
|
use flowy_folder::entities::icon::{ViewIconPB, ViewIconTypePB};
|
||||||
|
use flowy_folder::entities::ViewLayoutPB;
|
||||||
|
|
||||||
use crate::folder::local_test::script::FolderScript::*;
|
use crate::folder::local_test::script::FolderScript::*;
|
||||||
use crate::folder::local_test::script::FolderTest;
|
use crate::folder::local_test::script::FolderTest;
|
||||||
@ -331,3 +333,17 @@ async fn move_view_event_test() {
|
|||||||
assert_eq!(after_view_ids[0], view_ids[1]);
|
assert_eq!(after_view_ids[0], view_ids[1]);
|
||||||
assert_eq!(after_view_ids[1], view_ids[0]);
|
assert_eq!(after_view_ids[1], view_ids[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn create_orphan_child_view_and_get_its_ancestors_test() {
|
||||||
|
let test = EventIntegrationTest::new_anon().await;
|
||||||
|
let name = "Orphan View";
|
||||||
|
let view_id = "20240521";
|
||||||
|
test
|
||||||
|
.create_orphan_view(name, view_id, ViewLayoutPB::Grid)
|
||||||
|
.await;
|
||||||
|
let ancestors = test.get_view_ancestors(view_id).await;
|
||||||
|
assert_eq!(ancestors.len(), 1);
|
||||||
|
assert_eq!(ancestors[0].name, "Orphan View");
|
||||||
|
assert_eq!(ancestors[0].id, view_id);
|
||||||
|
}
|
||||||
|
@ -530,6 +530,10 @@ impl FolderManager {
|
|||||||
while let Some(view) =
|
while let Some(view) =
|
||||||
self.with_folder(|| None, |folder| folder.views.get_view(&parent_view_id))
|
self.with_folder(|| None, |folder| folder.views.get_view(&parent_view_id))
|
||||||
{
|
{
|
||||||
|
// If the view is already in the ancestors list, then break the loop
|
||||||
|
if ancestors.iter().any(|v: &ViewPB| v.id == view.id) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
ancestors.push(view_pb_without_child_views(view.as_ref().clone()));
|
ancestors.push(view_pb_without_child_views(view.as_ref().clone()));
|
||||||
parent_view_id = view.parent_view_id.clone();
|
parent_view_id = view.parent_view_id.clone();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user