@rowsncolumns/spreadsheet 10.4.2 → 10.4.5
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/atoms/sheet-context.atom.d.ts +2 -0
- package/dist/cjs/atoms/sheet-context.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/sheet-context.atom.js +8 -2
- package/dist/cjs/atoms/sort-dialog.atom.d.ts +6 -2
- package/dist/cjs/atoms/sort-dialog.atom.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.js +4 -2
- package/dist/cjs/components/canvas-grid/typings.d.ts +10 -0
- package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/index.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/index.js +14 -3
- package/dist/cjs/components/sheet-tabs/index.d.ts.map +1 -1
- package/dist/cjs/components/sheet-tabs/index.js +19 -5
- package/dist/cjs/components/sort-range-dialog/index.d.ts +20 -3
- package/dist/cjs/components/sort-range-dialog/index.d.ts.map +1 -1
- package/dist/cjs/components/sort-range-dialog/index.js +20 -6
- package/dist/cjs/components/toolbar/cell-style-selector.d.ts +9 -0
- package/dist/cjs/components/toolbar/cell-style-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/cell-style-selector.js +12 -3
- package/dist/cjs/components/toolbar/merge-cells-selector.d.ts +27 -1
- package/dist/cjs/components/toolbar/merge-cells-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/merge-cells-selector.js +106 -8
- package/dist/cjs/components/toolbar/text-format-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/text-format-selector.js +15 -11
- package/dist/cjs/config.d.ts +6 -0
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +7 -1
- package/dist/cjs/hooks/use-conditional-formatting.d.ts +8 -0
- package/dist/cjs/hooks/use-conditional-formatting.d.ts.map +1 -1
- package/dist/cjs/hooks/use-conditional-formatting.js +128 -77
- package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editable.js +59 -1
- package/dist/cjs/hooks/use-selection.d.ts +6 -1
- package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection.js +37 -1
- package/dist/cjs/release-date.js +1 -1
- package/dist/cjs/types.d.ts +54 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/atoms/sheet-context.atom.d.ts +2 -0
- package/dist/esm/atoms/sheet-context.atom.d.ts.map +1 -1
- package/dist/esm/atoms/sheet-context.atom.js +3 -0
- package/dist/esm/atoms/sort-dialog.atom.d.ts +6 -2
- package/dist/esm/atoms/sort-dialog.atom.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.js +3 -1
- package/dist/esm/components/canvas-grid/typings.d.ts +10 -0
- package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/esm/components/filter-box/index.d.ts.map +1 -1
- package/dist/esm/components/filter-box/index.js +14 -3
- package/dist/esm/components/sheet-tabs/index.d.ts.map +1 -1
- package/dist/esm/components/sheet-tabs/index.js +20 -6
- package/dist/esm/components/sort-range-dialog/index.d.ts +20 -3
- package/dist/esm/components/sort-range-dialog/index.d.ts.map +1 -1
- package/dist/esm/components/sort-range-dialog/index.js +17 -5
- package/dist/esm/components/toolbar/cell-style-selector.d.ts +9 -0
- package/dist/esm/components/toolbar/cell-style-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/cell-style-selector.js +11 -2
- package/dist/esm/components/toolbar/merge-cells-selector.d.ts +27 -1
- package/dist/esm/components/toolbar/merge-cells-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/merge-cells-selector.js +94 -10
- package/dist/esm/components/toolbar/text-format-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/text-format-selector.js +5 -1
- package/dist/esm/config.d.ts +6 -0
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +6 -0
- package/dist/esm/hooks/use-conditional-formatting.d.ts +8 -0
- package/dist/esm/hooks/use-conditional-formatting.d.ts.map +1 -1
- package/dist/esm/hooks/use-conditional-formatting.js +50 -13
- package/dist/esm/hooks/use-editable.d.ts.map +1 -1
- package/dist/esm/hooks/use-editable.js +48 -2
- package/dist/esm/hooks/use-selection.d.ts +6 -1
- package/dist/esm/hooks/use-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection.js +37 -1
- package/dist/esm/release-date.js +1 -1
- package/dist/esm/types.d.ts +54 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/spreadsheet.min.css +1 -1
- package/package.json +5 -5
|
@@ -1,12 +1,82 @@
|
|
|
1
1
|
import { areaIntersects, Direction, isEqualCells } from "@rowsncolumns/grid";
|
|
2
|
-
import { AiOutlineMergeCells, MdOutlineArrowDropDown, } from "@rowsncolumns/icons";
|
|
3
|
-
import { DropdownMenuPortal, IconButton, Stack } from "@rowsncolumns/ui";
|
|
2
|
+
import { AiOutlineMergeCells, Cross2Icon, MdOutlineArrowDropDown, } from "@rowsncolumns/icons";
|
|
3
|
+
import { Button, Dialog, DialogBody, DialogClose, DialogCloseButton, DialogContent, DialogDescription, DialogTitle, DropdownMenuPortal, IconButton, Stack, } from "@rowsncolumns/ui";
|
|
4
4
|
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@rowsncolumns/ui";
|
|
5
|
-
import React from "react";
|
|
6
|
-
import { useFocusSheet } from "../../atoms";
|
|
5
|
+
import React, { useState } from "react";
|
|
6
|
+
import { useFocusSheet, useGetFormattedValue } from "../../atoms";
|
|
7
7
|
import { DEFAULT_ARRAY } from "../../config";
|
|
8
|
-
|
|
8
|
+
/** Excel's wording for a merge that would drop cell values. */
|
|
9
|
+
export const MERGE_DISCARDS_VALUES_TITLE = "Merge cells";
|
|
10
|
+
export const MERGE_DISCARDS_VALUES_MESSAGE = "Merging cells only keeps the upper-left value and discards other values.";
|
|
11
|
+
/**
|
|
12
|
+
* The regions `onMergeCells` merges for a toolbar request: each row (merge
|
|
13
|
+
* horizontally), each column (merge vertically), every area of a multi-area
|
|
14
|
+
* selection, or the last selection as one block — the store action's own rules.
|
|
15
|
+
*/
|
|
16
|
+
export const mergeRegionsForSelection = (selections, direction) => {
|
|
17
|
+
if (!selections.length)
|
|
18
|
+
return [];
|
|
19
|
+
const { range } = selections[selections.length - 1];
|
|
20
|
+
if (direction === Direction.Right) {
|
|
21
|
+
const rows = [];
|
|
22
|
+
for (let r = range.startRowIndex; r <= range.endRowIndex; r++) {
|
|
23
|
+
rows.push({ ...range, startRowIndex: r, endRowIndex: r });
|
|
24
|
+
}
|
|
25
|
+
return rows;
|
|
26
|
+
}
|
|
27
|
+
if (direction === Direction.Down) {
|
|
28
|
+
const cols = [];
|
|
29
|
+
for (let c = range.startColumnIndex; c <= range.endColumnIndex; c++) {
|
|
30
|
+
cols.push({ ...range, startColumnIndex: c, endColumnIndex: c });
|
|
31
|
+
}
|
|
32
|
+
return cols;
|
|
33
|
+
}
|
|
34
|
+
if (selections.length > 1)
|
|
35
|
+
return selections.map((sel) => sel.range);
|
|
36
|
+
return [range];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Would this merge discard values? Excel warns when more than one cell of a
|
|
40
|
+
* merged block holds a value (the merge keeps only the upper-left one). A
|
|
41
|
+
* headless / programmatic merge never asks — this gate lives in the toolbar.
|
|
42
|
+
*/
|
|
43
|
+
export const mergeDiscardsValues = ({ sheetId, selections, direction, getFormattedValue, }) => {
|
|
44
|
+
for (const region of mergeRegionsForSelection(selections, direction)) {
|
|
45
|
+
let filled = 0;
|
|
46
|
+
for (let r = region.startRowIndex; r <= region.endRowIndex; r++) {
|
|
47
|
+
for (let c = region.startColumnIndex; c <= region.endColumnIndex; c++) {
|
|
48
|
+
const value = getFormattedValue(sheetId, r, c);
|
|
49
|
+
if (value !== null && value !== undefined && value !== "") {
|
|
50
|
+
filled++;
|
|
51
|
+
if (filled > 1)
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
};
|
|
59
|
+
export const MergeCellsSelector = ({ activeCell, selections = DEFAULT_ARRAY, sheetId, merges, tables, onMerge, onUnMerge, getFormattedValue: getFormattedValueProp, }) => {
|
|
9
60
|
const focusSheet = useFocusSheet();
|
|
61
|
+
const gridGetFormattedValue = useGetFormattedValue();
|
|
62
|
+
const getFormattedValue = getFormattedValueProp ?? gridGetFormattedValue;
|
|
63
|
+
// A merge waiting on the "discards other values" confirmation.
|
|
64
|
+
const [pendingMerge, setPendingMerge] = useState(null);
|
|
65
|
+
const requestMerge = (direction) => {
|
|
66
|
+
if (getFormattedValue &&
|
|
67
|
+
mergeDiscardsValues({ sheetId, selections, direction, getFormattedValue })) {
|
|
68
|
+
setPendingMerge({ direction });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
onMerge(sheetId, activeCell, selections, direction);
|
|
72
|
+
};
|
|
73
|
+
const confirmPendingMerge = () => {
|
|
74
|
+
if (pendingMerge) {
|
|
75
|
+
onMerge(sheetId, activeCell, selections, pendingMerge.direction);
|
|
76
|
+
}
|
|
77
|
+
setPendingMerge(null);
|
|
78
|
+
focusSheet?.();
|
|
79
|
+
};
|
|
10
80
|
const isMerged = !!merges?.find((merge) => isEqualCells({ rowIndex: merge.startRowIndex, columnIndex: merge.startColumnIndex }, activeCell));
|
|
11
81
|
const selection = selections[selections.length - 1];
|
|
12
82
|
// Excel greys the merge controls out for a selection that touches a table.
|
|
@@ -23,7 +93,7 @@ export const MergeCellsSelector = ({ activeCell, selections = DEFAULT_ARRAY, she
|
|
|
23
93
|
onUnMerge(sheetId, activeCell, selections);
|
|
24
94
|
}
|
|
25
95
|
else {
|
|
26
|
-
|
|
96
|
+
requestMerge();
|
|
27
97
|
}
|
|
28
98
|
}, isActive: isMerged, tooltip: isMerged ? "Unmerge All" : "Merge all", disabled: disableMenu },
|
|
29
99
|
React.createElement(AiOutlineMergeCells, null)),
|
|
@@ -34,19 +104,33 @@ export const MergeCellsSelector = ({ activeCell, selections = DEFAULT_ARRAY, she
|
|
|
34
104
|
React.createElement(DropdownMenuPortal, null,
|
|
35
105
|
React.createElement(DropdownMenuContent, { align: "end" },
|
|
36
106
|
React.createElement(DropdownMenuItem, { disabled: isMerged || selectionTouchesTable, onClick: () => {
|
|
37
|
-
|
|
107
|
+
requestMerge();
|
|
38
108
|
focusSheet?.();
|
|
39
109
|
} }, "Merge all"),
|
|
40
110
|
React.createElement(DropdownMenuItem, { disabled: isMerged || selectionTouchesTable || !canMergeVertically, onClick: () => {
|
|
41
|
-
|
|
111
|
+
requestMerge(Direction.Down);
|
|
42
112
|
focusSheet?.();
|
|
43
113
|
} }, "Merge vertically"),
|
|
44
114
|
React.createElement(DropdownMenuItem, { onClick: () => {
|
|
45
|
-
|
|
115
|
+
requestMerge(Direction.Right);
|
|
46
116
|
focusSheet?.();
|
|
47
117
|
}, disabled: isMerged || selectionTouchesTable || !canMergeHorizontally }, "Merge horizontally"),
|
|
48
118
|
React.createElement(DropdownMenuItem, { disabled: !isMerged, onClick: () => {
|
|
49
119
|
onUnMerge(sheetId, activeCell, selections);
|
|
50
120
|
focusSheet?.();
|
|
51
|
-
} }, "Unmerge"))))
|
|
121
|
+
} }, "Unmerge")))),
|
|
122
|
+
React.createElement(Dialog, { modal: true, open: pendingMerge !== null, onOpenChange: (open) => {
|
|
123
|
+
if (!open)
|
|
124
|
+
setPendingMerge(null);
|
|
125
|
+
} },
|
|
126
|
+
React.createElement(DialogContent, null,
|
|
127
|
+
React.createElement(DialogTitle, null, MERGE_DISCARDS_VALUES_TITLE),
|
|
128
|
+
React.createElement(DialogDescription, null, MERGE_DISCARDS_VALUES_MESSAGE),
|
|
129
|
+
React.createElement(DialogBody, null,
|
|
130
|
+
React.createElement(Stack, { className: "gap-2" },
|
|
131
|
+
React.createElement(Button, { variant: "primary", onClick: confirmPendingMerge }, "Continue"),
|
|
132
|
+
React.createElement(Button, { onClick: () => setPendingMerge(null) }, "Cancel"))),
|
|
133
|
+
React.createElement(DialogClose, { asChild: true },
|
|
134
|
+
React.createElement(DialogCloseButton, null,
|
|
135
|
+
React.createElement(Cross2Icon, null)))))));
|
|
52
136
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-format-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/text-format-selector.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAe,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAIvE,CAAC;AAEJ,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,CAAC,CAAC,SAAS,MAAM,UAAU,EAC7C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;IACV,oBAAoB,CAAC,IAAI,IAAI,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,0GAO1B,uBAAuB,
|
|
1
|
+
{"version":3,"file":"text-format-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/text-format-selector.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAe,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAIvE,CAAC;AAEJ,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,CAAC,CAAC,SAAS,MAAM,UAAU,EAC7C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;IACV,oBAAoB,CAAC,IAAI,IAAI,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,0GAO1B,uBAAuB,uBAyY3B,CAAC"}
|
|
@@ -43,7 +43,11 @@ export const TextFormatSelector = memo(({ locale = "en-US", currency = "USD", ce
|
|
|
43
43
|
const longDate = ssfFormat(longDateFormat, sampleDate, locale);
|
|
44
44
|
const dateTime = ssfFormat(dateTimePattern, sampleDate, locale);
|
|
45
45
|
const durationPattern = `[$-${locale}][h]:mm:ss`;
|
|
46
|
-
|
|
46
|
+
// A typed duration (`25:00`) is auto-formatted `[h]:mm:ss` without the
|
|
47
|
+
// locale tag this item applies, so match the pattern with the tag
|
|
48
|
+
// stripped — either way the cell is a Duration (rowsncolumns/spreadsheet#1027).
|
|
49
|
+
const isDurationPattern = cellFormat?.numberFormat?.pattern?.replace(/^\[\$-[^\]]*\]/, "") ===
|
|
50
|
+
"[h]:mm:ss";
|
|
47
51
|
const currencyRoundedPattern = `"${currencySymbol}"#,##0`;
|
|
48
52
|
const isCurrencyRounded = cellFormat?.numberFormat?.pattern === currencyRoundedPattern;
|
|
49
53
|
return (React.createElement(DropdownMenu, { modal: false },
|
package/dist/esm/config.d.ts
CHANGED
|
@@ -112,4 +112,10 @@ export declare const IndexedColors: readonly string[];
|
|
|
112
112
|
* partial area, Cut, Copy of areas that do not line up (#647 UI-07).
|
|
113
113
|
*/
|
|
114
114
|
export declare const MULTIPLE_SELECTIONS_ERROR = "That command cannot be used on multiple selections.";
|
|
115
|
+
/**
|
|
116
|
+
* Excel's refusal for Copy / Cut of a multi-area (Ctrl-click) selection it
|
|
117
|
+
* cannot lay out as one rectangle: areas that share neither the same rows nor
|
|
118
|
+
* the same columns, or a cut of more than one area (#37265 E10).
|
|
119
|
+
*/
|
|
120
|
+
export declare const MULTIPLE_SELECTIONS_CLIPBOARD_ERROR = "This action won't work on multiple selections.";
|
|
115
121
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/esm/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/config.js
CHANGED
|
@@ -300,3 +300,9 @@ export const IndexedColors = Object.freeze([
|
|
|
300
300
|
* partial area, Cut, Copy of areas that do not line up (#647 UI-07).
|
|
301
301
|
*/
|
|
302
302
|
export const MULTIPLE_SELECTIONS_ERROR = "That command cannot be used on multiple selections.";
|
|
303
|
+
/**
|
|
304
|
+
* Excel's refusal for Copy / Cut of a multi-area (Ctrl-click) selection it
|
|
305
|
+
* cannot lay out as one rectangle: areas that share neither the same rows nor
|
|
306
|
+
* the same columns, or a cut of more than one area (#37265 E10).
|
|
307
|
+
*/
|
|
308
|
+
export const MULTIPLE_SELECTIONS_CLIPBOARD_ERROR = "This action won't work on multiple selections.";
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { type GridRange } from "@rowsncolumns/grid";
|
|
2
2
|
import type { CanvasGridProps, SpreadsheetTheme } from "../components/canvas-grid/typings";
|
|
3
3
|
import type { CellData, CellFormat, ConditionalFormatRule, CustomFormulaResult } from "../types";
|
|
4
|
+
/**
|
|
5
|
+
* Merge a lower-priority rule's format under an already-applied one, per
|
|
6
|
+
* property (Excel's stacking): every property the higher-priority format
|
|
7
|
+
* left unset is taken from `lower`; a property both set keeps `higher`'s
|
|
8
|
+
* value. `textFormat` and `borders` merge one level deeper for the same
|
|
9
|
+
* reason — rule 1's font colour and rule 2's bold both apply.
|
|
10
|
+
*/
|
|
11
|
+
export declare const layerConditionalFormat: (higher: CellFormat, lower: CellFormat) => CellFormat;
|
|
4
12
|
export type UseConditionalFormattingProps<T extends CellData> = {
|
|
5
13
|
sheetId: number;
|
|
6
14
|
theme: SpreadsheetTheme;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-conditional-formatting.d.ts","sourceRoot":"","sources":["../../../hooks/use-conditional-formatting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoBpE,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS,QAAQ,IAAI;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;IACxB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,qBAAqB,KACzB,mBAAmB,CAAC;IACzB,aAAa,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACX,gBAAgB,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACtD,mBAAmB,EAAE,eAAe,CAAC,qBAAqB,CAAC,CAAC;IAC5D;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B;;;;;;;;;OASG;IACH,0BAA0B,CAAC,EAAE,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,qBAAqB,CAAC,IAAI,CAAC,KAChC,OAAO,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,QAAQ,EAAE,iLAW1D,6BAA6B,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"use-conditional-formatting.d.ts","sourceRoot":"","sources":["../../../hooks/use-conditional-formatting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoBpE,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAGlB;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GACjC,QAAQ,UAAU,EAClB,OAAO,UAAU,KAChB,UAYF,CAAC;AAaF,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS,QAAQ,IAAI;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;IACxB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,qBAAqB,KACzB,mBAAmB,CAAC;IACzB,aAAa,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACX,gBAAgB,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACtD,mBAAmB,EAAE,eAAe,CAAC,qBAAqB,CAAC,CAAC;IAC5D;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B;;;;;;;;;OASG;IACH,0BAA0B,CAAC,EAAE,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,qBAAqB,CAAC,IAAI,CAAC,KAChC,OAAO,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,QAAQ,EAAE,iLAW1D,6BAA6B,CAAC,CAAC,CAAC,wCA0pBlC,CAAC"}
|
|
@@ -9,6 +9,36 @@ import { getGradientColors } from "../api/heatmap";
|
|
|
9
9
|
import { checkBooleanRule, shouldUsePreviousValue } from "../api/validation";
|
|
10
10
|
import { getStringifiedColor } from "../themes";
|
|
11
11
|
import { DEFAULT_COLUMN_COUNT, DEFAULT_ROW_COUNT } from "../config";
|
|
12
|
+
/**
|
|
13
|
+
* Merge a lower-priority rule's format under an already-applied one, per
|
|
14
|
+
* property (Excel's stacking): every property the higher-priority format
|
|
15
|
+
* left unset is taken from `lower`; a property both set keeps `higher`'s
|
|
16
|
+
* value. `textFormat` and `borders` merge one level deeper for the same
|
|
17
|
+
* reason — rule 1's font colour and rule 2's bold both apply.
|
|
18
|
+
*/
|
|
19
|
+
export const layerConditionalFormat = (higher, lower) => {
|
|
20
|
+
const merged = { ...lower, ...definedEntries(higher) };
|
|
21
|
+
if (higher.textFormat && lower.textFormat) {
|
|
22
|
+
merged.textFormat = {
|
|
23
|
+
...lower.textFormat,
|
|
24
|
+
...definedEntries(higher.textFormat),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (higher.borders && lower.borders) {
|
|
28
|
+
merged.borders = { ...lower.borders, ...definedEntries(higher.borders) };
|
|
29
|
+
}
|
|
30
|
+
return merged;
|
|
31
|
+
};
|
|
32
|
+
/** `obj` without its `undefined` / `null` entries, so they never mask a lower rule's value in a spread. */
|
|
33
|
+
const definedEntries = (obj) => {
|
|
34
|
+
const out = {};
|
|
35
|
+
for (const key of Object.keys(obj)) {
|
|
36
|
+
if (!isNil(obj[key])) {
|
|
37
|
+
out[key] = obj[key];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
};
|
|
12
42
|
export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, locale, getValidationValue, isNumberValue, getSheetRowCount, getSheetColumnCount, window: evaluationWindow, getConditionalFormatResult, }) => {
|
|
13
43
|
const previousEffectiveValueMap = useRef(undefined);
|
|
14
44
|
// Lazy initialization
|
|
@@ -70,6 +100,19 @@ export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, l
|
|
|
70
100
|
.map((rule) => rule.id))
|
|
71
101
|
: undefined;
|
|
72
102
|
const stopCells = new Set();
|
|
103
|
+
// Layer a rule's format onto whatever higher-priority rules already
|
|
104
|
+
// painted on the cell. Excel stacks true rules per PROPERTY: a fill from
|
|
105
|
+
// rule 1 and bold from rule 2 both show, and when two true rules set the
|
|
106
|
+
// same property the higher-priority one (evaluated first here) wins —
|
|
107
|
+
// so the existing value is kept and only the gaps are filled in.
|
|
108
|
+
const layerFormat = (cellId, format) => {
|
|
109
|
+
const existing = formattingByCell.get(cellId);
|
|
110
|
+
if (!existing || !format) {
|
|
111
|
+
formattingByCell.set(cellId, existing ?? format);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
formattingByCell.set(cellId, layerConditionalFormat(existing, format));
|
|
115
|
+
};
|
|
73
116
|
// Consume the engine's per-cell stamps for an aggregate rule over one
|
|
74
117
|
// (possibly window-intersected) range — cells outside the window aren't
|
|
75
118
|
// visible, and the stamps already carry the FULL-range aggregate result.
|
|
@@ -82,7 +125,7 @@ export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, l
|
|
|
82
125
|
if (stopCells.has(cellId)) {
|
|
83
126
|
continue;
|
|
84
127
|
}
|
|
85
|
-
|
|
128
|
+
layerFormat(cellId, format);
|
|
86
129
|
if (rule.stopIfTrue) {
|
|
87
130
|
stopCells.add(cellId);
|
|
88
131
|
}
|
|
@@ -173,7 +216,7 @@ export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, l
|
|
|
173
216
|
if (stopCells.has(cellId)) {
|
|
174
217
|
continue;
|
|
175
218
|
}
|
|
176
|
-
|
|
219
|
+
layerFormat(cellId, booleanRule.format);
|
|
177
220
|
if (rule.stopIfTrue) {
|
|
178
221
|
stopCells.add(cellId);
|
|
179
222
|
}
|
|
@@ -234,9 +277,7 @@ export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, l
|
|
|
234
277
|
if (isNil(backgroundColor)) {
|
|
235
278
|
continue;
|
|
236
279
|
}
|
|
237
|
-
|
|
238
|
-
backgroundColor,
|
|
239
|
-
});
|
|
280
|
+
layerFormat(cellId, { backgroundColor });
|
|
240
281
|
if (rule.stopIfTrue) {
|
|
241
282
|
stopCells.add(cellId);
|
|
242
283
|
}
|
|
@@ -294,7 +335,7 @@ export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, l
|
|
|
294
335
|
if (stopCells.has(cellId)) {
|
|
295
336
|
continue;
|
|
296
337
|
}
|
|
297
|
-
|
|
338
|
+
layerFormat(cellId, topBottomRule.format);
|
|
298
339
|
if (rule.stopIfTrue) {
|
|
299
340
|
stopCells.add(cellId);
|
|
300
341
|
}
|
|
@@ -341,7 +382,7 @@ export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, l
|
|
|
341
382
|
if (stopCells.has(cellId)) {
|
|
342
383
|
continue;
|
|
343
384
|
}
|
|
344
|
-
|
|
385
|
+
layerFormat(cellId, distinctRule.format);
|
|
345
386
|
if (rule.stopIfTrue) {
|
|
346
387
|
stopCells.add(cellId);
|
|
347
388
|
}
|
|
@@ -396,9 +437,7 @@ export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, l
|
|
|
396
437
|
const glyphIndex = Math.min(bucket, orderedGlyphs.length - 1);
|
|
397
438
|
const glyph = orderedGlyphs[glyphIndex];
|
|
398
439
|
const color = orderedColors[Math.min(bucket, orderedColors.length - 1)];
|
|
399
|
-
|
|
400
|
-
formattingByCell.set(cellId, {
|
|
401
|
-
...(existing ?? {}),
|
|
440
|
+
layerFormat(cellId, {
|
|
402
441
|
// iconSet + iconId are needed by the icon column filter to
|
|
403
442
|
// match cells against a specific (iconSet, iconId) target.
|
|
404
443
|
// They're harmless to renderers that only read `glyph`.
|
|
@@ -459,9 +498,7 @@ export const useConditionalFormatting = ({ sheetId, theme, conditionalFormats, l
|
|
|
459
498
|
const fill = computeDataBarFill(isNegative ? -cell.value : cell.value, isNegative ? 0 : Math.max(0, resolvedMin), isNegative
|
|
460
499
|
? Math.abs(resolvedMin)
|
|
461
500
|
: Math.max(resolvedMin, resolvedMax));
|
|
462
|
-
|
|
463
|
-
formattingByCell.set(cellId, {
|
|
464
|
-
...(existing ?? {}),
|
|
501
|
+
layerFormat(cellId, {
|
|
465
502
|
conditionalDataBar: {
|
|
466
503
|
color: isNegative
|
|
467
504
|
? negativeColor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-editable.d.ts","sourceRoot":"","sources":["../../../hooks/use-editable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,YAAY,EACZ,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEL,SAAS,EAIV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"use-editable.d.ts","sourceRoot":"","sources":["../../../hooks/use-editable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { MouseButtonCodes } from "@rowsncolumns/grid";
|
|
2
2
|
import { clampIndex, Direction, findNextCellWithinBounds, isArrowKey, isEqualCells, } from "@rowsncolumns/grid";
|
|
3
|
-
import { isAFormula, isNil } from "@rowsncolumns/utils";
|
|
3
|
+
import { isAFormula, isNil, PROTECTED_SHEET_EDIT_MESSAGE, SHEET_PROTECTION_ERROR_TITLE, } from "@rowsncolumns/utils";
|
|
4
4
|
import { useCallback, useMemo, useRef, useState } from "react";
|
|
5
5
|
import { first } from "rxjs";
|
|
6
6
|
import { useCellEditorInstance, useCellEditorTextFormatRuns, useCellEditorValue, useEditingCellCoordinate, useEditorVisibility, useSetActiveEditor, useSetFormulaMode, } from "../atoms";
|
|
7
7
|
import { findActiveTableWithinCell, getNextCellInTable } from "../api/table";
|
|
8
|
+
import { useShowValidationAlert } from "../atoms/validation-alert.atom";
|
|
8
9
|
import { DEFAULT_ACTIVE_CELL, DEFAULT_ARRAY } from "../config";
|
|
9
10
|
import { scrollSubscriber } from "../signals/scroll-subscriber";
|
|
10
11
|
import { useCallbackRef } from "./use-callback-ref";
|
|
@@ -391,6 +392,37 @@ export const useEditable = ({ getEditor = getDefaultEditor, getValue, getTextFor
|
|
|
391
392
|
const setInitialActiveCell = useCallback((cell) => {
|
|
392
393
|
initialActiveCell.current = cell;
|
|
393
394
|
}, []);
|
|
395
|
+
const showValidationAlert = useShowValidationAlert();
|
|
396
|
+
/**
|
|
397
|
+
* Whether every cell the Delete key targets may be edited: the active cell when there is no
|
|
398
|
+
* selection, else every cell of every selection (clipped to the sheet's row / column counts,
|
|
399
|
+
* so a whole-column selection is bounded), stopping at the first locked one.
|
|
400
|
+
*/
|
|
401
|
+
const canEditSelection = useCallback((targetSheetId, cell, areas) => {
|
|
402
|
+
if (!areas.length) {
|
|
403
|
+
return canEdit(targetSheetId, cell);
|
|
404
|
+
}
|
|
405
|
+
const maxRow = getSheetRowCount?.(targetSheetId) ?? selectionBottomBound;
|
|
406
|
+
const maxColumn = getSheetColumnCount?.(targetSheetId) ?? selectionRightBound;
|
|
407
|
+
for (const { range } of areas) {
|
|
408
|
+
const lastRow = Math.min(range.endRowIndex, maxRow);
|
|
409
|
+
const lastColumn = Math.min(range.endColumnIndex, maxColumn);
|
|
410
|
+
for (let rowIndex = range.startRowIndex; rowIndex <= lastRow; rowIndex++) {
|
|
411
|
+
for (let columnIndex = range.startColumnIndex; columnIndex <= lastColumn; columnIndex++) {
|
|
412
|
+
if (!canEdit(targetSheetId, { rowIndex, columnIndex })) {
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return true;
|
|
419
|
+
}, [
|
|
420
|
+
canEdit,
|
|
421
|
+
getSheetRowCount,
|
|
422
|
+
getSheetColumnCount,
|
|
423
|
+
selectionBottomBound,
|
|
424
|
+
selectionRightBound,
|
|
425
|
+
]);
|
|
394
426
|
const handleKeyDown = useCallback((e) => {
|
|
395
427
|
const nativeEvent = e.nativeEvent;
|
|
396
428
|
const key = nativeEvent.key;
|
|
@@ -474,7 +506,19 @@ export const useEditable = ({ getEditor = getDefaultEditor, getValue, getTextFor
|
|
|
474
506
|
e.preventDefault();
|
|
475
507
|
}
|
|
476
508
|
else if (key === "Delete" || key === "Backspace") {
|
|
477
|
-
//
|
|
509
|
+
// Excel refuses Delete / Backspace when any selected cell is a locked cell of a
|
|
510
|
+
// protected sheet — the same `canEdit` gate typing goes through in `makeEditable`
|
|
511
|
+
// (rowsncolumns/spreadsheet#939 U-35). Nothing is cleared; Excel's dialog is shown.
|
|
512
|
+
if (!canEditSelection(sheetId, activeCell, selections)) {
|
|
513
|
+
void showValidationAlert({
|
|
514
|
+
style: "stop",
|
|
515
|
+
title: SHEET_PROTECTION_ERROR_TITLE,
|
|
516
|
+
message: PROTECTED_SHEET_EDIT_MESSAGE,
|
|
517
|
+
confirm: false,
|
|
518
|
+
});
|
|
519
|
+
e.preventDefault();
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
478
522
|
onDelete?.(sheetId, activeCell, selections);
|
|
479
523
|
// Delete value
|
|
480
524
|
setValue("");
|
|
@@ -504,6 +548,8 @@ export const useEditable = ({ getEditor = getDefaultEditor, getValue, getTextFor
|
|
|
504
548
|
getBooleanValue,
|
|
505
549
|
getDataValidation,
|
|
506
550
|
onDelete,
|
|
551
|
+
canEditSelection,
|
|
552
|
+
showValidationAlert,
|
|
507
553
|
makeEditable,
|
|
508
554
|
isSelectionKey,
|
|
509
555
|
setInitialActiveCell,
|
|
@@ -207,6 +207,11 @@ export type UseSelectionOptions<T extends AreaStyle = AreaStyle> = {
|
|
|
207
207
|
* Get data row count
|
|
208
208
|
*/
|
|
209
209
|
getDataRowCount: CanvasGridProps["getDataRowCount"];
|
|
210
|
+
/**
|
|
211
|
+
* Ctrl/Cmd+A's current region from the engine's full document (see `CanvasGridProps`). When
|
|
212
|
+
* absent the hook walks `getValue`, which only sees the values the host holds in JS.
|
|
213
|
+
*/
|
|
214
|
+
getDataRegion?: CanvasGridProps["getDataRegion"];
|
|
210
215
|
/**
|
|
211
216
|
* Enable navigation to data boundary instead of sheet boundary
|
|
212
217
|
*/
|
|
@@ -215,7 +220,7 @@ export type UseSelectionOptions<T extends AreaStyle = AreaStyle> = {
|
|
|
215
220
|
isColumnHeader(index: number): boolean;
|
|
216
221
|
};
|
|
217
222
|
export type NewSelectionMode = "clear" | "modify" | "append";
|
|
218
|
-
export declare const useSelection: <T extends AreaStyle>({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount, rowCount, selectionPolicy, newSelectionMode, allowDeselectSelection, onFill, onFillHandleRelease, onFillShrink, onInsertCutCells, confirmMoveOverwrite, 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, tables, onInsertTableRow, }: UseSelectionOptions<T>) => {
|
|
223
|
+
export declare const useSelection: <T extends AreaStyle>({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount, rowCount, selectionPolicy, newSelectionMode, allowDeselectSelection, onFill, onFillHandleRelease, onFillShrink, onInsertCutCells, confirmMoveOverwrite, isHiddenRow, isHiddenColumn, alwaysScrollToActiveCell, selectionTopBound, selectionBottomBound, selectionLeftBound, selectionRightBound, mouseDownInterceptor, mouseMoveInterceptor, mergedCells, canSelectionSpanMergedCells, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, getDataRegion, isRowHeader, isColumnHeader, enableDataBoundaryNavigation, tables, onInsertTableRow, }: UseSelectionOptions<T>) => {
|
|
219
224
|
isDragging: boolean;
|
|
220
225
|
draggedSelection: SelectionArea<T> | undefined;
|
|
221
226
|
initialDraggedSelection: SelectionArea<T> | undefined;
|
|
@@ -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;AAe/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtE;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,CAAC;IAC1B,uDAAuD;IACvD,aAAa,EAAE,aAAa,CAAC;IAC7B,8CAA8C;IAC9C,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,gEAAgE;IAChE,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC;AAMF;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAQF,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,UAAU,EAAE,aAAa,CAAC;IAC1B;;OAEG;IACH,kBAAkB,CAAC,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC3D;;OAEG;IACH,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B;;OAEG;IACH,kBAAkB,CAAC,CACjB,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAC9B,YAAY,CAAC,EAAE,OAAO,GACrB,IAAI,CAAC;IACR;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,EACzB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAC9B,kBAAkB,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EACvC,QAAQ,CAAC,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE,WAAW,KAClB,IAAI,CAAC;IACV;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,EACzB,UAAU,EAAE,SAAS,EACrB,OAAO,CAAC,EAAE,kBAAkB,KACzB,IAAI,CAAC;IACV;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC9D;;OAEG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB;;OAEG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B;;OAEG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1B;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,oBAAoB,CAAC,EAAE,CACrB,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC,YAAY,EAC7D,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAC,EACnD,GAAG,EAAE,KAAK,CAAC,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAC,EACjD,eAAe,EAAE,CACf,MAAM,EAAE,aAAa,EACrB,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,KAChC,IAAI,EACT,eAAe,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,aAAa,KAAK,IAAI,EACpE,eAAe,EAAE,MAAM,IAAI,EAC3B,SAAS,EAAE,MAAM,IAAI,KAClB,OAAO,GAAG,SAAS,CAAC;IACzB,oBAAoB,CAAC,EAAE,CACrB,CAAC,EAAE,UAAU,CAAC,UAAU,EACxB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAC,EACnD,GAAG,EAAE,KAAK,CAAC,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAC,EACjD,eAAe,EAAE,CACf,MAAM,EAAE,aAAa,EACrB,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,KAChC,IAAI,KACN,OAAO,GAAG,SAAS,CAAC;IACzB,2BAA2B,CAAC,EAAE,CAC5B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,aAAa,KACf,OAAO,CAAC;IACb;;OAEG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;OAEG;IACH,QAAQ,EAAE,CACR,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;OAEG;IACH,eAAe,CAAC,EAAE,CAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EACtB,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;IACV;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EACtB,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;IACV;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE;;;;OAIG;IACH,uBAAuB,CACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAClC,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAC9C;;OAEG;IACH,WAAW,IAAI,aAAa,CAAC;IAC7B;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IACd;;;;OAIG;IACH,YAAY,CACV,IAAI,EAAE,qBAAqB,EAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,GACxB,IAAI,GAAG,SAAS,CAAC;IACpB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;IACvD;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,oBAAoB,CAAC,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC;IAClD;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnC;;OAEG;IACH,gBAAgB,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACvD;;OAEG;IACH,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACpD;;OAEG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAuG7D,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,SAAS,EAAE
|
|
1
|
+
{"version":3,"file":"use-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -86,7 +86,7 @@ const fillShrinkFor = (selection, coords) => {
|
|
|
86
86
|
const defaultConfirmMoveOverwrite = (message) => typeof window === "undefined" || typeof window.confirm !== "function"
|
|
87
87
|
? true
|
|
88
88
|
: window.confirm(message);
|
|
89
|
-
export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount = 0, rowCount = 0, selectionPolicy = "multiple", newSelectionMode = "clear", allowDeselectSelection = true, onFill, onFillHandleRelease, onFillShrink, onInsertCutCells, confirmMoveOverwrite = defaultConfirmMoveOverwrite, isHiddenRow = defaultIsHidden, isHiddenColumn = defaultIsHidden, alwaysScrollToActiveCell = true, selectionTopBound = 0, selectionBottomBound = rowCount, selectionLeftBound = 0, selectionRightBound = columnCount, mouseDownInterceptor, mouseMoveInterceptor, mergedCells = DEFAULT_ARRAY, canSelectionSpanMergedCells = defaultSelectionSpan, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, isRowHeader, isColumnHeader, enableDataBoundaryNavigation = false, tables, onInsertTableRow, }) => {
|
|
89
|
+
export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount = 0, rowCount = 0, selectionPolicy = "multiple", newSelectionMode = "clear", allowDeselectSelection = true, onFill, onFillHandleRelease, onFillShrink, onInsertCutCells, confirmMoveOverwrite = defaultConfirmMoveOverwrite, isHiddenRow = defaultIsHidden, isHiddenColumn = defaultIsHidden, alwaysScrollToActiveCell = true, selectionTopBound = 0, selectionBottomBound = rowCount, selectionLeftBound = 0, selectionRightBound = columnCount, mouseDownInterceptor, mouseMoveInterceptor, mergedCells = DEFAULT_ARRAY, canSelectionSpanMergedCells = defaultSelectionSpan, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, getDataRegion, isRowHeader, isColumnHeader, enableDataBoundaryNavigation = false, tables, onInsertTableRow, }) => {
|
|
90
90
|
const [fillSelection, setFillSelection] = useState();
|
|
91
91
|
const [fillShrink, setFillShrink] = useState();
|
|
92
92
|
const fillShrinkRef = useRef(undefined);
|
|
@@ -642,6 +642,35 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
642
642
|
applyTableRange(step);
|
|
643
643
|
return;
|
|
644
644
|
}
|
|
645
|
+
// Prefer the engine's current region: it is computed over the WHOLE document, whereas the
|
|
646
|
+
// `getValue` walk below only sees the values the host holds in JS — on a windowed engine that is
|
|
647
|
+
// the resident band, so a 200-row block used to select ~97 rows (#37167 UI3-5). Excel's cycle
|
|
648
|
+
// holds: a lone cell (no data in it or around it) and a second press on an already-selected
|
|
649
|
+
// region both select the whole sheet.
|
|
650
|
+
const region = getDataRegion?.(sheetId, activeCell ?? selectionStart.current);
|
|
651
|
+
if (region) {
|
|
652
|
+
const isLoneCell = region.startRowIndex === region.endRowIndex &&
|
|
653
|
+
region.startColumnIndex === region.endColumnIndex;
|
|
654
|
+
const current = currentSingleArea();
|
|
655
|
+
const alreadySelected = current !== undefined &&
|
|
656
|
+
current.startRowIndex === region.startRowIndex &&
|
|
657
|
+
current.endRowIndex === region.endRowIndex &&
|
|
658
|
+
current.startColumnIndex === region.startColumnIndex &&
|
|
659
|
+
current.endColumnIndex === region.endColumnIndex;
|
|
660
|
+
if (isLoneCell || alreadySelected) {
|
|
661
|
+
selectAll();
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
selectionStart.current = {
|
|
665
|
+
rowIndex: Math.max(region.startRowIndex, selectionTopBound),
|
|
666
|
+
columnIndex: Math.max(region.startColumnIndex, selectionLeftBound),
|
|
667
|
+
};
|
|
668
|
+
modifySelection({
|
|
669
|
+
rowIndex: Math.min(region.endRowIndex, selectionBottomBound),
|
|
670
|
+
columnIndex: Math.min(region.endColumnIndex, selectionRightBound),
|
|
671
|
+
});
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
645
674
|
let topBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Up);
|
|
646
675
|
let bottomBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Down);
|
|
647
676
|
let leftBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Left);
|
|
@@ -1617,6 +1646,13 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1617
1646
|
if (isContextMenu) {
|
|
1618
1647
|
return;
|
|
1619
1648
|
}
|
|
1649
|
+
// Keep keyboard focus in the grid. The selection border is rendered OUTSIDE the tabIndex=0
|
|
1650
|
+
// grid container (a sibling, see Grid.tsx `selectionChildren`), so the mousedown default
|
|
1651
|
+
// would focus the grid's nearest focusable ANCESTOR — the host's pane wrapper — and every
|
|
1652
|
+
// key after a drag-move (typing, Enter, arrows, Ctrl+Z) would be dropped until the next
|
|
1653
|
+
// click (Athena-Intel/demo-app-monorepo#37167 UI1-3). Same guard as the fill handle
|
|
1654
|
+
// (`handleFillMouseDown`) and the move hook (`use-selection-move.ts`).
|
|
1655
|
+
e.preventDefault();
|
|
1620
1656
|
let coords = getCellCoordsFromOffset(e.nativeEvent.clientX, e.nativeEvent.clientY, false);
|
|
1621
1657
|
if (!coords) {
|
|
1622
1658
|
return;
|
package/dist/esm/release-date.js
CHANGED