@rowsncolumns/spreadsheet-state 28.0.76 → 29.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api/copy-paste.d.ts +8 -1
- package/dist/cjs/api/copy-paste.d.ts.map +1 -1
- package/dist/cjs/api/copy-paste.js +4 -2
- package/dist/cjs/api/immer-utils.d.ts +11 -1
- package/dist/cjs/api/immer-utils.d.ts.map +1 -1
- package/dist/cjs/api/immer-utils.js +17 -1
- package/dist/cjs/api/insert-cut-cells.d.ts +35 -0
- package/dist/cjs/api/insert-cut-cells.d.ts.map +1 -0
- package/dist/cjs/api/insert-cut-cells.js +60 -0
- package/dist/cjs/api/merges.d.ts +8 -0
- package/dist/cjs/api/merges.d.ts.map +1 -1
- package/dist/cjs/api/merges.js +11 -0
- package/dist/cjs/api/subtotal.d.ts +20 -13
- package/dist/cjs/api/subtotal.d.ts.map +1 -1
- package/dist/cjs/api/subtotal.js +26 -19
- package/dist/cjs/commands.d.ts +9 -0
- package/dist/cjs/commands.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-copy.d.ts +1 -1
- package/dist/cjs/hooks/use-on-copy.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-copy.js +2 -3
- package/dist/cjs/hooks/use-on-move-columns.d.ts +2 -1
- package/dist/cjs/hooks/use-on-move-columns.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-move-columns.js +14 -5
- package/dist/cjs/hooks/use-on-move-rows.d.ts +16 -1
- package/dist/cjs/hooks/use-on-move-rows.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-move-rows.js +30 -5
- package/dist/cjs/hooks/use-on-move-selection.d.ts +7 -2
- package/dist/cjs/hooks/use-on-move-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-move-selection.js +14 -1
- package/dist/cjs/hooks/use-on-paste.d.ts +12 -2
- package/dist/cjs/hooks/use-on-paste.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-paste.js +56 -8
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts +14 -3
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/cjs/hooks/use-spreadsheet-state.js +80 -3
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/interface/delete-column.d.ts.map +1 -1
- package/dist/cjs/interface/delete-column.js +20 -20
- package/dist/cjs/interface/delete-row.d.ts.map +1 -1
- package/dist/cjs/interface/delete-row.js +21 -21
- package/dist/cjs/interface/insert-column.d.ts.map +1 -1
- package/dist/cjs/interface/insert-column.js +34 -18
- package/dist/cjs/interface/insert-row.d.ts.map +1 -1
- package/dist/cjs/interface/insert-row.js +16 -5
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/api/copy-paste.d.ts +8 -1
- package/dist/esm/api/copy-paste.d.ts.map +1 -1
- package/dist/esm/api/copy-paste.js +4 -2
- package/dist/esm/api/immer-utils.d.ts +11 -1
- package/dist/esm/api/immer-utils.d.ts.map +1 -1
- package/dist/esm/api/immer-utils.js +16 -0
- package/dist/esm/api/insert-cut-cells.d.ts +35 -0
- package/dist/esm/api/insert-cut-cells.d.ts.map +1 -0
- package/dist/esm/api/insert-cut-cells.js +67 -0
- package/dist/esm/api/merges.d.ts +8 -0
- package/dist/esm/api/merges.d.ts.map +1 -1
- package/dist/esm/api/merges.js +9 -0
- package/dist/esm/api/subtotal.d.ts +20 -13
- package/dist/esm/api/subtotal.d.ts.map +1 -1
- package/dist/esm/api/subtotal.js +15 -8
- package/dist/esm/commands.d.ts +9 -0
- package/dist/esm/commands.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-copy.d.ts +1 -1
- package/dist/esm/hooks/use-on-copy.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-copy.js +2 -3
- package/dist/esm/hooks/use-on-move-columns.d.ts +2 -1
- package/dist/esm/hooks/use-on-move-columns.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-move-columns.js +14 -5
- package/dist/esm/hooks/use-on-move-rows.d.ts +16 -1
- package/dist/esm/hooks/use-on-move-rows.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-move-rows.js +30 -5
- package/dist/esm/hooks/use-on-move-selection.d.ts +7 -2
- package/dist/esm/hooks/use-on-move-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-move-selection.js +14 -1
- package/dist/esm/hooks/use-on-paste.d.ts +12 -2
- package/dist/esm/hooks/use-on-paste.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-paste.js +41 -2
- package/dist/esm/hooks/use-spreadsheet-state.d.ts +14 -3
- package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/esm/hooks/use-spreadsheet-state.js +80 -2
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/interface/delete-column.d.ts.map +1 -1
- package/dist/esm/interface/delete-column.js +17 -28
- package/dist/esm/interface/delete-row.d.ts.map +1 -1
- package/dist/esm/interface/delete-row.js +18 -29
- package/dist/esm/interface/insert-column.d.ts.map +1 -1
- package/dist/esm/interface/insert-column.js +22 -10
- package/dist/esm/interface/insert-row.d.ts.map +1 -1
- package/dist/esm/interface/insert-row.js +13 -4
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-on-move-rows.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-move-rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAUtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,kBAAkB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,cAAc,CACtB,CAAC,wBAAwB,CAAC,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACtE,0BAA0B,CAAC,EAAE,mBAAmB,CAC9C,CAAC,EACD,CAAC,CACF,CAAC,4BAA4B,CAAC,CAAC;IAChC,uBAAuB,CAAC,EAAE,mBAAmB,CAC3C,CAAC,EACD,CAAC,CACF,CAAC,yBAAyB,CAAC,CAAC;IAC7B,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,kBAAkB,CAC1B,CAAC,wBAAwB,CAAC,CAAC;IAC5B,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,+RAiBhE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"use-on-move-rows.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-move-rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAUtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,kBAAkB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,cAAc,CACtB,CAAC,wBAAwB,CAAC,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACtE,0BAA0B,CAAC,EAAE,mBAAmB,CAC9C,CAAC,EACD,CAAC,CACF,CAAC,4BAA4B,CAAC,CAAC;IAChC,uBAAuB,CAAC,EAAE,mBAAmB,CAC3C,CAAC,EACD,CAAC,CACF,CAAC,yBAAyB,CAAC,CAAC;IAC7B,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,kBAAkB,CAC1B,CAAC,wBAAwB,CAAC,CAAC;IAC5B,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GACpC,MAAM,MAAM,EAAE,EACd,gBAAgB,MAAM,EACtB,UAAU,oBAAoB,KAC7B,MAAM,GAAG,SAYX,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,+RAiBhE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,eAIZ,MAAM,QACT,MAAM,EAAE,wBACQ,MAAM,YAClB,oBAAoB,SA0VnC,CAAC"}
|
|
@@ -8,9 +8,26 @@ import { moveMergedCells } from "../api/merges";
|
|
|
8
8
|
import { updateRangedRulesOnReorder } from "../api/range-rule-helpers";
|
|
9
9
|
import { shiftTableMovingRows } from "../api/table";
|
|
10
10
|
import { useCanEditSheet } from "./use-can-edit-cellrange";
|
|
11
|
+
/**
|
|
12
|
+
* Translate an Insert-Cut-Cells reference (pre-removal numbering) into the hook's post-removal
|
|
13
|
+
* landing index. Returns `undefined` when the reference falls inside the moved block (a no-op).
|
|
14
|
+
*/
|
|
15
|
+
export const resolveMoveReferenceIndex = (dims, referenceIndex, options) => {
|
|
16
|
+
if (!options?.insertBefore) {
|
|
17
|
+
return referenceIndex;
|
|
18
|
+
}
|
|
19
|
+
const { 0: first, [dims.length - 1]: last } = dims;
|
|
20
|
+
if (referenceIndex > last) {
|
|
21
|
+
return referenceIndex - dims.length;
|
|
22
|
+
}
|
|
23
|
+
if (referenceIndex > first) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
return referenceIndex;
|
|
27
|
+
};
|
|
11
28
|
export const useOnMoveRows = ({ rowCount, columnCount, locale, createHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, getDependents, getNonEmptyColumnCount, getActiveCell, onCommand, }) => {
|
|
12
29
|
const canEditSheet = useCanEditSheet();
|
|
13
|
-
return useCallback((sheetId, rows,
|
|
30
|
+
return useCallback((sheetId, rows, rawReferenceRowIndex, options) => {
|
|
14
31
|
if (!canEditSheet(sheetId)) {
|
|
15
32
|
console.debug("This range is protected, users cannot edit this cell range.");
|
|
16
33
|
return;
|
|
@@ -18,6 +35,10 @@ export const useOnMoveRows = ({ rowCount, columnCount, locale, createHistory, on
|
|
|
18
35
|
if (!rows.length) {
|
|
19
36
|
return;
|
|
20
37
|
}
|
|
38
|
+
const referenceRowIndex = resolveMoveReferenceIndex(rows, rawReferenceRowIndex, options);
|
|
39
|
+
if (referenceRowIndex === undefined) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
21
42
|
const saveHistory = createHistory();
|
|
22
43
|
const { 0: firstRow, [rows.length - 1]: lastRow } = rows;
|
|
23
44
|
// We need to track this for history. Precedent cells
|
|
@@ -118,13 +139,17 @@ export const useOnMoveRows = ({ rowCount, columnCount, locale, createHistory, on
|
|
|
118
139
|
columnCount,
|
|
119
140
|
});
|
|
120
141
|
}
|
|
121
|
-
//
|
|
122
|
-
//
|
|
142
|
+
// The rows the move displaces (Excel: refs into them shift by ±count). Moving UP,
|
|
143
|
+
// rows `referenceRowIndex..firstRow-1` slide down; moving DOWN, rows
|
|
144
|
+
// `lastRow+1..referenceRowIndex+count-1` slide up (the block lands at
|
|
145
|
+
// `referenceRowIndex` in the post-removal frame).
|
|
123
146
|
const shiftedRange = {
|
|
124
147
|
startColumnIndex: 1,
|
|
125
148
|
endColumnIndex: columnCount,
|
|
126
|
-
startRowIndex:
|
|
127
|
-
endRowIndex:
|
|
149
|
+
startRowIndex: direction === Direction.Left ? referenceRowIndex : lastRow + 1,
|
|
150
|
+
endRowIndex: direction === Direction.Left
|
|
151
|
+
? firstRow - 1
|
|
152
|
+
: referenceRowIndex + count - 1,
|
|
128
153
|
};
|
|
129
154
|
// Update formulas
|
|
130
155
|
for (const [rowIndex, columnIndex] of iterateCellsInRange({
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CellInterface, SelectionArea } from "@rowsncolumns/common-types";
|
|
1
|
+
import type { CellInterface, GridRange, SelectionArea } from "@rowsncolumns/common-types";
|
|
2
2
|
import type { CellData, SelectionAttributes, Sheet, TableView } from "@rowsncolumns/spreadsheet";
|
|
3
3
|
import type { OnCommand } from "../commands";
|
|
4
4
|
import type { CalculationOperation, useCalculation } from "./use-calculation";
|
|
@@ -29,7 +29,12 @@ export type UseOnMoveSelectionProps<T extends CellData, S extends Sheet> = {
|
|
|
29
29
|
onChangePivotTables?: UseSpreadsheetProps<T, S>["onChangePivotTables"];
|
|
30
30
|
getDependents: ReturnType<typeof useCalculation>["getDependents"];
|
|
31
31
|
getActiveCell: () => CellInterface;
|
|
32
|
+
/**
|
|
33
|
+
* Merged ranges of a sheet — a drag-move whose destination (or source) covers a merge only
|
|
34
|
+
* partially is refused, like Excel ("We can't do that to a merged cell.").
|
|
35
|
+
*/
|
|
36
|
+
getSheetMerges?: (sheetId: number) => GridRange[] | undefined | null;
|
|
32
37
|
onCommand?: OnCommand;
|
|
33
38
|
};
|
|
34
|
-
export declare const useOnMoveSelection: <T extends CellData, S extends Sheet>({ rowCount, columnCount, tables, locale, cellXfsRegistry, sharedStringRegistry, getDependents, getActiveCell, onChangeTables, onChangeSheets, onChangeNamedRanges, onChangeDataValidations, onChangeConditionalFormats, onChangePivotTables, onChangeSheetData, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, isArrayFormula, getDataValidationById, onCommand, }: UseOnMoveSelectionProps<T, S>) => (sheetId: number, from: SelectionArea<SelectionAttributes>, to: SelectionArea<SelectionAttributes>) => void;
|
|
39
|
+
export declare const useOnMoveSelection: <T extends CellData, S extends Sheet>({ rowCount, columnCount, tables, locale, cellXfsRegistry, sharedStringRegistry, getDependents, getActiveCell, onChangeTables, onChangeSheets, onChangeNamedRanges, onChangeDataValidations, onChangeConditionalFormats, onChangePivotTables, onChangeSheetData, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, isArrayFormula, getDataValidationById, getSheetMerges, onCommand, }: UseOnMoveSelectionProps<T, S>) => (sheetId: number, from: SelectionArea<SelectionAttributes>, to: SelectionArea<SelectionAttributes>) => void;
|
|
35
40
|
//# sourceMappingURL=use-on-move-selection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-on-move-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-move-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"use-on-move-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-move-selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,13 +6,16 @@ import { useCallback } from "react";
|
|
|
6
6
|
import { processSideEffectDependentCells } from "../api/dependency";
|
|
7
7
|
import { createSheetCellIdentifier } from "../api/formula";
|
|
8
8
|
import { createSheetDraft } from "../api/immer-utils";
|
|
9
|
+
import { findPartiallyCoveredMerge, MERGED_CELL_MOVE_ERROR } from "../api/merges";
|
|
9
10
|
import { shiftPivotsOnMove } from "../api/pivot-range";
|
|
11
|
+
import { useShowError } from "../atoms/error-state.atom";
|
|
10
12
|
import { SheetCell } from "../sheet-cell";
|
|
11
13
|
import { moveRange } from "./../api/selection";
|
|
12
14
|
import { useCanEditCellRange } from "./use-can-edit-cellrange";
|
|
13
15
|
import { useOnMoveTableColumns } from "./use-on-move-table-columns";
|
|
14
|
-
export const useOnMoveSelection = ({ rowCount, columnCount, tables, locale, cellXfsRegistry, sharedStringRegistry, getDependents, getActiveCell, onChangeTables, onChangeSheets, onChangeNamedRanges, onChangeDataValidations, onChangeConditionalFormats, onChangePivotTables, onChangeSheetData, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, isArrayFormula, getDataValidationById, onCommand, }) => {
|
|
16
|
+
export const useOnMoveSelection = ({ rowCount, columnCount, tables, locale, cellXfsRegistry, sharedStringRegistry, getDependents, getActiveCell, onChangeTables, onChangeSheets, onChangeNamedRanges, onChangeDataValidations, onChangeConditionalFormats, onChangePivotTables, onChangeSheetData, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, isArrayFormula, getDataValidationById, getSheetMerges, onCommand, }) => {
|
|
15
17
|
const canEditCellRange = useCanEditCellRange();
|
|
18
|
+
const showError = useShowError();
|
|
16
19
|
const onMoveTableColumns = useOnMoveTableColumns({
|
|
17
20
|
rowCount,
|
|
18
21
|
columnCount,
|
|
@@ -32,6 +35,14 @@ export const useOnMoveSelection = ({ rowCount, columnCount, tables, locale, cell
|
|
|
32
35
|
console.debug("This range is protected, users cannot edit this cell range.");
|
|
33
36
|
return;
|
|
34
37
|
}
|
|
38
|
+
// Excel refuses a move whose destination or source covers a merged cell only partially
|
|
39
|
+
// (the write would tear the merge); merges wholly inside the block travel with it.
|
|
40
|
+
const merges = getSheetMerges?.(sheetId);
|
|
41
|
+
if (findPartiallyCoveredMerge(to.range, merges) ||
|
|
42
|
+
findPartiallyCoveredMerge(from.range, merges)) {
|
|
43
|
+
showError({ message: MERGED_CELL_MOVE_ERROR });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
35
46
|
// Check if we are moving columns
|
|
36
47
|
// within table
|
|
37
48
|
const [sourceTable, sourceColumns] = getSelectedTableColumnFromSelection(from, tables);
|
|
@@ -378,6 +389,8 @@ export const useOnMoveSelection = ({ rowCount, columnCount, tables, locale, cell
|
|
|
378
389
|
canEditCellRange,
|
|
379
390
|
isArrayFormula,
|
|
380
391
|
getDataValidationById,
|
|
392
|
+
getSheetMerges,
|
|
393
|
+
showError,
|
|
381
394
|
onCommand,
|
|
382
395
|
]);
|
|
383
396
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Citation } from "@rowsncolumns/common-types";
|
|
2
|
-
import type { CellInterface, SelectionArea } from "@rowsncolumns/grid";
|
|
2
|
+
import type { CellInterface, GridRange, SelectionArea } from "@rowsncolumns/grid";
|
|
3
3
|
import type { CellData, DataValidationRuleRecord, SelectionAttributes, Sheet, TableView } from "@rowsncolumns/spreadsheet";
|
|
4
4
|
import type { OnCommand } from "../commands";
|
|
5
5
|
import type { GeneratedNames } from "../generated-names";
|
|
@@ -37,6 +37,16 @@ type UseOnPasteProps<T extends CellData, S extends Sheet> = {
|
|
|
37
37
|
onChangeEmbeds: UseSpreadsheetProps<T, S>["onChangeEmbeds"];
|
|
38
38
|
onRequestFonts: UseSpreadsheetProps<T, S>["onRequestFonts"];
|
|
39
39
|
onChangeDataValidations: UseSpreadsheetProps<T, S>["onChangeDataValidations"];
|
|
40
|
+
/**
|
|
41
|
+
* Defined names wholly inside a CUT block follow it to the paste destination (Excel: `Data`
|
|
42
|
+
* over A1:A3 becomes C1:C3 after cut A1:A3 → paste C1; a partially covered name stays).
|
|
43
|
+
*/
|
|
44
|
+
onChangeNamedRanges?: UseSpreadsheetProps<T, S>["onChangeNamedRanges"];
|
|
45
|
+
/**
|
|
46
|
+
* Merged ranges of a sheet — a cut + paste whose destination (or source) covers a merge only
|
|
47
|
+
* partially is refused, like Excel ("We can't do that to a merged cell.").
|
|
48
|
+
*/
|
|
49
|
+
getSheetMerges?: (sheetId: number) => GridRange[] | undefined | null;
|
|
40
50
|
onChangeSelections: ReturnType<typeof useSheetState>["onChangeSelections"];
|
|
41
51
|
onChangeActiveCell(sheetId: number, cell: CellInterface): void;
|
|
42
52
|
getDependents: ReturnType<typeof useCalculation>["getDependents"];
|
|
@@ -74,6 +84,6 @@ type UseOnPasteProps<T extends CellData, S extends Sheet> = {
|
|
|
74
84
|
onCommand?: OnCommand;
|
|
75
85
|
generatedNames?: GeneratedNames;
|
|
76
86
|
};
|
|
77
|
-
export declare const useOnPaste: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, sheetData, tables: currentTables, maxRowCount, maxColumnCount, isHiddenByFilterRow, onRequestFonts, idCreationStrategy, createHistory, enqueueCalculation, enqueueStructureChange, enqueueGraphOperation, onChangeSheetData, onChangeSheets, onChangeTables, onChangeEmbeds, onChangeSelections, onChangeActiveCell, getDependents, getActiveCell, getUserEnteredValue, onChangeDataValidations, preserveFormatting, cellXfsRegistry, sharedStringRegistry, getDataValidationById, getSheetName, onError, citations, onChangeCitations, sanitizeHtml, onCommand, generatedNames, }: UseOnPasteProps<T, S>) => (e: ClipboardEvent | undefined, sourceSheetId: number | undefined, destinationSheetId: number, copiedSelections: SelectionArea<SelectionAttributes>[] | undefined, activeCell: CellInterface, selections: SelectionArea<SelectionAttributes>[] | undefined, finalSelections: SelectionArea<SelectionAttributes>[] | undefined, isCutOperation: boolean) => Promise<void>;
|
|
87
|
+
export declare const useOnPaste: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, sheetData, tables: currentTables, maxRowCount, maxColumnCount, isHiddenByFilterRow, onRequestFonts, idCreationStrategy, createHistory, enqueueCalculation, enqueueStructureChange, enqueueGraphOperation, onChangeSheetData, onChangeSheets, onChangeTables, onChangeEmbeds, onChangeSelections, onChangeActiveCell, getDependents, getActiveCell, getUserEnteredValue, onChangeDataValidations, onChangeNamedRanges, getSheetMerges, preserveFormatting, cellXfsRegistry, sharedStringRegistry, getDataValidationById, getSheetName, onError, citations, onChangeCitations, sanitizeHtml, onCommand, generatedNames, }: UseOnPasteProps<T, S>) => (e: ClipboardEvent | undefined, sourceSheetId: number | undefined, destinationSheetId: number, copiedSelections: SelectionArea<SelectionAttributes>[] | undefined, activeCell: CellInterface, selections: SelectionArea<SelectionAttributes>[] | undefined, finalSelections: SelectionArea<SelectionAttributes>[] | undefined, isCutOperation: boolean) => Promise<void>;
|
|
78
88
|
export {};
|
|
79
89
|
//# sourceMappingURL=use-on-paste.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-on-paste.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-paste.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EACV,aAAa,
|
|
1
|
+
{"version":3,"file":"use-on-paste.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-paste.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isStaticNode } from "@rowsncolumns/dag";
|
|
2
|
-
import { areaIntersects, isAreasEqual } from "@rowsncolumns/grid";
|
|
2
|
+
import { areaInsideArea, areaIntersects, isAreasEqual } from "@rowsncolumns/grid";
|
|
3
3
|
import { selectionFromActiveCell } from "@rowsncolumns/grid";
|
|
4
4
|
import { DEFAULT_COLUMN_COUNT, DEFAULT_ROW_COUNT, findActiveTableWithinCell, loadWebFont, MAX_COLUMN_COUNT, MAX_ROW_COUNT, useFocusEmbedOrChart, useGetFinalRowHeight, useRedrawGrid, } from "@rowsncolumns/spreadsheet";
|
|
5
5
|
import { isSelectionACell, useGetEffectiveValuesFromRange, } from "@rowsncolumns/spreadsheet";
|
|
@@ -9,6 +9,9 @@ import { useCallback } from "react";
|
|
|
9
9
|
import { processSideEffectDependentCells } from "../api/dependency";
|
|
10
10
|
import { createSheetCellIdentifier } from "../api/formula";
|
|
11
11
|
import { createSheetDraft } from "../api/immer-utils";
|
|
12
|
+
import { findPartiallyCoveredMerge, MERGED_CELL_MOVE_ERROR } from "../api/merges";
|
|
13
|
+
import { moveRange } from "../api/selection";
|
|
14
|
+
import { useShowError } from "../atoms/error-state.atom";
|
|
12
15
|
import { applyPasteOperation, isBlankClipboardCell, resolvePasteSpecialOptions, } from "../api/paste-special";
|
|
13
16
|
import { findAdjacentTable, findTableColumnIndex } from "../api/table";
|
|
14
17
|
import { addCalculatedColumnsForRowExpansion } from "../interface/change-table-column";
|
|
@@ -33,8 +36,9 @@ export const buildDestinationRowAssignments = (sheetId, startRowIndex, endRowInd
|
|
|
33
36
|
}
|
|
34
37
|
return assignments;
|
|
35
38
|
};
|
|
36
|
-
export const useOnPaste = ({ rowCount, columnCount, locale, sheetData, tables: currentTables, maxRowCount = MAX_ROW_COUNT, maxColumnCount = MAX_COLUMN_COUNT, isHiddenByFilterRow, onRequestFonts, idCreationStrategy, createHistory, enqueueCalculation, enqueueStructureChange, enqueueGraphOperation, onChangeSheetData, onChangeSheets, onChangeTables, onChangeEmbeds, onChangeSelections, onChangeActiveCell, getDependents, getActiveCell, getUserEnteredValue, onChangeDataValidations, preserveFormatting = true, cellXfsRegistry, sharedStringRegistry, getDataValidationById, getSheetName, onError, citations, onChangeCitations, sanitizeHtml, onCommand, generatedNames, }) => {
|
|
39
|
+
export const useOnPaste = ({ rowCount, columnCount, locale, sheetData, tables: currentTables, maxRowCount = MAX_ROW_COUNT, maxColumnCount = MAX_COLUMN_COUNT, isHiddenByFilterRow, onRequestFonts, idCreationStrategy, createHistory, enqueueCalculation, enqueueStructureChange, enqueueGraphOperation, onChangeSheetData, onChangeSheets, onChangeTables, onChangeEmbeds, onChangeSelections, onChangeActiveCell, getDependents, getActiveCell, getUserEnteredValue, onChangeDataValidations, onChangeNamedRanges, getSheetMerges, preserveFormatting = true, cellXfsRegistry, sharedStringRegistry, getDataValidationById, getSheetName, onError, citations, onChangeCitations, sanitizeHtml, onCommand, generatedNames, }) => {
|
|
37
40
|
const canEditCellRange = useCanEditCellRange();
|
|
41
|
+
const showError = useShowError();
|
|
38
42
|
// Allowed values
|
|
39
43
|
const getEffectiveValuesFromRange = useGetEffectiveValuesFromRange();
|
|
40
44
|
const focusEmbedOrChart = useFocusEmbedOrChart();
|
|
@@ -171,6 +175,16 @@ export const useOnPaste = ({ rowCount, columnCount, locale, sheetData, tables: c
|
|
|
171
175
|
console.debug("Protected range, You cannot paste on to protected cells.");
|
|
172
176
|
return;
|
|
173
177
|
}
|
|
178
|
+
// A cut is a move: Excel refuses it when the destination (or the source) covers a merged
|
|
179
|
+
// cell only partially — writing into a non-anchor cell of a merge would tear it.
|
|
180
|
+
if (isCutOperation &&
|
|
181
|
+
from &&
|
|
182
|
+
!isNil(sourceSheetId) &&
|
|
183
|
+
(findPartiallyCoveredMerge(to.range, getSheetMerges?.(destinationSheetId)) ||
|
|
184
|
+
findPartiallyCoveredMerge(from.range, getSheetMerges?.(sourceSheetId)))) {
|
|
185
|
+
showError({ message: MERGED_CELL_MOVE_ERROR });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
174
188
|
// Check if pasting a table would overlap with an existing table
|
|
175
189
|
if (tables?.length) {
|
|
176
190
|
const existingTable = currentTables?.find((table) => table.sheetId === destinationSheetId &&
|
|
@@ -726,6 +740,28 @@ export const useOnPaste = ({ rowCount, columnCount, locale, sheetData, tables: c
|
|
|
726
740
|
}
|
|
727
741
|
}
|
|
728
742
|
}
|
|
743
|
+
// Defined names wholly inside the cut block follow it (Excel move semantics); a name the
|
|
744
|
+
// block covers only partially keeps referring to its original area.
|
|
745
|
+
if (isCutOperation && from && !isNil(sourceSheetId)) {
|
|
746
|
+
onChangeNamedRanges?.((prevNamedRanges) => {
|
|
747
|
+
const [nextState, patches, inversePatches] = produceWithPatches(prevNamedRanges, (draft) => {
|
|
748
|
+
for (const namedRange of draft) {
|
|
749
|
+
if (namedRange.range?.sheetId === sourceSheetId &&
|
|
750
|
+
areaInsideArea(namedRange.range, from.range)) {
|
|
751
|
+
namedRange.range = {
|
|
752
|
+
...moveRange(namedRange.range, from.range, to.range),
|
|
753
|
+
sheetId: destinationSheetId,
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
});
|
|
758
|
+
if (!patches.length) {
|
|
759
|
+
return prevNamedRanges;
|
|
760
|
+
}
|
|
761
|
+
saveHistory({ namedRanges: { patches, inversePatches } });
|
|
762
|
+
return nextState;
|
|
763
|
+
});
|
|
764
|
+
}
|
|
729
765
|
// Embeds
|
|
730
766
|
if (embeds?.length) {
|
|
731
767
|
const firstEmbedId = embeds[0].embedId;
|
|
@@ -899,5 +935,8 @@ export const useOnPaste = ({ rowCount, columnCount, locale, sheetData, tables: c
|
|
|
899
935
|
getFinalRowHeight,
|
|
900
936
|
onCommand,
|
|
901
937
|
generatedNames,
|
|
938
|
+
onChangeNamedRanges,
|
|
939
|
+
getSheetMerges,
|
|
940
|
+
showError,
|
|
902
941
|
]);
|
|
903
942
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { CalculatorConfig } from "@rowsncolumns/calculator";
|
|
2
2
|
import type { CellFormat, CellInterface, Citation, GridRange, IterativeCalculationOptions, NamedCellStyle, SelectionArea } from "@rowsncolumns/common-types";
|
|
3
3
|
import type { BandedDefinition, BandedRange, CanvasGridProps, CellData, ColorMode, ConditionalFormatRule, DataValidationRuleRecord, EmbeddedChart, EmbeddedObject, NamedRange, PivotTable, ProtectedRange, SelectionAttributes, Sheet, Slicer, SpreadsheetTheme, TableView } from "@rowsncolumns/spreadsheet";
|
|
4
|
+
import { type FormulaLocaleInput } from "@rowsncolumns/utils";
|
|
4
5
|
import type { Patch } from "immer";
|
|
5
6
|
import { getAutoFillValues as defaultGetAutoFillValues } from "../api/fill";
|
|
6
7
|
import type { OnCommand } from "../commands";
|
|
@@ -252,6 +253,14 @@ export type UseSpreadsheetProps<T extends CellData = CellData, S extends Sheet =
|
|
|
252
253
|
* Auto detected from Intl.DateTimeFormat().resolvedOptions().locale
|
|
253
254
|
*/
|
|
254
255
|
locale?: string;
|
|
256
|
+
/**
|
|
257
|
+
* Formula SYNTAX locale (rowsncolumns/spreadsheet#655): the language whose function names,
|
|
258
|
+
* decimal / argument separators and error values the cell editor and formula bar use. Storage
|
|
259
|
+
* and evaluation stay canonical (English names, `.` and `,`), so this only shapes what the user
|
|
260
|
+
* types and sees. Resolved and returned as `formulaLocale` — pass it to `CanvasGrid`. Defaults to
|
|
261
|
+
* `locale`; `"en"` keeps English syntax; a `FormulaLocaleDefinition` adds or overrides names.
|
|
262
|
+
*/
|
|
263
|
+
formulaLocale?: FormulaLocaleInput;
|
|
255
264
|
/**
|
|
256
265
|
* Formatters used to customize/localize auto-generated names, e.g. new
|
|
257
266
|
* sheet titles ("Sheet1"), duplicated sheet titles ("Copy of Sheet1"),
|
|
@@ -379,7 +388,7 @@ export declare const deriveBuiltInTableBanding: (table: TableView) => BandedDefi
|
|
|
379
388
|
* @param param0
|
|
380
389
|
* @returns
|
|
381
390
|
*/
|
|
382
|
-
export declare const useSpreadsheetState: <T extends CellData = CellData, S extends Sheet = Sheet>({ sheets, onChangeSheets, theme, functions, onDemandFormulaPattern, enableLazyCalculation, conditionalFormats, dataValidations, tables, namedRanges, enableExcelImportHistory, enableExcelfileDragDrop, onChangeTables, onChangeNamedRanges, onChangeCharts, onChangeEmbeds, onChangeProtectedRanges, onChangeConditionalFormats, onChangeDataValidations, onChangeBandedRanges, onChangePivotTables, sheetData, onChangeSheetData, onChangeDependencyGraph, onChangeHistory, onCommand: onCommandProp, onChangeTheme, namedCellStyles, onChangeNamedCellStyles, onError, getAutoFillValues: rawGetAutoFillValues, customAutofillLists, getEffectiveStructuredValue, darkThemeClassName, colorMode, fonts, enableDragnDrop, enabledUndoRedo, locale, generatedNames: generatedNamesProp, enableAtFormula, preserveFormattingOnPaste, recalculateOnOpen, protectFormulas, maxRowCount, maxColumnCount, maxSheetCount, idCreationStrategy, fileSizeLimit, cellXfs, cellStyles, onChangeCellXfs, sharedStrings, onChangeSharedStrings, onRequestFonts, onChangeSlicers, citations, onChangeCitations, createCalculationWorker, calculationMode, iterativeCalculation, onIterativeCalculationEnabled, onStreamStart, onStreamProgress, onStreamEnd, onConfirm, onPrompt, sanitizeHtml, }: UseSpreadsheetProps<T, S>) => {
|
|
391
|
+
export declare const useSpreadsheetState: <T extends CellData = CellData, S extends Sheet = Sheet>({ sheets, onChangeSheets, theme, functions, onDemandFormulaPattern, enableLazyCalculation, conditionalFormats, dataValidations, tables, namedRanges, enableExcelImportHistory, enableExcelfileDragDrop, onChangeTables, onChangeNamedRanges, onChangeCharts, onChangeEmbeds, onChangeProtectedRanges, onChangeConditionalFormats, onChangeDataValidations, onChangeBandedRanges, onChangePivotTables, sheetData, onChangeSheetData, onChangeDependencyGraph, onChangeHistory, onCommand: onCommandProp, onChangeTheme, namedCellStyles, onChangeNamedCellStyles, onError, getAutoFillValues: rawGetAutoFillValues, customAutofillLists, getEffectiveStructuredValue, darkThemeClassName, colorMode, fonts, enableDragnDrop, enabledUndoRedo, locale, formulaLocale: formulaLocaleProp, generatedNames: generatedNamesProp, enableAtFormula, preserveFormattingOnPaste, recalculateOnOpen, protectFormulas, maxRowCount, maxColumnCount, maxSheetCount, idCreationStrategy, fileSizeLimit, cellXfs, cellStyles, onChangeCellXfs, sharedStrings, onChangeSharedStrings, onRequestFonts, onChangeSlicers, citations, onChangeCitations, createCalculationWorker, calculationMode, iterativeCalculation, onIterativeCalculationEnabled, onStreamStart, onStreamProgress, onStreamEnd, onConfirm, onPrompt, sanitizeHtml, }: UseSpreadsheetProps<T, S>) => {
|
|
383
392
|
namedCellStyles: NamedCellStyle[] | undefined;
|
|
384
393
|
activeCellBySheetId: Record<number, import("@rowsncolumns/grid").CellInterface>;
|
|
385
394
|
selectionsBySheetId: Record<number, import("@rowsncolumns/grid").SelectionArea<SelectionAttributes>[]>;
|
|
@@ -524,9 +533,10 @@ export declare const useSpreadsheetState: <T extends CellData = CellData, S exte
|
|
|
524
533
|
onInsertCellsShiftDown: (sheetId: number, activeCell: import("@rowsncolumns/grid").CellInterface, selections: import("@rowsncolumns/grid").SelectionArea<SelectionAttributes>[]) => void;
|
|
525
534
|
onInsertRow: (sheetId: number, referenceRowIndex: number, numRows?: number) => void;
|
|
526
535
|
onInsertColumn: (sheetId: number, referenceColumnIndex: number, numColumns?: number) => void;
|
|
527
|
-
onMoveColumns: (sheetId: number, columns: number[],
|
|
528
|
-
onMoveRows: (sheetId: number, rows: number[],
|
|
536
|
+
onMoveColumns: (sheetId: number, columns: number[], rawReferenceColumnIndex: number, options?: import("./use-on-move-rows").MoveDimensionOptions) => void;
|
|
537
|
+
onMoveRows: (sheetId: number, rows: number[], rawReferenceRowIndex: number, options?: import("./use-on-move-rows").MoveDimensionOptions) => void;
|
|
529
538
|
onMoveSelection: (sheetId: number, from: SelectionArea<SelectionAttributes>, to: SelectionArea<SelectionAttributes>) => void;
|
|
539
|
+
onInsertCutCells: (sheetId: number, from: SelectionArea<SelectionAttributes>, to: SelectionArea<SelectionAttributes>) => void;
|
|
530
540
|
onSortColumn: (sheetId: number, sortedColumnIndex: number, sortOrder: import("@rowsncolumns/common-types").SortOrder, options?: import("./use-on-sort-column").SortColumnOptions, additionalLevels?: import("./use-on-sort-column").SortColumnLevel[]) => void;
|
|
531
541
|
onSortTable: import("./use-on-sort-table").OnSortTable;
|
|
532
542
|
onFilterTable: (sheetId: number, filter: TableView | import("@rowsncolumns/spreadsheet").FilterView, columnIndex: number, conditionType: import("@rowsncolumns/common-types").ConditionType | undefined, conditionValue: import("@rowsncolumns/common-types").ConditionValue[] | undefined, visibleValues: string[] | undefined | null, extras?: import("./use-on-filter-table").FilterTableExtras) => Promise<void>;
|
|
@@ -632,6 +642,7 @@ export declare const useSpreadsheetState: <T extends CellData = CellData, S exte
|
|
|
632
642
|
onTracePrecedents: (sheetId: number, cell: CellInterface) => void;
|
|
633
643
|
onClearHistory: () => void;
|
|
634
644
|
onChangeLocale: (newLocale: string, oldLocale?: string) => void;
|
|
645
|
+
formulaLocale: import("@rowsncolumns/utils").FormulaLocale;
|
|
635
646
|
onInsertComment: (sheetId: number, rowIndex: number, columnIndex: number, commentThreadId: string | number | undefined) => void;
|
|
636
647
|
onRemoveComment: (sheetId: number, rowIndex: number, columnIndex: number) => void;
|
|
637
648
|
onCreateCitation: (sheetId: number, rowIndex: number, columnIndex: number, citation: Citation) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-spreadsheet-state.d.ts","sourceRoot":"","sources":["../../../hooks/use-spreadsheet-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,QAAQ,EACR,SAAS,EACT,2BAA2B,EAC3B,cAAc,EACd,aAAa,EACd,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,QAAQ,EACR,SAAS,EACT,qBAAqB,EACrB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,UAAU,EACV,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACV,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"use-spreadsheet-state.d.ts","sourceRoot":"","sources":["../../../hooks/use-spreadsheet-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { createNewSheet, DEFAULT_COLUMN_COUNT, DEFAULT_ROW_COUNT, useGetCellDime
|
|
|
4
4
|
import { useFonts } from "@rowsncolumns/spreadsheet";
|
|
5
5
|
import { getBandedCells } from "@rowsncolumns/spreadsheet";
|
|
6
6
|
import { defaultSpreadsheetTheme, useCallbackRef, useSpreadsheetTheme, } from "@rowsncolumns/spreadsheet";
|
|
7
|
-
import { findMatchingBandProperty, getCurrentLocale, isNil, setDefaultEnableAtFormula, uuid, } from "@rowsncolumns/utils";
|
|
7
|
+
import { findMatchingBandProperty, getCurrentLocale, getFormulaLocale, isNil, setDefaultEnableAtFormula, uuid, } from "@rowsncolumns/utils";
|
|
8
8
|
import { enableMapSet, enablePatches, setUseStrictShallowCopy } from "immer";
|
|
9
9
|
import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
10
10
|
import { getAutoFillValues as defaultGetAutoFillValues } from "../api/fill";
|
|
@@ -83,6 +83,10 @@ import { useOnMergeUnMergeCells } from "./use-on-merge-unmerge-cells";
|
|
|
83
83
|
import { useOnMoveColumns } from "./use-on-move-columns";
|
|
84
84
|
import { useOnMoveRows } from "./use-on-move-rows";
|
|
85
85
|
import { useOnMoveSelection } from "./use-on-move-selection";
|
|
86
|
+
import { planInsertCutCells } from "../api/insert-cut-cells";
|
|
87
|
+
import { findPartiallyCoveredMerge, MERGED_CELL_MOVE_ERROR } from "../api/merges";
|
|
88
|
+
import { useShowError } from "../atoms/error-state.atom";
|
|
89
|
+
import { SHEET_PROTECTION_ERROR_TITLE, useCanEditCellRange, useCanPerformSheetAction, } from "./use-can-edit-cellrange";
|
|
86
90
|
import { useOnMoveSheet } from "./use-on-move-sheet";
|
|
87
91
|
import { useOnPaste } from "./use-on-paste";
|
|
88
92
|
import { useOnProtectRange } from "./use-on-protect-range";
|
|
@@ -227,7 +231,7 @@ enableDragnDrop = true,
|
|
|
227
231
|
// Enable undo/redo functionality
|
|
228
232
|
enabledUndoRedo = true,
|
|
229
233
|
// Current locale
|
|
230
|
-
locale = getCurrentLocale(),
|
|
234
|
+
locale = getCurrentLocale(), formulaLocale: formulaLocaleProp,
|
|
231
235
|
// Templates for auto-generated names (sheets, tables, table columns)
|
|
232
236
|
generatedNames: generatedNamesProp, enableAtFormula = false,
|
|
233
237
|
// Preserve data formatting like color, font style on paste
|
|
@@ -960,6 +964,8 @@ sanitizeHtml, }) => {
|
|
|
960
964
|
onCommand,
|
|
961
965
|
});
|
|
962
966
|
// Locale change - regenerate formatted values and normalize validation rules
|
|
967
|
+
// The formula syntax the editors speak — Excel follows the user's language, so `locale` by default.
|
|
968
|
+
const formulaLocale = useMemo(() => getFormulaLocale(formulaLocaleProp ?? locale), [formulaLocaleProp, locale]);
|
|
963
969
|
const onChangeLocale = useOnLocaleChange({
|
|
964
970
|
cellXfsRegistry,
|
|
965
971
|
sharedStringRegistry,
|
|
@@ -1299,6 +1305,7 @@ sanitizeHtml, }) => {
|
|
|
1299
1305
|
const onMoveSelection = useOnMoveSelection({
|
|
1300
1306
|
rowCount,
|
|
1301
1307
|
columnCount,
|
|
1308
|
+
getSheetMerges: getPaintMerges,
|
|
1302
1309
|
enqueueGraphOperation,
|
|
1303
1310
|
enqueueCalculation,
|
|
1304
1311
|
enqueueStructureChange,
|
|
@@ -1319,6 +1326,72 @@ sanitizeHtml, }) => {
|
|
|
1319
1326
|
sharedStringRegistry,
|
|
1320
1327
|
onCommand,
|
|
1321
1328
|
});
|
|
1329
|
+
// Excel "Insert Cut Cells" / Shift+drag for a cell range, as the three structural steps the
|
|
1330
|
+
// hooks above own (`planInsertCutCells`): open the destination band, move the block into the
|
|
1331
|
+
// opening, close the gap it left — so Shift+drag A5 to A2 over r1..r6 gives r1 r5 r2 r3 r4 r6 and
|
|
1332
|
+
// a forward move lands before Excel's pre-removal reference row. The refusals are decided up
|
|
1333
|
+
// front — a merge the block or a shifted band covers only partially, a protected range — so a
|
|
1334
|
+
// refused move never leaves the band opened. Each step records its own undo entry.
|
|
1335
|
+
const showError = useShowError();
|
|
1336
|
+
const canEditCellRange = useCanEditCellRange();
|
|
1337
|
+
const canPerformSheetAction = useCanPerformSheetAction();
|
|
1338
|
+
const onInsertCutCells = useCallback((sheetId, from, to) => {
|
|
1339
|
+
const plan = planInsertCutCells(from.range, to.range);
|
|
1340
|
+
if (!plan) {
|
|
1341
|
+
return;
|
|
1342
|
+
}
|
|
1343
|
+
const merges = getPaintMerges(sheetId);
|
|
1344
|
+
if ([from.range, to.range, ...plan.bands].some((range) => findPartiallyCoveredMerge(range, merges))) {
|
|
1345
|
+
showError({ message: MERGED_CELL_MOVE_ERROR });
|
|
1346
|
+
return;
|
|
1347
|
+
}
|
|
1348
|
+
const vertical = plan.shift === "down";
|
|
1349
|
+
if (!canEditCellRange(sheetId, from.range) ||
|
|
1350
|
+
!canEditCellRange(sheetId, to.range) ||
|
|
1351
|
+
!canPerformSheetAction(sheetId, vertical ? "insertRows" : "insertColumns") ||
|
|
1352
|
+
!canPerformSheetAction(sheetId, vertical ? "deleteRows" : "deleteColumns")) {
|
|
1353
|
+
showError({
|
|
1354
|
+
title: SHEET_PROTECTION_ERROR_TITLE,
|
|
1355
|
+
message: "You can't move cells on a protected sheet.",
|
|
1356
|
+
});
|
|
1357
|
+
return;
|
|
1358
|
+
}
|
|
1359
|
+
const target = {
|
|
1360
|
+
rowIndex: to.range.startRowIndex,
|
|
1361
|
+
columnIndex: to.range.startColumnIndex,
|
|
1362
|
+
};
|
|
1363
|
+
if (vertical) {
|
|
1364
|
+
onInsertCellsShiftDown(sheetId, target, [to]);
|
|
1365
|
+
}
|
|
1366
|
+
else {
|
|
1367
|
+
onInsertCellsShiftRight(sheetId, target, [to]);
|
|
1368
|
+
}
|
|
1369
|
+
const source = {
|
|
1370
|
+
...from,
|
|
1371
|
+
range: plan.shiftedSource,
|
|
1372
|
+
};
|
|
1373
|
+
onMoveSelection(sheetId, source, to);
|
|
1374
|
+
const vacated = {
|
|
1375
|
+
rowIndex: plan.shiftedSource.startRowIndex,
|
|
1376
|
+
columnIndex: plan.shiftedSource.startColumnIndex,
|
|
1377
|
+
};
|
|
1378
|
+
if (vertical) {
|
|
1379
|
+
onDeleteCellsShiftUp(sheetId, vacated, [source]);
|
|
1380
|
+
}
|
|
1381
|
+
else {
|
|
1382
|
+
onDeleteCellsShiftLeft(sheetId, vacated, [source]);
|
|
1383
|
+
}
|
|
1384
|
+
}, [
|
|
1385
|
+
getPaintMerges,
|
|
1386
|
+
showError,
|
|
1387
|
+
canEditCellRange,
|
|
1388
|
+
canPerformSheetAction,
|
|
1389
|
+
onInsertCellsShiftDown,
|
|
1390
|
+
onInsertCellsShiftRight,
|
|
1391
|
+
onDeleteCellsShiftUp,
|
|
1392
|
+
onDeleteCellsShiftLeft,
|
|
1393
|
+
onMoveSelection,
|
|
1394
|
+
]);
|
|
1322
1395
|
// Sort column
|
|
1323
1396
|
const onSortColumn = useOnSortColumn({
|
|
1324
1397
|
rowCount,
|
|
@@ -1414,6 +1487,8 @@ sanitizeHtml, }) => {
|
|
|
1414
1487
|
columnCount,
|
|
1415
1488
|
locale,
|
|
1416
1489
|
sheetData,
|
|
1490
|
+
onChangeNamedRanges,
|
|
1491
|
+
getSheetMerges: getPaintMerges,
|
|
1417
1492
|
getDataValidationById,
|
|
1418
1493
|
preserveFormatting: preserveFormattingOnPaste,
|
|
1419
1494
|
maxColumnCount,
|
|
@@ -2012,6 +2087,7 @@ sanitizeHtml, }) => {
|
|
|
2012
2087
|
onMoveColumns,
|
|
2013
2088
|
onMoveRows,
|
|
2014
2089
|
onMoveSelection,
|
|
2090
|
+
onInsertCutCells,
|
|
2015
2091
|
onSortColumn,
|
|
2016
2092
|
onSortTable,
|
|
2017
2093
|
onFilterTable,
|
|
@@ -2129,6 +2205,8 @@ sanitizeHtml, }) => {
|
|
|
2129
2205
|
onClearHistory,
|
|
2130
2206
|
// Locale change
|
|
2131
2207
|
onChangeLocale,
|
|
2208
|
+
// Resolved formula syntax locale (see the `formulaLocale` option)
|
|
2209
|
+
formulaLocale,
|
|
2132
2210
|
// Comments
|
|
2133
2211
|
onInsertComment,
|
|
2134
2212
|
onRemoveComment,
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from "./sheet-cell";
|
|
|
18
18
|
export { useSubscribeToSheet, useSubscribeToMultipleRanges, } from "./hooks/use-sheet-observer";
|
|
19
19
|
export * from "./helpers";
|
|
20
20
|
export * from "./api/fill";
|
|
21
|
+
export * from "./api/insert-cut-cells";
|
|
21
22
|
export * from "./api/immer-utils";
|
|
22
23
|
export * from "./api/range";
|
|
23
24
|
export * from "./api/anchored-objects";
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,WAAW,EACX,SAAS,EACT,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,KAAK,2BAA2B,GACjC,MAAM,qBAAqB,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oCAAoC,CAAC;AACnD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,WAAW,EACX,SAAS,EACT,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,KAAK,2BAA2B,GACjC,MAAM,qBAAqB,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oCAAoC,CAAC;AACnD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -18,6 +18,7 @@ export * from "./sheet-cell";
|
|
|
18
18
|
export { useSubscribeToSheet, useSubscribeToMultipleRanges, } from "./hooks/use-sheet-observer";
|
|
19
19
|
export * from "./helpers";
|
|
20
20
|
export * from "./api/fill";
|
|
21
|
+
export * from "./api/insert-cut-cells";
|
|
21
22
|
export * from "./api/immer-utils";
|
|
22
23
|
export * from "./api/range";
|
|
23
24
|
export * from "./api/anchored-objects";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-column.d.ts","sourceRoot":"","sources":["../../../interface/delete-column.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"delete-column.d.ts","sourceRoot":"","sources":["../../../interface/delete-column.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAsBjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAG5E,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,0hBA+B/D,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,MACrB,SAAS,MAAM,EAAE,eAAe,MAAM,EAAE,SA8bjD,CAAC"}
|