@rowsncolumns/spreadsheet 10.4.2 → 10.4.4
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/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/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
|
};
|
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":"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
|
|
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
package/dist/esm/types.d.ts
CHANGED
|
@@ -9,6 +9,37 @@ export { CONDITION_TYPES } from "@rowsncolumns/common-types";
|
|
|
9
9
|
* Utility type for values that can be undefined or null
|
|
10
10
|
*/
|
|
11
11
|
export type Maybe<T> = T | undefined | null;
|
|
12
|
+
/**
|
|
13
|
+
* Workbook-level protection (`<workbookProtection>` in `xl/workbook.xml`),
|
|
14
|
+
* mirroring the OOXML `CT_WorkbookProtection` attribute set 1:1 in camelCase.
|
|
15
|
+
* `lockStructure` is what Excel's "Protect Workbook → Structure" sets (no
|
|
16
|
+
* add / delete / rename / move / hide of sheets); `lockWindows` freezes the
|
|
17
|
+
* window arrangement; `lockRevision` protects shared-workbook change tracking.
|
|
18
|
+
* The password fields carry whichever hash the source file used — the legacy
|
|
19
|
+
* 16-bit `workbookPassword` / `revisionsPassword` hex hash or the agile
|
|
20
|
+
* `workbookAlgorithmName` / `workbookHashValue` / `workbookSaltValue` /
|
|
21
|
+
* `workbookSpinCount` quartet (and its `revisions*` twin) — verbatim, for
|
|
22
|
+
* round-trip fidelity; the UI never verifies them. Enforcement is the host's
|
|
23
|
+
* `isWorkbookProtected` policy (`useCanEditWorkbook`).
|
|
24
|
+
*/
|
|
25
|
+
export type WorkbookProtection = {
|
|
26
|
+
lockStructure?: Maybe<boolean>;
|
|
27
|
+
lockWindows?: Maybe<boolean>;
|
|
28
|
+
lockRevision?: Maybe<boolean>;
|
|
29
|
+
/** Legacy 16-bit password hash (`workbookPassword="CC1A"`). Round-trip only. */
|
|
30
|
+
workbookPassword?: Maybe<string>;
|
|
31
|
+
revisionsPassword?: Maybe<string>;
|
|
32
|
+
/** Agile hash quartet for the structure/windows lock. Round-trip only. */
|
|
33
|
+
workbookAlgorithmName?: Maybe<string>;
|
|
34
|
+
workbookHashValue?: Maybe<string>;
|
|
35
|
+
workbookSaltValue?: Maybe<string>;
|
|
36
|
+
workbookSpinCount?: Maybe<number>;
|
|
37
|
+
/** Agile hash quartet for the revision lock. Round-trip only. */
|
|
38
|
+
revisionsAlgorithmName?: Maybe<string>;
|
|
39
|
+
revisionsHashValue?: Maybe<string>;
|
|
40
|
+
revisionsSaltValue?: Maybe<string>;
|
|
41
|
+
revisionsSpinCount?: Maybe<number>;
|
|
42
|
+
};
|
|
12
43
|
/**
|
|
13
44
|
* Worksheet-level protection (`<sheetProtection>`), mirroring the OOXML
|
|
14
45
|
* `CT_SheetProtection` attribute set 1:1 in camelCase. `sheet` is the master
|
|
@@ -1343,9 +1374,32 @@ export type FilterCriteria = {
|
|
|
1343
1374
|
* specified glyph. Mirrors Excel's `<iconFilter iconSet iconId>`.
|
|
1344
1375
|
*/
|
|
1345
1376
|
iconFilter?: Maybe<IconFilterCriteria>;
|
|
1377
|
+
/**
|
|
1378
|
+
* Excel's date-grouped value filter — the checked "2023 › March" nodes of
|
|
1379
|
+
* the AutoFilter tree, stored as `<filters><dateGroupItem year month day …
|
|
1380
|
+
* dateTimeGrouping/>` beside the plain `<filter val>` list. Kept so the
|
|
1381
|
+
* criteria survive an XLSX round trip; the in-app filter keys on
|
|
1382
|
+
* `visibleValues` / `condition`.
|
|
1383
|
+
*/
|
|
1384
|
+
dateGroups?: Maybe<DateGroupFilter[]>;
|
|
1346
1385
|
};
|
|
1347
1386
|
/** How a Custom AutoFilter's two clauses combine. */
|
|
1348
1387
|
export type FilterConditionJoin = "AND" | "OR";
|
|
1388
|
+
/** Granularity of a `<dateGroupItem>` (which components below `year` are set). */
|
|
1389
|
+
export type DateTimeGrouping = "year" | "month" | "day" | "hour" | "minute" | "second";
|
|
1390
|
+
/**
|
|
1391
|
+
* One `<dateGroupItem>`: the date components down to `dateTimeGrouping`
|
|
1392
|
+
* granularity; the finer components are absent.
|
|
1393
|
+
*/
|
|
1394
|
+
export type DateGroupFilter = {
|
|
1395
|
+
year: number;
|
|
1396
|
+
month?: Maybe<number>;
|
|
1397
|
+
day?: Maybe<number>;
|
|
1398
|
+
hour?: Maybe<number>;
|
|
1399
|
+
minute?: Maybe<number>;
|
|
1400
|
+
second?: Maybe<number>;
|
|
1401
|
+
dateTimeGrouping: DateTimeGrouping;
|
|
1402
|
+
};
|
|
1349
1403
|
export type ColorFilterCriteria = {
|
|
1350
1404
|
/** Hex color string, e.g. "#FF0000". Compared case-insensitively. */
|
|
1351
1405
|
color: string;
|