@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,7 +1,40 @@
|
|
|
1
|
-
import React, { useCallback, useMemo } from "react";
|
|
2
|
-
import { useSelectedChartEmbed } from "../atoms";
|
|
1
|
+
import React, { useCallback, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { useGetChartActions, useSelectedChartEmbed, useSelectedChartSeries, } from "../atoms";
|
|
3
|
+
import { EmbedContextMenu, hasEmbedContextMenuItems, } from "../components/context-menu/embed-context-menu";
|
|
4
|
+
import { useIsMoveChartDialogMounted, useOpenMoveChartDialog, } from "../atoms/move-chart-dialog.atom";
|
|
3
5
|
import { ChartComponent, EmbedComponent, EmbedDraggable, SlicerComponent, } from "../components/embeds";
|
|
4
6
|
import { DEFAULT_OVERLAY_POSITION } from "../config";
|
|
7
|
+
import { pivotChartFieldButtonsVisible, togglePivotChartFieldButtons, } from "../utils/pivot-chart-field-buttons";
|
|
8
|
+
import { canCopyImageToClipboard, copyPngToClipboard, } from "../utils/copy-as-picture";
|
|
9
|
+
import { getStackingRanks, planZOrderChange, stackingKey, } from "../utils/z-order";
|
|
10
|
+
import { DefaultContextMenuWrapper, } from "./use-context-menu";
|
|
11
|
+
/**
|
|
12
|
+
* The cell an object's top-left corner actually sits in: its anchor cell
|
|
13
|
+
* walked forward by its pixel offsets. An `absoluteAnchor` imports as A1 plus
|
|
14
|
+
* a large offset, so the raw anchor says nothing about which pane the object
|
|
15
|
+
* is on screen in. The walk is bounded by `maxRow` / `maxColumn` (the frozen
|
|
16
|
+
* counts) — past them the answer is "body" regardless of the exact cell.
|
|
17
|
+
*/
|
|
18
|
+
export const resolveOverlayCell = (anchorCell, offsetXPixels, offsetYPixels, getCellOffsetFromCoords, maxRow, maxColumn) => {
|
|
19
|
+
let { rowIndex, columnIndex } = anchorCell;
|
|
20
|
+
let x = offsetXPixels;
|
|
21
|
+
let y = offsetYPixels;
|
|
22
|
+
while (rowIndex < maxRow) {
|
|
23
|
+
const height = getCellOffsetFromCoords({ rowIndex, columnIndex })?.height;
|
|
24
|
+
if (height === undefined || y < height)
|
|
25
|
+
break;
|
|
26
|
+
y -= height;
|
|
27
|
+
rowIndex += 1;
|
|
28
|
+
}
|
|
29
|
+
while (columnIndex < maxColumn) {
|
|
30
|
+
const width = getCellOffsetFromCoords({ rowIndex, columnIndex })?.width;
|
|
31
|
+
if (width === undefined || x < width)
|
|
32
|
+
break;
|
|
33
|
+
x -= width;
|
|
34
|
+
columnIndex += 1;
|
|
35
|
+
}
|
|
36
|
+
return { rowIndex, columnIndex };
|
|
37
|
+
};
|
|
5
38
|
/**
|
|
6
39
|
* Get placement of an item based on anchor cell position
|
|
7
40
|
*/
|
|
@@ -19,6 +52,19 @@ export const getOverlayPlacement = (anchorCell, frozenRows, frozenColumns) => {
|
|
|
19
52
|
return "frozenColumn";
|
|
20
53
|
return "body";
|
|
21
54
|
};
|
|
55
|
+
/** Excel's default placement — an object with no explicit mode moves and sizes with cells. */
|
|
56
|
+
export const isMoveAndSizePlacement = (overlay) => (overlay?.placement ?? "moveAndSize") === "moveAndSize";
|
|
57
|
+
/**
|
|
58
|
+
* The props that lay a frame out from both anchors — only a `moveAndSize`
|
|
59
|
+
* object with a persisted second anchor; the others keep their pixel size.
|
|
60
|
+
*/
|
|
61
|
+
export const getOverlayToAnchorProps = (overlay) => isMoveAndSizePlacement(overlay) && overlay.toCell
|
|
62
|
+
? {
|
|
63
|
+
toCell: overlay.toCell,
|
|
64
|
+
toOffsetXPixels: overlay.toOffsetXPixels ?? 0,
|
|
65
|
+
toOffsetYPixels: overlay.toOffsetYPixels ?? 0,
|
|
66
|
+
}
|
|
67
|
+
: undefined;
|
|
22
68
|
const defaultGetChartComponent = (props) => (React.createElement(ChartComponent, { ...props }));
|
|
23
69
|
const defaultGetEmbedComponent = (props) => (React.createElement(EmbedComponent, { ...props }));
|
|
24
70
|
const defaultGetSlicerComponent = (props) => (React.createElement(SlicerComponent, { ...props }));
|
|
@@ -37,15 +83,203 @@ const validateEmbeds = (embedsOrCharts, sheetId) => {
|
|
|
37
83
|
return obj;
|
|
38
84
|
});
|
|
39
85
|
};
|
|
40
|
-
export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, frozenRows = 0, frozenColumns = 0, getCellOffsetFromCoords, getCellCoordsFromOffset, getAbsolutePositionFromOffset, getBounds, selectedColor = "#1a73e8", onMoveChart, onResizeChart, onMoveEmbed, onResizeEmbed, onDeleteChart, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFilterTable, onFilterPivot, tables, pivotTables, getFormattedValue, getChartComponent = defaultGetChartComponent, getEmbedComponent = defaultGetEmbedComponent, getSlicerComponent = defaultGetSlicerComponent, readonly, theme, backgroundColor, disabled, }) => {
|
|
86
|
+
export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, frozenRows = 0, frozenColumns = 0, getCellOffsetFromCoords, getCellCoordsFromOffset, getAbsolutePositionFromOffset, getRelativePositionFromOffset, ContextMenuWrapper = DefaultContextMenuWrapper, focusSheet, getBounds, selectedColor = "#1a73e8", onMoveChart, onResizeChart, chartClipboard, onMoveEmbed, onResizeEmbed, onDeleteChart, onUpdateChart, onChangeZOrder, onDeleteEmbed, onRequestEditEmbed, onMoveSlicer, onResizeSlicer, onDeleteSlicer, onRequestEditSlicer, onFilterTable, onFilterPivot, tables, pivotTables, getFormattedValue, getChartComponent = defaultGetChartComponent, getEmbedComponent = defaultGetEmbedComponent, getSlicerComponent = defaultGetSlicerComponent, readonly, theme, backgroundColor, disabled, }) => {
|
|
41
87
|
const [selectedIndex, setSelectedIndex] = useSelectedChartEmbed();
|
|
88
|
+
const [selectedSeries, setSelectedSeries] = useSelectedChartSeries();
|
|
89
|
+
const getChartActions = useGetChartActions();
|
|
90
|
+
const [contextMenu, setContextMenu] = useState();
|
|
91
|
+
// The object the open menu belongs to; focus returns to it (or to the
|
|
92
|
+
// sheet once it has been deleted) when the menu closes.
|
|
93
|
+
const contextMenuTargetRef = useRef(null);
|
|
42
94
|
/**
|
|
43
95
|
* When user selects the sheet
|
|
44
96
|
*/
|
|
45
97
|
const handleMouseDown = useCallback(() => {
|
|
46
98
|
setSelectedIndex(undefined);
|
|
47
99
|
}, [setSelectedIndex]);
|
|
48
|
-
|
|
100
|
+
// Escape on a selected object: Excel first steps back from a selected data
|
|
101
|
+
// series to the whole chart, then drops the selection and the active cell
|
|
102
|
+
// takes focus again
|
|
103
|
+
const handleDeselect = useCallback((id) => {
|
|
104
|
+
if (selectedSeries?.chartId === id) {
|
|
105
|
+
setSelectedSeries(undefined);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
setSelectedIndex(undefined);
|
|
109
|
+
focusSheet();
|
|
110
|
+
}, [selectedSeries, setSelectedSeries, setSelectedIndex, focusSheet]);
|
|
111
|
+
// Pressing on a chart selects it; a series selection is made afresh by the
|
|
112
|
+
// click that follows (the renderer publishes it), so a stale one never
|
|
113
|
+
// reappears when the same chart is re-selected
|
|
114
|
+
const selectChart = useCallback((id) => {
|
|
115
|
+
setSelectedIndex(id);
|
|
116
|
+
setSelectedSeries(undefined);
|
|
117
|
+
}, [setSelectedIndex, setSelectedSeries]);
|
|
118
|
+
// Double-click on a chart opens the host's editor (Excel opens the format pane)
|
|
119
|
+
const handleChartDoubleClick = useCallback((id) => {
|
|
120
|
+
getChartActions(id)?.requestEdit?.();
|
|
121
|
+
}, [getChartActions]);
|
|
122
|
+
// Stacking rank (1 = back-most) of every chart and embed on the sheet —
|
|
123
|
+
// charts and embeds are two arrays but one z-order (Excel's Arrange menu).
|
|
124
|
+
const stackingRanks = useMemo(() => getStackingRanks(charts, embeds, sheetId), [charts, embeds, sheetId]);
|
|
125
|
+
const stackingRankOf = useCallback((target) => stackingRanks.get(stackingKey(target)), [stackingRanks]);
|
|
126
|
+
/**
|
|
127
|
+
* Excel's Arrange commands for one object, each present only while it
|
|
128
|
+
* would move the object (the front-most one has nothing to bring forward).
|
|
129
|
+
*/
|
|
130
|
+
const getArrangeActions = useCallback((target) => {
|
|
131
|
+
if (!onChangeZOrder || readonly) {
|
|
132
|
+
return {};
|
|
133
|
+
}
|
|
134
|
+
const arrange = (direction) => {
|
|
135
|
+
const changes = planZOrderChange(charts, embeds, sheetId, target, direction);
|
|
136
|
+
return changes ? () => onChangeZOrder(changes) : undefined;
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
onBringToFront: arrange("bringToFront"),
|
|
140
|
+
onBringForward: arrange("bringForward"),
|
|
141
|
+
onSendBackward: arrange("sendBackward"),
|
|
142
|
+
onSendToBack: arrange("sendToBack"),
|
|
143
|
+
};
|
|
144
|
+
}, [onChangeZOrder, readonly, charts, embeds, sheetId]);
|
|
145
|
+
/**
|
|
146
|
+
* Menu actions for a floating object. Actions without a handler are
|
|
147
|
+
* omitted so the menu only lists commands that do something.
|
|
148
|
+
*/
|
|
149
|
+
const openMoveChartDialog = useOpenMoveChartDialog();
|
|
150
|
+
const canMoveChartToSheet = useIsMoveChartDialogMounted();
|
|
151
|
+
const getContextMenuActions = useCallback((kind, id) => {
|
|
152
|
+
const actions = {};
|
|
153
|
+
if (kind === "chart") {
|
|
154
|
+
const chart = charts?.find((item) => item.chartId === id);
|
|
155
|
+
if (!chart) {
|
|
156
|
+
return actions;
|
|
157
|
+
}
|
|
158
|
+
const rendererActions = getChartActions(id);
|
|
159
|
+
if (chartClipboard) {
|
|
160
|
+
if (!readonly) {
|
|
161
|
+
actions.onCut = () => chartClipboard.cutChart(id);
|
|
162
|
+
}
|
|
163
|
+
actions.onCopy = () => chartClipboard.copyChart(id);
|
|
164
|
+
if (chartClipboard.hasChartOnClipboard()) {
|
|
165
|
+
actions.onPaste = () => chartClipboard.pasteChart();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Excel's "Copy as Picture" — the capture starts inside the click
|
|
169
|
+
// that asked for it, so the clipboard write stays in the gesture.
|
|
170
|
+
const exportPng = rendererActions?.exportPng;
|
|
171
|
+
if (exportPng && canCopyImageToClipboard()) {
|
|
172
|
+
actions.onCopyAsPicture = () => {
|
|
173
|
+
void copyPngToClipboard(exportPng());
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (rendererActions?.requestEdit && !readonly) {
|
|
177
|
+
actions.onRequestEdit = rendererActions.requestEdit;
|
|
178
|
+
// The editor opens on its Setup tab, whose first control is the
|
|
179
|
+
// chart type — the nearest thing to Excel's Change Chart Type dialog.
|
|
180
|
+
actions.onRequestChangeChartType = rendererActions.requestEdit;
|
|
181
|
+
}
|
|
182
|
+
if (rendererActions?.switchRowColumn && !readonly) {
|
|
183
|
+
actions.onSwitchRowColumn = rendererActions.switchRowColumn;
|
|
184
|
+
}
|
|
185
|
+
if (canMoveChartToSheet && !readonly) {
|
|
186
|
+
actions.onRequestMoveChart = () => openMoveChartDialog({ chart });
|
|
187
|
+
}
|
|
188
|
+
// PivotChart: Excel's Hide / Show All Field Buttons — one chart
|
|
189
|
+
// update (one undo step) that flips only the visibility flag.
|
|
190
|
+
if (chart.spec.pivotTableId != null && onUpdateChart && !readonly) {
|
|
191
|
+
const toggle = () => onUpdateChart({
|
|
192
|
+
...chart,
|
|
193
|
+
spec: { ...chart.spec, ...togglePivotChartFieldButtons(chart.spec) },
|
|
194
|
+
});
|
|
195
|
+
if (pivotChartFieldButtonsVisible(chart.spec)) {
|
|
196
|
+
actions.onHideFieldButtons = toggle;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
actions.onShowFieldButtons = toggle;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (rendererActions?.downloadPng) {
|
|
203
|
+
actions.onDownloadPng = rendererActions.downloadPng;
|
|
204
|
+
}
|
|
205
|
+
Object.assign(actions, getArrangeActions({ kind: "chart", id }));
|
|
206
|
+
if (onDeleteChart && !readonly) {
|
|
207
|
+
actions.onDelete = () => onDeleteChart(id);
|
|
208
|
+
}
|
|
209
|
+
return actions;
|
|
210
|
+
}
|
|
211
|
+
const embed = embeds?.find((item) => item.embedId === id);
|
|
212
|
+
if (!embed) {
|
|
213
|
+
return actions;
|
|
214
|
+
}
|
|
215
|
+
if (onRequestEditEmbed && !readonly) {
|
|
216
|
+
actions.onRequestEdit = () => onRequestEditEmbed(embed);
|
|
217
|
+
}
|
|
218
|
+
Object.assign(actions, getArrangeActions({ kind: "embed", id }));
|
|
219
|
+
if (onDeleteEmbed && !readonly) {
|
|
220
|
+
actions.onDelete = () => onDeleteEmbed(id);
|
|
221
|
+
}
|
|
222
|
+
return actions;
|
|
223
|
+
}, [
|
|
224
|
+
charts,
|
|
225
|
+
embeds,
|
|
226
|
+
readonly,
|
|
227
|
+
getChartActions,
|
|
228
|
+
chartClipboard,
|
|
229
|
+
onDeleteChart,
|
|
230
|
+
onUpdateChart,
|
|
231
|
+
onRequestEditEmbed,
|
|
232
|
+
onDeleteEmbed,
|
|
233
|
+
canMoveChartToSheet,
|
|
234
|
+
openMoveChartDialog,
|
|
235
|
+
getArrangeActions,
|
|
236
|
+
]);
|
|
237
|
+
/**
|
|
238
|
+
* Right-click / Shift+F10 on a floating object: select it (Excel does),
|
|
239
|
+
* then open its menu at the pointer.
|
|
240
|
+
*/
|
|
241
|
+
const requestContextMenu = useCallback((kind, id, clientX, clientY, element) => {
|
|
242
|
+
setSelectedIndex(id);
|
|
243
|
+
if (!hasEmbedContextMenuItems(getContextMenuActions(kind, id))) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const position = getRelativePositionFromOffset(clientX, clientY);
|
|
247
|
+
if (!position) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
contextMenuTargetRef.current = element;
|
|
251
|
+
setContextMenu({ kind, id, left: position.x, top: position.y });
|
|
252
|
+
}, [setSelectedIndex, getContextMenuActions, getRelativePositionFromOffset]);
|
|
253
|
+
const handleChartContextMenu = useCallback((id, clientX, clientY, element) => requestContextMenu("chart", id, clientX, clientY, element), [requestContextMenu]);
|
|
254
|
+
const handleEmbedContextMenu = useCallback((id, clientX, clientY, element) => requestContextMenu("embed", id, clientX, clientY, element), [requestContextMenu]);
|
|
255
|
+
const closeContextMenu = useCallback((isOpen) => {
|
|
256
|
+
if (!isOpen) {
|
|
257
|
+
setContextMenu(undefined);
|
|
258
|
+
}
|
|
259
|
+
}, []);
|
|
260
|
+
const handleContextMenuCloseAutoFocus = useCallback(() => {
|
|
261
|
+
const target = contextMenuTargetRef.current;
|
|
262
|
+
contextMenuTargetRef.current = null;
|
|
263
|
+
if (target?.isConnected) {
|
|
264
|
+
target.focus({ preventScroll: true });
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
focusSheet();
|
|
268
|
+
}
|
|
269
|
+
}, [focusSheet]);
|
|
270
|
+
const contextMenuComponent = useMemo(() => {
|
|
271
|
+
const actions = contextMenu
|
|
272
|
+
? getContextMenuActions(contextMenu.kind, contextMenu.id)
|
|
273
|
+
: undefined;
|
|
274
|
+
return (React.createElement(ContextMenuWrapper, { left: contextMenu?.left ?? 0, top: contextMenu?.top ?? 0, isOpen: !!contextMenu, onOpenChange: closeContextMenu }, contextMenu && actions ? (React.createElement(EmbedContextMenu, { kind: contextMenu.kind, ...actions, onCloseAutoFocus: handleContextMenuCloseAutoFocus })) : null));
|
|
275
|
+
}, [
|
|
276
|
+
ContextMenuWrapper,
|
|
277
|
+
contextMenu,
|
|
278
|
+
getContextMenuActions,
|
|
279
|
+
closeContextMenu,
|
|
280
|
+
handleContextMenuCloseAutoFocus,
|
|
281
|
+
]);
|
|
282
|
+
const getCellPositionAt = useCallback((x, y) => {
|
|
49
283
|
const position = getAbsolutePositionFromOffset(x, y);
|
|
50
284
|
// Use includeFrozen=true to detect cells in all regions
|
|
51
285
|
const anchorCell = getCellCoordsFromOffset(position?.x ?? 0, position?.y ?? 0, true);
|
|
@@ -60,15 +294,69 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
60
294
|
getCellCoordsFromOffset,
|
|
61
295
|
getAbsolutePositionFromOffset,
|
|
62
296
|
]);
|
|
297
|
+
/**
|
|
298
|
+
* Anchor cell + pixel offsets for a point in grid pixel space. A point past
|
|
299
|
+
* the sheet body (no cell there) is pulled back to its nearest body cell, so
|
|
300
|
+
* a gesture that ends outside the sheet is persisted at the clamped position
|
|
301
|
+
* instead of being dropped and leaving the frame where it was let go.
|
|
302
|
+
*/
|
|
303
|
+
const getCellPosition = useCallback((x, y) => {
|
|
304
|
+
const position = getCellPositionAt(x, y);
|
|
305
|
+
if (position) {
|
|
306
|
+
return position;
|
|
307
|
+
}
|
|
308
|
+
const bounds = getBounds();
|
|
309
|
+
const clampedX = Math.max(bounds.left ?? -Infinity, Math.min(bounds.right !== undefined ? bounds.right - 1 : Infinity, x));
|
|
310
|
+
const clampedY = Math.max(bounds.top ?? -Infinity, Math.min(bounds.bottom !== undefined ? bounds.bottom - 1 : Infinity, y));
|
|
311
|
+
if (clampedX === x && clampedY === y) {
|
|
312
|
+
return undefined;
|
|
313
|
+
}
|
|
314
|
+
return getCellPositionAt(clampedX, clampedY);
|
|
315
|
+
}, [getCellPositionAt, getBounds]);
|
|
316
|
+
// Alt-drag / Alt-resize: nearest cell corner to a point, in the same pixel space the objects are laid out in
|
|
317
|
+
const snapToCellGrid = useCallback((x, y) => {
|
|
318
|
+
const position = getCellPosition(x, y);
|
|
319
|
+
const cell = position ? getCellOffsetFromCoords(position[0]) : undefined;
|
|
320
|
+
if (!position || !cell) {
|
|
321
|
+
return undefined;
|
|
322
|
+
}
|
|
323
|
+
const [, offsetXPixels, offsetYPixels] = position;
|
|
324
|
+
return {
|
|
325
|
+
x: offsetXPixels < cell.width / 2 ? cell.x : cell.x + cell.width,
|
|
326
|
+
y: offsetYPixels < cell.height / 2 ? cell.y : cell.y + cell.height,
|
|
327
|
+
};
|
|
328
|
+
}, [getCellPosition, getCellOffsetFromCoords]);
|
|
329
|
+
/**
|
|
330
|
+
* Where a `moveAndSize` object's bottom-right corner landed (grid pixel
|
|
331
|
+
* space) as its second anchor — Excel rewrites `to` on every move and
|
|
332
|
+
* resize. `moveOnly` / `absolute` objects keep a pixel size instead.
|
|
333
|
+
*/
|
|
334
|
+
const getToAnchor = useCallback((overlay, right, bottom) => {
|
|
335
|
+
if (!isMoveAndSizePlacement(overlay)) {
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
const position = getCellPosition(right, bottom);
|
|
339
|
+
if (!position) {
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
const [toCell, toOffsetXPixels, toOffsetYPixels] = position;
|
|
343
|
+
return { toCell, toOffsetXPixels, toOffsetYPixels };
|
|
344
|
+
}, [getCellPosition]);
|
|
345
|
+
const getChartOverlay = useCallback((id) => charts?.find((chart) => chart.chartId === id)?.position
|
|
346
|
+
?.overlayPosition, [charts]);
|
|
347
|
+
const getEmbedOverlay = useCallback((id) => embeds?.find((embed) => embed.embedId === id)?.position
|
|
348
|
+
?.overlayPosition, [embeds]);
|
|
349
|
+
const getSlicerOverlay = useCallback((id) => slicers?.find((slicer) => slicer.slicerId === id)?.position
|
|
350
|
+
?.overlayPosition, [slicers]);
|
|
63
351
|
// Callback when user moves a chart
|
|
64
|
-
const handleMove = useCallback((id, x, y) => {
|
|
352
|
+
const handleMove = useCallback((id, x, y, width, height) => {
|
|
65
353
|
const position = getCellPosition(x, y);
|
|
66
354
|
if (!position) {
|
|
67
355
|
return;
|
|
68
356
|
}
|
|
69
357
|
const [anchorCell, offsetXPixels, offsetYPixels] = position;
|
|
70
|
-
onMoveChart?.(id, anchorCell, offsetXPixels, offsetYPixels);
|
|
71
|
-
}, [onMoveChart, getCellPosition]);
|
|
358
|
+
onMoveChart?.(id, anchorCell, offsetXPixels, offsetYPixels, getToAnchor(getChartOverlay(id), x + width, y + height));
|
|
359
|
+
}, [onMoveChart, getCellPosition, getToAnchor, getChartOverlay]);
|
|
72
360
|
// Callback when resizes an embed
|
|
73
361
|
const handleEmbedResize = useCallback((id, x, y, width, height) => {
|
|
74
362
|
const position = getCellPosition(x, y);
|
|
@@ -76,17 +364,17 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
76
364
|
return;
|
|
77
365
|
}
|
|
78
366
|
const [anchorCell, offsetXPixels, offsetYPixels] = position;
|
|
79
|
-
onResizeEmbed?.(id, sheetId, anchorCell, offsetXPixels, offsetYPixels, width, height);
|
|
80
|
-
}, [onResizeEmbed, sheetId, getCellPosition]);
|
|
367
|
+
onResizeEmbed?.(id, sheetId, anchorCell, offsetXPixels, offsetYPixels, width, height, getToAnchor(getEmbedOverlay(id), x + width * scale, y + height * scale));
|
|
368
|
+
}, [onResizeEmbed, sheetId, scale, getCellPosition, getToAnchor, getEmbedOverlay]);
|
|
81
369
|
// Callback when user moves a chart
|
|
82
|
-
const handleEmbedMove = useCallback((id, x, y) => {
|
|
370
|
+
const handleEmbedMove = useCallback((id, x, y, width, height) => {
|
|
83
371
|
const position = getCellPosition(x, y);
|
|
84
372
|
if (!position) {
|
|
85
373
|
return;
|
|
86
374
|
}
|
|
87
375
|
const [anchorCell, offsetXPixels, offsetYPixels] = position;
|
|
88
|
-
onMoveEmbed?.(id, sheetId, anchorCell, offsetXPixels, offsetYPixels);
|
|
89
|
-
}, [onMoveEmbed, sheetId, getCellPosition]);
|
|
376
|
+
onMoveEmbed?.(id, sheetId, anchorCell, offsetXPixels, offsetYPixels, getToAnchor(getEmbedOverlay(id), x + width, y + height));
|
|
377
|
+
}, [onMoveEmbed, sheetId, getCellPosition, getToAnchor, getEmbedOverlay]);
|
|
90
378
|
// Callback when resizes a chart
|
|
91
379
|
const handleResize = useCallback((id, x, y, width, height) => {
|
|
92
380
|
const position = getCellPosition(x, y);
|
|
@@ -94,8 +382,8 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
94
382
|
return;
|
|
95
383
|
}
|
|
96
384
|
const [anchorCell, offsetXPixels, offsetYPixels] = position;
|
|
97
|
-
onResizeChart?.(id, anchorCell, offsetXPixels, offsetYPixels, width, height);
|
|
98
|
-
}, [onResizeChart, getCellPosition]);
|
|
385
|
+
onResizeChart?.(id, anchorCell, offsetXPixels, offsetYPixels, width, height, getToAnchor(getChartOverlay(id), x + width * scale, y + height * scale));
|
|
386
|
+
}, [onResizeChart, scale, getCellPosition, getToAnchor, getChartOverlay]);
|
|
99
387
|
// Callback when user resizes a slicer
|
|
100
388
|
const handleSlicerResize = useCallback((id, x, y, width, height) => {
|
|
101
389
|
const position = getCellPosition(x, y);
|
|
@@ -103,17 +391,24 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
103
391
|
return;
|
|
104
392
|
}
|
|
105
393
|
const [anchorCell, offsetXPixels, offsetYPixels] = position;
|
|
106
|
-
onResizeSlicer?.(id, sheetId, anchorCell, offsetXPixels, offsetYPixels, width, height);
|
|
107
|
-
}, [onResizeSlicer, sheetId, getCellPosition]);
|
|
394
|
+
onResizeSlicer?.(id, sheetId, anchorCell, offsetXPixels, offsetYPixels, width, height, getToAnchor(getSlicerOverlay(id), x + width * scale, y + height * scale));
|
|
395
|
+
}, [onResizeSlicer, sheetId, scale, getCellPosition, getToAnchor, getSlicerOverlay]);
|
|
108
396
|
// Callback when user moves a slicer
|
|
109
|
-
const handleSlicerMove = useCallback((id, x, y) => {
|
|
397
|
+
const handleSlicerMove = useCallback((id, x, y, width, height) => {
|
|
110
398
|
const position = getCellPosition(x, y);
|
|
111
399
|
if (!position) {
|
|
112
400
|
return;
|
|
113
401
|
}
|
|
114
402
|
const [anchorCell, offsetXPixels, offsetYPixels] = position;
|
|
115
|
-
onMoveSlicer?.(id, sheetId, anchorCell, offsetXPixels, offsetYPixels);
|
|
116
|
-
}, [onMoveSlicer, sheetId, getCellPosition]);
|
|
403
|
+
onMoveSlicer?.(id, sheetId, anchorCell, offsetXPixels, offsetYPixels, getToAnchor(getSlicerOverlay(id), x + width, y + height));
|
|
404
|
+
}, [onMoveSlicer, sheetId, getCellPosition, getToAnchor, getSlicerOverlay]);
|
|
405
|
+
// The frozen-pane layer an object renders in: the cell its top-left corner
|
|
406
|
+
// actually sits in (anchor walked forward by the pixel offsets) against the
|
|
407
|
+
// frozen counts. Charts, pictures / embeds and slicers share it, so an object
|
|
408
|
+
// anchored in the frozen rows stays put while the body scrolls, like Excel.
|
|
409
|
+
const placementOf = useCallback(({ anchorCell, offsetXPixels, offsetYPixels, }) => getOverlayPlacement(anchorCell
|
|
410
|
+
? resolveOverlayCell(anchorCell, offsetXPixels ?? 0, offsetYPixels ?? 0, getCellOffsetFromCoords, frozenRows, frozenColumns)
|
|
411
|
+
: anchorCell, frozenRows, frozenColumns), [frozenRows, frozenColumns, getCellOffsetFromCoords]);
|
|
117
412
|
// Chart components - categorized by frozen pane placement
|
|
118
413
|
const chartComponents = useMemo(() => {
|
|
119
414
|
const result = {
|
|
@@ -129,13 +424,24 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
129
424
|
const bounds = getBounds();
|
|
130
425
|
validateEmbeds(charts, sheetId)
|
|
131
426
|
?.filter((chart) => chart.position.sheetId === sheetId)
|
|
132
|
-
.
|
|
427
|
+
.map((chart) => ({
|
|
428
|
+
chart,
|
|
429
|
+
zIndex: stackingRankOf({ kind: "chart", id: chart.chartId }),
|
|
430
|
+
}))
|
|
431
|
+
.sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0))
|
|
432
|
+
.forEach(({ chart, zIndex }) => {
|
|
133
433
|
const { chartId, position: { overlayPosition }, borderColor, draggable, resizable, } = chart;
|
|
134
434
|
const { anchorCell, widthPixels = 0, heightPixels = 0, offsetXPixels = 0, offsetYPixels = 0, } = overlayPosition;
|
|
135
435
|
const isSelected = selectedIndex === chartId;
|
|
136
436
|
const finalBorderColor = isSelected ? selectedColor : borderColor;
|
|
137
|
-
const placement =
|
|
138
|
-
const component = (React.createElement(EmbedDraggable, { bounds: bounds, key: chartId, anchorCell: anchorCell, id: chartId, isSelected: isSelected, borderColor: finalBorderColor ?? undefined, onPointerDown: () =>
|
|
437
|
+
const placement = placementOf(overlayPosition);
|
|
438
|
+
const component = (React.createElement(EmbedDraggable, { bounds: bounds, key: chartId, anchorCell: anchorCell, id: chartId, isSelected: isSelected, zIndex: zIndex, borderColor: finalBorderColor ?? undefined, onPointerDown: () => selectChart(chartId), onDoubleClick: readonly ? undefined : handleChartDoubleClick, height: (heightPixels ?? 0) * scale, width: (widthPixels ?? 0) * scale, offsetXPixels: offsetXPixels ?? 0, offsetYPixels: offsetYPixels ?? 0, ...getOverlayToAnchorProps(overlayPosition), onResize: handleResize, onMove: handleMove, scale: scale, onDelete: onDeleteChart, onDuplicate: chartClipboard?.duplicateChart, onCopy: chartClipboard
|
|
439
|
+
? (id, e) => chartClipboard.copyChart(id, e.nativeEvent)
|
|
440
|
+
: undefined, onCut: chartClipboard
|
|
441
|
+
? (id, e) => chartClipboard.cutChart(id, e.nativeEvent)
|
|
442
|
+
: undefined, onPaste: chartClipboard
|
|
443
|
+
? (_id, e) => chartClipboard.pasteChart(e.nativeEvent)
|
|
444
|
+
: undefined, onDeselect: handleDeselect, onRequestContextMenu: handleChartContextMenu, snapToGrid: snapToCellGrid, draggable: readonly ? false : draggable ?? undefined, resizable: readonly ? false : resizable ?? undefined }, (width, height) => getChartComponent?.({
|
|
139
445
|
chart,
|
|
140
446
|
width,
|
|
141
447
|
height,
|
|
@@ -143,6 +449,11 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
143
449
|
backgroundColor,
|
|
144
450
|
isSelected,
|
|
145
451
|
onDeleteChart,
|
|
452
|
+
onUpdateChart,
|
|
453
|
+
onCopyChart: chartClipboard?.copyChart,
|
|
454
|
+
onCutChart: chartClipboard?.cutChart,
|
|
455
|
+
onPasteChart: chartClipboard?.pasteChart,
|
|
456
|
+
onDuplicateChart: chartClipboard?.duplicateChart,
|
|
146
457
|
sheetId,
|
|
147
458
|
readonly,
|
|
148
459
|
})));
|
|
@@ -157,31 +468,48 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
157
468
|
sheetId,
|
|
158
469
|
selectedColor,
|
|
159
470
|
selectedIndex,
|
|
160
|
-
|
|
471
|
+
selectChart,
|
|
472
|
+
handleDeselect,
|
|
473
|
+
handleChartDoubleClick,
|
|
474
|
+
snapToCellGrid,
|
|
161
475
|
handleMove,
|
|
162
476
|
handleResize,
|
|
477
|
+
handleChartContextMenu,
|
|
163
478
|
getChartComponent,
|
|
164
479
|
theme,
|
|
165
480
|
onDeleteChart,
|
|
481
|
+
onUpdateChart,
|
|
482
|
+
chartClipboard,
|
|
166
483
|
backgroundColor,
|
|
167
|
-
|
|
168
|
-
|
|
484
|
+
placementOf,
|
|
485
|
+
stackingRankOf,
|
|
169
486
|
]);
|
|
170
|
-
// Embed components
|
|
487
|
+
// Embed components - categorized by frozen pane placement like charts
|
|
171
488
|
const embedComponents = useMemo(() => {
|
|
489
|
+
const result = {
|
|
490
|
+
body: [],
|
|
491
|
+
frozenRow: [],
|
|
492
|
+
frozenColumn: [],
|
|
493
|
+
intersection: [],
|
|
494
|
+
};
|
|
172
495
|
// If user has no EmbedComponent, skip rendering
|
|
173
496
|
if (!getEmbedComponent || disabled) {
|
|
174
|
-
return
|
|
497
|
+
return result;
|
|
175
498
|
}
|
|
176
|
-
|
|
499
|
+
validateEmbeds(embeds, sheetId)
|
|
177
500
|
?.filter((embed) => embed.position.sheetId === sheetId)
|
|
178
|
-
.map((embed) => {
|
|
501
|
+
.map((embed) => ({
|
|
502
|
+
embed,
|
|
503
|
+
zIndex: stackingRankOf({ kind: "embed", id: embed.embedId }),
|
|
504
|
+
}))
|
|
505
|
+
.sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0))
|
|
506
|
+
.forEach(({ embed, zIndex }) => {
|
|
179
507
|
const { embedId, position: { overlayPosition }, borderColor, lockAspectRatio, draggable, resizable, } = embed;
|
|
180
508
|
const { anchorCell, widthPixels = 0, heightPixels = 0, offsetXPixels = 0, offsetYPixels = 0, } = overlayPosition;
|
|
181
509
|
const bounds = getBounds();
|
|
182
510
|
const isSelected = selectedIndex === embedId;
|
|
183
511
|
const finalBorderColor = isSelected ? selectedColor : borderColor;
|
|
184
|
-
|
|
512
|
+
result[placementOf(overlayPosition)].push(React.createElement(EmbedDraggable, { key: embedId, anchorCell: anchorCell, id: embedId, isSelected: isSelected, zIndex: zIndex, borderColor: finalBorderColor ?? undefined, onPointerDown: () => setSelectedIndex(embedId), height: (heightPixels ?? 0) * scale, width: (widthPixels ?? 0) * scale, offsetXPixels: offsetXPixels ?? 0, offsetYPixels: offsetYPixels ?? 0, ...getOverlayToAnchorProps(overlayPosition), onResize: handleEmbedResize, onMove: handleEmbedMove, bounds: bounds, scale: scale, onDelete: onDeleteEmbed, onDeselect: handleDeselect, onRequestContextMenu: handleEmbedContextMenu, snapToGrid: snapToCellGrid, lockAspectRatio: lockAspectRatio ?? undefined, resizable: readonly ? false : resizable ?? undefined, draggable: readonly ? false : draggable ?? undefined }, (width, height) => getEmbedComponent?.({
|
|
185
513
|
embed,
|
|
186
514
|
width,
|
|
187
515
|
height,
|
|
@@ -193,7 +521,8 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
193
521
|
sheetId,
|
|
194
522
|
readonly,
|
|
195
523
|
})));
|
|
196
|
-
})
|
|
524
|
+
});
|
|
525
|
+
return result;
|
|
197
526
|
}, [
|
|
198
527
|
disabled,
|
|
199
528
|
scale,
|
|
@@ -204,31 +533,43 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
204
533
|
getBounds,
|
|
205
534
|
selectedIndex,
|
|
206
535
|
setSelectedIndex,
|
|
536
|
+
handleDeselect,
|
|
537
|
+
snapToCellGrid,
|
|
207
538
|
handleEmbedMove,
|
|
208
539
|
handleEmbedResize,
|
|
540
|
+
handleEmbedContextMenu,
|
|
209
541
|
getEmbedComponent,
|
|
210
542
|
theme,
|
|
211
543
|
onDeleteEmbed,
|
|
212
544
|
onRequestEditEmbed,
|
|
213
545
|
backgroundColor,
|
|
546
|
+
placementOf,
|
|
547
|
+
stackingRankOf,
|
|
214
548
|
]);
|
|
215
|
-
// Slicer components
|
|
549
|
+
// Slicer components — always above charts and embeds, as before z-order;
|
|
550
|
+
// categorized by frozen pane placement like charts.
|
|
216
551
|
const slicerComponents = useMemo(() => {
|
|
552
|
+
const result = {
|
|
553
|
+
body: [],
|
|
554
|
+
frozenRow: [],
|
|
555
|
+
frozenColumn: [],
|
|
556
|
+
intersection: [],
|
|
557
|
+
};
|
|
217
558
|
// If user has no SlicerComponent, skip rendering
|
|
218
559
|
if (!getSlicerComponent || disabled) {
|
|
219
|
-
return
|
|
560
|
+
return result;
|
|
220
561
|
}
|
|
221
|
-
|
|
562
|
+
validateEmbeds(slicers, sheetId)
|
|
222
563
|
?.filter((slicer) => slicer.position.sheetId === sheetId)
|
|
223
|
-
.
|
|
564
|
+
.forEach((slicer) => {
|
|
224
565
|
const { slicerId, position: { overlayPosition }, borderColor, draggable, resizable, } = slicer;
|
|
225
566
|
const { anchorCell, widthPixels = 0, heightPixels = 0, offsetXPixels = 0, offsetYPixels = 0, } = overlayPosition;
|
|
226
567
|
const bounds = getBounds();
|
|
227
568
|
const isSelected = selectedIndex === slicerId;
|
|
228
569
|
const finalBorderColor = isSelected ? selectedColor : borderColor;
|
|
229
|
-
|
|
570
|
+
result[placementOf(overlayPosition)].push(React.createElement(EmbedDraggable, { key: slicerId, anchorCell: anchorCell, id: slicerId, isSelected: isSelected, zIndex: stackingRanks.size + 1, borderColor: typeof finalBorderColor === "string"
|
|
230
571
|
? finalBorderColor
|
|
231
|
-
: undefined, onPointerDown: () => setSelectedIndex(slicerId), height: (heightPixels ?? 0) * scale, width: (widthPixels ?? 0) * scale, offsetXPixels: offsetXPixels ?? 0, offsetYPixels: offsetYPixels ?? 0, onResize: handleSlicerResize, onMove: handleSlicerMove, bounds: bounds, scale: scale, onDelete: onDeleteSlicer, resizable: readonly ? false : resizable ?? undefined, draggable: readonly ? false : draggable ?? undefined }, (width, height) => getSlicerComponent?.({
|
|
572
|
+
: undefined, onPointerDown: () => setSelectedIndex(slicerId), height: (heightPixels ?? 0) * scale, width: (widthPixels ?? 0) * scale, offsetXPixels: offsetXPixels ?? 0, offsetYPixels: offsetYPixels ?? 0, ...getOverlayToAnchorProps(overlayPosition), onResize: handleSlicerResize, onMove: handleSlicerMove, bounds: bounds, scale: scale, onDelete: onDeleteSlicer, onDeselect: handleDeselect, snapToGrid: snapToCellGrid, resizable: readonly ? false : resizable ?? undefined, draggable: readonly ? false : draggable ?? undefined }, (width, height) => getSlicerComponent?.({
|
|
232
573
|
slicer,
|
|
233
574
|
width,
|
|
234
575
|
height,
|
|
@@ -244,7 +585,8 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
244
585
|
sheetId,
|
|
245
586
|
readonly,
|
|
246
587
|
})));
|
|
247
|
-
})
|
|
588
|
+
});
|
|
589
|
+
return result;
|
|
248
590
|
}, [
|
|
249
591
|
disabled,
|
|
250
592
|
scale,
|
|
@@ -255,6 +597,8 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
255
597
|
getBounds,
|
|
256
598
|
selectedIndex,
|
|
257
599
|
setSelectedIndex,
|
|
600
|
+
handleDeselect,
|
|
601
|
+
snapToCellGrid,
|
|
258
602
|
handleSlicerMove,
|
|
259
603
|
handleSlicerResize,
|
|
260
604
|
getSlicerComponent,
|
|
@@ -266,11 +610,22 @@ export const useEmbedsCharts = ({ scale = 1, charts, embeds, slicers, sheetId, f
|
|
|
266
610
|
pivotTables,
|
|
267
611
|
getFormattedValue,
|
|
268
612
|
backgroundColor,
|
|
613
|
+
placementOf,
|
|
614
|
+
stackingRanks,
|
|
269
615
|
]);
|
|
270
616
|
return useMemo(() => ({
|
|
271
617
|
chartComponents,
|
|
272
618
|
embedComponents,
|
|
273
619
|
slicerComponents,
|
|
620
|
+
contextMenuComponent,
|
|
274
621
|
onMouseDown: handleMouseDown,
|
|
275
|
-
|
|
622
|
+
requestChartContextMenu: handleChartContextMenu,
|
|
623
|
+
}), [
|
|
624
|
+
chartComponents,
|
|
625
|
+
embedComponents,
|
|
626
|
+
slicerComponents,
|
|
627
|
+
contextMenuComponent,
|
|
628
|
+
handleMouseDown,
|
|
629
|
+
handleChartContextMenu,
|
|
630
|
+
]);
|
|
276
631
|
};
|
|
@@ -6,8 +6,8 @@ type UseGridChildrenProps = {
|
|
|
6
6
|
stickyEditor?: boolean;
|
|
7
7
|
editorComponent: React.ReactElement | null;
|
|
8
8
|
chartComponents: ReturnType<typeof useEmbedsCharts>["chartComponents"];
|
|
9
|
-
embedComponents:
|
|
10
|
-
slicerComponents:
|
|
9
|
+
embedComponents: ReturnType<typeof useEmbedsCharts>["embedComponents"] | null | undefined;
|
|
10
|
+
slicerComponents: ReturnType<typeof useEmbedsCharts>["slicerComponents"] | null | undefined;
|
|
11
11
|
pivotPlaceholders: React.JSX.Element[] | null | undefined;
|
|
12
12
|
tableResizers: React.JSX.Element[] | null | undefined;
|
|
13
13
|
hiddenColumnMarkers: React.JSX.Element | null | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-grid-children.d.ts","sourceRoot":"","sources":["../../../hooks/use-grid-children.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAsB,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,KAAK,oBAAoB,GAAG;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3C,eAAe,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACvE,eAAe,
|
|
1
|
+
{"version":3,"file":"use-grid-children.d.ts","sourceRoot":"","sources":["../../../hooks/use-grid-children.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAsB,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,KAAK,oBAAoB,GAAG;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3C,eAAe,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACvE,eAAe,EACX,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,iBAAiB,CAAC,GACrD,IAAI,GACJ,SAAS,CAAC;IACd,gBAAgB,EACZ,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,kBAAkB,CAAC,GACtD,IAAI,GACJ,SAAS,CAAC;IACd,iBAAiB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACtD,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,yBAAyB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,sBAAsB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7D,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,YAAY,CAAC,EAAE,UAAU,GAAG,eAAe,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,oWAoB7B,oBAAoB,aAiBX,iBAAiB,sBAyI5B,CAAC;AA+BF,eAAO,MAAM,kBAAkB,GAAI,kCAIhC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,sBAS9D,CAAC"}
|