@rowsncolumns/spreadsheet 10.3.0 → 10.4.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/banded-ranges.d.ts.map +1 -1
- package/dist/cjs/api/banded-ranges.js +40 -14
- package/dist/cjs/api/calculated-column-fill.d.ts +43 -0
- package/dist/cjs/api/calculated-column-fill.d.ts.map +1 -0
- package/dist/cjs/api/calculated-column-fill.js +16 -0
- package/dist/cjs/api/chart-sheet.d.ts +8 -0
- package/dist/cjs/api/chart-sheet.d.ts.map +1 -0
- package/dist/cjs/api/chart-sheet.js +20 -0
- package/dist/cjs/api/chart-source-ranges.d.ts +64 -0
- package/dist/cjs/api/chart-source-ranges.d.ts.map +1 -0
- package/dist/cjs/api/chart-source-ranges.js +175 -0
- package/dist/cjs/api/selections.d.ts +3 -3
- package/dist/cjs/api/selections.d.ts.map +1 -1
- package/dist/cjs/api/selections.js +28 -2
- package/dist/cjs/api/spreadsheet-api.d.ts +16 -3
- package/dist/cjs/api/spreadsheet-api.d.ts.map +1 -1
- package/dist/cjs/api/spreadsheet-api.js +22 -2
- package/dist/cjs/api/table-auto-expansion.d.ts +37 -0
- package/dist/cjs/api/table-auto-expansion.d.ts.map +1 -0
- package/dist/cjs/api/table-auto-expansion.js +16 -0
- package/dist/cjs/api/table.d.ts +49 -1
- package/dist/cjs/api/table.d.ts.map +1 -1
- package/dist/cjs/api/table.js +145 -1
- package/dist/cjs/api/validation.d.ts +26 -1
- package/dist/cjs/api/validation.d.ts.map +1 -1
- package/dist/cjs/api/validation.js +127 -9
- package/dist/cjs/atoms/calculated-column-fill.atom.d.ts +15 -0
- package/dist/cjs/atoms/calculated-column-fill.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/calculated-column-fill.atom.js +18 -0
- package/dist/cjs/atoms/chart-actions.atom.d.ts +40 -0
- package/dist/cjs/atoms/chart-actions.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/chart-actions.atom.js +66 -0
- package/dist/cjs/atoms/index.d.ts +5 -0
- package/dist/cjs/atoms/index.d.ts.map +1 -1
- package/dist/cjs/atoms/index.js +5 -0
- package/dist/cjs/atoms/move-chart-dialog.atom.d.ts +28 -0
- package/dist/cjs/atoms/move-chart-dialog.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/move-chart-dialog.atom.js +34 -0
- package/dist/cjs/atoms/selected-chart-embed.atom.d.ts +9 -1
- package/dist/cjs/atoms/selected-chart-embed.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/selected-chart-embed.atom.js +18 -1
- package/dist/cjs/atoms/selected-chart-series.atom.d.ts +24 -0
- package/dist/cjs/atoms/selected-chart-series.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/selected-chart-series.atom.js +11 -0
- package/dist/cjs/atoms/sheet-context.atom.d.ts +2 -0
- package/dist/cjs/atoms/sheet-context.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/sheet-context.atom.js +5 -2
- package/dist/cjs/atoms/sparkline-dialog.atom.d.ts +34 -0
- package/dist/cjs/atoms/sparkline-dialog.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/sparkline-dialog.atom.js +30 -0
- package/dist/cjs/atoms/table-auto-expansion.atom.d.ts +14 -0
- package/dist/cjs/atoms/table-auto-expansion.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/table-auto-expansion.atom.js +17 -0
- package/dist/cjs/components/calculated-column-smart-tag/index.d.ts +25 -0
- package/dist/cjs/components/calculated-column-smart-tag/index.d.ts.map +1 -0
- package/dist/cjs/components/calculated-column-smart-tag/index.js +31 -0
- package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.js +407 -77
- package/dist/cjs/components/canvas-grid/typings.d.ts +127 -14
- 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 +3 -3
- package/dist/cjs/components/cell/typings.d.ts +13 -0
- package/dist/cjs/components/cell/typings.d.ts.map +1 -1
- package/dist/cjs/components/cell-filter/index.d.ts.map +1 -1
- package/dist/cjs/components/cell-filter/index.js +13 -2
- 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 +4 -1
- package/dist/cjs/components/cell-structured/sparkline-math.d.ts +28 -5
- package/dist/cjs/components/cell-structured/sparkline-math.d.ts.map +1 -1
- package/dist/cjs/components/cell-structured/sparkline-math.js +93 -5
- 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 +3 -3
- package/dist/cjs/components/cell-structured/types.d.ts +1 -1
- package/dist/cjs/components/cell-structured/types.d.ts.map +1 -1
- package/dist/cjs/components/chart-sheet-view/index.d.ts +27 -0
- package/dist/cjs/components/chart-sheet-view/index.d.ts.map +1 -0
- package/dist/cjs/components/chart-sheet-view/index.js +35 -0
- package/dist/cjs/components/context-menu/embed-context-menu.d.ts +48 -0
- package/dist/cjs/components/context-menu/embed-context-menu.d.ts.map +1 -0
- package/dist/cjs/components/context-menu/embed-context-menu.js +123 -0
- package/dist/cjs/components/context-menu/index.d.ts +23 -2
- package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
- package/dist/cjs/components/context-menu/index.js +217 -39
- package/dist/cjs/components/context-menu/total-row-function-menu.d.ts +33 -0
- package/dist/cjs/components/context-menu/total-row-function-menu.d.ts.map +1 -0
- package/dist/cjs/components/context-menu/total-row-function-menu.js +58 -0
- package/dist/cjs/components/context-menu/total-row-functions.d.ts +12 -12
- package/dist/cjs/components/context-menu/total-row-functions.d.ts.map +1 -1
- package/dist/cjs/components/context-menu/total-row-functions.js +39 -39
- package/dist/cjs/components/embeds/chart-component.d.ts +17 -0
- package/dist/cjs/components/embeds/chart-component.d.ts.map +1 -1
- package/dist/cjs/components/embeds/embed-draggable.d.ts +61 -4
- package/dist/cjs/components/embeds/embed-draggable.d.ts.map +1 -1
- package/dist/cjs/components/embeds/embed-draggable.js +218 -42
- package/dist/cjs/components/filter-box/date-tree.d.ts +28 -0
- package/dist/cjs/components/filter-box/date-tree.d.ts.map +1 -0
- package/dist/cjs/components/filter-box/date-tree.js +147 -0
- package/dist/cjs/components/filter-box/filter-by-condition.d.ts +14 -2
- package/dist/cjs/components/filter-box/filter-by-condition.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/filter-by-condition.js +95 -19
- package/dist/cjs/components/filter-box/filter-by-value.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/filter-by-value.js +126 -40
- package/dist/cjs/components/filter-box/index.d.ts +7 -1
- package/dist/cjs/components/filter-box/index.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/index.js +102 -11
- package/dist/cjs/components/move-chart-dialog/index.d.ts +34 -0
- package/dist/cjs/components/move-chart-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/move-chart-dialog/index.js +96 -0
- package/dist/cjs/components/print-preview/page-block.d.ts +9 -1
- package/dist/cjs/components/print-preview/page-block.d.ts.map +1 -1
- package/dist/cjs/components/print-preview/page-block.js +28 -2
- package/dist/cjs/components/print-preview/print-preview-dialog.d.ts +8 -1
- package/dist/cjs/components/print-preview/print-preview-dialog.d.ts.map +1 -1
- package/dist/cjs/components/print-preview/print-preview-dialog.js +144 -3
- package/dist/cjs/components/print-preview/run-print.d.ts.map +1 -1
- package/dist/cjs/components/print-preview/run-print.js +19 -7
- package/dist/cjs/components/print-preview/use-page-layout.d.ts +47 -0
- package/dist/cjs/components/print-preview/use-page-layout.d.ts.map +1 -1
- package/dist/cjs/components/print-preview/use-page-layout.js +81 -7
- package/dist/cjs/components/resizer/index.d.ts.map +1 -1
- package/dist/cjs/components/resizer/index.js +10 -5
- 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 +6 -2
- package/dist/cjs/components/selection/types.d.ts +15 -0
- package/dist/cjs/components/selection/types.d.ts.map +1 -1
- package/dist/cjs/components/sheet-search/index.d.ts.map +1 -1
- package/dist/cjs/components/sheet-search/index.js +6 -2
- package/dist/cjs/components/sheet-tabs/index.d.ts.map +1 -1
- package/dist/cjs/components/sheet-tabs/index.js +2 -2
- package/dist/cjs/components/sheet-tabs/sheet-tab.d.ts +1 -1
- package/dist/cjs/components/sheet-tabs/sheet-tab.d.ts.map +1 -1
- package/dist/cjs/components/sheet-tabs/sheet-tab.js +3 -1
- package/dist/cjs/components/sparkline-dialog/index.d.ts +43 -0
- package/dist/cjs/components/sparkline-dialog/index.d.ts.map +1 -0
- package/dist/cjs/components/sparkline-dialog/index.js +127 -0
- package/dist/cjs/components/subtotal-dialog/index.d.ts.map +1 -1
- package/dist/cjs/components/subtotal-dialog/index.js +10 -1
- package/dist/cjs/components/table-auto-expansion-smart-tag/index.d.ts +24 -0
- package/dist/cjs/components/table-auto-expansion-smart-tag/index.d.ts.map +1 -0
- package/dist/cjs/components/table-auto-expansion-smart-tag/index.js +31 -0
- package/dist/cjs/components/toolbar/index.d.ts +1 -0
- package/dist/cjs/components/toolbar/index.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/index.js +1 -0
- package/dist/cjs/components/toolbar/insert-menu.d.ts +2 -1
- package/dist/cjs/components/toolbar/insert-menu.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/insert-menu.js +24 -1
- package/dist/cjs/components/toolbar/merge-cells-selector.d.ts +4 -1
- package/dist/cjs/components/toolbar/merge-cells-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/merge-cells-selector.js +11 -5
- package/dist/cjs/components/toolbar/sparkline-actions.d.ts +31 -0
- package/dist/cjs/components/toolbar/sparkline-actions.d.ts.map +1 -0
- package/dist/cjs/components/toolbar/sparkline-actions.js +273 -0
- package/dist/cjs/components/toolbar/table-actions.d.ts +9 -1
- package/dist/cjs/components/toolbar/table-actions.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/table-actions.js +17 -7
- package/dist/cjs/components/toolbar/table-style-selector.d.ts +38 -2
- package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/table-style-selector.js +241 -389
- package/dist/cjs/config.d.ts +2 -0
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +31 -1
- package/dist/cjs/helpers.d.ts +1 -1
- package/dist/cjs/helpers.d.ts.map +1 -1
- package/dist/cjs/helpers.js +13 -2
- package/dist/cjs/hooks/use-cell-renderer.d.ts +16 -1
- package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-cell-renderer.js +20 -8
- package/dist/cjs/hooks/use-chart-clipboard.d.ts +55 -0
- package/dist/cjs/hooks/use-chart-clipboard.d.ts.map +1 -0
- package/dist/cjs/hooks/use-chart-clipboard.js +231 -0
- package/dist/cjs/hooks/use-chart-source-ranges.d.ts +27 -0
- package/dist/cjs/hooks/use-chart-source-ranges.d.ts.map +1 -0
- package/dist/cjs/hooks/use-chart-source-ranges.js +211 -0
- package/dist/cjs/hooks/use-context-setter.d.ts.map +1 -1
- package/dist/cjs/hooks/use-context-setter.js +3 -1
- package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
- package/dist/cjs/hooks/use-copy-paste-cut.js +6 -3
- package/dist/cjs/hooks/use-editable.d.ts +9 -1
- package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editable.js +25 -1
- package/dist/cjs/hooks/use-embeds-charts.d.ts +64 -4
- package/dist/cjs/hooks/use-embeds-charts.d.ts.map +1 -1
- package/dist/cjs/hooks/use-embeds-charts.js +412 -41
- package/dist/cjs/hooks/use-grid-children.d.ts +2 -2
- package/dist/cjs/hooks/use-grid-children.d.ts.map +1 -1
- package/dist/cjs/hooks/use-grid-children.js +12 -6
- package/dist/cjs/hooks/use-header-actions.d.ts.map +1 -1
- package/dist/cjs/hooks/use-header-actions.js +17 -10
- package/dist/cjs/hooks/use-isomorphic-layout-effect.d.ts +2 -2
- package/dist/cjs/hooks/use-isomorphic-layout-effect.d.ts.map +1 -1
- package/dist/cjs/hooks/use-keyboard-handler.d.ts +2 -1
- package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/cjs/hooks/use-keyboard-handler.js +8 -2
- package/dist/cjs/hooks/use-move-columns-rows.d.ts.map +1 -1
- package/dist/cjs/hooks/use-move-columns-rows.js +21 -15
- package/dist/cjs/hooks/use-reveal-chart-embed.d.ts +17 -0
- package/dist/cjs/hooks/use-reveal-chart-embed.d.ts.map +1 -0
- package/dist/cjs/hooks/use-reveal-chart-embed.js +40 -0
- package/dist/cjs/hooks/use-selection-move.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection-move.js +14 -6
- package/dist/cjs/hooks/use-selection-renderer.d.ts +13 -1
- package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection-renderer.js +37 -7
- package/dist/cjs/hooks/use-selection-resize.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection-resize.js +13 -6
- package/dist/cjs/hooks/use-selection.d.ts +9 -1
- package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection.js +177 -55
- package/dist/cjs/hooks/use-structured-reference-selection.d.ts +1 -1
- package/dist/cjs/hooks/use-structured-reference-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-structured-reference-selection.js +10 -0
- package/dist/cjs/hooks/use-table-hit-zones.d.ts +61 -0
- package/dist/cjs/hooks/use-table-hit-zones.d.ts.map +1 -0
- package/dist/cjs/hooks/use-table-hit-zones.js +157 -0
- package/dist/cjs/hooks/use-table-resizer.d.ts +7 -0
- package/dist/cjs/hooks/use-table-resizer.d.ts.map +1 -1
- package/dist/cjs/hooks/use-table-resizer.js +38 -18
- package/dist/cjs/hooks/use-touch.d.ts.map +1 -1
- package/dist/cjs/hooks/use-touch.js +16 -8
- package/dist/cjs/index.d.ts +13 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +17 -1
- package/dist/cjs/release-date.js +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types.d.ts +289 -4
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/utils/copy-as-picture.d.ts +13 -0
- package/dist/cjs/utils/copy-as-picture.d.ts.map +1 -0
- package/dist/cjs/utils/copy-as-picture.js +70 -0
- package/dist/cjs/utils/pivot-chart-field-buttons.d.ts +19 -0
- package/dist/cjs/utils/pivot-chart-field-buttons.d.ts.map +1 -0
- package/dist/cjs/utils/pivot-chart-field-buttons.js +25 -0
- package/dist/cjs/utils/z-order.d.ts +47 -0
- package/dist/cjs/utils/z-order.d.ts.map +1 -0
- package/dist/cjs/utils/z-order.js +124 -0
- package/dist/esm/api/banded-ranges.d.ts.map +1 -1
- package/dist/esm/api/banded-ranges.js +39 -12
- package/dist/esm/api/calculated-column-fill.d.ts +43 -0
- package/dist/esm/api/calculated-column-fill.d.ts.map +1 -0
- package/dist/esm/api/calculated-column-fill.js +10 -0
- package/dist/esm/api/chart-sheet.d.ts +8 -0
- package/dist/esm/api/chart-sheet.d.ts.map +1 -0
- package/dist/esm/api/chart-sheet.js +15 -0
- package/dist/esm/api/chart-source-ranges.d.ts +64 -0
- package/dist/esm/api/chart-source-ranges.d.ts.map +1 -0
- package/dist/esm/api/chart-source-ranges.js +168 -0
- package/dist/esm/api/selections.d.ts +3 -3
- package/dist/esm/api/selections.d.ts.map +1 -1
- package/dist/esm/api/selections.js +26 -2
- package/dist/esm/api/spreadsheet-api.d.ts +16 -3
- package/dist/esm/api/spreadsheet-api.d.ts.map +1 -1
- package/dist/esm/api/spreadsheet-api.js +18 -2
- package/dist/esm/api/table-auto-expansion.d.ts +37 -0
- package/dist/esm/api/table-auto-expansion.d.ts.map +1 -0
- package/dist/esm/api/table-auto-expansion.js +10 -0
- package/dist/esm/api/table.d.ts +49 -1
- package/dist/esm/api/table.d.ts.map +1 -1
- package/dist/esm/api/table.js +138 -1
- package/dist/esm/api/validation.d.ts +26 -1
- package/dist/esm/api/validation.d.ts.map +1 -1
- package/dist/esm/api/validation.js +119 -9
- package/dist/esm/atoms/calculated-column-fill.atom.d.ts +15 -0
- package/dist/esm/atoms/calculated-column-fill.atom.d.ts.map +1 -0
- package/dist/esm/atoms/calculated-column-fill.atom.js +12 -0
- package/dist/esm/atoms/chart-actions.atom.d.ts +40 -0
- package/dist/esm/atoms/chart-actions.atom.d.ts.map +1 -0
- package/dist/esm/atoms/chart-actions.atom.js +58 -0
- package/dist/esm/atoms/index.d.ts +5 -0
- package/dist/esm/atoms/index.d.ts.map +1 -1
- package/dist/esm/atoms/index.js +5 -0
- package/dist/esm/atoms/move-chart-dialog.atom.d.ts +28 -0
- package/dist/esm/atoms/move-chart-dialog.atom.d.ts.map +1 -0
- package/dist/esm/atoms/move-chart-dialog.atom.js +25 -0
- package/dist/esm/atoms/selected-chart-embed.atom.d.ts +9 -1
- package/dist/esm/atoms/selected-chart-embed.atom.d.ts.map +1 -1
- package/dist/esm/atoms/selected-chart-embed.atom.js +19 -2
- package/dist/esm/atoms/selected-chart-series.atom.d.ts +24 -0
- package/dist/esm/atoms/selected-chart-series.atom.d.ts.map +1 -0
- package/dist/esm/atoms/selected-chart-series.atom.js +4 -0
- package/dist/esm/atoms/sheet-context.atom.d.ts +2 -0
- package/dist/esm/atoms/sheet-context.atom.d.ts.map +1 -1
- package/dist/esm/atoms/sheet-context.atom.js +2 -0
- package/dist/esm/atoms/sparkline-dialog.atom.d.ts +34 -0
- package/dist/esm/atoms/sparkline-dialog.atom.d.ts.map +1 -0
- package/dist/esm/atoms/sparkline-dialog.atom.js +21 -0
- package/dist/esm/atoms/table-auto-expansion.atom.d.ts +14 -0
- package/dist/esm/atoms/table-auto-expansion.atom.d.ts.map +1 -0
- package/dist/esm/atoms/table-auto-expansion.atom.js +11 -0
- package/dist/esm/components/calculated-column-smart-tag/index.d.ts +25 -0
- package/dist/esm/components/calculated-column-smart-tag/index.d.ts.map +1 -0
- package/dist/esm/components/calculated-column-smart-tag/index.js +25 -0
- package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.js +346 -26
- package/dist/esm/components/canvas-grid/typings.d.ts +127 -14
- 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 +3 -3
- package/dist/esm/components/cell/typings.d.ts +13 -0
- package/dist/esm/components/cell/typings.d.ts.map +1 -1
- package/dist/esm/components/cell-filter/index.d.ts.map +1 -1
- package/dist/esm/components/cell-filter/index.js +14 -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 +4 -1
- package/dist/esm/components/cell-structured/sparkline-math.d.ts +28 -5
- package/dist/esm/components/cell-structured/sparkline-math.d.ts.map +1 -1
- package/dist/esm/components/cell-structured/sparkline-math.js +58 -4
- 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 +3 -3
- package/dist/esm/components/cell-structured/types.d.ts +1 -1
- package/dist/esm/components/cell-structured/types.d.ts.map +1 -1
- package/dist/esm/components/chart-sheet-view/index.d.ts +27 -0
- package/dist/esm/components/chart-sheet-view/index.d.ts.map +1 -0
- package/dist/esm/components/chart-sheet-view/index.js +30 -0
- package/dist/esm/components/context-menu/embed-context-menu.d.ts +48 -0
- package/dist/esm/components/context-menu/embed-context-menu.d.ts.map +1 -0
- package/dist/esm/components/context-menu/embed-context-menu.js +112 -0
- package/dist/esm/components/context-menu/index.d.ts +23 -2
- package/dist/esm/components/context-menu/index.d.ts.map +1 -1
- package/dist/esm/components/context-menu/index.js +174 -38
- package/dist/esm/components/context-menu/total-row-function-menu.d.ts +33 -0
- package/dist/esm/components/context-menu/total-row-function-menu.d.ts.map +1 -0
- package/dist/esm/components/context-menu/total-row-function-menu.js +50 -0
- package/dist/esm/components/context-menu/total-row-functions.d.ts +12 -12
- package/dist/esm/components/context-menu/total-row-functions.d.ts.map +1 -1
- package/dist/esm/components/context-menu/total-row-functions.js +29 -31
- package/dist/esm/components/embeds/chart-component.d.ts +17 -0
- package/dist/esm/components/embeds/chart-component.d.ts.map +1 -1
- package/dist/esm/components/embeds/embed-draggable.d.ts +61 -4
- package/dist/esm/components/embeds/embed-draggable.d.ts.map +1 -1
- package/dist/esm/components/embeds/embed-draggable.js +207 -47
- package/dist/esm/components/filter-box/date-tree.d.ts +28 -0
- package/dist/esm/components/filter-box/date-tree.d.ts.map +1 -0
- package/dist/esm/components/filter-box/date-tree.js +107 -0
- package/dist/esm/components/filter-box/filter-by-condition.d.ts +14 -2
- package/dist/esm/components/filter-box/filter-by-condition.d.ts.map +1 -1
- package/dist/esm/components/filter-box/filter-by-condition.js +72 -16
- package/dist/esm/components/filter-box/filter-by-value.d.ts.map +1 -1
- package/dist/esm/components/filter-box/filter-by-value.js +110 -39
- package/dist/esm/components/filter-box/index.d.ts +7 -1
- package/dist/esm/components/filter-box/index.d.ts.map +1 -1
- package/dist/esm/components/filter-box/index.js +88 -2
- package/dist/esm/components/move-chart-dialog/index.d.ts +34 -0
- package/dist/esm/components/move-chart-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/move-chart-dialog/index.js +88 -0
- package/dist/esm/components/print-preview/page-block.d.ts +9 -1
- package/dist/esm/components/print-preview/page-block.d.ts.map +1 -1
- package/dist/esm/components/print-preview/page-block.js +27 -2
- package/dist/esm/components/print-preview/print-preview-dialog.d.ts +8 -1
- package/dist/esm/components/print-preview/print-preview-dialog.d.ts.map +1 -1
- package/dist/esm/components/print-preview/print-preview-dialog.js +92 -4
- package/dist/esm/components/print-preview/run-print.d.ts.map +1 -1
- package/dist/esm/components/print-preview/run-print.js +17 -7
- package/dist/esm/components/print-preview/use-page-layout.d.ts +47 -0
- package/dist/esm/components/print-preview/use-page-layout.d.ts.map +1 -1
- package/dist/esm/components/print-preview/use-page-layout.js +55 -0
- package/dist/esm/components/resizer/index.d.ts.map +1 -1
- package/dist/esm/components/resizer/index.js +8 -4
- 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 +6 -2
- package/dist/esm/components/selection/types.d.ts +15 -0
- package/dist/esm/components/selection/types.d.ts.map +1 -1
- package/dist/esm/components/sheet-search/index.d.ts.map +1 -1
- package/dist/esm/components/sheet-search/index.js +5 -2
- package/dist/esm/components/sheet-tabs/index.d.ts.map +1 -1
- package/dist/esm/components/sheet-tabs/index.js +2 -2
- package/dist/esm/components/sheet-tabs/sheet-tab.d.ts +1 -1
- package/dist/esm/components/sheet-tabs/sheet-tab.d.ts.map +1 -1
- package/dist/esm/components/sheet-tabs/sheet-tab.js +4 -2
- package/dist/esm/components/sparkline-dialog/index.d.ts +43 -0
- package/dist/esm/components/sparkline-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/sparkline-dialog/index.js +123 -0
- package/dist/esm/components/subtotal-dialog/index.d.ts.map +1 -1
- package/dist/esm/components/subtotal-dialog/index.js +10 -1
- package/dist/esm/components/table-auto-expansion-smart-tag/index.d.ts +24 -0
- package/dist/esm/components/table-auto-expansion-smart-tag/index.d.ts.map +1 -0
- package/dist/esm/components/table-auto-expansion-smart-tag/index.js +25 -0
- package/dist/esm/components/toolbar/index.d.ts +1 -0
- package/dist/esm/components/toolbar/index.d.ts.map +1 -1
- package/dist/esm/components/toolbar/index.js +1 -0
- package/dist/esm/components/toolbar/insert-menu.d.ts +2 -1
- package/dist/esm/components/toolbar/insert-menu.d.ts.map +1 -1
- package/dist/esm/components/toolbar/insert-menu.js +24 -1
- package/dist/esm/components/toolbar/merge-cells-selector.d.ts +4 -1
- package/dist/esm/components/toolbar/merge-cells-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/merge-cells-selector.js +10 -6
- package/dist/esm/components/toolbar/sparkline-actions.d.ts +31 -0
- package/dist/esm/components/toolbar/sparkline-actions.d.ts.map +1 -0
- package/dist/esm/components/toolbar/sparkline-actions.js +238 -0
- package/dist/esm/components/toolbar/table-actions.d.ts +9 -1
- package/dist/esm/components/toolbar/table-actions.d.ts.map +1 -1
- package/dist/esm/components/toolbar/table-actions.js +15 -7
- package/dist/esm/components/toolbar/table-style-selector.d.ts +38 -2
- package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/table-style-selector.js +210 -399
- package/dist/esm/config.d.ts +2 -0
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +30 -0
- package/dist/esm/helpers.d.ts +1 -1
- package/dist/esm/helpers.d.ts.map +1 -1
- package/dist/esm/helpers.js +12 -1
- package/dist/esm/hooks/use-cell-renderer.d.ts +16 -1
- package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-cell-renderer.js +14 -4
- package/dist/esm/hooks/use-chart-clipboard.d.ts +55 -0
- package/dist/esm/hooks/use-chart-clipboard.d.ts.map +1 -0
- package/dist/esm/hooks/use-chart-clipboard.js +213 -0
- package/dist/esm/hooks/use-chart-source-ranges.d.ts +27 -0
- package/dist/esm/hooks/use-chart-source-ranges.d.ts.map +1 -0
- package/dist/esm/hooks/use-chart-source-ranges.js +186 -0
- package/dist/esm/hooks/use-context-setter.d.ts.map +1 -1
- package/dist/esm/hooks/use-context-setter.js +3 -1
- package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
- package/dist/esm/hooks/use-copy-paste-cut.js +6 -4
- package/dist/esm/hooks/use-editable.d.ts +9 -1
- package/dist/esm/hooks/use-editable.d.ts.map +1 -1
- package/dist/esm/hooks/use-editable.js +25 -1
- package/dist/esm/hooks/use-embeds-charts.d.ts +64 -4
- package/dist/esm/hooks/use-embeds-charts.d.ts.map +1 -1
- package/dist/esm/hooks/use-embeds-charts.js +394 -39
- package/dist/esm/hooks/use-grid-children.d.ts +2 -2
- package/dist/esm/hooks/use-grid-children.d.ts.map +1 -1
- package/dist/esm/hooks/use-grid-children.js +8 -2
- package/dist/esm/hooks/use-header-actions.d.ts.map +1 -1
- package/dist/esm/hooks/use-header-actions.js +11 -4
- package/dist/esm/hooks/use-isomorphic-layout-effect.d.ts +2 -2
- package/dist/esm/hooks/use-isomorphic-layout-effect.d.ts.map +1 -1
- package/dist/esm/hooks/use-keyboard-handler.d.ts +2 -1
- package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
- package/dist/esm/hooks/use-keyboard-handler.js +8 -2
- package/dist/esm/hooks/use-move-columns-rows.d.ts.map +1 -1
- package/dist/esm/hooks/use-move-columns-rows.js +12 -6
- package/dist/esm/hooks/use-reveal-chart-embed.d.ts +17 -0
- package/dist/esm/hooks/use-reveal-chart-embed.d.ts.map +1 -0
- package/dist/esm/hooks/use-reveal-chart-embed.js +35 -0
- package/dist/esm/hooks/use-selection-move.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection-move.js +11 -4
- package/dist/esm/hooks/use-selection-renderer.d.ts +13 -1
- package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection-renderer.js +35 -6
- package/dist/esm/hooks/use-selection-resize.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection-resize.js +11 -5
- package/dist/esm/hooks/use-selection.d.ts +9 -1
- package/dist/esm/hooks/use-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection.js +172 -54
- package/dist/esm/hooks/use-structured-reference-selection.d.ts +1 -1
- package/dist/esm/hooks/use-structured-reference-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-structured-reference-selection.js +16 -0
- package/dist/esm/hooks/use-table-hit-zones.d.ts +61 -0
- package/dist/esm/hooks/use-table-hit-zones.d.ts.map +1 -0
- package/dist/esm/hooks/use-table-hit-zones.js +146 -0
- package/dist/esm/hooks/use-table-resizer.d.ts +7 -0
- package/dist/esm/hooks/use-table-resizer.d.ts.map +1 -1
- package/dist/esm/hooks/use-table-resizer.js +36 -19
- package/dist/esm/hooks/use-touch.d.ts.map +1 -1
- package/dist/esm/hooks/use-touch.js +15 -7
- package/dist/esm/index.d.ts +13 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +13 -0
- package/dist/esm/release-date.js +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types.d.ts +289 -4
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/utils/copy-as-picture.d.ts +13 -0
- package/dist/esm/utils/copy-as-picture.d.ts.map +1 -0
- package/dist/esm/utils/copy-as-picture.js +45 -0
- package/dist/esm/utils/pivot-chart-field-buttons.d.ts +19 -0
- package/dist/esm/utils/pivot-chart-field-buttons.d.ts.map +1 -0
- package/dist/esm/utils/pivot-chart-field-buttons.js +18 -0
- package/dist/esm/utils/z-order.d.ts +47 -0
- package/dist/esm/utils/z-order.d.ts.map +1 -0
- package/dist/esm/utils/z-order.js +111 -0
- package/dist/spreadsheet.min.css +1 -1
- package/package.json +8 -6
- package/dist/cjs/components/cell-editor/helpers.spec.d.ts +0 -2
- package/dist/cjs/components/cell-editor/helpers.spec.d.ts.map +0 -1
- package/dist/cjs/components/cell-editor/helpers.spec.js +0 -32
- package/dist/esm/components/cell-editor/helpers.spec.d.ts +0 -2
- package/dist/esm/components/cell-editor/helpers.spec.d.ts.map +0 -1
- package/dist/esm/components/cell-editor/helpers.spec.js +0 -30
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { tokenize as defaultFormulaTokenizer } from "@rowsncolumns/calculator";
|
|
2
2
|
import { cellToArea, Direction, isAreasEqual } from "@rowsncolumns/grid";
|
|
3
|
-
import { canUseDOM } from "@rowsncolumns/grid";
|
|
3
|
+
import { canUseDOM, getOwnerDocument } from "@rowsncolumns/grid";
|
|
4
4
|
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
|
-
import {
|
|
8
|
-
import { cn, Skeleton, tryParseRichText } from "@rowsncolumns/ui";
|
|
7
|
+
import { cn, DropdownMenuContent, DropdownMenuPortal, Skeleton, tryParseRichText, } from "@rowsncolumns/ui";
|
|
9
8
|
import { cellToAddress, getCellEffectiveFormat, getContrastColor, getFormulaLocale, isConditionalFormatFormulaRule, isDataValidationFormulaRule, isNil, isNilOrBlank, iterateCellsInRange, localizeCellInput, localizeFormula, localizeFunctionDescriptions, log, resolveDefaultHorizontalAlignment, ssfFormatColor, uuid, } from "@rowsncolumns/utils";
|
|
10
9
|
import { useStore } from "jotai";
|
|
11
10
|
import merge from "lodash/merge";
|
|
@@ -13,6 +12,8 @@ import throttle from "lodash/throttle";
|
|
|
13
12
|
import React, { forwardRef, memo, startTransition, useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
14
13
|
import { getBandedCells } from "../../api/banded-ranges";
|
|
15
14
|
import { clearRangeForInsertedBand, formatsForInsertOption, insertedBandHasValues, } from "../../api/insert-options";
|
|
15
|
+
import { keepsCalculatedColumnTag, } from "../../api/calculated-column-fill";
|
|
16
|
+
import { keepsTableAutoExpansionTag, } from "../../api/table-auto-expansion";
|
|
16
17
|
import { CF_INITIAL_WINDOW, cfWindowForViewport, isSameCfWindow, } from "../../api/cf-window";
|
|
17
18
|
import { generateSelectionsFromFormula } from "../../api/selections";
|
|
18
19
|
import { SpreadsheetApi } from "../../api/spreadsheet-api";
|
|
@@ -21,7 +22,7 @@ import { getDataValidationTooltipContent } from "../../api/validation-tooltip";
|
|
|
21
22
|
import { resolveGoToSpecial } from "../../api/go-to-special";
|
|
22
23
|
import { checkExcelValidationValue, isFormulaEntry, } from "../../api/excel-validation-kinds";
|
|
23
24
|
import { checkBooleanRule, decideValidationCommit, isCellLockedUnderProtection, isProtectedCell, isProtectedSheet, showValidationDropdownArrow, } from "../../api/validation";
|
|
24
|
-
import { useFormulaModeValue, useIsEvaluateFormulaDialogMounted, useIsGoToDialogMounted, useIsMoveOverwriteConfirmMounted, useIsPasteSpecialDialogMounted, useOpenEvaluateFormulaDialog, useOpenGoToDialog, useOpenMoveOverwriteConfirm, useOpenPasteSpecialDialog, useSetNoteEditorCell, useSetPinnedTooltip, useFillOptionsState, useInsertOptionsState, useOpenFillSeriesDialog, useShowPasteMenu, useShowValidationAlert, } from "../../atoms";
|
|
25
|
+
import { useFormulaModeValue, useIsEvaluateFormulaDialogMounted, useIsGoToDialogMounted, useIsMoveOverwriteConfirmMounted, useIsPasteSpecialDialogMounted, useOpenEvaluateFormulaDialog, useOpenGoToDialog, useOpenMoveOverwriteConfirm, useOpenPasteSpecialDialog, useSetNoteEditorCell, useSetPinnedTooltip, useFillOptionsState, useInsertOptionsState, useTableAutoExpansionState, useCalculatedColumnFillState, useOpenFillSeriesDialog, useShowPasteMenu, useShowValidationAlert, } from "../../atoms";
|
|
25
26
|
import { useActiveEditor } from "../../atoms/active-editor.atom";
|
|
26
27
|
import { useAddWatch, useIsWatchWindowMounted, useSetWatchWindowContext, } from "../../atoms/watch-window.atom";
|
|
27
28
|
import { useEditingCell } from "../../atoms/editing-cell.atom";
|
|
@@ -37,9 +38,12 @@ import { useBorderStyles } from "../../hooks/use-border-styles";
|
|
|
37
38
|
import { useCallbackRef } from "../../hooks/use-callback-ref";
|
|
38
39
|
import { useCellPopover } from "../../hooks/use-cell-popover";
|
|
39
40
|
import { useCellRenderer } from "../../hooks/use-cell-renderer";
|
|
41
|
+
import { useChartSourceRanges } from "../../hooks/use-chart-source-ranges";
|
|
40
42
|
import { useConditionalFormatting } from "../../hooks/use-conditional-formatting";
|
|
41
43
|
import { DefaultContextMenuWrapper, useContextMenu, } from "../../hooks/use-context-menu";
|
|
42
44
|
import { useContextSetter } from "../../hooks/use-context-setter";
|
|
45
|
+
import { useRevealChartEmbed } from "../../hooks/use-reveal-chart-embed";
|
|
46
|
+
import { useChartClipboard } from "../../hooks/use-chart-clipboard";
|
|
43
47
|
import { useCopyPasteCut } from "../../hooks/use-copy-paste-cut";
|
|
44
48
|
import { useCreateAddressFromSelection } from "../../hooks/use-create-address-from-selection";
|
|
45
49
|
import { useCreateFormulaTokenizer } from "../../hooks/use-create-formula-tokenizer";
|
|
@@ -49,6 +53,7 @@ import { useEditorChange } from "../../hooks/use-editor-change";
|
|
|
49
53
|
import { useEditorKeydown } from "../../hooks/use-editor-keydown";
|
|
50
54
|
import { useEditorSubmit } from "../../hooks/use-editor-submit";
|
|
51
55
|
import { useEmbedsCharts } from "../../hooks/use-embeds-charts";
|
|
56
|
+
import { ChartSheetView } from "../chart-sheet-view";
|
|
52
57
|
import { useExpandCell } from "../../hooks/use-expand-cell";
|
|
53
58
|
import { useExportRange } from "../../hooks/use-export-range";
|
|
54
59
|
import { useFilter } from "../../hooks/use-filter";
|
|
@@ -80,6 +85,7 @@ import { useSheetChangeHandler } from "../../hooks/use-sheet-change-handler";
|
|
|
80
85
|
import { useSizer } from "../../hooks/use-sizer";
|
|
81
86
|
import { useStableRef } from "../../hooks/use-stable-ref";
|
|
82
87
|
import { useOnStructuredReferenceSelection } from "../../hooks/use-structured-reference-selection";
|
|
88
|
+
import { useTableHitZones } from "../../hooks/use-table-hit-zones";
|
|
83
89
|
import { useTableResizer } from "../../hooks/use-table-resizer";
|
|
84
90
|
import { useDelayedValue } from "../../hooks/use-delayed-value";
|
|
85
91
|
import { useTooltip } from "../../hooks/use-tooltip";
|
|
@@ -91,6 +97,9 @@ import { fillRangeForSeriesSpec, seedRangeForSeriesSpec } from "../../api/fill-s
|
|
|
91
97
|
import { Cell as DefaultCell } from "../cell";
|
|
92
98
|
import { CellEditor as DefaultCellEditor } from "../cell-editor";
|
|
93
99
|
import { ContextMenu as DefaultContextMenu } from "../context-menu";
|
|
100
|
+
import { ContextMenuDropdown } from "../context-menu/menu";
|
|
101
|
+
import { StyledContextMenuWrapper } from "../context-menu/style";
|
|
102
|
+
import { TotalRowFunctionMenuItems } from "../context-menu/total-row-function-menu";
|
|
94
103
|
import { FillHandle } from "../fill-handle";
|
|
95
104
|
import { FilterBox as DefaultFilterBox } from "../filter-box";
|
|
96
105
|
import { HeaderCell as DefaultHeaderCell } from "../header-cell";
|
|
@@ -105,8 +114,10 @@ import { getNestedPropertyNames } from "./helpers";
|
|
|
105
114
|
* @param CanvasGridMethods
|
|
106
115
|
* @returns
|
|
107
116
|
*/
|
|
117
|
+
/** Where the grid focuses when no cell is given (A1); mirrors spreadsheet-state's `defaultCellCoords` without importing it — that package depends on this one. */
|
|
118
|
+
const defaultCellCoords = { rowIndex: 1, columnIndex: 1 };
|
|
108
119
|
function CanvasGridComponent(props, forwardedRef) {
|
|
109
|
-
const { licenseKey, sheetId, 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 = "#008000", conditionalFormats, showFilterIcon = true, showCalculatedColumnIcon = true, showHeaders = true, defaultColumnWidth = DEFAULT_COLUMN_WIDTH, defaultRowHeight = DEFAULT_ROW_HEIGHT, 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, selectionDragBorderColor = SELECTION_BORDER, chartSelectedColor, chipBackgroundColor = CHIP_COLOR, merges = DEFAULT_ARRAY, borderStyles, protectedRanges, isWorkbookProtected: isWorkbookProtectedProp = false, getSheetProtection, pivotTables, charts, embeds, slicers, rowMetadata = DEFAULT_ARRAY, columnMetadata = DEFAULT_ARRAY, scale = 1, zoomSpeed = 1, overscanCount = 3, enableEditOnEnterKey = true, enableTextOverflow = true, showGridLines: _showGridLines, 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, 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, getUserEnteredExtendedValue, getEffectiveExtendedValue, getSheetRowCount, getSheetColumnCount, getCellPopoverContent, onScroll, onViewPortChange, windowConditionalFormats = false, engineConditionalFormatResults = false, onResize, onAutoResize, onHideColumn, onHideRow, onShowColumn, onShowRow, onGroupRows, onUngroupRows, onCollapseRowGroup, onExpandRowGroup, onGroupColumns, onUngroupColumns, onCollapseColumnGroup, onExpandColumnGroup, onSetOutlineDepth, onDeleteRow, onDeleteColumn, onInsertRow, onInsertColumn, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onClearContents, onMoveColumns, onMoveRows, onSelectNextSheet, onSelectPreviousSheet, onCreateNewSheet, onKeyDown, onChangeFormatting, onRepeatFormatting, onClearFormatting, onRequestEditProtectedRange, onMoveChart, onResizeChart, onDeleteChart, onMoveEmbed, onResizeEmbed, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFillRange, disableFillRightShortcut, keymap, onCalculateNow, onRequestGoTo, onMoveSelection, onInsertCutCells, onInsertTime, onInsertDate, onInsertDateTime, onInsertAutoSum, onUndo, onRedo, onPaste, onCopy, onCut, onSortColumn, onSortTable, onFilterTable, onFilterPivot, onResizeTable, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onRemoveTable, onCreateTable, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, 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, readonly, isComparing = false, getCellDiff, enableDataBoundaryNavigation, footerHeight, footerComponent, arrowComponents,
|
|
120
|
+
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 = "#008000", conditionalFormats, showFilterIcon = true, showCalculatedColumnIcon = true, showHeaders = true, defaultColumnWidth = DEFAULT_COLUMN_WIDTH, defaultRowHeight = DEFAULT_ROW_HEIGHT, 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, 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 = true, enableTextOverflow = true, showGridLines: _showGridLines, 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, 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, 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, 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, readonly, isComparing = false, getCellDiff, enableDataBoundaryNavigation, footerHeight, footerComponent, arrowComponents,
|
|
110
121
|
// Host-driven filter props. `hostHiddenRowRanges`
|
|
111
122
|
// supplies compact [start, end] hidden-row tuples; `getFilterValues` supplies a
|
|
112
123
|
// column's distinct values. Both let a million-row filter render without scanning
|
|
@@ -197,6 +208,8 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
197
208
|
// Auto Fill Options smart tag / right-drag fill menu + Series dialog
|
|
198
209
|
const [fillOptions, setFillOptions] = useFillOptionsState();
|
|
199
210
|
const [insertOptions, setInsertOptions] = useInsertOptionsState();
|
|
211
|
+
const [tableAutoExpansion, setTableAutoExpansion] = useTableAutoExpansionState();
|
|
212
|
+
const [calculatedColumnFill, setCalculatedColumnFill] = useCalculatedColumnFillState();
|
|
200
213
|
const openFillSeriesDialog = useOpenFillSeriesDialog();
|
|
201
214
|
// Shared state
|
|
202
215
|
const formulaMode = useFormulaModeValue();
|
|
@@ -502,6 +515,11 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
502
515
|
const tableHeaderCells = useMemo(() => {
|
|
503
516
|
return getTableHeaderCells(activeTables, basicFilter);
|
|
504
517
|
}, [activeTables, basicFilter]);
|
|
518
|
+
/** A cell on a table's totals row (its in-cell arrow opens the function picker). */
|
|
519
|
+
const isTableTotalsCell = useCallback((rowIndex, columnIndex) => !!activeTables?.some((table) => table.totalRow &&
|
|
520
|
+
rowIndex === table.range.endRowIndex &&
|
|
521
|
+
columnIndex >= table.range.startColumnIndex &&
|
|
522
|
+
columnIndex <= table.range.endColumnIndex), [activeTables]);
|
|
505
523
|
/**
|
|
506
524
|
* Retrieve banded cells
|
|
507
525
|
*/
|
|
@@ -528,6 +546,13 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
528
546
|
lastScheduledScrollRef.current = Date.now();
|
|
529
547
|
gridRef.current?.scrollToCell(cell, align);
|
|
530
548
|
}, []);
|
|
549
|
+
// Excel scrolls to a chart / picture it has just inserted or restored.
|
|
550
|
+
const scrollToChart = useRevealChartEmbed({
|
|
551
|
+
charts,
|
|
552
|
+
embeds,
|
|
553
|
+
sheetId,
|
|
554
|
+
scrollToCell,
|
|
555
|
+
});
|
|
531
556
|
/**
|
|
532
557
|
* Scroll to bottom of the sheet
|
|
533
558
|
*/
|
|
@@ -660,10 +685,13 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
660
685
|
// user gesture on the grid focuses the tabIndex=0 container first, so
|
|
661
686
|
// this only suppresses render-driven refocus; a null container ref
|
|
662
687
|
// (mid mount/unmount) falls through to the original focus behavior.
|
|
663
|
-
|
|
688
|
+
// The grid may render into a popout window: read focus from its own
|
|
689
|
+
// document, never from the bundle's global one.
|
|
690
|
+
const ownerDocument = getOwnerDocument(gridContainerRef.current);
|
|
691
|
+
const activeElement = ownerDocument?.activeElement ?? null;
|
|
664
692
|
const gridContainer = gridContainerRef.current;
|
|
665
693
|
if (activeElement &&
|
|
666
|
-
activeElement !==
|
|
694
|
+
activeElement !== ownerDocument?.body &&
|
|
667
695
|
gridContainer &&
|
|
668
696
|
!gridContainer.contains(activeElement)) {
|
|
669
697
|
return;
|
|
@@ -689,7 +717,13 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
689
717
|
* position offset
|
|
690
718
|
*/
|
|
691
719
|
const getRelativePositionFromOffset = useCallback((x, y) => {
|
|
692
|
-
|
|
720
|
+
const grid = gridRef.current;
|
|
721
|
+
if (grid) {
|
|
722
|
+
return grid.getRelativePositionFromOffset(x, y);
|
|
723
|
+
}
|
|
724
|
+
// A chartsheet mounts no grid; overlays position against the wrapper itself.
|
|
725
|
+
const rect = gridContainerRef.current?.getBoundingClientRect();
|
|
726
|
+
return rect ? { x: x - rect.left, y: y - rect.top } : undefined;
|
|
693
727
|
}, []);
|
|
694
728
|
/**
|
|
695
729
|
* Get scroll position
|
|
@@ -1112,10 +1146,11 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
1112
1146
|
// time — `uf.textFormat.underline` is merged on top below, so a user
|
|
1113
1147
|
// who explicitly sets underline=false still wins.
|
|
1114
1148
|
const defaultTextFormat = {
|
|
1115
|
-
bold:
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1149
|
+
bold: bandedCellFormat?.textFormat?.bold ??
|
|
1150
|
+
(isTableHeader(rowIndex, columnIndex) &&
|
|
1151
|
+
isTableHeaderThemed(rowIndex, columnIndex)
|
|
1152
|
+
? true
|
|
1153
|
+
: undefined),
|
|
1119
1154
|
fontFamily: theme.primaryFontFamily,
|
|
1120
1155
|
color: isHyperlink
|
|
1121
1156
|
? theme.themeColors.hyperlink
|
|
@@ -1736,7 +1771,8 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
1736
1771
|
/* Data validation arrow */
|
|
1737
1772
|
const dataValidation = getDataValidationRule(sheetId, rowIndex, columnIndex);
|
|
1738
1773
|
const additionalCellSpacing = getAdditionalCellSpacing?.(sheetId, rowIndex, columnIndex) ?? 0;
|
|
1739
|
-
const showArrow = showValidationDropdownArrow(dataValidation)
|
|
1774
|
+
const showArrow = showValidationDropdownArrow(dataValidation) ||
|
|
1775
|
+
isTableTotalsCell(rowIndex, columnIndex);
|
|
1740
1776
|
const showChip = getCellMetaType(sheetId, rowIndex, columnIndex) === "people";
|
|
1741
1777
|
const [expandable] = getCellGroupingInfo(sheetId, rowIndex, columnIndex);
|
|
1742
1778
|
const iconSpacing = DEFAULT_CELL_SPACING;
|
|
@@ -1786,6 +1822,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
1786
1822
|
getCellGroupingInfo,
|
|
1787
1823
|
getAdditionalCellSpacing,
|
|
1788
1824
|
getEffectiveCellFormat,
|
|
1825
|
+
isTableTotalsCell,
|
|
1789
1826
|
]);
|
|
1790
1827
|
/**
|
|
1791
1828
|
* Column resizer
|
|
@@ -1834,7 +1871,13 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
1834
1871
|
sheetId,
|
|
1835
1872
|
]);
|
|
1836
1873
|
/* Check if sheet is focused */
|
|
1837
|
-
const isSheetFocused = useCallback(() =>
|
|
1874
|
+
const isSheetFocused = useCallback(() => {
|
|
1875
|
+
const editorElement = cellEditorInstance?.el();
|
|
1876
|
+
if (!editorElement) {
|
|
1877
|
+
return false;
|
|
1878
|
+
}
|
|
1879
|
+
return getOwnerDocument(editorElement)?.activeElement === editorElement;
|
|
1880
|
+
}, [cellEditorInstance]);
|
|
1838
1881
|
/**
|
|
1839
1882
|
* Get Cell Editor
|
|
1840
1883
|
*/
|
|
@@ -2112,6 +2155,101 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2112
2155
|
useEffect(() => {
|
|
2113
2156
|
setInsertOptions(null);
|
|
2114
2157
|
}, [activeCell.rowIndex, activeCell.columnIndex, sheetId, setInsertOptions]);
|
|
2158
|
+
/**
|
|
2159
|
+
* Excel's AutoCorrect smart tag after a table auto-expanded. "Undo Table
|
|
2160
|
+
* AutoExpansion" resizes the table back to its pre-growth range and clears
|
|
2161
|
+
* what the growth wrote (calculated-column formulas, generated headers,
|
|
2162
|
+
* inherited formats) in one undo step — the user's own value stays, like
|
|
2163
|
+
* Excel; "Stop Automatically Expanding Tables" hands the option to the host.
|
|
2164
|
+
*/
|
|
2165
|
+
const handleChooseTableAutoExpansionOption = useCallback((option) => {
|
|
2166
|
+
if (!tableAutoExpansion)
|
|
2167
|
+
return;
|
|
2168
|
+
if (option === "undo") {
|
|
2169
|
+
if (onUndoTableAutoExpansion) {
|
|
2170
|
+
onUndoTableAutoExpansion(tableAutoExpansion);
|
|
2171
|
+
}
|
|
2172
|
+
else {
|
|
2173
|
+
const table = tables?.find((candidate) => candidate.id === tableAutoExpansion.tableId &&
|
|
2174
|
+
candidate.sheetId === tableAutoExpansion.sheetId);
|
|
2175
|
+
if (table) {
|
|
2176
|
+
onResizeTable?.(tableAutoExpansion.sheetId, table, tableAutoExpansion.previousRange);
|
|
2177
|
+
}
|
|
2178
|
+
}
|
|
2179
|
+
}
|
|
2180
|
+
else {
|
|
2181
|
+
onChangeAutoExpandTables?.(false);
|
|
2182
|
+
}
|
|
2183
|
+
setTableAutoExpansion(null);
|
|
2184
|
+
focusSheet();
|
|
2185
|
+
}, [
|
|
2186
|
+
tableAutoExpansion,
|
|
2187
|
+
tables,
|
|
2188
|
+
onResizeTable,
|
|
2189
|
+
onUndoTableAutoExpansion,
|
|
2190
|
+
onChangeAutoExpandTables,
|
|
2191
|
+
setTableAutoExpansion,
|
|
2192
|
+
focusSheet,
|
|
2193
|
+
]);
|
|
2194
|
+
// The tag survives the commit's own cursor advance (Enter / Tab) and any cell
|
|
2195
|
+
// of the grown table; moving anywhere else, or switching sheet, drops it.
|
|
2196
|
+
useEffect(() => {
|
|
2197
|
+
if (tableAutoExpansion &&
|
|
2198
|
+
!keepsTableAutoExpansionTag(tableAutoExpansion, sheetId, activeCell)) {
|
|
2199
|
+
setTableAutoExpansion(null);
|
|
2200
|
+
}
|
|
2201
|
+
}, [
|
|
2202
|
+
tableAutoExpansion,
|
|
2203
|
+
activeCell.rowIndex,
|
|
2204
|
+
activeCell.columnIndex,
|
|
2205
|
+
activeCell,
|
|
2206
|
+
sheetId,
|
|
2207
|
+
setTableAutoExpansion,
|
|
2208
|
+
]);
|
|
2209
|
+
/**
|
|
2210
|
+
* Excel's AutoCorrect smart tag after a formula typed into a table column.
|
|
2211
|
+
* "Undo Calculated Column" reverts the fill alone (the typed cell keeps its
|
|
2212
|
+
* formula); "Overwrite all cells in this column with this formula" fills the
|
|
2213
|
+
* column over the cells that kept it from filling; "Stop automatically
|
|
2214
|
+
* creating calculated columns" hands the option to the host.
|
|
2215
|
+
*/
|
|
2216
|
+
const handleChooseCalculatedColumnOption = useCallback((option) => {
|
|
2217
|
+
if (!calculatedColumnFill)
|
|
2218
|
+
return;
|
|
2219
|
+
if (option === "undo") {
|
|
2220
|
+
onUndoCalculatedColumn?.(calculatedColumnFill);
|
|
2221
|
+
}
|
|
2222
|
+
else if (option === "overwrite") {
|
|
2223
|
+
onOverwriteCalculatedColumn?.(calculatedColumnFill);
|
|
2224
|
+
}
|
|
2225
|
+
else {
|
|
2226
|
+
onChangeAutoCalculatedColumns?.(false);
|
|
2227
|
+
}
|
|
2228
|
+
setCalculatedColumnFill(null);
|
|
2229
|
+
focusSheet();
|
|
2230
|
+
}, [
|
|
2231
|
+
calculatedColumnFill,
|
|
2232
|
+
onUndoCalculatedColumn,
|
|
2233
|
+
onOverwriteCalculatedColumn,
|
|
2234
|
+
onChangeAutoCalculatedColumns,
|
|
2235
|
+
setCalculatedColumnFill,
|
|
2236
|
+
focusSheet,
|
|
2237
|
+
]);
|
|
2238
|
+
// The tag survives the commit's own cursor advance and any cell of the
|
|
2239
|
+
// column; moving anywhere else, or switching sheet, drops it.
|
|
2240
|
+
useEffect(() => {
|
|
2241
|
+
if (calculatedColumnFill &&
|
|
2242
|
+
!keepsCalculatedColumnTag(calculatedColumnFill, sheetId, activeCell)) {
|
|
2243
|
+
setCalculatedColumnFill(null);
|
|
2244
|
+
}
|
|
2245
|
+
}, [
|
|
2246
|
+
calculatedColumnFill,
|
|
2247
|
+
activeCell.rowIndex,
|
|
2248
|
+
activeCell.columnIndex,
|
|
2249
|
+
activeCell,
|
|
2250
|
+
sheetId,
|
|
2251
|
+
setCalculatedColumnFill,
|
|
2252
|
+
]);
|
|
2115
2253
|
/**
|
|
2116
2254
|
* Run Excel's Series dialog result: the target range's first row (Series
|
|
2117
2255
|
* in Columns) / first column (Rows) is the seed line; `stop` may shrink or
|
|
@@ -2241,6 +2379,8 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2241
2379
|
isColumnHeader,
|
|
2242
2380
|
isTouchDevice,
|
|
2243
2381
|
dataRegionBoundaries,
|
|
2382
|
+
tables,
|
|
2383
|
+
onInsertTableRow,
|
|
2244
2384
|
});
|
|
2245
2385
|
/**
|
|
2246
2386
|
* Copy, Paste and Cut hook
|
|
@@ -2254,6 +2394,37 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2254
2394
|
onCopy,
|
|
2255
2395
|
onCut,
|
|
2256
2396
|
});
|
|
2397
|
+
/**
|
|
2398
|
+
* Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+D on a selected chart. The focused chart is
|
|
2399
|
+
* the target of those events (see `EmbedDraggable`); a paste that lands in the
|
|
2400
|
+
* cell editor while a chart is on the clipboard is claimed here first.
|
|
2401
|
+
*/
|
|
2402
|
+
const chartClipboard = useChartClipboard({
|
|
2403
|
+
sheetId,
|
|
2404
|
+
activeCell,
|
|
2405
|
+
charts,
|
|
2406
|
+
readonly,
|
|
2407
|
+
onCreateChart,
|
|
2408
|
+
onDeleteChart,
|
|
2409
|
+
onCopyChart,
|
|
2410
|
+
onCutChart,
|
|
2411
|
+
focusSheet,
|
|
2412
|
+
});
|
|
2413
|
+
const { copyChart, cutChart, pasteChart, duplicateChart, clearChartClipboard } = chartClipboard;
|
|
2414
|
+
const handleEditorCopy = useCallback((e) => {
|
|
2415
|
+
clearChartClipboard();
|
|
2416
|
+
onInternalCopy(e);
|
|
2417
|
+
}, [clearChartClipboard, onInternalCopy]);
|
|
2418
|
+
const handleEditorCut = useCallback((e) => {
|
|
2419
|
+
clearChartClipboard();
|
|
2420
|
+
onInternalCut(e);
|
|
2421
|
+
}, [clearChartClipboard, onInternalCut]);
|
|
2422
|
+
const handleEditorPaste = useCallback((e) => {
|
|
2423
|
+
if (pasteChart(e)) {
|
|
2424
|
+
return;
|
|
2425
|
+
}
|
|
2426
|
+
onInternalPaste(e);
|
|
2427
|
+
}, [pasteChart, onInternalPaste]);
|
|
2257
2428
|
/**
|
|
2258
2429
|
* Context menu "Insert Cut Cells" (Excel: Ctrl+X, right-click the destination). A cut of
|
|
2259
2430
|
* whole rows / columns dropped on a row / column header inserts them BEFORE the clicked
|
|
@@ -2490,14 +2661,18 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2490
2661
|
});
|
|
2491
2662
|
/**
|
|
2492
2663
|
* Get bounds of chart overlay
|
|
2493
|
-
* Within the grid body
|
|
2664
|
+
* Within the grid body: from the first cell's top-left corner to the last
|
|
2665
|
+
* row's bottom edge and last column's right edge, so an object can never be
|
|
2666
|
+
* dragged or resized past the sheet (Excel snaps it back inside).
|
|
2494
2667
|
*/
|
|
2495
2668
|
const getChartBounds = useCallback(() => {
|
|
2496
2669
|
return {
|
|
2497
2670
|
left: getColumnOffset(1),
|
|
2498
2671
|
top: getRowOffset(1),
|
|
2672
|
+
right: getColumnOffset(columnCount + 1),
|
|
2673
|
+
bottom: getRowOffset(rowCount + 1),
|
|
2499
2674
|
};
|
|
2500
|
-
}, [getRowOffset, getColumnOffset]);
|
|
2675
|
+
}, [getRowOffset, getColumnOffset, rowCount, columnCount]);
|
|
2501
2676
|
// Show notes editor
|
|
2502
2677
|
const onInsertNote = useCallback((sheetId, cell) => {
|
|
2503
2678
|
setNoteEditorCell({
|
|
@@ -2542,11 +2717,38 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2542
2717
|
});
|
|
2543
2718
|
focusSheet();
|
|
2544
2719
|
}, [setQuickEditState, enableQuickEdit, focusSheet]);
|
|
2720
|
+
/**
|
|
2721
|
+
* Opens the cell editor pre-filled (the totals row's "More Functions…").
|
|
2722
|
+
* `editCell` comes from `useEditable` below; this stable wrapper lets the
|
|
2723
|
+
* context menu reach it.
|
|
2724
|
+
*/
|
|
2725
|
+
const requestEditCell = useCallbackRef((targetSheetId, cell, initialValue) => editCell(targetSheetId, cell, initialValue));
|
|
2726
|
+
/**
|
|
2727
|
+
* The context menu's table Select items: replace the selection with a
|
|
2728
|
+
* range and park the active cell at its top-left, without scrolling.
|
|
2729
|
+
*/
|
|
2730
|
+
const selectRangeFromMenu = useCallback((targetSheetId, range) => {
|
|
2731
|
+
setActiveCell(targetSheetId, { rowIndex: range.startRowIndex, columnIndex: range.startColumnIndex }, false);
|
|
2732
|
+
onChangeSelections?.(targetSheetId, [{ range }]);
|
|
2733
|
+
}, [setActiveCell, onChangeSelections]);
|
|
2734
|
+
// Excel's table hit zones (header top edge / corner / row left edge).
|
|
2735
|
+
const { cursor: tableHitCursor, onMouseMove: onMouseMoveTableHitZones, onMouseDown: onMouseDownTableHitZones, clearHitZone: clearTableHitZone, } = useTableHitZones({
|
|
2736
|
+
sheetId,
|
|
2737
|
+
tables: activeTables,
|
|
2738
|
+
selections,
|
|
2739
|
+
frozenRows,
|
|
2740
|
+
frozenColumns,
|
|
2741
|
+
getCellCoordsFromOffset,
|
|
2742
|
+
getRelativePositionFromOffset,
|
|
2743
|
+
getCellOffsetFromCoords,
|
|
2744
|
+
getScrollPosition,
|
|
2745
|
+
onSelectRange: selectRangeFromMenu,
|
|
2746
|
+
});
|
|
2545
2747
|
/**
|
|
2546
2748
|
* Get context Menu component
|
|
2547
2749
|
*/
|
|
2548
2750
|
const getContextMenu = useCallback((cell) => {
|
|
2549
|
-
return (React.createElement(ContextMenu, { activeCell: activeCell, selections: selections, sheetId: sheetId, frozenRows: frozenRows, frozenColumns: frozenColumns, onHideColumn: isRestricted ? undefined : onHideColumn, onShowColumn: isRestricted ? undefined : onShowColumn, onShowRow: isRestricted ? undefined : onShowRow, onHideRow: isRestricted ? undefined : onHideRow, onGroupRows: isRestricted ? undefined : onGroupRows, onUngroupRows: isRestricted ? undefined : onUngroupRows, onGroupColumns: isRestricted ? undefined : onGroupColumns, onUngroupColumns: isRestricted ? undefined : onUngroupColumns, isHiddenColumn: isHiddenColumn, isHiddenRow: isHiddenRow, onDeleteColumn: onDeleteColumn, onDeleteRow: onDeleteRow, onInsertRow: insertRowWithOptions, onInsertColumn: insertColumnWithOptions, rowCount: rowCount, columnCount: columnCount, onInsertCellsShiftDown: onInsertCellsShiftDown, onInsertCellsShiftRight: onInsertCellsShiftRight, onDeleteCellsShiftLeft: onDeleteCellsShiftLeft, onDeleteCellsShiftUp: onDeleteCellsShiftUp, onClearContents: onClearContents, onFreezeColumn: onFreezeColumn, onFreezeRow: onFreezeRow, focusSheet: focusSheet, onSortColumn: onSortColumn, onInsertNote: onInsertNote, onProtectRange: onProtectRange, onUnProtectRange: onUnProtectRange, onSortRange: onSortRange, onRequestDefineNamedRange: onRequestDefineNamedRange, protectedRanges: protectedRanges, isRowHeader: isRowHeader(cell.columnIndex), isColumnHeader: isColumnHeader(cell.rowIndex), selectedRowHeadersIds: selectedRowHeadersIds, selectedColumnHeadersIds: selectedColumnHeadersIds, onCopy: copy, onCut: cut, hasCutSelection: isCutPending && copiedSheetId === sheetId, onInsertCutCells: insertCutCellsFromMenu, onPaste: paste, onRequestPasteSpecial: requestPasteSpecial, onRequestEvaluateFormula: requestEvaluateFormula, onRequestAddWatch: requestAddWatch, isActiveCellFormula: Boolean(getFormulaValue(sheetId, activeCell.rowIndex, activeCell.columnIndex)), onRequestResize: onRequestResize, isSheetFocused: isSheetFocused, tables: activeTables, pivotTables: pivotTables, basicFilter: basicFilter, onRequestEditTable: onRequestEditTable, onRequestEditPivotTable: onRequestEditPivotTable, onRemoveTable: onRemoveTable, onRequestDeletePivotTable: onRequestDeletePivotTable, onPivotDrillDown: onPivotDrillDown, onRequestFormatCells: onRequestFormatCells, onRequestConditionalFormat: onRequestConditionalFormat, onRequestDataValidation: onRequestDataValidation, onClearFormatting: onClearFormatting, onCreateTable: onCreateTable, onCreateBasicFilter: onCreateBasicFilter, onInsertTableColumn: onInsertTableColumn, onDeleteTableColumn: onDeleteTableColumn, onInsertTableRow: onInsertTableRow, onDeleteTableRow: onDeleteTableRow, onFilterTable: onFilterTable, onSortTable: onSortTable, getFormattedValue: getFormattedValue, getFormattedValuesFromRange: getFormattedValuesFromRange, isTableHeader: isTableHeader, readonly: readonly, onSplitTextToColumns: onSplitTextToColumns, onRemoveDuplicates: onRemoveDuplicates, onGoalSeek: onGoalSeek, onSubtotal: onSubtotal, onAdvancedFilter: onAdvancedFilter, onChange: onChange, getCellData: getCellData, onAddQuickEdit: onAddQuickEdit, enableMagicFill: enableMagicFill }));
|
|
2751
|
+
return (React.createElement(ContextMenu, { activeCell: activeCell, selections: selections, sheetId: sheetId, frozenRows: frozenRows, frozenColumns: frozenColumns, onHideColumn: isRestricted ? undefined : onHideColumn, onShowColumn: isRestricted ? undefined : onShowColumn, onShowRow: isRestricted ? undefined : onShowRow, onHideRow: isRestricted ? undefined : onHideRow, onGroupRows: isRestricted ? undefined : onGroupRows, onUngroupRows: isRestricted ? undefined : onUngroupRows, onGroupColumns: isRestricted ? undefined : onGroupColumns, onUngroupColumns: isRestricted ? undefined : onUngroupColumns, isHiddenColumn: isHiddenColumn, isHiddenRow: isHiddenRow, onDeleteColumn: onDeleteColumn, onDeleteRow: onDeleteRow, onInsertRow: insertRowWithOptions, onInsertColumn: insertColumnWithOptions, rowCount: rowCount, columnCount: columnCount, onInsertCellsShiftDown: onInsertCellsShiftDown, onInsertCellsShiftRight: onInsertCellsShiftRight, onDeleteCellsShiftLeft: onDeleteCellsShiftLeft, onDeleteCellsShiftUp: onDeleteCellsShiftUp, onClearContents: onClearContents, onFreezeColumn: onFreezeColumn, onFreezeRow: onFreezeRow, focusSheet: focusSheet, onSortColumn: onSortColumn, onInsertNote: onInsertNote, onProtectRange: onProtectRange, onUnProtectRange: onUnProtectRange, onSortRange: onSortRange, onRequestDefineNamedRange: onRequestDefineNamedRange, protectedRanges: protectedRanges, isRowHeader: isRowHeader(cell.columnIndex), isColumnHeader: isColumnHeader(cell.rowIndex), selectedRowHeadersIds: selectedRowHeadersIds, selectedColumnHeadersIds: selectedColumnHeadersIds, onCopy: copy, onCut: cut, hasCutSelection: isCutPending && copiedSheetId === sheetId, onInsertCutCells: insertCutCellsFromMenu, onPaste: paste, onRequestPasteSpecial: requestPasteSpecial, onRequestEvaluateFormula: requestEvaluateFormula, onRequestAddWatch: requestAddWatch, isActiveCellFormula: Boolean(getFormulaValue(sheetId, activeCell.rowIndex, activeCell.columnIndex)), onRequestResize: onRequestResize, isSheetFocused: isSheetFocused, tables: activeTables, pivotTables: pivotTables, basicFilter: basicFilter, onRequestEditTable: onRequestEditTable, onRequestResizeTable: onRequestResizeTable, onRequestInsertSlicer: onRequestInsertSlicer, onRequestEditPivotTable: onRequestEditPivotTable, onRemoveTable: onRemoveTable, onRequestDeletePivotTable: onRequestDeletePivotTable, onRequestCreatePivotChart: onRequestCreatePivotChart, onPivotDrillDown: onPivotDrillDown, onRequestFormatCells: onRequestFormatCells, onRequestConditionalFormat: onRequestConditionalFormat, onRequestDataValidation: onRequestDataValidation, onClearFormatting: onClearFormatting, onCreateTable: onCreateTable, onRequestCreateTable: onRequestCreateTable, onCreateBasicFilter: onCreateBasicFilter, onInsertTableColumn: onInsertTableColumn, onDeleteTableColumn: onDeleteTableColumn, onInsertTableRow: onInsertTableRow, onDeleteTableRow: onDeleteTableRow, onUpdateTable: onUpdateTable, onRequestEditCell: requestEditCell, onSelectRange: selectRangeFromMenu, onFilterTable: onFilterTable, onSortTable: onSortTable, getFormattedValue: getFormattedValue, getFormattedValuesFromRange: getFormattedValuesFromRange, isTableHeader: isTableHeader, readonly: readonly, onSplitTextToColumns: onSplitTextToColumns, onRemoveDuplicates: onRemoveDuplicates, onGoalSeek: onGoalSeek, onSubtotal: onSubtotal, onAdvancedFilter: onAdvancedFilter, onChange: onChange, getCellData: getCellData, onAddQuickEdit: onAddQuickEdit, enableMagicFill: enableMagicFill }));
|
|
2550
2752
|
}, [
|
|
2551
2753
|
isRestricted,
|
|
2552
2754
|
activeCell,
|
|
@@ -2597,6 +2799,8 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2597
2799
|
onFilterTable,
|
|
2598
2800
|
onSortTable,
|
|
2599
2801
|
onRequestEditTable,
|
|
2802
|
+
onRequestResizeTable,
|
|
2803
|
+
onRequestInsertSlicer,
|
|
2600
2804
|
onRequestEditPivotTable,
|
|
2601
2805
|
onRemoveTable,
|
|
2602
2806
|
onRequestFormatCells,
|
|
@@ -2605,8 +2809,12 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2605
2809
|
onRequestDataValidation,
|
|
2606
2810
|
onCreateBasicFilter,
|
|
2607
2811
|
onCreateTable,
|
|
2812
|
+
onRequestCreateTable,
|
|
2608
2813
|
onDeleteTableColumn,
|
|
2609
2814
|
onInsertTableRow,
|
|
2815
|
+
onUpdateTable,
|
|
2816
|
+
requestEditCell,
|
|
2817
|
+
selectRangeFromMenu,
|
|
2610
2818
|
getFormattedValue,
|
|
2611
2819
|
getFormattedValuesFromRange,
|
|
2612
2820
|
onInsertTableColumn,
|
|
@@ -2622,6 +2830,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2622
2830
|
onChange,
|
|
2623
2831
|
getCellData,
|
|
2624
2832
|
onRequestDeletePivotTable,
|
|
2833
|
+
onRequestCreatePivotChart,
|
|
2625
2834
|
isHiddenColumn,
|
|
2626
2835
|
isHiddenRow,
|
|
2627
2836
|
onShowColumn,
|
|
@@ -2685,6 +2894,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2685
2894
|
onUndo,
|
|
2686
2895
|
onRedo,
|
|
2687
2896
|
onCreateTable,
|
|
2897
|
+
onRequestCreateTable,
|
|
2688
2898
|
onCreateBasicFilter,
|
|
2689
2899
|
clearCopiedSelections,
|
|
2690
2900
|
onRequestSearch,
|
|
@@ -2771,9 +2981,11 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2771
2981
|
scrollToCell,
|
|
2772
2982
|
containerWidth: width,
|
|
2773
2983
|
containerHeight: height,
|
|
2774
|
-
onCopy:
|
|
2775
|
-
onPaste:
|
|
2776
|
-
onCut:
|
|
2984
|
+
onCopy: handleEditorCopy,
|
|
2985
|
+
onPaste: handleEditorPaste,
|
|
2986
|
+
onCut: handleEditorCut,
|
|
2987
|
+
tables,
|
|
2988
|
+
onInsertTableRow,
|
|
2777
2989
|
});
|
|
2778
2990
|
/**
|
|
2779
2991
|
* Move rows and columns
|
|
@@ -2916,7 +3128,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2916
3128
|
/**
|
|
2917
3129
|
* Displays resizable/draggable charts
|
|
2918
3130
|
*/
|
|
2919
|
-
const { chartComponents, embedComponents, slicerComponents, onMouseDown: onMouseDownCharts, } = useEmbedsCharts({
|
|
3131
|
+
const { chartComponents, embedComponents, slicerComponents, contextMenuComponent: embedContextMenuComponent, onMouseDown: onMouseDownCharts, requestChartContextMenu, } = useEmbedsCharts({
|
|
2920
3132
|
charts,
|
|
2921
3133
|
embeds,
|
|
2922
3134
|
slicers,
|
|
@@ -2927,14 +3139,20 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
2927
3139
|
getCellOffsetFromCoords,
|
|
2928
3140
|
getAbsolutePositionFromOffset,
|
|
2929
3141
|
getCellCoordsFromOffset,
|
|
3142
|
+
getRelativePositionFromOffset,
|
|
2930
3143
|
getScrollPosition,
|
|
3144
|
+
ContextMenuWrapper,
|
|
3145
|
+
focusSheet,
|
|
2931
3146
|
selectedColor: chartSelectedColor,
|
|
2932
3147
|
onMoveChart,
|
|
2933
3148
|
onResizeChart,
|
|
3149
|
+
chartClipboard,
|
|
2934
3150
|
onMoveEmbed,
|
|
2935
3151
|
onResizeEmbed,
|
|
2936
3152
|
onDeleteEmbed,
|
|
2937
3153
|
onDeleteChart,
|
|
3154
|
+
onUpdateChart,
|
|
3155
|
+
onChangeZOrder,
|
|
2938
3156
|
onRequestEditEmbed,
|
|
2939
3157
|
onMoveSlicer,
|
|
2940
3158
|
onResizeSlicer,
|
|
@@ -3004,6 +3222,55 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3004
3222
|
onExpandCollapse?.(sheetId, cell, groupKeys, newExpandedState, childrenCount);
|
|
3005
3223
|
}
|
|
3006
3224
|
}, [onExpandCollapse, getCellGroupKeys, getChildrenCount]);
|
|
3225
|
+
/**
|
|
3226
|
+
* The totals-function picker a totals cell's in-cell arrow opens (Excel):
|
|
3227
|
+
* anchored at the cell's bottom-right corner like the filter dropdown.
|
|
3228
|
+
*/
|
|
3229
|
+
const [totalsPicker, setTotalsPicker] = useState(null);
|
|
3230
|
+
const closeTotalsPicker = useCallback(() => setTotalsPicker(null), []);
|
|
3231
|
+
const handleTotalsArrowClick = useCallback((cell) => {
|
|
3232
|
+
const table = activeTables?.find((candidate) => candidate.totalRow &&
|
|
3233
|
+
cell.rowIndex === candidate.range.endRowIndex &&
|
|
3234
|
+
isCellWithinBounds(cell, candidate.range));
|
|
3235
|
+
const cellPosition = getCellOffsetFromCoords(cell);
|
|
3236
|
+
const scrollPosition = getScrollPosition();
|
|
3237
|
+
if (!table || !cellPosition) {
|
|
3238
|
+
return;
|
|
3239
|
+
}
|
|
3240
|
+
const { x = 0, y = 0, width = 0, height = 0 } = cellPosition;
|
|
3241
|
+
const scrollX = isFrozenColumn(cell.columnIndex)
|
|
3242
|
+
? 0
|
|
3243
|
+
: scrollPosition.scrollLeft;
|
|
3244
|
+
const scrollY = isFrozenRow(cell.rowIndex) ? 0 : scrollPosition.scrollTop;
|
|
3245
|
+
setActiveCell(sheetId, cell, false);
|
|
3246
|
+
setTotalsPicker({
|
|
3247
|
+
table,
|
|
3248
|
+
cell,
|
|
3249
|
+
left: x + width - scrollX,
|
|
3250
|
+
top: y + height - scrollY,
|
|
3251
|
+
});
|
|
3252
|
+
}, [
|
|
3253
|
+
activeTables,
|
|
3254
|
+
getCellOffsetFromCoords,
|
|
3255
|
+
getScrollPosition,
|
|
3256
|
+
isFrozenColumn,
|
|
3257
|
+
isFrozenRow,
|
|
3258
|
+
setActiveCell,
|
|
3259
|
+
sheetId,
|
|
3260
|
+
]);
|
|
3261
|
+
const totalsPickerComponent = totalsPicker ? (React.createElement(StyledContextMenuWrapper, { style: {
|
|
3262
|
+
transform: `translate3d(${totalsPicker.left}px, ${totalsPicker.top}px, 0)`,
|
|
3263
|
+
} },
|
|
3264
|
+
React.createElement(ContextMenuDropdown, { isOpen: true, onOpenChange: (open) => {
|
|
3265
|
+
if (!open)
|
|
3266
|
+
closeTotalsPicker();
|
|
3267
|
+
} },
|
|
3268
|
+
React.createElement(DropdownMenuPortal, null,
|
|
3269
|
+
React.createElement(DropdownMenuContent, { align: "end", sideOffset: 0, onCloseAutoFocus: (event) => {
|
|
3270
|
+
event.preventDefault();
|
|
3271
|
+
focusSheet();
|
|
3272
|
+
}, onMouseMove: (e) => e.stopPropagation() },
|
|
3273
|
+
React.createElement(TotalRowFunctionMenuItems, { sheetId: sheetId, table: totalsPicker.table, cell: totalsPicker.cell, readonly: readonly, getCellData: getCellData, onChange: onChange, onClearContents: onClearContents, onUpdateTable: onUpdateTable, onRequestEditCell: requestEditCell })))))) : null;
|
|
3007
3274
|
/**
|
|
3008
3275
|
* Capture mouse move events
|
|
3009
3276
|
*/
|
|
@@ -3014,8 +3281,10 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3014
3281
|
isDraggingHeader ||
|
|
3015
3282
|
isSelectionInProgress ||
|
|
3016
3283
|
isFilling) {
|
|
3284
|
+
clearTableHitZone();
|
|
3017
3285
|
return;
|
|
3018
3286
|
}
|
|
3287
|
+
onMouseMoveTableHitZones(e);
|
|
3019
3288
|
const coords = getCellCoordsFromOffset(e.clientX, e.clientY);
|
|
3020
3289
|
if (!coords || isEqualCells(hoveredCellRef.current, coords)) {
|
|
3021
3290
|
return;
|
|
@@ -3029,6 +3298,8 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3029
3298
|
isSelectionInProgress,
|
|
3030
3299
|
isFilling,
|
|
3031
3300
|
hoveredCellRef,
|
|
3301
|
+
onMouseMoveTableHitZones,
|
|
3302
|
+
clearTableHitZone,
|
|
3032
3303
|
]);
|
|
3033
3304
|
// Mouse move throttler
|
|
3034
3305
|
const mouseMoveThrottler = useCallbackRef(throttle(handleMouseMove, mouseMoveThrottleTimeout, {
|
|
@@ -3065,8 +3336,12 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3065
3336
|
selectionMode: "append",
|
|
3066
3337
|
}));
|
|
3067
3338
|
}
|
|
3068
|
-
//
|
|
3069
|
-
|
|
3339
|
+
// A table hit zone (header edge / corner / row edge) selects the table
|
|
3340
|
+
// part instead of starting a cell selection.
|
|
3341
|
+
if (!onMouseDownTableHitZones(e)) {
|
|
3342
|
+
// Pass it on to use selection hook
|
|
3343
|
+
onMouseDownSelection(e);
|
|
3344
|
+
}
|
|
3070
3345
|
// Charts
|
|
3071
3346
|
onMouseDownCharts?.();
|
|
3072
3347
|
/**
|
|
@@ -3078,6 +3353,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3078
3353
|
}
|
|
3079
3354
|
// Hide filter
|
|
3080
3355
|
hideFilter();
|
|
3356
|
+
closeTotalsPicker();
|
|
3081
3357
|
// Hide popover
|
|
3082
3358
|
hideCellPopover();
|
|
3083
3359
|
// Hide paste mnenu
|
|
@@ -3088,8 +3364,10 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3088
3364
|
onUnpinTooltip();
|
|
3089
3365
|
}, [
|
|
3090
3366
|
onMouseDownSelection,
|
|
3367
|
+
onMouseDownTableHitZones,
|
|
3091
3368
|
onRequestCloseContextMenu,
|
|
3092
3369
|
hideFilter,
|
|
3370
|
+
closeTotalsPicker,
|
|
3093
3371
|
onMouseDownCharts,
|
|
3094
3372
|
formulaMode,
|
|
3095
3373
|
setFormulaState,
|
|
@@ -3215,6 +3493,8 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3215
3493
|
*/
|
|
3216
3494
|
const [cellBackgroundRenderer, cellRenderer, cellOverlayRenderer, headerCellRenderer,] = useCellRenderer({
|
|
3217
3495
|
sheetId,
|
|
3496
|
+
isTableTotalsCell,
|
|
3497
|
+
onTotalsArrowClick: handleTotalsArrowClick,
|
|
3218
3498
|
formulaLocale,
|
|
3219
3499
|
showGridLines,
|
|
3220
3500
|
scale,
|
|
@@ -3253,6 +3533,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3253
3533
|
getNote,
|
|
3254
3534
|
getComment,
|
|
3255
3535
|
getEffectiveValue,
|
|
3536
|
+
getSparklineGroup,
|
|
3256
3537
|
getFormattedValue,
|
|
3257
3538
|
getCellImageUrl,
|
|
3258
3539
|
getEffectiveCellFormat,
|
|
@@ -3324,6 +3605,20 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3324
3605
|
scrollToCell,
|
|
3325
3606
|
tokenizer: localeTokenizer,
|
|
3326
3607
|
});
|
|
3608
|
+
/**
|
|
3609
|
+
* Selected chart: outline its source ranges on this sheet and re-bind
|
|
3610
|
+
* them when a corner handle is dragged (Excel's chart data highlight).
|
|
3611
|
+
*/
|
|
3612
|
+
const { chartSourceBorderStyles, onMouseDownChartSourceResizeHandle } = useChartSourceRanges({
|
|
3613
|
+
charts,
|
|
3614
|
+
sheetId,
|
|
3615
|
+
getSheetName,
|
|
3616
|
+
readonly,
|
|
3617
|
+
onUpdateChart,
|
|
3618
|
+
getCellBounds,
|
|
3619
|
+
getCellCoordsFromOffset,
|
|
3620
|
+
scrollToCell,
|
|
3621
|
+
});
|
|
3327
3622
|
/**
|
|
3328
3623
|
* Hide fill handle
|
|
3329
3624
|
* 1. When user is in edit mode
|
|
@@ -3356,6 +3651,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3356
3651
|
isFillShrink: fillShrink !== undefined,
|
|
3357
3652
|
onSelectionMouseDown: onSelectionElementMouseDown,
|
|
3358
3653
|
onMouseDownResizeHandle: onMouseDownResizeHandle,
|
|
3654
|
+
onMouseDownChartSourceResizeHandle,
|
|
3359
3655
|
onMouseDownMoveSelection: onMouseDownMoveSelection,
|
|
3360
3656
|
isDraggingMoveSelection: isDraggingMoveSelection,
|
|
3361
3657
|
onChangeActiveCell,
|
|
@@ -3388,6 +3684,12 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3388
3684
|
onCloseFillOptions: handleCloseFillOptions,
|
|
3389
3685
|
insertOptions,
|
|
3390
3686
|
onChooseInsertOption: handleChooseInsertOption,
|
|
3687
|
+
tableAutoExpansion,
|
|
3688
|
+
canStopAutoExpandingTables: !!onChangeAutoExpandTables,
|
|
3689
|
+
onChooseTableAutoExpansionOption: handleChooseTableAutoExpansionOption,
|
|
3690
|
+
calculatedColumnFill,
|
|
3691
|
+
canStopAutoCalculatedColumns: !!onChangeAutoCalculatedColumns,
|
|
3692
|
+
onChooseCalculatedColumnOption: handleChooseCalculatedColumnOption,
|
|
3391
3693
|
hoveredCell: delayedHoveredCell,
|
|
3392
3694
|
onRemoveQuickEdit,
|
|
3393
3695
|
onAddQuickEdit,
|
|
@@ -3422,6 +3724,10 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3422
3724
|
agentSuggestions,
|
|
3423
3725
|
quickEditValues,
|
|
3424
3726
|
});
|
|
3727
|
+
// A selected chart's source outlines draw on top of the other range borders.
|
|
3728
|
+
const gridBorderStyles = useMemo(() => chartSourceBorderStyles.length
|
|
3729
|
+
? [...finalBorderStyles, ...chartSourceBorderStyles]
|
|
3730
|
+
: finalBorderStyles, [finalBorderStyles, chartSourceBorderStyles]);
|
|
3425
3731
|
// Hidden column markers
|
|
3426
3732
|
const [hiddenColumnMarkers, frozenHiddenColumnMarkers, hiddenRowMarkers, frozenHiddenRowMarkers,] = useHiddenDimensionMarkers({
|
|
3427
3733
|
sheetId,
|
|
@@ -3549,6 +3855,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3549
3855
|
getNextFocusableCell,
|
|
3550
3856
|
onEditorKeyDown,
|
|
3551
3857
|
scrollToCell,
|
|
3858
|
+
scrollToChart,
|
|
3552
3859
|
scrollToBottom,
|
|
3553
3860
|
focusSheet,
|
|
3554
3861
|
canEditCell,
|
|
@@ -3692,7 +3999,7 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3692
3999
|
// Keep focus back on sheet
|
|
3693
4000
|
// Check if user is focused on the context menu
|
|
3694
4001
|
if (canUseDOM &&
|
|
3695
|
-
|
|
4002
|
+
getOwnerDocument(gridContainerRef.current)?.activeElement?.getAttribute("role") !== "menu") {
|
|
3696
4003
|
focusSheet();
|
|
3697
4004
|
}
|
|
3698
4005
|
}
|
|
@@ -3708,6 +4015,10 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3708
4015
|
scrollToCell,
|
|
3709
4016
|
commit,
|
|
3710
4017
|
openFillSeriesDialog: () => openFillSeriesDialogForRef.current?.(),
|
|
4018
|
+
copyChart,
|
|
4019
|
+
cutChart,
|
|
4020
|
+
pasteChart,
|
|
4021
|
+
duplicateChart,
|
|
3711
4022
|
};
|
|
3712
4023
|
setSpreadsheetApi(new SpreadsheetApi(propsReferenceRef, stableMethods, store, instanceStore, instanceId));
|
|
3713
4024
|
}, []);
|
|
@@ -3772,6 +4083,13 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3772
4083
|
* in formula mode
|
|
3773
4084
|
*/
|
|
3774
4085
|
const enableSelectionDrag = !isSelectionInProgress && !isEditInProgress && !formulaMode;
|
|
4086
|
+
// A chartsheet IS its chart: no grid, headers, editor or cell menus — only the chart and its
|
|
4087
|
+
// context menu (Excel).
|
|
4088
|
+
if (sheetType === "chartsheet") {
|
|
4089
|
+
return (React.createElement("div", { className: cn("rnc-canvas-wrapper after:box-border before:box-border [&_*]:box-border flex min-h-0 min-w-0 relative z-[1] flex-1 bg-rnc-background", className), ref: gridContainerRef, role: "application", "aria-label": "Chart sheet", ...rest },
|
|
4090
|
+
React.createElement(ChartSheetViewComponent, { sheetId: sheetId, chart: charts?.find((chart) => chart.position?.sheetId === sheetId), width: width, height: height, theme: theme, backgroundColor: cellBackgroundColor, readonly: readonly, getChartComponent: getChartComponent, onDeleteChart: onDeleteChart, onUpdateChart: onUpdateChart, onRequestContextMenu: requestChartContextMenu }),
|
|
4091
|
+
embedContextMenuComponent));
|
|
4092
|
+
}
|
|
3775
4093
|
return (React.createElement("div", { className: cn("rnc-canvas-wrapper after:box-border before:box-border [&_*]:box-border flex min-h-0 min-w-0 relative z-[1] flex-1 bg-rnc-background", className), ref: gridContainerRef,
|
|
3776
4094
|
// The grid paints to <canvas>, so there is no per-cell DOM for a screen
|
|
3777
4095
|
// reader to traverse. role="application" passes keystrokes through to our
|
|
@@ -3786,11 +4104,11 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3786
4104
|
// Bind to outer container, so it always takes
|
|
3787
4105
|
// priority over other components
|
|
3788
4106
|
// generated by hooks
|
|
3789
|
-
onMouseMove: mouseMoveThrottler, onWheel: onMouseWheel, ...rest },
|
|
4107
|
+
onMouseMove: mouseMoveThrottler, onWheel: onMouseWheel, ...rest, style: tableHitCursor ? { ...rest.style, cursor: tableHitCursor } : rest.style },
|
|
3790
4108
|
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" },
|
|
3791
4109
|
React.createElement("div", { className: "space-y-2" },
|
|
3792
4110
|
React.createElement(Skeleton, { className: "h-4 w-[250px]" }),
|
|
3793
|
-
React.createElement(Skeleton, { className: "h-4 w-[250px]" })))) : (React.createElement(BaseGrid, { ref: gridRef, overscanCount: overscanCount, rowCount: sheetRowCount, columnCount: sheetColumnCount, rowHeight: rowHeight, columnWidth: columnWidth, itemRenderer: cellRenderer, headerRenderer: headerCellRenderer, selectionRenderer: selectionRenderer, gridLineColor: gridLineColor, gridLineWidth: gridLineWidth, borderStyles:
|
|
4111
|
+
React.createElement(Skeleton, { className: "h-4 w-[250px]" })))) : (React.createElement(BaseGrid, { ref: gridRef, overscanCount: overscanCount, rowCount: sheetRowCount, columnCount: sheetColumnCount, rowHeight: rowHeight, columnWidth: columnWidth, itemRenderer: cellRenderer, headerRenderer: headerCellRenderer, selectionRenderer: selectionRenderer, gridLineColor: gridLineColor, gridLineWidth: gridLineWidth, borderStyles: gridBorderStyles, mergedCells: merges, scale: scale, width: width, height: height, frozenColumns: frozenColumns, frozenRows: frozenRows, activeCell: activeCell, selections: formulaMode ? formulaSelections : selections, FillHandle: FillHandle, showFillHandle: showFillHandle, fillHandleSize: fillHandleSize, showGridLines: showGridLines, enableCellOverlay: true, enableCellBackground: true, enableSelectionDrag: enableSelectionDrag, showFrozenColumnShadow: showFrozenSeparator, showFrozenRowShadow: showFrozenSeparator, selectionBorderColor: selectionBorderColor, selectionBackgroundColor: selectionBackgroundColor, fillhandleBorderColor: cellBackgroundColor, isDraggingSelection: isDragging, fillSelection: fillShrinkOverlay ?? fillSelection, onPointerDown: handlePointerDown, onPointerUp: handlePointerUp, onMouseDown: handleMouseDown, onDoubleClick: handleDoubleClick, onFillHandleMouseDown: onFillHandleMouseDown, onFillHandleDoubleClick: onFillHandleDoubleClick,
|
|
3794
4112
|
// Dimension of fill handle
|
|
3795
4113
|
scrollToCellOffset: 4, scrollbarSize: scrollbarSize, isHiddenCell: isHiddenCell, isHiddenColumn: isHiddenColumn, isHiddenRow: isHiddenRow, visibleRowRanges: visibleRowRanges, isHiddenOverlay: isHiddenOverlay, isHiddenBackground: isHiddenBackground, overlayRenderer: cellOverlayRenderer, backgroundRenderer: cellBackgroundRenderer, shadowSettings: shadowSettings, onScroll: handleScroll, onViewPortChange: handleViewPortChange, autoFocus: autoFocus, snap: scrollSnap, scrollThrottleTimeout: scrollThrottleTimeout, preventBrowserDefaultScroll: preventBrowserDefaultScroll, showHeaders: showHeaders, gridChildren: gridChildren, onTouchStart: onTouchStart, onDimensionsChange: onDimensionsChange, extendScrollSize: isTouchDevice || isFirefox, isTouchDevice: isTouchDevice, frozenShadowThickness: frozenShadowThickness, onAfterScrollToCell: onAfterScrollToCell, estimatedRowHeight: defaultRowHeight, estimatedColumnWidth: defaultColumnWidth, footerHeight: footerHeight, footerComponent: footerComponent, getOverflowBuffer: getOverflowBuffer, getFrozenColumnOverflowCells: getFrozenColumnOverflowCells })),
|
|
3796
4114
|
tooltipComponent,
|
|
@@ -3798,7 +4116,9 @@ function CanvasGridComponent(props, forwardedRef) {
|
|
|
3798
4116
|
draggableColumns,
|
|
3799
4117
|
draggableRows,
|
|
3800
4118
|
contextMenuComponent,
|
|
4119
|
+
embedContextMenuComponent,
|
|
3801
4120
|
filterComponent,
|
|
4121
|
+
totalsPickerComponent,
|
|
3802
4122
|
headerResizer,
|
|
3803
4123
|
validatorResult,
|
|
3804
4124
|
React.createElement("div", { "aria-live": "polite", "aria-atomic": "true", style: {
|