chore: add get grid setting handler

This commit is contained in:
appflowy 2022-06-19 21:10:07 +08:00
parent 759d2ec111
commit 8594da65c4
8 changed files with 134 additions and 55 deletions

View File

@ -28,7 +28,7 @@ class BoardPluginBuilder implements PluginBuilder {
class BoardPluginConfig implements PluginConfig { class BoardPluginConfig implements PluginConfig {
@override @override
bool get creatable => false; bool get creatable => true;
} }
class BoardPlugin extends Plugin { class BoardPlugin extends Plugin {

View File

@ -15,10 +15,21 @@ pub(crate) async fn get_grid_data_handler(
) -> DataResult<Grid, FlowyError> { ) -> DataResult<Grid, FlowyError> {
let grid_id: GridId = data.into_inner(); let grid_id: GridId = data.into_inner();
let editor = manager.open_grid(grid_id).await?; let editor = manager.open_grid(grid_id).await?;
let grid = editor.grid_data().await?; let grid = editor.get_grid_data().await?;
data_result(grid) data_result(grid)
} }
#[tracing::instrument(level = "trace", skip(data, manager), err)]
pub(crate) async fn get_grid_setting_handler(
data: Data<GridId>,
manager: AppData<Arc<GridManager>>,
) -> DataResult<GridSetting, FlowyError> {
let grid_id: GridId = data.into_inner();
let editor = manager.open_grid(grid_id).await?;
let grid_setting = editor.get_grid_setting().await?;
data_result(grid_setting)
}
#[tracing::instrument(level = "debug", skip(data, manager), err)] #[tracing::instrument(level = "debug", skip(data, manager), err)]
pub(crate) async fn get_grid_blocks_handler( pub(crate) async fn get_grid_blocks_handler(
data: Data<QueryGridBlocksPayload>, data: Data<QueryGridBlocksPayload>,

View File

@ -10,6 +10,7 @@ pub fn create(grid_manager: Arc<GridManager>) -> Module {
module = module module = module
.event(GridEvent::GetGridData, get_grid_data_handler) .event(GridEvent::GetGridData, get_grid_data_handler)
.event(GridEvent::GetGridBlocks, get_grid_blocks_handler) .event(GridEvent::GetGridBlocks, get_grid_blocks_handler)
.event(GridEvent::GetGridSetting, get_grid_setting_handler)
// Field // Field
.event(GridEvent::GetFields, get_fields_handler) .event(GridEvent::GetFields, get_fields_handler)
.event(GridEvent::UpdateField, update_field_handler) .event(GridEvent::UpdateField, update_field_handler)
@ -49,6 +50,9 @@ pub enum GridEvent {
#[event(input = "QueryGridBlocksPayload", output = "RepeatedGridBlock")] #[event(input = "QueryGridBlocksPayload", output = "RepeatedGridBlock")]
GetGridBlocks = 1, GetGridBlocks = 1,
#[event(input = "GridId", output = "GridSetting")]
GetGridSetting = 2,
#[event(input = "QueryFieldPayload", output = "RepeatedField")] #[event(input = "QueryFieldPayload", output = "RepeatedField")]
GetFields = 10, GetFields = 10,

View File

@ -412,7 +412,7 @@ impl GridMetaEditor {
Ok(()) Ok(())
} }
pub async fn grid_data(&self) -> FlowyResult<Grid> { pub async fn get_grid_data(&self) -> FlowyResult<Grid> {
let pad_read_guard = self.grid_pad.read().await; let pad_read_guard = self.grid_pad.read().await;
let field_orders = pad_read_guard.get_field_orders(); let field_orders = pad_read_guard.get_field_orders();
let mut block_orders = vec![]; let mut block_orders = vec![];
@ -432,6 +432,10 @@ impl GridMetaEditor {
}) })
} }
pub async fn get_grid_setting(&self) -> FlowyResult<GridSetting> {
todo!()
}
pub async fn grid_block_snapshots(&self, block_ids: Option<Vec<String>>) -> FlowyResult<Vec<GridBlockSnapshot>> { pub async fn grid_block_snapshots(&self, block_ids: Option<Vec<String>>) -> FlowyResult<Vec<GridBlockSnapshot>> {
let block_ids = match block_ids { let block_ids = match block_ids {
None => self None => self

View File

@ -1,28 +1,42 @@
use crate::parser::{NotEmptyStr, ViewFilterParser, ViewGroupParser, ViewSortParser}; use crate::parser::{NotEmptyStr, ViewFilterParser, ViewGroupParser, ViewSortParser};
use flowy_derive::ProtoBuf; use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
use flowy_error_code::ErrorCode; use flowy_error_code::ErrorCode;
use std::collections::HashMap;
use std::convert::TryInto; use std::convert::TryInto;
#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)] #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
pub struct ViewExtData { pub struct GridSetting {
#[pb(index = 1)] #[pb(index = 1)]
pub filter: ViewFilter, pub filter: HashMap<String, GridFilter>,
#[pb(index = 2)] #[pb(index = 2)]
pub group: ViewGroup, pub group: HashMap<String, GridGroup>,
#[pb(index = 3)] #[pb(index = 3)]
pub sort: ViewSort, pub sort: HashMap<String, GridSort>,
}
#[derive(Debug, Clone, PartialEq, Eq, ProtoBuf_Enum)]
#[repr(u8)]
pub enum GridLayoutType {
Table = 0,
Board = 1,
}
impl std::default::Default for GridLayoutType {
fn default() -> Self {
GridLayoutType::Table
}
} }
#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)] #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
pub struct ViewFilter { pub struct GridFilter {
#[pb(index = 1, one_of)] #[pb(index = 1, one_of)]
pub field_id: Option<String>, pub field_id: Option<String>,
} }
#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)] #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
pub struct ViewGroup { pub struct GridGroup {
#[pb(index = 1, one_of)] #[pb(index = 1, one_of)]
pub group_field_id: Option<String>, pub group_field_id: Option<String>,
@ -31,37 +45,41 @@ pub struct ViewGroup {
} }
#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)] #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
pub struct ViewSort { pub struct GridSort {
#[pb(index = 1, one_of)] #[pb(index = 1, one_of)]
pub field_id: Option<String>, pub field_id: Option<String>,
} }
#[derive(Default, ProtoBuf)] #[derive(Default, ProtoBuf)]
pub struct GridInfoChangesetPayload { pub struct GridSettingChangesetPayload {
#[pb(index = 1)] #[pb(index = 1)]
pub grid_id: String, pub grid_id: String,
#[pb(index = 2, one_of)] #[pb(index = 2)]
pub filter: Option<ViewFilter>, pub layout_type: GridLayoutType,
#[pb(index = 3, one_of)] #[pb(index = 3, one_of)]
pub group: Option<ViewGroup>, pub filter: Option<GridFilter>,
#[pb(index = 4, one_of)] #[pb(index = 4, one_of)]
pub sort: Option<ViewSort>, pub group: Option<GridGroup>,
#[pb(index = 5, one_of)]
pub sort: Option<GridSort>,
} }
pub struct GridInfoChangesetParams { pub struct GridSettingChangesetParams {
pub view_id: String, pub view_id: String,
pub filter: Option<ViewFilter>, pub layout_type: GridLayoutType,
pub group: Option<ViewGroup>, pub filter: Option<GridFilter>,
pub sort: Option<ViewSort>, pub group: Option<GridGroup>,
pub sort: Option<GridSort>,
} }
impl TryInto<GridInfoChangesetParams> for GridInfoChangesetPayload { impl TryInto<GridSettingChangesetParams> for GridSettingChangesetPayload {
type Error = ErrorCode; type Error = ErrorCode;
fn try_into(self) -> Result<GridInfoChangesetParams, Self::Error> { fn try_into(self) -> Result<GridSettingChangesetParams, Self::Error> {
let view_id = NotEmptyStr::parse(self.grid_id) let view_id = NotEmptyStr::parse(self.grid_id)
.map_err(|_| ErrorCode::FieldIdIsEmpty)? .map_err(|_| ErrorCode::FieldIdIsEmpty)?
.0; .0;
@ -81,8 +99,9 @@ impl TryInto<GridInfoChangesetParams> for GridInfoChangesetPayload {
Some(sort) => Some(ViewSortParser::parse(sort)?), Some(sort) => Some(ViewSortParser::parse(sort)?),
}; };
Ok(GridInfoChangesetParams { Ok(GridSettingChangesetParams {
view_id, view_id,
layout_type: self.layout_type,
filter, filter,
group, group,
sort, sort,

View File

@ -1,7 +1,7 @@
mod field; mod field;
mod grid; mod grid;
mod grid_info; mod grid_setting;
pub use field::*; pub use field::*;
pub use grid::*; pub use grid::*;
pub use grid_info::*; pub use grid_setting::*;

View File

@ -1,24 +1,24 @@
use crate::entities::{ViewFilter, ViewGroup, ViewSort}; use crate::entities::{GridFilter, GridGroup, GridSort};
use crate::parser::NotEmptyStr; use crate::parser::NotEmptyStr;
use flowy_error_code::ErrorCode; use flowy_error_code::ErrorCode;
pub struct ViewFilterParser(pub ViewFilter); pub struct ViewFilterParser(pub GridFilter);
impl ViewFilterParser { impl ViewFilterParser {
pub fn parse(value: ViewFilter) -> Result<ViewFilter, ErrorCode> { pub fn parse(value: GridFilter) -> Result<GridFilter, ErrorCode> {
let field_id = match value.field_id { let field_id = match value.field_id {
None => None, None => None,
Some(field_id) => Some(NotEmptyStr::parse(field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?.0), Some(field_id) => Some(NotEmptyStr::parse(field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?.0),
}; };
Ok(ViewFilter { field_id }) Ok(GridFilter { field_id })
} }
} }
pub struct ViewGroupParser(pub ViewGroup); pub struct ViewGroupParser(pub GridGroup);
impl ViewGroupParser { impl ViewGroupParser {
pub fn parse(value: ViewGroup) -> Result<ViewGroup, ErrorCode> { pub fn parse(value: GridGroup) -> Result<GridGroup, ErrorCode> {
let group_field_id = match value.group_field_id { let group_field_id = match value.group_field_id {
None => None, None => None,
Some(group_field_id) => Some( Some(group_field_id) => Some(
@ -37,22 +37,22 @@ impl ViewGroupParser {
), ),
}; };
Ok(ViewGroup { Ok(GridGroup {
group_field_id, group_field_id,
sub_group_field_id, sub_group_field_id,
}) })
} }
} }
pub struct ViewSortParser(pub ViewSort); pub struct ViewSortParser(pub GridSort);
impl ViewSortParser { impl ViewSortParser {
pub fn parse(value: ViewSort) -> Result<ViewSort, ErrorCode> { pub fn parse(value: GridSort) -> Result<GridSort, ErrorCode> {
let field_id = match value.field_id { let field_id = match value.field_id {
None => None, None => None,
Some(field_id) => Some(NotEmptyStr::parse(field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?.0), Some(field_id) => Some(NotEmptyStr::parse(field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?.0),
}; };
Ok(ViewSort { field_id }) Ok(GridSort { field_id })
} }
} }

View File

@ -1,30 +1,38 @@
use crate::entities::{ViewFilter, ViewGroup, ViewSort}; use crate::entities::{GridFilter, GridGroup, GridLayoutType, GridSetting, GridSort};
use indexmap::IndexMap;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_repr::*; use serde_repr::*;
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)] #[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GridInfoRevision { pub struct GridInfoRevision {
pub filter: GridFilterRevision, #[serde(with = "indexmap::serde_seq")]
pub group: GridGroupRevision, pub filter: IndexMap<GridLayoutRevision, GridFilterRevision>,
pub sort: GridSortRevision,
pub layout: GridLayoutRevision, #[serde(with = "indexmap::serde_seq")]
pub group: IndexMap<GridLayoutRevision, GridGroupRevision>,
#[serde(with = "indexmap::serde_seq")]
pub sort: IndexMap<GridLayoutRevision, GridSortRevision>,
} }
#[derive(Debug, Clone, Serialize, Deserialize, Default)] #[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize_repr, Deserialize_repr)]
pub struct GridLayoutRevision {
pub ty: GridLayoutType,
}
#[derive(Debug, Clone, Serialize_repr, Deserialize_repr)]
#[repr(u8)] #[repr(u8)]
pub enum GridLayoutType { pub enum GridLayoutRevision {
Table = 0, Table = 0,
Board = 1, Board = 1,
} }
impl std::default::Default for GridLayoutType { impl ToString for GridLayoutRevision {
fn to_string(&self) -> String {
let layout_rev = self.clone() as u8;
layout_rev.to_string()
}
}
impl std::default::Default for GridLayoutRevision {
fn default() -> Self { fn default() -> Self {
GridLayoutType::Table GridLayoutRevision::Table
} }
} }
@ -44,23 +52,56 @@ pub struct GridSortRevision {
field_id: Option<String>, field_id: Option<String>,
} }
impl std::convert::From<GridFilterRevision> for ViewFilter { impl std::convert::From<GridFilterRevision> for GridFilter {
fn from(rev: GridFilterRevision) -> Self { fn from(rev: GridFilterRevision) -> Self {
ViewFilter { field_id: rev.field_id } GridFilter { field_id: rev.field_id }
} }
} }
impl std::convert::From<GridGroupRevision> for ViewGroup { impl std::convert::From<GridGroupRevision> for GridGroup {
fn from(rev: GridGroupRevision) -> Self { fn from(rev: GridGroupRevision) -> Self {
ViewGroup { GridGroup {
group_field_id: rev.group_field_id, group_field_id: rev.group_field_id,
sub_group_field_id: rev.sub_group_field_id, sub_group_field_id: rev.sub_group_field_id,
} }
} }
} }
impl std::convert::From<GridSortRevision> for ViewSort { impl std::convert::From<GridSortRevision> for GridSort {
fn from(rev: GridSortRevision) -> Self { fn from(rev: GridSortRevision) -> Self {
ViewSort { field_id: rev.field_id } GridSort { field_id: rev.field_id }
}
}
impl std::convert::From<GridLayoutRevision> for GridLayoutType {
fn from(rev: GridLayoutRevision) -> Self {
match rev {
GridLayoutRevision::Table => GridLayoutType::Table,
GridLayoutRevision::Board => GridLayoutType::Board,
}
}
}
impl std::convert::From<GridInfoRevision> for GridSetting {
fn from(rev: GridInfoRevision) -> Self {
let filter: HashMap<String, GridFilter> = rev
.filter
.into_iter()
.map(|(layout_rev, filter_rev)| (layout_rev.to_string(), filter_rev.into()))
.collect();
let group: HashMap<String, GridGroup> = rev
.group
.into_iter()
.map(|(layout_rev, group_rev)| (layout_rev.to_string(), group_rev.into()))
.collect();
let sort: HashMap<String, GridSort> = rev
.sort
.into_iter()
.map(|(layout_rev, sort_rev)| (layout_rev.to_string(), sort_rev.into()))
.collect();
GridSetting { filter, group, sort }
} }
} }