feat: support moving view across sections (#5015)

This commit is contained in:
Lucas.Xu
2024-04-01 14:27:29 +08:00
committed by GitHub
parent 893d23d6a3
commit 723423d423
9 changed files with 140 additions and 2 deletions

View File

@ -475,6 +475,15 @@ pub struct UpdateRecentViewPayloadPB {
pub add_in_recent: bool,
}
#[derive(Default, ProtoBuf)]
pub struct UpdateViewVisibilityStatusPayloadPB {
#[pb(index = 1)]
pub view_ids: Vec<String>,
#[pb(index = 2)]
pub is_public: bool,
}
// impl<'de> Deserialize<'de> for ViewDataType {
// fn deserialize<D>(deserializer: D) -> Result<Self, <D as Deserializer<'de>>::Error>
// where

View File

@ -363,3 +363,14 @@ pub(crate) async fn reload_workspace_handler(
folder.reload_workspace().await?;
Ok(())
}
#[tracing::instrument(level = "debug", skip(data, folder), err)]
pub(crate) async fn update_view_visibility_status_handler(
data: AFPluginData<UpdateViewVisibilityStatusPayloadPB>,
folder: AFPluginState<Weak<FolderManager>>,
) -> Result<(), FlowyError> {
let folder = upgrade_folder(folder)?;
let params = data.into_inner();
folder.set_views_visibility(params.view_ids, params.is_public);
Ok(())
}

View File

@ -40,6 +40,7 @@ pub fn init(folder: Weak<FolderManager>) -> AFPlugin {
.event(FolderEvent::ReloadWorkspace, reload_workspace_handler)
.event(FolderEvent::ReadPrivateViews, read_private_views_handler)
.event(FolderEvent::ReadCurrentWorkspaceViews, get_current_workspace_views_handler)
.event(FolderEvent::UpdateViewVisibilityStatus, update_view_visibility_status_handler)
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Display, Hash, ProtoBuf_Enum, Flowy_Event)]
@ -166,4 +167,7 @@ pub enum FolderEvent {
/// Only the first level of child views are included.
#[event(output = "RepeatedViewPB")]
ReadCurrentWorkspaceViews = 40,
#[event(input = "UpdateViewVisibilityStatusPayloadPB")]
UpdateViewVisibilityStatus = 41,
}

View File

@ -1120,6 +1120,19 @@ impl FolderManager {
&self.cloud_service
}
pub fn set_views_visibility(&self, view_ids: Vec<String>, is_public: bool) {
self.with_folder(
|| (),
|folder| {
if is_public {
folder.delete_private_view_ids(view_ids);
} else {
folder.add_private_view_ids(view_ids);
}
},
);
}
fn get_sections(&self, section_type: Section) -> Vec<SectionItem> {
self.with_folder(Vec::new, |folder| {
let trash_ids = folder