chore: save view order

This commit is contained in:
appflowy
2022-04-26 21:20:02 +08:00
parent 25548ad9eb
commit 7f7801d04e
22 changed files with 687 additions and 32 deletions

View File

@ -62,7 +62,8 @@ pub fn create(folder: Arc<FolderManager>) -> Module {
.event(FolderEvent::DeleteView, delete_view_handler)
.event(FolderEvent::DuplicateView, duplicate_view_handler)
.event(FolderEvent::SetLatestView, set_latest_view_handler)
.event(FolderEvent::CloseView, close_view_handler);
.event(FolderEvent::CloseView, close_view_handler)
.event(FolderEvent::MoveItem, move_item_handler);
module = module
.event(FolderEvent::ReadTrash, read_trash_handler)
@ -131,6 +132,9 @@ pub enum FolderEvent {
#[event(input = "ViewId")]
CloseView = 208,
#[event(input = "MoveFolderItemPayload")]
MoveItem = 209,
#[event(output = "RepeatedTrash")]
ReadTrash = 300,

View File

@ -43,6 +43,7 @@ pub enum FolderEvent {
CopyLink = 206,
SetLatestView = 207,
CloseView = 208,
MoveItem = 209,
ReadTrash = 300,
PutbackTrash = 301,
DeleteTrash = 302,
@ -75,6 +76,7 @@ impl ::protobuf::ProtobufEnum for FolderEvent {
206 => ::std::option::Option::Some(FolderEvent::CopyLink),
207 => ::std::option::Option::Some(FolderEvent::SetLatestView),
208 => ::std::option::Option::Some(FolderEvent::CloseView),
209 => ::std::option::Option::Some(FolderEvent::MoveItem),
300 => ::std::option::Option::Some(FolderEvent::ReadTrash),
301 => ::std::option::Option::Some(FolderEvent::PutbackTrash),
302 => ::std::option::Option::Some(FolderEvent::DeleteTrash),
@ -104,6 +106,7 @@ impl ::protobuf::ProtobufEnum for FolderEvent {
FolderEvent::CopyLink,
FolderEvent::SetLatestView,
FolderEvent::CloseView,
FolderEvent::MoveItem,
FolderEvent::ReadTrash,
FolderEvent::PutbackTrash,
FolderEvent::DeleteTrash,
@ -137,7 +140,7 @@ impl ::protobuf::reflect::ProtobufValue for FolderEvent {
}
static file_descriptor_proto_data: &'static [u8] = b"\
\n\x0fevent_map.proto*\xae\x03\n\x0bFolderEvent\x12\x13\n\x0fCreateWorks\
\n\x0fevent_map.proto*\xbd\x03\n\x0bFolderEvent\x12\x13\n\x0fCreateWorks\
pace\x10\0\x12\x14\n\x10ReadCurWorkspace\x10\x01\x12\x12\n\x0eReadWorksp\
aces\x10\x02\x12\x13\n\x0fDeleteWorkspace\x10\x03\x12\x11\n\rOpenWorkspa\
ce\x10\x04\x12\x15\n\x11ReadWorkspaceApps\x10\x05\x12\r\n\tCreateApp\x10\
@ -145,10 +148,11 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x10h\x12\x0f\n\nCreateView\x10\xc9\x01\x12\r\n\x08ReadView\x10\xca\x01\
\x12\x0f\n\nUpdateView\x10\xcb\x01\x12\x0f\n\nDeleteView\x10\xcc\x01\x12\
\x12\n\rDuplicateView\x10\xcd\x01\x12\r\n\x08CopyLink\x10\xce\x01\x12\
\x12\n\rSetLatestView\x10\xcf\x01\x12\x0e\n\tCloseView\x10\xd0\x01\x12\
\x0e\n\tReadTrash\x10\xac\x02\x12\x11\n\x0cPutbackTrash\x10\xad\x02\x12\
\x10\n\x0bDeleteTrash\x10\xae\x02\x12\x14\n\x0fRestoreAllTrash\x10\xaf\
\x02\x12\x13\n\x0eDeleteAllTrash\x10\xb0\x02b\x06proto3\
\x12\n\rSetLatestView\x10\xcf\x01\x12\x0e\n\tCloseView\x10\xd0\x01\x12\r\
\n\x08MoveItem\x10\xd1\x01\x12\x0e\n\tReadTrash\x10\xac\x02\x12\x11\n\
\x0cPutbackTrash\x10\xad\x02\x12\x10\n\x0bDeleteTrash\x10\xae\x02\x12\
\x14\n\x0fRestoreAllTrash\x10\xaf\x02\x12\x13\n\x0eDeleteAllTrash\x10\
\xb0\x02b\x06proto3\
";
static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;

View File

@ -19,6 +19,7 @@ enum FolderEvent {
CopyLink = 206;
SetLatestView = 207;
CloseView = 208;
MoveItem = 209;
ReadTrash = 300;
PutbackTrash = 301;
DeleteTrash = 302;

View File

@ -95,6 +95,19 @@ impl AppController {
Ok(())
}
pub(crate) async fn move_app(&self, app_id: &str, from: usize, to: usize) -> FlowyResult<()> {
let _ = self
.persistence
.begin_transaction(|transaction| {
let _ = transaction.move_app(app_id, from, to)?;
let app = transaction.read_app(app_id)?;
let _ = notify_apps_changed(&app.workspace_id, self.trash_controller.clone(), &transaction)?;
Ok(())
})
.await?;
Ok(())
}
pub(crate) async fn read_local_apps(&self, ids: Vec<String>) -> Result<Vec<App>, FlowyError> {
let apps = self
.persistence

View File

@ -34,12 +34,14 @@ pub trait FolderPersistenceTransaction {
fn read_app(&self, app_id: &str) -> FlowyResult<App>;
fn read_workspace_apps(&self, workspace_id: &str) -> FlowyResult<Vec<App>>;
fn delete_app(&self, app_id: &str) -> FlowyResult<App>;
fn move_app(&self, app_id: &str, from: usize, to: usize) -> FlowyResult<()>;
fn create_view(&self, view: View) -> FlowyResult<()>;
fn read_view(&self, view_id: &str) -> FlowyResult<View>;
fn read_views(&self, belong_to_id: &str) -> FlowyResult<Vec<View>>;
fn update_view(&self, changeset: ViewChangeset) -> FlowyResult<()>;
fn delete_view(&self, view_id: &str) -> FlowyResult<()>;
fn move_view(&self, view_id: &str, from: usize, to: usize) -> FlowyResult<()>;
fn create_trash(&self, trashes: Vec<Trash>) -> FlowyResult<()>;
fn read_trash(&self, trash_id: Option<String>) -> FlowyResult<RepeatedTrash>;

View File

@ -63,6 +63,10 @@ impl<'a> FolderPersistenceTransaction for V1Transaction<'a> {
Ok(App::from(table))
}
fn move_app(&self, _app_id: &str, _from: usize, _to: usize) -> FlowyResult<()> {
Ok(())
}
fn create_view(&self, view: View) -> FlowyResult<()> {
let _ = ViewTableSql::create_view(view, &*self.0)?;
Ok(())
@ -89,6 +93,10 @@ impl<'a> FolderPersistenceTransaction for V1Transaction<'a> {
Ok(())
}
fn move_view(&self, _view_id: &str, _from: usize, _to: usize) -> FlowyResult<()> {
Ok(())
}
fn create_trash(&self, trashes: Vec<Trash>) -> FlowyResult<()> {
let _ = TrashTableSql::create_trash(trashes, &*self.0)?;
Ok(())
@ -160,6 +168,10 @@ where
(**self).delete_app(app_id)
}
fn move_app(&self, _app_id: &str, _from: usize, _to: usize) -> FlowyResult<()> {
Ok(())
}
fn create_view(&self, view: View) -> FlowyResult<()> {
(**self).create_view(view)
}
@ -180,6 +192,10 @@ where
(**self).delete_view(view_id)
}
fn move_view(&self, _view_id: &str, _from: usize, _to: usize) -> FlowyResult<()> {
Ok(())
}
fn create_trash(&self, trashes: Vec<Trash>) -> FlowyResult<()> {
(**self).create_trash(trashes)
}

View File

@ -83,6 +83,13 @@ impl FolderPersistenceTransaction for ClientFolderEditor {
Ok(app)
}
fn move_app(&self, app_id: &str, from: usize, to: usize) -> FlowyResult<()> {
if let Some(change) = self.folder.write().move_app(app_id, from, to)? {
let _ = self.apply_change(change)?;
}
Ok(())
}
fn create_view(&self, view: View) -> FlowyResult<()> {
if let Some(change) = self.folder.write().create_view(view)? {
let _ = self.apply_change(change)?;
@ -118,6 +125,13 @@ impl FolderPersistenceTransaction for ClientFolderEditor {
Ok(())
}
fn move_view(&self, view_id: &str, from: usize, to: usize) -> FlowyResult<()> {
if let Some(change) = self.folder.write().move_view(view_id, from, to)? {
let _ = self.apply_change(change)?;
}
Ok(())
}
fn create_trash(&self, trashes: Vec<Trash>) -> FlowyResult<()> {
if let Some(change) = self.folder.write().create_trash(trashes)? {
let _ = self.apply_change(change)?;
@ -178,6 +192,10 @@ where
(**self).delete_app(app_id)
}
fn move_app(&self, app_id: &str, from: usize, to: usize) -> FlowyResult<()> {
(**self).move_app(app_id, from, to)
}
fn create_view(&self, view: View) -> FlowyResult<()> {
(**self).create_view(view)
}
@ -198,6 +216,10 @@ where
(**self).delete_view(view_id)
}
fn move_view(&self, view_id: &str, from: usize, to: usize) -> FlowyResult<()> {
(**self).move_view(view_id, from, to)
}
fn create_trash(&self, trashes: Vec<Trash>) -> FlowyResult<()> {
(**self).create_trash(trashes)
}

View File

@ -154,6 +154,20 @@ impl ViewController {
Ok(())
}
#[tracing::instrument(level = "debug", skip(self), err)]
pub(crate) async fn move_view(&self, view_id: &str, from: usize, to: usize) -> Result<(), FlowyError> {
let _ = self
.persistence
.begin_transaction(|transaction| {
let _ = transaction.move_view(view_id, from, to)?;
let view = transaction.read_view(view_id)?;
let _ = notify_views_changed(&view.belong_to_id, self.trash_controller.clone(), &transaction)?;
Ok(())
})
.await?;
Ok(())
}
#[tracing::instrument(level = "debug", skip(self), err)]
pub(crate) async fn duplicate_view(&self, view_id: &str) -> Result<(), FlowyError> {
let view = self

View File

@ -1,3 +1,4 @@
use crate::services::AppController;
use crate::{
entities::{
trash::Trash,
@ -8,6 +9,7 @@ use crate::{
errors::FlowyError,
services::{TrashController, ViewController},
};
use flowy_folder_data_model::entities::view::{MoveFolderItemParams, MoveFolderItemPayload, MoveFolderItemType};
use lib_dispatch::prelude::{data_result, AppData, Data, DataResult};
use std::{convert::TryInto, sync::Arc};
@ -83,6 +85,26 @@ pub(crate) async fn close_view_handler(
Ok(())
}
#[tracing::instrument(level = "debug", skip_all, err)]
pub(crate) async fn move_item_handler(
data: Data<MoveFolderItemPayload>,
view_controller: AppData<Arc<ViewController>>,
app_controller: AppData<Arc<AppController>>,
) -> Result<(), FlowyError> {
let params: MoveFolderItemParams = data.into_inner().try_into()?;
match params.ty {
MoveFolderItemType::MoveApp => {
let _ = app_controller.move_app(&params.item_id, params.from, params.to).await?;
}
MoveFolderItemType::MoveView => {
let _ = view_controller
.move_view(&params.item_id, params.from, params.to)
.await?;
}
}
Ok(())
}
#[tracing::instrument(level = "debug", skip(data, controller), err)]
pub(crate) async fn duplicate_view_handler(
data: Data<ViewId>,