@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,22 +1,24 @@
|
|
|
1
1
|
import { Direction, isCellWithinBounds, selectionFromActiveCell, } from "@rowsncolumns/grid";
|
|
2
2
|
import { ArrowLeftIcon, ArrowRightIcon, CheckIcon, ChevronRightIcon, ClipboardIcon, CodeIcon, CopyIcon, Cross1Icon, DotsVerticalIcon, EyeNoneIcon, EyeOpenIcon, FunnelIcon, MdBrush, MdOutlineFactCheck, PaintBrush, PlusIcon, ReaderIcon, RemoveDuplicatesIcon, ScissorsIcon, SizeIcon, SortDownIcon, SortUpIcon, SpaceBetweenHorizontallyIcon, TableIcon, TrashIcon, ViewGridIcon, WandIcon, } from "@rowsncolumns/icons";
|
|
3
3
|
import { DropdownLeftSlot, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIndicator, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownRightSlot, } from "@rowsncolumns/ui";
|
|
4
|
-
import { addressToCell, cellToAddress, number2Alpha } from "@rowsncolumns/utils";
|
|
4
|
+
import { addressToCell, cellToAddress, getCellUserEnteredValue, isSparklineFormula, iterateCellsInRange, number2Alpha, resolveSparklineGroup, } from "@rowsncolumns/utils";
|
|
5
5
|
import React, { useCallback, useMemo, useRef } from "react";
|
|
6
6
|
import { bandsForAreas, bandsFromIndexes, classifyMultiSelection, defaultDeleteCellsChoice, defaultInsertCellsChoice, indexesForAreas, wholeColumnPredicate, wholeColumnPredicateFromHeaderIds, wholeRowPredicate, wholeRowPredicateFromHeaderIds, } from "../../api/multi-selection";
|
|
7
|
+
import { getDeletableTableRowIndexes } from "../../api/table";
|
|
7
8
|
import { getProtectedRange, isProtectedRange } from "../../api/validation";
|
|
8
9
|
import { useGetContentfulRangeAroundCell } from "../../atoms";
|
|
9
10
|
import { useIsAdvancedFilterDialogMounted, useOpenAdvancedFilterDialog, } from "../../atoms/advanced-filter-dialog.atom";
|
|
10
11
|
import { useIsGoalSeekDialogMounted, useOpenGoalSeekDialog, } from "../../atoms/goal-seek-dialog.atom";
|
|
11
12
|
import { useIsInsertCellsDialogMounted, useOpenInsertCellsDialog, } from "../../atoms/insert-cells-dialog.atom";
|
|
12
13
|
import { useIsRemoveDuplicatesDialogMounted, useOpenRemoveDuplicatesDialog, } from "../../atoms/remove-duplicates-dialog.atom";
|
|
14
|
+
import { useIsSparklineDialogMounted, useOpenSparklineDialog, } from "../../atoms/sparkline-dialog.atom";
|
|
13
15
|
import { useIsSubtotalDialogMounted, useOpenSubtotalDialog, } from "../../atoms/subtotal-dialog.atom";
|
|
14
16
|
import { useIsTextToColumnsDialogMounted, useOpenTextToColumnsDialog, } from "../../atoms/text-to-columns-dialog.atom";
|
|
15
17
|
import { useShowValidationAlert } from "../../atoms/validation-alert.atom";
|
|
16
18
|
import { BLANK_LABEL, MULTIPLE_SELECTIONS_ERROR } from "../../config";
|
|
17
19
|
import { generateMultiDimTitle } from "../../helpers";
|
|
18
|
-
import {
|
|
19
|
-
export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selections, basicFilter, isTableHeader, onClearContents, onHideColumn, onHideRow, onGroupRows, onUngroupRows, onGroupColumns, onUngroupColumns, onDeleteRow, onDeleteColumn, onInsertColumn, onInsertRow, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onFreezeRow, onFreezeColumn, onCopy, onCut, hasCutSelection, onInsertCutCells, onPaste, onRequestPasteSpecial, onRequestEvaluateFormula, onRequestAddWatch, isActiveCellFormula, onInsertNote, onProtectRange, onUnProtectRange, onSortRange, onSortColumn, onRequestDefineNamedRange, onRequestResize, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onPivotDrillDown, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRemoveTable, onClearFormatting, onCreateTable, onCreateBasicFilter, onFilterTable, onSortTable, getFormattedValuesFromRange, focusSheet, isSheetFocused, getFormattedValue, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onChange, getCellData, isHiddenColumn, isHiddenRow, onShowColumn, onShowRow, tables, pivotTables, protectedRanges, sheetId, frozenRows, frozenColumns, selectedRowHeadersIds, selectedColumnHeadersIds, rowCount, columnCount, readonly = false, onAddQuickEdit, enableMagicFill, }) => {
|
|
20
|
+
import { TotalRowFunctionMenuItems } from "./total-row-function-menu";
|
|
21
|
+
export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selections, basicFilter, isTableHeader, onClearContents, onHideColumn, onHideRow, onGroupRows, onUngroupRows, onGroupColumns, onUngroupColumns, onDeleteRow, onDeleteColumn, onInsertColumn, onInsertRow, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onFreezeRow, onFreezeColumn, onCopy, onCut, hasCutSelection, onInsertCutCells, onPaste, onRequestPasteSpecial, onRequestEvaluateFormula, onRequestAddWatch, isActiveCellFormula, onInsertNote, onProtectRange, onUnProtectRange, onSortRange, onSortColumn, onRequestDefineNamedRange, onRequestResize, onRequestEditTable, onRequestResizeTable, onRequestInsertSlicer, onRequestEditPivotTable, onRequestDeletePivotTable, onRequestCreatePivotChart, onPivotDrillDown, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRemoveTable, onClearFormatting, onCreateTable, onRequestCreateTable, onCreateBasicFilter, onFilterTable, onSortTable, getFormattedValuesFromRange, focusSheet, isSheetFocused, getFormattedValue, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onChange, onUpdateTable, onRequestEditCell, onSelectRange, getCellData, isHiddenColumn, isHiddenRow, onShowColumn, onShowRow, tables, pivotTables, protectedRanges, sheetId, frozenRows, frozenColumns, selectedRowHeadersIds, selectedColumnHeadersIds, rowCount, columnCount, readonly = false, onAddQuickEdit, enableMagicFill, }) => {
|
|
20
22
|
const isHeader = isColumnHeader || isRowHeader;
|
|
21
23
|
const shouldFocusSheetRef = useRef(true);
|
|
22
24
|
const multiColumnTitle = generateMultiDimTitle(selectedColumnHeadersIds, "y");
|
|
@@ -194,10 +196,44 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
|
|
|
194
196
|
const hiddenRows = selectedRowIndexes.filter((index) => isHiddenRow(index));
|
|
195
197
|
// Check for active table
|
|
196
198
|
const activeTable = useMemo(() => tables?.find(({ range }) => isCellWithinBounds(activeCell, range)), [tables, activeCell]);
|
|
199
|
+
// Excel sparkline group under the active cell (a run of same-option =SPARKLINE() cells). Only
|
|
200
|
+
// offered while a `SparklineDialogHost` is mounted — the Edit entry has nowhere to go without one.
|
|
201
|
+
const isSparklineDialogMounted = useIsSparklineDialogMounted();
|
|
202
|
+
const openSparklineDialog = useOpenSparklineDialog();
|
|
203
|
+
const getSparklineFormula = useCallback((targetSheetId, rowIndex, columnIndex) => {
|
|
204
|
+
const formula = getCellUserEnteredValue(getCellData?.(targetSheetId, rowIndex, columnIndex))?.fv;
|
|
205
|
+
return isSparklineFormula(formula) ? formula : undefined;
|
|
206
|
+
}, [getCellData]);
|
|
207
|
+
const activeSparklineGroup = useMemo(() => isSparklineDialogMounted && getCellData
|
|
208
|
+
? resolveSparklineGroup({
|
|
209
|
+
sheetId,
|
|
210
|
+
cell: activeCell,
|
|
211
|
+
getFormula: getSparklineFormula,
|
|
212
|
+
})
|
|
213
|
+
: undefined, [isSparklineDialogMounted, getCellData, sheetId, activeCell, getSparklineFormula]);
|
|
214
|
+
// Clear Selected Sparklines: the SPARKLINE cells inside the selection (Excel leaves the rest alone).
|
|
215
|
+
const clearSparklineCells = useCallback((cells) => {
|
|
216
|
+
const targets = cells.filter((cell) => getSparklineFormula(sheetId, cell.rowIndex, cell.columnIndex));
|
|
217
|
+
if (!targets.length)
|
|
218
|
+
return;
|
|
219
|
+
onClearContents?.(sheetId, targets[0], targets.map((cell) => ({
|
|
220
|
+
range: {
|
|
221
|
+
startRowIndex: cell.rowIndex,
|
|
222
|
+
endRowIndex: cell.rowIndex,
|
|
223
|
+
startColumnIndex: cell.columnIndex,
|
|
224
|
+
endColumnIndex: cell.columnIndex,
|
|
225
|
+
},
|
|
226
|
+
})));
|
|
227
|
+
}, [getSparklineFormula, onClearContents, sheetId]);
|
|
197
228
|
// Check for active pivot table
|
|
198
229
|
const activePivotTable = useMemo(() => pivotTables?.find(({ pivotRange: range }) => isCellWithinBounds(activeCell, range)), [pivotTables, activeCell]);
|
|
199
230
|
// Check if the active cell is table header
|
|
200
231
|
const isActiveCellTableHeader = isTableHeader(activeCell.rowIndex, activeCell.columnIndex);
|
|
232
|
+
// Excel's "Delete table rows" only ever removes body rows: the header and totals rows are
|
|
233
|
+
// dropped from the selection, and the item is hidden when nothing else is selected.
|
|
234
|
+
const deletableTableRowIndexes = activeTable
|
|
235
|
+
? getDeletableTableRowIndexes(activeTable, selectedRowIndexes)
|
|
236
|
+
: selectedRowIndexes;
|
|
201
237
|
// Basic filter
|
|
202
238
|
const activeBasicFilter = basicFilter && isCellWithinBounds(activeCell, basicFilter.range)
|
|
203
239
|
? basicFilter
|
|
@@ -380,14 +416,47 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
|
|
|
380
416
|
// Totals-row function picker: the active cell sits on a table's totals row.
|
|
381
417
|
const isActiveCellTableTotal = !!activeTable?.totalRow &&
|
|
382
418
|
activeCell.rowIndex === activeTable.range.endRowIndex;
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
419
|
+
/**
|
|
420
|
+
* The selection clipped to the active table, in table terms (Excel's table
|
|
421
|
+
* Insert / Select items): the selected data-body rows (none when only the
|
|
422
|
+
* header / totals row is selected), the selected rows including header and
|
|
423
|
+
* totals, and the selected columns. Counts follow the selection — N
|
|
424
|
+
* selected rows insert N table rows.
|
|
425
|
+
*/
|
|
426
|
+
const tableSelection = useMemo(() => {
|
|
427
|
+
if (!activeTable) {
|
|
428
|
+
return undefined;
|
|
386
429
|
}
|
|
387
|
-
const
|
|
388
|
-
const
|
|
389
|
-
|
|
390
|
-
|
|
430
|
+
const { range } = activeTable;
|
|
431
|
+
const firstBodyRow = range.startRowIndex + ((activeTable.headerRow ?? true) ? 1 : 0);
|
|
432
|
+
const lastDataRow = range.endRowIndex - (activeTable.totalRow ? 1 : 0);
|
|
433
|
+
const sel = selection.range;
|
|
434
|
+
const clip = (start, end, lo, hi) => {
|
|
435
|
+
const s = Math.max(start, lo);
|
|
436
|
+
const e = Math.min(end, hi);
|
|
437
|
+
return e >= s ? { start: s, end: e, count: e - s + 1 } : undefined;
|
|
438
|
+
};
|
|
439
|
+
const activeColumn = {
|
|
440
|
+
start: activeCell.columnIndex,
|
|
441
|
+
end: activeCell.columnIndex,
|
|
442
|
+
count: 1,
|
|
443
|
+
};
|
|
444
|
+
const bodyRows = clip(sel.startRowIndex, sel.endRowIndex, firstBodyRow, lastDataRow);
|
|
445
|
+
return {
|
|
446
|
+
firstBodyRow,
|
|
447
|
+
lastDataRow,
|
|
448
|
+
bodyRows,
|
|
449
|
+
rows: clip(sel.startRowIndex, sel.endRowIndex, range.startRowIndex, range.endRowIndex) ?? {
|
|
450
|
+
start: activeCell.rowIndex,
|
|
451
|
+
end: activeCell.rowIndex,
|
|
452
|
+
count: 1,
|
|
453
|
+
},
|
|
454
|
+
columns: clip(sel.startColumnIndex, sel.endColumnIndex, range.startColumnIndex, range.endColumnIndex) ?? activeColumn,
|
|
455
|
+
touchesLastDataRow: !!bodyRows && bodyRows.end === lastDataRow && lastDataRow >= firstBodyRow,
|
|
456
|
+
};
|
|
457
|
+
}, [activeTable, selection.range, activeCell]);
|
|
458
|
+
/** `rowData` for `onInsertTableRow`: one blank record per row to insert. */
|
|
459
|
+
const blankTableRows = (count) => Array.from({ length: count }, () => ({}));
|
|
391
460
|
// Sort table or filter
|
|
392
461
|
const onSortTableOrFilterView = useCallback((direction) => {
|
|
393
462
|
// Found a table
|
|
@@ -686,28 +755,38 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
|
|
|
686
755
|
"Insert",
|
|
687
756
|
React.createElement(DropdownRightSlot, null,
|
|
688
757
|
React.createElement(ChevronRightIcon, null))),
|
|
689
|
-
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 }, activeTable ? (React.createElement(React.Fragment, null,
|
|
758
|
+
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 }, activeTable && tableSelection ? (React.createElement(React.Fragment, null,
|
|
690
759
|
isActiveCellTableHeader ? null : (React.createElement(DropdownMenuItem, { onClick: () => {
|
|
691
|
-
|
|
692
|
-
|
|
760
|
+
// Above the selected body rows; from the totals
|
|
761
|
+
// row, above the totals row (Excel).
|
|
762
|
+
const { bodyRows, lastDataRow } = tableSelection;
|
|
763
|
+
onInsertTableRow?.(activeTable, (bodyRows?.start ?? lastDataRow + 1) -
|
|
764
|
+
activeTable.range.startRowIndex, blankTableRows(bodyRows?.count ?? 1));
|
|
765
|
+
}, disabled: readonly },
|
|
766
|
+
React.createElement(DropdownLeftSlot, null,
|
|
767
|
+
React.createElement(PlusIcon, null)),
|
|
768
|
+
"Table Rows Above")),
|
|
769
|
+
tableSelection.touchesLastDataRow ? (React.createElement(DropdownMenuItem, { onClick: () => {
|
|
770
|
+
const { bodyRows, lastDataRow } = tableSelection;
|
|
771
|
+
onInsertTableRow?.(activeTable, lastDataRow + 1 - activeTable.range.startRowIndex, blankTableRows(bodyRows?.count ?? 1));
|
|
693
772
|
}, disabled: readonly },
|
|
694
773
|
React.createElement(DropdownLeftSlot, null,
|
|
695
774
|
React.createElement(PlusIcon, null)),
|
|
696
|
-
"
|
|
775
|
+
"Table Row Below")) : null,
|
|
697
776
|
React.createElement(DropdownMenuItem, { onClick: () => {
|
|
698
|
-
|
|
699
|
-
|
|
777
|
+
const { columns } = tableSelection;
|
|
778
|
+
onInsertTableColumn?.(activeTable, columns.start - activeTable.range.startColumnIndex, Direction.Left, columns.count);
|
|
700
779
|
}, disabled: readonly },
|
|
701
780
|
React.createElement(DropdownLeftSlot, null,
|
|
702
781
|
React.createElement(ArrowLeftIcon, null)),
|
|
703
|
-
"
|
|
782
|
+
"Table Columns to the Left"),
|
|
704
783
|
React.createElement(DropdownMenuItem, { onClick: () => {
|
|
705
|
-
|
|
706
|
-
|
|
784
|
+
const { columns } = tableSelection;
|
|
785
|
+
onInsertTableColumn?.(activeTable, columns.end - activeTable.range.startColumnIndex, Direction.Right, columns.count);
|
|
707
786
|
}, disabled: readonly },
|
|
708
787
|
React.createElement(DropdownLeftSlot, null,
|
|
709
788
|
React.createElement(ArrowRightIcon, null)),
|
|
710
|
-
"
|
|
789
|
+
"Table Columns to the Right"))) : (React.createElement(React.Fragment, null,
|
|
711
790
|
React.createElement(DropdownMenuItem, { onClick: () => onInsertRow?.(sheetId, activeCell.rowIndex, selectedRowIndexes.length), disabled: readonly },
|
|
712
791
|
React.createElement(DropdownLeftSlot, null,
|
|
713
792
|
React.createElement(PlusIcon, null)),
|
|
@@ -739,7 +818,7 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
|
|
|
739
818
|
React.createElement(DropdownRightSlot, null,
|
|
740
819
|
React.createElement(ChevronRightIcon, null))),
|
|
741
820
|
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 }, activeTable ? (React.createElement(React.Fragment, null,
|
|
742
|
-
|
|
821
|
+
deletableTableRowIndexes.length === 0 ? null : (React.createElement(DropdownMenuItem, { onClick: () => onDeleteTableRow?.(activeTable, deletableTableRowIndexes), disabled: readonly },
|
|
743
822
|
React.createElement(DropdownLeftSlot, null,
|
|
744
823
|
React.createElement(TrashIcon, null)),
|
|
745
824
|
"Delete table row")),
|
|
@@ -771,6 +850,32 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
|
|
|
771
850
|
React.createElement(DropdownLeftSlot, null,
|
|
772
851
|
React.createElement(TrashIcon, null)),
|
|
773
852
|
deleteCellsLabel)),
|
|
853
|
+
activeTable && tableSelection && onSelectRange ? (React.createElement(DropdownMenuSub, null,
|
|
854
|
+
React.createElement(DropdownMenuSubTrigger, null,
|
|
855
|
+
React.createElement(DropdownLeftSlot, null,
|
|
856
|
+
React.createElement(ViewGridIcon, null)),
|
|
857
|
+
"Select",
|
|
858
|
+
React.createElement(DropdownRightSlot, null,
|
|
859
|
+
React.createElement(ChevronRightIcon, null))),
|
|
860
|
+
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
|
|
861
|
+
React.createElement(DropdownMenuItem, { onClick: () => onSelectRange(sheetId, {
|
|
862
|
+
startRowIndex: tableSelection.firstBodyRow,
|
|
863
|
+
endRowIndex: Math.max(tableSelection.firstBodyRow, tableSelection.lastDataRow),
|
|
864
|
+
startColumnIndex: tableSelection.columns.start,
|
|
865
|
+
endColumnIndex: tableSelection.columns.end,
|
|
866
|
+
}) }, "Table Column Data"),
|
|
867
|
+
React.createElement(DropdownMenuItem, { onClick: () => onSelectRange(sheetId, {
|
|
868
|
+
startRowIndex: activeTable.range.startRowIndex,
|
|
869
|
+
endRowIndex: activeTable.range.endRowIndex,
|
|
870
|
+
startColumnIndex: tableSelection.columns.start,
|
|
871
|
+
endColumnIndex: tableSelection.columns.end,
|
|
872
|
+
}) }, "Entire Table Column"),
|
|
873
|
+
React.createElement(DropdownMenuItem, { onClick: () => onSelectRange(sheetId, {
|
|
874
|
+
startRowIndex: tableSelection.rows.start,
|
|
875
|
+
endRowIndex: tableSelection.rows.end,
|
|
876
|
+
startColumnIndex: activeTable.range.startColumnIndex,
|
|
877
|
+
endColumnIndex: activeTable.range.endColumnIndex,
|
|
878
|
+
}) }, "Table Row")))) : null,
|
|
774
879
|
React.createElement(DropdownMenuSeparator, null),
|
|
775
880
|
React.createElement(DropdownMenuSub, null,
|
|
776
881
|
React.createElement(DropdownMenuSubTrigger, { disabled: readonly },
|
|
@@ -812,27 +917,29 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
|
|
|
812
917
|
React.createElement(DropdownRightSlot, null,
|
|
813
918
|
React.createElement(ChevronRightIcon, null))),
|
|
814
919
|
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
|
|
920
|
+
onUpdateTable ? (React.createElement(DropdownMenuCheckboxItem, { checked: !!activeTable.totalRow, disabled: readonly, onSelect: () => onUpdateTable(sheetId, activeTable.id, {
|
|
921
|
+
totalRow: !activeTable.totalRow,
|
|
922
|
+
}) },
|
|
923
|
+
React.createElement(DropdownMenuItemIndicator, null,
|
|
924
|
+
React.createElement(CheckIcon, null)),
|
|
925
|
+
"Totals Row")) : null,
|
|
815
926
|
React.createElement(DropdownMenuItem, { onClick: () => onRemoveTable?.(activeTable), disabled: readonly }, "Convert to range"),
|
|
816
927
|
React.createElement(DropdownMenuItem, { onClick: () => onRequestEditTable?.(activeTable), disabled: readonly }, "Edit table"),
|
|
928
|
+
onRequestResizeTable ? (React.createElement(DropdownMenuItem, { onClick: () => {
|
|
929
|
+
shouldFocusSheetRef.current = false;
|
|
930
|
+
onRequestResizeTable(activeTable);
|
|
931
|
+
}, disabled: readonly }, "Resize Table\u2026")) : null,
|
|
932
|
+
onRequestInsertSlicer ? (React.createElement(DropdownMenuItem, { onClick: () => {
|
|
933
|
+
shouldFocusSheetRef.current = false;
|
|
934
|
+
onRequestInsertSlicer(activeTable);
|
|
935
|
+
}, disabled: readonly }, "Insert Slicer\u2026")) : null,
|
|
817
936
|
isActiveCellTableTotal ? (React.createElement(DropdownMenuSub, null,
|
|
818
937
|
React.createElement(DropdownMenuSubTrigger, { disabled: readonly },
|
|
819
938
|
"Total row function",
|
|
820
939
|
React.createElement(DropdownRightSlot, null,
|
|
821
940
|
React.createElement(ChevronRightIcon, null))),
|
|
822
|
-
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
|
|
823
|
-
|
|
824
|
-
if (formula === undefined) {
|
|
825
|
-
return;
|
|
826
|
-
}
|
|
827
|
-
if (formula === "") {
|
|
828
|
-
onClearContents?.(sheetId, activeCell, selectionFromActiveCell(activeCell));
|
|
829
|
-
return;
|
|
830
|
-
}
|
|
831
|
-
onChange?.(sheetId, activeCell, formula, null);
|
|
832
|
-
} },
|
|
833
|
-
React.createElement(DropdownMenuItemIndicator, null,
|
|
834
|
-
React.createElement(CheckIcon, null)),
|
|
835
|
-
option.label)))))) : null))) : null,
|
|
941
|
+
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
|
|
942
|
+
React.createElement(TotalRowFunctionMenuItems, { sheetId: sheetId, table: activeTable, cell: activeCell, readonly: readonly, getCellData: getCellData, onChange: onChange, onClearContents: onClearContents, onUpdateTable: onUpdateTable, onRequestEditCell: onRequestEditCell })))) : null))) : null,
|
|
836
943
|
activePivotTable ? (React.createElement(DropdownMenuSub, null,
|
|
837
944
|
React.createElement(DropdownMenuSubTrigger, { disabled: readonly },
|
|
838
945
|
React.createElement(DropdownLeftSlot, null,
|
|
@@ -843,13 +950,36 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
|
|
|
843
950
|
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
|
|
844
951
|
onPivotDrillDown ? (React.createElement(DropdownMenuItem, { onClick: () => onPivotDrillDown?.(activePivotTable.pivotId, activeCell.rowIndex, activeCell.columnIndex) }, "Drill Down")) : null,
|
|
845
952
|
React.createElement(DropdownMenuItem, { onClick: () => onRequestEditPivotTable?.(activePivotTable), disabled: readonly }, "Edit PivotTable"),
|
|
846
|
-
React.createElement(DropdownMenuItem, { onClick: () => onRequestDeletePivotTable?.(activePivotTable.pivotId), disabled: readonly }, "Delete PivotTable")
|
|
953
|
+
React.createElement(DropdownMenuItem, { onClick: () => onRequestDeletePivotTable?.(activePivotTable.pivotId), disabled: readonly }, "Delete PivotTable"),
|
|
954
|
+
onRequestCreatePivotChart ? (React.createElement(DropdownMenuItem, { onClick: () => onRequestCreatePivotChart(sheetId, activeCell, selections, activePivotTable.pivotId), disabled: readonly }, "PivotChart")) : null))) : null,
|
|
955
|
+
activeSparklineGroup ? (React.createElement(DropdownMenuSub, null,
|
|
956
|
+
React.createElement(DropdownMenuSubTrigger, { disabled: readonly },
|
|
957
|
+
"Sparklines",
|
|
958
|
+
React.createElement(DropdownRightSlot, null,
|
|
959
|
+
React.createElement(ChevronRightIcon, null))),
|
|
960
|
+
React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
|
|
961
|
+
React.createElement(DropdownMenuItem, { disabled: readonly, onClick: () => {
|
|
962
|
+
shouldFocusSheetRef.current = false;
|
|
963
|
+
openSparklineDialog({ mode: "edit", group: activeSparklineGroup });
|
|
964
|
+
} }, "Edit Group Location & Data\u2026"),
|
|
965
|
+
React.createElement(DropdownMenuItem, { disabled: readonly, onClick: () => {
|
|
966
|
+
const cells = [];
|
|
967
|
+
for (const { range } of selections.length
|
|
968
|
+
? selections
|
|
969
|
+
: selectionFromActiveCell(activeCell)) {
|
|
970
|
+
for (const [rowIndex, columnIndex] of iterateCellsInRange(range)) {
|
|
971
|
+
cells.push({ rowIndex, columnIndex });
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
clearSparklineCells(cells);
|
|
975
|
+
} }, "Clear Selected Sparklines"),
|
|
976
|
+
React.createElement(DropdownMenuItem, { disabled: readonly, onClick: () => clearSparklineCells(activeSparklineGroup.members.map((m) => m.cell)) }, "Clear Selected Sparkline Groups")))) : null,
|
|
847
977
|
React.createElement(DropdownMenuSeparator, null),
|
|
848
978
|
activeTable ? null : (React.createElement(React.Fragment, null,
|
|
849
979
|
React.createElement(DropdownMenuItem, { onClick: () => {
|
|
850
980
|
// We have to shift the focus to note editor
|
|
851
981
|
shouldFocusSheetRef.current = false;
|
|
852
|
-
|
|
982
|
+
const bandedRange = {
|
|
853
983
|
rowProperties: {
|
|
854
984
|
firstBandColor: {
|
|
855
985
|
theme: 1,
|
|
@@ -884,7 +1014,13 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
|
|
|
884
1014
|
},
|
|
885
1015
|
},
|
|
886
1016
|
},
|
|
887
|
-
}
|
|
1017
|
+
};
|
|
1018
|
+
if (onRequestCreateTable) {
|
|
1019
|
+
onRequestCreateTable(sheetId, activeCell, selections, "TableStyleLight1", bandedRange);
|
|
1020
|
+
}
|
|
1021
|
+
else {
|
|
1022
|
+
onCreateTable?.(sheetId, activeCell, selections, undefined, "TableStyleLight1", bandedRange);
|
|
1023
|
+
}
|
|
888
1024
|
}, disabled: readonly },
|
|
889
1025
|
React.createElement(DropdownLeftSlot, null,
|
|
890
1026
|
React.createElement(TableIcon, null)),
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { CellInterface } from "@rowsncolumns/grid";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import type { TableView } from "../../types";
|
|
4
|
+
import type { CanvasGridProps } from "../canvas-grid/typings";
|
|
5
|
+
export type TotalRowFunctionMenuItemsProps = {
|
|
6
|
+
sheetId: number;
|
|
7
|
+
table: TableView;
|
|
8
|
+
/** The totals-row cell the picker acts on. */
|
|
9
|
+
cell: CellInterface;
|
|
10
|
+
readonly?: boolean;
|
|
11
|
+
/** Reads the cell's formula to highlight its current function when the column records none. */
|
|
12
|
+
getCellData?: CanvasGridProps["getCellData"];
|
|
13
|
+
/** Writes the chosen aggregation formula into the cell (fallback without `onUpdateTable`). */
|
|
14
|
+
onChange?: CanvasGridProps["onChange"];
|
|
15
|
+
/** Clears the cell for "None" (fallback without `onUpdateTable`). */
|
|
16
|
+
onClearContents?: CanvasGridProps["onClearContents"];
|
|
17
|
+
/**
|
|
18
|
+
* Records the choice as the column's `totalsRowFunction`: both engines derive
|
|
19
|
+
* the totals cell from it and regenerate it when the totals row is toggled off
|
|
20
|
+
* and on. Without it the picker writes the formula with `onChange`.
|
|
21
|
+
*/
|
|
22
|
+
onUpdateTable?: CanvasGridProps["onUpdateTable"];
|
|
23
|
+
/** Opens the cell editor pre-filled, for "More Functions…" (omitted when absent). */
|
|
24
|
+
onRequestEditCell?: (sheetId: number, cell: CellInterface, initialValue?: string) => void;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Excel's totals-row function list (None / Average / Count / … / Var, then
|
|
28
|
+
* "More Functions…") for one totals cell — the items of the context menu's
|
|
29
|
+
* "Total row function" submenu and of the dropdown the totals cell's in-cell
|
|
30
|
+
* arrow opens.
|
|
31
|
+
*/
|
|
32
|
+
export declare const TotalRowFunctionMenuItems: ({ sheetId, table, cell, readonly, getCellData, onChange, onClearContents, onUpdateTable, onRequestEditCell, }: TotalRowFunctionMenuItemsProps) => React.JSX.Element;
|
|
33
|
+
//# sourceMappingURL=total-row-function-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"total-row-function-menu.d.ts","sourceRoot":"","sources":["../../../../components/context-menu/total-row-function-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASxD,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAS9D,MAAM,MAAM,8BAA8B,GAAG;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,8CAA8C;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IAC7C,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACvC,qEAAqE;IACrE,eAAe,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACrD;;;;OAIG;IACH,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACjD,qFAAqF;IACrF,iBAAiB,CAAC,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,YAAY,CAAC,EAAE,MAAM,KAClB,IAAI,CAAC;CACX,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GAAI,+GAUvC,8BAA8B,sBAiEhC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { selectionFromActiveCell } from "@rowsncolumns/grid";
|
|
2
|
+
import { CheckIcon } from "@rowsncolumns/icons";
|
|
3
|
+
import { DropdownMenuCheckboxItem, DropdownMenuItem, DropdownMenuItemIndicator, DropdownMenuSeparator, } from "@rowsncolumns/ui";
|
|
4
|
+
import React, { useMemo } from "react";
|
|
5
|
+
import { getTotalRowFunctionFormula, getTotalRowFunctionFromFormula, MORE_FUNCTIONS_INITIAL_VALUE, TOTAL_ROW_FUNCTIONS, withTotalRowFunction, } from "./total-row-functions";
|
|
6
|
+
/**
|
|
7
|
+
* Excel's totals-row function list (None / Average / Count / … / Var, then
|
|
8
|
+
* "More Functions…") for one totals cell — the items of the context menu's
|
|
9
|
+
* "Total row function" submenu and of the dropdown the totals cell's in-cell
|
|
10
|
+
* arrow opens.
|
|
11
|
+
*/
|
|
12
|
+
export const TotalRowFunctionMenuItems = ({ sheetId, table, cell, readonly, getCellData, onChange, onClearContents, onUpdateTable, onRequestEditCell, }) => {
|
|
13
|
+
const activeFunction = useMemo(() => {
|
|
14
|
+
// The column's recorded function is the source of truth; a totals cell
|
|
15
|
+
// without one (typed by hand, or from a file) is read off its formula.
|
|
16
|
+
const recorded = table.columns?.[cell.columnIndex - table.range.startColumnIndex]
|
|
17
|
+
?.totalsRowFunction;
|
|
18
|
+
if (recorded && recorded !== "custom") {
|
|
19
|
+
return recorded;
|
|
20
|
+
}
|
|
21
|
+
const cellData = getCellData?.(sheetId, cell.rowIndex, cell.columnIndex);
|
|
22
|
+
const ue = cellData?.ue ?? cellData?.userEnteredValue;
|
|
23
|
+
return getTotalRowFunctionFromFormula(ue?.fv ?? ue?.formulaValue);
|
|
24
|
+
}, [table, getCellData, sheetId, cell]);
|
|
25
|
+
return (React.createElement(React.Fragment, null,
|
|
26
|
+
TOTAL_ROW_FUNCTIONS.map((option) => (React.createElement(DropdownMenuCheckboxItem, { key: option.id, checked: activeFunction === option.id, disabled: readonly, onSelect: () => {
|
|
27
|
+
const columns = onUpdateTable
|
|
28
|
+
? withTotalRowFunction(table, cell.columnIndex, option.id)
|
|
29
|
+
: undefined;
|
|
30
|
+
if (columns) {
|
|
31
|
+
onUpdateTable?.(sheetId, table.id, { columns });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const formula = getTotalRowFunctionFormula(option.id, table, cell.columnIndex);
|
|
35
|
+
if (formula === undefined) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (formula === "") {
|
|
39
|
+
onClearContents?.(sheetId, cell, selectionFromActiveCell(cell));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
onChange?.(sheetId, cell, formula, null);
|
|
43
|
+
} },
|
|
44
|
+
React.createElement(DropdownMenuItemIndicator, null,
|
|
45
|
+
React.createElement(CheckIcon, null)),
|
|
46
|
+
option.label))),
|
|
47
|
+
onRequestEditCell ? (React.createElement(React.Fragment, null,
|
|
48
|
+
React.createElement(DropdownMenuSeparator, null),
|
|
49
|
+
React.createElement(DropdownMenuItem, { disabled: readonly, onSelect: () => onRequestEditCell(sheetId, cell, MORE_FUNCTIONS_INITIAL_VALUE) }, "More Functions\u2026"))) : null));
|
|
50
|
+
};
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { escapeStructuredColumnName, getTotalsRowFunctionFromFormula, type TotalsRowFunction } from "@rowsncolumns/utils";
|
|
1
2
|
import type { TableView } from "../../types";
|
|
2
3
|
/**
|
|
3
|
-
* The aggregations Excel offers in a table's totals-row dropdown
|
|
4
|
-
*
|
|
4
|
+
* The aggregations Excel offers in a table's totals-row dropdown — the
|
|
5
|
+
* `totalsRowFunction` values a column records (`custom` is what "More
|
|
6
|
+
* Functions…" produces and is not a picker entry).
|
|
5
7
|
*/
|
|
6
|
-
export type TotalRowFunction =
|
|
8
|
+
export type TotalRowFunction = Exclude<TotalsRowFunction, "custom">;
|
|
7
9
|
export type TotalRowFunctionOption = {
|
|
8
10
|
id: TotalRowFunction;
|
|
9
11
|
label: string;
|
|
@@ -11,11 +13,9 @@ export type TotalRowFunctionOption = {
|
|
|
11
13
|
subtotal?: number;
|
|
12
14
|
};
|
|
13
15
|
export declare const TOTAL_ROW_FUNCTIONS: TotalRowFunctionOption[];
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
*/
|
|
18
|
-
export declare const escapeStructuredColumnName: (name: string) => string;
|
|
16
|
+
/** What "More Functions…" pre-fills in the cell editor for a custom totals formula. */
|
|
17
|
+
export declare const MORE_FUNCTIONS_INITIAL_VALUE = "=SUBTOTAL(";
|
|
18
|
+
export { escapeStructuredColumnName, getTotalsRowFunctionFromFormula as getTotalRowFunctionFromFormula };
|
|
19
19
|
/**
|
|
20
20
|
* Formula for a totals-row cell, e.g. `=SUBTOTAL(109,Table1[Amount])`.
|
|
21
21
|
* Qualified with the table name so it evaluates from any engine and matches
|
|
@@ -24,9 +24,9 @@ export declare const escapeStructuredColumnName: (name: string) => string;
|
|
|
24
24
|
*/
|
|
25
25
|
export declare const getTotalRowFunctionFormula: (fn: TotalRowFunction, table: Pick<TableView, "title" | "columns" | "range">, columnIndex: number) => string | undefined;
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
* the
|
|
29
|
-
* `
|
|
27
|
+
* The table's columns with `columnIndex`'s `totalsRowFunction` set to `fn` —
|
|
28
|
+
* the shape `onUpdateTable` persists so the choice survives toggling the totals
|
|
29
|
+
* row off and on. `undefined` when the column list does not cover the cell.
|
|
30
30
|
*/
|
|
31
|
-
export declare const
|
|
31
|
+
export declare const withTotalRowFunction: (table: Pick<TableView, "columns" | "range">, columnIndex: number, fn: TotalRowFunction) => TableView["columns"] | undefined;
|
|
32
32
|
//# sourceMappingURL=total-row-functions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"total-row-functions.d.ts","sourceRoot":"","sources":["../../../../components/context-menu/total-row-functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C
|
|
1
|
+
{"version":3,"file":"total-row-functions.d.ts","sourceRoot":"","sources":["../../../../components/context-menu/total-row-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAE1B,+BAA+B,EAE/B,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAEpE,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,gBAAgB,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,sBAAsB,EAgBrD,CAAC;AAEJ,uFAAuF;AACvF,eAAO,MAAM,4BAA4B,eAAe,CAAC;AAEzD,OAAO,EAAE,0BAA0B,EAAE,+BAA+B,IAAI,8BAA8B,EAAE,CAAC;AAEzG;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GACrC,IAAI,gBAAgB,EACpB,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,EACrD,aAAa,MAAM,KAClB,MAAM,GAAG,SAUX,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,EAC3C,aAAa,MAAM,EACnB,IAAI,gBAAgB,KACnB,SAAS,CAAC,SAAS,CAAC,GAAG,SASzB,CAAC"}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
+
import { escapeStructuredColumnName, getTotalsRowFormula, getTotalsRowFunctionFromFormula, TOTALS_ROW_FUNCTION_SUBTOTAL, } from "@rowsncolumns/utils";
|
|
1
2
|
export const TOTAL_ROW_FUNCTIONS = [
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
]
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
3
|
+
["none", "None"],
|
|
4
|
+
["average", "Average"],
|
|
5
|
+
["count", "Count"],
|
|
6
|
+
["countNums", "Count Numbers"],
|
|
7
|
+
["max", "Max"],
|
|
8
|
+
["min", "Min"],
|
|
9
|
+
["sum", "Sum"],
|
|
10
|
+
["stdDev", "StdDev"],
|
|
11
|
+
["var", "Var"],
|
|
12
|
+
].map(([id, label]) => ({
|
|
13
|
+
id,
|
|
14
|
+
label,
|
|
15
|
+
subtotal: TOTALS_ROW_FUNCTION_SUBTOTAL[id],
|
|
16
|
+
}));
|
|
17
|
+
/** What "More Functions…" pre-fills in the cell editor for a custom totals formula. */
|
|
18
|
+
export const MORE_FUNCTIONS_INITIAL_VALUE = "=SUBTOTAL(";
|
|
19
|
+
export { escapeStructuredColumnName, getTotalsRowFunctionFromFormula as getTotalRowFunctionFromFormula };
|
|
17
20
|
/**
|
|
18
21
|
* Formula for a totals-row cell, e.g. `=SUBTOTAL(109,Table1[Amount])`.
|
|
19
22
|
* Qualified with the table name so it evaluates from any engine and matches
|
|
@@ -24,27 +27,22 @@ export const getTotalRowFunctionFormula = (fn, table, columnIndex) => {
|
|
|
24
27
|
if (fn === "none") {
|
|
25
28
|
return "";
|
|
26
29
|
}
|
|
27
|
-
const option = TOTAL_ROW_FUNCTIONS.find((item) => item.id === fn);
|
|
28
30
|
const columnName = table.columns?.[columnIndex - table.range.startColumnIndex]?.name;
|
|
29
|
-
if (!
|
|
31
|
+
if (!columnName || !table.title) {
|
|
30
32
|
return undefined;
|
|
31
33
|
}
|
|
32
|
-
return
|
|
34
|
+
return getTotalsRowFormula(fn, table.title, columnName);
|
|
33
35
|
};
|
|
34
36
|
/**
|
|
35
|
-
*
|
|
36
|
-
* the
|
|
37
|
-
* `
|
|
37
|
+
* The table's columns with `columnIndex`'s `totalsRowFunction` set to `fn` —
|
|
38
|
+
* the shape `onUpdateTable` persists so the choice survives toggling the totals
|
|
39
|
+
* row off and on. `undefined` when the column list does not cover the cell.
|
|
38
40
|
*/
|
|
39
|
-
export const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (!match) {
|
|
45
|
-
return "none";
|
|
41
|
+
export const withTotalRowFunction = (table, columnIndex, fn) => {
|
|
42
|
+
const index = columnIndex - table.range.startColumnIndex;
|
|
43
|
+
const column = table.columns?.[index];
|
|
44
|
+
if (!column) {
|
|
45
|
+
return undefined;
|
|
46
46
|
}
|
|
47
|
-
|
|
48
|
-
const normalized = number > 100 ? number - 100 : number;
|
|
49
|
-
return (TOTAL_ROW_FUNCTIONS.find((item) => item.subtotal !== undefined && item.subtotal - 100 === normalized)?.id ?? "none");
|
|
47
|
+
return table.columns.map((item, i) => i === index ? { ...item, totalsRowFunction: fn } : item);
|
|
50
48
|
};
|
|
@@ -11,6 +11,23 @@ export type ChartComponentProps = {
|
|
|
11
11
|
isSelected: boolean;
|
|
12
12
|
readonly?: boolean;
|
|
13
13
|
onDeleteChart: CanvasGridProps["onDeleteChart"];
|
|
14
|
+
/**
|
|
15
|
+
* Persist an edited chart (the grid's `onUpdateChart`). Renderers use it
|
|
16
|
+
* for in-place operations such as Switch Row/Column.
|
|
17
|
+
*/
|
|
18
|
+
onUpdateChart?: CanvasGridProps["onUpdateChart"];
|
|
19
|
+
/** Chart clipboard (Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+D) — for a chart context menu. */
|
|
20
|
+
onCopyChart?: (chartId: EmbeddedChart["chartId"]) => boolean;
|
|
21
|
+
onCutChart?: (chartId: EmbeddedChart["chartId"]) => boolean;
|
|
22
|
+
onPasteChart?: () => boolean;
|
|
23
|
+
onDuplicateChart?: (chartId: EmbeddedChart["chartId"]) => EmbeddedChart | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Excel's PivotChart field buttons, drawn over the chart frame. The host
|
|
26
|
+
* composes them (`PivotChartFieldButtons` from `@rowsncolumns/pivot`
|
|
27
|
+
* with its pivot tables and sort / filter actions) because the renderer
|
|
28
|
+
* knows nothing about pivots; renderers place the node inside the frame.
|
|
29
|
+
*/
|
|
30
|
+
fieldButtons?: React.ReactNode;
|
|
14
31
|
};
|
|
15
32
|
export declare const ChartComponent: React.MemoExoticComponent<({ backgroundColor }: ChartComponentProps) => React.JSX.Element>;
|
|
16
33
|
//# sourceMappingURL=chart-component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-component.d.ts","sourceRoot":"","sources":["../../../../components/embeds/chart-component.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"chart-component.d.ts","sourceRoot":"","sources":["../../../../components/embeds/chart-component.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD;;;OAGG;IACH,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACjD,sFAAsF;IACtF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;IAC5D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,CACjB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,KAC9B,aAAa,GAAG,SAAS,CAAC;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,cAAc,kDACH,mBAAmB,uBAY1C,CAAC"}
|