@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,10 +1,11 @@
|
|
|
1
1
|
import { findLastContentfulCell, isNull } from "@rowsncolumns/grid";
|
|
2
2
|
import { cellToArea } from "@rowsncolumns/grid";
|
|
3
|
-
import { useIsomorphicLayoutEffect } from "@rowsncolumns/grid";
|
|
3
|
+
import { getOwnerDocument, useIsomorphicLayoutEffect } from "@rowsncolumns/grid";
|
|
4
4
|
import { Align, cellIdentifier, cellRangeToBounds, clampCellCoords, clampIndex, Direction, findNextCellInDataRegion, findNextCellWithinBounds, getBoundedCells, isAreasEqual, isEqualCells, MouseButtonCodes, newSelectionFromDrag, selectionSpansCells, } from "@rowsncolumns/grid";
|
|
5
5
|
import { useCallback, useReducer, useRef, useState } from "react";
|
|
6
6
|
import { scheduleImmediatePriorityCallback, scheduleNormalPriorityCallback, } from "../api/scheduler";
|
|
7
7
|
import { MOVE_OVERWRITE_PROMPT, needsOverwritePrompt } from "../api/move-overwrite";
|
|
8
|
+
import { findActiveTableWithinCell, getNextCellInTable, getTableColumnSelectRange, getTableRowSelectRange, getTableSelectAllRange, } from "../api/table";
|
|
8
9
|
import { DEFAULT_ARRAY } from "../config";
|
|
9
10
|
import { isMac } from "../helpers";
|
|
10
11
|
import { useCallbackRef } from "./use-callback-ref";
|
|
@@ -85,7 +86,7 @@ const fillShrinkFor = (selection, coords) => {
|
|
|
85
86
|
const defaultConfirmMoveOverwrite = (message) => typeof window === "undefined" || typeof window.confirm !== "function"
|
|
86
87
|
? true
|
|
87
88
|
: window.confirm(message);
|
|
88
|
-
export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount = 0, rowCount = 0, selectionPolicy = "multiple", newSelectionMode = "clear", allowDeselectSelection = true, onFill, onFillHandleRelease, onFillShrink, onInsertCutCells, confirmMoveOverwrite = defaultConfirmMoveOverwrite, isHiddenRow = defaultIsHidden, isHiddenColumn = defaultIsHidden, alwaysScrollToActiveCell = true, selectionTopBound = 0, selectionBottomBound = rowCount, selectionLeftBound = 0, selectionRightBound = columnCount, mouseDownInterceptor, mouseMoveInterceptor, mergedCells = DEFAULT_ARRAY, canSelectionSpanMergedCells = defaultSelectionSpan, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, isRowHeader, isColumnHeader, enableDataBoundaryNavigation = false, }) => {
|
|
89
|
+
export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selections, onChangeSelections, columnCount = 0, rowCount = 0, selectionPolicy = "multiple", newSelectionMode = "clear", allowDeselectSelection = true, onFill, onFillHandleRelease, onFillShrink, onInsertCutCells, confirmMoveOverwrite = defaultConfirmMoveOverwrite, isHiddenRow = defaultIsHidden, isHiddenColumn = defaultIsHidden, alwaysScrollToActiveCell = true, selectionTopBound = 0, selectionBottomBound = rowCount, selectionLeftBound = 0, selectionRightBound = columnCount, mouseDownInterceptor, mouseMoveInterceptor, mergedCells = DEFAULT_ARRAY, canSelectionSpanMergedCells = defaultSelectionSpan, getValue, onMoveSelection, getCellCoordsFromOffset, getCellBounds, getViewPort, focus, scrollToCell, isMergedCell, enableSelectOnEnterKey, formulaMode, isTouchDevice, getDataRowCount, isRowHeader, isColumnHeader, enableDataBoundaryNavigation = false, tables, onInsertTableRow, }) => {
|
|
89
90
|
const [fillSelection, setFillSelection] = useState();
|
|
90
91
|
const [fillShrink, setFillShrink] = useState();
|
|
91
92
|
const fillShrinkRef = useRef(undefined);
|
|
@@ -105,24 +106,35 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
105
106
|
* release always fires `contextmenu`; neither may reach the grid's cell
|
|
106
107
|
* context menu while the user is dragging the fill handle.
|
|
107
108
|
*/
|
|
109
|
+
/**
|
|
110
|
+
* Documents the in-flight gestures listen on. The grid may render into a
|
|
111
|
+
* popout window, whose document is not the bundle's global `document`; a
|
|
112
|
+
* gesture binds its move/up listeners to the document of the element it
|
|
113
|
+
* started on and unbinds from that same document.
|
|
114
|
+
*/
|
|
115
|
+
const selectionDocumentRef = useRef(null);
|
|
116
|
+
const fillDocumentRef = useRef(null);
|
|
117
|
+
const dragSelectionDocumentRef = useRef(null);
|
|
118
|
+
const tapDocumentRef = useRef(null);
|
|
108
119
|
const contextMenuSuppressorRef = useRef(null);
|
|
109
120
|
const releaseContextMenuSuppressor = useCallback(() => {
|
|
110
|
-
const
|
|
111
|
-
if (!
|
|
121
|
+
const suppressor = contextMenuSuppressorRef.current;
|
|
122
|
+
if (!suppressor)
|
|
112
123
|
return;
|
|
113
124
|
contextMenuSuppressorRef.current = null;
|
|
114
|
-
|
|
125
|
+
suppressor.ownerDocument.removeEventListener("contextmenu", suppressor.handler, true);
|
|
115
126
|
}, []);
|
|
116
127
|
const suppressNextContextMenu = useCallback(() => {
|
|
117
128
|
if (contextMenuSuppressorRef.current)
|
|
118
129
|
return;
|
|
130
|
+
const ownerDocument = fillDocumentRef.current ?? document;
|
|
119
131
|
const handler = (e) => {
|
|
120
132
|
e.preventDefault();
|
|
121
133
|
e.stopPropagation();
|
|
122
134
|
releaseContextMenuSuppressor();
|
|
123
135
|
};
|
|
124
|
-
contextMenuSuppressorRef.current = handler;
|
|
125
|
-
|
|
136
|
+
contextMenuSuppressorRef.current = { handler, ownerDocument };
|
|
137
|
+
ownerDocument.addEventListener("contextmenu", handler, true);
|
|
126
138
|
}, [releaseContextMenuSuppressor]);
|
|
127
139
|
const selectionsRef = useRef([]);
|
|
128
140
|
const fillSelectionRef = useRef(undefined);
|
|
@@ -349,9 +361,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
349
361
|
const handleMouseUp = useCallback(() => {
|
|
350
362
|
/* Reset selection mode */
|
|
351
363
|
isSelecting.current = false;
|
|
352
|
-
/* Remove listener */
|
|
353
|
-
|
|
354
|
-
|
|
364
|
+
/* Remove listener from the document the gesture started on */
|
|
365
|
+
const ownerDocument = selectionDocumentRef.current ?? document;
|
|
366
|
+
selectionDocumentRef.current = null;
|
|
367
|
+
ownerDocument.removeEventListener("mousemove", handleMouseMove);
|
|
368
|
+
ownerDocument.removeEventListener("mouseup", handleMouseUp);
|
|
355
369
|
/* Update last selection */
|
|
356
370
|
const curSelections = selectionsRef.current;
|
|
357
371
|
const len = curSelections.length;
|
|
@@ -572,12 +586,62 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
572
586
|
selectionLeftBound,
|
|
573
587
|
selectionRightBound,
|
|
574
588
|
]);
|
|
589
|
+
// Select all
|
|
590
|
+
const selectAll = useCallback(() => {
|
|
591
|
+
selectionStart.current = {
|
|
592
|
+
rowIndex: selectionTopBound,
|
|
593
|
+
columnIndex: selectionLeftBound,
|
|
594
|
+
};
|
|
595
|
+
modifySelection({
|
|
596
|
+
rowIndex: selectionBottomBound,
|
|
597
|
+
columnIndex: selectionRightBound,
|
|
598
|
+
});
|
|
599
|
+
}, [
|
|
600
|
+
selectionTopBound,
|
|
601
|
+
selectionLeftBound,
|
|
602
|
+
selectionRightBound,
|
|
603
|
+
selectionBottomBound,
|
|
604
|
+
modifySelection,
|
|
605
|
+
]);
|
|
606
|
+
/**
|
|
607
|
+
* Inside a table Ctrl+A / Ctrl+Space / Shift+Space walk Excel's table
|
|
608
|
+
* cycle before falling back to the sheet-wide behaviour. Applies `range`
|
|
609
|
+
* (keeping the active cell) and reports whether a table handled the key;
|
|
610
|
+
* a `null` cycle step means "the sheet-wide step" and returns false.
|
|
611
|
+
*/
|
|
612
|
+
const currentSingleArea = () => selections.length === 1 ? selections[0].range : undefined;
|
|
613
|
+
const applyTableRange = useCallback((range) => {
|
|
614
|
+
if (!range) {
|
|
615
|
+
return false;
|
|
616
|
+
}
|
|
617
|
+
selectionStart.current = {
|
|
618
|
+
rowIndex: range.startRowIndex,
|
|
619
|
+
columnIndex: range.startColumnIndex,
|
|
620
|
+
};
|
|
621
|
+
modifySelection({
|
|
622
|
+
rowIndex: range.endRowIndex,
|
|
623
|
+
columnIndex: range.endColumnIndex,
|
|
624
|
+
});
|
|
625
|
+
return true;
|
|
626
|
+
}, [modifySelection]);
|
|
627
|
+
const activeTable = activeCell
|
|
628
|
+
? findActiveTableWithinCell(sheetId, activeCell, tables)
|
|
629
|
+
: undefined;
|
|
575
630
|
// ⌘A or ⌘+Shift+Space
|
|
576
631
|
// Select all cells in bounding area
|
|
577
632
|
const selectAllBoundedCells = useCallback(() => {
|
|
578
633
|
if (!selectionEnd.current || !selectionStart.current) {
|
|
579
634
|
return;
|
|
580
635
|
}
|
|
636
|
+
if (activeTable) {
|
|
637
|
+
const step = getTableSelectAllRange(activeTable, currentSingleArea());
|
|
638
|
+
if (step === null) {
|
|
639
|
+
selectAll();
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
applyTableRange(step);
|
|
643
|
+
return;
|
|
644
|
+
}
|
|
581
645
|
let topBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Up);
|
|
582
646
|
let bottomBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Down);
|
|
583
647
|
let leftBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Left);
|
|
@@ -608,30 +672,44 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
608
672
|
selectionTopBound,
|
|
609
673
|
selectionLeftBound,
|
|
610
674
|
selectionRightBound,
|
|
675
|
+
activeTable,
|
|
676
|
+
selections,
|
|
677
|
+
applyTableRange,
|
|
678
|
+
selectAll,
|
|
611
679
|
]);
|
|
612
|
-
// Select
|
|
613
|
-
const
|
|
680
|
+
// Select entire column
|
|
681
|
+
const selectEntireColumn = useCallback((columnIndex) => {
|
|
682
|
+
if (!selectionEnd.current ||
|
|
683
|
+
!selectionStart.current ||
|
|
684
|
+
columnIndex === void 0)
|
|
685
|
+
return;
|
|
614
686
|
selectionStart.current = {
|
|
687
|
+
...selectionStart.current,
|
|
615
688
|
rowIndex: selectionTopBound,
|
|
616
|
-
columnIndex: selectionLeftBound,
|
|
617
689
|
};
|
|
618
690
|
modifySelection({
|
|
691
|
+
...selectionEnd.current,
|
|
619
692
|
rowIndex: selectionBottomBound,
|
|
620
|
-
columnIndex: selectionRightBound,
|
|
621
693
|
});
|
|
622
|
-
}, [
|
|
623
|
-
selectionTopBound,
|
|
624
|
-
selectionLeftBound,
|
|
625
|
-
selectionRightBound,
|
|
626
|
-
selectionBottomBound,
|
|
627
|
-
modifySelection,
|
|
628
|
-
]);
|
|
694
|
+
}, [modifySelection, selectionBottomBound, selectionTopBound]);
|
|
629
695
|
// Ctrl+Space
|
|
630
696
|
const selectColumn = useCallback((columnIndex) => {
|
|
631
697
|
if (!selectionEnd.current ||
|
|
632
698
|
!selectionStart.current ||
|
|
633
699
|
columnIndex === void 0)
|
|
634
700
|
return;
|
|
701
|
+
if (activeTable) {
|
|
702
|
+
const step = getTableColumnSelectRange(activeTable, {
|
|
703
|
+
start: selectionStart.current.columnIndex,
|
|
704
|
+
end: selectionEnd.current.columnIndex,
|
|
705
|
+
}, currentSingleArea());
|
|
706
|
+
if (step === null) {
|
|
707
|
+
selectEntireColumn(columnIndex);
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
applyTableRange(step);
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
635
713
|
let topBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Up);
|
|
636
714
|
let bottomBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Down);
|
|
637
715
|
const isSameVerticalBounds = topBound === bottomBound;
|
|
@@ -653,22 +731,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
653
731
|
sheetId,
|
|
654
732
|
selectionTopBound,
|
|
655
733
|
selectionBottomBound,
|
|
734
|
+
activeTable,
|
|
735
|
+
selections,
|
|
736
|
+
applyTableRange,
|
|
737
|
+
selectEntireColumn,
|
|
656
738
|
]);
|
|
657
|
-
// Select entire column
|
|
658
|
-
const selectEntireColumn = useCallback((columnIndex) => {
|
|
659
|
-
if (!selectionEnd.current ||
|
|
660
|
-
!selectionStart.current ||
|
|
661
|
-
columnIndex === void 0)
|
|
662
|
-
return;
|
|
663
|
-
selectionStart.current = {
|
|
664
|
-
...selectionStart.current,
|
|
665
|
-
rowIndex: selectionTopBound,
|
|
666
|
-
};
|
|
667
|
-
modifySelection({
|
|
668
|
-
...selectionEnd.current,
|
|
669
|
-
rowIndex: selectionBottomBound,
|
|
670
|
-
});
|
|
671
|
-
}, [modifySelection, selectionBottomBound, selectionTopBound]);
|
|
672
739
|
// Shift+Space
|
|
673
740
|
const selectRow = useCallback((rowIndex) => {
|
|
674
741
|
if (!selectionEnd.current ||
|
|
@@ -676,6 +743,25 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
676
743
|
rowIndex === void 0) {
|
|
677
744
|
return;
|
|
678
745
|
}
|
|
746
|
+
if (activeTable) {
|
|
747
|
+
const step = getTableRowSelectRange(activeTable, {
|
|
748
|
+
start: selectionStart.current.rowIndex,
|
|
749
|
+
end: selectionEnd.current.rowIndex,
|
|
750
|
+
}, currentSingleArea());
|
|
751
|
+
if (step !== null) {
|
|
752
|
+
applyTableRange(step);
|
|
753
|
+
return;
|
|
754
|
+
}
|
|
755
|
+
selectionStart.current = {
|
|
756
|
+
...selectionStart.current,
|
|
757
|
+
columnIndex: selectionLeftBound,
|
|
758
|
+
};
|
|
759
|
+
modifySelection({
|
|
760
|
+
...selectionEnd.current,
|
|
761
|
+
columnIndex: selectionRightBound,
|
|
762
|
+
});
|
|
763
|
+
return;
|
|
764
|
+
}
|
|
679
765
|
let leftBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Left);
|
|
680
766
|
let rightBound = findLastContentfulCellInDirection(sheetId, selectionStart.current, selectionEnd.current, Direction.Right);
|
|
681
767
|
const isSameHorizontalBounds = leftBound === rightBound;
|
|
@@ -695,6 +781,9 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
695
781
|
findLastContentfulCellInDirection,
|
|
696
782
|
modifySelection,
|
|
697
783
|
sheetId,
|
|
784
|
+
activeTable,
|
|
785
|
+
selections,
|
|
786
|
+
applyTableRange,
|
|
698
787
|
selectionRightBound,
|
|
699
788
|
selectionLeftBound,
|
|
700
789
|
]);
|
|
@@ -881,8 +970,10 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
881
970
|
const hasSelections = selectionsRef.current.length > 0;
|
|
882
971
|
const isDeselecting = isMetaKey && allowDeselect;
|
|
883
972
|
if (!isContextMenuClick && selectionPolicy !== "single") {
|
|
884
|
-
|
|
885
|
-
|
|
973
|
+
const ownerDocument = getOwnerDocument(e.currentTarget ?? e.target) ?? document;
|
|
974
|
+
selectionDocumentRef.current = ownerDocument;
|
|
975
|
+
ownerDocument.addEventListener("mouseup", handleMouseUp);
|
|
976
|
+
ownerDocument.addEventListener("mousemove", handleMouseMove);
|
|
886
977
|
}
|
|
887
978
|
/* Activate selection mode */
|
|
888
979
|
// Disable flag for context menu
|
|
@@ -1096,11 +1187,22 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1096
1187
|
}
|
|
1097
1188
|
}
|
|
1098
1189
|
else {
|
|
1099
|
-
|
|
1100
|
-
|
|
1190
|
+
const direction = isShiftKey ? Direction.Left : Direction.Right;
|
|
1191
|
+
const table = activeCell
|
|
1192
|
+
? findActiveTableWithinCell(sheetId, activeCell, tables)
|
|
1193
|
+
: undefined;
|
|
1194
|
+
const tableTarget = table
|
|
1195
|
+
? getNextCellInTable(table, activeCell, direction, isHiddenRow, isHiddenColumn)
|
|
1196
|
+
: null;
|
|
1197
|
+
if (table && tableTarget) {
|
|
1198
|
+
if (tableTarget.insertRow) {
|
|
1199
|
+
onInsertTableRow?.(table);
|
|
1200
|
+
}
|
|
1201
|
+
newSelection(tableTarget.cell);
|
|
1202
|
+
scrollToCell(tableTarget.cell);
|
|
1101
1203
|
}
|
|
1102
1204
|
else {
|
|
1103
|
-
keyNavigate(
|
|
1205
|
+
keyNavigate(direction);
|
|
1104
1206
|
}
|
|
1105
1207
|
}
|
|
1106
1208
|
e.preventDefault();
|
|
@@ -1147,6 +1249,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1147
1249
|
selectFirstCellInSheet,
|
|
1148
1250
|
selectLastCellInSheet,
|
|
1149
1251
|
enableSelectOnEnterKey,
|
|
1252
|
+
newSelection,
|
|
1253
|
+
isHiddenRow,
|
|
1254
|
+
isHiddenColumn,
|
|
1255
|
+
tables,
|
|
1256
|
+
onInsertTableRow,
|
|
1150
1257
|
]);
|
|
1151
1258
|
/**
|
|
1152
1259
|
* TODO
|
|
@@ -1245,9 +1352,10 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1245
1352
|
isFilling.current = false;
|
|
1246
1353
|
const toggle = isFillToggleModifier(e);
|
|
1247
1354
|
const button = fillButtonRef.current;
|
|
1248
|
-
/* Remove listener */
|
|
1249
|
-
|
|
1250
|
-
|
|
1355
|
+
/* Remove listener from the document the gesture started on */
|
|
1356
|
+
const ownerDocument = fillDocumentRef.current ?? document;
|
|
1357
|
+
ownerDocument.removeEventListener("mousemove", handleFillMouseMove);
|
|
1358
|
+
ownerDocument.removeEventListener("mouseup", handleFillMouseUp);
|
|
1251
1359
|
// The right-button (or macOS Ctrl+click) `contextmenu` event follows this
|
|
1252
1360
|
// mouseup; keep swallowing it for one tick, then drop the suppressor so a
|
|
1253
1361
|
// later, unrelated right-click still opens the cell context menu.
|
|
@@ -1341,6 +1449,8 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1341
1449
|
const handleFillMouseDown = useCallback((e) => {
|
|
1342
1450
|
e.stopPropagation();
|
|
1343
1451
|
e.preventDefault();
|
|
1452
|
+
const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
|
|
1453
|
+
fillDocumentRef.current = ownerDocument;
|
|
1344
1454
|
const isRightButton = e.button === MouseButtonCodes.right;
|
|
1345
1455
|
fillButtonRef.current = isRightButton ? "right" : "left";
|
|
1346
1456
|
// Ctrl+drag on the handle must never become the macOS Ctrl+click
|
|
@@ -1350,8 +1460,8 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1350
1460
|
suppressNextContextMenu();
|
|
1351
1461
|
}
|
|
1352
1462
|
isFilling.current = true;
|
|
1353
|
-
|
|
1354
|
-
|
|
1463
|
+
ownerDocument.addEventListener("mousemove", handleFillMouseMove);
|
|
1464
|
+
ownerDocument.addEventListener("mouseup", handleFillMouseUp);
|
|
1355
1465
|
}, [handleFillMouseMove, handleFillMouseUp, suppressNextContextMenu]);
|
|
1356
1466
|
/**
|
|
1357
1467
|
* Remove the last selection from state
|
|
@@ -1478,9 +1588,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1478
1588
|
draggedSelection.current = void 0;
|
|
1479
1589
|
draggedSelectionIndex.current = void 0;
|
|
1480
1590
|
hasUserMovedSelection.current = false;
|
|
1481
|
-
/* Remove event handlers */
|
|
1482
|
-
|
|
1483
|
-
|
|
1591
|
+
/* Remove event handlers from the document the gesture started on */
|
|
1592
|
+
const ownerDocument = dragSelectionDocumentRef.current ?? document;
|
|
1593
|
+
dragSelectionDocumentRef.current = null;
|
|
1594
|
+
ownerDocument.removeEventListener("mouseup", handleSelectionMouseUp);
|
|
1595
|
+
ownerDocument.removeEventListener("mousemove", handleSelectionMouseMove);
|
|
1484
1596
|
/* Force render */
|
|
1485
1597
|
forceRender();
|
|
1486
1598
|
}, [
|
|
@@ -1528,9 +1640,11 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1528
1640
|
}
|
|
1529
1641
|
/* Set dragging flag */
|
|
1530
1642
|
isDragging.current = true;
|
|
1531
|
-
/* Listen
|
|
1532
|
-
|
|
1533
|
-
|
|
1643
|
+
/* Listen on the document the gesture started on */
|
|
1644
|
+
const ownerDocument = getOwnerDocument(e.currentTarget) ?? document;
|
|
1645
|
+
dragSelectionDocumentRef.current = ownerDocument;
|
|
1646
|
+
ownerDocument.addEventListener("mouseup", handleSelectionMouseUp);
|
|
1647
|
+
ownerDocument.addEventListener("mousemove", handleSelectionMouseMove);
|
|
1534
1648
|
/* Force a re-render */
|
|
1535
1649
|
forceRender();
|
|
1536
1650
|
}, [
|
|
@@ -1619,12 +1733,16 @@ export const useSelection = ({ sheetId, activeCell, onChangeActiveCell, selectio
|
|
|
1619
1733
|
handleMouseDown(event);
|
|
1620
1734
|
handleMouseUp();
|
|
1621
1735
|
}
|
|
1622
|
-
|
|
1736
|
+
const ownerDocument = tapDocumentRef.current ?? document;
|
|
1737
|
+
tapDocumentRef.current = null;
|
|
1738
|
+
ownerDocument.removeEventListener("pointerup", onPointerUp);
|
|
1623
1739
|
}, [handleMouseDown, handleMouseUp]);
|
|
1624
1740
|
const onPointerDown = useCallback((event) => {
|
|
1625
1741
|
startTimeRef.current = Date.now();
|
|
1626
1742
|
startPosRef.current = { x: event.clientX, y: event.clientY };
|
|
1627
|
-
|
|
1743
|
+
const ownerDocument = getOwnerDocument(event.currentTarget) ?? document;
|
|
1744
|
+
tapDocumentRef.current = ownerDocument;
|
|
1745
|
+
ownerDocument.addEventListener("pointerup", onPointerUp);
|
|
1628
1746
|
}, [onPointerUp]);
|
|
1629
1747
|
// Add a ref. makeEditable renders way too often
|
|
1630
1748
|
const handleKeyDownRef = useCallbackRef(handleKeyDown);
|
|
@@ -11,12 +11,12 @@ export declare const useOnStructuredReferenceSelection: ({ tables, getSheetName,
|
|
|
11
11
|
endColumnIndex: number;
|
|
12
12
|
startRowIndex: number;
|
|
13
13
|
endRowIndex: number;
|
|
14
|
-
sheetId: number;
|
|
15
14
|
} | {
|
|
16
15
|
startColumnIndex: number;
|
|
17
16
|
endColumnIndex: number;
|
|
18
17
|
startRowIndex: number;
|
|
19
18
|
endRowIndex: number;
|
|
19
|
+
sheetId: number;
|
|
20
20
|
};
|
|
21
21
|
sheetName: string | undefined;
|
|
22
22
|
} | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-structured-reference-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-structured-reference-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,iCAAiC,GAAI,2BAG/C;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;CAC/C,eAGc,MAAM,QACT,aAAa,GAAG,SAAS,aACpB,MAAM,GAAG,SAAS,eAChB,MAAM,EAAE,GAAG,SAAS,WACxB,OAAO,GAAG,SAAS,gBACd,WAAW,CAAC,aAAa,CAAC;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"use-structured-reference-selection.d.ts","sourceRoot":"","sources":["../../../hooks/use-structured-reference-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,iCAAiC,GAAI,2BAG/C;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;CAC/C,eAGc,MAAM,QACT,aAAa,GAAG,SAAS,aACpB,MAAM,GAAG,SAAS,eAChB,MAAM,EAAE,GAAG,SAAS,WACxB,OAAO,GAAG,SAAS,gBACd,WAAW,CAAC,aAAa,CAAC;;;;;;;;;;;;;;aA8I7C,CAAC"}
|
|
@@ -51,6 +51,22 @@ export const useOnStructuredReferenceSelection = ({ tables, getSheetName, }) =>
|
|
|
51
51
|
sheetName,
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
+
// Totals row only (the table's last row); nothing to highlight while it is off.
|
|
55
|
+
if (specialItem === "#Totals") {
|
|
56
|
+
if (!totalRow) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
range: {
|
|
61
|
+
...range,
|
|
62
|
+
startColumnIndex,
|
|
63
|
+
endColumnIndex,
|
|
64
|
+
startRowIndex: range.endRowIndex,
|
|
65
|
+
endRowIndex: range.endRowIndex,
|
|
66
|
+
},
|
|
67
|
+
sheetName,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
54
70
|
// All
|
|
55
71
|
if (specialItem === "#All") {
|
|
56
72
|
return {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { CellInterface, CellPosition, GridRange, PosXYRequired, ScrollCoords, SelectionArea } from "@rowsncolumns/grid";
|
|
2
|
+
import type React from "react";
|
|
3
|
+
import type { CanvasGridProps } from "../components/canvas-grid/typings";
|
|
4
|
+
import type { TableView } from "../types";
|
|
5
|
+
/** Width of the edge bands (px, in grid coordinates) that count as a table hit zone. */
|
|
6
|
+
export declare const TABLE_HIT_BAND = 4;
|
|
7
|
+
export type TableHitZone = {
|
|
8
|
+
/**
|
|
9
|
+
* `column`: the top edge of a header cell (selects the column data, then
|
|
10
|
+
* the entire table column). `corner`: the header's top-left corner (selects
|
|
11
|
+
* the data body, then the whole table). `row`: the left edge of the first
|
|
12
|
+
* column (selects the table row).
|
|
13
|
+
*/
|
|
14
|
+
kind: "column" | "corner" | "row";
|
|
15
|
+
table: TableView;
|
|
16
|
+
cell: CellInterface;
|
|
17
|
+
};
|
|
18
|
+
/** Excel's black selection arrows: down on a header edge, right on a row edge, diagonal on the corner. */
|
|
19
|
+
export declare const TABLE_HIT_CURSORS: Record<TableHitZone["kind"], string>;
|
|
20
|
+
/**
|
|
21
|
+
* Classify a pointer position inside `cell` against the table it belongs to.
|
|
22
|
+
* `offset` is the pointer's position relative to the cell's top-left corner.
|
|
23
|
+
*/
|
|
24
|
+
export declare const getTableHitZone: (table: TableView | undefined, cell: CellInterface, offset: {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
}, band?: number) => TableHitZone | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* The range a click on `zone` selects, given the single selected area (if
|
|
30
|
+
* any): a header edge selects the column data first and the entire table
|
|
31
|
+
* column on the next click; the corner toggles data body ↔ whole table; a row
|
|
32
|
+
* edge selects the table row.
|
|
33
|
+
*/
|
|
34
|
+
export declare const getTableHitZoneRange: (zone: TableHitZone, current: GridRange | undefined) => GridRange;
|
|
35
|
+
export type UseTableHitZonesOptions = {
|
|
36
|
+
sheetId: number;
|
|
37
|
+
tables: CanvasGridProps["tables"];
|
|
38
|
+
selections: SelectionArea[];
|
|
39
|
+
frozenRows: number;
|
|
40
|
+
frozenColumns: number;
|
|
41
|
+
getCellCoordsFromOffset: (x: number, y: number) => CellInterface | undefined;
|
|
42
|
+
getRelativePositionFromOffset: (x: number, y: number) => PosXYRequired | null | undefined;
|
|
43
|
+
getCellOffsetFromCoords: (cell: CellInterface) => CellPosition | undefined;
|
|
44
|
+
getScrollPosition: () => ScrollCoords | undefined;
|
|
45
|
+
/** Replaces the selection with `range`, active cell at its top-left. */
|
|
46
|
+
onSelectRange: (sheetId: number, range: GridRange) => void;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Excel's table hit zones: hovering the top edge of a header cell, the
|
|
50
|
+
* header's top-left corner or the left edge of a row shows the black
|
|
51
|
+
* selection arrow; a click there selects the table column data / body / row
|
|
52
|
+
* instead of starting a cell selection.
|
|
53
|
+
*/
|
|
54
|
+
export declare const useTableHitZones: ({ sheetId, tables, selections, frozenRows, frozenColumns, getCellCoordsFromOffset, getRelativePositionFromOffset, getCellOffsetFromCoords, getScrollPosition, onSelectRange, }: UseTableHitZonesOptions) => {
|
|
55
|
+
hitZone: TableHitZone | undefined;
|
|
56
|
+
cursor: string | undefined;
|
|
57
|
+
onMouseMove: (e: React.MouseEvent<HTMLElement>) => void;
|
|
58
|
+
onMouseDown: (e: React.MouseEvent<HTMLElement>) => boolean;
|
|
59
|
+
clearHitZone: () => void;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=use-table-hit-zones.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-table-hit-zones.d.ts","sourceRoot":"","sources":["../../../hooks/use-table-hit-zones.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,aAAa,EACb,YAAY,EACZ,aAAa,EACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,wFAAwF;AACxF,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;OAKG;IACH,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAOF,0GAA0G;AAC1G,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,CAIlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,SAAS,GAAG,SAAS,EAC5B,MAAM,aAAa,EACnB,QAAQ;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAChC,aAAqB,KACpB,YAAY,GAAG,SA0BjB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,YAAY,EAClB,SAAS,SAAS,GAAG,SAAS,KAC7B,SA+BF,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IAC7E,6BAA6B,EAAE,CAC7B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,KACN,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,uBAAuB,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,YAAY,GAAG,SAAS,CAAC;IAC3E,iBAAiB,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;IAClD,wEAAwE;IACxE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,gLAW9B,uBAAuB;;;qBAyClB,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;qBAqB7B,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;;CA4BpC,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { useCallback, useState } from "react";
|
|
2
|
+
import { findActiveTableWithinCell, getTableBodyRange, getTableColumnSelectRange, getTableRowSelectRange, } from "../api/table";
|
|
3
|
+
/** Width of the edge bands (px, in grid coordinates) that count as a table hit zone. */
|
|
4
|
+
export const TABLE_HIT_BAND = 4;
|
|
5
|
+
const arrowCursor = (rotate, fallback) => `url("data:image/svg+xml;utf8,${encodeURIComponent(`<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><g transform='rotate(${rotate} 8 8)'><path d='M8 1v10.5M4 8l4 4 4-4' fill='none' stroke='#fff' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'/><path d='M8 1v10.5M4 8l4 4 4-4' fill='none' stroke='#000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></g></svg>`)}") 8 8, ${fallback}`;
|
|
6
|
+
/** Excel's black selection arrows: down on a header edge, right on a row edge, diagonal on the corner. */
|
|
7
|
+
export const TABLE_HIT_CURSORS = {
|
|
8
|
+
column: arrowCursor(0, "default"),
|
|
9
|
+
row: arrowCursor(-90, "default"),
|
|
10
|
+
corner: arrowCursor(-45, "default"),
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Classify a pointer position inside `cell` against the table it belongs to.
|
|
14
|
+
* `offset` is the pointer's position relative to the cell's top-left corner.
|
|
15
|
+
*/
|
|
16
|
+
export const getTableHitZone = (table, cell, offset, band = TABLE_HIT_BAND) => {
|
|
17
|
+
if (!table) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const { range } = table;
|
|
21
|
+
const isFirstRow = cell.rowIndex === range.startRowIndex;
|
|
22
|
+
const isFirstColumn = cell.columnIndex === range.startColumnIndex;
|
|
23
|
+
const nearTop = offset.y >= 0 && offset.y < band;
|
|
24
|
+
const nearLeft = offset.x >= 0 && offset.x < band;
|
|
25
|
+
if (isFirstRow &&
|
|
26
|
+
isFirstColumn &&
|
|
27
|
+
offset.x >= 0 &&
|
|
28
|
+
offset.y >= 0 &&
|
|
29
|
+
offset.x < band * 2 &&
|
|
30
|
+
offset.y < band * 2) {
|
|
31
|
+
return { kind: "corner", table, cell };
|
|
32
|
+
}
|
|
33
|
+
if (isFirstRow && nearTop) {
|
|
34
|
+
return { kind: "column", table, cell };
|
|
35
|
+
}
|
|
36
|
+
if (isFirstColumn && nearLeft) {
|
|
37
|
+
return { kind: "row", table, cell };
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* The range a click on `zone` selects, given the single selected area (if
|
|
43
|
+
* any): a header edge selects the column data first and the entire table
|
|
44
|
+
* column on the next click; the corner toggles data body ↔ whole table; a row
|
|
45
|
+
* edge selects the table row.
|
|
46
|
+
*/
|
|
47
|
+
export const getTableHitZoneRange = (zone, current) => {
|
|
48
|
+
const { table, cell } = zone;
|
|
49
|
+
const columns = { start: cell.columnIndex, end: cell.columnIndex };
|
|
50
|
+
switch (zone.kind) {
|
|
51
|
+
case "column":
|
|
52
|
+
return (getTableColumnSelectRange(table, columns, current) ?? {
|
|
53
|
+
...table.range,
|
|
54
|
+
startColumnIndex: cell.columnIndex,
|
|
55
|
+
endColumnIndex: cell.columnIndex,
|
|
56
|
+
});
|
|
57
|
+
case "corner": {
|
|
58
|
+
const body = getTableBodyRange(table);
|
|
59
|
+
const isBody = !!current &&
|
|
60
|
+
current.startRowIndex === body.startRowIndex &&
|
|
61
|
+
current.endRowIndex === body.endRowIndex &&
|
|
62
|
+
current.startColumnIndex === body.startColumnIndex &&
|
|
63
|
+
current.endColumnIndex === body.endColumnIndex;
|
|
64
|
+
return isBody ? { ...table.range } : body;
|
|
65
|
+
}
|
|
66
|
+
case "row":
|
|
67
|
+
return (getTableRowSelectRange(table, { start: cell.rowIndex, end: cell.rowIndex }, undefined) ?? { ...table.range });
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Excel's table hit zones: hovering the top edge of a header cell, the
|
|
72
|
+
* header's top-left corner or the left edge of a row shows the black
|
|
73
|
+
* selection arrow; a click there selects the table column data / body / row
|
|
74
|
+
* instead of starting a cell selection.
|
|
75
|
+
*/
|
|
76
|
+
export const useTableHitZones = ({ sheetId, tables, selections, frozenRows, frozenColumns, getCellCoordsFromOffset, getRelativePositionFromOffset, getCellOffsetFromCoords, getScrollPosition, onSelectRange, }) => {
|
|
77
|
+
const [hitZone, setHitZone] = useState();
|
|
78
|
+
const hitZoneAt = useCallback((clientX, clientY) => {
|
|
79
|
+
const cell = getCellCoordsFromOffset(clientX, clientY);
|
|
80
|
+
if (!cell) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
const table = findActiveTableWithinCell(sheetId, cell, tables);
|
|
84
|
+
if (!table) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
const position = getRelativePositionFromOffset(clientX, clientY);
|
|
88
|
+
const cellPosition = getCellOffsetFromCoords(cell);
|
|
89
|
+
if (!position || !cellPosition) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const { scrollLeft = 0, scrollTop = 0 } = getScrollPosition() ?? {};
|
|
93
|
+
// Frozen rows / columns do not scroll.
|
|
94
|
+
const x = position.x +
|
|
95
|
+
(cell.columnIndex < frozenColumns ? 0 : scrollLeft) -
|
|
96
|
+
cellPosition.x;
|
|
97
|
+
const y = position.y + (cell.rowIndex < frozenRows ? 0 : scrollTop) - cellPosition.y;
|
|
98
|
+
return getTableHitZone(table, cell, { x, y });
|
|
99
|
+
}, [
|
|
100
|
+
sheetId,
|
|
101
|
+
tables,
|
|
102
|
+
frozenRows,
|
|
103
|
+
frozenColumns,
|
|
104
|
+
getCellCoordsFromOffset,
|
|
105
|
+
getRelativePositionFromOffset,
|
|
106
|
+
getCellOffsetFromCoords,
|
|
107
|
+
getScrollPosition,
|
|
108
|
+
]);
|
|
109
|
+
const onMouseMove = useCallback((e) => {
|
|
110
|
+
const next = tables?.length ? hitZoneAt(e.clientX, e.clientY) : undefined;
|
|
111
|
+
setHitZone((prev) => prev?.kind === next?.kind &&
|
|
112
|
+
prev?.table.id === next?.table.id &&
|
|
113
|
+
prev?.cell.rowIndex === next?.cell.rowIndex &&
|
|
114
|
+
prev?.cell.columnIndex === next?.cell.columnIndex
|
|
115
|
+
? prev
|
|
116
|
+
: next);
|
|
117
|
+
}, [tables, hitZoneAt]);
|
|
118
|
+
const clearHitZone = useCallback(() => setHitZone(undefined), []);
|
|
119
|
+
/**
|
|
120
|
+
* Returns true when the mousedown landed on a hit zone and selected the
|
|
121
|
+
* table part — the caller then skips the regular cell selection.
|
|
122
|
+
*/
|
|
123
|
+
const onMouseDown = useCallback((e) => {
|
|
124
|
+
if (!tables?.length ||
|
|
125
|
+
e.button !== 0 ||
|
|
126
|
+
e.shiftKey ||
|
|
127
|
+
e.ctrlKey ||
|
|
128
|
+
e.metaKey) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
const zone = hitZoneAt(e.clientX, e.clientY);
|
|
132
|
+
if (!zone) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
const current = selections.length === 1 ? selections[0].range : undefined;
|
|
136
|
+
onSelectRange(sheetId, getTableHitZoneRange(zone, current));
|
|
137
|
+
return true;
|
|
138
|
+
}, [tables, hitZoneAt, selections, onSelectRange, sheetId]);
|
|
139
|
+
return {
|
|
140
|
+
hitZone,
|
|
141
|
+
cursor: hitZone ? TABLE_HIT_CURSORS[hitZone.kind] : undefined,
|
|
142
|
+
onMouseMove,
|
|
143
|
+
onMouseDown,
|
|
144
|
+
clearHitZone,
|
|
145
|
+
};
|
|
146
|
+
};
|
|
@@ -14,6 +14,13 @@ type UseTableResizerProps = {
|
|
|
14
14
|
scrollToCell: (cell: OptionalCellInterface, align?: Align | undefined) => void | undefined;
|
|
15
15
|
focusSheet(): void;
|
|
16
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* The smallest table Excel's resize handle allows: the header row (when shown) plus one data row
|
|
19
|
+
* plus the totals row (when shown), and one column. The pointer may travel above / left of that
|
|
20
|
+
* while dragging, so the drop point is clamped the same way the drag preview is — releasing above
|
|
21
|
+
* the header must not produce a headerless or inverted range.
|
|
22
|
+
*/
|
|
23
|
+
export declare const clampTableCornerCell: (cell: CellInterface, table: Pick<TableView, "range" | "headerRow" | "totalRow">) => CellInterface;
|
|
17
24
|
export declare const useTableResizer: ({ sheetId, tables, theme, newSelection, modifySelection, clearSelections, onResizeTable, getCellCoordsFromOffset, scrollToCell, focusSheet, }: UseTableResizerProps) => {
|
|
18
25
|
tableResizers: React.JSX.Element[] | undefined;
|
|
19
26
|
isResizingTable: boolean;
|