@rowsncolumns/spreadsheet 10.6.5 → 10.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api/autocomplete.d.ts +42 -0
- package/dist/cjs/api/autocomplete.d.ts.map +1 -0
- package/dist/cjs/api/autocomplete.js +114 -0
- package/dist/cjs/api/banded-ranges.d.ts.map +1 -1
- package/dist/cjs/api/banded-ranges.js +51 -1
- package/dist/cjs/api/error-checking.d.ts +82 -0
- package/dist/cjs/api/error-checking.d.ts.map +1 -0
- package/dist/cjs/api/error-checking.js +207 -0
- package/dist/cjs/api/move-overwrite.d.ts +8 -2
- package/dist/cjs/api/move-overwrite.d.ts.map +1 -1
- package/dist/cjs/api/move-overwrite.js +19 -3
- package/dist/cjs/api/selections.d.ts +2 -2
- package/dist/cjs/api/validation.d.ts +39 -1
- package/dist/cjs/api/validation.d.ts.map +1 -1
- package/dist/cjs/api/validation.js +87 -1
- package/dist/cjs/atoms/cell-input-context.atom.d.ts +4 -1
- package/dist/cjs/atoms/cell-input-context.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/enter-key-direction.atom.d.ts +11 -0
- package/dist/cjs/atoms/enter-key-direction.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/enter-key-direction.atom.js +13 -0
- package/dist/cjs/atoms/index.d.ts +1 -0
- package/dist/cjs/atoms/index.d.ts.map +1 -1
- package/dist/cjs/atoms/index.js +1 -0
- package/dist/cjs/atoms/paste-menu.atom.d.ts +22 -0
- package/dist/cjs/atoms/paste-menu.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/paste-menu.atom.js +13 -1
- package/dist/cjs/atoms/pick-list.atom.d.ts +15 -0
- package/dist/cjs/atoms/pick-list.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/pick-list.atom.js +7 -0
- package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.js +305 -70
- package/dist/cjs/components/canvas-grid/typings.d.ts +96 -11
- package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/cjs/components/cell/index.d.ts.map +1 -1
- package/dist/cjs/components/cell/index.js +7 -8
- package/dist/cjs/components/cell/typings.d.ts +9 -0
- package/dist/cjs/components/cell/typings.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/helpers.d.ts +22 -2
- package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/helpers.js +32 -8
- package/dist/cjs/components/cell-editor/index.d.ts +7 -1
- package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
- package/dist/cjs/components/cell-editor/index.js +85 -13
- package/dist/cjs/components/cell-indicator/index.d.ts +41 -0
- package/dist/cjs/components/cell-indicator/index.d.ts.map +1 -0
- package/dist/cjs/components/cell-indicator/index.js +90 -0
- package/dist/cjs/components/cell-input/cell-input.d.ts +10 -2
- package/dist/cjs/components/cell-input/cell-input.d.ts.map +1 -1
- package/dist/cjs/components/cell-input/cell-input.js +5 -3
- package/dist/cjs/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
- package/dist/cjs/components/cell-input/formula-bar-cell-input.js +9 -2
- package/dist/cjs/components/cell-structured/sparkline-math.d.ts +27 -1
- package/dist/cjs/components/cell-structured/sparkline-math.d.ts.map +1 -1
- package/dist/cjs/components/cell-structured/sparkline-math.js +48 -1
- package/dist/cjs/components/cell-structured/sparkline.d.ts +1 -1
- package/dist/cjs/components/cell-structured/sparkline.d.ts.map +1 -1
- package/dist/cjs/components/cell-structured/sparkline.js +36 -92
- package/dist/cjs/components/cell-structured/types.d.ts +6 -0
- package/dist/cjs/components/cell-structured/types.d.ts.map +1 -1
- package/dist/cjs/components/data-table-dialog/index.d.ts +22 -0
- package/dist/cjs/components/data-table-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/data-table-dialog/index.js +93 -0
- package/dist/cjs/components/error-check-smart-tag/index.d.ts +27 -0
- package/dist/cjs/components/error-check-smart-tag/index.d.ts.map +1 -0
- package/dist/cjs/components/error-check-smart-tag/index.js +39 -0
- package/dist/cjs/components/forecast-sheet-dialog/index.d.ts +26 -0
- package/dist/cjs/components/forecast-sheet-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/forecast-sheet-dialog/index.js +92 -0
- package/dist/cjs/components/paste-special-dialog/index.d.ts +3 -3
- package/dist/cjs/components/paste-special-dialog/index.d.ts.map +1 -1
- package/dist/cjs/components/paste-special-dialog/index.js +61 -23
- package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
- package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
- package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +196 -0
- package/dist/cjs/components/protect-sheet-dialog/constants.d.ts +3 -0
- package/dist/cjs/components/protect-sheet-dialog/constants.d.ts.map +1 -0
- package/dist/cjs/components/protect-sheet-dialog/constants.js +5 -0
- package/dist/cjs/components/protect-sheet-dialog/index.d.ts +2 -2
- package/dist/cjs/components/protect-sheet-dialog/index.d.ts.map +1 -1
- package/dist/cjs/components/protect-sheet-dialog/index.js +5 -3
- package/dist/cjs/components/scenario-manager-dialog/index.d.ts +51 -0
- package/dist/cjs/components/scenario-manager-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/scenario-manager-dialog/index.js +257 -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 +9 -4
- package/dist/cjs/components/selection/paste-menu.d.ts +14 -1
- package/dist/cjs/components/selection/paste-menu.d.ts.map +1 -1
- package/dist/cjs/components/selection/paste-menu.js +78 -6
- package/dist/cjs/components/selection/paste-options.d.ts +28 -0
- package/dist/cjs/components/selection/paste-options.d.ts.map +1 -0
- package/dist/cjs/components/selection/paste-options.js +70 -0
- package/dist/cjs/components/selection/types.d.ts +12 -1
- package/dist/cjs/components/selection/types.d.ts.map +1 -1
- package/dist/cjs/components/selection-drop-menu/index.d.ts +18 -0
- package/dist/cjs/components/selection-drop-menu/index.d.ts.map +1 -0
- package/dist/cjs/components/selection-drop-menu/index.js +62 -0
- package/dist/cjs/components/solver-dialog/index.d.ts +57 -0
- package/dist/cjs/components/solver-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/solver-dialog/index.js +204 -0
- package/dist/cjs/components/toolbar/sparkline-actions.d.ts +3 -2
- package/dist/cjs/components/toolbar/sparkline-actions.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/sparkline-actions.js +6 -2
- package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/table-style-selector.js +33 -2
- package/dist/cjs/config.d.ts +5 -4
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +13 -9
- package/dist/cjs/hooks/use-cell-renderer.d.ts +12 -1
- package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-cell-renderer.js +6 -3
- package/dist/cjs/hooks/use-copy-paste-cut.d.ts +36 -2
- package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
- package/dist/cjs/hooks/use-copy-paste-cut.js +131 -5
- package/dist/cjs/hooks/use-editable.d.ts +6 -0
- package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editor-submit.d.ts +45 -3
- package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editor-submit.js +91 -7
- package/dist/cjs/hooks/use-keyboard-handler.d.ts +5 -1
- package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/cjs/hooks/use-keyboard-handler.js +10 -1
- package/dist/cjs/hooks/use-selection-drag-copy.d.ts +55 -0
- package/dist/cjs/hooks/use-selection-drag-copy.d.ts.map +1 -0
- package/dist/cjs/hooks/use-selection-drag-copy.js +274 -0
- package/dist/cjs/hooks/use-selection-renderer.d.ts +8 -1
- package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection-renderer.js +7 -2
- package/dist/cjs/hooks/use-selection.d.ts +59 -1
- package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection.js +270 -61
- package/dist/cjs/index.d.ts +6 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +5 -0
- package/dist/cjs/release-date.js +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types.d.ts +50 -1
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/api/autocomplete.d.ts +42 -0
- package/dist/esm/api/autocomplete.d.ts.map +1 -0
- package/dist/esm/api/autocomplete.js +91 -0
- package/dist/esm/api/banded-ranges.d.ts.map +1 -1
- package/dist/esm/api/banded-ranges.js +52 -2
- package/dist/esm/api/error-checking.d.ts +82 -0
- package/dist/esm/api/error-checking.d.ts.map +1 -0
- package/dist/esm/api/error-checking.js +156 -0
- package/dist/esm/api/move-overwrite.d.ts +8 -2
- package/dist/esm/api/move-overwrite.d.ts.map +1 -1
- package/dist/esm/api/move-overwrite.js +17 -2
- package/dist/esm/api/selections.d.ts +2 -2
- package/dist/esm/api/validation.d.ts +39 -1
- package/dist/esm/api/validation.d.ts.map +1 -1
- package/dist/esm/api/validation.js +70 -0
- package/dist/esm/atoms/cell-input-context.atom.d.ts +4 -1
- package/dist/esm/atoms/cell-input-context.atom.d.ts.map +1 -1
- package/dist/esm/atoms/enter-key-direction.atom.d.ts +11 -0
- package/dist/esm/atoms/enter-key-direction.atom.d.ts.map +1 -0
- package/dist/esm/atoms/enter-key-direction.atom.js +8 -0
- package/dist/esm/atoms/index.d.ts +1 -0
- package/dist/esm/atoms/index.d.ts.map +1 -1
- package/dist/esm/atoms/index.js +1 -0
- package/dist/esm/atoms/paste-menu.atom.d.ts +22 -0
- package/dist/esm/atoms/paste-menu.atom.d.ts.map +1 -1
- package/dist/esm/atoms/paste-menu.atom.js +10 -1
- package/dist/esm/atoms/pick-list.atom.d.ts +15 -0
- package/dist/esm/atoms/pick-list.atom.d.ts.map +1 -0
- package/dist/esm/atoms/pick-list.atom.js +3 -0
- package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.js +239 -13
- package/dist/esm/components/canvas-grid/typings.d.ts +96 -11
- package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/esm/components/cell/index.d.ts.map +1 -1
- package/dist/esm/components/cell/index.js +8 -9
- package/dist/esm/components/cell/typings.d.ts +9 -0
- package/dist/esm/components/cell/typings.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/helpers.d.ts +22 -2
- package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/helpers.js +25 -7
- package/dist/esm/components/cell-editor/index.d.ts +7 -1
- package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
- package/dist/esm/components/cell-editor/index.js +80 -9
- package/dist/esm/components/cell-indicator/index.d.ts +41 -0
- package/dist/esm/components/cell-indicator/index.d.ts.map +1 -0
- package/dist/esm/components/cell-indicator/index.js +76 -0
- package/dist/esm/components/cell-input/cell-input.d.ts +10 -2
- package/dist/esm/components/cell-input/cell-input.d.ts.map +1 -1
- package/dist/esm/components/cell-input/cell-input.js +5 -3
- package/dist/esm/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
- package/dist/esm/components/cell-input/formula-bar-cell-input.js +9 -2
- package/dist/esm/components/cell-structured/sparkline-math.d.ts +27 -1
- package/dist/esm/components/cell-structured/sparkline-math.d.ts.map +1 -1
- package/dist/esm/components/cell-structured/sparkline-math.js +35 -0
- package/dist/esm/components/cell-structured/sparkline.d.ts +1 -1
- package/dist/esm/components/cell-structured/sparkline.d.ts.map +1 -1
- package/dist/esm/components/cell-structured/sparkline.js +34 -88
- package/dist/esm/components/cell-structured/types.d.ts +6 -0
- package/dist/esm/components/cell-structured/types.d.ts.map +1 -1
- package/dist/esm/components/data-table-dialog/index.d.ts +22 -0
- package/dist/esm/components/data-table-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/data-table-dialog/index.js +75 -0
- package/dist/esm/components/error-check-smart-tag/index.d.ts +27 -0
- package/dist/esm/components/error-check-smart-tag/index.d.ts.map +1 -0
- package/dist/esm/components/error-check-smart-tag/index.js +33 -0
- package/dist/esm/components/forecast-sheet-dialog/index.d.ts +26 -0
- package/dist/esm/components/forecast-sheet-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/forecast-sheet-dialog/index.js +83 -0
- package/dist/esm/components/paste-special-dialog/index.d.ts +3 -3
- package/dist/esm/components/paste-special-dialog/index.d.ts.map +1 -1
- package/dist/esm/components/paste-special-dialog/index.js +58 -23
- package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
- package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
- package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +177 -0
- package/dist/esm/components/protect-sheet-dialog/constants.d.ts +3 -0
- package/dist/esm/components/protect-sheet-dialog/constants.d.ts.map +1 -0
- package/dist/esm/components/protect-sheet-dialog/constants.js +2 -0
- package/dist/esm/components/protect-sheet-dialog/index.d.ts +2 -2
- package/dist/esm/components/protect-sheet-dialog/index.d.ts.map +1 -1
- package/dist/esm/components/protect-sheet-dialog/index.js +3 -2
- package/dist/esm/components/scenario-manager-dialog/index.d.ts +51 -0
- package/dist/esm/components/scenario-manager-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/scenario-manager-dialog/index.js +213 -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 +9 -4
- package/dist/esm/components/selection/paste-menu.d.ts +14 -1
- package/dist/esm/components/selection/paste-menu.d.ts.map +1 -1
- package/dist/esm/components/selection/paste-menu.js +76 -8
- package/dist/esm/components/selection/paste-options.d.ts +28 -0
- package/dist/esm/components/selection/paste-options.d.ts.map +1 -0
- package/dist/esm/components/selection/paste-options.js +62 -0
- package/dist/esm/components/selection/types.d.ts +12 -1
- package/dist/esm/components/selection/types.d.ts.map +1 -1
- package/dist/esm/components/selection-drop-menu/index.d.ts +18 -0
- package/dist/esm/components/selection-drop-menu/index.d.ts.map +1 -0
- package/dist/esm/components/selection-drop-menu/index.js +56 -0
- package/dist/esm/components/solver-dialog/index.d.ts +57 -0
- package/dist/esm/components/solver-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/solver-dialog/index.js +176 -0
- package/dist/esm/components/toolbar/sparkline-actions.d.ts +3 -2
- package/dist/esm/components/toolbar/sparkline-actions.d.ts.map +1 -1
- package/dist/esm/components/toolbar/sparkline-actions.js +6 -2
- package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/table-style-selector.js +29 -3
- package/dist/esm/config.d.ts +5 -4
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +12 -8
- package/dist/esm/hooks/use-cell-renderer.d.ts +12 -1
- package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-cell-renderer.js +5 -2
- package/dist/esm/hooks/use-copy-paste-cut.d.ts +36 -2
- package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
- package/dist/esm/hooks/use-copy-paste-cut.js +117 -6
- package/dist/esm/hooks/use-editable.d.ts +6 -0
- package/dist/esm/hooks/use-editable.d.ts.map +1 -1
- package/dist/esm/hooks/use-editor-submit.d.ts +45 -3
- package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
- package/dist/esm/hooks/use-editor-submit.js +81 -6
- package/dist/esm/hooks/use-keyboard-handler.d.ts +5 -1
- package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/esm/hooks/use-keyboard-handler.js +10 -1
- package/dist/esm/hooks/use-selection-drag-copy.d.ts +55 -0
- package/dist/esm/hooks/use-selection-drag-copy.d.ts.map +1 -0
- package/dist/esm/hooks/use-selection-drag-copy.js +245 -0
- package/dist/esm/hooks/use-selection-renderer.d.ts +8 -1
- package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection-renderer.js +7 -2
- package/dist/esm/hooks/use-selection.d.ts +59 -1
- package/dist/esm/hooks/use-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection.js +245 -52
- package/dist/esm/index.d.ts +6 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -0
- package/dist/esm/release-date.js +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types.d.ts +50 -1
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/spreadsheet.min.css +1 -1
- package/package.json +6 -5
- package/dist/cjs/components/cell-error/index.d.ts +0 -14
- package/dist/cjs/components/cell-error/index.d.ts.map +0 -1
- package/dist/cjs/components/cell-error/index.js +0 -24
- package/dist/esm/components/cell-error/index.d.ts +0 -14
- package/dist/esm/components/cell-error/index.d.ts.map +0 -1
- package/dist/esm/components/cell-error/index.js +0 -18
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuTrigger, } from "@rowsncolumns/ui";
|
|
2
|
+
import React, { useRef, useState } from "react";
|
|
3
|
+
import { StyledFakeTriggerButton } from "../context-menu/style";
|
|
4
|
+
export const SELECTION_DROP_ACTION_LABELS = {
|
|
5
|
+
move: "Move Here",
|
|
6
|
+
copy: "Copy Here",
|
|
7
|
+
"copy-values": "Copy Here as Values Only",
|
|
8
|
+
"copy-formats": "Copy Here as Formats Only",
|
|
9
|
+
link: "Link Here",
|
|
10
|
+
"shift-down-copy": "Shift Down and Copy",
|
|
11
|
+
"shift-right-copy": "Shift Right and Copy",
|
|
12
|
+
"shift-down-move": "Shift Down and Move",
|
|
13
|
+
"shift-right-move": "Shift Right and Move",
|
|
14
|
+
};
|
|
15
|
+
/** Excel's grouping: plain drops, then the inserting ones, then Cancel. */
|
|
16
|
+
const INSERT_ACTIONS = new Set([
|
|
17
|
+
"shift-down-copy",
|
|
18
|
+
"shift-right-copy",
|
|
19
|
+
"shift-down-move",
|
|
20
|
+
"shift-right-move",
|
|
21
|
+
]);
|
|
22
|
+
/**
|
|
23
|
+
* The menu a right-button drag of the selection border opens at the release point
|
|
24
|
+
* (Excel: Move Here, Copy Here, … Cancel). Opens immediately; any dismissal cancels.
|
|
25
|
+
*/
|
|
26
|
+
export const SelectionDropMenu = ({ x, y, actions, onSelectAction, onCancel, }) => {
|
|
27
|
+
const [open, setOpen] = useState(true);
|
|
28
|
+
// Radix fires `onSelect` and then closes; a close that follows a choice is not a cancel.
|
|
29
|
+
const choseRef = useRef(false);
|
|
30
|
+
const plain = actions.filter((action) => !INSERT_ACTIONS.has(action));
|
|
31
|
+
const inserting = actions.filter((action) => INSERT_ACTIONS.has(action));
|
|
32
|
+
const item = (action) => (React.createElement(DropdownMenuItem, { key: action, onSelect: () => {
|
|
33
|
+
choseRef.current = true;
|
|
34
|
+
onSelectAction(action);
|
|
35
|
+
} }, SELECTION_DROP_ACTION_LABELS[action]));
|
|
36
|
+
return (React.createElement("div", { className: "absolute pointer-events-auto z-10", style: { left: x, top: y }, onMouseDown: (e) => e.stopPropagation(), "data-testid": "selection-drop-menu" },
|
|
37
|
+
React.createElement(DropdownMenu, { modal: false, open: open, onOpenChange: (next) => {
|
|
38
|
+
setOpen(next);
|
|
39
|
+
if (!next && !choseRef.current)
|
|
40
|
+
onCancel();
|
|
41
|
+
if (!next)
|
|
42
|
+
choseRef.current = false;
|
|
43
|
+
} },
|
|
44
|
+
React.createElement(DropdownMenuTrigger, { asChild: true },
|
|
45
|
+
React.createElement(StyledFakeTriggerButton, { "aria-label": "Drop options" })),
|
|
46
|
+
React.createElement(DropdownMenuPortal, null,
|
|
47
|
+
React.createElement(DropdownMenuContent, { align: "start", onCloseAutoFocus: (event) => event.preventDefault() },
|
|
48
|
+
plain.map(item),
|
|
49
|
+
inserting.length ? React.createElement(DropdownMenuSeparator, null) : null,
|
|
50
|
+
inserting.map(item),
|
|
51
|
+
React.createElement(DropdownMenuSeparator, null),
|
|
52
|
+
React.createElement(DropdownMenuItem, { onSelect: () => {
|
|
53
|
+
choseRef.current = true;
|
|
54
|
+
onCancel();
|
|
55
|
+
} }, "Cancel"))))));
|
|
56
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
type Range = {
|
|
3
|
+
startRowIndex: number;
|
|
4
|
+
endRowIndex: number;
|
|
5
|
+
startColumnIndex: number;
|
|
6
|
+
endColumnIndex: number;
|
|
7
|
+
};
|
|
8
|
+
export type SolverDialogConstraint = {
|
|
9
|
+
cells: Range;
|
|
10
|
+
operator: "<=" | "=" | ">=" | "int" | "bin";
|
|
11
|
+
rhs?: number | Range;
|
|
12
|
+
};
|
|
13
|
+
/** What the dialog asks the engine to solve (the `solve` command's fields). */
|
|
14
|
+
export type SolverDialogParameters = {
|
|
15
|
+
objective: {
|
|
16
|
+
rowIndex: number;
|
|
17
|
+
columnIndex: number;
|
|
18
|
+
};
|
|
19
|
+
goal: "max" | "min" | "value";
|
|
20
|
+
targetValue?: number;
|
|
21
|
+
changingCells: Range[];
|
|
22
|
+
constraints: SolverDialogConstraint[];
|
|
23
|
+
method: "grgNonlinear" | "simplexLp";
|
|
24
|
+
assumeNonNegative: boolean;
|
|
25
|
+
};
|
|
26
|
+
/** The engine's `CommitResult.solver`, as far as the dialog reads it. */
|
|
27
|
+
export type SolverDialogResult = {
|
|
28
|
+
status: string;
|
|
29
|
+
message: string;
|
|
30
|
+
values: {
|
|
31
|
+
rowIndex: number;
|
|
32
|
+
columnIndex: number;
|
|
33
|
+
value: number;
|
|
34
|
+
}[];
|
|
35
|
+
};
|
|
36
|
+
export type SolverDialogProps = {
|
|
37
|
+
open: boolean;
|
|
38
|
+
onOpenChange(open: boolean): void;
|
|
39
|
+
/** Default "Set Objective" (the active cell as A1). */
|
|
40
|
+
initialObjective: string;
|
|
41
|
+
/** Runs the solve without keeping it (`preview`), resolving to the outcome. */
|
|
42
|
+
onSolve(parameters: SolverDialogParameters): Promise<SolverDialogResult | undefined>;
|
|
43
|
+
/** "Keep Solver Solution": write the solution into the variable cells. */
|
|
44
|
+
onKeep(result: SolverDialogResult): void;
|
|
45
|
+
};
|
|
46
|
+
/** `B1`, `B1:C3` (`$` allowed) → a range; `null` otherwise. */
|
|
47
|
+
export declare const parseSolverRange: (text: string) => Range | null;
|
|
48
|
+
/**
|
|
49
|
+
* Excel's Solver Parameters dialog (the Solver add-in): Set Objective, To
|
|
50
|
+
* Max / Min / Value Of, By Changing Variable Cells, Subject to the
|
|
51
|
+
* Constraints, Make Unconstrained Variables Non-Negative and the solving
|
|
52
|
+
* method; then Solver Results with Keep Solver Solution / Restore Original
|
|
53
|
+
* Values. Evolutionary is not offered.
|
|
54
|
+
*/
|
|
55
|
+
export declare const SolverDialog: React.MemoExoticComponent<({ open, onOpenChange, initialObjective, onSolve, onKeep }: SolverDialogProps) => React.JSX.Element>;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/solver-dialog/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAEtE,KAAK,KAAK,GAAG;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5C,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,KAAK,EAAE,CAAC;IACvB,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,MAAM,EAAE,cAAc,GAAG,WAAW,CAAC;IACrC,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,OAAO,CAAC,UAAU,EAAE,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IACrF,0EAA0E;IAC1E,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC1C,CAAC;AAIF,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,KAAK,GAAG,IAYvD,CAAC;AAIF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,wFACqC,iBAAiB,uBA6Q9E,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { Cross1Icon } from "@rowsncolumns/icons";
|
|
2
|
+
import { Button, Dialog, DialogBody, DialogCloseButton, DialogContent, DialogDescription, DialogTitle, Input, Separator, } from "@rowsncolumns/ui";
|
|
3
|
+
import { addressToCell } from "@rowsncolumns/utils";
|
|
4
|
+
import React, { memo, useCallback, useEffect, useState } from "react";
|
|
5
|
+
const OPERATORS = ["<=", "=", ">=", "int", "bin"];
|
|
6
|
+
/** `B1`, `B1:C3` (`$` allowed) → a range; `null` otherwise. */
|
|
7
|
+
export const parseSolverRange = (text) => {
|
|
8
|
+
const [a, b = a] = text.trim().replace(/\$/g, "").split(":");
|
|
9
|
+
if (!/^[A-Za-z]{1,3}\d+$/.test(a ?? "") || !/^[A-Za-z]{1,3}\d+$/.test(b))
|
|
10
|
+
return null;
|
|
11
|
+
const start = addressToCell(a);
|
|
12
|
+
const end = addressToCell(b);
|
|
13
|
+
if (!start || !end)
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
startRowIndex: Math.min(start.rowIndex, end.rowIndex),
|
|
17
|
+
endRowIndex: Math.max(start.rowIndex, end.rowIndex),
|
|
18
|
+
startColumnIndex: Math.min(start.columnIndex, end.columnIndex),
|
|
19
|
+
endColumnIndex: Math.max(start.columnIndex, end.columnIndex),
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Excel's Solver Parameters dialog (the Solver add-in): Set Objective, To
|
|
24
|
+
* Max / Min / Value Of, By Changing Variable Cells, Subject to the
|
|
25
|
+
* Constraints, Make Unconstrained Variables Non-Negative and the solving
|
|
26
|
+
* method; then Solver Results with Keep Solver Solution / Restore Original
|
|
27
|
+
* Values. Evolutionary is not offered.
|
|
28
|
+
*/
|
|
29
|
+
export const SolverDialog = memo(({ open, onOpenChange, initialObjective, onSolve, onKeep }) => {
|
|
30
|
+
const [objective, setObjective] = useState(initialObjective);
|
|
31
|
+
const [goal, setGoal] = useState("max");
|
|
32
|
+
const [target, setTarget] = useState("0");
|
|
33
|
+
const [changing, setChanging] = useState("");
|
|
34
|
+
const [constraints, setConstraints] = useState([]);
|
|
35
|
+
const [nonNegative, setNonNegative] = useState(true);
|
|
36
|
+
const [method, setMethod] = useState("grgNonlinear");
|
|
37
|
+
const [error, setError] = useState(undefined);
|
|
38
|
+
const [busy, setBusy] = useState(false);
|
|
39
|
+
const [result, setResult] = useState(undefined);
|
|
40
|
+
const [keep, setKeep] = useState(true);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (open) {
|
|
43
|
+
setObjective(initialObjective);
|
|
44
|
+
setError(undefined);
|
|
45
|
+
setBusy(false);
|
|
46
|
+
setResult(undefined);
|
|
47
|
+
setKeep(true);
|
|
48
|
+
}
|
|
49
|
+
// Only reset on open; the model's fields stay as last entered, as in Excel.
|
|
50
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
51
|
+
}, [open]);
|
|
52
|
+
const solve = useCallback(async (event) => {
|
|
53
|
+
event.preventDefault();
|
|
54
|
+
const objectiveRange = parseSolverRange(objective);
|
|
55
|
+
if (!objectiveRange ||
|
|
56
|
+
objectiveRange.startRowIndex !== objectiveRange.endRowIndex ||
|
|
57
|
+
objectiveRange.startColumnIndex !== objectiveRange.endColumnIndex) {
|
|
58
|
+
setError("Set Objective must be a single cell reference.");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const changingCells = changing.split(",").map((t) => parseSolverRange(t));
|
|
62
|
+
if (changingCells.length === 0 || changingCells.some((r) => r === null)) {
|
|
63
|
+
setError("By Changing Variable Cells must be cell references, e.g. B1:B3.");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const targetValue = Number(target);
|
|
67
|
+
if (goal === "value" && !Number.isFinite(targetValue)) {
|
|
68
|
+
setError("Value Of must be a number.");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const specs = [];
|
|
72
|
+
for (const row of constraints) {
|
|
73
|
+
const cells = parseSolverRange(row.cells);
|
|
74
|
+
if (!cells) {
|
|
75
|
+
setError(`Constraint cell reference ${row.cells || "(empty)"} is not valid.`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (row.operator === "int" || row.operator === "bin") {
|
|
79
|
+
specs.push({ cells, operator: row.operator });
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const n = Number(row.rhs);
|
|
83
|
+
const rhs = row.rhs.trim() !== "" && Number.isFinite(n) ? n : parseSolverRange(row.rhs);
|
|
84
|
+
if (rhs === null) {
|
|
85
|
+
setError("Constraint must be a number or a cell reference.");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
specs.push({ cells, operator: row.operator, rhs });
|
|
89
|
+
}
|
|
90
|
+
setError(undefined);
|
|
91
|
+
setBusy(true);
|
|
92
|
+
try {
|
|
93
|
+
const outcome = await onSolve({
|
|
94
|
+
objective: {
|
|
95
|
+
rowIndex: objectiveRange.startRowIndex,
|
|
96
|
+
columnIndex: objectiveRange.startColumnIndex,
|
|
97
|
+
},
|
|
98
|
+
goal,
|
|
99
|
+
...(goal === "value" ? { targetValue } : {}),
|
|
100
|
+
changingCells: changingCells,
|
|
101
|
+
constraints: specs,
|
|
102
|
+
method,
|
|
103
|
+
assumeNonNegative: nonNegative,
|
|
104
|
+
});
|
|
105
|
+
if (!outcome) {
|
|
106
|
+
setError("Solver could not run this model.");
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
setResult(outcome);
|
|
110
|
+
setKeep(true);
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
setBusy(false);
|
|
114
|
+
}
|
|
115
|
+
}, [objective, changing, target, goal, constraints, method, nonNegative, onSolve]);
|
|
116
|
+
const finish = () => {
|
|
117
|
+
if (result && keep && result.values.length > 0)
|
|
118
|
+
onKeep(result);
|
|
119
|
+
onOpenChange(false);
|
|
120
|
+
};
|
|
121
|
+
const solved = result ? ["found", "integer-found", "converged"].includes(result.status) : false;
|
|
122
|
+
return (React.createElement(Dialog, { open: open, onOpenChange: onOpenChange },
|
|
123
|
+
React.createElement(DialogContent, { className: "w-[460px] max-w-[92vw] pointer-events-auto" },
|
|
124
|
+
React.createElement(DialogTitle, null, result ? "Solver Results" : "Solver Parameters"),
|
|
125
|
+
React.createElement(DialogDescription, null, "Find the variable cell values that optimize the objective under the constraints."),
|
|
126
|
+
React.createElement(DialogCloseButton, { onClick: () => onOpenChange(false) },
|
|
127
|
+
React.createElement(Cross1Icon, null)),
|
|
128
|
+
React.createElement(DialogBody, { className: "flex flex-col gap-3 font-system text-sm" }, result ? (React.createElement("div", { className: "flex flex-col gap-3" },
|
|
129
|
+
React.createElement("p", { role: "status", className: "text-xs" }, result.message),
|
|
130
|
+
solved ? (React.createElement("div", { className: "flex flex-col gap-1 text-xs" },
|
|
131
|
+
React.createElement("label", { className: "flex items-center gap-2" },
|
|
132
|
+
React.createElement("input", { type: "radio", checked: keep, onChange: () => setKeep(true) }),
|
|
133
|
+
"Keep Solver Solution"),
|
|
134
|
+
React.createElement("label", { className: "flex items-center gap-2" },
|
|
135
|
+
React.createElement("input", { type: "radio", checked: !keep, onChange: () => setKeep(false) }),
|
|
136
|
+
"Restore Original Values"))) : null,
|
|
137
|
+
React.createElement(Separator, null),
|
|
138
|
+
React.createElement("div", { className: "flex justify-end gap-2" },
|
|
139
|
+
React.createElement(Button, { type: "button", size: "sm", variant: "outline", onClick: () => setResult(undefined) }, "Return to Solver Parameters"),
|
|
140
|
+
React.createElement(Button, { type: "button", size: "sm", onClick: () => (solved ? finish() : onOpenChange(false)) }, "OK")))) : (React.createElement("form", { className: "flex flex-col gap-3", onSubmit: solve },
|
|
141
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
142
|
+
"Set Objective:",
|
|
143
|
+
React.createElement(Input, { autoFocus: true, "aria-label": "Set Objective", value: objective, onChange: (e) => setObjective(e.target.value) })),
|
|
144
|
+
React.createElement("div", { className: "flex items-center gap-3 text-xs" },
|
|
145
|
+
"To:",
|
|
146
|
+
["max", "min", "value"].map((g) => (React.createElement("label", { key: g, className: "flex items-center gap-1" },
|
|
147
|
+
React.createElement("input", { type: "radio", checked: goal === g, onChange: () => setGoal(g) }),
|
|
148
|
+
g === "max" ? "Max" : g === "min" ? "Min" : "Value Of:"))),
|
|
149
|
+
React.createElement(Input, { className: "w-20", "aria-label": "Value Of", value: target, disabled: goal !== "value", onChange: (e) => setTarget(e.target.value) })),
|
|
150
|
+
React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
151
|
+
"By Changing Variable Cells:",
|
|
152
|
+
React.createElement(Input, { "aria-label": "By Changing Variable Cells", value: changing, onChange: (e) => setChanging(e.target.value) })),
|
|
153
|
+
React.createElement("div", { className: "flex flex-col gap-1 text-xs font-medium" },
|
|
154
|
+
"Subject to the Constraints:",
|
|
155
|
+
constraints.map((row, i) => (React.createElement("div", { key: i, className: "flex items-center gap-1" },
|
|
156
|
+
React.createElement(Input, { "aria-label": `Constraint ${i + 1} cell reference`, value: row.cells, onChange: (e) => setConstraints(constraints.map((r, k) => (k === i ? { ...r, cells: e.target.value } : r))) }),
|
|
157
|
+
React.createElement("select", { "aria-label": `Constraint ${i + 1} relation`, className: "h-8 rounded border border-rnc-border bg-transparent px-1 text-sm", value: row.operator, onChange: (e) => setConstraints(constraints.map((r, k) => k === i ? { ...r, operator: e.target.value } : r)) }, OPERATORS.map((op) => (React.createElement("option", { key: op, value: op }, op)))),
|
|
158
|
+
React.createElement(Input, { "aria-label": `Constraint ${i + 1} value`, value: row.operator === "int" ? "integer" : row.operator === "bin" ? "binary" : row.rhs, disabled: row.operator === "int" || row.operator === "bin", onChange: (e) => setConstraints(constraints.map((r, k) => (k === i ? { ...r, rhs: e.target.value } : r))) }),
|
|
159
|
+
React.createElement(Button, { type: "button", size: "sm", variant: "outline", "aria-label": `Delete constraint ${i + 1}`, onClick: () => setConstraints(constraints.filter((_, k) => k !== i)) }, "Delete")))),
|
|
160
|
+
React.createElement("div", null,
|
|
161
|
+
React.createElement(Button, { type: "button", size: "sm", variant: "outline", onClick: () => setConstraints([...constraints, { cells: "", operator: "<=", rhs: "" }]) }, "Add"))),
|
|
162
|
+
React.createElement("label", { className: "flex items-center gap-2 text-xs" },
|
|
163
|
+
React.createElement("input", { type: "checkbox", checked: nonNegative, onChange: (e) => setNonNegative(e.target.checked) }),
|
|
164
|
+
"Make Unconstrained Variables Non-Negative"),
|
|
165
|
+
React.createElement("label", { className: "flex items-center gap-2 text-xs font-medium" },
|
|
166
|
+
"Select a Solving Method:",
|
|
167
|
+
React.createElement("select", { "aria-label": "Select a Solving Method", className: "h-8 rounded border border-rnc-border bg-transparent px-2 text-sm", value: method, onChange: (e) => setMethod(e.target.value) },
|
|
168
|
+
React.createElement("option", { value: "grgNonlinear" }, "GRG Nonlinear"),
|
|
169
|
+
React.createElement("option", { value: "simplexLp" }, "Simplex LP"))),
|
|
170
|
+
error ? (React.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
|
|
171
|
+
React.createElement(Separator, null),
|
|
172
|
+
React.createElement("div", { className: "flex justify-end gap-2" },
|
|
173
|
+
React.createElement(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onOpenChange(false) }, "Close"),
|
|
174
|
+
React.createElement(Button, { type: "submit", size: "sm", disabled: busy }, busy ? "Solving…" : "Solve"))))))));
|
|
175
|
+
});
|
|
176
|
+
SolverDialog.displayName = "SolverDialog";
|
|
@@ -19,13 +19,14 @@ export type SparklineActionsProps = {
|
|
|
19
19
|
onDeleteSparklineGroup?(group: SparklineGroup): void;
|
|
20
20
|
onClearSparklines?(sheetId: number, cells: CellInterface[]): void;
|
|
21
21
|
onGroupSparklines?(sheetId: number, activeCell: CellInterface, cells: CellInterface[]): void;
|
|
22
|
+
onUngroupSparklines?(group: SparklineGroup): void;
|
|
22
23
|
readonly?: boolean;
|
|
23
24
|
};
|
|
24
25
|
/**
|
|
25
26
|
* Excel's Sparklines ribbon: Insert → Sparklines (Line / Column / Win-Loss → the Create
|
|
26
27
|
* Sparklines dialog) and, when the active cell is in a sparkline group, the Sparkline Design tab —
|
|
27
28
|
* Edit Data & Location, Type, Show (points + markers), Sparkline / marker colours, Axis (show
|
|
28
|
-
* axis, right-to-left, hidden data, empty cells, vertical min/max) and Group / Clear.
|
|
29
|
+
* axis, right-to-left, hidden data, empty cells, vertical min/max) and Group / Ungroup / Clear.
|
|
29
30
|
*/
|
|
30
|
-
export declare const SparklineActions: ({ sheetId, activeCell, selections, getSparklineGroup, onUpdateSparklineGroup, onDeleteSparklineGroup, onClearSparklines, onGroupSparklines, readonly, }: SparklineActionsProps) => React.JSX.Element;
|
|
31
|
+
export declare const SparklineActions: ({ sheetId, activeCell, selections, getSparklineGroup, onUpdateSparklineGroup, onDeleteSparklineGroup, onClearSparklines, onGroupSparklines, onUngroupSparklines, readonly, }: SparklineActionsProps) => React.JSX.Element;
|
|
31
32
|
//# sourceMappingURL=sparkline-actions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sparkline-actions.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/sparkline-actions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAmBvE,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,eAAO,MAAM,eAAe,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAIzE,CAAC;AA6CF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACjD,8FAA8F;IAC9F,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAAC;IACrF,sBAAsB,CAAC,CACrB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,kBAAkB,CAAC;QAAC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAAE,GACpE,OAAO,CAAC;IACX,sBAAsB,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IACrD,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAClE,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,
|
|
1
|
+
{"version":3,"file":"sparkline-actions.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/sparkline-actions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAmBvE,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,eAAO,MAAM,eAAe,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAIzE,CAAC;AA6CF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACjD,8FAA8F;IAC9F,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAAC;IACrF,sBAAsB,CAAC,CACrB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,kBAAkB,CAAC;QAAC,OAAO,CAAC,EAAE,qBAAqB,CAAA;KAAE,GACpE,OAAO,CAAC;IACX,sBAAsB,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IACrD,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAClE,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC7F,mBAAmB,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,8KAW9B,qBAAqB,sBAiYvB,CAAC"}
|
|
@@ -37,9 +37,9 @@ const Check = () => (React.createElement(DropdownMenuItemIndicator, null,
|
|
|
37
37
|
* Excel's Sparklines ribbon: Insert → Sparklines (Line / Column / Win-Loss → the Create
|
|
38
38
|
* Sparklines dialog) and, when the active cell is in a sparkline group, the Sparkline Design tab —
|
|
39
39
|
* Edit Data & Location, Type, Show (points + markers), Sparkline / marker colours, Axis (show
|
|
40
|
-
* axis, right-to-left, hidden data, empty cells, vertical min/max) and Group / Clear.
|
|
40
|
+
* axis, right-to-left, hidden data, empty cells, vertical min/max) and Group / Ungroup / Clear.
|
|
41
41
|
*/
|
|
42
|
-
export const SparklineActions = ({ sheetId, activeCell, selections, getSparklineGroup, onUpdateSparklineGroup, onDeleteSparklineGroup, onClearSparklines, onGroupSparklines, readonly, }) => {
|
|
42
|
+
export const SparklineActions = ({ sheetId, activeCell, selections, getSparklineGroup, onUpdateSparklineGroup, onDeleteSparklineGroup, onClearSparklines, onGroupSparklines, onUngroupSparklines, readonly, }) => {
|
|
43
43
|
const focusSheet = useFocusSheet();
|
|
44
44
|
const openDialog = useOpenSparklineDialog();
|
|
45
45
|
const shouldFocusSheetRef = useRef(true);
|
|
@@ -224,6 +224,10 @@ export const SparklineActions = ({ sheetId, activeCell, selections, getSparkline
|
|
|
224
224
|
axisBoundSubmenu("Vertical Axis Maximum", "maxaxistype", "max"))),
|
|
225
225
|
React.createElement(DropdownMenuSeparator, null),
|
|
226
226
|
React.createElement(DropdownMenuItem, { disabled: !sparklineCellsSelected || readonly, onSelect: () => onGroupSparklines?.(sheetId, activeCell, selectedCells) }, "Group"),
|
|
227
|
+
React.createElement(DropdownMenuItem, { disabled: !group || group.members.length < 2 || readonly, onSelect: () => {
|
|
228
|
+
if (group)
|
|
229
|
+
onUngroupSparklines?.(group);
|
|
230
|
+
} }, "Ungroup"),
|
|
227
231
|
React.createElement(DropdownMenuSub, null,
|
|
228
232
|
React.createElement(DropdownMenuSubTrigger, { disabled: !hasGroup || readonly },
|
|
229
233
|
"Clear",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-style-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/table-style-selector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAevE,OAAO,
|
|
1
|
+
{"version":3,"file":"table-style-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/table-style-selector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAevE,OAAO,EAEL,wBAAwB,EAKzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAuD,MAAM,OAAO,CAAC;AAG5E,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,OAAO,KAAK,EACV,gBAAgB,EAEhB,gBAAgB,EAEhB,iBAAiB,EACjB,UAAU,EACV,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACjD,UAAU,EAAE,aAAa,CAAC;IAC1B,aAAa,CAAC,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EACxB,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,GAC/B,IAAI,CAAC;IACR,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAC;IAC/D;;;OAGG;IACH,mBAAmB,CAAC,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;IAC9D,uFAAuF;IACvF,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC;;;OAGG;IACH,wBAAwB,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzD;;;OAGG;IACH,wBAAwB,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1D,CAAC;AAEF,uEAAuE;AACvE,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC;IACzB,GAAG,EACC,WAAW,GACX,UAAU,GACV,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;CACvB,CAQA,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,SAAS,EAChB,KAAK,CAAC,OAAO,aAAa,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,EAC1C,SAAS,OAAO,KACf,OAAO,CAAC,SAAS,CAqBnB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,UAAU;IACjB,kBAAkB,EAAE,MAAM,GAAG,SAAS;IACtC,cAAc,EAAE,MAAM,GAAG,SAAS;IAClC,cAAc,EAAE,gBAAgB,GAAG,SAAS;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa;CAC5B,CAAC;AAKF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAC/B,gBAAgB,OAAO,GAAG,SAAS,EACnC,mBAAmB,OAAO,GAAG,SAAS,EACtC,QAAQ,gBAAgB,kCAoBzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,kOAc1B,uBAAuB,uBAuX3B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isCellWithinBounds } from "@rowsncolumns/grid";
|
|
2
2
|
import { CheckIcon, MdOutlineArrowDropDown, TableIcon } from "@rowsncolumns/icons";
|
|
3
3
|
import { cn, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIndicator, DropdownMenuPortal, DropdownMenuTrigger, IconButton, Separator, } from "@rowsncolumns/ui";
|
|
4
|
-
import { findMatchingBandProperty, getContrastColor, getTableBorderStyles as getSharedTableStyles, } from "@rowsncolumns/utils";
|
|
4
|
+
import { findMatchingBandProperty, getContrastColor, getTableBorderStyles as getSharedTableStyles, resolveTableStyleCell, } from "@rowsncolumns/utils";
|
|
5
5
|
import React, { memo, useCallback, useMemo, useRef, useState } from "react";
|
|
6
6
|
// Re-export the shared function for backwards compatibility
|
|
7
7
|
export { findMatchingBandProperty };
|
|
@@ -183,8 +183,7 @@ export const TableStyleSelector = memo(({ tables, sheetId, theme, activeCell, se
|
|
|
183
183
|
const tableBorderstyles = useMemo(() => [
|
|
184
184
|
...getTableBorderStyles(showRowStripes, showColumnStripes, theme).entries(),
|
|
185
185
|
], [showRowStripes, showColumnStripes, theme]);
|
|
186
|
-
const swatch = (key, tableTheme, bandProperties, style, onContextMenu) => (React.createElement(DropdownMenuItem, { key: key, onClick: () => onSelectStyle(tableTheme, bandProperties), onContextMenu: onContextMenu, onPointerEnter: () => previewStyle(tableTheme, bandProperties), onPointerLeave: clearPreview, onFocus: () => previewStyle(tableTheme, bandProperties), onBlur: clearPreview, className: hoverClass, title: tableTheme },
|
|
187
|
-
React.createElement(TableSkeleton, { rowProperties: bandProperties?.rowProperties, columnProperties: bandProperties?.columnProperties, theme: theme, style: style })));
|
|
186
|
+
const swatch = (key, tableTheme, bandProperties, style, onContextMenu) => (React.createElement(DropdownMenuItem, { key: key, onClick: () => onSelectStyle(tableTheme, bandProperties), onContextMenu: onContextMenu, onPointerEnter: () => previewStyle(tableTheme, bandProperties), onPointerLeave: clearPreview, onFocus: () => previewStyle(tableTheme, bandProperties), onBlur: clearPreview, className: hoverClass, title: tableTheme }, bandProperties?.tableStyleElements ? (React.createElement(TableStyleElementsSkeleton, { elements: bandProperties.tableStyleElements, theme: theme, style: style })) : (React.createElement(TableSkeleton, { rowProperties: bandProperties?.rowProperties, columnProperties: bandProperties?.columnProperties, theme: theme, style: style }))));
|
|
188
187
|
return (React.createElement(DropdownMenu, { modal: false, onOpenChange: (open) => {
|
|
189
188
|
if (!open) {
|
|
190
189
|
clearPreview();
|
|
@@ -258,6 +257,33 @@ export const TableStyleSelector = memo(({ tables, sheetId, theme, activeCell, se
|
|
|
258
257
|
// the editor is open its footer ends the panel.
|
|
259
258
|
React.createElement(DropdownMenuItem, { className: "text-xs", onClick: () => onSelectStyle("None", undefined), onPointerEnter: () => previewStyle("None", undefined), onPointerLeave: clearPreview, onFocus: () => previewStyle("None", undefined), onBlur: clearPreview }, "Clear")))))));
|
|
260
259
|
});
|
|
260
|
+
const swatchEdge = (border, theme) => border
|
|
261
|
+
? `${Math.min(border.width, 2)}px solid ${getStringifiedColor(border.color, theme)}`
|
|
262
|
+
: undefined;
|
|
263
|
+
/**
|
|
264
|
+
* A built-in style's swatch: a header row over four body rows, five columns, each cell painted
|
|
265
|
+
* with the format the table style elements give it in the grid (`resolveTableStyleCell`).
|
|
266
|
+
*/
|
|
267
|
+
const TableStyleElementsSkeleton = ({ elements, theme, style, }) => (React.createElement("div", { className: "table border-collapse table-fixed w-20 md:w-16", style: style }, [...Array(5)].map((_, rowIndex) => (React.createElement("div", { className: "table-row", key: rowIndex }, [...Array(5)].map((_, columnIndex) => {
|
|
268
|
+
const { fill, color, borders } = resolveTableStyleCell(elements, {
|
|
269
|
+
rowIndex,
|
|
270
|
+
columnIndex,
|
|
271
|
+
rowCount: 5,
|
|
272
|
+
columnCount: 5,
|
|
273
|
+
headerRow: true,
|
|
274
|
+
totalRow: false,
|
|
275
|
+
showFirstColumn: false,
|
|
276
|
+
showLastColumn: false,
|
|
277
|
+
});
|
|
278
|
+
return (React.createElement("div", { key: columnIndex, className: cn("table-cell leading-none text-center", rowIndex === 0 ? "h-1" : ""), style: {
|
|
279
|
+
backgroundColor: getStringifiedColor(fill, theme),
|
|
280
|
+
color: getStringifiedColor(color, theme),
|
|
281
|
+
borderTop: swatchEdge(borders?.top, theme),
|
|
282
|
+
borderBottom: swatchEdge(borders?.bottom, theme),
|
|
283
|
+
borderLeft: swatchEdge(borders?.left, theme),
|
|
284
|
+
borderRight: swatchEdge(borders?.right, theme),
|
|
285
|
+
} }, "-"));
|
|
286
|
+
}))))));
|
|
261
287
|
/**
|
|
262
288
|
* Table skeleton
|
|
263
289
|
* @param param0
|
package/dist/esm/config.d.ts
CHANGED
|
@@ -100,10 +100,11 @@ export declare const EXPAND_COLLAPSE_ICON_WIDTH = 12;
|
|
|
100
100
|
export declare const CF_ICON_WIDTH = 14;
|
|
101
101
|
export declare const CF_ICON_SPACING = 4;
|
|
102
102
|
export declare const HEADER_MENU_DIM = 15;
|
|
103
|
-
export declare const
|
|
104
|
-
export declare const
|
|
105
|
-
export declare const
|
|
106
|
-
export declare const
|
|
103
|
+
export declare const INDICATOR_SIZE = 6.5;
|
|
104
|
+
export declare const INVALID_COLOR = "#FF0000";
|
|
105
|
+
export declare const ERROR_COLOR = "#008000";
|
|
106
|
+
export declare const NOTE_COLOR = "#FF0000";
|
|
107
|
+
export declare const COMMENT_COLOR = "#7719AA";
|
|
107
108
|
export declare const DEFAULT_CELL_INPUT_LINE_HEIGHT = "23px";
|
|
108
109
|
export declare const FORMULA_BAR_HEIGHT = 23;
|
|
109
110
|
export declare const SCROLLBAR_SIZE = 13;
|
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
|
@@ -128,14 +128,18 @@ export const CF_ICON_WIDTH = 14;
|
|
|
128
128
|
export const CF_ICON_SPACING = 4;
|
|
129
129
|
// Header menu
|
|
130
130
|
export const HEADER_MENU_DIM = 15;
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
//
|
|
136
|
-
export const
|
|
137
|
-
//
|
|
138
|
-
export const
|
|
131
|
+
// Cell indicators (Excel's places and colours). Sizes are at 100 % zoom; the grid multiplies by
|
|
132
|
+
// the zoom scale.
|
|
133
|
+
export const INDICATOR_SIZE = 6.5;
|
|
134
|
+
// Invalid cell: Data → Data Validation → Circle Invalid Data draws a red circle. Excel does not
|
|
135
|
+
// mark an invalid cell otherwise.
|
|
136
|
+
export const INVALID_COLOR = "#FF0000";
|
|
137
|
+
// Error-checking indicator: green ◤ in the top-left corner (Excel's "Automatic" indicator colour).
|
|
138
|
+
export const ERROR_COLOR = "#008000";
|
|
139
|
+
// Note: red ◥ in the top-right corner.
|
|
140
|
+
export const NOTE_COLOR = "#FF0000";
|
|
141
|
+
// Threaded comment: purple marker in the top-right corner.
|
|
142
|
+
export const COMMENT_COLOR = "#7719AA";
|
|
139
143
|
// CellInput
|
|
140
144
|
export const DEFAULT_CELL_INPUT_LINE_HEIGHT = "23px";
|
|
141
145
|
// Formula bar
|
|
@@ -4,6 +4,7 @@ import { Direction } from "@rowsncolumns/grid";
|
|
|
4
4
|
import type { FormulaLocale } from "@rowsncolumns/utils";
|
|
5
5
|
import type { CellDiff } from "@rowsncolumns/version-comparison";
|
|
6
6
|
import React from "react";
|
|
7
|
+
import type { ErrorCheckKind } from "../api/error-checking";
|
|
7
8
|
import type { CanvasGridProps, SpreadsheetTheme } from "../components/canvas-grid/typings";
|
|
8
9
|
import type { CellData, CellFormat, Color, DataValidationRule, ErrorValue, SortOrder, TextFormat } from "../types";
|
|
9
10
|
import type { useSizer } from "./use-sizer";
|
|
@@ -222,6 +223,16 @@ export type CellRendererProps<T extends CellData = CellData> = {
|
|
|
222
223
|
* Width of grid line
|
|
223
224
|
*/
|
|
224
225
|
gridLineWidth: number;
|
|
226
|
+
/**
|
|
227
|
+
* Excel's background error checking: which rule flags this cell (formula error, number stored
|
|
228
|
+
* as text), or `undefined`. Flagged cells get the green ◤ indicator.
|
|
229
|
+
*/
|
|
230
|
+
getErrorCheck?(sheetId: number, rowIndex: number, columnIndex: number): ErrorCheckKind | undefined;
|
|
231
|
+
/**
|
|
232
|
+
* Data → Data Validation → Circle Invalid Data: circle every cell that fails its validation.
|
|
233
|
+
* Off by default — Excel does not mark invalid cells otherwise.
|
|
234
|
+
*/
|
|
235
|
+
circleInvalidData?: boolean;
|
|
225
236
|
/**
|
|
226
237
|
* Display notes indicator
|
|
227
238
|
*/
|
|
@@ -280,5 +291,5 @@ export type CellRendererProps<T extends CellData = CellData> = {
|
|
|
280
291
|
*/
|
|
281
292
|
getDefaultHorizontalAlignment(sheetId: number, rowIndex: number, columnIndex: number): HorizontalAlign | undefined;
|
|
282
293
|
};
|
|
283
|
-
export declare const useCellRenderer: <T extends CellData = CellData>({ sheetId, scale, showGridLines, showZeros, isRowHeader, isColumnHeader, selectedRows, selectedColumns, selectedRowHeaders, selectedColumnHeaders, cellBackgroundColor, headerBorderColor, headerBackgroundColor, headerColor, headerActiveBackgroundColor, headerSelectedBackgroundColor, headerSelectedColor, headerTableBackgroundColor, headerTableActiveBackgroundColor, headerTableSelectedBackgroundColor, chipBackgroundColor, filterIconColor, showCalculatedColumnIcon, enableTextOverflow, showHeaders, theme, getDefaultHorizontalAlignment, isTableFilterVisible, columnContainsTable, rowsContainsTable, canOverflowToNextCell, getTableHeaderSortOrder, getDataValidation, getErrorValue, formulaLocale, locale, getEffectiveValue, getSparklineGroup, getFormattedValue, getNote, getComment, getEffectiveCellFormat, getCellBounds, getCellImageUrl, getCellMetaType, getRowHeaderText, getColumnHeaderText, getMaximumOverflowTextWidth, getCenterAcrossSelectionSpan, activeCell, getTextDimension, getCellGroupingInfo, getTextFormatRuns, onRequestEdit, onFilterClick, onCheckboxClick, isTableHeader, isTableTotalsCell, onTotalsArrowClick, isCalculatedColumnHeader, isTableHeaderFilterActive, HeaderCell, Cell, StructuredResult, gridLineWidth, showNotes, showComments, defaultFontSizePoint, lineHeightMode, readonly, onExpandCollapse, onOverflow, isComparing, getCellDiff, }: CellRendererProps<T>) => readonly [(props: RendererProps) => React.JSX.Element | null, (props: RendererProps) => React.JSX.Element, (props: RendererProps) => React.JSX.Element | null, (props: RendererProps) => React.JSX.Element | null | undefined, (cells: RendererProps[]) => React.JSX.Element];
|
|
294
|
+
export declare const useCellRenderer: <T extends CellData = CellData>({ sheetId, scale, showGridLines, showZeros, isRowHeader, isColumnHeader, selectedRows, selectedColumns, selectedRowHeaders, selectedColumnHeaders, cellBackgroundColor, headerBorderColor, headerBackgroundColor, headerColor, headerActiveBackgroundColor, headerSelectedBackgroundColor, headerSelectedColor, headerTableBackgroundColor, headerTableActiveBackgroundColor, headerTableSelectedBackgroundColor, chipBackgroundColor, filterIconColor, showCalculatedColumnIcon, enableTextOverflow, showHeaders, theme, getDefaultHorizontalAlignment, isTableFilterVisible, columnContainsTable, rowsContainsTable, canOverflowToNextCell, getTableHeaderSortOrder, getDataValidation, getErrorValue, formulaLocale, locale, getEffectiveValue, getSparklineGroup, getFormattedValue, getNote, getComment, getEffectiveCellFormat, getCellBounds, getCellImageUrl, getCellMetaType, getRowHeaderText, getColumnHeaderText, getMaximumOverflowTextWidth, getCenterAcrossSelectionSpan, activeCell, getTextDimension, getCellGroupingInfo, getTextFormatRuns, onRequestEdit, onFilterClick, onCheckboxClick, isTableHeader, isTableTotalsCell, onTotalsArrowClick, isCalculatedColumnHeader, isTableHeaderFilterActive, HeaderCell, Cell, StructuredResult, gridLineWidth, getErrorCheck, circleInvalidData, showNotes, showComments, defaultFontSizePoint, lineHeightMode, readonly, onExpandCollapse, onOverflow, isComparing, getCellDiff, }: CellRendererProps<T>) => readonly [(props: RendererProps) => React.JSX.Element | null, (props: RendererProps) => React.JSX.Element, (props: RendererProps) => React.JSX.Element | null, (props: RendererProps) => React.JSX.Element | null | undefined, (cells: RendererProps[]) => React.JSX.Element];
|
|
284
295
|
//# sourceMappingURL=use-cell-renderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-cell-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-cell-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,4BAA4B,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAsB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"use-cell-renderer.d.ts","sourceRoot":"","sources":["../../../hooks/use-cell-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,4BAA4B,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAsB,MAAM,OAAO,CAAC;AAG3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,mCAAmC,CAAC;AAoB3C,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,UAAU,EACX,MAAM,UAAU,CAAC;AAGlB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1C,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B,EAAE,MAAM,CAAC;IACpC,6BAA6B,EAAE,MAAM,CAAC;IACtC,gCAAgC,EAAE,MAAM,CAAC;IACzC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;IACnC,kCAAkC,EAAE,MAAM,CAAC;IAC3C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,OAAO,CAAC;IAClC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9D;;;OAGG;IACH,iBAAiB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,kBAAkB,CAAC,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/C,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9D,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACzD,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACzE,yBAAyB,CACvB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,uBAAuB,EAAE,CACvB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;IAClC,oBAAoB,CAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,qBAAqB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC;IACxD,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,kBAAkB,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACvB;;;OAGG;IACH,iBAAiB,CAAC,CAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,GAClB;QAAE,OAAO,EAAE,aAAa,CAAC;YAAE,IAAI,EAAE,aAAa,CAAA;SAAE,CAAC,CAAA;KAAE,GAAG,SAAS,CAAC;IACnE,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,UAAU,GAAG,SAAS,CAAC;IAC1B;;;;OAIG;IACH,sBAAsB,CACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG;QAClC,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF;;;;OAIG;IACH,eAAe,CACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAAC;IACtB;;;;OAIG;IACH,eAAe,CACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,CAAC,CAAC,UAAU,CAAC,CAAC;IACjB;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3C;;;OAGG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IACjD;;;;OAIG;IACH,OAAO,CACL,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAAC;IACtB;;;;OAIG;IACH,UAAU,CACR,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,CAAC,CAAC,iBAAiB,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;IAC3C;;;;;OAKG;IACH;;;;OAIG;IACH,iBAAiB,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC;IACxD;;;;OAIG;IACH,2BAA2B,CACzB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,qBAAqB,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,EACvD,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,EACzC,UAAU,EAAE,OAAO,GAAG,SAAS,EAC/B,SAAS,EAAE,SAAS;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,GACjB;QACD,MAAM;QACN;YACE,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,MAAM;YACnB,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI;SAC9B,EAAE;QACH,MAAM,CAAC;KACR,CAAC;IACF;;;;;OAKG;IACH;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAClC,4BAA4B,CAAC,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAEjB;QACE,MAAM;QACN;YACE,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,MAAM;YACnB,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI;SAC9B,EAAE;QACH,MAAM;KACP,GACD,SAAS,CAAC;IACd;;;;;;OAMG;IACH,gBAAgB,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClE;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1D;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IACzC;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7D;;;;OAIG;IACH,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,SAAS,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7E;;OAEG;IACH,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C;;OAEG;IACH,UAAU,EAAE,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;IACvD;;OAEG;IACH,gBAAgB,EAAE,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnE;;OAEG;IACH,KAAK,EAAE,gBAAgB,CAAC;IACxB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,CACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,cAAc,GAAG,SAAS,CAAC;IAC9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B;;OAEG;IACH,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC3E;;;OAGG;IACH,cAAc,EAAE,WAAW,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/D;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE,OAAO,GACrB,IAAI,CAAC;IACR,UAAU,CAAC,EAAE,CACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;IACV;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,QAAQ,GAAG,IAAI,CAAC;IAErB;;;;;OAKG;IACH,6BAA6B,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,eAAe,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,k3CA6E5D,iBAAiB,CAAC,CAAC,CAAC,uBAynBX,aAAa,uCA5mBb,aAAa,gCA2fb,aAAa,uCApFb,aAAa,mDAoRb,aAAa,EAAE,uBA0B1B,CAAC"}
|
|
@@ -16,7 +16,7 @@ import { getCellBordersForRendering } from "../helpers/merged-cell-borders";
|
|
|
16
16
|
import { getStringifiedColor } from "../themes";
|
|
17
17
|
import { applyShowZeros } from "./show-zeros";
|
|
18
18
|
import { useCellDiffHighlight } from "./use-cell-diff-highlight";
|
|
19
|
-
export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRowHeader, isColumnHeader, selectedRows, selectedColumns, selectedRowHeaders, selectedColumnHeaders, cellBackgroundColor, headerBorderColor, headerBackgroundColor, headerColor, headerActiveBackgroundColor, headerSelectedBackgroundColor, headerSelectedColor, headerTableBackgroundColor, headerTableActiveBackgroundColor, headerTableSelectedBackgroundColor, chipBackgroundColor, filterIconColor, showCalculatedColumnIcon, enableTextOverflow, showHeaders, theme, getDefaultHorizontalAlignment, isTableFilterVisible, columnContainsTable, rowsContainsTable, canOverflowToNextCell, getTableHeaderSortOrder, getDataValidation, getErrorValue, formulaLocale, locale, getEffectiveValue, getSparklineGroup, getFormattedValue, getNote, getComment, getEffectiveCellFormat, getCellBounds, getCellImageUrl, getCellMetaType, getRowHeaderText, getColumnHeaderText, getMaximumOverflowTextWidth, getCenterAcrossSelectionSpan, activeCell, getTextDimension, getCellGroupingInfo, getTextFormatRuns, onRequestEdit, onFilterClick, onCheckboxClick, isTableHeader, isTableTotalsCell, onTotalsArrowClick, isCalculatedColumnHeader, isTableHeaderFilterActive, HeaderCell, Cell, StructuredResult, gridLineWidth, showNotes, showComments, defaultFontSizePoint, lineHeightMode, readonly, onExpandCollapse, onOverflow, isComparing = false, getCellDiff, }) => {
|
|
19
|
+
export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRowHeader, isColumnHeader, selectedRows, selectedColumns, selectedRowHeaders, selectedColumnHeaders, cellBackgroundColor, headerBorderColor, headerBackgroundColor, headerColor, headerActiveBackgroundColor, headerSelectedBackgroundColor, headerSelectedColor, headerTableBackgroundColor, headerTableActiveBackgroundColor, headerTableSelectedBackgroundColor, chipBackgroundColor, filterIconColor, showCalculatedColumnIcon, enableTextOverflow, showHeaders, theme, getDefaultHorizontalAlignment, isTableFilterVisible, columnContainsTable, rowsContainsTable, canOverflowToNextCell, getTableHeaderSortOrder, getDataValidation, getErrorValue, formulaLocale, locale, getEffectiveValue, getSparklineGroup, getFormattedValue, getNote, getComment, getEffectiveCellFormat, getCellBounds, getCellImageUrl, getCellMetaType, getRowHeaderText, getColumnHeaderText, getMaximumOverflowTextWidth, getCenterAcrossSelectionSpan, activeCell, getTextDimension, getCellGroupingInfo, getTextFormatRuns, onRequestEdit, onFilterClick, onCheckboxClick, isTableHeader, isTableTotalsCell, onTotalsArrowClick, isCalculatedColumnHeader, isTableHeaderFilterActive, HeaderCell, Cell, StructuredResult, gridLineWidth, getErrorCheck, circleInvalidData = false, showNotes, showComments, defaultFontSizePoint, lineHeightMode, readonly, onExpandCollapse, onOverflow, isComparing = false, getCellDiff, }) => {
|
|
20
20
|
// Version comparison diff highlighting - only active when isComparing is true
|
|
21
21
|
const { mergeCellFormatWithDiff, getDiffHighlight } = useCellDiffHighlight(isComparing ? getCellDiff : undefined);
|
|
22
22
|
// Edit
|
|
@@ -171,6 +171,7 @@ export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRo
|
|
|
171
171
|
// Error from formula calculation (Error icon). Both engines store the canonical spelling
|
|
172
172
|
// (`#VALUE!`); the grid paints the formula locale's (`#ЗНАЧ!`).
|
|
173
173
|
const isError = errorValue?.type === "Error";
|
|
174
|
+
const showErrorIndicator = !!getErrorCheck?.(sheetId, rowIndex, columnIndex);
|
|
174
175
|
const displayValue = isError
|
|
175
176
|
? localizeErrorValue(displayFormattedValue, formulaLocale)
|
|
176
177
|
: displayFormattedValue;
|
|
@@ -199,7 +200,7 @@ export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRo
|
|
|
199
200
|
? undefined
|
|
200
201
|
: getCellNumberFormatLayout(effectiveCellFormat?.numberFormat?.pattern, getExtendedValueNumber(effectiveValue) ??
|
|
201
202
|
getExtendedValueString(effectiveValue), displayValue, locale);
|
|
202
|
-
return (React.createElement(Cell, { value: displayValue, numberFormatLayout: numberFormatLayout, cellFormat: effectiveCellFormat, scale: scale, defaultBackgroundColor: cellBackgroundColor, onRequestEdit: onRequestEditCell, onArrowClick: showTotalsArrow ? onTotalsArrowClick : undefined, showArrow: showArrow, arrowOutside: showValidationArrow, showFilter: showFilter, isCalculatedColumn: isCalculatedColumn, showCheckbox: showCheckbox, showChip: showChip, chipBackgroundColor: chipBackgroundColor, filterIconColor: filterIconColor, onFilterClick: onFilterClick, onCheckboxClick: onCheckboxClick, isChecked: isChecked, isInvalid: isInvalid, isError: isError, imageUrl: imageUrl, isFilterActive: isFilterActive, enableOverflow: enableOverflow, cellWidth: cellWidth, showNote: showNote, showComment: showComment, showCalculatedColumnIcon: showCalculatedColumnIcon, theme: theme, expandable: expandable, expanded: expanded, textWidth: textWidth, columnSpans: columnSpans, overflowRight: overflowRight, overflowLeft: enableOverflow && (isCentered || centerAcrossSpan)
|
|
203
|
+
return (React.createElement(Cell, { value: displayValue, numberFormatLayout: numberFormatLayout, cellFormat: effectiveCellFormat, scale: scale, defaultBackgroundColor: cellBackgroundColor, onRequestEdit: onRequestEditCell, onArrowClick: showTotalsArrow ? onTotalsArrowClick : undefined, showArrow: showArrow, arrowOutside: showValidationArrow, showFilter: showFilter, isCalculatedColumn: isCalculatedColumn, showCheckbox: showCheckbox, showChip: showChip, chipBackgroundColor: chipBackgroundColor, filterIconColor: filterIconColor, onFilterClick: onFilterClick, onCheckboxClick: onCheckboxClick, isChecked: isChecked, isInvalid: isInvalid, isError: isError, showErrorIndicator: showErrorIndicator, circleInvalid: circleInvalidData && isInvalid, imageUrl: imageUrl, isFilterActive: isFilterActive, enableOverflow: enableOverflow, cellWidth: cellWidth, showNote: showNote, showComment: showComment, showCalculatedColumnIcon: showCalculatedColumnIcon, theme: theme, expandable: expandable, expanded: expanded, textWidth: textWidth, columnSpans: columnSpans, overflowRight: overflowRight, overflowLeft: enableOverflow && (isCentered || centerAcrossSpan)
|
|
203
204
|
? overflowLeft ?? 0
|
|
204
205
|
: undefined, centerOnSpan: !!centerAcrossSpan, showGridLines: showGridLines, structuredValue: effectiveValue?.structuredValue, sparklineGroupAxis: effectiveValue?.structuredValue?.kind === "sparkline" &&
|
|
205
206
|
getSparklineGroup
|
|
@@ -215,6 +216,8 @@ export const useCellRenderer = ({ sheetId, scale, showGridLines, showZeros, isRo
|
|
|
215
216
|
theme,
|
|
216
217
|
showNotes,
|
|
217
218
|
showComments,
|
|
219
|
+
getErrorCheck,
|
|
220
|
+
circleInvalidData,
|
|
218
221
|
defaultFontSizePoint,
|
|
219
222
|
lineHeightMode,
|
|
220
223
|
cellBackgroundColor,
|