@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/canvas-grid/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/canvas-grid/index.tsx"],"names":[],"mappings":"AAwDA,OAAO,KASN,MAAM,OAAO,CAAC;AA4Of,OAAO,KAAK,EAGV,QAAQ,EAWT,MAAM,aAAa,CAAC;AAyBrB,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EAEhB,MAAM,WAAW,CAAC;AAqgNnB,eAAO,MAAM,UAAU,EAA4C,CACjE,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,EAEvB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GACvB,wBAAwB,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAAE,KAChE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC"}
|
|
@@ -5,12 +5,14 @@ import { getBoundedCells, MouseButtonCodes } from "@rowsncolumns/grid";
|
|
|
5
5
|
import { isCellWithinBounds } from "@rowsncolumns/grid";
|
|
6
6
|
import { cellIdentifier, Grid as BaseGrid, isEqualCells, } from "@rowsncolumns/grid";
|
|
7
7
|
import { cn, DropdownMenuContent, DropdownMenuPortal, Skeleton, tryParseRichText, } from "@rowsncolumns/ui";
|
|
8
|
-
import { cellToAddress, getCellEffectiveFormat, getContrastColor, getFormulaLocale, getEffectiveDataValidationConditionType, isConditionalFormatFormulaRule, isDataValidationFormulaRule, isNil, isNilOrBlank, iterateCellsInRange, localizeCellInput, localizeFormula, localizeFunctionDescriptions, log, resolveDefaultHorizontalAlignment, ssfFormat, ssfFormatColor, uuid, } from "@rowsncolumns/utils";
|
|
9
|
-
import { useStore } from "jotai";
|
|
8
|
+
import { cellToAddress, DEFAULT_AUTOCORRECT_OPTIONS, getCellEffectiveFormat, getContrastColor, getFormulaLocale, getEffectiveDataValidationConditionType, isConditionalFormatFormulaRule, isDataValidationFormulaRule, isNil, isNilOrBlank, iterateCellsInRange, localizeCellInput, localizeFormula, localizeFunctionDescriptions, log, resolveDefaultHorizontalAlignment, ssfFormat, ssfFormatColor, uuid, } from "@rowsncolumns/utils";
|
|
9
|
+
import { useAtomValue, useStore } from "jotai";
|
|
10
10
|
import merge from "lodash/merge";
|
|
11
11
|
import throttle from "lodash/throttle";
|
|
12
12
|
import React, { forwardRef, memo, startTransition, useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
13
13
|
import { getBandedCells } from "../../api/banded-ranges";
|
|
14
|
+
import { getErrorCheckKind, isErrorIgnored, runErrorCheckOption, } from "../../api/error-checking";
|
|
15
|
+
import { formulaBarEditorInstanceAtom } from "../../atoms/formula-bar-editor-value.atom";
|
|
14
16
|
import { clearRangeForInsertedBand, formatsForInsertOption, insertedBandHasValues, } from "../../api/insert-options";
|
|
15
17
|
import { keepsCalculatedColumnTag, } from "../../api/calculated-column-fill";
|
|
16
18
|
import { keepsTableAutoExpansionTag, } from "../../api/table-auto-expansion";
|
|
@@ -22,11 +24,12 @@ import { findActiveTableWithinCell } from "../../api/table";
|
|
|
22
24
|
import { getDataValidationTooltipContent } from "../../api/validation-tooltip";
|
|
23
25
|
import { resolveGoToSpecial } from "../../api/go-to-special";
|
|
24
26
|
import { checkExcelValidationValue, isFormulaEntry, } from "../../api/excel-validation-kinds";
|
|
25
|
-
import { checkBooleanRule, decideValidationCommit, isCellFormulaHiddenUnderProtection,
|
|
26
|
-
import { useFormulaModeValue, useIsEvaluateFormulaDialogMounted, useIsGoToDialogMounted, useIsMoveOverwriteConfirmMounted, useIsPasteSpecialDialogMounted, useOpenEvaluateFormulaDialog, useOpenGoToDialog, useOpenMoveOverwriteConfirm, useOpenPasteSpecialDialog, useSetNoteEditorCell, useSetPinnedTooltip, useFillOptionsState, useInsertOptionsState, useTableAutoExpansionState, useCalculatedColumnFillState, useOpenFillSeriesDialog, useShowPasteMenu, useShowValidationAlert, } from "../../atoms";
|
|
27
|
+
import { checkBooleanRule, decideValidationCommit, isCellFormulaHiddenUnderProtection, isProtectedCell, isProtectedSheet, isRangeSelectableUnderProtection, resolveProtectedCellEdit, } from "../../api/validation";
|
|
28
|
+
import { useFormulaModeValue, useIsEvaluateFormulaDialogMounted, useIsGoToDialogMounted, useIsMoveOverwriteConfirmMounted, useIsPasteSpecialDialogMounted, useOpenEvaluateFormulaDialog, useOpenGoToDialog, useOpenMoveOverwriteConfirm, useOpenPasteSpecialDialog, useSetNoteEditorCell, useSetPinnedTooltip, useFillOptionsState, useInsertOptionsState, useTableAutoExpansionState, useCalculatedColumnFillState, useOpenFillSeriesDialog, usePickList, useShowPasteMenu, useShowValidationAlert, } from "../../atoms";
|
|
27
29
|
import { useActiveEditor } from "../../atoms/active-editor.atom";
|
|
28
30
|
import { useAddWatch, useIsWatchWindowMounted, useSetWatchWindowContext, } from "../../atoms/watch-window.atom";
|
|
29
31
|
import { useEditingCell } from "../../atoms/editing-cell.atom";
|
|
32
|
+
import { useSetEnterKeyDirection } from "../../atoms/enter-key-direction.atom";
|
|
30
33
|
import { useCellEditorInstance, useSetFormulabarEditorValue, useSetFormulaBarTextFormatRuns, } from "../../atoms/formula-bar-editor-value.atom";
|
|
31
34
|
import { useFormulaCanSelectCells, useFormulaSelectionMode, useSetFormulaSelectionState, } from "../../atoms/formula-selection-state.atom";
|
|
32
35
|
import { useFormulaSelections } from "../../atoms/formula-selections.atom";
|
|
@@ -80,6 +83,8 @@ import { useScaleListener } from "../../hooks/use-scale-listener";
|
|
|
80
83
|
import { useSelectedRowsColumns } from "../../hooks/use-selected-rows-columns";
|
|
81
84
|
import { useSelection, } from "../../hooks/use-selection";
|
|
82
85
|
import { useSelectionChange } from "../../hooks/use-selection-change";
|
|
86
|
+
import { useSelectionDragCopy } from "../../hooks/use-selection-drag-copy";
|
|
87
|
+
import { SelectionDropMenu } from "../selection-drop-menu";
|
|
83
88
|
import { useSelectionInterceptors } from "../../hooks/use-selection-interceptors";
|
|
84
89
|
import { useSelectionMove } from "../../hooks/use-selection-move";
|
|
85
90
|
import { useSelectionRenderer } from "../../hooks/use-selection-renderer";
|
|
@@ -98,6 +103,7 @@ import { scrollSubscriber } from "../../signals/scroll-subscriber";
|
|
|
98
103
|
import { getStringifiedColor } from "../../themes";
|
|
99
104
|
import { fillRangeForSeriesSpec, seedRangeForSeriesSpec, } from "../../api/fill-series";
|
|
100
105
|
import { Cell as DefaultCell } from "../cell";
|
|
106
|
+
import { getColumnAutoCompleteEntries, getPickListEntries, toAutoCompleteCell, } from "../../api/autocomplete";
|
|
101
107
|
import { CellEditor as DefaultCellEditor } from "../cell-editor";
|
|
102
108
|
import { ContextMenu as DefaultContextMenu } from "../context-menu";
|
|
103
109
|
import { ContextMenuDropdown } from "../context-menu/menu";
|
|
@@ -130,7 +136,7 @@ function isDetachedEditor(editor) {
|
|
|
130
136
|
return element != null && !element.isConnected;
|
|
131
137
|
}
|
|
132
138
|
function CanvasGridComponent(props, forwardedRef) {
|
|
133
|
-
const { licenseKey, sheetId, sheetType, ChartSheetView: ChartSheetViewComponent = ChartSheetView, instanceId, activeCell = DEFAULT_ACTIVE_CELL, selections = DEFAULT_ARRAY, frozenColumnCount = 0, frozenRowCount = 0, rowCount = DEFAULT_ROW_COUNT, columnCount = DEFAULT_COLUMN_COUNT, autoFocus, basicFilter, tables, namedRanges, bandedRanges = DEFAULT_ARRAY, tableBorderColor = "#008000", filterIconColor = FILTER_BUTTON_GLYPH_COLOR, conditionalFormats, showFilterIcon = true, showCalculatedColumnIcon = true, showHeaders = true, defaultColumnWidth = DEFAULT_COLUMN_WIDTH, defaultRowHeight = DEFAULT_ROW_HEIGHT, lineHeightMode = "fontMetrics", columnHeaderHeight = COLUMN_HEADER_HEIGHT, rowHeaderWidth = ROW_HEADER_WIDTH, gridLineColor = GRIDLINE_COLOR, cellBackgroundColor = DEFAULT_CELL_BACKGROUND_COLOR, cellColor = DEFAULT_CELL_COLOR, headerBorderColor = DEFAULT_HEADER_BORDER_COLOR, headerBackgroundColor = DEFAULT_HEADER_BG, headerColor = DEFAULT_HEADER_COLOR, headerActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_BG, headerSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_BG, headerSelectedColor = "white", headerTableBackgroundColor = DEFAULT_HEADER_TABLE_BG, headerTableActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_TABLE_BG, headerTableSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_TABLE_BG, frozenShadowColor = headerBorderColor, frozenShadowThickness = 1, selectionBackgroundColor = SELECTION_BG, selectionBorderColor = SELECTION_BORDER, selectionStrokeWidth, showActiveCellBorderInSelection, selectionDragBorderColor = SELECTION_BORDER, chartSelectedColor, chipBackgroundColor = CHIP_COLOR, merges = DEFAULT_ARRAY, borderStyles, protectedRanges, isWorkbookProtected: isWorkbookProtectedProp = false, getSheetProtection, pivotTables, charts, onUpdateChart, onChangeZOrder, embeds, slicers, rowMetadata = DEFAULT_ARRAY, columnMetadata = DEFAULT_ARRAY, scale = 1, zoomSpeed = 1, overscanCount = 3, enableEditOnEnterKey: enableEditOnEnterKeyProp, shouldHandleKeyDown, enableTextOverflow = true, showGridLines: _showGridLines, showZeros, pageBreaks, showFormulas = false, protectFormulas = false, showFrozenSeparator = true, HeaderCell = DefaultHeaderCell, Cell = DefaultCell, SelectionTitleComponent = SelectionTitle, CellEditor = DefaultCellEditor, CellTooltip, ContextMenu = DefaultContextMenu, ContextMenuWrapper = DefaultContextMenuWrapper, FilterBox = DefaultFilterBox, HeaderMoveDragComponent = DefaultHeaderMoveDragComponent, SuggestionsDropdown, stickyEditor = true, scrollSnap = false, scrollThrottleTimeout, preventBrowserDefaultScroll, mouseMoveThrottleTimeout = 60, tooltipIntentInterval = 60, selectionPolicy, users, userId, renderCollaboratorCursor, functionDescriptions, showHeaderMenuButton = true, scrollbarSize = SCROLLBAR_SIZE, theme = defaultSpreadsheetTheme, showNotes = true, showComments = true, locale, formulaLocale: formulaLocaleProp, agentSuggestions, onReviewSuggestion, onShowFormulas, getDataRowCount, getDataRegion, getChartComponent, getEmbedComponent, getSlicerComponent, onChange, onChangeBatch, onExpandCollapse, onPivotDrillDown, onDelete, onChangeEditorValue, onFill, onRequestCalculate, onChangeActiveCell, onChangeActiveSheet, onChangeSelections, getSheetName, getSheetId, getCellData, getNote: getNoteProp, getTextFormatRuns, getDataValidation, getEffectiveFormat, getFormattedValue: getFormattedValueProp, getTooltipContent, errorResolutionComponent, getEffectiveValue: getEffectiveValueProp, getSparklineGroup, getUserEnteredExtendedValue, getEffectiveExtendedValue, getSheetRowCount, getSheetColumnCount, getCellPopoverContent, onScroll, onViewPortChange, windowConditionalFormats = false, engineConditionalFormatResults = false, getConditionalFormatRuleStats, onResize, onAutoResize, onHideColumn, onHideRow, onShowColumn, onShowRow, onGroupRows, onUngroupRows, onCollapseRowGroup, onExpandRowGroup, onGroupColumns, onUngroupColumns, onCollapseColumnGroup, onExpandColumnGroup, onSetOutlineDepth, onDeleteRow, onDeleteColumn, onInsertRow, onInsertColumn, onChangeAutoExpandTables, onChangeAutoCalculatedColumns, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onClearContents, onMoveColumns, onMoveRows, onSelectNextSheet, onSelectPreviousSheet, onCreateNewSheet, onKeyDown, onChangeFormatting, onRepeatFormatting, onClearFormatting, onRequestEditProtectedRange, onMoveChart, onResizeChart, onDeleteChart, onCutChart, onCopyChart, onMoveEmbed, onResizeEmbed, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFillRange, disableFillRightShortcut, keymap, onCalculateNow, onRequestGoTo, onMoveSelection, onInsertCutCells, onInsertTime, onInsertDate, onInsertDateTime, onInsertAutoSum, onUndo, onRedo, batchHistory, onPaste, onCopy, onCut, onSortColumn, onSortTable, onFilterTable, onFilterPivot, onResizeTable, onUndoTableAutoExpansion, onUndoCalculatedColumn, onOverwriteCalculatedColumn, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onRequestCreatePivotChart, onRemoveTable, onCreateTable, onRequestCreateTable, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onUpdateTable, onRequestResizeTable, onRequestInsertSlicer, onCreateBasicFilter, onRequestDefineNamedRange, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRequestInsertComment, onRequestInsertLink, onFreezeColumn, onFreezeRow, onUpdateNote, onProtectRange, onUnProtectRange, onSortRange, onRequestSearch, onRequestReplace, onRequestResize, getRowHeaderText = getDefaultRowHeader, getColumnHeaderText = getDefaultColumnHeader, getAdditionalCellSpacing, tokenizer: defaultTokenizer = defaultFormulaTokenizer, onChangeScale, onRemoveLink, onSelectLink, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onRequestExpand, cellExpandPredicate, StructuredResult = DefaultStructuredResult, getMentions, getStructuredProperties: getStructuredPropertiesProp, getFunctionParameterSuggestions, shouldFetchFunctionParameters, MentionTagComponent, MentionDropdownItemComponent, showSelectionResizeHandles = true, enableMagicFill, enableQuickEdit = true, MagicFillComponent, MagicFillContent, QuickEdit, PasteMenu, SuggestionAction, HiddenRowMarkers, HiddenColumnMarkers, enableResizerOverflow, className, defaultFontSizePoint = DEFAULT_FONT_SIZE_PT, defaultCellFormat, readonly, isComparing = false, getCellDiff, enableDataBoundaryNavigation, footerHeight, footerComponent, arrowComponents,
|
|
139
|
+
const { licenseKey, sheetId, sheetType, ChartSheetView: ChartSheetViewComponent = ChartSheetView, instanceId, activeCell = DEFAULT_ACTIVE_CELL, selections = DEFAULT_ARRAY, frozenColumnCount = 0, frozenRowCount = 0, rowCount = DEFAULT_ROW_COUNT, columnCount = DEFAULT_COLUMN_COUNT, autoFocus, basicFilter, tables, namedRanges, bandedRanges = DEFAULT_ARRAY, tableBorderColor = "#008000", filterIconColor = FILTER_BUTTON_GLYPH_COLOR, conditionalFormats, showFilterIcon = true, showCalculatedColumnIcon = true, showHeaders = true, defaultColumnWidth = DEFAULT_COLUMN_WIDTH, defaultRowHeight = DEFAULT_ROW_HEIGHT, lineHeightMode = "fontMetrics", columnHeaderHeight = COLUMN_HEADER_HEIGHT, rowHeaderWidth = ROW_HEADER_WIDTH, gridLineColor = GRIDLINE_COLOR, cellBackgroundColor = DEFAULT_CELL_BACKGROUND_COLOR, cellColor = DEFAULT_CELL_COLOR, headerBorderColor = DEFAULT_HEADER_BORDER_COLOR, headerBackgroundColor = DEFAULT_HEADER_BG, headerColor = DEFAULT_HEADER_COLOR, headerActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_BG, headerSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_BG, headerSelectedColor = "white", headerTableBackgroundColor = DEFAULT_HEADER_TABLE_BG, headerTableActiveBackgroundColor = DEFAULT_HEADER_ACTIVE_TABLE_BG, headerTableSelectedBackgroundColor = DEFAULT_HEADER_SELECTED_TABLE_BG, frozenShadowColor = headerBorderColor, frozenShadowThickness = 1, selectionBackgroundColor = SELECTION_BG, selectionBorderColor = SELECTION_BORDER, selectionStrokeWidth, showActiveCellBorderInSelection, selectionDragBorderColor = SELECTION_BORDER, chartSelectedColor, chipBackgroundColor = CHIP_COLOR, merges = DEFAULT_ARRAY, borderStyles, protectedRanges, allowEditRanges, isWorkbookProtected: isWorkbookProtectedProp = false, getSheetProtection, pivotTables, charts, onUpdateChart, onChangeZOrder, embeds, slicers, rowMetadata = DEFAULT_ARRAY, columnMetadata = DEFAULT_ARRAY, scale = 1, zoomSpeed = 1, overscanCount = 3, enableEditOnEnterKey: enableEditOnEnterKeyProp, enterKeyDirection = "down", enableAutoCorrect, shouldHandleKeyDown, enableTextOverflow = true, showGridLines: _showGridLines, showZeros, pageBreaks, showFormulas = false, protectFormulas = false, showFrozenSeparator = true, HeaderCell = DefaultHeaderCell, Cell = DefaultCell, SelectionTitleComponent = SelectionTitle, CellEditor = DefaultCellEditor, CellTooltip, ContextMenu = DefaultContextMenu, ContextMenuWrapper = DefaultContextMenuWrapper, FilterBox = DefaultFilterBox, HeaderMoveDragComponent = DefaultHeaderMoveDragComponent, SuggestionsDropdown, stickyEditor = true, scrollSnap = false, scrollThrottleTimeout, preventBrowserDefaultScroll, mouseMoveThrottleTimeout = 60, tooltipIntentInterval = 60, selectionPolicy, users, userId, renderCollaboratorCursor, functionDescriptions, showHeaderMenuButton = true, scrollbarSize = SCROLLBAR_SIZE, theme = defaultSpreadsheetTheme, showNotes = true, showComments = true, circleInvalidData = false, getIgnoredErrors, locale, formulaLocale: formulaLocaleProp, agentSuggestions, onReviewSuggestion, onShowFormulas, getDataRowCount, getDataRegion, getArrayFormula, getChartComponent, getEmbedComponent, getSlicerComponent, onChange, onChangeBatch, onChangeArrayFormula, onExpandCollapse, onPivotDrillDown, onDelete, onChangeEditorValue, onFill, onRequestCalculate, onChangeActiveCell, onChangeActiveSheet, onChangeSelections, getSheetName, getSheetId, getCellData, getNote: getNoteProp, getTextFormatRuns, getDataValidation, getEffectiveFormat, getFormattedValue: getFormattedValueProp, getTooltipContent, errorResolutionComponent, getEffectiveValue: getEffectiveValueProp, getSparklineGroup, getUserEnteredExtendedValue, getEffectiveExtendedValue, getSheetRowCount, getSheetColumnCount, getCellPopoverContent, onScroll, onViewPortChange, windowConditionalFormats = false, engineConditionalFormatResults = false, getConditionalFormatRuleStats, onResize, onAutoResize, onHideColumn, onHideRow, onShowColumn, onShowRow, onGroupRows, onUngroupRows, onCollapseRowGroup, onExpandRowGroup, onGroupColumns, onUngroupColumns, onCollapseColumnGroup, onExpandColumnGroup, onSetOutlineDepth, onDeleteRow, onDeleteColumn, onInsertRow, onInsertColumn, onChangeAutoExpandTables, onChangeAutoCalculatedColumns, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onClearContents, onMoveColumns, onMoveRows, onSelectNextSheet, onSelectPreviousSheet, onCreateNewSheet, onKeyDown, onChangeFormatting, onRepeatFormatting, onClearFormatting, onRequestEditProtectedRange, onRequestUnlockAllowEditRange, onMoveChart, onResizeChart, onDeleteChart, onCutChart, onCopyChart, onMoveEmbed, onResizeEmbed, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFillRange, disableFillRightShortcut, keymap, enableAutoComplete = true, onCalculateNow, onRequestGoTo, onMoveSelection, onInsertCutCells, onInsertCopiedCells, onInsertTime, onInsertDate, onInsertDateTime, onInsertAutoSum, onUndo, onRedo, batchHistory, onPaste, onReapplyPaste, onCopy, onCut, onSortColumn, onSortTable, onFilterTable, onFilterPivot, onResizeTable, onUndoTableAutoExpansion, onUndoCalculatedColumn, onOverwriteCalculatedColumn, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onRequestCreatePivotChart, onRemoveTable, onCreateTable, onRequestCreateTable, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onUpdateTable, onRequestResizeTable, onRequestInsertSlicer, onCreateBasicFilter, onRequestDefineNamedRange, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRequestInsertComment, onRequestInsertLink, onFreezeColumn, onFreezeRow, onUpdateNote, onProtectRange, onUnProtectRange, onSortRange, onRequestSearch, onRequestReplace, onRequestResize, getRowHeaderText = getDefaultRowHeader, getColumnHeaderText = getDefaultColumnHeader, getAdditionalCellSpacing, tokenizer: defaultTokenizer = defaultFormulaTokenizer, onChangeScale, onRemoveLink, onSelectLink, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onRequestExpand, cellExpandPredicate, StructuredResult = DefaultStructuredResult, getMentions, getStructuredProperties: getStructuredPropertiesProp, getFunctionParameterSuggestions, shouldFetchFunctionParameters, MentionTagComponent, MentionDropdownItemComponent, showSelectionResizeHandles = true, enableMagicFill, enableQuickEdit = true, MagicFillComponent, MagicFillContent, QuickEdit, PasteMenu, SuggestionAction, HiddenRowMarkers, HiddenColumnMarkers, enableResizerOverflow, className, defaultFontSizePoint = DEFAULT_FONT_SIZE_PT, defaultCellFormat, readonly, isComparing = false, getCellDiff, enableDataBoundaryNavigation, footerHeight, footerComponent, arrowComponents,
|
|
134
140
|
// Host-driven filter props. `hostHiddenRowRanges`
|
|
135
141
|
// supplies compact [start, end] hidden-row tuples; `getFilterValues` supplies a
|
|
136
142
|
// column's distinct values. Both let a million-row filter render without scanning
|
|
@@ -149,6 +155,15 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
149
155
|
// Enter on a cell opens the editor in Google Sheets and moves down in
|
|
150
156
|
// Excel; a host's explicit value wins under either keymap.
|
|
151
157
|
const enableEditOnEnterKey = enableEditOnEnterKeyProp ?? keymap !== "excel";
|
|
158
|
+
// The editors that commit on Enter outside these props (the host's in-cell editor, the formula
|
|
159
|
+
// bar) read the direction from the provider.
|
|
160
|
+
const setEnterKeyDirection = useSetEnterKeyDirection();
|
|
161
|
+
useIsomorphicLayoutEffect(() => {
|
|
162
|
+
setEnterKeyDirection(enterKeyDirection);
|
|
163
|
+
}, [enterKeyDirection, setEnterKeyDirection]);
|
|
164
|
+
const autoCorrect = useMemo(() => enableAutoCorrect === true
|
|
165
|
+
? DEFAULT_AUTOCORRECT_OPTIONS
|
|
166
|
+
: enableAutoCorrect || undefined, [enableAutoCorrect]);
|
|
152
167
|
/**
|
|
153
168
|
* Fire onBlur only when the cell editor blurs to an element outside the
|
|
154
169
|
* spreadsheet. Routed through `useEditable` so we hook the always-focused
|
|
@@ -224,6 +239,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
224
239
|
const cellEditorInstance = useCellEditorInstance();
|
|
225
240
|
// Paste menu
|
|
226
241
|
const [showPasteMenu, setShowPasteMenu] = useShowPasteMenu();
|
|
242
|
+
const [, setPickList] = usePickList();
|
|
227
243
|
// Auto Fill Options smart tag / right-drag fill menu + Series dialog
|
|
228
244
|
const [fillOptions, setFillOptions] = useFillOptionsState();
|
|
229
245
|
const [insertOptions, setInsertOptions] = useInsertOptionsState();
|
|
@@ -470,6 +486,11 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
470
486
|
* context without churning it on re-renders.
|
|
471
487
|
*/
|
|
472
488
|
const getSheetProtectionStable = useCallbackRef(getSheetProtection);
|
|
489
|
+
/**
|
|
490
|
+
* Excel's "Select locked cells" / "Select unlocked cells" on a protected
|
|
491
|
+
* sheet: the selection hook refuses any range this rejects.
|
|
492
|
+
*/
|
|
493
|
+
const isRangeSelectable = useCallbackRef(useCallback((range) => isRangeSelectableUnderProtection(getSheetProtection?.(sheetId), range, (rowIndex, columnIndex) => getCellData?.(sheetId, rowIndex, columnIndex)?.protection), [getSheetProtection, getCellData, sheetId]));
|
|
473
494
|
/**
|
|
474
495
|
* Check if the cell can be edited
|
|
475
496
|
*/
|
|
@@ -492,7 +513,26 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
492
513
|
// active, LOCKED cells refuse edits — a cell is locked unless its
|
|
493
514
|
// `protection.locked` is `false` (Excel's default) — and unlocked
|
|
494
515
|
// cells stay editable.
|
|
495
|
-
|
|
516
|
+
// An Excel Allow Edit Range opens its locked cells; one behind a
|
|
517
|
+
// password asks for it first (Excel's Unlock Range prompt).
|
|
518
|
+
const protectedEdit = resolveProtectedCellEdit({
|
|
519
|
+
sheetId,
|
|
520
|
+
cell,
|
|
521
|
+
sheetProtection: getSheetProtection?.(sheetId),
|
|
522
|
+
cellProtection: getCellData?.(sheetId, rowIndex, columnIndex)
|
|
523
|
+
?.protection,
|
|
524
|
+
allowEditRanges,
|
|
525
|
+
});
|
|
526
|
+
if (typeof protectedEdit === "object") {
|
|
527
|
+
if (onRequestUnlockAllowEditRange) {
|
|
528
|
+
onRequestUnlockAllowEditRange(sheetId, protectedEdit.unlock, cell);
|
|
529
|
+
}
|
|
530
|
+
else {
|
|
531
|
+
onRequestEditProtectedRange?.(sheetId, cell);
|
|
532
|
+
}
|
|
533
|
+
return false;
|
|
534
|
+
}
|
|
535
|
+
const lockedBySheetProtection = protectedEdit === "locked";
|
|
496
536
|
const canEdit = !lockedBySheetProtection &&
|
|
497
537
|
(protectedRanges
|
|
498
538
|
? !isProtectedCell(sheetId, cell, protectedRanges)
|
|
@@ -505,11 +545,13 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
505
545
|
}, [
|
|
506
546
|
readonly,
|
|
507
547
|
protectedRanges,
|
|
548
|
+
allowEditRanges,
|
|
508
549
|
getSheetProtection,
|
|
509
550
|
getCellData,
|
|
510
551
|
isRowHeader,
|
|
511
552
|
isColumnHeader,
|
|
512
553
|
onRequestEditProtectedRange,
|
|
554
|
+
onRequestUnlockAllowEditRange,
|
|
513
555
|
getPivotTableAtCell,
|
|
514
556
|
]));
|
|
515
557
|
/**
|
|
@@ -921,6 +963,49 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
921
963
|
const getErrorValue = useCallback((sheetId, rowIndex, columnIndex) => {
|
|
922
964
|
return getExtendedValueError(getEffectiveValue?.(sheetId, rowIndex, columnIndex));
|
|
923
965
|
}, [getEffectiveValue]);
|
|
966
|
+
/**
|
|
967
|
+
* Excel's background error checking: the rule (formula error, number stored as text) that puts
|
|
968
|
+
* the green ◤ on a cell.
|
|
969
|
+
*/
|
|
970
|
+
// Keyed on the active sheet's list CONTENT: an inline host lookup must not repaint every cell
|
|
971
|
+
// per render, while Ignore Error (a new list) must repaint the flags.
|
|
972
|
+
const getIgnoredErrorsStable = useCallbackRef((targetSheetId) => getIgnoredErrors?.(targetSheetId));
|
|
973
|
+
const activeIgnoredErrors = getIgnoredErrors?.(sheetId);
|
|
974
|
+
const activeIgnoredErrorsKey = JSON.stringify(activeIgnoredErrors ?? null);
|
|
975
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
976
|
+
const stableIgnoredErrors = useMemo(() => activeIgnoredErrors, [activeIgnoredErrorsKey]);
|
|
977
|
+
const getErrorCheck = useCallback((targetSheetId, rowIndex, columnIndex) => {
|
|
978
|
+
const kind = getErrorCheckKind({
|
|
979
|
+
userEnteredValue: getUserEnteredValue(targetSheetId, rowIndex, columnIndex),
|
|
980
|
+
errorValue: getErrorValue(targetSheetId, rowIndex, columnIndex),
|
|
981
|
+
});
|
|
982
|
+
if (kind &&
|
|
983
|
+
isErrorIgnored(targetSheetId === sheetId
|
|
984
|
+
? stableIgnoredErrors
|
|
985
|
+
: getIgnoredErrorsStable(targetSheetId), rowIndex, columnIndex, kind)) {
|
|
986
|
+
return undefined;
|
|
987
|
+
}
|
|
988
|
+
return kind;
|
|
989
|
+
}, [
|
|
990
|
+
getUserEnteredValue,
|
|
991
|
+
getErrorValue,
|
|
992
|
+
getIgnoredErrorsStable,
|
|
993
|
+
stableIgnoredErrors,
|
|
994
|
+
sheetId,
|
|
995
|
+
]);
|
|
996
|
+
// Excel's error-checking smart tag: open from its button or Alt+Shift+F10, closed when the
|
|
997
|
+
// active cell moves.
|
|
998
|
+
const [errorCheckMenuOpen, setErrorCheckMenuOpen] = useState(false);
|
|
999
|
+
useEffect(() => {
|
|
1000
|
+
setErrorCheckMenuOpen(false);
|
|
1001
|
+
}, [activeCell.rowIndex, activeCell.columnIndex, sheetId]);
|
|
1002
|
+
const showErrorCheckMenu = useCallbackRef((targetSheetId, cell) => {
|
|
1003
|
+
if (readonly || !getErrorCheck(targetSheetId, cell.rowIndex, cell.columnIndex)) {
|
|
1004
|
+
return false;
|
|
1005
|
+
}
|
|
1006
|
+
setErrorCheckMenuOpen(true);
|
|
1007
|
+
return true;
|
|
1008
|
+
});
|
|
924
1009
|
/**
|
|
925
1010
|
* Get notes. The host's `getNote` wins when provided — engines that keep
|
|
926
1011
|
* notes off the cell data (rnc serves notes over their own channel) have
|
|
@@ -1032,9 +1117,11 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
1032
1117
|
* as `#ЗНАЧ!`. `useEditorSubmit` canonicalizes the text again on commit.
|
|
1033
1118
|
*/
|
|
1034
1119
|
const getEditorDisplayValue = useCallback((sheetId, rowIndex, columnIndex) => {
|
|
1035
|
-
|
|
1120
|
+
// Every cell of a CSE array edits as the array's formula (Excel), not only its anchor.
|
|
1121
|
+
const value = getArrayFormula?.(sheetId, rowIndex, columnIndex)?.formula ??
|
|
1122
|
+
getUserEnteredStringValue(sheetId, rowIndex, columnIndex);
|
|
1036
1123
|
return isNil(value) ? value : localizeCellInput(value, formulaLocale);
|
|
1037
|
-
}, [getUserEnteredStringValue, formulaLocale]);
|
|
1124
|
+
}, [getUserEnteredStringValue, getArrayFormula, formulaLocale]);
|
|
1038
1125
|
/**
|
|
1039
1126
|
* Get cell value used for validations
|
|
1040
1127
|
*/
|
|
@@ -1991,6 +2078,15 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
1991
2078
|
}
|
|
1992
2079
|
return getOwnerDocument(editorElement)?.activeElement === editorElement;
|
|
1993
2080
|
}, [cellEditorInstance]);
|
|
2081
|
+
/**
|
|
2082
|
+
* The text entries of `cell`'s column block, for AutoComplete and Pick From
|
|
2083
|
+
* Drop-down List.
|
|
2084
|
+
*/
|
|
2085
|
+
const getColumnEntries = useCallbackRef((targetSheetId, cell) => getColumnAutoCompleteEntries({
|
|
2086
|
+
rowIndex: cell.rowIndex,
|
|
2087
|
+
maxRowIndex: getSheetRowCount?.(targetSheetId) ?? rowCount,
|
|
2088
|
+
getCell: (r) => toAutoCompleteCell(getUserEnteredValue(targetSheetId, r, cell.columnIndex)),
|
|
2089
|
+
}));
|
|
1994
2090
|
/**
|
|
1995
2091
|
* Get Cell Editor
|
|
1996
2092
|
*/
|
|
@@ -2006,8 +2102,12 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2006
2102
|
const editingSheetName = getSheetName?.(editingSheetId);
|
|
2007
2103
|
const effectiveValue = getEffectiveValue(editingSheetId, rowIndex, columnIndex);
|
|
2008
2104
|
const horizontalAlignment = getEditorHorizontalAlignment(editingSheetId, rowIndex, columnIndex);
|
|
2009
|
-
return (React.createElement(CellEditor, { ...props, locale: locale, effectiveValue: effectiveValue, format: cellFormat, dataValidation: dataValidation, getRangeValues: getFormattedValuesFromAddress, getRangeValuesAsync: getEditorRangeValuesAsync, scale: scale, sheetName: sheetName, editingSheetId: editingSheetId, sheetId: sheetId, editingSheetName: editingSheetName, address: address, theme: theme, tokenizer: localeTokenizer, formulaLocale: formulaLocale, horizontalAlignment: horizontalAlignment, defaultBackgroundColor: cellBackgroundColor, defaultTextColor: getStringifiedColor(cellColor, theme), functionDescriptions: localizedFunctionDescriptions, getNamedRanges: getNamedRanges, getTableNames: getTableNames, getStructuredProperties: getStructuredProperties, getTableColumnNames: getTableColumnNames, showFormulaHelp: showFormulaHelp, onHideFormulaHelp: onHideFormulaHelp, onShowFormulaHelp: onShowFormulaHelp, onRequestCalculate: onRequestCalculate, SuggestionsDropdown: SuggestionsDropdown, stickyEditor: stickyEditor, defaultFontSizePoint: defaultFontSize, getMentions: getMentions, getFunctionParameterSuggestions: getFunctionParameterSuggestions, shouldFetchFunctionParameters: shouldFetchFunctionParameters, MentionTagComponent: MentionTagComponent, MentionDropdownItemComponent: MentionDropdownItemComponent
|
|
2105
|
+
return (React.createElement(CellEditor, { ...props, locale: locale, effectiveValue: effectiveValue, format: cellFormat, dataValidation: dataValidation, getRangeValues: getFormattedValuesFromAddress, getRangeValuesAsync: getEditorRangeValuesAsync, scale: scale, sheetName: sheetName, editingSheetId: editingSheetId, sheetId: sheetId, editingSheetName: editingSheetName, address: address, theme: theme, tokenizer: localeTokenizer, formulaLocale: formulaLocale, horizontalAlignment: horizontalAlignment, defaultBackgroundColor: cellBackgroundColor, defaultTextColor: getStringifiedColor(cellColor, theme), functionDescriptions: localizedFunctionDescriptions, getNamedRanges: getNamedRanges, getTableNames: getTableNames, getStructuredProperties: getStructuredProperties, getTableColumnNames: getTableColumnNames, showFormulaHelp: showFormulaHelp, onHideFormulaHelp: onHideFormulaHelp, onShowFormulaHelp: onShowFormulaHelp, onRequestCalculate: onRequestCalculate, SuggestionsDropdown: SuggestionsDropdown, stickyEditor: stickyEditor, defaultFontSizePoint: defaultFontSize, getMentions: getMentions, getFunctionParameterSuggestions: getFunctionParameterSuggestions, shouldFetchFunctionParameters: shouldFetchFunctionParameters, MentionTagComponent: MentionTagComponent, MentionDropdownItemComponent: MentionDropdownItemComponent, getAutoCompleteEntries: enableAutoComplete
|
|
2106
|
+
? () => getColumnEntries(editingSheetId, cell)
|
|
2107
|
+
: undefined }));
|
|
2010
2108
|
}, [
|
|
2109
|
+
enableAutoComplete,
|
|
2110
|
+
getColumnEntries,
|
|
2011
2111
|
scale,
|
|
2012
2112
|
getEffectiveCellFormat,
|
|
2013
2113
|
getDataValidationRule,
|
|
@@ -2457,10 +2557,32 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2457
2557
|
const handleFillShrink = useCallback((sheetId, activeCell, clearRange, options) => {
|
|
2458
2558
|
onDelete?.(sheetId, activeCell, [{ range: clearRange }], options?.modifier === "toggle" ? "all" : "contents");
|
|
2459
2559
|
}, [onDelete]);
|
|
2560
|
+
/**
|
|
2561
|
+
* Copy gestures of the selection border (Ctrl/⌥+drag, Ctrl+Shift/⌥⇧+drag, right-drag menu),
|
|
2562
|
+
* through the host's own copy → paste on a private clipboard.
|
|
2563
|
+
*/
|
|
2564
|
+
const selectionDragCopy = useSelectionDragCopy({
|
|
2565
|
+
sheetId,
|
|
2566
|
+
readonly,
|
|
2567
|
+
onCopy,
|
|
2568
|
+
onPaste,
|
|
2569
|
+
onChangeBatch,
|
|
2570
|
+
onMoveSelection,
|
|
2571
|
+
onInsertCutCells,
|
|
2572
|
+
onInsertCopiedCells,
|
|
2573
|
+
confirmOverwrite: confirmMoveOverwrite,
|
|
2574
|
+
getValue: getUserEnteredStringValue,
|
|
2575
|
+
onChangeSelections: onSelectionChange,
|
|
2576
|
+
onChangeActiveCell,
|
|
2577
|
+
focusSheet,
|
|
2578
|
+
});
|
|
2579
|
+
const { copySelection: copySelectionDrop, insertCopiedCells: insertCopyDrop } = selectionDragCopy;
|
|
2580
|
+
const handleCopySelectionDrop = useCallback((_sheetId, from, to) => copySelectionDrop(from, to), [copySelectionDrop]);
|
|
2581
|
+
const handleInsertCopyDrop = useCallback((_sheetId, from, to) => insertCopyDrop(from, to), [insertCopyDrop]);
|
|
2460
2582
|
/**
|
|
2461
2583
|
* Handle grid selections
|
|
2462
2584
|
*/
|
|
2463
|
-
const { onMouseDown: onMouseDownSelection, onPointerDown: onPointerDownSelection, onKeyDown: onKeyDownSelection, fillSelection, fillShrink, onFillHandleMouseDown, onFillHandleDoubleClick, isDragging, isFilling, isSelectionInProgress, draggedSelection, onSelectionMouseDown, setActiveCell, initialDraggedSelection, updateSelectionStartEndReference, selectColumn, getContentfulGridRangeAroundCell, newSelection, modifySelection, clearSelections, } = useSelection({
|
|
2585
|
+
const { onMouseDown: onMouseDownSelection, onPointerDown: onPointerDownSelection, onKeyDown: onKeyDownSelection, fillSelection, fillShrink, onFillHandleMouseDown, onFillHandleDoubleClick, isDragging, isDragCopy, isFilling, isSelectionInProgress, draggedSelection, onSelectionMouseDown, setActiveCell, initialDraggedSelection, updateSelectionStartEndReference, selectColumn, getContentfulGridRangeAroundCell, newSelection, modifySelection, clearSelections, } = useSelection({
|
|
2464
2586
|
sheetId,
|
|
2465
2587
|
getDataRowCount,
|
|
2466
2588
|
getDataRegion,
|
|
@@ -2468,6 +2590,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2468
2590
|
allowDeselectSelection: false,
|
|
2469
2591
|
formulaMode,
|
|
2470
2592
|
enableSelectOnEnterKey: !enableEditOnEnterKey,
|
|
2593
|
+
enterKeyDirection,
|
|
2471
2594
|
newSelectionMode: formulaMode && canSelectCells ? selectionMode : "clear",
|
|
2472
2595
|
activeCell,
|
|
2473
2596
|
selections,
|
|
@@ -2495,6 +2618,9 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2495
2618
|
onFillShrink: readonly ? undefined : handleFillShrink,
|
|
2496
2619
|
onMoveSelection: readonly ? undefined : onMoveSelection,
|
|
2497
2620
|
onInsertCutCells,
|
|
2621
|
+
onCopySelection: readonly ? undefined : handleCopySelectionDrop,
|
|
2622
|
+
onInsertCopiedCells: readonly || !onInsertCopiedCells ? undefined : handleInsertCopyDrop,
|
|
2623
|
+
onSelectionDragMenu: readonly ? undefined : selectionDragCopy.openDropMenu,
|
|
2498
2624
|
confirmMoveOverwrite,
|
|
2499
2625
|
isHiddenColumn,
|
|
2500
2626
|
isHiddenRow,
|
|
@@ -2504,11 +2630,12 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2504
2630
|
dataRegionBoundaries,
|
|
2505
2631
|
tables,
|
|
2506
2632
|
onInsertTableRow,
|
|
2633
|
+
isRangeSelectable: getSheetProtection ? isRangeSelectable : undefined,
|
|
2507
2634
|
});
|
|
2508
2635
|
/**
|
|
2509
2636
|
* Copy, Paste and Cut hook
|
|
2510
2637
|
*/
|
|
2511
|
-
const { copiedSelections, isCutPending, copiedSheetId, cancelCut, clearCopiedSelections, copy, cut, paste, onInternalCopy, onInternalCut, onInternalPaste, } = useCopyPasteCut({
|
|
2638
|
+
const { copiedSelections, isCutPending, copiedSheetId, cancelCut, clearCopiedSelections, copy, cut, paste, onInternalCopy, onInternalCut, onInternalPaste, choosePasteOption, } = useCopyPasteCut({
|
|
2512
2639
|
activeCell,
|
|
2513
2640
|
selections,
|
|
2514
2641
|
sheetId,
|
|
@@ -2517,6 +2644,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2517
2644
|
onPaste,
|
|
2518
2645
|
onCopy,
|
|
2519
2646
|
onCut,
|
|
2647
|
+
onReapplyPaste,
|
|
2520
2648
|
});
|
|
2521
2649
|
/**
|
|
2522
2650
|
* Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+D on a selected chart. The focused chart is
|
|
@@ -2755,6 +2883,11 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2755
2883
|
onChangeBatch,
|
|
2756
2884
|
batchHistory,
|
|
2757
2885
|
formulaLocale,
|
|
2886
|
+
onChangeArrayFormula,
|
|
2887
|
+
getArrayFormula,
|
|
2888
|
+
getEffectiveFormat,
|
|
2889
|
+
onChangeFormatting,
|
|
2890
|
+
autoCorrect,
|
|
2758
2891
|
});
|
|
2759
2892
|
/**
|
|
2760
2893
|
* User cancels editing the cell
|
|
@@ -2860,9 +2993,19 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2860
2993
|
return true;
|
|
2861
2994
|
}
|
|
2862
2995
|
const type = getDataValidationRule(targetSheetId, cell.rowIndex, cell.columnIndex)?.condition?.type;
|
|
2863
|
-
if (type
|
|
2996
|
+
if (type === "ONE_OF_LIST" || type === "ONE_OF_RANGE") {
|
|
2997
|
+
editCell(targetSheetId, cell);
|
|
2998
|
+
return true;
|
|
2999
|
+
}
|
|
3000
|
+
// Excel's Pick From Drop-down List: the column block's text entries.
|
|
3001
|
+
if (readonly || !canEditCell(targetSheetId, cell)) {
|
|
3002
|
+
return false;
|
|
3003
|
+
}
|
|
3004
|
+
const entries = getPickListEntries(getColumnEntries(targetSheetId, cell));
|
|
3005
|
+
if (!entries.length) {
|
|
2864
3006
|
return false;
|
|
2865
3007
|
}
|
|
3008
|
+
setPickList({ sheetId: targetSheetId, cell, entries });
|
|
2866
3009
|
editCell(targetSheetId, cell);
|
|
2867
3010
|
return true;
|
|
2868
3011
|
});
|
|
@@ -3030,6 +3173,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3030
3173
|
onRequestPasteSpecial: requestPasteSpecial,
|
|
3031
3174
|
onRequestEditCell: requestEditCell,
|
|
3032
3175
|
onShowCellList: showCellList,
|
|
3176
|
+
onShowErrorCheckMenu: showErrorCheckMenu,
|
|
3033
3177
|
onChangeBatch,
|
|
3034
3178
|
getUserEnteredValue: getUserEnteredStringValue,
|
|
3035
3179
|
getEffectiveValue,
|
|
@@ -3137,6 +3281,63 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3137
3281
|
tables,
|
|
3138
3282
|
onInsertTableRow,
|
|
3139
3283
|
});
|
|
3284
|
+
/**
|
|
3285
|
+
* Excel's error-checking smart tag on the active cell. Convert to Number and Ignore Error act on
|
|
3286
|
+
* every selected cell, as in Excel: Convert to Number rewrites each number stored as text as its
|
|
3287
|
+
* number in ONE undo step; Ignore Error records the selection in the sheet's `ignoredErrors`
|
|
3288
|
+
* (xlsx `<ignoredErrors>`), so the flag stays off after a save and reopen.
|
|
3289
|
+
*/
|
|
3290
|
+
const formulaBarEditor = useAtomValue(formulaBarEditorInstanceAtom);
|
|
3291
|
+
const activeErrorCheck = !readonly
|
|
3292
|
+
? getErrorCheck(sheetId, activeCell.rowIndex, activeCell.columnIndex)
|
|
3293
|
+
: undefined;
|
|
3294
|
+
const activeErrorName = activeErrorCheck === "evalError"
|
|
3295
|
+
? getErrorValue(sheetId, activeCell.rowIndex, activeCell.columnIndex)
|
|
3296
|
+
?.name ??
|
|
3297
|
+
getFormattedValue(sheetId, activeCell.rowIndex, activeCell.columnIndex)
|
|
3298
|
+
: undefined;
|
|
3299
|
+
const activeErrorCheckTag = useMemo(() => activeErrorCheck
|
|
3300
|
+
? { kind: activeErrorCheck, errorName: activeErrorName }
|
|
3301
|
+
: undefined, [activeErrorCheck, activeErrorName]);
|
|
3302
|
+
const handleChooseErrorCheckOption = useCallbackRef((option) => {
|
|
3303
|
+
setErrorCheckMenuOpen(false);
|
|
3304
|
+
const kind = activeErrorCheck;
|
|
3305
|
+
if (!kind)
|
|
3306
|
+
return;
|
|
3307
|
+
const ranges = selections.length
|
|
3308
|
+
? selections.map((selection) => selection.range)
|
|
3309
|
+
: [
|
|
3310
|
+
{
|
|
3311
|
+
startRowIndex: activeCell.rowIndex,
|
|
3312
|
+
endRowIndex: activeCell.rowIndex,
|
|
3313
|
+
startColumnIndex: activeCell.columnIndex,
|
|
3314
|
+
endColumnIndex: activeCell.columnIndex,
|
|
3315
|
+
},
|
|
3316
|
+
];
|
|
3317
|
+
runErrorCheckOption(option, {
|
|
3318
|
+
sheetId,
|
|
3319
|
+
kind,
|
|
3320
|
+
errorName: activeErrorName,
|
|
3321
|
+
ranges,
|
|
3322
|
+
getUserEnteredValue: (rowIndex, columnIndex) => getUserEnteredValue(sheetId, rowIndex, columnIndex),
|
|
3323
|
+
maxRow: getDataRowCount?.(sheetId) ?? Number.MAX_SAFE_INTEGER,
|
|
3324
|
+
maxColumn: getDataColumnCount?.(sheetId) ?? Number.MAX_SAFE_INTEGER,
|
|
3325
|
+
getIgnoredErrors,
|
|
3326
|
+
onChangeBatch,
|
|
3327
|
+
batchHistory,
|
|
3328
|
+
onUpdateSheet,
|
|
3329
|
+
editInFormulaBar: () => {
|
|
3330
|
+
if (formulaBarEditor)
|
|
3331
|
+
formulaBarEditor.focus();
|
|
3332
|
+
else
|
|
3333
|
+
makeEditable(sheetId, activeCell);
|
|
3334
|
+
},
|
|
3335
|
+
openUrl: (url) => window.open(url, "_blank", "noopener"),
|
|
3336
|
+
});
|
|
3337
|
+
if (option === "editInFormulaBar")
|
|
3338
|
+
return;
|
|
3339
|
+
focusSheet();
|
|
3340
|
+
});
|
|
3140
3341
|
/**
|
|
3141
3342
|
* Move rows and columns
|
|
3142
3343
|
*/
|
|
@@ -3833,6 +4034,8 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3833
4034
|
gridLineWidth,
|
|
3834
4035
|
showNotes,
|
|
3835
4036
|
showComments,
|
|
4037
|
+
getErrorCheck,
|
|
4038
|
+
circleInvalidData,
|
|
3836
4039
|
StructuredResult,
|
|
3837
4040
|
readonly,
|
|
3838
4041
|
onOverflow: handleOverflow,
|
|
@@ -3958,6 +4161,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3958
4161
|
SuggestionAction,
|
|
3959
4162
|
readonly,
|
|
3960
4163
|
onSplitTextToColumns,
|
|
4164
|
+
onChoosePasteOption: onReapplyPaste ? choosePasteOption : undefined,
|
|
3961
4165
|
showPasteMenu,
|
|
3962
4166
|
fillOptions,
|
|
3963
4167
|
onChooseFillType: handleChooseFillType,
|
|
@@ -3971,6 +4175,10 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3971
4175
|
calculatedColumnFill,
|
|
3972
4176
|
canStopAutoCalculatedColumns: !!onChangeAutoCalculatedColumns,
|
|
3973
4177
|
onChooseCalculatedColumnOption: handleChooseCalculatedColumnOption,
|
|
4178
|
+
errorCheck: activeErrorCheckTag,
|
|
4179
|
+
errorCheckMenuOpen,
|
|
4180
|
+
onErrorCheckMenuOpenChange: setErrorCheckMenuOpen,
|
|
4181
|
+
onChooseErrorCheckOption: handleChooseErrorCheckOption,
|
|
3974
4182
|
hoveredCell: delayedHoveredCell,
|
|
3975
4183
|
onRemoveQuickEdit,
|
|
3976
4184
|
onAddQuickEdit,
|
|
@@ -4331,6 +4539,14 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
4331
4539
|
setFormulaBarTextFormatRuns(undefined);
|
|
4332
4540
|
return;
|
|
4333
4541
|
}
|
|
4542
|
+
// Excel shows a legacy CSE array's formula in braces for every cell of the array
|
|
4543
|
+
// (`{=SUM(A1:A3*B1:B3)}`); the braces leave once the edit starts (`getEditorDisplayValue`).
|
|
4544
|
+
const arrayFormula = getArrayFormula?.(sheetId, rowIndex, columnIndex);
|
|
4545
|
+
if (arrayFormula) {
|
|
4546
|
+
setFormulabarEditorValue(`{${localizeCellInput(arrayFormula.formula, formulaLocale)}}`);
|
|
4547
|
+
setFormulaBarTextFormatRuns(undefined);
|
|
4548
|
+
return;
|
|
4549
|
+
}
|
|
4334
4550
|
const value = getUserEnteredStringValue(sheetId, rowIndex, columnIndex);
|
|
4335
4551
|
const textFormatRuns = getTextFormatRuns?.(sheetId, rowIndex, columnIndex);
|
|
4336
4552
|
// Update formula bar input (in the grid's formula locale, like the cell editor)
|
|
@@ -4343,6 +4559,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
4343
4559
|
editingCellCoordinate,
|
|
4344
4560
|
getSheetProtection,
|
|
4345
4561
|
getCellData,
|
|
4562
|
+
getArrayFormula,
|
|
4346
4563
|
getUserEnteredStringValue,
|
|
4347
4564
|
formulaLocale,
|
|
4348
4565
|
setFormulabarEditorValue,
|
|
@@ -4405,7 +4622,13 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
4405
4622
|
// Bind to outer container, so it always takes
|
|
4406
4623
|
// priority over other components
|
|
4407
4624
|
// generated by hooks
|
|
4408
|
-
onMouseMove: mouseMoveThrottler, onWheel: onMouseWheel, ...rest, style:
|
|
4625
|
+
onMouseMove: mouseMoveThrottler, onWheel: onMouseWheel, ...rest, style:
|
|
4626
|
+
// Ctrl / ⌥ held over a selection-border drag: Excel's copy (+) pointer.
|
|
4627
|
+
isDragging && isDragCopy
|
|
4628
|
+
? { ...rest.style, cursor: "copy" }
|
|
4629
|
+
: tableHitCursor
|
|
4630
|
+
? { ...rest.style, cursor: tableHitCursor }
|
|
4631
|
+
: rest.style },
|
|
4409
4632
|
width === 0 || height === 0 ? (React.createElement("div", { className: "flex border-solid border-rnc-border border border-t border-b flex-1 justify-center items-center" },
|
|
4410
4633
|
React.createElement("div", { className: "space-y-2" },
|
|
4411
4634
|
React.createElement(Skeleton, { className: "h-4 w-[250px]" }),
|
|
@@ -4417,6 +4640,9 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
4417
4640
|
draggableColumns,
|
|
4418
4641
|
draggableRows,
|
|
4419
4642
|
contextMenuComponent,
|
|
4643
|
+
selectionDragCopy.dropMenu ? (React.createElement(SelectionDropMenu, { key: `${selectionDragCopy.dropMenu.clientX}:${selectionDragCopy.dropMenu.clientY}`, x: selectionDragCopy.dropMenu.clientX -
|
|
4644
|
+
(gridContainerRef.current?.getBoundingClientRect().left ?? 0), y: selectionDragCopy.dropMenu.clientY -
|
|
4645
|
+
(gridContainerRef.current?.getBoundingClientRect().top ?? 0), actions: selectionDragCopy.dropActions, onSelectAction: selectionDragCopy.runDropAction, onCancel: selectionDragCopy.closeDropMenu })) : null,
|
|
4420
4646
|
embedContextMenuComponent,
|
|
4421
4647
|
filterComponent,
|
|
4422
4648
|
totalsPickerComponent,
|