@rowsncolumns/spreadsheet-state 28.0.76 → 29.1.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/anchored-objects.d.ts +122 -6
- package/dist/cjs/api/anchored-objects.d.ts.map +1 -1
- package/dist/cjs/api/anchored-objects.js +464 -43
- package/dist/cjs/api/copy-paste.d.ts +8 -2
- package/dist/cjs/api/copy-paste.d.ts.map +1 -1
- package/dist/cjs/api/copy-paste.js +4 -4
- package/dist/cjs/api/filter.d.ts +15 -1
- package/dist/cjs/api/filter.d.ts.map +1 -1
- package/dist/cjs/api/filter.js +32 -2
- package/dist/cjs/api/formula.d.ts +63 -0
- package/dist/cjs/api/formula.d.ts.map +1 -1
- package/dist/cjs/api/formula.js +278 -8
- package/dist/cjs/api/immer-utils.d.ts +11 -1
- package/dist/cjs/api/immer-utils.d.ts.map +1 -1
- package/dist/cjs/api/immer-utils.js +17 -1
- package/dist/cjs/api/insert-cut-cells.d.ts +35 -0
- package/dist/cjs/api/insert-cut-cells.d.ts.map +1 -0
- package/dist/cjs/api/insert-cut-cells.js +60 -0
- package/dist/cjs/api/merges.d.ts +8 -0
- package/dist/cjs/api/merges.d.ts.map +1 -1
- package/dist/cjs/api/merges.js +11 -0
- package/dist/cjs/api/paint-format.d.ts +22 -1
- package/dist/cjs/api/paint-format.d.ts.map +1 -1
- package/dist/cjs/api/paint-format.js +57 -1
- package/dist/cjs/api/sort.d.ts +23 -1
- package/dist/cjs/api/sort.d.ts.map +1 -1
- package/dist/cjs/api/sort.js +52 -6
- package/dist/cjs/api/structural-guards.d.ts +57 -0
- package/dist/cjs/api/structural-guards.d.ts.map +1 -1
- package/dist/cjs/api/structural-guards.js +93 -1
- package/dist/cjs/api/structural-table-refs.d.ts +58 -3
- package/dist/cjs/api/structural-table-refs.d.ts.map +1 -1
- package/dist/cjs/api/structural-table-refs.js +177 -16
- package/dist/cjs/api/subtotal.d.ts +20 -13
- package/dist/cjs/api/subtotal.d.ts.map +1 -1
- package/dist/cjs/api/subtotal.js +26 -19
- package/dist/cjs/api/table.d.ts +26 -2
- package/dist/cjs/api/table.d.ts.map +1 -1
- package/dist/cjs/api/table.js +93 -60
- package/dist/cjs/api/validation.d.ts.map +1 -1
- package/dist/cjs/api/validation.js +53 -8
- package/dist/cjs/atoms/creating-table.atom.d.ts +22 -0
- package/dist/cjs/atoms/creating-table.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/creating-table.atom.js +4 -0
- package/dist/cjs/atoms/dialog-state.atom.d.ts +8 -0
- package/dist/cjs/atoms/dialog-state.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/dialog-state.atom.js +28 -0
- package/dist/cjs/atoms/editing-slicer.atom.d.ts +9 -0
- package/dist/cjs/atoms/editing-slicer.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/editing-slicer.atom.js +6 -0
- package/dist/cjs/atoms/index.d.ts +4 -0
- package/dist/cjs/atoms/index.d.ts.map +1 -1
- package/dist/cjs/atoms/index.js +4 -0
- package/dist/cjs/atoms/inserting-slicer.atom.d.ts +8 -0
- package/dist/cjs/atoms/inserting-slicer.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/inserting-slicer.atom.js +5 -0
- package/dist/cjs/atoms/resizing-table.atom.d.ts +8 -0
- package/dist/cjs/atoms/resizing-table.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/resizing-table.atom.js +5 -0
- package/dist/cjs/commands.d.ts +138 -2
- package/dist/cjs/commands.d.ts.map +1 -1
- package/dist/cjs/components/editors/embed-editor.d.ts +4 -2
- package/dist/cjs/components/editors/embed-editor.d.ts.map +1 -1
- package/dist/cjs/components/editors/embed-editor.js +38 -9
- package/dist/cjs/components/editors/slicer-editor.d.ts +15 -0
- package/dist/cjs/components/editors/slicer-editor.d.ts.map +1 -0
- package/dist/cjs/components/editors/slicer-editor.js +87 -0
- package/dist/cjs/components/editors/table-editor.d.ts +58 -2
- package/dist/cjs/components/editors/table-editor.d.ts.map +1 -1
- package/dist/cjs/components/editors/table-editor.js +261 -20
- package/dist/cjs/components/index.d.ts +1 -0
- package/dist/cjs/components/index.d.ts.map +1 -1
- package/dist/cjs/components/index.js +1 -0
- package/dist/cjs/constants.d.ts +9 -1
- package/dist/cjs/constants.d.ts.map +1 -1
- package/dist/cjs/constants.js +12 -0
- package/dist/cjs/generated-names.d.ts +13 -3
- package/dist/cjs/generated-names.d.ts.map +1 -1
- package/dist/cjs/generated-names.js +3 -1
- package/dist/cjs/helpers.d.ts +5 -0
- package/dist/cjs/helpers.d.ts.map +1 -1
- package/dist/cjs/helpers.js +10 -1
- package/dist/cjs/hooks/use-on-change-batch.d.ts +19 -2
- package/dist/cjs/hooks/use-on-change-batch.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-change-batch.js +43 -35
- package/dist/cjs/hooks/use-on-change-calculated-column.d.ts +10 -1
- package/dist/cjs/hooks/use-on-change-calculated-column.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-change-calculated-column.js +17 -5
- package/dist/cjs/hooks/use-on-change-table-column.d.ts +6 -1
- package/dist/cjs/hooks/use-on-change-table-column.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-change-table-column.js +17 -5
- package/dist/cjs/hooks/use-on-change.d.ts +36 -3
- package/dist/cjs/hooks/use-on-change.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-change.js +218 -136
- package/dist/cjs/hooks/use-on-copy.d.ts +1 -1
- package/dist/cjs/hooks/use-on-copy.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-copy.js +2 -3
- package/dist/cjs/hooks/use-on-create-custom-table-style.d.ts +17 -0
- package/dist/cjs/hooks/use-on-create-custom-table-style.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-create-custom-table-style.js +28 -0
- package/dist/cjs/hooks/use-on-create-named-range.d.ts +4 -2
- package/dist/cjs/hooks/use-on-create-named-range.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-create-named-range.js +11 -1
- package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts +2 -1
- package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-delete-cells-shift-left.js +3 -1
- package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts +2 -1
- package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-delete-cells-shift-up.js +3 -1
- package/dist/cjs/hooks/use-on-delete-column.d.ts +2 -1
- package/dist/cjs/hooks/use-on-delete-column.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-delete-column.js +3 -1
- package/dist/cjs/hooks/use-on-delete-row.d.ts +2 -1
- package/dist/cjs/hooks/use-on-delete-row.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-delete-row.js +3 -1
- package/dist/cjs/hooks/use-on-delete-sheet.d.ts +9 -1
- package/dist/cjs/hooks/use-on-delete-sheet.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-delete-sheet.js +17 -1
- package/dist/cjs/hooks/use-on-delete-table-row.d.ts +4 -1
- package/dist/cjs/hooks/use-on-delete-table-row.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-delete-table-row.js +19 -1
- package/dist/cjs/hooks/use-on-delete.d.ts +5 -2
- package/dist/cjs/hooks/use-on-delete.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-delete.js +5 -1
- package/dist/cjs/hooks/use-on-embeds.d.ts +7 -4
- package/dist/cjs/hooks/use-on-embeds.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-embeds.js +26 -24
- package/dist/cjs/hooks/use-on-fill.d.ts +17 -2
- package/dist/cjs/hooks/use-on-fill.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-fill.js +29 -15
- package/dist/cjs/hooks/use-on-filter-table.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-filter-table.js +209 -103
- package/dist/cjs/hooks/use-on-import-excel.d.ts +2 -1
- package/dist/cjs/hooks/use-on-import-excel.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-import-excel.js +22 -19
- package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts +2 -1
- package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-insert-cells-shift-down.js +3 -1
- package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts +2 -1
- package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-insert-cells-shift-right.js +3 -1
- package/dist/cjs/hooks/use-on-insert-column.d.ts +2 -1
- package/dist/cjs/hooks/use-on-insert-column.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-insert-column.js +3 -1
- package/dist/cjs/hooks/use-on-insert-row.d.ts +2 -1
- package/dist/cjs/hooks/use-on-insert-row.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-insert-row.js +3 -1
- package/dist/cjs/hooks/use-on-insert-table-row.d.ts +5 -2
- package/dist/cjs/hooks/use-on-insert-table-row.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-insert-table-row.js +19 -1
- package/dist/cjs/hooks/use-on-merge-unmerge-cells.d.ts +3 -2
- package/dist/cjs/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-merge-unmerge-cells.js +14 -1
- package/dist/cjs/hooks/use-on-move-columns.d.ts +4 -1
- package/dist/cjs/hooks/use-on-move-columns.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-move-columns.js +28 -6
- package/dist/cjs/hooks/use-on-move-rows.d.ts +18 -1
- package/dist/cjs/hooks/use-on-move-rows.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-move-rows.js +44 -6
- package/dist/cjs/hooks/use-on-move-selection.d.ts +9 -2
- package/dist/cjs/hooks/use-on-move-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-move-selection.js +101 -25
- package/dist/cjs/hooks/use-on-paste.d.ts +33 -2
- package/dist/cjs/hooks/use-on-paste.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-paste.js +1005 -740
- package/dist/cjs/hooks/use-on-remove-duplicates.d.ts +5 -2
- package/dist/cjs/hooks/use-on-remove-duplicates.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-remove-duplicates.js +5 -1
- package/dist/cjs/hooks/use-on-request-create-table.d.ts +13 -0
- package/dist/cjs/hooks/use-on-request-create-table.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-request-create-table.js +44 -0
- package/dist/cjs/hooks/use-on-request-insert-slicer.d.ts +7 -0
- package/dist/cjs/hooks/use-on-request-insert-slicer.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-request-insert-slicer.js +15 -0
- package/dist/cjs/hooks/use-on-request-resize-table.d.ts +7 -0
- package/dist/cjs/hooks/use-on-request-resize-table.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-request-resize-table.js +15 -0
- package/dist/cjs/hooks/use-on-resize-table.d.ts +5 -1
- package/dist/cjs/hooks/use-on-resize-table.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-resize-table.js +110 -33
- package/dist/cjs/hooks/use-on-sort-column.d.ts +28 -3
- package/dist/cjs/hooks/use-on-sort-column.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-sort-column.js +136 -90
- package/dist/cjs/hooks/use-on-sort-range.d.ts +26 -3
- package/dist/cjs/hooks/use-on-sort-range.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-sort-range.js +113 -67
- package/dist/cjs/hooks/use-on-sort-table.d.ts +18 -1
- package/dist/cjs/hooks/use-on-sort-table.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-sort-table.js +128 -98
- package/dist/cjs/hooks/use-on-subtotal.d.ts +10 -3
- package/dist/cjs/hooks/use-on-subtotal.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-subtotal.js +13 -9
- package/dist/cjs/hooks/use-on-table.d.ts +39 -7
- package/dist/cjs/hooks/use-on-table.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-table.js +257 -49
- package/dist/cjs/hooks/use-on-undo-calculated-column.d.ts +23 -0
- package/dist/cjs/hooks/use-on-undo-calculated-column.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-undo-calculated-column.js +70 -0
- package/dist/cjs/hooks/use-on-undo-table-auto-expansion.d.ts +28 -0
- package/dist/cjs/hooks/use-on-undo-table-auto-expansion.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-undo-table-auto-expansion.js +96 -0
- package/dist/cjs/hooks/use-on-update-named-range.d.ts +4 -2
- package/dist/cjs/hooks/use-on-update-named-range.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-update-named-range.js +13 -1
- package/dist/cjs/hooks/use-sheet-properties.d.ts +1 -0
- package/dist/cjs/hooks/use-sheet-properties.d.ts.map +1 -1
- package/dist/cjs/hooks/use-sheet-properties.js +54 -34
- package/dist/cjs/hooks/use-slicers.d.ts +2 -2
- package/dist/cjs/hooks/use-slicers.d.ts.map +1 -1
- package/dist/cjs/hooks/use-slicers.js +17 -26
- package/dist/cjs/hooks/use-sparkline-groups.d.ts +50 -0
- package/dist/cjs/hooks/use-sparkline-groups.d.ts.map +1 -0
- package/dist/cjs/hooks/use-sparkline-groups.js +192 -0
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts +69 -12
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/cjs/hooks/use-spreadsheet-state.js +383 -84
- package/dist/cjs/hooks/use-structured-reference.d.ts.map +1 -1
- package/dist/cjs/hooks/use-structured-reference.js +17 -0
- package/dist/cjs/hooks/use-undo-redo-actions.d.ts +2 -1
- package/dist/cjs/hooks/use-undo-redo-actions.d.ts.map +1 -1
- package/dist/cjs/hooks/use-undo-redo-actions.js +10 -2
- package/dist/cjs/hooks/use-undo-redo.d.ts +12 -0
- package/dist/cjs/hooks/use-undo-redo.d.ts.map +1 -1
- package/dist/cjs/hooks/use-undo-redo.js +169 -10
- package/dist/cjs/hooks/utils/sort-rows.d.ts.map +1 -1
- package/dist/cjs/hooks/utils/sort-rows.js +4 -3
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +9 -0
- package/dist/cjs/interface/apply-fill.d.ts +26 -3
- package/dist/cjs/interface/apply-fill.d.ts.map +1 -1
- package/dist/cjs/interface/apply-fill.js +207 -98
- package/dist/cjs/interface/change-batch.d.ts +1 -1
- package/dist/cjs/interface/change-batch.d.ts.map +1 -1
- package/dist/cjs/interface/change-batch.js +112 -15
- package/dist/cjs/interface/change-calculated-column.d.ts +6 -2
- package/dist/cjs/interface/change-calculated-column.d.ts.map +1 -1
- package/dist/cjs/interface/change-calculated-column.js +87 -17
- package/dist/cjs/interface/change-table-column.d.ts +81 -7
- package/dist/cjs/interface/change-table-column.d.ts.map +1 -1
- package/dist/cjs/interface/change-table-column.js +336 -76
- package/dist/cjs/interface/create-table.d.ts +15 -3
- package/dist/cjs/interface/create-table.d.ts.map +1 -1
- package/dist/cjs/interface/create-table.js +100 -25
- package/dist/cjs/interface/delete-cells-shift-left.d.ts +1 -1
- package/dist/cjs/interface/delete-cells-shift-left.d.ts.map +1 -1
- package/dist/cjs/interface/delete-cells-shift-left.js +10 -1
- package/dist/cjs/interface/delete-cells-shift-up.d.ts +1 -1
- package/dist/cjs/interface/delete-cells-shift-up.d.ts.map +1 -1
- package/dist/cjs/interface/delete-cells-shift-up.js +10 -1
- package/dist/cjs/interface/delete-cells.d.ts +1 -1
- package/dist/cjs/interface/delete-cells.d.ts.map +1 -1
- package/dist/cjs/interface/delete-cells.js +81 -25
- package/dist/cjs/interface/delete-column.d.ts +1 -1
- package/dist/cjs/interface/delete-column.d.ts.map +1 -1
- package/dist/cjs/interface/delete-column.js +29 -22
- package/dist/cjs/interface/delete-row.d.ts +1 -1
- package/dist/cjs/interface/delete-row.d.ts.map +1 -1
- package/dist/cjs/interface/delete-row.js +244 -39
- package/dist/cjs/interface/delete-sheet.d.ts +2 -2
- package/dist/cjs/interface/delete-sheet.d.ts.map +1 -1
- package/dist/cjs/interface/delete-sheet.js +118 -1
- package/dist/cjs/interface/delete-table-column.d.ts +1 -1
- package/dist/cjs/interface/delete-table-column.d.ts.map +1 -1
- package/dist/cjs/interface/delete-table-column.js +11 -1
- package/dist/cjs/interface/delete-table-row.d.ts +1 -1
- package/dist/cjs/interface/delete-table-row.d.ts.map +1 -1
- package/dist/cjs/interface/delete-table-row.js +361 -275
- package/dist/cjs/interface/duplicate-sheet.d.ts.map +1 -1
- package/dist/cjs/interface/duplicate-sheet.js +83 -31
- package/dist/cjs/interface/embeds.d.ts +10 -1
- package/dist/cjs/interface/embeds.d.ts.map +1 -1
- package/dist/cjs/interface/embeds.js +120 -6
- package/dist/cjs/interface/insert-cells-shift-down.d.ts +1 -1
- package/dist/cjs/interface/insert-cells-shift-down.d.ts.map +1 -1
- package/dist/cjs/interface/insert-cells-shift-down.js +10 -1
- package/dist/cjs/interface/insert-cells-shift-right.d.ts +1 -1
- package/dist/cjs/interface/insert-cells-shift-right.d.ts.map +1 -1
- package/dist/cjs/interface/insert-cells-shift-right.js +10 -1
- package/dist/cjs/interface/insert-column.d.ts +2 -2
- package/dist/cjs/interface/insert-column.d.ts.map +1 -1
- package/dist/cjs/interface/insert-column.js +101 -56
- package/dist/cjs/interface/insert-row.d.ts +1 -1
- package/dist/cjs/interface/insert-row.d.ts.map +1 -1
- package/dist/cjs/interface/insert-row.js +25 -7
- package/dist/cjs/interface/insert-table-row.d.ts +2 -1
- package/dist/cjs/interface/insert-table-row.d.ts.map +1 -1
- package/dist/cjs/interface/insert-table-row.js +70 -19
- package/dist/cjs/interface/remove-duplicates.d.ts +1 -1
- package/dist/cjs/interface/remove-duplicates.d.ts.map +1 -1
- package/dist/cjs/interface/remove-duplicates.js +46 -6
- package/dist/cjs/interface/remove-table.d.ts +1 -1
- package/dist/cjs/interface/remove-table.d.ts.map +1 -1
- package/dist/cjs/interface/remove-table.js +72 -16
- package/dist/cjs/interface/slicers.d.ts +12 -1
- package/dist/cjs/interface/slicers.d.ts.map +1 -1
- package/dist/cjs/interface/slicers.js +47 -2
- package/dist/cjs/interface/spreadsheet-interface.d.ts +1 -1
- package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
- package/dist/cjs/interface/spreadsheet-interface.js +64 -1
- package/dist/cjs/interface/table-totalrow.d.ts +13 -1
- package/dist/cjs/interface/table-totalrow.d.ts.map +1 -1
- package/dist/cjs/interface/table-totalrow.js +107 -73
- package/dist/cjs/interface/table-utils.d.ts +59 -6
- package/dist/cjs/interface/table-utils.d.ts.map +1 -1
- package/dist/cjs/interface/table-utils.js +211 -15
- package/dist/cjs/interface/update-table.d.ts +16 -1
- package/dist/cjs/interface/update-table.d.ts.map +1 -1
- package/dist/cjs/interface/update-table.js +190 -44
- package/dist/cjs/sheet-cell.d.ts.map +1 -1
- package/dist/cjs/test-setup.d.ts.map +1 -1
- package/dist/cjs/test-setup.js +6 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/validation-schema/table.schema.d.ts +11 -0
- package/dist/cjs/validation-schema/table.schema.d.ts.map +1 -1
- package/dist/cjs/validation-schema/table.schema.js +20 -3
- package/dist/esm/api/anchored-objects.d.ts +122 -6
- package/dist/esm/api/anchored-objects.d.ts.map +1 -1
- package/dist/esm/api/anchored-objects.js +375 -15
- package/dist/esm/api/copy-paste.d.ts +8 -2
- package/dist/esm/api/copy-paste.d.ts.map +1 -1
- package/dist/esm/api/copy-paste.js +4 -4
- package/dist/esm/api/filter.d.ts +15 -1
- package/dist/esm/api/filter.d.ts.map +1 -1
- package/dist/esm/api/filter.js +28 -0
- package/dist/esm/api/formula.d.ts +63 -0
- package/dist/esm/api/formula.d.ts.map +1 -1
- package/dist/esm/api/formula.js +235 -8
- package/dist/esm/api/immer-utils.d.ts +11 -1
- package/dist/esm/api/immer-utils.d.ts.map +1 -1
- package/dist/esm/api/immer-utils.js +16 -0
- package/dist/esm/api/insert-cut-cells.d.ts +35 -0
- package/dist/esm/api/insert-cut-cells.d.ts.map +1 -0
- package/dist/esm/api/insert-cut-cells.js +67 -0
- package/dist/esm/api/merges.d.ts +8 -0
- package/dist/esm/api/merges.d.ts.map +1 -1
- package/dist/esm/api/merges.js +9 -0
- package/dist/esm/api/paint-format.d.ts +22 -1
- package/dist/esm/api/paint-format.d.ts.map +1 -1
- package/dist/esm/api/paint-format.js +44 -1
- package/dist/esm/api/sort.d.ts +23 -1
- package/dist/esm/api/sort.d.ts.map +1 -1
- package/dist/esm/api/sort.js +45 -6
- package/dist/esm/api/structural-guards.d.ts +57 -0
- package/dist/esm/api/structural-guards.d.ts.map +1 -1
- package/dist/esm/api/structural-guards.js +85 -0
- package/dist/esm/api/structural-table-refs.d.ts +58 -3
- package/dist/esm/api/structural-table-refs.d.ts.map +1 -1
- package/dist/esm/api/structural-table-refs.js +126 -6
- package/dist/esm/api/subtotal.d.ts +20 -13
- package/dist/esm/api/subtotal.d.ts.map +1 -1
- package/dist/esm/api/subtotal.js +15 -8
- package/dist/esm/api/table.d.ts +26 -2
- package/dist/esm/api/table.d.ts.map +1 -1
- package/dist/esm/api/table.js +70 -48
- package/dist/esm/api/validation.d.ts.map +1 -1
- package/dist/esm/api/validation.js +53 -8
- package/dist/esm/atoms/creating-table.atom.d.ts +22 -0
- package/dist/esm/atoms/creating-table.atom.d.ts.map +1 -0
- package/dist/esm/atoms/creating-table.atom.js +4 -0
- package/dist/esm/atoms/dialog-state.atom.d.ts +8 -0
- package/dist/esm/atoms/dialog-state.atom.d.ts.map +1 -1
- package/dist/esm/atoms/dialog-state.atom.js +12 -0
- package/dist/esm/atoms/editing-slicer.atom.d.ts +9 -0
- package/dist/esm/atoms/editing-slicer.atom.d.ts.map +1 -0
- package/dist/esm/atoms/editing-slicer.atom.js +6 -0
- package/dist/esm/atoms/index.d.ts +4 -0
- package/dist/esm/atoms/index.d.ts.map +1 -1
- package/dist/esm/atoms/index.js +4 -0
- package/dist/esm/atoms/inserting-slicer.atom.d.ts +8 -0
- package/dist/esm/atoms/inserting-slicer.atom.d.ts.map +1 -0
- package/dist/esm/atoms/inserting-slicer.atom.js +5 -0
- package/dist/esm/atoms/resizing-table.atom.d.ts +8 -0
- package/dist/esm/atoms/resizing-table.atom.d.ts.map +1 -0
- package/dist/esm/atoms/resizing-table.atom.js +5 -0
- package/dist/esm/commands.d.ts +138 -2
- package/dist/esm/commands.d.ts.map +1 -1
- package/dist/esm/components/editors/embed-editor.d.ts +4 -2
- package/dist/esm/components/editors/embed-editor.d.ts.map +1 -1
- package/dist/esm/components/editors/embed-editor.js +40 -6
- package/dist/esm/components/editors/slicer-editor.d.ts +15 -0
- package/dist/esm/components/editors/slicer-editor.d.ts.map +1 -0
- package/dist/esm/components/editors/slicer-editor.js +85 -0
- package/dist/esm/components/editors/table-editor.d.ts +58 -2
- package/dist/esm/components/editors/table-editor.d.ts.map +1 -1
- package/dist/esm/components/editors/table-editor.js +243 -19
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +1 -0
- package/dist/esm/constants.d.ts +9 -1
- package/dist/esm/constants.d.ts.map +1 -1
- package/dist/esm/constants.js +12 -0
- package/dist/esm/generated-names.d.ts +13 -3
- package/dist/esm/generated-names.d.ts.map +1 -1
- package/dist/esm/generated-names.js +3 -1
- package/dist/esm/helpers.d.ts +5 -0
- package/dist/esm/helpers.d.ts.map +1 -1
- package/dist/esm/helpers.js +7 -1
- package/dist/esm/hooks/use-on-change-batch.d.ts +19 -2
- package/dist/esm/hooks/use-on-change-batch.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-change-batch.js +19 -3
- package/dist/esm/hooks/use-on-change-calculated-column.d.ts +10 -1
- package/dist/esm/hooks/use-on-change-calculated-column.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-change-calculated-column.js +17 -5
- package/dist/esm/hooks/use-on-change-table-column.d.ts +6 -1
- package/dist/esm/hooks/use-on-change-table-column.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-change-table-column.js +17 -5
- package/dist/esm/hooks/use-on-change.d.ts +36 -3
- package/dist/esm/hooks/use-on-change.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-change.js +214 -124
- package/dist/esm/hooks/use-on-copy.d.ts +1 -1
- package/dist/esm/hooks/use-on-copy.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-copy.js +2 -3
- package/dist/esm/hooks/use-on-create-custom-table-style.d.ts +17 -0
- package/dist/esm/hooks/use-on-create-custom-table-style.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-create-custom-table-style.js +26 -0
- package/dist/esm/hooks/use-on-create-named-range.d.ts +4 -2
- package/dist/esm/hooks/use-on-create-named-range.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-create-named-range.js +11 -1
- package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts +2 -1
- package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-delete-cells-shift-left.js +3 -1
- package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts +2 -1
- package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-delete-cells-shift-up.js +3 -1
- package/dist/esm/hooks/use-on-delete-column.d.ts +2 -1
- package/dist/esm/hooks/use-on-delete-column.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-delete-column.js +3 -1
- package/dist/esm/hooks/use-on-delete-row.d.ts +2 -1
- package/dist/esm/hooks/use-on-delete-row.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-delete-row.js +3 -1
- package/dist/esm/hooks/use-on-delete-sheet.d.ts +9 -1
- package/dist/esm/hooks/use-on-delete-sheet.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-delete-sheet.js +17 -1
- package/dist/esm/hooks/use-on-delete-table-row.d.ts +4 -1
- package/dist/esm/hooks/use-on-delete-table-row.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-delete-table-row.js +19 -1
- package/dist/esm/hooks/use-on-delete.d.ts +5 -2
- package/dist/esm/hooks/use-on-delete.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-delete.js +5 -1
- package/dist/esm/hooks/use-on-embeds.d.ts +7 -4
- package/dist/esm/hooks/use-on-embeds.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-embeds.js +23 -6
- package/dist/esm/hooks/use-on-fill.d.ts +17 -2
- package/dist/esm/hooks/use-on-fill.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-fill.js +27 -1
- package/dist/esm/hooks/use-on-filter-table.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-filter-table.js +97 -26
- package/dist/esm/hooks/use-on-import-excel.d.ts +2 -1
- package/dist/esm/hooks/use-on-import-excel.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-import-excel.js +4 -1
- package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts +2 -1
- package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-insert-cells-shift-down.js +3 -1
- package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts +2 -1
- package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-insert-cells-shift-right.js +3 -1
- package/dist/esm/hooks/use-on-insert-column.d.ts +2 -1
- package/dist/esm/hooks/use-on-insert-column.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-insert-column.js +3 -1
- package/dist/esm/hooks/use-on-insert-row.d.ts +2 -1
- package/dist/esm/hooks/use-on-insert-row.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-insert-row.js +3 -1
- package/dist/esm/hooks/use-on-insert-table-row.d.ts +5 -2
- package/dist/esm/hooks/use-on-insert-table-row.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-insert-table-row.js +19 -1
- package/dist/esm/hooks/use-on-merge-unmerge-cells.d.ts +3 -2
- package/dist/esm/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-merge-unmerge-cells.js +12 -1
- package/dist/esm/hooks/use-on-move-columns.d.ts +4 -1
- package/dist/esm/hooks/use-on-move-columns.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-move-columns.js +28 -6
- package/dist/esm/hooks/use-on-move-rows.d.ts +18 -1
- package/dist/esm/hooks/use-on-move-rows.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-move-rows.js +44 -6
- package/dist/esm/hooks/use-on-move-selection.d.ts +9 -2
- package/dist/esm/hooks/use-on-move-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-move-selection.js +57 -1
- package/dist/esm/hooks/use-on-paste.d.ts +33 -2
- package/dist/esm/hooks/use-on-paste.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-paste.js +825 -643
- package/dist/esm/hooks/use-on-remove-duplicates.d.ts +5 -2
- package/dist/esm/hooks/use-on-remove-duplicates.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-remove-duplicates.js +5 -1
- package/dist/esm/hooks/use-on-request-create-table.d.ts +13 -0
- package/dist/esm/hooks/use-on-request-create-table.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-request-create-table.js +43 -0
- package/dist/esm/hooks/use-on-request-insert-slicer.d.ts +7 -0
- package/dist/esm/hooks/use-on-request-insert-slicer.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-request-insert-slicer.js +15 -0
- package/dist/esm/hooks/use-on-request-resize-table.d.ts +7 -0
- package/dist/esm/hooks/use-on-request-resize-table.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-request-resize-table.js +15 -0
- package/dist/esm/hooks/use-on-resize-table.d.ts +5 -1
- package/dist/esm/hooks/use-on-resize-table.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-resize-table.js +107 -27
- package/dist/esm/hooks/use-on-sort-column.d.ts +28 -3
- package/dist/esm/hooks/use-on-sort-column.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-sort-column.js +105 -68
- package/dist/esm/hooks/use-on-sort-range.d.ts +26 -3
- package/dist/esm/hooks/use-on-sort-range.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-sort-range.js +100 -64
- package/dist/esm/hooks/use-on-sort-table.d.ts +18 -1
- package/dist/esm/hooks/use-on-sort-table.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-sort-table.js +107 -86
- package/dist/esm/hooks/use-on-subtotal.d.ts +10 -3
- package/dist/esm/hooks/use-on-subtotal.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-subtotal.js +7 -5
- package/dist/esm/hooks/use-on-table.d.ts +39 -7
- package/dist/esm/hooks/use-on-table.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-table.js +234 -26
- package/dist/esm/hooks/use-on-undo-calculated-column.d.ts +23 -0
- package/dist/esm/hooks/use-on-undo-calculated-column.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-undo-calculated-column.js +62 -0
- package/dist/esm/hooks/use-on-undo-table-auto-expansion.d.ts +28 -0
- package/dist/esm/hooks/use-on-undo-table-auto-expansion.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-undo-table-auto-expansion.js +75 -0
- package/dist/esm/hooks/use-on-update-named-range.d.ts +4 -2
- package/dist/esm/hooks/use-on-update-named-range.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-update-named-range.js +13 -1
- package/dist/esm/hooks/use-sheet-properties.d.ts +1 -0
- package/dist/esm/hooks/use-sheet-properties.d.ts.map +1 -1
- package/dist/esm/hooks/use-sheet-properties.js +38 -19
- package/dist/esm/hooks/use-slicers.d.ts +2 -2
- package/dist/esm/hooks/use-slicers.d.ts.map +1 -1
- package/dist/esm/hooks/use-slicers.js +16 -8
- package/dist/esm/hooks/use-sparkline-groups.d.ts +50 -0
- package/dist/esm/hooks/use-sparkline-groups.d.ts.map +1 -0
- package/dist/esm/hooks/use-sparkline-groups.js +146 -0
- package/dist/esm/hooks/use-spreadsheet-state.d.ts +69 -12
- package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/esm/hooks/use-spreadsheet-state.js +321 -14
- package/dist/esm/hooks/use-structured-reference.d.ts.map +1 -1
- package/dist/esm/hooks/use-structured-reference.js +17 -0
- package/dist/esm/hooks/use-undo-redo-actions.d.ts +2 -1
- package/dist/esm/hooks/use-undo-redo-actions.d.ts.map +1 -1
- package/dist/esm/hooks/use-undo-redo-actions.js +8 -2
- package/dist/esm/hooks/use-undo-redo.d.ts +12 -0
- package/dist/esm/hooks/use-undo-redo.d.ts.map +1 -1
- package/dist/esm/hooks/use-undo-redo.js +158 -7
- package/dist/esm/hooks/utils/sort-rows.d.ts.map +1 -1
- package/dist/esm/hooks/utils/sort-rows.js +4 -3
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +9 -0
- package/dist/esm/interface/apply-fill.d.ts +26 -3
- package/dist/esm/interface/apply-fill.d.ts.map +1 -1
- package/dist/esm/interface/apply-fill.js +188 -88
- package/dist/esm/interface/change-batch.d.ts +1 -1
- package/dist/esm/interface/change-batch.d.ts.map +1 -1
- package/dist/esm/interface/change-batch.js +89 -8
- package/dist/esm/interface/change-calculated-column.d.ts +6 -2
- package/dist/esm/interface/change-calculated-column.d.ts.map +1 -1
- package/dist/esm/interface/change-calculated-column.js +81 -16
- package/dist/esm/interface/change-table-column.d.ts +81 -7
- package/dist/esm/interface/change-table-column.d.ts.map +1 -1
- package/dist/esm/interface/change-table-column.js +295 -67
- package/dist/esm/interface/create-table.d.ts +15 -3
- package/dist/esm/interface/create-table.d.ts.map +1 -1
- package/dist/esm/interface/create-table.js +103 -27
- package/dist/esm/interface/delete-cells-shift-left.d.ts +1 -1
- package/dist/esm/interface/delete-cells-shift-left.d.ts.map +1 -1
- package/dist/esm/interface/delete-cells-shift-left.js +10 -1
- package/dist/esm/interface/delete-cells-shift-up.d.ts +1 -1
- package/dist/esm/interface/delete-cells-shift-up.d.ts.map +1 -1
- package/dist/esm/interface/delete-cells-shift-up.js +10 -1
- package/dist/esm/interface/delete-cells.d.ts +1 -1
- package/dist/esm/interface/delete-cells.d.ts.map +1 -1
- package/dist/esm/interface/delete-cells.js +47 -14
- package/dist/esm/interface/delete-column.d.ts +1 -1
- package/dist/esm/interface/delete-column.d.ts.map +1 -1
- package/dist/esm/interface/delete-column.js +26 -30
- package/dist/esm/interface/delete-row.d.ts +1 -1
- package/dist/esm/interface/delete-row.d.ts.map +1 -1
- package/dist/esm/interface/delete-row.js +191 -44
- package/dist/esm/interface/delete-sheet.d.ts +2 -2
- package/dist/esm/interface/delete-sheet.d.ts.map +1 -1
- package/dist/esm/interface/delete-sheet.js +113 -1
- package/dist/esm/interface/delete-table-column.d.ts +1 -1
- package/dist/esm/interface/delete-table-column.d.ts.map +1 -1
- package/dist/esm/interface/delete-table-column.js +11 -1
- package/dist/esm/interface/delete-table-row.d.ts +1 -1
- package/dist/esm/interface/delete-table-row.d.ts.map +1 -1
- package/dist/esm/interface/delete-table-row.js +312 -232
- package/dist/esm/interface/duplicate-sheet.d.ts.map +1 -1
- package/dist/esm/interface/duplicate-sheet.js +73 -26
- package/dist/esm/interface/embeds.d.ts +10 -1
- package/dist/esm/interface/embeds.d.ts.map +1 -1
- package/dist/esm/interface/embeds.js +84 -5
- package/dist/esm/interface/insert-cells-shift-down.d.ts +1 -1
- package/dist/esm/interface/insert-cells-shift-down.d.ts.map +1 -1
- package/dist/esm/interface/insert-cells-shift-down.js +10 -1
- package/dist/esm/interface/insert-cells-shift-right.d.ts +1 -1
- package/dist/esm/interface/insert-cells-shift-right.d.ts.map +1 -1
- package/dist/esm/interface/insert-cells-shift-right.js +10 -1
- package/dist/esm/interface/insert-column.d.ts +2 -2
- package/dist/esm/interface/insert-column.d.ts.map +1 -1
- package/dist/esm/interface/insert-column.js +70 -33
- package/dist/esm/interface/insert-row.d.ts +1 -1
- package/dist/esm/interface/insert-row.d.ts.map +1 -1
- package/dist/esm/interface/insert-row.js +22 -6
- package/dist/esm/interface/insert-table-row.d.ts +2 -1
- package/dist/esm/interface/insert-table-row.d.ts.map +1 -1
- package/dist/esm/interface/insert-table-row.js +67 -12
- package/dist/esm/interface/remove-duplicates.d.ts +1 -1
- package/dist/esm/interface/remove-duplicates.d.ts.map +1 -1
- package/dist/esm/interface/remove-duplicates.js +41 -6
- package/dist/esm/interface/remove-table.d.ts +1 -1
- package/dist/esm/interface/remove-table.d.ts.map +1 -1
- package/dist/esm/interface/remove-table.js +58 -10
- package/dist/esm/interface/slicers.d.ts +12 -1
- package/dist/esm/interface/slicers.d.ts.map +1 -1
- package/dist/esm/interface/slicers.js +44 -2
- package/dist/esm/interface/spreadsheet-interface.d.ts +1 -1
- package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
- package/dist/esm/interface/spreadsheet-interface.js +73 -1
- package/dist/esm/interface/table-totalrow.d.ts +13 -1
- package/dist/esm/interface/table-totalrow.d.ts.map +1 -1
- package/dist/esm/interface/table-totalrow.js +98 -68
- package/dist/esm/interface/table-utils.d.ts +59 -6
- package/dist/esm/interface/table-utils.d.ts.map +1 -1
- package/dist/esm/interface/table-utils.js +155 -14
- package/dist/esm/interface/update-table.d.ts +16 -1
- package/dist/esm/interface/update-table.d.ts.map +1 -1
- package/dist/esm/interface/update-table.js +203 -42
- package/dist/esm/sheet-cell.d.ts.map +1 -1
- package/dist/esm/test-setup.d.ts.map +1 -1
- package/dist/esm/test-setup.js +6 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/validation-schema/table.schema.d.ts +11 -0
- package/dist/esm/validation-schema/table.schema.d.ts.map +1 -1
- package/dist/esm/validation-schema/table.schema.js +15 -2
- package/package.json +25 -17
package/dist/esm/api/sort.js
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
1
|
import { isNil } from "@rowsncolumns/utils";
|
|
2
|
+
/**
|
|
3
|
+
* The text order both engines sort with: case- and accent-insensitive,
|
|
4
|
+
* digit runs by numeric value ("a2" < "a10"). `rnc_cellmodel::collate_text`
|
|
5
|
+
* is its Rust twin.
|
|
6
|
+
*/
|
|
2
7
|
const { compare: comparator } = new Intl.Collator("en", {
|
|
3
8
|
numeric: true,
|
|
4
9
|
sensitivity: "base",
|
|
5
10
|
});
|
|
11
|
+
export const isSortErrorValue = (value) => typeof value === "object" && value !== null && "sortError" in value;
|
|
12
|
+
/**
|
|
13
|
+
* The value a sort compares for a cell: its error when it has one, else the
|
|
14
|
+
* effective value, else the display text.
|
|
15
|
+
*/
|
|
16
|
+
export const getCellSortValue = (cell) => cell.error
|
|
17
|
+
? { sortError: cell.formattedValue ?? "" }
|
|
18
|
+
: (cell.getEffectiveValue() ?? cell.formattedValue);
|
|
19
|
+
/** Excel's ascending order of value types: numbers < text < logicals < errors. */
|
|
20
|
+
const tierOf = (value) => typeof value === "number"
|
|
21
|
+
? 0
|
|
22
|
+
: typeof value === "string"
|
|
23
|
+
? 1
|
|
24
|
+
: typeof value === "boolean"
|
|
25
|
+
? 2
|
|
26
|
+
: 3;
|
|
27
|
+
/**
|
|
28
|
+
* Excel's sort order: numbers < text < logicals < errors, blanks last in
|
|
29
|
+
* BOTH directions, text compared case-insensitively through the collator.
|
|
30
|
+
*/
|
|
6
31
|
export const cellValueSorter = (left, right, sortOrder) => {
|
|
7
32
|
const isEmpty = (value) => {
|
|
8
33
|
if (isNil(value)) {
|
|
@@ -12,7 +37,7 @@ export const cellValueSorter = (left, right, sortOrder) => {
|
|
|
12
37
|
};
|
|
13
38
|
const leftEmpty = isEmpty(left);
|
|
14
39
|
const rightEmpty = isEmpty(right);
|
|
15
|
-
//
|
|
40
|
+
// Blanks stay last regardless of direction.
|
|
16
41
|
if (leftEmpty && rightEmpty) {
|
|
17
42
|
return 0;
|
|
18
43
|
}
|
|
@@ -22,12 +47,26 @@ export const cellValueSorter = (left, right, sortOrder) => {
|
|
|
22
47
|
if (rightEmpty) {
|
|
23
48
|
return -1;
|
|
24
49
|
}
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
50
|
+
const direction = sortOrder === "ASCENDING" ? 1 : -1;
|
|
51
|
+
const leftTier = tierOf(left);
|
|
52
|
+
const rightTier = tierOf(right);
|
|
53
|
+
if (leftTier !== rightTier) {
|
|
54
|
+
return direction * Math.sign(leftTier - rightTier);
|
|
55
|
+
}
|
|
56
|
+
let comparisonResult = 0;
|
|
57
|
+
if (typeof left === "number" && typeof right === "number") {
|
|
58
|
+
comparisonResult = left - right;
|
|
59
|
+
}
|
|
60
|
+
else if (typeof left === "string" && typeof right === "string") {
|
|
61
|
+
comparisonResult = comparator(left, right);
|
|
62
|
+
}
|
|
63
|
+
else if (typeof left === "boolean" && typeof right === "boolean") {
|
|
64
|
+
// FALSE before TRUE.
|
|
65
|
+
comparisonResult = Number(left) - Number(right);
|
|
66
|
+
}
|
|
67
|
+
// Errors compare equal: Excel keeps them in their original order.
|
|
29
68
|
if (comparisonResult !== 0) {
|
|
30
|
-
return
|
|
69
|
+
return direction * Math.sign(comparisonResult);
|
|
31
70
|
}
|
|
32
71
|
return 0;
|
|
33
72
|
};
|
|
@@ -46,6 +46,24 @@ export declare const findTornArray: (arrayRanges: readonly GridRange[] | undefin
|
|
|
46
46
|
* inside the deleted block. */
|
|
47
47
|
export declare const isRangeInsideBand: (range: GridRange, band: StructuralBand) => boolean;
|
|
48
48
|
export declare const isRangeInsideBlock: (outer: GridRange, inner: GridRange) => boolean;
|
|
49
|
+
/**
|
|
50
|
+
* T-07 — the Excel refusal for defining a table over `range` (create / update): another table on
|
|
51
|
+
* the sheet (`table-overlap`, judged first) or a merged cell (`table-merged-cells`). `excludeTableId`
|
|
52
|
+
* leaves the table being edited out. `insertedRows`, when given, is a one-or-more-row insert that
|
|
53
|
+
* runs first (the Create Table dialog's header row): tables and merges wholly inside its band are
|
|
54
|
+
* judged at their shifted position.
|
|
55
|
+
*/
|
|
56
|
+
export declare const getTableRangeRefusal: ({ sheetId, range, tables, merges, excludeTableId, insertedRows, }: {
|
|
57
|
+
sheetId: number;
|
|
58
|
+
range: GridRange;
|
|
59
|
+
tables?: readonly TableView[] | null;
|
|
60
|
+
merges?: readonly GridRange[] | null;
|
|
61
|
+
excludeTableId?: TableView["id"];
|
|
62
|
+
insertedRows?: {
|
|
63
|
+
band: StructuralBand;
|
|
64
|
+
count: number;
|
|
65
|
+
};
|
|
66
|
+
}) => StructuralRefusal | undefined;
|
|
49
67
|
/**
|
|
50
68
|
* The Excel refusal (if any) for an insert/delete-cells shift of `range`. Checks run in Excel's
|
|
51
69
|
* order: array tear, merge tear, table tear, off-sheet push. `undefined` means the edit may proceed.
|
|
@@ -63,6 +81,45 @@ export declare const getShiftCellsRefusal: <T extends CellData>({ direction, ran
|
|
|
63
81
|
tables?: readonly TableView[] | null;
|
|
64
82
|
arrayRanges?: readonly GridRange[] | null;
|
|
65
83
|
}) => StructuralRefusal | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* T-46 — the refusal (if any) for a drag-move / cut of `from` onto `to`. Excel moves a table whole
|
|
86
|
+
* when the block contains it, but refuses to move PART of a table (the block covers some of its
|
|
87
|
+
* cells) and refuses a block landing on another table's cells; a block that is a whole table
|
|
88
|
+
* landing on another table is a table overlap. A same-table column reorder is decided before this.
|
|
89
|
+
*/
|
|
90
|
+
export declare const getMoveRangeRefusal: ({ sheetId, from, to, toSheetId, tables, }: {
|
|
91
|
+
sheetId: number;
|
|
92
|
+
from: GridRange;
|
|
93
|
+
to: GridRange;
|
|
94
|
+
/** The destination sheet — a cut + paste can land on another sheet; defaults to `sheetId`. */
|
|
95
|
+
toSheetId?: number;
|
|
96
|
+
tables?: readonly TableView[] | null;
|
|
97
|
+
}) => StructuralRefusal | undefined;
|
|
98
|
+
/**
|
|
99
|
+
* T-81 — the refusal for a fill whose filled cells (`target` minus `source`) reach a table's totals
|
|
100
|
+
* row. Excel's fill handle never extends over a totals row (the row is derived, not data), so the
|
|
101
|
+
* whole fill is refused and nothing is written. A fill whose source IS the totals row (filling away
|
|
102
|
+
* from the table) is not affected.
|
|
103
|
+
*/
|
|
104
|
+
export declare const getFillTotalsRowRefusal: ({ sheetId, source, target, tables, }: {
|
|
105
|
+
sheetId: number;
|
|
106
|
+
source: GridRange;
|
|
107
|
+
target: GridRange;
|
|
108
|
+
tables?: readonly TableView[] | null;
|
|
109
|
+
}) => StructuralRefusal | undefined;
|
|
110
|
+
/**
|
|
111
|
+
* T-47 — the refusal (if any) for Insert / Delete Table Rows (`axis: "row"`) or Table Columns
|
|
112
|
+
* (`axis: "column"`) on `table`. The edit shifts the cells of the table's band — its columns from
|
|
113
|
+
* the table down to the sheet edge, or its rows from the table right to the sheet edge. Another
|
|
114
|
+
* table wholly inside that band moves with it; one the band reaches but does not contain would be
|
|
115
|
+
* torn apart, so Excel refuses the edit.
|
|
116
|
+
*/
|
|
117
|
+
export declare const getTableEditRefusal: ({ sheetId, table, axis, tables, }: {
|
|
118
|
+
sheetId: number;
|
|
119
|
+
table: TableView;
|
|
120
|
+
axis: "row" | "column";
|
|
121
|
+
tables?: readonly TableView[] | null;
|
|
122
|
+
}) => StructuralRefusal | undefined;
|
|
66
123
|
/**
|
|
67
124
|
* INS-06 / INS-09 — the refusal for a whole-row (`axis: "row"`) or whole-column insert of `count`
|
|
68
125
|
* lines before `referenceIndex`, given the hard grid cap (`maxRowCount` / `maxColumnCount`). Blank
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structural-guards.d.ts","sourceRoot":"","sources":["../../../api/structural-guards.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"structural-guards.d.ts","sourceRoot":"","sources":["../../../api/structural-guards.ts"],"names":[],"mappings":"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"}
|
|
@@ -126,6 +126,31 @@ export const findTornArray = (arrayRanges, band, deletedBlock) => findTornRange(
|
|
|
126
126
|
* inside the deleted block. */
|
|
127
127
|
export const isRangeInsideBand = (range, band) => rangeContains(band, range);
|
|
128
128
|
export const isRangeInsideBlock = rangeContains;
|
|
129
|
+
/**
|
|
130
|
+
* T-07 — the Excel refusal for defining a table over `range` (create / update): another table on
|
|
131
|
+
* the sheet (`table-overlap`, judged first) or a merged cell (`table-merged-cells`). `excludeTableId`
|
|
132
|
+
* leaves the table being edited out. `insertedRows`, when given, is a one-or-more-row insert that
|
|
133
|
+
* runs first (the Create Table dialog's header row): tables and merges wholly inside its band are
|
|
134
|
+
* judged at their shifted position.
|
|
135
|
+
*/
|
|
136
|
+
export const getTableRangeRefusal = ({ sheetId, range, tables, merges, excludeTableId, insertedRows, }) => {
|
|
137
|
+
const shifted = (candidate) => insertedRows && isRangeInsideBand(candidate, insertedRows.band)
|
|
138
|
+
? {
|
|
139
|
+
...candidate,
|
|
140
|
+
startRowIndex: candidate.startRowIndex + insertedRows.count,
|
|
141
|
+
endRowIndex: candidate.endRowIndex + insertedRows.count,
|
|
142
|
+
}
|
|
143
|
+
: candidate;
|
|
144
|
+
if (tables?.some((table) => table.sheetId === sheetId &&
|
|
145
|
+
table.id !== excludeTableId &&
|
|
146
|
+
rangesIntersect(shifted(table.range), range))) {
|
|
147
|
+
return structuralRefusal("table-overlap");
|
|
148
|
+
}
|
|
149
|
+
if (merges?.some((merge) => rangesIntersect(shifted(merge), range))) {
|
|
150
|
+
return structuralRefusal("table-merged-cells");
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
153
|
+
};
|
|
129
154
|
/**
|
|
130
155
|
* The Excel refusal (if any) for an insert/delete-cells shift of `range`. Checks run in Excel's
|
|
131
156
|
* order: array tear, merge tear, table tear, off-sheet push. `undefined` means the edit may proceed.
|
|
@@ -161,6 +186,66 @@ export const getShiftCellsRefusal = ({ direction, range, sheetId, rows, rowCount
|
|
|
161
186
|
}
|
|
162
187
|
return undefined;
|
|
163
188
|
};
|
|
189
|
+
/**
|
|
190
|
+
* T-46 — the refusal (if any) for a drag-move / cut of `from` onto `to`. Excel moves a table whole
|
|
191
|
+
* when the block contains it, but refuses to move PART of a table (the block covers some of its
|
|
192
|
+
* cells) and refuses a block landing on another table's cells; a block that is a whole table
|
|
193
|
+
* landing on another table is a table overlap. A same-table column reorder is decided before this.
|
|
194
|
+
*/
|
|
195
|
+
export const getMoveRangeRefusal = ({ sheetId, from, to, toSheetId = sheetId, tables, }) => {
|
|
196
|
+
const sheetTables = tables?.filter((table) => table.sheetId === sheetId);
|
|
197
|
+
const destinationTables = toSheetId === sheetId
|
|
198
|
+
? sheetTables
|
|
199
|
+
: tables?.filter((table) => table.sheetId === toSheetId);
|
|
200
|
+
if (!sheetTables?.length && !destinationTables?.length)
|
|
201
|
+
return undefined;
|
|
202
|
+
const moved = sheetTables?.filter((table) => rangeContains(from, table.range)) ?? [];
|
|
203
|
+
if (sheetTables?.some((table) => !moved.includes(table) && rangesIntersect(table.range, from))) {
|
|
204
|
+
return structuralRefusal("torn-table");
|
|
205
|
+
}
|
|
206
|
+
if (destinationTables?.some((table) => !moved.includes(table) && rangesIntersect(table.range, to))) {
|
|
207
|
+
return structuralRefusal(moved.length ? "table-overlap" : "torn-table");
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* T-81 — the refusal for a fill whose filled cells (`target` minus `source`) reach a table's totals
|
|
213
|
+
* row. Excel's fill handle never extends over a totals row (the row is derived, not data), so the
|
|
214
|
+
* whole fill is refused and nothing is written. A fill whose source IS the totals row (filling away
|
|
215
|
+
* from the table) is not affected.
|
|
216
|
+
*/
|
|
217
|
+
export const getFillTotalsRowRefusal = ({ sheetId, source, target, tables, }) => tables?.some((table) => {
|
|
218
|
+
if (table.sheetId !== sheetId || !table.totalRow)
|
|
219
|
+
return false;
|
|
220
|
+
const totalsRow = table.range.endRowIndex;
|
|
221
|
+
if (totalsRow < target.startRowIndex || totalsRow > target.endRowIndex) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
const hit = {
|
|
225
|
+
startRowIndex: totalsRow,
|
|
226
|
+
endRowIndex: totalsRow,
|
|
227
|
+
startColumnIndex: Math.max(table.range.startColumnIndex, target.startColumnIndex),
|
|
228
|
+
endColumnIndex: Math.min(table.range.endColumnIndex, target.endColumnIndex),
|
|
229
|
+
};
|
|
230
|
+
return hit.startColumnIndex <= hit.endColumnIndex && !rangeContains(source, hit);
|
|
231
|
+
})
|
|
232
|
+
? structuralRefusal("table-totals-fill")
|
|
233
|
+
: undefined;
|
|
234
|
+
/**
|
|
235
|
+
* T-47 — the refusal (if any) for Insert / Delete Table Rows (`axis: "row"`) or Table Columns
|
|
236
|
+
* (`axis: "column"`) on `table`. The edit shifts the cells of the table's band — its columns from
|
|
237
|
+
* the table down to the sheet edge, or its rows from the table right to the sheet edge. Another
|
|
238
|
+
* table wholly inside that band moves with it; one the band reaches but does not contain would be
|
|
239
|
+
* torn apart, so Excel refuses the edit.
|
|
240
|
+
*/
|
|
241
|
+
export const getTableEditRefusal = ({ sheetId, table, axis, tables, }) => {
|
|
242
|
+
const band = axis === "row"
|
|
243
|
+
? { ...table.range, endRowIndex: Number.POSITIVE_INFINITY }
|
|
244
|
+
: { ...table.range, endColumnIndex: Number.POSITIVE_INFINITY };
|
|
245
|
+
return findTornTable(tables?.filter((other) => other.id !== table.id), sheetId, band)
|
|
246
|
+
? structuralRefusal("torn-table")
|
|
247
|
+
: undefined;
|
|
248
|
+
};
|
|
164
249
|
/**
|
|
165
250
|
* INS-06 / INS-09 — the refusal for a whole-row (`axis: "row"`) or whole-column insert of `count`
|
|
166
251
|
* lines before `referenceIndex`, given the hard grid cap (`maxRowCount` / `maxColumnCount`). Blank
|
|
@@ -27,9 +27,10 @@ export type RemovedTableParts = {
|
|
|
27
27
|
}>;
|
|
28
28
|
};
|
|
29
29
|
/**
|
|
30
|
-
* Which tables / table columns `deleteRow` (a table goes
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* Which tables / table columns `deleteRow` (a table goes only when every one
|
|
31
|
+
* of its rows is deleted — losing its header row keeps it, the next row
|
|
32
|
+
* becomes the header) or `deleteColumn` (a table goes when every column is
|
|
33
|
+
* deleted; otherwise the covered columns are spliced out) removes for the band
|
|
33
34
|
* `[minIndex, maxIndex]` on `sheetId`. Mirrors the table updates those
|
|
34
35
|
* interfaces apply to `tables`.
|
|
35
36
|
*/
|
|
@@ -59,6 +60,60 @@ export type BreakStructuredRefsParams<T extends CellData> = {
|
|
|
59
60
|
* when it is available (cost O(formula cells)); without one the draft is swept.
|
|
60
61
|
*/
|
|
61
62
|
export declare const breakStructuredRefsForRemovedTableParts: <T extends CellData>({ draft, sheetId, axis, referenceIndex, count, removed, getGraphNodes, enqueueCalculation, enqueueGraphOperation, recalcCells, locale, cellXfsRegistry, sharedStringRegistry, }: BreakStructuredRefsParams<T>) => void;
|
|
63
|
+
export type RewriteFormulasParams<T extends CellData> = Pick<BreakStructuredRefsParams<T>, "draft" | "getGraphNodes" | "enqueueCalculation" | "enqueueGraphOperation" | "recalcCells" | "locale" | "cellXfsRegistry" | "sharedStringRegistry">;
|
|
64
|
+
/**
|
|
65
|
+
* Column `oldName` of `table` was renamed `newName` (a header-cell edit):
|
|
66
|
+
* rewrite every structured reference to it across the workbook, including the
|
|
67
|
+
* bare `[@Old]` forms of the formulas that sit inside the table.
|
|
68
|
+
*/
|
|
69
|
+
export declare const renameTableColumnInFormulas: <T extends CellData>({ table, oldName, newName, ...params }: RewriteFormulasParams<T> & {
|
|
70
|
+
table: Pick<TableView, "title" | "sheetId" | "range">;
|
|
71
|
+
oldName: string;
|
|
72
|
+
newName: string;
|
|
73
|
+
}) => void;
|
|
74
|
+
/**
|
|
75
|
+
* Several columns of `table` were renamed at once (a header row re-derived
|
|
76
|
+
* after a row delete, several header cells written by one paste /
|
|
77
|
+
* change-batch): `renames` maps each LOWER-CASED old name to its new name and
|
|
78
|
+
* every formula is rewritten in ONE pass, so `Name` → `Qty` and `Qty` → `Name`
|
|
79
|
+
* swap instead of chaining into the same column.
|
|
80
|
+
*/
|
|
81
|
+
export declare const renameTableColumnsInFormulas: <T extends CellData>({ table, renames, ...params }: RewriteFormulasParams<T> & {
|
|
82
|
+
table: Pick<TableView, "title" | "sheetId" | "range">;
|
|
83
|
+
renames: ReadonlyMap<string, string>;
|
|
84
|
+
}) => void;
|
|
85
|
+
/**
|
|
86
|
+
* The header cells one write renamed (`planHeaderCellRenames`), applied per
|
|
87
|
+
* table as a single multi-column rename.
|
|
88
|
+
*/
|
|
89
|
+
export declare const renameHeaderCellsInFormulas: <T extends CellData>({ headerRenames, ...params }: RewriteFormulasParams<T> & {
|
|
90
|
+
headerRenames: readonly {
|
|
91
|
+
table: Pick<TableView, "id" | "title" | "sheetId" | "range">;
|
|
92
|
+
oldName: string | undefined;
|
|
93
|
+
newName: string;
|
|
94
|
+
}[];
|
|
95
|
+
}) => void;
|
|
96
|
+
/**
|
|
97
|
+
* `table` is being converted to a range (Excel's Convert to Range): rewrite
|
|
98
|
+
* every structured reference into it across the workbook to the A1 reference
|
|
99
|
+
* it resolves to — `T[Col]` → `$B$2:$B$9`, `[@Col]` → `B3`,
|
|
100
|
+
* `T[[#Headers],[Col]]` → `$B$1`, qualified with the table's sheet from another
|
|
101
|
+
* sheet — so the formulas keep their values once the table is gone. Runs
|
|
102
|
+
* BEFORE the table is removed; the bare `[@Col]` forms belong to the formulas
|
|
103
|
+
* that sit inside the table.
|
|
104
|
+
*/
|
|
105
|
+
export declare const convertTableReferencesToA1InFormulas: <T extends CellData>({ table, getSheetName, ...params }: RewriteFormulasParams<T> & {
|
|
106
|
+
table: Pick<TableView, "title" | "sheetId" | "range" | "headerRow" | "totalRow" | "columns">;
|
|
107
|
+
getSheetName(sheetId: number): string;
|
|
108
|
+
}) => void;
|
|
109
|
+
/**
|
|
110
|
+
* Table `oldName` was renamed `newName` (the Edit Table dialog / `updateTable`):
|
|
111
|
+
* rewrite `Old[…]` → `New[…]` in every formula across the workbook.
|
|
112
|
+
*/
|
|
113
|
+
export declare const renameTableInFormulas: <T extends CellData>({ oldName, newName, ...params }: RewriteFormulasParams<T> & {
|
|
114
|
+
oldName: string;
|
|
115
|
+
newName: string;
|
|
116
|
+
}) => void;
|
|
62
117
|
/**
|
|
63
118
|
* Drop the materialised spill cells of every dynamic-array anchor that sits
|
|
64
119
|
* inside the deleted band `[minIndex, maxIndex]` (rows or columns) of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structural-table-refs.d.ts","sourceRoot":"","sources":["../../../api/structural-table-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAMrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"structural-table-refs.d.ts","sourceRoot":"","sources":["../../../api/structural-table-refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { isCellNode } from "@rowsncolumns/dag";
|
|
2
2
|
import { addressToCell, getCellUserEnteredValue, getExtendedValueFormula, } from "@rowsncolumns/utils";
|
|
3
3
|
import { SheetCell } from "../sheet-cell";
|
|
4
|
-
import { breakTableColumnsInFormula, breakTableReferencesInFormula, createSheetCellIdentifier, } from "./formula";
|
|
4
|
+
import { breakTableColumnsInFormula, breakTableReferencesInFormula, convertStructuredRefsToA1InFormula, createSheetCellIdentifier, renameTableColumnsInFormula, renameTableInFormula, } from "./formula";
|
|
5
5
|
import { createSheetDraft } from "./immer-utils";
|
|
6
6
|
/**
|
|
7
|
-
* Which tables / table columns `deleteRow` (a table goes
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Which tables / table columns `deleteRow` (a table goes only when every one
|
|
8
|
+
* of its rows is deleted — losing its header row keeps it, the next row
|
|
9
|
+
* becomes the header) or `deleteColumn` (a table goes when every column is
|
|
10
|
+
* deleted; otherwise the covered columns are spliced out) removes for the band
|
|
10
11
|
* `[minIndex, maxIndex]` on `sheetId`. Mirrors the table updates those
|
|
11
12
|
* interfaces apply to `tables`.
|
|
12
13
|
*/
|
|
@@ -16,8 +17,8 @@ export const collectRemovedTableParts = (tables, sheetId, axis, minIndex, maxInd
|
|
|
16
17
|
if (table.sheetId !== sheetId || !table.title)
|
|
17
18
|
continue;
|
|
18
19
|
if (axis === "row") {
|
|
19
|
-
const { startRowIndex } = table.range;
|
|
20
|
-
if (
|
|
20
|
+
const { startRowIndex, endRowIndex } = table.range;
|
|
21
|
+
if (minIndex <= startRowIndex && maxIndex >= endRowIndex) {
|
|
21
22
|
removed.tables.push(table.title);
|
|
22
23
|
}
|
|
23
24
|
continue;
|
|
@@ -107,6 +108,125 @@ export const breakStructuredRefsForRemovedTableParts = ({ draft, sheetId, axis,
|
|
|
107
108
|
recalcCells.set(createSheetCellIdentifier(nextPosition.sheetId, nextPosition.rowIndex, nextPosition.columnIndex), { ...nextPosition, force: true });
|
|
108
109
|
}
|
|
109
110
|
};
|
|
111
|
+
/**
|
|
112
|
+
* Apply `rewrite` to the text of every formula cell across all sheets (from
|
|
113
|
+
* the dependency graph when available, else a draft sweep), writing back the
|
|
114
|
+
* ones it changed and re-entering them in the graph for recalculation. Cells
|
|
115
|
+
* keep their position — this is the in-place rewrite behind a table / table
|
|
116
|
+
* column rename.
|
|
117
|
+
*/
|
|
118
|
+
const rewriteFormulasInDraft = ({ draft, getGraphNodes, enqueueCalculation, enqueueGraphOperation, recalcCells, locale, cellXfsRegistry, sharedStringRegistry, }, rewrite) => {
|
|
119
|
+
const sheetCell = new SheetCell();
|
|
120
|
+
for (const pos of collectFormulaPositions(draft, getGraphNodes)) {
|
|
121
|
+
const currentSheet = createSheetDraft(draft, pos.sheetId, pos.rowIndex);
|
|
122
|
+
const cellData = currentSheet[pos.rowIndex]?.values?.[pos.columnIndex];
|
|
123
|
+
const formula = getExtendedValueFormula(getCellUserEnteredValue(cellData));
|
|
124
|
+
if (!formula || !formula.includes("["))
|
|
125
|
+
continue;
|
|
126
|
+
const updated = rewrite(formula, pos);
|
|
127
|
+
if (updated === formula)
|
|
128
|
+
continue;
|
|
129
|
+
sheetCell.assign(pos.sheetId, { rowIndex: pos.rowIndex, columnIndex: pos.columnIndex }, cellData, { locale, cellXfsRegistry, sharedStringRegistry });
|
|
130
|
+
sheetCell.setFormulaValue(updated, false);
|
|
131
|
+
currentSheet[pos.rowIndex].values[pos.columnIndex] =
|
|
132
|
+
sheetCell.getCellData();
|
|
133
|
+
const enqueueOperation = sheetCell.ephemeral()
|
|
134
|
+
? enqueueCalculation
|
|
135
|
+
: enqueueGraphOperation;
|
|
136
|
+
enqueueOperation?.({ type: "remove", position: pos });
|
|
137
|
+
enqueueOperation?.({ type: "add", position: pos, force: true });
|
|
138
|
+
recalcCells.set(createSheetCellIdentifier(pos.sheetId, pos.rowIndex, pos.columnIndex), { ...pos, force: true });
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* Column `oldName` of `table` was renamed `newName` (a header-cell edit):
|
|
143
|
+
* rewrite every structured reference to it across the workbook, including the
|
|
144
|
+
* bare `[@Old]` forms of the formulas that sit inside the table.
|
|
145
|
+
*/
|
|
146
|
+
export const renameTableColumnInFormulas = ({ table, oldName, newName, ...params }) => {
|
|
147
|
+
if (!oldName || !newName || oldName === newName)
|
|
148
|
+
return;
|
|
149
|
+
renameTableColumnsInFormulas({
|
|
150
|
+
...params,
|
|
151
|
+
table,
|
|
152
|
+
renames: new Map([[oldName.toLowerCase(), newName]]),
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Several columns of `table` were renamed at once (a header row re-derived
|
|
157
|
+
* after a row delete, several header cells written by one paste /
|
|
158
|
+
* change-batch): `renames` maps each LOWER-CASED old name to its new name and
|
|
159
|
+
* every formula is rewritten in ONE pass, so `Name` → `Qty` and `Qty` → `Name`
|
|
160
|
+
* swap instead of chaining into the same column.
|
|
161
|
+
*/
|
|
162
|
+
export const renameTableColumnsInFormulas = ({ table, renames, ...params }) => {
|
|
163
|
+
if (renames.size === 0)
|
|
164
|
+
return;
|
|
165
|
+
rewriteFormulasInDraft(params, (formula, pos) => {
|
|
166
|
+
let updated = table.title
|
|
167
|
+
? renameTableColumnsInFormula(formula, table.title, renames)
|
|
168
|
+
: formula;
|
|
169
|
+
if (pos.sheetId === table.sheetId &&
|
|
170
|
+
isWithinRange(table.range, pos.rowIndex, pos.columnIndex)) {
|
|
171
|
+
updated = renameTableColumnsInFormula(updated, undefined, renames);
|
|
172
|
+
}
|
|
173
|
+
return updated;
|
|
174
|
+
});
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* The header cells one write renamed (`planHeaderCellRenames`), applied per
|
|
178
|
+
* table as a single multi-column rename.
|
|
179
|
+
*/
|
|
180
|
+
export const renameHeaderCellsInFormulas = ({ headerRenames, ...params }) => {
|
|
181
|
+
const byTable = new Map();
|
|
182
|
+
for (const { table, oldName, newName } of headerRenames) {
|
|
183
|
+
if (!oldName || oldName === newName)
|
|
184
|
+
continue;
|
|
185
|
+
const entry = byTable.get(table.id) ?? { table, renames: new Map() };
|
|
186
|
+
entry.renames.set(oldName.toLowerCase(), newName);
|
|
187
|
+
byTable.set(table.id, entry);
|
|
188
|
+
}
|
|
189
|
+
for (const { table, renames } of byTable.values()) {
|
|
190
|
+
renameTableColumnsInFormulas({ ...params, table, renames });
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
/**
|
|
194
|
+
* `table` is being converted to a range (Excel's Convert to Range): rewrite
|
|
195
|
+
* every structured reference into it across the workbook to the A1 reference
|
|
196
|
+
* it resolves to — `T[Col]` → `$B$2:$B$9`, `[@Col]` → `B3`,
|
|
197
|
+
* `T[[#Headers],[Col]]` → `$B$1`, qualified with the table's sheet from another
|
|
198
|
+
* sheet — so the formulas keep their values once the table is gone. Runs
|
|
199
|
+
* BEFORE the table is removed; the bare `[@Col]` forms belong to the formulas
|
|
200
|
+
* that sit inside the table.
|
|
201
|
+
*/
|
|
202
|
+
export const convertTableReferencesToA1InFormulas = ({ table, getSheetName, ...params }) => {
|
|
203
|
+
if (!table.title)
|
|
204
|
+
return;
|
|
205
|
+
const target = {
|
|
206
|
+
title: table.title,
|
|
207
|
+
range: table.range,
|
|
208
|
+
headerRow: table.headerRow,
|
|
209
|
+
totalRow: table.totalRow,
|
|
210
|
+
columnNames: (table.columns ?? []).map((column) => column.name),
|
|
211
|
+
};
|
|
212
|
+
const tableSheetName = getSheetName(table.sheetId);
|
|
213
|
+
rewriteFormulasInDraft(params, (formula, pos) => convertStructuredRefsToA1InFormula(formula, target, {
|
|
214
|
+
tableSheetName,
|
|
215
|
+
formulaSheetName: getSheetName(pos.sheetId),
|
|
216
|
+
formulaRowIndex: pos.rowIndex,
|
|
217
|
+
inTable: pos.sheetId === table.sheetId &&
|
|
218
|
+
isWithinRange(table.range, pos.rowIndex, pos.columnIndex),
|
|
219
|
+
}));
|
|
220
|
+
};
|
|
221
|
+
/**
|
|
222
|
+
* Table `oldName` was renamed `newName` (the Edit Table dialog / `updateTable`):
|
|
223
|
+
* rewrite `Old[…]` → `New[…]` in every formula across the workbook.
|
|
224
|
+
*/
|
|
225
|
+
export const renameTableInFormulas = ({ oldName, newName, ...params }) => {
|
|
226
|
+
if (!oldName || !newName || oldName === newName)
|
|
227
|
+
return;
|
|
228
|
+
rewriteFormulasInDraft(params, (formula) => renameTableInFormula(formula, oldName, newName));
|
|
229
|
+
};
|
|
110
230
|
const collectFormulaPositions = (draft, getGraphNodes) => {
|
|
111
231
|
if (getGraphNodes) {
|
|
112
232
|
let graphNodes;
|
|
@@ -30,22 +30,29 @@ export type SubtotalWrite = {
|
|
|
30
30
|
values: (string | null)[];
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
33
|
-
* The plan applies in this order
|
|
34
|
-
* (the sheet after all removals and insertions):
|
|
33
|
+
* The plan applies in this order:
|
|
35
34
|
* 1. `deleteRows` (descending original indexes — existing subtotal rows),
|
|
36
|
-
* 2. `
|
|
35
|
+
* 2. `ungroupRows`: one `ungroup-rows` call per entry — the outline reset of
|
|
36
|
+
* "Replace current subtotals" — in the coordinates of the sheet AFTER the
|
|
37
|
+
* deletes and BEFORE the inserts (the surviving data rows, compacted).
|
|
38
|
+
* Group / ungroup are ±1 steps in both engines, so pass `k` lists the
|
|
39
|
+
* surviving data rows that were deeper than level `k`; after the passes
|
|
40
|
+
* every surviving row is back at level 0 (empty when nothing was outlined
|
|
41
|
+
* or when not replacing). The reset has to precede the inserts: an
|
|
42
|
+
* inserted row takes the row above's outline level in both engines
|
|
43
|
+
* (Excel's "Format Same As Above" — a row inserted inside a group joins
|
|
44
|
+
* it), so the total rows must be inserted next to level-0 rows — Excel's
|
|
45
|
+
* own order: remove the subtotals, rows and outline, then apply afresh.
|
|
46
|
+
* 3. `insertRows` ascending, in FINAL coordinates (the sheet after all
|
|
47
|
+
* removals and insertions): inserting at final row `r` shifts the not-yet
|
|
37
48
|
* final rows below it, so ascending order lands each new row exactly
|
|
38
49
|
* where the plan expects it,
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* 5. `outlineGroups`: one `group-rows` call per entry (Excel's levels — the
|
|
46
|
-
* first spans every row above the grand total, the second the detail
|
|
47
|
-
* rows of each group, so detail rows end at level 2 and subtotal rows
|
|
48
|
-
* at level 1 — the same three-level outline on every re-apply).
|
|
50
|
+
* 4. `writes` (labels + SUBTOTAL formulas), final coordinates, then
|
|
51
|
+
* 5. `outlineGroups`: one `group-rows` call per entry, final coordinates
|
|
52
|
+
* (Excel's levels — the first spans every row above the grand total, the
|
|
53
|
+
* second the detail rows of each group, so detail rows end at level 2 and
|
|
54
|
+
* subtotal rows at level 1 — the same three-level outline on every
|
|
55
|
+
* re-apply).
|
|
49
56
|
*/
|
|
50
57
|
export type SubtotalPlan = {
|
|
51
58
|
deleteRows: number[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subtotal.d.ts","sourceRoot":"","sources":["../../../api/subtotal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAYtE,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AACxD,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,WACP,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAClG,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1E,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC5D,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC3B,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"subtotal.d.ts","sourceRoot":"","sources":["../../../api/subtotal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAYtE,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AACxD,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,WACP,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAClG,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1E,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC5D,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,WAAW,EAAE,SAAS,CAAC;CACxB,CAAC;AAcF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,eAAe,EACxB,QAAQ,cAAc,KACrB,YAAY,GAAG,SA8HjB,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7D,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,KACxB,IAAI,CAAC;IACV,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7D,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,MAAM,YAAY,EAClB,UAAU,oBAAoB,SA0B/B,CAAC"}
|
package/dist/esm/api/subtotal.js
CHANGED
|
@@ -109,19 +109,24 @@ export const planSubtotals = (options, reader) => {
|
|
|
109
109
|
return values;
|
|
110
110
|
};
|
|
111
111
|
// "Replace current subtotals": the surviving data rows carry the previous
|
|
112
|
-
// outline (detail rows at 2, or deeper after repeated applies)
|
|
113
|
-
//
|
|
114
|
-
//
|
|
112
|
+
// outline (detail rows at 2, or deeper after repeated applies) past the
|
|
113
|
+
// deletes, and a total row inserted below one of them would inherit that
|
|
114
|
+
// level (both engines give an inserted row the row above's outline level).
|
|
115
|
+
// So the reset runs between the deletes and the inserts, addressed to the
|
|
116
|
+
// compacted survivors — the k-th surviving data row sits at
|
|
117
|
+
// `firstDataRow + k` once the old total rows are gone — and records how
|
|
118
|
+
// many ungroup steps each needs before the fresh levels go on.
|
|
115
119
|
const ungroupRows = [];
|
|
116
120
|
let dataRowCursor = 0;
|
|
117
121
|
let cursor = firstDataRow;
|
|
118
122
|
for (const group of groups) {
|
|
119
123
|
const groupStart = cursor;
|
|
120
124
|
for (let i = 0; i < group.size; i++) {
|
|
125
|
+
const compactedRow = firstDataRow + dataRowCursor;
|
|
121
126
|
const originalRow = dataRows[dataRowCursor++];
|
|
122
127
|
const level = replaceCurrent ? (reader.getOutlineLevel?.(originalRow) ?? 0) : 0;
|
|
123
128
|
for (let pass = 0; pass < level; pass++) {
|
|
124
|
-
(ungroupRows[pass] ??= []).push(
|
|
129
|
+
(ungroupRows[pass] ??= []).push(compactedRow);
|
|
125
130
|
}
|
|
126
131
|
detailRows.push(cursor++);
|
|
127
132
|
}
|
|
@@ -159,6 +164,12 @@ export const planSubtotals = (options, reader) => {
|
|
|
159
164
|
export const applySubtotalPlan = (sheetId, plan, executor) => {
|
|
160
165
|
if (plan.deleteRows.length)
|
|
161
166
|
executor.onDeleteRow(sheetId, plan.deleteRows);
|
|
167
|
+
// Outline reset before the inserts: the new total rows inherit the level of
|
|
168
|
+
// the row above them, which must already be 0 (see `SubtotalPlan`).
|
|
169
|
+
for (const rows of plan.ungroupRows) {
|
|
170
|
+
if (rows.length)
|
|
171
|
+
executor.onUngroupRows(sheetId, rows);
|
|
172
|
+
}
|
|
162
173
|
for (const rowIndex of plan.insertRows) {
|
|
163
174
|
executor.onInsertRow(sheetId, rowIndex, 1);
|
|
164
175
|
}
|
|
@@ -170,10 +181,6 @@ export const applySubtotalPlan = (sheetId, plan, executor) => {
|
|
|
170
181
|
endColumnIndex: write.startColumnIndex + write.values.length - 1,
|
|
171
182
|
}, [write.values]);
|
|
172
183
|
}
|
|
173
|
-
for (const rows of plan.ungroupRows) {
|
|
174
|
-
if (rows.length)
|
|
175
|
-
executor.onUngroupRows(sheetId, rows);
|
|
176
|
-
}
|
|
177
184
|
for (const rows of plan.outlineGroups) {
|
|
178
185
|
if (rows.length)
|
|
179
186
|
executor.onGroupRows(sheetId, rows);
|