@rowsncolumns/spreadsheet 10.2.75 → 10.2.76
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/fill-series.d.ts +38 -0
- package/dist/cjs/api/fill-series.d.ts.map +1 -0
- package/dist/cjs/api/fill-series.js +89 -0
- package/dist/cjs/api/spreadsheet-api.d.ts +6 -2
- package/dist/cjs/api/spreadsheet-api.d.ts.map +1 -1
- package/dist/cjs/api/spreadsheet-api.js +9 -3
- package/dist/cjs/atoms/fill-options.atom.d.ts +36 -0
- package/dist/cjs/atoms/fill-options.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/fill-options.atom.js +11 -0
- package/dist/cjs/atoms/fill-series-dialog.atom.d.ts +26 -0
- package/dist/cjs/atoms/fill-series-dialog.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/fill-series-dialog.atom.js +14 -0
- package/dist/cjs/atoms/index.d.ts +2 -0
- package/dist/cjs/atoms/index.d.ts.map +1 -1
- package/dist/cjs/atoms/index.js +2 -0
- package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.js +224 -50
- package/dist/cjs/components/canvas-grid/typings.d.ts +13 -4
- package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/helpers.d.ts +9 -0
- package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/helpers.js +8 -1
- package/dist/cjs/components/cell-editor/helpers.spec.js +14 -0
- package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/index.js +6 -3
- package/dist/cjs/components/fill-series-dialog/index.d.ts +29 -0
- package/dist/cjs/components/fill-series-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/fill-series-dialog/index.js +156 -0
- package/dist/cjs/components/selection/fill-options-menu.d.ts +32 -0
- package/dist/cjs/components/selection/fill-options-menu.d.ts.map +1 -0
- package/dist/cjs/components/selection/fill-options-menu.js +65 -0
- package/dist/cjs/components/selection/index.d.ts +1 -1
- package/dist/cjs/components/selection/index.d.ts.map +1 -1
- package/dist/cjs/components/selection/index.js +4 -2
- package/dist/cjs/components/selection/types.d.ts +11 -1
- package/dist/cjs/components/selection/types.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/text-format-selector.d.ts +9 -0
- package/dist/cjs/components/toolbar/text-format-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/text-format-selector.js +15 -3
- package/dist/cjs/hooks/use-editable.d.ts +11 -2
- package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editable.js +8 -0
- package/dist/cjs/hooks/use-editor-submit.d.ts +32 -3
- package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editor-submit.js +111 -2
- package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/cjs/hooks/use-keyboard-handler.js +3 -2
- package/dist/cjs/hooks/use-selection-renderer.d.ts +13 -2
- package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection-renderer.js +21 -4
- package/dist/cjs/hooks/use-selection.d.ts +54 -4
- package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection.js +232 -37
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -0
- package/dist/cjs/release-date.js +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types.d.ts +39 -1
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/api/fill-series.d.ts +38 -0
- package/dist/esm/api/fill-series.d.ts.map +1 -0
- package/dist/esm/api/fill-series.js +78 -0
- package/dist/esm/api/spreadsheet-api.d.ts +6 -2
- package/dist/esm/api/spreadsheet-api.d.ts.map +1 -1
- package/dist/esm/api/spreadsheet-api.js +8 -3
- package/dist/esm/atoms/fill-options.atom.d.ts +36 -0
- package/dist/esm/atoms/fill-options.atom.d.ts.map +1 -0
- package/dist/esm/atoms/fill-options.atom.js +5 -0
- package/dist/esm/atoms/fill-series-dialog.atom.d.ts +26 -0
- package/dist/esm/atoms/fill-series-dialog.atom.d.ts.map +1 -0
- package/dist/esm/atoms/fill-series-dialog.atom.js +9 -0
- package/dist/esm/atoms/index.d.ts +2 -0
- package/dist/esm/atoms/index.d.ts.map +1 -1
- package/dist/esm/atoms/index.js +2 -0
- package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.js +167 -6
- package/dist/esm/components/canvas-grid/typings.d.ts +13 -4
- package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/helpers.d.ts +9 -0
- package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/helpers.js +6 -0
- package/dist/esm/components/cell-editor/helpers.spec.js +15 -1
- package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/index.js +7 -4
- package/dist/esm/components/fill-series-dialog/index.d.ts +29 -0
- package/dist/esm/components/fill-series-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/fill-series-dialog/index.js +151 -0
- package/dist/esm/components/selection/fill-options-menu.d.ts +32 -0
- package/dist/esm/components/selection/fill-options-menu.d.ts.map +1 -0
- package/dist/esm/components/selection/fill-options-menu.js +63 -0
- package/dist/esm/components/selection/index.d.ts +1 -1
- package/dist/esm/components/selection/index.d.ts.map +1 -1
- package/dist/esm/components/selection/index.js +4 -2
- package/dist/esm/components/selection/types.d.ts +11 -1
- package/dist/esm/components/selection/types.d.ts.map +1 -1
- package/dist/esm/components/toolbar/text-format-selector.d.ts +9 -0
- package/dist/esm/components/toolbar/text-format-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/text-format-selector.js +14 -2
- package/dist/esm/hooks/use-editable.d.ts +11 -2
- package/dist/esm/hooks/use-editable.d.ts.map +1 -1
- package/dist/esm/hooks/use-editable.js +8 -0
- package/dist/esm/hooks/use-editor-submit.d.ts +32 -3
- package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
- package/dist/esm/hooks/use-editor-submit.js +82 -3
- package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/esm/hooks/use-keyboard-handler.js +3 -2
- package/dist/esm/hooks/use-selection-renderer.d.ts +13 -2
- package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection-renderer.js +22 -5
- package/dist/esm/hooks/use-selection.d.ts +54 -4
- package/dist/esm/hooks/use-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection.js +220 -36
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -0
- package/dist/esm/release-date.js +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types.d.ts +39 -1
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/spreadsheet.min.css +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-editor-submit.d.ts","sourceRoot":"","sources":["../../../hooks/use-editor-submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"use-editor-submit.d.ts","sourceRoot":"","sources":["../../../hooks/use-editor-submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,KAAK,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnC,uFAAuF;AACvF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;CACxB,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,UAAU,EACjB,YAAY,aAAa,EACzB,MAAM,aAAa,KAClB,UAGQ,CAAC;AAwCZ;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,UAAU,EACjB,YAAY,aAAa,EACzB,YAAY,aAAa,CAAC,mBAAmB,CAAC,EAAE,KAC/C,cAAc,EAgBhB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,KAAK,EAAE,uBAAuB,CAAC;CAChC,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B;;OAEG;IACH,mBAAmB,EAAE,eAAe,CAAC,qBAAqB,CAAC,CAAC;IAC5D;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC;IAChE;;;;;OAKG;IACH,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACtC;;OAEG;IACH,UAAU,CAAC,IAAI,IAAI,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAClD;;;;OAIG;IACH,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACjD;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GAAG,OAAO,EACvB,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,KAC/C,gBAAgB,GAAG,SAAS,CAAC;IAClC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,6IAU7B,oBAAoB,aAQV,MAAM,GAAG,OAAO,kBACP,aAAa,EAAE,GAAG,SAAS,GAAG,IAAI,iBACnC,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,kBAClC,MAAM,cACV,aAAa,mBACR,aAAa,GAAG,IAAI,YAC3B,OAAO,YACP,mBAAmB,kBA8GlC,CAAC"}
|
|
@@ -1,12 +1,82 @@
|
|
|
1
|
-
import { balanceFormula } from "@rowsncolumns/utils";
|
|
2
|
-
import { useCallback } from "react";
|
|
1
|
+
import { balanceFormula, formulaToRelativeReference } from "@rowsncolumns/utils";
|
|
2
|
+
import { useCallback, useRef } from "react";
|
|
3
3
|
import { useSetActiveEditor } from "../atoms";
|
|
4
4
|
import { useEditingCell } from "../atoms/editing-cell.atom";
|
|
5
5
|
import { useFormulaMode } from "../atoms/formula-mode.atom";
|
|
6
|
-
|
|
6
|
+
const isFormulaEntry = (value) => typeof value === "string" && value.startsWith("=");
|
|
7
|
+
/**
|
|
8
|
+
* The value Ctrl+Enter writes into `cell` for an entry typed at `activeCell`: constants verbatim,
|
|
9
|
+
* formulas with their relative references shifted by the cell offset — exactly what a copy-fill
|
|
10
|
+
* from the active cell would produce (`=A1` typed in B2 with B2:B4 selected → B3 gets `=A2`).
|
|
11
|
+
*/
|
|
12
|
+
export const entryValueForCell = (value, activeCell, cell) => isFormulaEntry(value)
|
|
13
|
+
? (formulaToRelativeReference(value, activeCell, cell) ?? value)
|
|
14
|
+
: value;
|
|
15
|
+
/**
|
|
16
|
+
* Rectangles of `range` minus `cell` (up to four: above, below, left, right of the cell's row),
|
|
17
|
+
* or `range` itself when the cell is outside it. Lets the batch write skip the active cell, which
|
|
18
|
+
* the ordinary commit already wrote with its rich-text runs and validation.
|
|
19
|
+
*/
|
|
20
|
+
const rectanglesExcluding = (range, cell) => {
|
|
21
|
+
const inside = cell.rowIndex >= range.startRowIndex &&
|
|
22
|
+
cell.rowIndex <= range.endRowIndex &&
|
|
23
|
+
cell.columnIndex >= range.startColumnIndex &&
|
|
24
|
+
cell.columnIndex <= range.endColumnIndex;
|
|
25
|
+
if (!inside)
|
|
26
|
+
return [range];
|
|
27
|
+
const rects = [];
|
|
28
|
+
if (cell.rowIndex > range.startRowIndex) {
|
|
29
|
+
rects.push({ ...range, endRowIndex: cell.rowIndex - 1 });
|
|
30
|
+
}
|
|
31
|
+
if (cell.rowIndex < range.endRowIndex) {
|
|
32
|
+
rects.push({ ...range, startRowIndex: cell.rowIndex + 1 });
|
|
33
|
+
}
|
|
34
|
+
if (cell.columnIndex > range.startColumnIndex) {
|
|
35
|
+
rects.push({
|
|
36
|
+
...range,
|
|
37
|
+
startRowIndex: cell.rowIndex,
|
|
38
|
+
endRowIndex: cell.rowIndex,
|
|
39
|
+
endColumnIndex: cell.columnIndex - 1,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (cell.columnIndex < range.endColumnIndex) {
|
|
43
|
+
rects.push({
|
|
44
|
+
...range,
|
|
45
|
+
startRowIndex: cell.rowIndex,
|
|
46
|
+
endRowIndex: cell.rowIndex,
|
|
47
|
+
startColumnIndex: cell.columnIndex + 1,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return rects;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Plan the Ctrl+Enter writes for `selections`: every selected cell except `activeCell` (already
|
|
54
|
+
* committed) gets the entry, formulas shifted per cell. Empty when nothing but the active cell is
|
|
55
|
+
* selected — a single-cell Ctrl+Enter is just an in-place commit.
|
|
56
|
+
*/
|
|
57
|
+
export const planEntryFill = (value, activeCell, selections) => {
|
|
58
|
+
const writes = [];
|
|
59
|
+
for (const selection of selections) {
|
|
60
|
+
for (const range of rectanglesExcluding(selection.range, activeCell)) {
|
|
61
|
+
const values = [];
|
|
62
|
+
for (let r = range.startRowIndex; r <= range.endRowIndex; r++) {
|
|
63
|
+
const row = [];
|
|
64
|
+
for (let c = range.startColumnIndex; c <= range.endColumnIndex; c++) {
|
|
65
|
+
row.push(entryValueForCell(value, activeCell, { rowIndex: r, columnIndex: c }));
|
|
66
|
+
}
|
|
67
|
+
values.push(row);
|
|
68
|
+
}
|
|
69
|
+
writes.push({ range, values });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return writes;
|
|
73
|
+
};
|
|
74
|
+
export const useEditorSubmit = ({ sheetId, onChangeActiveSheet, setActiveCell, onChange, onComplete, getCommitValidation, showValidationAlert, selections, onChangeBatch, }) => {
|
|
7
75
|
const [formulaMode, setFormulaMode] = useFormulaMode();
|
|
8
76
|
const [_, setEditingCellCoordinate] = useEditingCell();
|
|
9
77
|
const setActiveEditor = useSetActiveEditor();
|
|
78
|
+
const selectionsRef = useRef(selections);
|
|
79
|
+
selectionsRef.current = selections;
|
|
10
80
|
return useCallback(async (value, textFormatRuns, previousValue, editingSheetId, activeCell, nextActiveCell, isDirty, options) => {
|
|
11
81
|
/* Balance parentheses */
|
|
12
82
|
if (formulaMode && typeof value !== "boolean") {
|
|
@@ -22,6 +92,14 @@ export const useEditorSubmit = ({ sheetId, onChangeActiveSheet, setActiveCell, o
|
|
|
22
92
|
/* Commit the value and advance to the next cell */
|
|
23
93
|
const commit = () => {
|
|
24
94
|
onChange?.(editingSheetId, activeCell, value, textFormatRuns, previousValue, isDirty);
|
|
95
|
+
// Ctrl+Enter: the same entry into every other selected cell (formulas shift per cell).
|
|
96
|
+
// Explicit per-cell values — never a read-back of the cell just written — so the spread
|
|
97
|
+
// is correct even when the engine applies `onChange` asynchronously (legacy setState).
|
|
98
|
+
if (options?.fillSelection && onChangeBatch) {
|
|
99
|
+
for (const write of planEntryFill(value, activeCell, selectionsRef.current ?? [])) {
|
|
100
|
+
onChangeBatch(editingSheetId, write.range, write.values);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
25
103
|
// Switch to active sheet
|
|
26
104
|
// Always change sheet first.
|
|
27
105
|
// Skipped when the submit was triggered *by* a sheet change — the
|
|
@@ -79,5 +157,6 @@ export const useEditorSubmit = ({ sheetId, onChangeActiveSheet, setActiveCell, o
|
|
|
79
157
|
sheetId,
|
|
80
158
|
getCommitValidation,
|
|
81
159
|
showValidationAlert,
|
|
160
|
+
onChangeBatch,
|
|
82
161
|
]);
|
|
83
162
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-keyboard-handler.d.ts","sourceRoot":"","sources":["../../../hooks/use-keyboard-handler.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"use-keyboard-handler.d.ts","sourceRoot":"","sources":["../../../hooks/use-keyboard-handler.tsx"],"names":[],"mappings":"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"}
|
|
@@ -270,9 +270,10 @@ onCalculateNow, onRequestGoTo, onRequestPasteSpecial, onChangeBatch, getUserEnte
|
|
|
270
270
|
onClearFormatting?.(sheetId, activeCell, selections);
|
|
271
271
|
e.preventDefault();
|
|
272
272
|
break;
|
|
273
|
-
// Cmd/Ctrl + Enter
|
|
273
|
+
// Cmd/Ctrl + Enter outside edit mode does nothing (Excel): the "fill the entry into
|
|
274
|
+
// every selected cell" behaviour only exists WHILE editing and is handled by the cell
|
|
275
|
+
// editor's submit path (see `EditorSubmitOptions.fillSelection`).
|
|
274
276
|
case "Enter":
|
|
275
|
-
onFillRange?.(sheetId, activeCell, selections);
|
|
276
277
|
break;
|
|
277
278
|
// Cmd/Ctrl + D
|
|
278
279
|
case "d":
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type CellInterface, type SelectionArea, type SelectionProps } from "@rowsncolumns/grid";
|
|
2
2
|
import React from "react";
|
|
3
|
+
import type { FillOptionsRequest } from "../atoms/fill-options.atom";
|
|
3
4
|
import type { CanvasGridProps, SelectionAttributes } from "../components/canvas-grid/typings";
|
|
4
5
|
import type { SelectionNewProps } from "../components/selection/types";
|
|
5
|
-
import type { SheetRange } from "../types";
|
|
6
|
+
import type { AutoFillType, SheetRange } from "../types";
|
|
6
7
|
import type { useFlash } from "./use-flash";
|
|
7
8
|
export type UseSelectionRendererProps = {
|
|
8
9
|
selectionCount: number;
|
|
@@ -36,11 +37,21 @@ export type UseSelectionRendererProps = {
|
|
|
36
37
|
SuggestionAction?: CanvasGridProps["SuggestionAction"];
|
|
37
38
|
readonly?: boolean;
|
|
38
39
|
showPasteMenu?: boolean;
|
|
40
|
+
/** Pending Auto Fill Options smart tag / right-drag fill menu (rendered on the fill target). */
|
|
41
|
+
fillOptions?: FillOptionsRequest | null;
|
|
42
|
+
onChooseFillType?(fillType: AutoFillType): void;
|
|
43
|
+
onOpenFillSeriesDialog?(): void;
|
|
44
|
+
onCloseFillOptions?(): void;
|
|
39
45
|
onSplitTextToColumns: CanvasGridProps["onSplitTextToColumns"];
|
|
40
46
|
hoveredCell?: CellInterface | null;
|
|
41
47
|
onRemoveQuickEdit(range: SheetRange): void;
|
|
42
48
|
onAddQuickEdit(range: SheetRange): void;
|
|
43
49
|
cachedHoveredSelectionIds: Set<string | number>;
|
|
50
|
+
/**
|
|
51
|
+
* The fill overlay currently shows a drag-BACK of the fill handle (cells that will be cleared on
|
|
52
|
+
* release): grey them out like Excel instead of the plain dashed fill outline.
|
|
53
|
+
*/
|
|
54
|
+
isFillShrink?: boolean;
|
|
44
55
|
};
|
|
45
|
-
export declare const useSelectionRenderer: ({ sheetId, selectionCount, selectionBackgroundColor, selectionBorderColor, onSelectionMouseDown, onChangeActiveCell, onChangeSelections, onRequestEditTable, onRequestEditPivotTable, onMouseDownResizeHandle, onMouseDownMoveSelection, isDraggingMoveSelection, onFlashEnd, getSheetName, resizeHandleSize, showSelectionResizeHandles, resizeHandleBorderColor, SelectionTitleComponent, isResizingTable, fillHandleSize, showFillHandle, enableMagicFill, MagicFillComponent, MagicFillContent, readonly, showPasteMenu, hoveredCell, onSplitTextToColumns, onRemoveQuickEdit, onAddQuickEdit, QuickEdit, PasteMenu, SuggestionAction, cachedHoveredSelectionIds, }: UseSelectionRendererProps) => (props: SelectionProps<SelectionAttributes>) => React.JSX.Element | null;
|
|
56
|
+
export declare const useSelectionRenderer: ({ sheetId, selectionCount, selectionBackgroundColor, selectionBorderColor, onSelectionMouseDown, onChangeActiveCell, onChangeSelections, onRequestEditTable, onRequestEditPivotTable, onMouseDownResizeHandle, onMouseDownMoveSelection, isDraggingMoveSelection, onFlashEnd, getSheetName, resizeHandleSize, showSelectionResizeHandles, resizeHandleBorderColor, SelectionTitleComponent, isResizingTable, fillHandleSize, showFillHandle, enableMagicFill, MagicFillComponent, MagicFillContent, readonly, showPasteMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, hoveredCell, onSplitTextToColumns, onRemoveQuickEdit, onAddQuickEdit, QuickEdit, PasteMenu, SuggestionAction, cachedHoveredSelectionIds, isFillShrink, }: UseSelectionRendererProps) => (props: SelectionProps<SelectionAttributes>) => React.JSX.Element | null;
|
|
46
57
|
//# sourceMappingURL=use-selection-renderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-selection-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"use-selection-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection-renderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { isCellWithinBounds, isEqualCells, } from "@rowsncolumns/grid";
|
|
1
|
+
import { isAreasEqual, isCellWithinBounds, isEqualCells, } from "@rowsncolumns/grid";
|
|
2
2
|
import React, { useCallback, useRef } from "react";
|
|
3
3
|
import { getSelectionFill, getSelectionFillOpacity, getSelectionStroke, getSelectionStrokeStyle, getSelectionStrokeWidth, } from "../api/selections";
|
|
4
4
|
import { useFormulaSelectionIndex } from "../atoms";
|
|
5
5
|
import { useFormulaModeValue } from "../atoms/formula-mode.atom";
|
|
6
6
|
import { DEFAULT_ACTIVE_CELL } from "../config";
|
|
7
7
|
import { Selection } from "./../components/selection";
|
|
8
|
-
|
|
8
|
+
/** Excel greys the cells a fill-handle drag-back is about to clear. */
|
|
9
|
+
const FILL_SHRINK_COLOR = "#808080";
|
|
10
|
+
const FILL_SHRINK_OPACITY = 0.25;
|
|
11
|
+
export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgroundColor, selectionBorderColor, onSelectionMouseDown, onChangeActiveCell, onChangeSelections, onRequestEditTable, onRequestEditPivotTable, onMouseDownResizeHandle, onMouseDownMoveSelection, isDraggingMoveSelection, onFlashEnd, getSheetName, resizeHandleSize = 6, showSelectionResizeHandles, resizeHandleBorderColor, SelectionTitleComponent, isResizingTable, fillHandleSize, showFillHandle, enableMagicFill, MagicFillComponent, MagicFillContent, readonly, showPasteMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, hoveredCell, onSplitTextToColumns, onRemoveQuickEdit, onAddQuickEdit, QuickEdit, PasteMenu, SuggestionAction, cachedHoveredSelectionIds, isFillShrink = false, }) => {
|
|
9
12
|
const formulaMode = useFormulaModeValue();
|
|
10
13
|
const selectionIndex = useFormulaSelectionIndex();
|
|
11
14
|
const hoveredCellRef = useRef(hoveredCell);
|
|
@@ -47,13 +50,17 @@ export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgro
|
|
|
47
50
|
: getSelectionStrokeWidth(formulaMode, isFill, isActiveCell, isResizingTable);
|
|
48
51
|
const fillOpacity = isBorder
|
|
49
52
|
? props.fillOpacity
|
|
50
|
-
:
|
|
53
|
+
: isFill && isFillShrink
|
|
54
|
+
? FILL_SHRINK_OPACITY
|
|
55
|
+
: getSelectionFillOpacity(formulaMode, isFill);
|
|
51
56
|
const stroke = isBorder
|
|
52
57
|
? props.stroke
|
|
53
58
|
: getSelectionStroke(formulaMode, isFill, isActiveCell, isEmptySelections, inProgress, selectionBorderColor, index);
|
|
54
59
|
const fill = isBorder
|
|
55
60
|
? props.fill
|
|
56
|
-
:
|
|
61
|
+
: isFill && isFillShrink
|
|
62
|
+
? FILL_SHRINK_COLOR
|
|
63
|
+
: getSelectionFill(formulaMode, isFill, isActiveCell, selectionBackgroundColor, index, isActiveIndex, isResizingTable);
|
|
57
64
|
return (React.createElement(Selection, { ...props, key: index,
|
|
58
65
|
// Overwrite draggable
|
|
59
66
|
draggable: isResizingTable ? false : draggable,
|
|
@@ -86,7 +93,12 @@ export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgro
|
|
|
86
93
|
onSelectionMouseDown?.(e, activeCell, newSelection, 0);
|
|
87
94
|
}
|
|
88
95
|
}
|
|
89
|
-
}, isHovered: isHovered, TitleComponent: SelectionTitleComponent, onRequestEditTable: onRequestEditTable, onRequestEditPivotTable: onRequestEditPivotTable, fillHandleSize: fillHandleSize, showFillHandle: showFillHandle, onFlashEnd: onFlashEnd, duration: duration, enableMagicFill: formulaMode ? false : enableMagicFill, MagicFillComponent: MagicFillComponent, readonly: readonly, showPasteMenu: showPasteMenu,
|
|
96
|
+
}, isHovered: isHovered, TitleComponent: SelectionTitleComponent, onRequestEditTable: onRequestEditTable, onRequestEditPivotTable: onRequestEditPivotTable, fillHandleSize: fillHandleSize, showFillHandle: showFillHandle, onFlashEnd: onFlashEnd, duration: duration, enableMagicFill: formulaMode ? false : enableMagicFill, MagicFillComponent: MagicFillComponent, readonly: readonly, showPasteMenu: showPasteMenu, fillOptions: fillOptions &&
|
|
97
|
+
range &&
|
|
98
|
+
fillOptions.sheetId === sheetId &&
|
|
99
|
+
isAreasEqual(fillOptions.fillSelection.range, range)
|
|
100
|
+
? fillOptions
|
|
101
|
+
: undefined, onChooseFillType: onChooseFillType, onOpenFillSeriesDialog: onOpenFillSeriesDialog, onCloseFillOptions: onCloseFillOptions, sheetId: sheetId, MagicFillContent: MagicFillContent, QuickEdit: QuickEdit, PasteMenu: PasteMenu, SuggestionAction: SuggestionAction, onSplitTextToColumns: (delimiter) => {
|
|
90
102
|
// Active cell
|
|
91
103
|
const newActiveCell = range
|
|
92
104
|
? {
|
|
@@ -127,6 +139,10 @@ export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgro
|
|
|
127
139
|
MagicFillComponent,
|
|
128
140
|
readonly,
|
|
129
141
|
showPasteMenu,
|
|
142
|
+
fillOptions,
|
|
143
|
+
onChooseFillType,
|
|
144
|
+
onOpenFillSeriesDialog,
|
|
145
|
+
onCloseFillOptions,
|
|
130
146
|
onSplitTextToColumns,
|
|
131
147
|
MagicFillContent,
|
|
132
148
|
QuickEdit,
|
|
@@ -135,5 +151,6 @@ export const useSelectionRenderer = ({ sheetId, selectionCount, selectionBackgro
|
|
|
135
151
|
onRemoveQuickEdit,
|
|
136
152
|
onAddQuickEdit,
|
|
137
153
|
cachedHoveredSelectionIds,
|
|
154
|
+
isFillShrink,
|
|
138
155
|
]);
|
|
139
156
|
};
|
|
@@ -2,7 +2,40 @@ import type { AreaStyle, CellInterface, GridRange, HiddenType, OptionalCellInter
|
|
|
2
2
|
import { Align } from "@rowsncolumns/grid";
|
|
3
3
|
import type React from "react";
|
|
4
4
|
import type { CanvasGridProps } from "../components/canvas-grid/typings";
|
|
5
|
-
import type { SheetRange } from "../types";
|
|
5
|
+
import type { AutoFillType, FillOptions, SheetRange } from "../types";
|
|
6
|
+
/**
|
|
7
|
+
* What the grid learns when a fill-handle gesture ends. For a left drag the
|
|
8
|
+
* fill has already been issued (`onFill`) and this lets the grid show Excel's
|
|
9
|
+
* Auto Fill Options smart tag; for a right-button drag NOTHING has been filled
|
|
10
|
+
* yet — the grid opens the fill menu and issues `onFill` with the chosen type.
|
|
11
|
+
*/
|
|
12
|
+
export type FillHandleRelease<T extends AreaStyle = AreaStyle> = {
|
|
13
|
+
sheetId: number;
|
|
14
|
+
activeCell: CellInterface;
|
|
15
|
+
/** Target range of the drag (source + filled area). */
|
|
16
|
+
fillSelection: SelectionArea;
|
|
17
|
+
/** Source selection the drag started from. */
|
|
18
|
+
selections: SelectionArea<T>[];
|
|
19
|
+
/** Ctrl (or Cmd on macOS) held when the handle was released. */
|
|
20
|
+
toggle: boolean;
|
|
21
|
+
button: "left" | "right";
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Modifier state of a fill-handle gesture (drag, double-click, drag-back). `"toggle"` = Ctrl
|
|
25
|
+
* (Cmd on Mac) was held: Excel flips copy↔series for a fill and clears formats too for a
|
|
26
|
+
* drag-back shrink.
|
|
27
|
+
*/
|
|
28
|
+
export type FillGestureOptions = {
|
|
29
|
+
modifier?: "toggle";
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* A fill-handle drag back INSIDE the selection: `clearRange` = the excluded cells Excel empties on
|
|
33
|
+
* release (rendered greyed while dragging), `remaining` = the selection that survives.
|
|
34
|
+
*/
|
|
35
|
+
export type FillShrink = {
|
|
36
|
+
clearRange: GridRange;
|
|
37
|
+
remaining: GridRange;
|
|
38
|
+
};
|
|
6
39
|
export type UseSelectionOptions<T extends AreaStyle = AreaStyle> = {
|
|
7
40
|
sheetId: number;
|
|
8
41
|
/**
|
|
@@ -34,9 +67,25 @@ export type UseSelectionOptions<T extends AreaStyle = AreaStyle> = {
|
|
|
34
67
|
*/
|
|
35
68
|
allowDeselectSelection?: boolean;
|
|
36
69
|
/**
|
|
37
|
-
* onFill
|
|
70
|
+
* onFill. `fillType` is only set when the user picked an entry from the
|
|
71
|
+
* fill menu; `options.modifier` is `"toggle"` when Ctrl/Cmd was held at
|
|
72
|
+
* release (Excel decides the copy↔series inversion on release, not press) —
|
|
73
|
+
* for a Ctrl+drag and a Ctrl+double-click of the fill handle alike.
|
|
74
|
+
*/
|
|
75
|
+
onFill?: (sheetId: number, activeCell: CellInterface, fillSelection: SelectionArea, selections: SelectionArea<T>[], fillableSelections?: SelectionArea<T>[], fillType?: AutoFillType, options?: FillOptions) => void;
|
|
76
|
+
/**
|
|
77
|
+
* Dragging the fill handle BACK inside a multi-cell selection (up or left, without passing its
|
|
78
|
+
* first row/column) excludes the dragged-over cells: Excel clears their contents (formats kept;
|
|
79
|
+
* Ctrl+drag also clears formats) and shrinks the selection to `remaining`. Called on mouse-up with
|
|
80
|
+
* the cells to clear; the hook then publishes `remaining` through `onChangeSelections`.
|
|
81
|
+
*/
|
|
82
|
+
onFillShrink?: (sheetId: number, activeCell: CellInterface, clearRange: GridRange, options?: FillGestureOptions) => void;
|
|
83
|
+
/**
|
|
84
|
+
* Fired when a fill-handle drag ends (after `onFill` for a left drag; INSTEAD
|
|
85
|
+
* of `onFill` for a right-button drag). Lets the grid show the Auto Fill
|
|
86
|
+
* Options smart tag / right-drag fill menu.
|
|
38
87
|
*/
|
|
39
|
-
|
|
88
|
+
onFillHandleRelease?: (release: FillHandleRelease<T>) => void;
|
|
40
89
|
/**
|
|
41
90
|
* Hidden rows
|
|
42
91
|
*/
|
|
@@ -150,7 +199,7 @@ export type NewSelectionMode = "clear" | "modify" | "append";
|
|
|
150
199
|
* Hook to enable selection in datagrid
|
|
151
200
|
* @param initialSelection
|
|
152
201
|
*/
|
|
153
|
-
export declare const useSelection: <T extends AreaStyle>({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount, rowCount, selectionPolicy, newSelectionMode, allowDeselectSelection, onFill, isHiddenRow, isHiddenColumn, alwaysScrollToActiveCell, selectionTopBound, selectionBottomBound, selectionLeftBound, selectionRightBound, mouseDownInterceptor, mouseMoveInterceptor, mergedCells, canSelectionSpanMergedCells, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, isRowHeader, isColumnHeader, enableDataBoundaryNavigation, }: UseSelectionOptions<T>) => {
|
|
202
|
+
export declare const useSelection: <T extends AreaStyle>({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount, rowCount, selectionPolicy, newSelectionMode, allowDeselectSelection, onFill, onFillHandleRelease, onFillShrink, isHiddenRow, isHiddenColumn, alwaysScrollToActiveCell, selectionTopBound, selectionBottomBound, selectionLeftBound, selectionRightBound, mouseDownInterceptor, mouseMoveInterceptor, mergedCells, canSelectionSpanMergedCells, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, isRowHeader, isColumnHeader, enableDataBoundaryNavigation, }: UseSelectionOptions<T>) => {
|
|
154
203
|
isDragging: boolean;
|
|
155
204
|
draggedSelection: SelectionArea<T> | undefined;
|
|
156
205
|
initialDraggedSelection: SelectionArea<T> | undefined;
|
|
@@ -164,6 +213,7 @@ export declare const useSelection: <T extends AreaStyle>({ sheetId, activeCell,
|
|
|
164
213
|
onFillHandleMouseDown: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
165
214
|
onFillHandleDoubleClick: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
166
215
|
fillSelection: SelectionArea | undefined;
|
|
216
|
+
fillShrink: FillShrink | undefined;
|
|
167
217
|
clearLastSelection: () => void;
|
|
168
218
|
modifySelection: (coords: CellInterface, setInProgress?: boolean) => void;
|
|
169
219
|
selectAll: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,aAAa,EACd,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,KAAK,EAcN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"use-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection.ts"],"names":[],"mappings":"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"}
|