Skip to content

Commit 4850a97

Browse files
authored
Merge pull request #541 from AppFlowy-IO/fix/grid_duplicate
fix: duplicate grid
2 parents 20b4e5d + 8fd9b68 commit 4850a97

File tree

15 files changed

+151
-61
lines changed

15 files changed

+151
-61
lines changed

frontend/app_flowy/lib/workspace/presentation/home/menu/app/header/add_button.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ class ActionList {
4646
return CreateItem(
4747
pluginBuilder: pluginBuilder,
4848
onSelected: (builder) {
49-
FlowyOverlay.of(buildContext).remove(_identifier);
5049
onSelected(builder);
50+
FlowyOverlay.of(buildContext).remove(_identifier);
5151
},
5252
);
5353
},

frontend/rust-lib/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/rust-lib/flowy-folder/src/manager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,11 @@ pub trait ViewDataProcessor {
241241

242242
fn close_container(&self, view_id: &str) -> FutureResult<(), FlowyError>;
243243

244-
fn delta_bytes(&self, view_id: &str) -> FutureResult<Bytes, FlowyError>;
244+
fn view_delta_data(&self, view_id: &str) -> FutureResult<Bytes, FlowyError>;
245245

246246
fn create_default_view(&self, user_id: &str, view_id: &str) -> FutureResult<Bytes, FlowyError>;
247247

248-
fn process_create_view_data(&self, user_id: &str, view_id: &str, data: Vec<u8>) -> FutureResult<Bytes, FlowyError>;
248+
fn process_view_delta_data(&self, user_id: &str, view_id: &str, data: Vec<u8>) -> FutureResult<Bytes, FlowyError>;
249249

250250
fn data_type(&self) -> ViewDataType;
251251
}

frontend/rust-lib/flowy-folder/src/services/view/controller.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl ViewController {
6060
params.data = view_data.to_vec();
6161
} else {
6262
let delta_data = processor
63-
.process_create_view_data(&user_id, &params.view_id, params.data.clone())
63+
.process_view_delta_data(&user_id, &params.view_id, params.data.clone())
6464
.await?;
6565
let _ = self
6666
.create_view(&params.view_id, params.data_type.clone(), delta_data)
@@ -176,7 +176,7 @@ impl ViewController {
176176
.await?;
177177

178178
let processor = self.get_data_processor(&view.data_type)?;
179-
let delta_bytes = processor.delta_bytes(view_id).await?;
179+
let delta_bytes = processor.view_delta_data(view_id).await?;
180180
let duplicate_params = CreateViewParams {
181181
belong_to_id: view.belong_to_id.clone(),
182182
name: format!("{} (copy)", &view.name),
@@ -238,7 +238,7 @@ impl ViewController {
238238
}
239239

240240
impl ViewController {
241-
#[tracing::instrument(level = "debug", skip(self), err)]
241+
#[tracing::instrument(level = "debug", skip(self, params), err)]
242242
async fn create_view_on_server(&self, params: CreateViewParams) -> Result<View, FlowyError> {
243243
let token = self.user.token()?;
244244
let view = self.cloud_service.create_view(&token, params).await?;

frontend/rust-lib/flowy-grid/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ serde_repr = "0.1"
3737
indexmap = {version = "1.8.1", features = ["serde"]}
3838
fancy-regex = "0.10.0"
3939
url = { version = "2"}
40+
futures = "0.3.15"
4041

4142
[dev-dependencies]
4243
flowy-test = { path = "../flowy-test" }

frontend/rust-lib/flowy-grid/src/manager.rs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,10 @@ pub async fn make_grid_view_data(
154154
grid_manager: Arc<GridManager>,
155155
build_context: BuildGridContext,
156156
) -> FlowyResult<Bytes> {
157-
let block_id = build_context.block_meta.block_id.clone();
158157
let grid_meta = GridMeta {
159158
grid_id: view_id.to_string(),
160159
fields: build_context.field_metas,
161-
blocks: vec![build_context.block_meta],
160+
blocks: build_context.blocks,
162161
};
163162

164163
// Create grid
@@ -168,19 +167,23 @@ pub async fn make_grid_view_data(
168167
Revision::initial_revision(user_id, view_id, grid_delta_data.clone()).into();
169168
let _ = grid_manager.create_grid(view_id, repeated_revision).await?;
170169

171-
// Indexing the block's rows
172-
build_context.block_meta_data.rows.iter().for_each(|row| {
173-
let _ = grid_manager.block_index_cache.insert(&row.block_id, &row.id);
174-
});
175-
176-
// Create grid's block
177-
let grid_block_meta_delta = make_block_meta_delta(&build_context.block_meta_data);
178-
let block_meta_delta_data = grid_block_meta_delta.to_delta_bytes();
179-
let repeated_revision: RepeatedRevision =
180-
Revision::initial_revision(user_id, &block_id, block_meta_delta_data).into();
181-
let _ = grid_manager
182-
.create_grid_block_meta(&block_id, repeated_revision)
183-
.await?;
170+
for block_meta_data in build_context.blocks_meta_data {
171+
let block_id = block_meta_data.block_id.clone();
172+
173+
// Indexing the block's rows
174+
block_meta_data.rows.iter().for_each(|row| {
175+
let _ = grid_manager.block_index_cache.insert(&row.block_id, &row.id);
176+
});
177+
178+
// Create grid's block
179+
let grid_block_meta_delta = make_block_meta_delta(&block_meta_data);
180+
let block_meta_delta_data = grid_block_meta_delta.to_delta_bytes();
181+
let repeated_revision: RepeatedRevision =
182+
Revision::initial_revision(user_id, &block_id, block_meta_delta_data).into();
183+
let _ = grid_manager
184+
.create_grid_block_meta(&block_id, repeated_revision)
185+
.await?;
186+
}
184187

185188
Ok(grid_delta_data)
186189
}

frontend/rust-lib/flowy-grid/src/services/block_meta_editor.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use bytes::Bytes;
22
use flowy_error::{FlowyError, FlowyResult};
3-
use flowy_grid_data_model::entities::{CellMeta, RowMeta, RowMetaChangeset, RowOrder};
3+
use flowy_grid_data_model::entities::{CellMeta, GridBlockMetaData, RowMeta, RowMetaChangeset, RowOrder};
44
use flowy_revision::{RevisionCloudService, RevisionCompactor, RevisionManager, RevisionObjectBuilder};
55
use flowy_sync::client_grid::{GridBlockMetaChange, GridBlockMetaPad};
66
use flowy_sync::entities::revision::Revision;
@@ -41,6 +41,10 @@ impl GridBlockMetaEditor {
4141
})
4242
}
4343

44+
pub async fn duplicate_block_meta_data(&self, duplicated_block_id: &str) -> GridBlockMetaData {
45+
self.pad.read().await.duplicate_data(duplicated_block_id).await
46+
}
47+
4448
/// return current number of rows and the inserted index. The inserted index will be None if the start_row_id is None
4549
pub(crate) async fn create_row(
4650
&self,

frontend/rust-lib/flowy-grid/src/services/block_meta_manager.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl GridBlockManager {
4747
debug_assert!(!block_id.is_empty());
4848
match self.block_editor_map.get(block_id) {
4949
None => {
50-
tracing::error!("The is a fatal error, block is not exist");
50+
tracing::error!("This is a fatal error, block with id:{} is not exist", block_id);
5151
let editor = Arc::new(make_block_meta_editor(&self.user, block_id).await?);
5252
self.block_editor_map.insert(block_id.to_owned(), editor.clone());
5353
Ok(editor)
@@ -267,6 +267,7 @@ async fn make_block_meta_editor_map(
267267
}
268268

269269
async fn make_block_meta_editor(user: &Arc<dyn GridUser>, block_id: &str) -> FlowyResult<GridBlockMetaEditor> {
270+
tracing::trace!("Open block:{} meta editor", block_id);
270271
let token = user.token()?;
271272
let user_id = user.user_id()?;
272273
let pool = user.db_pool()?;

frontend/rust-lib/flowy-grid/src/services/field/type_options/number_type_option/number_type_option.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ impl NumberTypeOption {
7777
}
7878

7979
fn cell_content_from_number_str(&self, s: &str) -> FlowyResult<String> {
80-
return match self.format {
80+
match self.format {
8181
NumberFormat::Number => {
8282
if let Ok(v) = s.parse::<f64>() {
8383
return Ok(v.to_string());
@@ -94,7 +94,7 @@ impl NumberTypeOption {
9494
Ok(content)
9595
}
9696
_ => self.money_from_number_str(s),
97-
};
97+
}
9898
}
9999

100100
pub fn set_format(&mut self, format: NumberFormat) {
@@ -173,7 +173,9 @@ impl CellDataOperation<String> for NumberTypeOption {
173173
Ok(DecodedCellData::new(content))
174174
}
175175
_ => {
176-
let content = self.money_from_number_str(&cell_data).unwrap_or("".to_string());
176+
let content = self
177+
.money_from_number_str(&cell_data)
178+
.unwrap_or_else(|_| "".to_string());
177179
Ok(DecodedCellData::new(content))
178180
}
179181
}

frontend/rust-lib/flowy-grid/src/services/grid_editor.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,35 @@ impl GridMetaEditor {
487487
self.grid_pad.read().await.delta_bytes()
488488
}
489489

490+
pub async fn duplicate_grid(&self) -> FlowyResult<BuildGridContext> {
491+
let grid_pad = self.grid_pad.read().await;
492+
let original_blocks = grid_pad.get_block_metas();
493+
let (duplicated_fields, duplicated_blocks) = grid_pad.duplicate_grid_meta().await;
494+
495+
let mut blocks_meta_data = vec![];
496+
if original_blocks.len() == duplicated_blocks.len() {
497+
for (index, original_block_meta) in original_blocks.iter().enumerate() {
498+
let grid_block_meta_editor = self.block_manager.get_editor(&original_block_meta.block_id).await?;
499+
let duplicated_block_id = &duplicated_blocks[index].block_id;
500+
501+
tracing::trace!("Duplicate block:{} meta data", duplicated_block_id);
502+
let duplicated_block_meta_data = grid_block_meta_editor
503+
.duplicate_block_meta_data(duplicated_block_id)
504+
.await;
505+
blocks_meta_data.push(duplicated_block_meta_data);
506+
}
507+
} else {
508+
debug_assert_eq!(original_blocks.len(), duplicated_blocks.len());
509+
}
510+
drop(grid_pad);
511+
512+
Ok(BuildGridContext {
513+
field_metas: duplicated_fields,
514+
blocks: duplicated_blocks,
515+
blocks_meta_data,
516+
})
517+
}
518+
490519
async fn modify<F>(&self, f: F) -> FlowyResult<()>
491520
where
492521
F: for<'a> FnOnce(&'a mut GridMetaPad) -> FlowyResult<Option<GridChangeset>>,

0 commit comments

Comments
 (0)