From 6ea7e8f462ea615acb6f6020d4aaa9b591b1e6be Mon Sep 17 00:00:00 2001 From: Maitra Khatri Date: Tue, 10 Mar 2026 16:29:52 +0530 Subject: [PATCH] fix: copy paste --- packages/core/package.json | 2 +- packages/core/src/modules/cell.ts | 2 +- packages/core/src/modules/selection.ts | 10 +++-- packages/core/src/paste-table-helpers.ts | 48 +++++++++++++++++++++--- packages/react/package.json | 4 +- 5 files changed, 54 insertions(+), 12 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 285934a2..10479750 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@fileverse-dev/fortune-core", - "version": "1.3.10", + "version": "1.3.10-copyPaste-3", "main": "lib/index.js", "module": "es/index.js", "typings": "lib/index.d.ts", diff --git a/packages/core/src/modules/cell.ts b/packages/core/src/modules/cell.ts index d74b2168..d425f044 100644 --- a/packages/core/src/modules/cell.ts +++ b/packages/core/src/modules/cell.ts @@ -1582,7 +1582,7 @@ export function getFontStyleByCell( // style += "font-family: " + f + ";"; // } - if (key === "fs" && valueNum !== 10) { + if (key === "fs" && !_.isNil(value)) { style.fontSize = `${valueNum}pt`; } diff --git a/packages/core/src/modules/selection.ts b/packages/core/src/modules/selection.ts index 0d1572fc..a481e3a2 100644 --- a/packages/core/src/modules/selection.ts +++ b/packages/core/src/modules/selection.ts @@ -1596,7 +1596,8 @@ export function rangeValueToHtml( const c = colIndexArr[j]; // eslint-disable-next-line no-template-curly-in-string - let column = ''; + let column = + ''; const cell = d[r]?.[c]; if (cell != null) { @@ -1883,7 +1884,10 @@ export function rangeValueToHtml( } } - column = replaceHtml(column, { style, span }); + const cellData = encodeURIComponent( + JSON.stringify({ ...cell, _srcRow: r, _srcCol: c }) + ); + column = replaceHtml(column, { style, span, cellData }); if (_.isNil(c_value)) { c_value = getCellValue(r, c, d); @@ -1974,7 +1978,7 @@ export function rangeValueToHtml( } } - column = replaceHtml(column, { style, span: "" }); + column = replaceHtml(column, { style, span: "", cellData: "" }); column += ""; } diff --git a/packages/core/src/paste-table-helpers.ts b/packages/core/src/paste-table-helpers.ts index 65b48916..ad7c5ea5 100644 --- a/packages/core/src/paste-table-helpers.ts +++ b/packages/core/src/paste-table-helpers.ts @@ -6,6 +6,7 @@ import { getQKBorder, saveHyperlink } from "./modules"; import { Cell } from "./types"; import { getSheetIndex } from "./utils"; import { setRowHeight, setColumnWidth } from "./api"; +import { adjustFormulaForPaste } from "./events/paste"; export const DEFAULT_FONT_SIZE = 12; @@ -150,6 +151,8 @@ interface BuiltCellResult { rowspan: number; colspan: number; hyperlink?: { href: string; display: string } | null; + srcRow?: number; + srcCol?: number; } const HEX_REGEX = /^0x?[a-fA-F0-9]+$/; @@ -177,6 +180,30 @@ const buildCellFromTd = ( classStyles: Record, ctx: Context ): BuiltCellResult => { + const fortuneCellAttr = td.getAttribute("data-fortune-cell"); + if (fortuneCellAttr) { + try { + const { _srcRow, _srcCol, ...parsed } = JSON.parse( + decodeURIComponent(fortuneCellAttr) + ); + const cell = parsed as Cell; + delete cell.mc; + delete cell.hl; + const rowspan = parseInt(td.getAttribute("rowspan") || "1", 10); + const colspan = parseInt(td.getAttribute("colspan") || "1", 10); + return { + cell, + rowspan: Number.isNaN(rowspan) ? 1 : rowspan, + colspan: Number.isNaN(colspan) ? 1 : colspan, + hyperlink: detectHyperlink(td), + srcRow: _srcRow, + srcCol: _srcCol, + }; + } catch { + // fall through to CSS parsing if JSON is malformed + } + } + let cell: Cell = {}; const rawText = (td.innerText || td.innerHTML || "").trim(); const isLineBreak = rawText.includes("
"); @@ -391,16 +418,27 @@ export function handlePastedTable( } if (localColIndex === totalColumns) return; // row overflow - const { cell, rowspan, colspan, hyperlink } = buildCellFromTd( - tdElement, - classStyleMap, - ctx - ); + const { cell, rowspan, colspan, hyperlink, srcRow, srcCol } = + buildCellFromTd(tdElement, classStyleMap, ctx); const anchorCol = ctx.luckysheet_select_save![0].column[0]; const absoluteRow = anchorRow + localRowIndex; const absoluteCol = anchorCol + localColIndex; + if (cell.f && srcRow != null && srcCol != null) { + try { + cell.f = adjustFormulaForPaste( + cell.f, + srcCol, + srcRow, + absoluteCol, + absoluteRow + ); + } catch { + // invalid ref — leave formula as-is + } + } + // Place cell into matrix pastedMatrix[localRowIndex][localColIndex] = cell; diff --git a/packages/react/package.json b/packages/react/package.json index 76d9cf0a..3fa94562 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@fileverse-dev/fortune-react", - "version": "1.3.10", + "version": "1.3.10-copyPaste-3", "main": "lib/index.js", "types": "lib/index.d.ts", "module": "es/index.js", @@ -16,7 +16,7 @@ "tsc": "tsc" }, "dependencies": { - "@fileverse-dev/fortune-core": "1.3.10", + "@fileverse-dev/fortune-core": "1.3.10-copyPaste-3", "@fileverse/ui": "5.0.0", "@tippyjs/react": "^4.2.6", "@types/regenerator-runtime": "^0.13.6",