diff --git a/base/src/test/user_model/test_paste_csv.rs b/base/src/test/user_model/test_paste_csv.rs index a20262a..0bef6cf 100644 --- a/base/src/test/user_model/test_paste_csv.rs +++ b/base/src/test/user_model/test_paste_csv.rs @@ -99,7 +99,7 @@ fn cut_paste() { // paste in cell D4 (4, 4) model - .paste_from_clipboard((1, 1, 2, 2), ©.data, true) + .paste_from_clipboard(0, (1, 1, 2, 2), ©.data, true) .unwrap(); assert_eq!(model.get_cell_content(0, 4, 4), Ok("42".to_string())); @@ -119,6 +119,26 @@ fn cut_paste() { assert_eq!(model.get_cell_content(0, 2, 2), Ok("".to_string())); } +#[test] +fn cut_paste_different_sheet() { + let mut model = UserModel::new_empty("model", "en", "UTC").unwrap(); + model.set_user_input(0, 1, 1, "42").unwrap(); + + model.set_selected_range(1, 1, 1, 1).unwrap(); + let copy = model.copy_to_clipboard().unwrap(); + model.new_sheet().unwrap(); + model.set_selected_sheet(1).unwrap(); + model.set_selected_cell(4, 4).unwrap(); + + // paste in cell D4 (4, 4) of Sheet2 + model + .paste_from_clipboard(0, (1, 1, 1, 1), ©.data, true) + .unwrap(); + + assert_eq!(model.get_cell_content(1, 4, 4), Ok("42".to_string())); + assert_eq!(model.get_cell_content(0, 1, 1), Ok("".to_string())); +} + #[test] fn copy_paste_internal() { let mut model = UserModel::new_empty("model", "en", "UTC").unwrap(); @@ -152,7 +172,7 @@ fn copy_paste_internal() { // paste in cell D4 (4, 4) model - .paste_from_clipboard((1, 1, 2, 2), ©.data, false) + .paste_from_clipboard(0, (1, 1, 2, 2), ©.data, false) .unwrap(); assert_eq!(model.get_cell_content(0, 4, 4), Ok("42".to_string())); diff --git a/base/src/user_model/common.rs b/base/src/user_model/common.rs index ad48528..7306c44 100644 --- a/base/src/user_model/common.rs +++ b/base/src/user_model/common.rs @@ -39,6 +39,7 @@ pub struct ClipboardCell { pub struct Clipboard { pub(crate) csv: String, pub(crate) data: ClipboardData, + pub(crate) sheet: u32, pub(crate) range: (i32, i32, i32, i32), } @@ -1520,6 +1521,7 @@ impl UserModel { Ok(Clipboard { csv, data, + sheet, range: (row_start, column_start, row_end, column_end), }) } @@ -1527,6 +1529,7 @@ impl UserModel { /// Paste text that we copied pub fn paste_from_clipboard( &mut self, + source_sheet: u32, source_range: ClipboardTuple, clipboard: &ClipboardData, is_cut: bool, @@ -1617,17 +1620,17 @@ impl UserModel { let old_value = self .model .workbook - .worksheet(sheet)? + .worksheet(source_sheet)? .cell(row, column) .cloned(); diff_list.push(Diff::CellClearContents { - sheet, + sheet: source_sheet, row, column, old_value: Box::new(old_value), }); - self.model.cell_clear_contents(sheet, row, column)?; + self.model.cell_clear_contents(source_sheet, row, column)?; } } } diff --git a/bindings/wasm/fix_types.py b/bindings/wasm/fix_types.py index 27e9e1a..d3f663b 100644 --- a/bindings/wasm/fix_types.py +++ b/bindings/wasm/fix_types.py @@ -169,20 +169,22 @@ clipboard_types = r""" paste_from_clipboard = r""" /** +* @param {number} source_sheet * @param {any} source_range * @param {any} clipboard * @param {boolean} is_cut */ - pasteFromClipboard(source_range: any, clipboard: any, is_cut: boolean): void; + pasteFromClipboard(source_sheet: number, source_range: any, clipboard: any, is_cut: boolean): void; """ paste_from_clipboard_types = r""" /** +* @param {number} source_sheet * @param {[number, number, number, number]} source_range * @param {ClipboardData} clipboard * @param {boolean} is_cut */ - pasteFromClipboard(source_range: [number, number, number, number], clipboard: ClipboardData, is_cut: boolean): void; + pasteFromClipboard(source_sheet: number, source_range: [number, number, number, number], clipboard: ClipboardData, is_cut: boolean): void; """ def fix_types(text): diff --git a/bindings/wasm/src/lib.rs b/bindings/wasm/src/lib.rs index d333573..2d26f1b 100644 --- a/bindings/wasm/src/lib.rs +++ b/bindings/wasm/src/lib.rs @@ -520,6 +520,7 @@ impl Model { #[wasm_bindgen(js_name = "pasteFromClipboard")] pub fn paste_from_clipboard( &mut self, + source_sheet: u32, source_range: JsValue, clipboard: JsValue, is_cut: bool, @@ -529,7 +530,7 @@ impl Model { let clipboard: ClipboardData = serde_wasm_bindgen::from_value(clipboard).map_err(|e| to_js_error(e.to_string()))?; self.model - .paste_from_clipboard(source_range, &clipboard, is_cut) + .paste_from_clipboard(source_sheet, source_range, &clipboard, is_cut) .map_err(|e| to_js_error(e.to_string())) } diff --git a/webapp/src/components/workbook.tsx b/webapp/src/components/workbook.tsx index b640968..6f6b3e9 100644 --- a/webapp/src/components/workbook.tsx +++ b/webapp/src/components/workbook.tsx @@ -390,7 +390,12 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => { } data.set(Number.parseInt(row, 10), rowMap); } - model.pasteFromClipboard(source.area, data, source.type === "cut"); + model.pasteFromClipboard( + source.sheet, + source.area, + data, + source.type === "cut", + ); setRedrawId((id) => id + 1); } else if (mimeType === "text/plain") { const { @@ -416,6 +421,7 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => { }} onCopy={(event: React.ClipboardEvent) => { const data = model.copyToClipboard(); + const sheet = model.getSelectedSheet(); // '2024-10-18T14:07:37.599Z' let clipboardId = sessionStorage.getItem( @@ -443,6 +449,7 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => { type: "copy", area: data.range, sheetData, + sheet, clipboardId, }); event.clipboardData.setData("text/plain", data.csv); @@ -452,6 +459,7 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => { }} onCut={(event: React.ClipboardEvent) => { const data = model.copyToClipboard(); + const sheet = model.getSelectedSheet(); // '2024-10-18T14:07:37.599Z' let clipboardId = sessionStorage.getItem( @@ -479,6 +487,7 @@ const Workbook = (props: { model: Model; workbookState: WorkbookState }) => { type: "cut", area: data.range, sheetData, + sheet, clipboardId, }); event.clipboardData.setData("text/plain", data.csv);