@rowsncolumns/spreadsheet 10.6.4 → 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/alignment.d.ts +25 -0
- package/dist/cjs/components/cell/alignment.d.ts.map +1 -1
- package/dist/cjs/components/cell/alignment.js +39 -1
- package/dist/cjs/components/cell/cell-background.d.ts +16 -0
- package/dist/cjs/components/cell/cell-background.d.ts.map +1 -1
- package/dist/cjs/components/cell/cell-background.js +141 -54
- package/dist/cjs/components/cell/cell-text-runs.d.ts +12 -5
- package/dist/cjs/components/cell/cell-text-runs.d.ts.map +1 -1
- package/dist/cjs/components/cell/cell-text-runs.js +18 -20
- package/dist/cjs/components/cell/index.d.ts.map +1 -1
- package/dist/cjs/components/cell/index.js +26 -21
- 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/helpers.d.ts +5 -0
- package/dist/cjs/helpers.d.ts.map +1 -1
- package/dist/cjs/helpers.js +8 -4
- 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/alignment.d.ts +25 -0
- package/dist/esm/components/cell/alignment.d.ts.map +1 -1
- package/dist/esm/components/cell/alignment.js +33 -0
- package/dist/esm/components/cell/cell-background.d.ts +16 -0
- package/dist/esm/components/cell/cell-background.d.ts.map +1 -1
- package/dist/esm/components/cell/cell-background.js +106 -36
- package/dist/esm/components/cell/cell-text-runs.d.ts +12 -5
- package/dist/esm/components/cell/cell-text-runs.d.ts.map +1 -1
- package/dist/esm/components/cell/cell-text-runs.js +17 -22
- package/dist/esm/components/cell/index.d.ts.map +1 -1
- package/dist/esm/components/cell/index.js +25 -20
- 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/helpers.d.ts +5 -0
- package/dist/esm/helpers.d.ts.map +1 -1
- package/dist/esm/helpers.js +8 -4
- 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,
|