@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/formula.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cleanupColumnName, cleanupTableName, isRangeToken, lexify, stripPropertyFromCellRef, tokenVocabulary, } from "@rowsncolumns/calculator";
|
|
1
|
+
import { cleanupColumnName, cleanupSpecialItem, cleanupTableName, detectCurrentRow, isRangeToken, lexify, stripPropertyFromCellRef, tokenVocabulary, } from "@rowsncolumns/calculator";
|
|
2
2
|
import { addressToCell, alpha2number, cellToAddress, desanitizeSheetName, number2Alpha, sanitizeSheetName, } from "@rowsncolumns/utils";
|
|
3
3
|
export { ERROR_CIRCULAR_DEPENDENCY, ERROR_REFERENCE, formulaToRelativeReference, } from "@rowsncolumns/calculator";
|
|
4
4
|
/**
|
|
@@ -151,11 +151,79 @@ export const breakTableReferencesInFormula = (formulaValue, tableName) => {
|
|
|
151
151
|
* Excel's text for a deleted table column (`=Table1[@Qty]*2` →
|
|
152
152
|
* `=Table1[@#REF!]*2`). Keeps every other character of the reference as typed.
|
|
153
153
|
*/
|
|
154
|
-
export const breakTableColumnsInFormula = (formulaValue, tableName, columnNames) =>
|
|
155
|
-
|
|
154
|
+
export const breakTableColumnsInFormula = (formulaValue, tableName, columnNames) => replaceTableColumnsInFormula(formulaValue, tableName, columnNames, REF_ERROR_COLUMN);
|
|
155
|
+
/**
|
|
156
|
+
* Rename the column `oldName` → `newName` inside the structured references to
|
|
157
|
+
* `tableName` (or, when `tableName` is undefined, the bare this-row form
|
|
158
|
+
* `[@Col]` whose table is implied by the formula's own cell): `Table1[Qty]`,
|
|
159
|
+
* `[@Qty]`, `Table1[[#Headers],[Qty]]` and `Table1[[Qty]:[Price]]` all follow
|
|
160
|
+
* a header-cell edit in Excel. Column names compare case-insensitively; every
|
|
161
|
+
* other character of the reference is kept as typed.
|
|
162
|
+
*/
|
|
163
|
+
export const renameTableColumnInFormula = (formulaValue, tableName, oldName, newName) => oldName && newName && oldName !== newName
|
|
164
|
+
? renameTableColumnsInFormula(formulaValue, tableName, new Map([[oldName.toLowerCase(), newName]]))
|
|
165
|
+
: formulaValue;
|
|
166
|
+
/**
|
|
167
|
+
* Rename several columns of `tableName` at once — `renames` maps each
|
|
168
|
+
* LOWER-CASED old name to its new name. One pass over the formula, so
|
|
169
|
+
* `Name` → `Qty` and `Qty` → `Name` swap instead of chaining into the same
|
|
170
|
+
* column (a header row re-derived after a row delete, or several header cells
|
|
171
|
+
* written by one paste / change-batch).
|
|
172
|
+
*/
|
|
173
|
+
export const renameTableColumnsInFormula = (formulaValue, tableName, renames) => rewriteTableColumnsInFormula(formulaValue, tableName, (name) => renames.get(name));
|
|
174
|
+
/**
|
|
175
|
+
* Rename the table `oldName` → `newName` in every structured reference
|
|
176
|
+
* (`Old[Col]`, `Old[@Col]`, `Old[[#Headers],[Col]]`, `Old[#All]`) — Excel
|
|
177
|
+
* rewrites them all when a table is renamed. Table names compare
|
|
178
|
+
* case-insensitively; the bare `[@Col]` form names no table and is left alone.
|
|
179
|
+
*/
|
|
180
|
+
export const renameTableInFormula = (formulaValue, oldName, newName) => {
|
|
181
|
+
if (!oldName || !newName || oldName === newName) {
|
|
182
|
+
return formulaValue;
|
|
183
|
+
}
|
|
184
|
+
return renameTablesInFormula(formulaValue, new Map([[oldName.toLowerCase(), newName]]));
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Rename several tables at once — `renames` maps each LOWER-CASED old name to
|
|
188
|
+
* its new name. One pass, so `Sales` → `Sales2` and `Sales2` → `Sales3` never
|
|
189
|
+
* chain (a sheet duplicated with both tables re-points each reference exactly
|
|
190
|
+
* once).
|
|
191
|
+
*/
|
|
192
|
+
export const renameTablesInFormula = (formulaValue, renames) => {
|
|
193
|
+
if (!formulaValue.includes("[") || renames.size === 0) {
|
|
194
|
+
return formulaValue;
|
|
195
|
+
}
|
|
196
|
+
const tokens = cloneTokens(lexify(formulaValue).tokens);
|
|
197
|
+
let hasChanges = false;
|
|
198
|
+
for (const token of tokens) {
|
|
199
|
+
if (!isTableNameToken(token))
|
|
200
|
+
continue;
|
|
201
|
+
const newName = renames.get(cleanupTableName(token.image).trim().toLowerCase());
|
|
202
|
+
if (newName === undefined)
|
|
203
|
+
continue;
|
|
204
|
+
// The image is the name as typed plus its opening bracket.
|
|
205
|
+
token.image = newName + token.image.slice(token.image.indexOf("["));
|
|
206
|
+
hasChanges = true;
|
|
207
|
+
}
|
|
208
|
+
return hasChanges ? detokenize(tokens) : formulaValue;
|
|
209
|
+
};
|
|
210
|
+
const replaceTableColumnsInFormula = (formulaValue, tableName, columnNames, replacement) => {
|
|
211
|
+
if (columnNames.length === 0) {
|
|
156
212
|
return formulaValue;
|
|
157
213
|
}
|
|
158
214
|
const targets = new Set(columnNames.map((name) => name.toLowerCase()));
|
|
215
|
+
return rewriteTableColumnsInFormula(formulaValue, tableName, (name) => targets.has(name) ? replacement : undefined);
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
218
|
+
* Rewrite the column items of every structured reference into `tableName`
|
|
219
|
+
* (or, when undefined, the bare `[@Col]` forms) through `resolve`, which maps
|
|
220
|
+
* a LOWER-CASED column name to its replacement or `undefined` to leave it.
|
|
221
|
+
* Each item is resolved once, so a set of renames applies in a single pass.
|
|
222
|
+
*/
|
|
223
|
+
const rewriteTableColumnsInFormula = (formulaValue, tableName, resolve) => {
|
|
224
|
+
if (!formulaValue.includes("[")) {
|
|
225
|
+
return formulaValue;
|
|
226
|
+
}
|
|
159
227
|
const target = tableName?.toLowerCase();
|
|
160
228
|
const tokens = cloneTokens(lexify(formulaValue).tokens);
|
|
161
229
|
let hasChanges = false;
|
|
@@ -168,8 +236,9 @@ export const breakTableColumnsInFormula = (formulaValue, tableName, columnNames)
|
|
|
168
236
|
cleanupTableName(token.image).trim().toLowerCase() === target;
|
|
169
237
|
if (matches) {
|
|
170
238
|
for (let j = i + 1; j < end; j++) {
|
|
171
|
-
if (
|
|
239
|
+
if (replaceColumnToken(tokens[j], resolve)) {
|
|
172
240
|
hasChanges = true;
|
|
241
|
+
}
|
|
173
242
|
}
|
|
174
243
|
}
|
|
175
244
|
i = end;
|
|
@@ -177,26 +246,184 @@ export const breakTableColumnsInFormula = (formulaValue, tableName, columnNames)
|
|
|
177
246
|
}
|
|
178
247
|
// A bare `[@Col]` / `[Col]` names the table the formula cell sits in.
|
|
179
248
|
if (target === undefined && isTableColumnToken(token)) {
|
|
180
|
-
if (
|
|
249
|
+
if (replaceColumnToken(token, resolve))
|
|
181
250
|
hasChanges = true;
|
|
182
251
|
}
|
|
183
252
|
i++;
|
|
184
253
|
}
|
|
185
254
|
return hasChanges ? detokenize(tokens) : formulaValue;
|
|
186
255
|
};
|
|
187
|
-
const
|
|
256
|
+
const replaceColumnToken = (token, resolve) => {
|
|
188
257
|
if (!token || !isTableColumnToken(token))
|
|
189
258
|
return false;
|
|
190
259
|
const name = cleanupColumnName(token.image);
|
|
191
|
-
if (!name
|
|
260
|
+
if (!name)
|
|
261
|
+
return false;
|
|
262
|
+
const replacement = resolve(name.toLowerCase());
|
|
263
|
+
if (replacement === undefined)
|
|
192
264
|
return false;
|
|
193
265
|
const at = token.image.indexOf(name);
|
|
194
266
|
if (at === -1)
|
|
195
267
|
return false;
|
|
196
268
|
token.image =
|
|
197
|
-
token.image.slice(0, at) +
|
|
269
|
+
token.image.slice(0, at) + replacement + token.image.slice(at + name.length);
|
|
198
270
|
return true;
|
|
199
271
|
};
|
|
272
|
+
/**
|
|
273
|
+
* Rewrite every structured reference into `table` — `T[Col]`, `T[[#Headers],[Col]]`, `T[#All]`,
|
|
274
|
+
* `T[[A]:[B]]`, `T[@Col]`, `T[[#This Row],[Col]]` and, inside the table, the bare `[@Col]` /
|
|
275
|
+
* `[Col]` forms — to the plain A1 reference it resolves to, the way Excel's Convert to Range
|
|
276
|
+
* rewrites formulas so their values keep working once the table is gone. Column, header, totals
|
|
277
|
+
* and whole-table items become absolute (`$B$2:$B$9`, `$B$1`), this-row items the relative
|
|
278
|
+
* same-row reference (`B3`), and the reference is qualified with the table's sheet when the
|
|
279
|
+
* formula lives on another one. A reference that cannot resolve (an unknown column, `#Headers`
|
|
280
|
+
* on a headerless table, `@` outside the table's data rows) becomes the `#REF!` it would have
|
|
281
|
+
* evaluated to. Returns the input unchanged when the formula never references the table.
|
|
282
|
+
*/
|
|
283
|
+
export const convertStructuredRefsToA1InFormula = (formulaValue, table, options) => {
|
|
284
|
+
if (!formulaValue.includes("["))
|
|
285
|
+
return formulaValue;
|
|
286
|
+
const target = table.title.toLowerCase();
|
|
287
|
+
const tokens = cloneTokens(lexify(formulaValue).tokens);
|
|
288
|
+
const newTokens = [];
|
|
289
|
+
let hasChanges = false;
|
|
290
|
+
let i = 0;
|
|
291
|
+
while (i < tokens.length) {
|
|
292
|
+
const token = tokens[i];
|
|
293
|
+
if (isTableNameToken(token)) {
|
|
294
|
+
const end = structuredReferenceEnd(tokens, i);
|
|
295
|
+
if (cleanupTableName(token.image).trim().toLowerCase() !== target) {
|
|
296
|
+
// Another table's reference: keep it whole (its `@Col` items are not bare forms).
|
|
297
|
+
newTokens.push(...tokens.slice(i, end));
|
|
298
|
+
i = end;
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
newTokens.push(collapseToReference(token, tokens[end - 1], resolveStructuredReference(table, tokens.slice(i + 1, end), options)));
|
|
302
|
+
hasChanges = true;
|
|
303
|
+
i = end;
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
// A bare `[@Col]` / `[Col]` names the table the formula cell sits in.
|
|
307
|
+
if (options.inTable &&
|
|
308
|
+
isTableColumnToken(token) &&
|
|
309
|
+
token.image.startsWith("[")) {
|
|
310
|
+
const end = structuredReferenceEnd(tokens, i);
|
|
311
|
+
newTokens.push(collapseToReference(token, tokens[end - 1], resolveStructuredReference(table, tokens.slice(i, end), options)));
|
|
312
|
+
hasChanges = true;
|
|
313
|
+
i = end;
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
newTokens.push(token);
|
|
317
|
+
i++;
|
|
318
|
+
}
|
|
319
|
+
return hasChanges ? detokenize(newTokens) : formulaValue;
|
|
320
|
+
};
|
|
321
|
+
/** One reference token (or `#REF!`) standing in for the run `start … end` (see `collapseToRefError`). */
|
|
322
|
+
const collapseToReference = (start, end, image) => ({
|
|
323
|
+
...start,
|
|
324
|
+
image,
|
|
325
|
+
tokenType: image === REF_ERROR_TOKEN
|
|
326
|
+
? tokenVocabulary.RefError
|
|
327
|
+
: tokenVocabulary.Cell,
|
|
328
|
+
endOffset: end?.endOffset ?? start.endOffset,
|
|
329
|
+
endColumn: end?.endColumn ?? start.endColumn,
|
|
330
|
+
});
|
|
331
|
+
/**
|
|
332
|
+
* The A1 text the structured-reference `specifier` tokens (everything after the table name up to
|
|
333
|
+
* the closing bracket, or the bare column form) resolve to against `table`, or `#REF!`.
|
|
334
|
+
*/
|
|
335
|
+
const resolveStructuredReference = (table, specifier, { tableSheetName, formulaSheetName, formulaRowIndex }) => {
|
|
336
|
+
let thisRow = false;
|
|
337
|
+
const items = new Set();
|
|
338
|
+
const columns = [];
|
|
339
|
+
for (const token of specifier) {
|
|
340
|
+
const name = token.tokenType.name;
|
|
341
|
+
if (name === tokenVocabulary.SpecialItem.name) {
|
|
342
|
+
const item = cleanupSpecialItem(token.image).trim().toLowerCase();
|
|
343
|
+
if (item === "#this row")
|
|
344
|
+
thisRow = true;
|
|
345
|
+
else
|
|
346
|
+
items.add(item);
|
|
347
|
+
}
|
|
348
|
+
else if (name === tokenVocabulary.TableColumnName.name) {
|
|
349
|
+
if (detectCurrentRow(token.image))
|
|
350
|
+
thisRow = true;
|
|
351
|
+
const column = cleanupColumnName(token.image).trim();
|
|
352
|
+
if (column)
|
|
353
|
+
columns.push(column);
|
|
354
|
+
}
|
|
355
|
+
else if (name === tokenVocabulary.At.name) {
|
|
356
|
+
thisRow = true;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
const { range } = table;
|
|
360
|
+
const headerRow = table.headerRow ?? true;
|
|
361
|
+
const totalRow = table.totalRow ?? false;
|
|
362
|
+
const dataStartRowIndex = range.startRowIndex + (headerRow ? 1 : 0);
|
|
363
|
+
const dataEndRowIndex = range.endRowIndex - (totalRow ? 1 : 0);
|
|
364
|
+
// Column span: the named column, or the `[A]:[B]` pair (either order); none → every column.
|
|
365
|
+
let startColumnIndex = range.startColumnIndex;
|
|
366
|
+
let endColumnIndex = range.endColumnIndex;
|
|
367
|
+
if (columns.length) {
|
|
368
|
+
if (columns.length > 2)
|
|
369
|
+
return REF_ERROR_TOKEN;
|
|
370
|
+
const offsets = columns.map((column) => table.columnNames.findIndex((candidate) => candidate.toLowerCase() === column.toLowerCase()));
|
|
371
|
+
if (offsets.some((offset) => offset === -1))
|
|
372
|
+
return REF_ERROR_TOKEN;
|
|
373
|
+
startColumnIndex = range.startColumnIndex + Math.min(...offsets);
|
|
374
|
+
endColumnIndex = range.startColumnIndex + Math.max(...offsets);
|
|
375
|
+
}
|
|
376
|
+
// Row band.
|
|
377
|
+
let startRowIndex;
|
|
378
|
+
let endRowIndex;
|
|
379
|
+
if (thisRow) {
|
|
380
|
+
if (items.size ||
|
|
381
|
+
formulaRowIndex < dataStartRowIndex ||
|
|
382
|
+
formulaRowIndex > range.endRowIndex) {
|
|
383
|
+
return REF_ERROR_TOKEN;
|
|
384
|
+
}
|
|
385
|
+
startRowIndex = endRowIndex = formulaRowIndex;
|
|
386
|
+
}
|
|
387
|
+
else if (items.has("#all")) {
|
|
388
|
+
startRowIndex = range.startRowIndex;
|
|
389
|
+
endRowIndex = range.endRowIndex;
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
const bands = [];
|
|
393
|
+
if (items.has("#headers")) {
|
|
394
|
+
if (!headerRow)
|
|
395
|
+
return REF_ERROR_TOKEN;
|
|
396
|
+
bands.push([range.startRowIndex, range.startRowIndex]);
|
|
397
|
+
}
|
|
398
|
+
if (items.has("#data") || (!items.has("#headers") && !items.has("#totals"))) {
|
|
399
|
+
if (dataStartRowIndex > dataEndRowIndex)
|
|
400
|
+
return REF_ERROR_TOKEN;
|
|
401
|
+
bands.push([dataStartRowIndex, dataEndRowIndex]);
|
|
402
|
+
}
|
|
403
|
+
if (items.has("#totals")) {
|
|
404
|
+
if (!totalRow)
|
|
405
|
+
return REF_ERROR_TOKEN;
|
|
406
|
+
bands.push([range.endRowIndex, range.endRowIndex]);
|
|
407
|
+
}
|
|
408
|
+
bands.sort((a, b) => a[0] - b[0]);
|
|
409
|
+
[startRowIndex, endRowIndex] = bands[0];
|
|
410
|
+
for (const [bandStart, bandEnd] of bands.slice(1)) {
|
|
411
|
+
// `[#Headers],[#Totals]` skips the data rows: not one rectangle.
|
|
412
|
+
if (bandStart > endRowIndex + 1)
|
|
413
|
+
return REF_ERROR_TOKEN;
|
|
414
|
+
endRowIndex = Math.max(endRowIndex, bandEnd);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
const absolute = !thisRow;
|
|
418
|
+
const start = cellToAddress({ rowIndex: startRowIndex, columnIndex: startColumnIndex }, absolute, absolute);
|
|
419
|
+
const end = cellToAddress({ rowIndex: endRowIndex, columnIndex: endColumnIndex }, absolute, absolute);
|
|
420
|
+
if (!start || !end)
|
|
421
|
+
return REF_ERROR_TOKEN;
|
|
422
|
+
const prefix = tableSheetName.toLowerCase() !== formulaSheetName.toLowerCase()
|
|
423
|
+
? `${sanitizeSheetName(tableSheetName)}!`
|
|
424
|
+
: "";
|
|
425
|
+
return start === end ? `${prefix}${start}` : `${prefix}${start}:${end}`;
|
|
426
|
+
};
|
|
200
427
|
/**
|
|
201
428
|
* Converts tokens to string
|
|
202
429
|
* @param tokens
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import type { RowDataWithValue as SpreadsheetRowDataWithValue, SheetData as SpreadsheetSheetData } from "@rowsncolumns/common-types";
|
|
2
2
|
import type { CellNode, CellRangeNode, StaticNode } from "@rowsncolumns/dag";
|
|
3
|
-
import type { CellData, NumberFormat, NumberFormatType, ParsedToken } from "@rowsncolumns/spreadsheet";
|
|
3
|
+
import type { CellData, DimensionProperties, NumberFormat, NumberFormatType, ParsedToken } from "@rowsncolumns/spreadsheet";
|
|
4
4
|
import { type Draft } from "immer";
|
|
5
5
|
import type { CellXfsRegistry } from "../hooks/use-cellxfs-registry";
|
|
6
6
|
import type { useSheetProperties } from "../hooks/use-sheet-properties";
|
|
7
7
|
type SheetData<T extends CellData> = SpreadsheetSheetData<T>;
|
|
8
8
|
type RowDataWithValue<T extends CellData | null | undefined> = SpreadsheetRowDataWithValue<T>;
|
|
9
9
|
export declare const createSheetDraft: <T extends CellData>(draft: Draft<SheetData<T>>, sheetId: number, rowIndex?: number) => Draft<RowDataWithValue<T | null | undefined>>[];
|
|
10
|
+
/**
|
|
11
|
+
* Row/column metadata an inserted band inherits — Excel's "Format Same As
|
|
12
|
+
* Above / Left" (FMT-01 / FMT-02) carries the neighbour's height or width and
|
|
13
|
+
* hidden state along with its cell formats. The neighbour is the entry just
|
|
14
|
+
* before `referenceIndex`; an insert at index 1 has none and takes the entry
|
|
15
|
+
* being pushed away instead. The `collapsed` outline marker and filter-hiding
|
|
16
|
+
* stay with the original row / column. Returns `undefined` when there is
|
|
17
|
+
* nothing to inherit.
|
|
18
|
+
*/
|
|
19
|
+
export declare const inheritedDimensionMetadata: (metadata: readonly (DimensionProperties | null | undefined)[], referenceIndex: number) => DimensionProperties | undefined;
|
|
10
20
|
export declare const cloneRowWithFormatting: <T extends CellData>(rowData: Draft<RowDataWithValue<T | null | undefined>> | undefined) => Draft<RowDataWithValue<T | null | undefined>>;
|
|
11
21
|
export declare const cloneCellWithFormatting: <T extends CellData>(celLData: Draft<T> | undefined | null) => Draft<T> | null;
|
|
12
22
|
export declare const getFunctionNamesFromFormula: (formula: string) => string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"immer-utils.d.ts","sourceRoot":"","sources":["../../../api/immer-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"immer-utils.d.ts","sourceRoot":"","sources":["../../../api/immer-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,22 @@ export const createSheetDraft = (draft, sheetId, rowIndex) => {
|
|
|
18
18
|
}
|
|
19
19
|
return sheet;
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* Row/column metadata an inserted band inherits — Excel's "Format Same As
|
|
23
|
+
* Above / Left" (FMT-01 / FMT-02) carries the neighbour's height or width and
|
|
24
|
+
* hidden state along with its cell formats. The neighbour is the entry just
|
|
25
|
+
* before `referenceIndex`; an insert at index 1 has none and takes the entry
|
|
26
|
+
* being pushed away instead. The `collapsed` outline marker and filter-hiding
|
|
27
|
+
* stay with the original row / column. Returns `undefined` when there is
|
|
28
|
+
* nothing to inherit.
|
|
29
|
+
*/
|
|
30
|
+
export const inheritedDimensionMetadata = (metadata, referenceIndex) => {
|
|
31
|
+
const source = metadata[referenceIndex > 1 ? referenceIndex - 1 : referenceIndex];
|
|
32
|
+
if (!source)
|
|
33
|
+
return undefined;
|
|
34
|
+
const { collapsed: _collapsed, hiddenByFilter: _hiddenByFilter, ...inherited } = source;
|
|
35
|
+
return Object.keys(inherited).length ? inherited : undefined;
|
|
36
|
+
};
|
|
21
37
|
// Clone entire row
|
|
22
38
|
export const cloneRowWithFormatting = (rowData) => {
|
|
23
39
|
if (!rowData) {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { GridRange } from "@rowsncolumns/common-types";
|
|
2
|
+
/** How the destination band opens for an Insert Cut Cells block move. */
|
|
3
|
+
export type InsertCutCellsShift = "down" | "right";
|
|
4
|
+
export type InsertCutCellsPlan = {
|
|
5
|
+
/**
|
|
6
|
+
* `"down"` for a vertical move (the block changes rows), `"right"` when it slides along its
|
|
7
|
+
* own rows — the axis the destination band opens and the vacated source closes along.
|
|
8
|
+
*/
|
|
9
|
+
shift: InsertCutCellsShift;
|
|
10
|
+
/**
|
|
11
|
+
* The source once the destination band has opened: it slides along by the block's size when
|
|
12
|
+
* it sits in that band (a block dragged UP within its own columns), else it is `from` as is.
|
|
13
|
+
*/
|
|
14
|
+
shiftedSource: GridRange;
|
|
15
|
+
/**
|
|
16
|
+
* The bands the move shifts (each open-ended along `shift`): the destination band from `to`
|
|
17
|
+
* on, and the source band from the block on. A merge one of them covers only partially would
|
|
18
|
+
* be torn — Excel refuses the move ("We can't do that to a merged cell.").
|
|
19
|
+
*/
|
|
20
|
+
bands: GridRange[];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Excel "Insert Cut Cells" / Shift+drag of a cell block, as the three structural steps the
|
|
24
|
+
* legacy hooks already own: open the destination band (`insertCells…` at `to`), move the block
|
|
25
|
+
* into the opening, then close the gap the block left (`deleteCells…` on the vacated source).
|
|
26
|
+
* The sheet keeps its cell count — Shift+drag A5 to A2 over r1..r6 gives r1 r5 r2 r3 r4 r6, never
|
|
27
|
+
* a blank — and a forward move within its own lanes lands `size` lines before `to`, Excel's
|
|
28
|
+
* pre-removal reference (cut A2, drop at row 6 → r1 r3 r4 r5 r2 r6), because the closing shift
|
|
29
|
+
* pulls the landed block up. `null` when the move is a no-op (the drop is inside the block or
|
|
30
|
+
* right after it) or cannot land the block whole (destination lanes overlapping the source
|
|
31
|
+
* lanes only partially — the closing shift would tear the block); the rnc engine's
|
|
32
|
+
* `move-range { insert }` applies the same rules.
|
|
33
|
+
*/
|
|
34
|
+
export declare const planInsertCutCells: (from: GridRange, to: GridRange) => InsertCutCellsPlan | null;
|
|
35
|
+
//# sourceMappingURL=insert-cut-cells.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-cut-cells.d.ts","sourceRoot":"","sources":["../../../api/insert-cut-cells.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,yEAAyE;AACzE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,KAAK,EAAE,mBAAmB,CAAC;IAC3B;;;OAGG;IACH,aAAa,EAAE,SAAS,CAAC;IACzB;;;;OAIG;IACH,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,SAAS,EACf,IAAI,SAAS,KACZ,kBAAkB,GAAG,IAsDvB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { areaIntersects } from "@rowsncolumns/grid";
|
|
2
|
+
const LAST_INDEX = Number.MAX_SAFE_INTEGER;
|
|
3
|
+
/**
|
|
4
|
+
* Excel "Insert Cut Cells" / Shift+drag of a cell block, as the three structural steps the
|
|
5
|
+
* legacy hooks already own: open the destination band (`insertCells…` at `to`), move the block
|
|
6
|
+
* into the opening, then close the gap the block left (`deleteCells…` on the vacated source).
|
|
7
|
+
* The sheet keeps its cell count — Shift+drag A5 to A2 over r1..r6 gives r1 r5 r2 r3 r4 r6, never
|
|
8
|
+
* a blank — and a forward move within its own lanes lands `size` lines before `to`, Excel's
|
|
9
|
+
* pre-removal reference (cut A2, drop at row 6 → r1 r3 r4 r5 r2 r6), because the closing shift
|
|
10
|
+
* pulls the landed block up. `null` when the move is a no-op (the drop is inside the block or
|
|
11
|
+
* right after it) or cannot land the block whole (destination lanes overlapping the source
|
|
12
|
+
* lanes only partially — the closing shift would tear the block); the rnc engine's
|
|
13
|
+
* `move-range { insert }` applies the same rules.
|
|
14
|
+
*/
|
|
15
|
+
export const planInsertCutCells = (from, to) => {
|
|
16
|
+
if (areaIntersects(from, to)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const shift = to.startRowIndex === from.startRowIndex ? "right" : "down";
|
|
20
|
+
const vertical = shift === "down";
|
|
21
|
+
// (line, lane): the axis the bands shift along, and the perpendicular index.
|
|
22
|
+
const [l1, l2, k1, k2, t, tk1] = vertical
|
|
23
|
+
? [
|
|
24
|
+
from.startRowIndex,
|
|
25
|
+
from.endRowIndex,
|
|
26
|
+
from.startColumnIndex,
|
|
27
|
+
from.endColumnIndex,
|
|
28
|
+
to.startRowIndex,
|
|
29
|
+
to.startColumnIndex,
|
|
30
|
+
]
|
|
31
|
+
: [
|
|
32
|
+
from.startColumnIndex,
|
|
33
|
+
from.endColumnIndex,
|
|
34
|
+
from.startRowIndex,
|
|
35
|
+
from.endRowIndex,
|
|
36
|
+
to.startColumnIndex,
|
|
37
|
+
to.startRowIndex,
|
|
38
|
+
];
|
|
39
|
+
const size = l2 - l1 + 1;
|
|
40
|
+
const tk2 = tk1 + (k2 - k1);
|
|
41
|
+
const lanesMeet = tk1 <= k2 && tk2 >= k1;
|
|
42
|
+
if (lanesMeet && tk1 !== k1) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
if (lanesMeet && t > l1 && t <= l2 + 1) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
// Opening the destination band above the block slides the block along with it.
|
|
49
|
+
const slides = lanesMeet && t < l1;
|
|
50
|
+
const shiftedSource = !slides
|
|
51
|
+
? from
|
|
52
|
+
: vertical
|
|
53
|
+
? {
|
|
54
|
+
...from,
|
|
55
|
+
startRowIndex: from.startRowIndex + size,
|
|
56
|
+
endRowIndex: from.endRowIndex + size,
|
|
57
|
+
}
|
|
58
|
+
: {
|
|
59
|
+
...from,
|
|
60
|
+
startColumnIndex: from.startColumnIndex + size,
|
|
61
|
+
endColumnIndex: from.endColumnIndex + size,
|
|
62
|
+
};
|
|
63
|
+
const band = (range) => vertical
|
|
64
|
+
? { ...range, endRowIndex: LAST_INDEX }
|
|
65
|
+
: { ...range, endColumnIndex: LAST_INDEX };
|
|
66
|
+
return { shift, shiftedSource, bands: [band(to), band(from)] };
|
|
67
|
+
};
|
package/dist/esm/api/merges.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { GridRange } from "@rowsncolumns/common-types";
|
|
2
|
+
/** Excel's refusal when a move / cut-paste / shift would tear a merged cell. */
|
|
3
|
+
export declare const MERGED_CELL_MOVE_ERROR = "We can't do that to a merged cell.";
|
|
4
|
+
/**
|
|
5
|
+
* The first merge that `range` covers only PARTIALLY (it intersects the range without being
|
|
6
|
+
* wholly inside it). Excel refuses any move, cut + paste or cell shift whose source or destination
|
|
7
|
+
* does that ("We can't do that to a merged cell."); merges wholly inside the range travel intact.
|
|
8
|
+
*/
|
|
9
|
+
export declare const findPartiallyCoveredMerge: (range: GridRange, merges: GridRange[] | undefined | null) => GridRange | undefined;
|
|
2
10
|
export declare const moveMergedCells: (mergedCells: GridRange[] | undefined | null, op: "column-insert" | "row-insert" | "column-remove" | "row-remove", referenceIndex: number, count?: number, condition?: (area: GridRange) => boolean) => GridRange[] | null | undefined;
|
|
3
11
|
export declare const shrinkMergesOnRowDelete: (merges: GridRange[], deleteStart: number, deleteCount: number) => GridRange[];
|
|
4
12
|
export declare const shrinkMergesOnColumnDelete: (merges: GridRange[], deleteStart: number, deleteCount: number) => GridRange[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merges.d.ts","sourceRoot":"","sources":["../../../api/merges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"merges.d.ts","sourceRoot":"","sources":["../../../api/merges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,uCAAuC,CAAC;AAE3E;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GACpC,OAAO,SAAS,EAChB,QAAQ,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,KACrC,SAAS,GAAG,SAGZ,CAAC;AAYJ,eAAO,MAAM,eAAe,GAC1B,aAAa,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EAC3C,IAAI,eAAe,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,EACnE,gBAAgB,MAAM,EACtB,cAAS,EACT,YAAY,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,mCA2DzC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EACtC,MAAM,KAAK,GAAG,QAAQ,EACtB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,QAAQ,OAAO,EACf,WAAW,MAAM,EACjB,SAAS,MAAM,mCAkDhB,CAAC"}
|
package/dist/esm/api/merges.js
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
import { areaInsideArea, areaIntersects } from "@rowsncolumns/grid";
|
|
2
|
+
/** Excel's refusal when a move / cut-paste / shift would tear a merged cell. */
|
|
3
|
+
export const MERGED_CELL_MOVE_ERROR = "We can't do that to a merged cell.";
|
|
4
|
+
/**
|
|
5
|
+
* The first merge that `range` covers only PARTIALLY (it intersects the range without being
|
|
6
|
+
* wholly inside it). Excel refuses any move, cut + paste or cell shift whose source or destination
|
|
7
|
+
* does that ("We can't do that to a merged cell."); merges wholly inside the range travel intact.
|
|
8
|
+
*/
|
|
9
|
+
export const findPartiallyCoveredMerge = (range, merges) => merges?.find((merge) => areaIntersects(merge, range) && !areaInsideArea(merge, range));
|
|
1
10
|
/**
|
|
2
11
|
* Move merged cells when user is inserts, deletes row and columns
|
|
3
12
|
* @param mergedCells
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { CellFormat, CellInterface, GridRange } from "@rowsncolumns/common-types";
|
|
2
|
+
import type { CellData } from "@rowsncolumns/spreadsheet";
|
|
3
|
+
import type { Draft } from "immer";
|
|
4
|
+
import type { CellXfsRegistry } from "../hooks/use-cellxfs-registry";
|
|
5
|
+
import type { SheetData } from "../hooks/use-spreadsheet-state";
|
|
6
|
+
import type { SharedStringRegistry } from "../hooks/use-ss-registry";
|
|
2
7
|
/**
|
|
3
8
|
* Format-painter pattern shared by both engines: the captured 2-D format grid plus the
|
|
4
9
|
* source block's merge configuration, re-based to the block's top-left so it can be tiled
|
|
@@ -49,7 +54,23 @@ export declare const getBandedCellFormat: (bandedCells: Map<string, CellFormat>
|
|
|
49
54
|
* Layer a cell's explicit format over the banded format the grid would paint beneath it, so the
|
|
50
55
|
* captured pattern carries the VISIBLE look (Sheets copies the alternating colours as static cell
|
|
51
56
|
* fills — it does not create a table or banding at the target). Explicit keys win; an explicit
|
|
52
|
-
* `undefined` never clobbers a banded value.
|
|
57
|
+
* `undefined` never clobbers a banded value. `textFormat` merges key-wise: an explicitly bold
|
|
58
|
+
* header keeps the contrast text colour the band paints it with.
|
|
53
59
|
*/
|
|
54
60
|
export declare const layerBandedFormat: (explicit: CellFormat | null | undefined, banded: CellFormat | undefined) => CellFormat | null | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Write the banded (table stripe) formats the grid paints under `range` into the cells as
|
|
63
|
+
* static formats — Excel's Convert to Range bakes the table style into the cell formats — each
|
|
64
|
+
* cell's explicit format layered on top exactly as the format painter captures it. Runs inside
|
|
65
|
+
* the caller's sheet-data draft; cells without a band are untouched.
|
|
66
|
+
*/
|
|
67
|
+
export declare const bakeBandedFormats: <T extends CellData>({ draft, sheetId, range, bandedCells, locale, cellXfsRegistry, sharedStringRegistry, }: {
|
|
68
|
+
draft: Draft<SheetData<T>>;
|
|
69
|
+
sheetId: number;
|
|
70
|
+
range: GridRange;
|
|
71
|
+
bandedCells: Map<string, CellFormat> | undefined | null;
|
|
72
|
+
locale?: string;
|
|
73
|
+
cellXfsRegistry?: CellXfsRegistry;
|
|
74
|
+
sharedStringRegistry?: SharedStringRegistry;
|
|
75
|
+
}) => void;
|
|
55
76
|
//# sourceMappingURL=paint-format.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paint-format.d.ts","sourceRoot":"","sources":["../../../api/paint-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACV,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"paint-format.d.ts","sourceRoot":"","sources":["../../../api/paint-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACV,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,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;AAIrE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,CAAC;IAC7C,kFAAkF;IAClF,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAQF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,EACtC,QAAQ,SAAS,KAChB,SAAS,EAaX,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,QAAQ,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,EACtC,YAAY,aAAa,KACxB,SAkBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,SAAS,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAC5C,gBAAgB,SAAS,EAAE,KAC1B,IAYF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,gBAAgB,SAAS,EAAE,EAC3B,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,QAAQ,SAAS,KAChB,SAAS,EAqBX,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,aAAa,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,GAAG,IAAI,EACvD,UAAU,MAAM,EAChB,aAAa,MAAM,KAClB,UAAU,GAAG,SACyC,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,UAAU,GAAG,IAAI,GAAG,SAAS,EACvC,QAAQ,UAAU,GAAG,SAAS,KAC7B,UAAU,GAAG,IAAI,GAAG,SActB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,QAAQ,EAAE,wFAQnD;IACD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,SA6CA,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { cellIdentifier, isCellWithinBounds } from "@rowsncolumns/grid";
|
|
2
|
+
import { SheetCell } from "../sheet-cell";
|
|
3
|
+
import { createSheetDraft } from "./immer-utils";
|
|
2
4
|
const rangeContains = (outer, inner) => inner.startRowIndex >= outer.startRowIndex &&
|
|
3
5
|
inner.endRowIndex <= outer.endRowIndex &&
|
|
4
6
|
inner.startColumnIndex >= outer.startColumnIndex &&
|
|
@@ -105,7 +107,8 @@ export const getBandedCellFormat = (bandedCells, rowIndex, columnIndex) => bande
|
|
|
105
107
|
* Layer a cell's explicit format over the banded format the grid would paint beneath it, so the
|
|
106
108
|
* captured pattern carries the VISIBLE look (Sheets copies the alternating colours as static cell
|
|
107
109
|
* fills — it does not create a table or banding at the target). Explicit keys win; an explicit
|
|
108
|
-
* `undefined` never clobbers a banded value.
|
|
110
|
+
* `undefined` never clobbers a banded value. `textFormat` merges key-wise: an explicitly bold
|
|
111
|
+
* header keeps the contrast text colour the band paints it with.
|
|
109
112
|
*/
|
|
110
113
|
export const layerBandedFormat = (explicit, banded) => {
|
|
111
114
|
if (!banded)
|
|
@@ -117,6 +120,46 @@ export const layerBandedFormat = (explicit, banded) => {
|
|
|
117
120
|
merged[key] = value;
|
|
118
121
|
}
|
|
119
122
|
}
|
|
123
|
+
if (explicit.textFormat && banded.textFormat) {
|
|
124
|
+
merged.textFormat = { ...banded.textFormat, ...explicit.textFormat };
|
|
125
|
+
}
|
|
120
126
|
}
|
|
121
127
|
return merged;
|
|
122
128
|
};
|
|
129
|
+
/**
|
|
130
|
+
* Write the banded (table stripe) formats the grid paints under `range` into the cells as
|
|
131
|
+
* static formats — Excel's Convert to Range bakes the table style into the cell formats — each
|
|
132
|
+
* cell's explicit format layered on top exactly as the format painter captures it. Runs inside
|
|
133
|
+
* the caller's sheet-data draft; cells without a band are untouched.
|
|
134
|
+
*/
|
|
135
|
+
export const bakeBandedFormats = ({ draft, sheetId, range, bandedCells, locale, cellXfsRegistry, sharedStringRegistry, }) => {
|
|
136
|
+
if (!bandedCells?.size)
|
|
137
|
+
return;
|
|
138
|
+
const sheetCell = new SheetCell();
|
|
139
|
+
for (let rowIndex = range.startRowIndex; rowIndex <= range.endRowIndex; rowIndex++) {
|
|
140
|
+
for (let columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
|
|
141
|
+
const banded = getBandedCellFormat(bandedCells, rowIndex, columnIndex);
|
|
142
|
+
if (!banded)
|
|
143
|
+
continue;
|
|
144
|
+
const currentSheet = createSheetDraft(draft, sheetId, rowIndex);
|
|
145
|
+
sheetCell.assign(sheetId, { rowIndex, columnIndex }, currentSheet[rowIndex]?.values?.[columnIndex], { locale, cellXfsRegistry, sharedStringRegistry });
|
|
146
|
+
const baked = layerBandedFormat(sheetCell.userEnteredFormat, banded);
|
|
147
|
+
sheetCell.clearUserEnteredFormat();
|
|
148
|
+
for (const [key, value] of Object.entries(baked ?? {})) {
|
|
149
|
+
// A band carries `undefined` for the parts it does not paint (no border, no text
|
|
150
|
+
// colour) — those must not land as empty `{}` formats on the cell.
|
|
151
|
+
if (value === undefined)
|
|
152
|
+
continue;
|
|
153
|
+
if (typeof value === "object" &&
|
|
154
|
+
value !== null &&
|
|
155
|
+
Object.values(value).every((part) => part === undefined)) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
sheetCell.setUserEnteredFormat(key, value);
|
|
159
|
+
}
|
|
160
|
+
currentSheet[rowIndex].values[columnIndex] =
|
|
161
|
+
sheetCell.getCellData();
|
|
162
|
+
cellXfsRegistry?.registerCellXfs(sheetCell);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
package/dist/esm/api/sort.d.ts
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
1
|
import type { SortOrder } from "@rowsncolumns/spreadsheet";
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* A cell whose effective value is an error (`#DIV/0!`, `#N/A`, …). Errors
|
|
4
|
+
* form the last value tier and keep their relative order, as in Excel.
|
|
5
|
+
*/
|
|
6
|
+
export type SortErrorValue = {
|
|
7
|
+
readonly sortError: string;
|
|
8
|
+
};
|
|
9
|
+
export type SortCellValue = string | number | boolean | SortErrorValue | undefined | null;
|
|
10
|
+
export declare const isSortErrorValue: (value: unknown) => value is SortErrorValue;
|
|
11
|
+
/**
|
|
12
|
+
* The value a sort compares for a cell: its error when it has one, else the
|
|
13
|
+
* effective value, else the display text.
|
|
14
|
+
*/
|
|
15
|
+
export declare const getCellSortValue: (cell: {
|
|
16
|
+
readonly error: unknown;
|
|
17
|
+
getEffectiveValue(): string | number | boolean | undefined;
|
|
18
|
+
readonly formattedValue: string | undefined | null;
|
|
19
|
+
}) => SortCellValue;
|
|
20
|
+
/**
|
|
21
|
+
* Excel's sort order: numbers < text < logicals < errors, blanks last in
|
|
22
|
+
* BOTH directions, text compared case-insensitively through the collator.
|
|
23
|
+
*/
|
|
24
|
+
export declare const cellValueSorter: (left: SortCellValue, right: SortCellValue, sortOrder: SortOrder) => number;
|
|
3
25
|
//# sourceMappingURL=sort.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../../../api/sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../../../api/sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAa3D;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,OAAO,GACP,cAAc,GACd,SAAS,GACT,IAAI,CAAC;AAET,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,cACU,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,iBAAiB,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CACpD,KAAG,aAGmD,CAAC;AAYxD;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,MAAM,aAAa,EACnB,OAAO,aAAa,EACpB,WAAW,SAAS,WA8CrB,CAAC"}
|