|
@@ -1,12 +1,16 @@
|
|
|
use crate::dart_notification::{send_dart_notification, GridNotification};
|
|
|
use crate::entities::{
|
|
|
- CreateFilterParams, CreateRowParams, DeleteFilterParams, GridFilterConfiguration, GridLayout, GridLayoutPB,
|
|
|
- GridSettingPB, GroupChangesetPB, GroupPB, GroupViewChangesetPB, InsertedGroupPB, InsertedRowPB, MoveGroupParams,
|
|
|
- RepeatedGridConfigurationFilterPB, RepeatedGridGroupConfigurationPB, RowPB,
|
|
|
+ CreateRowParams, DeleteFilterParams, DeleteGroupParams, GridFilterConfigurationPB, GridGroupConfigurationPB,
|
|
|
+ GridLayout, GridLayoutPB, GridSettingPB, GroupChangesetPB, GroupPB, GroupViewChangesetPB, InsertFilterParams,
|
|
|
+ InsertGroupParams, InsertedGroupPB, InsertedRowPB, MoveGroupParams, RepeatedGridFilterConfigurationPB,
|
|
|
+ RepeatedGridGroupConfigurationPB, RowPB,
|
|
|
};
|
|
|
use crate::services::grid_editor_task::GridServiceTaskScheduler;
|
|
|
use crate::services::grid_view_manager::{GridViewFieldDelegate, GridViewRowDelegate};
|
|
|
-use crate::services::group::{GroupConfigurationReader, GroupConfigurationWriter, GroupService};
|
|
|
+use crate::services::group::{
|
|
|
+ default_group_configuration, find_group_field, make_group_controller, GroupConfigurationReader,
|
|
|
+ GroupConfigurationWriter, GroupController, MoveGroupRowContext,
|
|
|
+};
|
|
|
use flowy_error::{FlowyError, FlowyResult};
|
|
|
use flowy_grid_data_model::revision::{
|
|
|
gen_grid_filter_id, FieldRevision, FieldTypeRevision, FilterConfigurationRevision, GroupConfigurationRevision,
|
|
@@ -16,9 +20,7 @@ use flowy_revision::{RevisionCloudService, RevisionManager, RevisionObjectBuilde
|
|
|
use flowy_sync::client_grid::{GridViewRevisionChangeset, GridViewRevisionPad};
|
|
|
use flowy_sync::entities::revision::Revision;
|
|
|
use lib_infra::future::{wrap_future, AFFuture, FutureResult};
|
|
|
-use std::collections::HashMap;
|
|
|
-
|
|
|
-use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
+use std::future::Future;
|
|
|
use std::sync::Arc;
|
|
|
use tokio::sync::RwLock;
|
|
|
|
|
@@ -30,11 +32,9 @@ pub struct GridViewRevisionEditor {
|
|
|
rev_manager: Arc<RevisionManager>,
|
|
|
field_delegate: Arc<dyn GridViewFieldDelegate>,
|
|
|
row_delegate: Arc<dyn GridViewRowDelegate>,
|
|
|
- group_service: Arc<RwLock<GroupService>>,
|
|
|
+ group_controller: Arc<RwLock<Box<dyn GroupController>>>,
|
|
|
scheduler: Arc<dyn GridServiceTaskScheduler>,
|
|
|
- did_load_group: AtomicBool,
|
|
|
}
|
|
|
-
|
|
|
impl GridViewRevisionEditor {
|
|
|
#[tracing::instrument(level = "trace", skip_all, err)]
|
|
|
pub(crate) async fn new(
|
|
@@ -52,16 +52,16 @@ impl GridViewRevisionEditor {
|
|
|
let view_revision_pad = rev_manager.load::<GridViewRevisionPadBuilder>(Some(cloud)).await?;
|
|
|
let pad = Arc::new(RwLock::new(view_revision_pad));
|
|
|
let rev_manager = Arc::new(rev_manager);
|
|
|
-
|
|
|
- let configuration_reader = GroupConfigurationReaderImpl(pad.clone());
|
|
|
- let configuration_writer = GroupConfigurationWriterImpl {
|
|
|
- user_id: user_id.to_owned(),
|
|
|
- rev_manager: rev_manager.clone(),
|
|
|
- view_pad: pad.clone(),
|
|
|
- };
|
|
|
- let group_service = GroupService::new(view_id.clone(), configuration_reader, configuration_writer).await;
|
|
|
+ let group_controller = new_group_controller(
|
|
|
+ user_id.to_owned(),
|
|
|
+ view_id.clone(),
|
|
|
+ pad.clone(),
|
|
|
+ rev_manager.clone(),
|
|
|
+ field_delegate.clone(),
|
|
|
+ row_delegate.clone(),
|
|
|
+ )
|
|
|
+ .await?;
|
|
|
let user_id = user_id.to_owned();
|
|
|
- let did_load_group = AtomicBool::new(false);
|
|
|
Ok(Self {
|
|
|
pad,
|
|
|
user_id,
|
|
@@ -70,24 +70,21 @@ impl GridViewRevisionEditor {
|
|
|
scheduler,
|
|
|
field_delegate,
|
|
|
row_delegate,
|
|
|
- group_service: Arc::new(RwLock::new(group_service)),
|
|
|
- did_load_group,
|
|
|
+ group_controller: Arc::new(RwLock::new(group_controller)),
|
|
|
})
|
|
|
}
|
|
|
|
|
|
pub(crate) async fn will_create_row(&self, row_rev: &mut RowRevision, params: &CreateRowParams) {
|
|
|
- match params.group_id.as_ref() {
|
|
|
- None => {}
|
|
|
- Some(group_id) => {
|
|
|
- self.group_service
|
|
|
- .write()
|
|
|
- .await
|
|
|
- .will_create_row(row_rev, group_id, |field_id| {
|
|
|
- self.field_delegate.get_field_rev(&field_id)
|
|
|
- })
|
|
|
- .await;
|
|
|
- }
|
|
|
+ if params.group_id.is_none() {
|
|
|
+ return;
|
|
|
}
|
|
|
+ let group_id = params.group_id.as_ref().unwrap();
|
|
|
+ let _ = self
|
|
|
+ .mut_group_controller(|group_controller, field_rev| {
|
|
|
+ group_controller.will_create_row(row_rev, &field_rev, group_id);
|
|
|
+ Ok(())
|
|
|
+ })
|
|
|
+ .await;
|
|
|
}
|
|
|
|
|
|
pub(crate) async fn did_create_row(&self, row_pb: &RowPB, params: &CreateRowParams) {
|
|
@@ -112,13 +109,11 @@ impl GridViewRevisionEditor {
|
|
|
|
|
|
pub(crate) async fn did_delete_row(&self, row_rev: &RowRevision) {
|
|
|
// Send the group notification if the current view has groups;
|
|
|
- if let Some(changesets) = self
|
|
|
- .group_service
|
|
|
- .write()
|
|
|
- .await
|
|
|
- .did_delete_row(row_rev, |field_id| self.field_delegate.get_field_rev(&field_id))
|
|
|
- .await
|
|
|
- {
|
|
|
+ let changesets = self
|
|
|
+ .mut_group_controller(|group_controller, field_rev| group_controller.did_delete_row(row_rev, &field_rev))
|
|
|
+ .await;
|
|
|
+
|
|
|
+ if let Some(changesets) = changesets {
|
|
|
for changeset in changesets {
|
|
|
self.notify_did_update_group(changeset).await;
|
|
|
}
|
|
@@ -126,13 +121,11 @@ impl GridViewRevisionEditor {
|
|
|
}
|
|
|
|
|
|
pub(crate) async fn did_update_row(&self, row_rev: &RowRevision) {
|
|
|
- if let Some(changesets) = self
|
|
|
- .group_service
|
|
|
- .write()
|
|
|
- .await
|
|
|
- .did_update_row(row_rev, |field_id| self.field_delegate.get_field_rev(&field_id))
|
|
|
- .await
|
|
|
- {
|
|
|
+ let changesets = self
|
|
|
+ .mut_group_controller(|group_controller, field_rev| group_controller.did_update_row(row_rev, &field_rev))
|
|
|
+ .await;
|
|
|
+
|
|
|
+ if let Some(changesets) = changesets {
|
|
|
for changeset in changesets {
|
|
|
self.notify_did_update_group(changeset).await;
|
|
|
}
|
|
@@ -146,54 +139,38 @@ impl GridViewRevisionEditor {
|
|
|
to_group_id: &str,
|
|
|
to_row_id: Option<String>,
|
|
|
) -> Vec<GroupChangesetPB> {
|
|
|
- match self
|
|
|
- .group_service
|
|
|
- .write()
|
|
|
- .await
|
|
|
- .move_group_row(row_rev, row_changeset, to_group_id, to_row_id, |field_id| {
|
|
|
- self.field_delegate.get_field_rev(&field_id)
|
|
|
+ let changesets = self
|
|
|
+ .mut_group_controller(|group_controller, field_rev| {
|
|
|
+ let move_row_context = MoveGroupRowContext {
|
|
|
+ row_rev,
|
|
|
+ row_changeset,
|
|
|
+ field_rev: field_rev.as_ref(),
|
|
|
+ to_group_id,
|
|
|
+ to_row_id,
|
|
|
+ };
|
|
|
+
|
|
|
+ let changesets = group_controller.move_group_row(move_row_context)?;
|
|
|
+ Ok(changesets)
|
|
|
})
|
|
|
- .await
|
|
|
- {
|
|
|
- None => vec![],
|
|
|
- Some(changesets) => changesets,
|
|
|
- }
|
|
|
+ .await;
|
|
|
+
|
|
|
+ changesets.unwrap_or_default()
|
|
|
}
|
|
|
/// Only call once after grid view editor initialized
|
|
|
#[tracing::instrument(level = "trace", skip(self))]
|
|
|
pub(crate) async fn load_groups(&self) -> FlowyResult<Vec<GroupPB>> {
|
|
|
- let groups = if !self.did_load_group.load(Ordering::SeqCst) {
|
|
|
- self.did_load_group.store(true, Ordering::SeqCst);
|
|
|
- let field_revs = self.field_delegate.get_field_revs().await;
|
|
|
- let row_revs = self.row_delegate.gv_row_revs().await;
|
|
|
-
|
|
|
- match self
|
|
|
- .group_service
|
|
|
- .write()
|
|
|
- .await
|
|
|
- .load_groups(&field_revs, row_revs)
|
|
|
- .await
|
|
|
- {
|
|
|
- None => vec![],
|
|
|
- Some(groups) => groups,
|
|
|
- }
|
|
|
- } else {
|
|
|
- self.group_service.read().await.groups().await
|
|
|
- };
|
|
|
-
|
|
|
+ let groups = self.group_controller.read().await.groups();
|
|
|
tracing::trace!("Number of groups: {}", groups.len());
|
|
|
Ok(groups.into_iter().map(GroupPB::from).collect())
|
|
|
}
|
|
|
|
|
|
pub(crate) async fn move_group(&self, params: MoveGroupParams) -> FlowyResult<()> {
|
|
|
let _ = self
|
|
|
- .group_service
|
|
|
+ .group_controller
|
|
|
.write()
|
|
|
.await
|
|
|
- .move_group(¶ms.from_group_id, ¶ms.to_group_id)
|
|
|
- .await?;
|
|
|
-
|
|
|
- match self.group_service.read().await.get_group(¶ms.from_group_id).await {
|
|
|
+ .move_group(¶ms.from_group_id, ¶ms.to_group_id)?;
|
|
|
+ match self.group_controller.read().await.get_group(¶ms.from_group_id) {
|
|
|
None => {}
|
|
|
Some((index, group)) => {
|
|
|
let inserted_group = InsertedGroupPB {
|
|
@@ -206,6 +183,7 @@ impl GridViewRevisionEditor {
|
|
|
inserted_groups: vec![inserted_group],
|
|
|
deleted_groups: vec![params.from_group_id.clone()],
|
|
|
update_groups: vec![],
|
|
|
+ new_groups: vec![],
|
|
|
};
|
|
|
|
|
|
self.notify_did_update_view(changeset).await;
|
|
@@ -220,27 +198,52 @@ impl GridViewRevisionEditor {
|
|
|
grid_setting
|
|
|
}
|
|
|
|
|
|
- pub(crate) async fn get_filters(&self) -> Vec<GridFilterConfiguration> {
|
|
|
+ pub(crate) async fn get_filters(&self) -> Vec<GridFilterConfigurationPB> {
|
|
|
let field_revs = self.field_delegate.get_field_revs().await;
|
|
|
match self.pad.read().await.get_all_filters(&field_revs) {
|
|
|
None => vec![],
|
|
|
Some(filters) => filters
|
|
|
.into_values()
|
|
|
.flatten()
|
|
|
- .map(|filter| GridFilterConfiguration::from(filter.as_ref()))
|
|
|
+ .map(|filter| GridFilterConfigurationPB::from(filter.as_ref()))
|
|
|
.collect(),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- pub(crate) async fn insert_filter(&self, insert_filter: CreateFilterParams) -> FlowyResult<()> {
|
|
|
+ pub(crate) async fn insert_group(&self, params: InsertGroupParams) -> FlowyResult<()> {
|
|
|
+ if let Some(field_rev) = self.field_delegate.get_field_rev(¶ms.field_id).await {
|
|
|
+ let _ = self
|
|
|
+ .modify(|pad| {
|
|
|
+ let configuration = default_group_configuration(&field_rev);
|
|
|
+ let changeset = pad.insert_group(¶ms.field_id, ¶ms.field_type_rev, configuration)?;
|
|
|
+ Ok(changeset)
|
|
|
+ })
|
|
|
+ .await?;
|
|
|
+ }
|
|
|
+ if self.group_controller.read().await.field_id() != params.field_id {
|
|
|
+ let _ = self.group_by_field(¶ms.field_id).await?;
|
|
|
+ self.notify_did_update_setting().await;
|
|
|
+ }
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+
|
|
|
+ pub(crate) async fn delete_group(&self, params: DeleteGroupParams) -> FlowyResult<()> {
|
|
|
+ self.modify(|pad| {
|
|
|
+ let changeset = pad.delete_filter(¶ms.field_id, ¶ms.field_type_rev, ¶ms.group_id)?;
|
|
|
+ Ok(changeset)
|
|
|
+ })
|
|
|
+ .await
|
|
|
+ }
|
|
|
+
|
|
|
+ pub(crate) async fn insert_filter(&self, params: InsertFilterParams) -> FlowyResult<()> {
|
|
|
self.modify(|pad| {
|
|
|
let filter_rev = FilterConfigurationRevision {
|
|
|
id: gen_grid_filter_id(),
|
|
|
- field_id: insert_filter.field_id.clone(),
|
|
|
- condition: insert_filter.condition,
|
|
|
- content: insert_filter.content,
|
|
|
+ field_id: params.field_id.clone(),
|
|
|
+ condition: params.condition,
|
|
|
+ content: params.content,
|
|
|
};
|
|
|
- let changeset = pad.insert_filter(&insert_filter.field_id, &insert_filter.field_type_rev, filter_rev)?;
|
|
|
+ let changeset = pad.insert_filter(¶ms.field_id, ¶ms.field_type_rev, filter_rev)?;
|
|
|
Ok(changeset)
|
|
|
})
|
|
|
.await
|
|
@@ -260,7 +263,7 @@ impl GridViewRevisionEditor {
|
|
|
#[tracing::instrument(level = "trace", skip_all, err)]
|
|
|
pub(crate) async fn did_update_field(&self, field_id: &str) -> FlowyResult<()> {
|
|
|
if let Some(field_rev) = self.field_delegate.get_field_rev(field_id).await {
|
|
|
- match self.group_service.write().await.did_update_field(&field_rev).await? {
|
|
|
+ match self.group_controller.write().await.did_update_field(&field_rev)? {
|
|
|
None => {}
|
|
|
Some(changeset) => {
|
|
|
self.notify_did_update_view(changeset).await;
|
|
@@ -270,6 +273,44 @@ impl GridViewRevisionEditor {
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
+ pub(crate) async fn group_by_field(&self, field_id: &str) -> FlowyResult<()> {
|
|
|
+ if let Some(field_rev) = self.field_delegate.get_field_rev(field_id).await {
|
|
|
+ let new_group_controller = new_group_controller_with_field_rev(
|
|
|
+ self.user_id.clone(),
|
|
|
+ self.view_id.clone(),
|
|
|
+ self.pad.clone(),
|
|
|
+ self.rev_manager.clone(),
|
|
|
+ field_rev,
|
|
|
+ self.row_delegate.clone(),
|
|
|
+ )
|
|
|
+ .await?;
|
|
|
+
|
|
|
+ let new_groups = new_group_controller.groups().into_iter().map(GroupPB::from).collect();
|
|
|
+
|
|
|
+ *self.group_controller.write().await = new_group_controller;
|
|
|
+ let changeset = GroupViewChangesetPB {
|
|
|
+ view_id: self.view_id.clone(),
|
|
|
+ new_groups,
|
|
|
+ ..Default::default()
|
|
|
+ };
|
|
|
+
|
|
|
+ debug_assert!(!changeset.is_empty());
|
|
|
+ if !changeset.is_empty() {
|
|
|
+ send_dart_notification(&changeset.view_id, GridNotification::DidGroupByNewField)
|
|
|
+ .payload(changeset)
|
|
|
+ .send();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+
|
|
|
+ async fn notify_did_update_setting(&self) {
|
|
|
+ let setting = self.get_setting().await;
|
|
|
+ send_dart_notification(&self.view_id, GridNotification::DidUpdateGridSetting)
|
|
|
+ .payload(setting)
|
|
|
+ .send();
|
|
|
+ }
|
|
|
+
|
|
|
pub async fn notify_did_update_group(&self, changeset: GroupChangesetPB) {
|
|
|
send_dart_notification(&changeset.group_id, GridNotification::DidUpdateGroup)
|
|
|
.payload(changeset)
|
|
@@ -295,6 +336,78 @@ impl GridViewRevisionEditor {
|
|
|
}
|
|
|
Ok(())
|
|
|
}
|
|
|
+
|
|
|
+ async fn mut_group_controller<F, T>(&self, f: F) -> Option<T>
|
|
|
+ where
|
|
|
+ F: FnOnce(&mut Box<dyn GroupController>, Arc<FieldRevision>) -> FlowyResult<T>,
|
|
|
+ {
|
|
|
+ let group_field_id = self.group_controller.read().await.field_id().to_owned();
|
|
|
+ match self.field_delegate.get_field_rev(&group_field_id).await {
|
|
|
+ None => None,
|
|
|
+ Some(field_rev) => {
|
|
|
+ let mut write_guard = self.group_controller.write().await;
|
|
|
+ f(&mut write_guard, field_rev).ok()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #[allow(dead_code)]
|
|
|
+ async fn async_mut_group_controller<F, O, T>(&self, f: F) -> Option<T>
|
|
|
+ where
|
|
|
+ F: FnOnce(Arc<RwLock<Box<dyn GroupController>>>, Arc<FieldRevision>) -> O,
|
|
|
+ O: Future<Output = FlowyResult<T>> + Sync + 'static,
|
|
|
+ {
|
|
|
+ let group_field_id = self.group_controller.read().await.field_id().to_owned();
|
|
|
+ match self.field_delegate.get_field_rev(&group_field_id).await {
|
|
|
+ None => None,
|
|
|
+ Some(field_rev) => {
|
|
|
+ let _write_guard = self.group_controller.write().await;
|
|
|
+ f(self.group_controller.clone(), field_rev).await.ok()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+async fn new_group_controller(
|
|
|
+ user_id: String,
|
|
|
+ view_id: String,
|
|
|
+ pad: Arc<RwLock<GridViewRevisionPad>>,
|
|
|
+ rev_manager: Arc<RevisionManager>,
|
|
|
+ field_delegate: Arc<dyn GridViewFieldDelegate>,
|
|
|
+ row_delegate: Arc<dyn GridViewRowDelegate>,
|
|
|
+) -> FlowyResult<Box<dyn GroupController>> {
|
|
|
+ let configuration_reader = GroupConfigurationReaderImpl(pad.clone());
|
|
|
+ let field_revs = field_delegate.get_field_revs().await;
|
|
|
+ // Read the group field or find a new group field
|
|
|
+ let field_rev = configuration_reader
|
|
|
+ .get_configuration()
|
|
|
+ .await
|
|
|
+ .and_then(|configuration| {
|
|
|
+ field_revs
|
|
|
+ .iter()
|
|
|
+ .find(|field_rev| field_rev.id == configuration.field_id)
|
|
|
+ .cloned()
|
|
|
+ })
|
|
|
+ .unwrap_or_else(|| find_group_field(&field_revs).unwrap());
|
|
|
+
|
|
|
+ new_group_controller_with_field_rev(user_id, view_id, pad, rev_manager, field_rev, row_delegate).await
|
|
|
+}
|
|
|
+
|
|
|
+async fn new_group_controller_with_field_rev(
|
|
|
+ user_id: String,
|
|
|
+ view_id: String,
|
|
|
+ pad: Arc<RwLock<GridViewRevisionPad>>,
|
|
|
+ rev_manager: Arc<RevisionManager>,
|
|
|
+ field_rev: Arc<FieldRevision>,
|
|
|
+ row_delegate: Arc<dyn GridViewRowDelegate>,
|
|
|
+) -> FlowyResult<Box<dyn GroupController>> {
|
|
|
+ let configuration_reader = GroupConfigurationReaderImpl(pad.clone());
|
|
|
+ let configuration_writer = GroupConfigurationWriterImpl {
|
|
|
+ user_id,
|
|
|
+ rev_manager,
|
|
|
+ view_pad: pad,
|
|
|
+ };
|
|
|
+ let row_revs = row_delegate.gv_row_revs().await;
|
|
|
+ make_group_controller(view_id, field_rev, row_revs, configuration_reader, configuration_writer).await
|
|
|
}
|
|
|
|
|
|
async fn apply_change(
|
|
@@ -335,13 +448,10 @@ impl RevisionObjectBuilder for GridViewRevisionPadBuilder {
|
|
|
struct GroupConfigurationReaderImpl(Arc<RwLock<GridViewRevisionPad>>);
|
|
|
|
|
|
impl GroupConfigurationReader for GroupConfigurationReaderImpl {
|
|
|
- fn get_group_configuration(
|
|
|
- &self,
|
|
|
- field_rev: Arc<FieldRevision>,
|
|
|
- ) -> AFFuture<Option<Arc<GroupConfigurationRevision>>> {
|
|
|
+ fn get_configuration(&self) -> AFFuture<Option<Arc<GroupConfigurationRevision>>> {
|
|
|
let view_pad = self.0.clone();
|
|
|
wrap_future(async move {
|
|
|
- let mut groups = view_pad.read().await.groups.get_objects(&field_rev.id, &field_rev.ty)?;
|
|
|
+ let mut groups = view_pad.read().await.get_all_groups();
|
|
|
if groups.is_empty() {
|
|
|
None
|
|
|
} else {
|
|
@@ -359,7 +469,7 @@ struct GroupConfigurationWriterImpl {
|
|
|
}
|
|
|
|
|
|
impl GroupConfigurationWriter for GroupConfigurationWriterImpl {
|
|
|
- fn save_group_configuration(
|
|
|
+ fn save_configuration(
|
|
|
&self,
|
|
|
field_id: &str,
|
|
|
field_type: FieldTypeRevision,
|
|
@@ -385,31 +495,40 @@ impl GroupConfigurationWriter for GroupConfigurationWriterImpl {
|
|
|
}
|
|
|
|
|
|
pub fn make_grid_setting(view_pad: &GridViewRevisionPad, field_revs: &[Arc<FieldRevision>]) -> GridSettingPB {
|
|
|
- let current_layout_type: GridLayout = view_pad.layout.clone().into();
|
|
|
- let filters_by_field_id = view_pad
|
|
|
+ let layout_type: GridLayout = view_pad.layout.clone().into();
|
|
|
+ let filter_configurations = view_pad
|
|
|
.get_all_filters(field_revs)
|
|
|
.map(|filters_by_field_id| {
|
|
|
filters_by_field_id
|
|
|
.into_iter()
|
|
|
- .map(|(k, v)| (k, v.into()))
|
|
|
- .collect::<HashMap<String, RepeatedGridConfigurationFilterPB>>()
|
|
|
+ .map(|(_, v)| {
|
|
|
+ let repeated_filter: RepeatedGridFilterConfigurationPB = v.into();
|
|
|
+ repeated_filter.items
|
|
|
+ })
|
|
|
+ .flatten()
|
|
|
+ .collect::<Vec<GridFilterConfigurationPB>>()
|
|
|
})
|
|
|
.unwrap_or_default();
|
|
|
- let groups_by_field_id = view_pad
|
|
|
- .get_all_groups(field_revs)
|
|
|
+
|
|
|
+ let group_configurations = view_pad
|
|
|
+ .get_groups_by_field_revs(field_revs)
|
|
|
.map(|groups_by_field_id| {
|
|
|
groups_by_field_id
|
|
|
.into_iter()
|
|
|
- .map(|(k, v)| (k, v.into()))
|
|
|
- .collect::<HashMap<String, RepeatedGridGroupConfigurationPB>>()
|
|
|
+ .map(|(_, v)| {
|
|
|
+ let repeated_group: RepeatedGridGroupConfigurationPB = v.into();
|
|
|
+ repeated_group.items
|
|
|
+ })
|
|
|
+ .flatten()
|
|
|
+ .collect::<Vec<GridGroupConfigurationPB>>()
|
|
|
})
|
|
|
.unwrap_or_default();
|
|
|
|
|
|
GridSettingPB {
|
|
|
layouts: GridLayoutPB::all(),
|
|
|
- current_layout_type,
|
|
|
- filter_configuration_by_field_id: filters_by_field_id,
|
|
|
- group_configuration_by_field_id: groups_by_field_id,
|
|
|
+ layout_type,
|
|
|
+ filter_configurations: filter_configurations.into(),
|
|
|
+ group_configurations: group_configurations.into(),
|
|
|
}
|
|
|
}
|
|
|
|