handsontable 0.0.0-next-9059914-20231025 → 0.0.0-next-21d91d0-20231025
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of handsontable might be problematic. Click here for more details.
- package/3rdparty/walkontable/src/cell/coords.d.ts +6 -1
- package/3rdparty/walkontable/src/cell/coords.js +50 -11
- package/3rdparty/walkontable/src/cell/coords.mjs +50 -11
- package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
- package/3rdparty/walkontable/src/cell/range.js +38 -7
- package/3rdparty/walkontable/src/cell/range.mjs +38 -7
- package/3rdparty/walkontable/src/core/_base.js +9 -3
- package/3rdparty/walkontable/src/core/_base.mjs +9 -3
- package/3rdparty/walkontable/src/core/clone.js +2 -2
- package/3rdparty/walkontable/src/core/clone.mjs +2 -2
- package/3rdparty/walkontable/src/core/core.js +3 -2
- package/3rdparty/walkontable/src/core/core.mjs +3 -2
- package/3rdparty/walkontable/src/event.js +12 -10
- package/3rdparty/walkontable/src/event.mjs +12 -10
- package/3rdparty/walkontable/src/facade/core.js +2 -2
- package/3rdparty/walkontable/src/facade/core.mjs +2 -2
- package/3rdparty/walkontable/src/index.js +10 -2
- package/3rdparty/walkontable/src/index.mjs +2 -2
- package/3rdparty/walkontable/src/overlay/_base.js +13 -2
- package/3rdparty/walkontable/src/overlay/_base.mjs +14 -3
- package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
- package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
- package/3rdparty/walkontable/src/overlay/top.js +2 -6
- package/3rdparty/walkontable/src/overlay/top.mjs +2 -6
- package/3rdparty/walkontable/src/renderer/cells.js +10 -0
- package/3rdparty/walkontable/src/renderer/cells.mjs +11 -1
- package/3rdparty/walkontable/src/renderer/columnHeaders.js +10 -0
- package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +11 -1
- package/3rdparty/walkontable/src/renderer/rowHeaders.js +5 -0
- package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +5 -0
- package/3rdparty/walkontable/src/renderer/rows.js +13 -0
- package/3rdparty/walkontable/src/renderer/rows.mjs +13 -0
- package/3rdparty/walkontable/src/renderer/table.js +9 -0
- package/3rdparty/walkontable/src/renderer/table.mjs +9 -0
- package/3rdparty/walkontable/src/scroll.js +2 -0
- package/3rdparty/walkontable/src/scroll.mjs +2 -0
- package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +7 -12
- package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
- package/3rdparty/walkontable/src/selection/border/constants.js +16 -0
- package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
- package/3rdparty/walkontable/src/selection/constants.js +62 -0
- package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
- package/3rdparty/walkontable/src/selection/index.js +26 -0
- package/3rdparty/walkontable/src/selection/index.mjs +5 -0
- package/3rdparty/walkontable/src/selection/manager.js +274 -0
- package/3rdparty/walkontable/src/selection/manager.mjs +269 -0
- package/3rdparty/walkontable/src/selection/scanner.js +270 -0
- package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
- package/3rdparty/walkontable/src/selection/selection.js +101 -0
- package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
- package/3rdparty/walkontable/src/settings.js +13 -4
- package/3rdparty/walkontable/src/settings.mjs +13 -4
- package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
- package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
- package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
- package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
- package/3rdparty/walkontable/src/table.js +19 -78
- package/3rdparty/walkontable/src/table.mjs +20 -79
- package/base.js +2 -2
- package/base.mjs +2 -2
- package/cellTypes/dateType/dateType.d.ts +3 -3
- package/cellTypes/dateType/dateType.js +2 -2
- package/cellTypes/dateType/dateType.mjs +2 -2
- package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
- package/cellTypes/handsontableType/handsontableType.js +2 -2
- package/cellTypes/handsontableType/handsontableType.mjs +2 -2
- package/cellTypes/index.d.ts +3 -0
- package/cellTypes/index.js +4 -0
- package/cellTypes/index.mjs +3 -1
- package/cellTypes/selectType/index.d.ts +1 -0
- package/cellTypes/selectType/index.js +6 -0
- package/cellTypes/selectType/index.mjs +1 -0
- package/cellTypes/selectType/selectType.d.ts +14 -0
- package/cellTypes/selectType/selectType.js +13 -0
- package/cellTypes/selectType/selectType.mjs +8 -0
- package/core/focusCatcher/focusDetector.js +63 -0
- package/core/focusCatcher/focusDetector.mjs +59 -0
- package/core/focusCatcher/index.js +142 -0
- package/core/focusCatcher/index.mjs +138 -0
- package/core/index.js +9 -0
- package/core/index.mjs +1 -0
- package/core.d.ts +9 -4
- package/core.js +285 -327
- package/core.mjs +285 -327
- package/dataMap/metaManager/metaSchema.js +65 -0
- package/dataMap/metaManager/metaSchema.mjs +65 -0
- package/dataMap/metaManager/mods/extendMetaProperties.js +7 -1
- package/dataMap/metaManager/mods/extendMetaProperties.mjs +7 -1
- package/dataMap/replaceData.js +5 -0
- package/dataMap/replaceData.mjs +5 -0
- package/dist/handsontable.css +51 -15
- package/dist/handsontable.full.css +51 -15
- package/dist/handsontable.full.js +13360 -7840
- package/dist/handsontable.full.min.css +7 -7
- package/dist/handsontable.full.min.js +136 -136
- package/dist/handsontable.js +20955 -15435
- package/dist/handsontable.min.css +6 -6
- package/dist/handsontable.min.js +24 -24
- package/dist/languages/all.js +6 -2
- package/dist/languages/all.min.js +1 -1
- package/dist/languages/en-US.js +3 -1
- package/dist/languages/en-US.min.js +1 -1
- package/dist/languages/pl-PL.js +3 -1
- package/dist/languages/pl-PL.min.js +1 -1
- package/editorManager.js +15 -87
- package/editorManager.mjs +16 -87
- package/editors/autocompleteEditor/autocompleteEditor.js +53 -2
- package/editors/autocompleteEditor/autocompleteEditor.mjs +54 -3
- package/editors/dateEditor/dateEditor.js +26 -7
- package/editors/dateEditor/dateEditor.mjs +27 -8
- package/editors/handsontableEditor/handsontableEditor.js +9 -1
- package/editors/handsontableEditor/handsontableEditor.mjs +10 -2
- package/editors/textEditor/textEditor.js +19 -27
- package/editors/textEditor/textEditor.mjs +22 -30
- package/focusManager.d.ts +12 -0
- package/focusManager.js +265 -0
- package/focusManager.mjs +261 -0
- package/helpers/a11y.js +79 -0
- package/helpers/a11y.mjs +38 -0
- package/helpers/dom/element.js +188 -9
- package/helpers/dom/element.mjs +182 -9
- package/helpers/mixed.js +1 -1
- package/helpers/mixed.mjs +1 -1
- package/helpers/number.d.ts +1 -0
- package/helpers/number.js +18 -0
- package/helpers/number.mjs +17 -0
- package/i18n/constants.js +7 -1
- package/i18n/constants.mjs +4 -1
- package/i18n/languages/en-US.js +3 -1
- package/i18n/languages/en-US.mjs +3 -1
- package/i18n/languages/pl-PL.js +3 -1
- package/i18n/languages/pl-PL.mjs +3 -1
- package/languages/all.js +6 -2
- package/languages/en-US.js +3 -1
- package/languages/en-US.mjs +3 -1
- package/languages/index.js +6 -2
- package/languages/pl-PL.js +3 -1
- package/languages/pl-PL.mjs +3 -1
- package/package.json +21 -1
- package/pluginHooks.d.ts +12 -1
- package/pluginHooks.js +152 -1
- package/pluginHooks.mjs +152 -1
- package/plugins/collapsibleColumns/collapsibleColumns.js +74 -4
- package/plugins/collapsibleColumns/collapsibleColumns.mjs +75 -5
- package/plugins/columnSorting/columnSorting.js +43 -0
- package/plugins/columnSorting/columnSorting.mjs +44 -3
- package/plugins/columnSorting/index.js +3 -1
- package/plugins/columnSorting/index.mjs +1 -1
- package/plugins/comments/commentEditor.js +1 -0
- package/plugins/comments/commentEditor.mjs +1 -0
- package/plugins/comments/comments.js +252 -189
- package/plugins/comments/comments.mjs +251 -190
- package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
- package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
- package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
- package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
- package/plugins/comments/contextMenuItem/removeComment.js +38 -0
- package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
- package/plugins/contextMenu/commandExecutor.js +2 -3
- package/plugins/contextMenu/commandExecutor.mjs +2 -3
- package/plugins/contextMenu/contextMenu.d.ts +1 -1
- package/plugins/contextMenu/contextMenu.js +75 -36
- package/plugins/contextMenu/contextMenu.mjs +74 -35
- package/plugins/contextMenu/itemsFactory.js +2 -3
- package/plugins/contextMenu/itemsFactory.mjs +3 -4
- package/plugins/contextMenu/{cursor.mjs → menu/cursor.js} +6 -4
- package/plugins/contextMenu/{cursor.js → menu/cursor.mjs} +4 -10
- package/plugins/contextMenu/menu/defaultShortcutsList.js +88 -0
- package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
- package/plugins/contextMenu/menu/index.js +9 -0
- package/plugins/contextMenu/menu/index.mjs +1 -0
- package/plugins/contextMenu/{menu.js → menu/menu.js} +145 -421
- package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +146 -422
- package/plugins/contextMenu/menu/menuItemRenderer.js +58 -0
- package/plugins/contextMenu/menu/menuItemRenderer.mjs +54 -0
- package/plugins/contextMenu/menu/navigator.js +27 -0
- package/plugins/contextMenu/menu/navigator.mjs +23 -0
- package/plugins/contextMenu/menu/positioner.js +213 -0
- package/plugins/contextMenu/menu/positioner.mjs +209 -0
- package/plugins/contextMenu/menu/shortcuts.js +114 -0
- package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
- package/plugins/contextMenu/menu/utils.js +177 -0
- package/plugins/contextMenu/menu/utils.mjs +163 -0
- package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
- package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
- package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
- package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
- package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
- package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
- package/plugins/contextMenu/{predefinedItems.js → predefinedItems/index.js} +14 -14
- package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
- package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
- package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
- package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
- package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
- package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
- package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
- package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
- package/plugins/contextMenu/utils.js +35 -151
- package/plugins/contextMenu/utils.mjs +35 -144
- package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
- package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
- package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
- package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
- package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
- package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
- package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
- package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
- package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
- package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
- package/plugins/copyPaste/copyPaste.js +127 -78
- package/plugins/copyPaste/copyPaste.mjs +128 -79
- package/plugins/customBorders/customBorders.js +23 -20
- package/plugins/customBorders/customBorders.mjs +24 -21
- package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
- package/plugins/dropdownMenu/dropdownMenu.js +127 -40
- package/plugins/dropdownMenu/dropdownMenu.mjs +126 -39
- package/plugins/filters/component/_base.js +23 -8
- package/plugins/filters/component/_base.mjs +23 -8
- package/plugins/filters/component/actionBar.js +29 -27
- package/plugins/filters/component/actionBar.mjs +26 -23
- package/plugins/filters/component/condition.js +46 -59
- package/plugins/filters/component/condition.mjs +40 -52
- package/plugins/filters/component/operators.js +21 -22
- package/plugins/filters/component/operators.mjs +18 -18
- package/plugins/filters/component/value.js +35 -26
- package/plugins/filters/component/value.mjs +32 -22
- package/plugins/filters/constants.mjs +1 -1
- package/plugins/filters/filters.js +106 -62
- package/plugins/filters/filters.mjs +99 -55
- package/plugins/filters/menu/focusController.js +123 -0
- package/plugins/filters/menu/focusController.mjs +119 -0
- package/plugins/filters/menu/focusNavigator.js +30 -0
- package/plugins/filters/menu/focusNavigator.mjs +26 -0
- package/plugins/filters/ui/_base.js +35 -13
- package/plugins/filters/ui/_base.mjs +35 -13
- package/plugins/filters/ui/input.js +43 -32
- package/plugins/filters/ui/input.mjs +42 -30
- package/plugins/filters/ui/link.js +44 -12
- package/plugins/filters/ui/link.mjs +44 -11
- package/plugins/filters/ui/multipleSelect.js +234 -129
- package/plugins/filters/ui/multipleSelect.mjs +232 -127
- package/plugins/filters/ui/radioInput.js +42 -18
- package/plugins/filters/ui/radioInput.mjs +42 -17
- package/plugins/filters/ui/select.js +144 -75
- package/plugins/filters/ui/select.mjs +142 -72
- package/plugins/hiddenColumns/hiddenColumns.mjs +1 -1
- package/plugins/hiddenRows/hiddenRows.mjs +1 -1
- package/plugins/manualColumnMove/manualColumnMove.js +3 -1
- package/plugins/manualColumnMove/manualColumnMove.mjs +3 -1
- package/plugins/mergeCells/mergeCells.js +5 -16
- package/plugins/mergeCells/mergeCells.mjs +5 -16
- package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
- package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
- package/plugins/nestedHeaders/nestedHeaders.js +240 -10
- package/plugins/nestedHeaders/nestedHeaders.mjs +241 -11
- package/plugins/nestedHeaders/stateManager/index.js +102 -3
- package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
- package/plugins/nestedRows/nestedRows.js +41 -0
- package/plugins/nestedRows/nestedRows.mjs +41 -0
- package/plugins/nestedRows/ui/headers.js +11 -0
- package/plugins/nestedRows/ui/headers.mjs +12 -1
- package/renderers/autocompleteRenderer/autocompleteRenderer.js +8 -0
- package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
- package/renderers/baseRenderer/baseRenderer.js +17 -0
- package/renderers/baseRenderer/baseRenderer.mjs +18 -1
- package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
- package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
- package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
- package/renderers/dateRenderer/dateRenderer.js +29 -0
- package/renderers/dateRenderer/dateRenderer.mjs +24 -0
- package/renderers/dateRenderer/index.d.ts +1 -0
- package/renderers/dateRenderer/index.js +6 -0
- package/renderers/dateRenderer/index.mjs +1 -0
- package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
- package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
- package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
- package/renderers/handsontableRenderer/index.d.ts +1 -0
- package/renderers/handsontableRenderer/index.js +6 -0
- package/renderers/handsontableRenderer/index.mjs +1 -0
- package/renderers/index.d.ts +9 -0
- package/renderers/selectRenderer/index.d.ts +1 -0
- package/renderers/selectRenderer/index.js +6 -0
- package/renderers/selectRenderer/index.mjs +1 -0
- package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
- package/renderers/selectRenderer/selectRenderer.js +27 -0
- package/renderers/selectRenderer/selectRenderer.mjs +22 -0
- package/selection/highlight/highlight.js +256 -71
- package/selection/highlight/highlight.mjs +250 -71
- package/selection/highlight/types/activeHeader.js +10 -8
- package/selection/highlight/types/activeHeader.mjs +10 -8
- package/selection/highlight/types/area.js +6 -18
- package/selection/highlight/types/area.mjs +6 -18
- package/selection/highlight/types/areaLayered.js +31 -0
- package/selection/highlight/types/areaLayered.mjs +26 -0
- package/selection/highlight/types/column.js +27 -0
- package/selection/highlight/types/column.mjs +22 -0
- package/selection/highlight/types/customSelection.js +7 -9
- package/selection/highlight/types/customSelection.mjs +7 -9
- package/selection/highlight/types/fill.js +5 -7
- package/selection/highlight/types/fill.mjs +5 -7
- package/selection/highlight/types/{cell.js → focus.js} +5 -7
- package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
- package/selection/highlight/types/header.js +9 -18
- package/selection/highlight/types/header.mjs +9 -18
- package/selection/highlight/types/row.js +27 -0
- package/selection/highlight/types/row.mjs +22 -0
- package/selection/highlight/visualSelection.js +31 -27
- package/selection/highlight/visualSelection.mjs +31 -27
- package/selection/index.js +4 -7
- package/selection/index.mjs +2 -3
- package/selection/mouseEventHandler.js +7 -1
- package/selection/mouseEventHandler.mjs +7 -1
- package/selection/range.js +8 -8
- package/selection/range.mjs +8 -8
- package/selection/selection.js +321 -152
- package/selection/selection.mjs +318 -151
- package/selection/transformation.js +232 -90
- package/selection/transformation.mjs +232 -90
- package/selection/utils.js +15 -21
- package/selection/utils.mjs +16 -21
- package/settings.d.ts +4 -0
- package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
- package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
- package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
- package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
- package/shortcutContexts/commands/editor/fastOpen.js +16 -0
- package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
- package/shortcutContexts/commands/editor/index.js +16 -0
- package/shortcutContexts/commands/editor/index.mjs +12 -0
- package/shortcutContexts/commands/editor/open.js +27 -0
- package/shortcutContexts/commands/editor/open.mjs +23 -0
- package/shortcutContexts/commands/emptySelectedCells.js +11 -0
- package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
- package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
- package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
- package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +25 -0
- package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
- package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
- package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
- package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
- package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
- package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
- package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
- package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
- package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
- package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
- package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
- package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
- package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
- package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +25 -0
- package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
- package/shortcutContexts/commands/index.js +35 -0
- package/shortcutContexts/commands/index.mjs +31 -0
- package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
- package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
- package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +33 -0
- package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
- package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
- package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
- package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
- package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
- package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
- package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
- package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
- package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
- package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
- package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
- package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
- package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
- package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
- package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
- package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
- package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
- package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
- package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
- package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
- package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
- package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
- package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
- package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
- package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
- package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
- package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
- package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
- package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
- package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +33 -0
- package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
- package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
- package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
- package/shortcutContexts/commands/scrollToFocusedCell.js +35 -0
- package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
- package/shortcutContexts/commands/selectAll.js +12 -0
- package/shortcutContexts/commands/selectAll.mjs +8 -0
- package/shortcutContexts/constants.js +13 -0
- package/shortcutContexts/constants.mjs +8 -0
- package/shortcutContexts/editor.js +25 -0
- package/shortcutContexts/editor.mjs +21 -0
- package/shortcutContexts/grid.js +163 -0
- package/shortcutContexts/grid.mjs +159 -0
- package/shortcutContexts/index.js +24 -0
- package/shortcutContexts/index.mjs +11 -0
- package/shortcuts/context.js +23 -4
- package/shortcuts/context.mjs +23 -5
- package/shortcuts/manager.js +25 -7
- package/shortcuts/manager.mjs +26 -7
- package/shortcuts/recorder.js +3 -3
- package/shortcuts/recorder.mjs +3 -3
- package/shortcuts/utils.js +19 -5
- package/shortcuts/utils.mjs +18 -4
- package/tableView.js +111 -13
- package/tableView.mjs +112 -14
- package/utils/paginator.js +151 -0
- package/utils/paginator.mjs +147 -0
- package/3rdparty/walkontable/src/selection.js +0 -295
- package/3rdparty/walkontable/src/selection.mjs +0 -290
- package/plugins/contextMenu/predefinedItems.mjs +0 -68
- package/plugins/copyPaste/focusableElement.js +0 -186
- package/plugins/copyPaste/focusableElement.mjs +0 -180
- package/selection/highlight/constants.js +0 -15
- package/selection/highlight/constants.mjs +0 -6
- package/selection/highlight/types/index.js +0 -35
- package/selection/highlight/types/index.mjs +0 -31
@@ -5,8 +5,8 @@ exports.__esModule = true;
|
|
5
5
|
require("core-js/modules/es.array.push.js");
|
6
6
|
var _element = require("../../helpers/dom/element");
|
7
7
|
var _number = require("../../helpers/number");
|
8
|
-
var _event = require("../../helpers/dom/event");
|
9
8
|
var _templateLiteralTag = require("../../helpers/templateLiteralTag");
|
9
|
+
var _event = require("../../helpers/dom/event");
|
10
10
|
var _console = require("../../helpers/console");
|
11
11
|
var _selection = require("../../selection");
|
12
12
|
var _base = require("../base");
|
@@ -75,13 +75,14 @@ const PLUGIN_PRIORITY = 280;
|
|
75
75
|
exports.PLUGIN_PRIORITY = PLUGIN_PRIORITY;
|
76
76
|
var _stateManager = /*#__PURE__*/new WeakMap();
|
77
77
|
var _hidingIndexMapObserver = /*#__PURE__*/new WeakMap();
|
78
|
+
var _focusInitialCoords = /*#__PURE__*/new WeakMap();
|
79
|
+
var _isColumnsSelectionInProgress = /*#__PURE__*/new WeakMap();
|
78
80
|
class NestedHeaders extends _base.BasePlugin {
|
79
81
|
constructor() {
|
80
82
|
super(...arguments);
|
81
83
|
/**
|
82
84
|
* The state manager for the nested headers.
|
83
85
|
*
|
84
|
-
* @private
|
85
86
|
* @type {StateManager}
|
86
87
|
*/
|
87
88
|
_classPrivateFieldInitSpec(this, _stateManager, {
|
@@ -92,13 +93,30 @@ class NestedHeaders extends _base.BasePlugin {
|
|
92
93
|
* The instance of the ChangesObservable class that allows track the changes that happens in the
|
93
94
|
* column indexes.
|
94
95
|
*
|
95
|
-
* @private
|
96
96
|
* @type {ChangesObservable}
|
97
97
|
*/
|
98
98
|
_classPrivateFieldInitSpec(this, _hidingIndexMapObserver, {
|
99
99
|
writable: true,
|
100
100
|
value: null
|
101
101
|
});
|
102
|
+
/**
|
103
|
+
* Holds the coords that points to the place where the column selection starts.
|
104
|
+
*
|
105
|
+
* @type {number|null}
|
106
|
+
*/
|
107
|
+
_classPrivateFieldInitSpec(this, _focusInitialCoords, {
|
108
|
+
writable: true,
|
109
|
+
value: null
|
110
|
+
});
|
111
|
+
/**
|
112
|
+
* Determines if there is performed the column selection.
|
113
|
+
*
|
114
|
+
* @type {boolean}
|
115
|
+
*/
|
116
|
+
_classPrivateFieldInitSpec(this, _isColumnsSelectionInProgress, {
|
117
|
+
writable: true,
|
118
|
+
value: false
|
119
|
+
});
|
102
120
|
/**
|
103
121
|
* Custom helper for getting widths of the nested headers.
|
104
122
|
*
|
@@ -158,6 +176,19 @@ class NestedHeaders extends _base.BasePlugin {
|
|
158
176
|
this.addHook('beforeOnCellMouseOver', function () {
|
159
177
|
return _this.onBeforeOnCellMouseOver(...arguments);
|
160
178
|
});
|
179
|
+
this.addHook('beforeOnCellMouseUp', function () {
|
180
|
+
return _this.onBeforeOnCellMouseUp(...arguments);
|
181
|
+
});
|
182
|
+
this.addHook('beforeSelectionHighlightSet', function () {
|
183
|
+
return _this.onBeforeSelectionHighlightSet(...arguments);
|
184
|
+
});
|
185
|
+
this.addHook('modifyTransformStart', function () {
|
186
|
+
return _this.onModifyTransformStart(...arguments);
|
187
|
+
});
|
188
|
+
this.addHook('afterSelection', () => this.updateFocusHighlightPosition());
|
189
|
+
this.addHook('beforeViewportScrollHorizontally', function () {
|
190
|
+
return _this.onBeforeViewportScrollHorizontally(...arguments);
|
191
|
+
});
|
161
192
|
this.addHook('afterGetColumnHeaderRenderers', array => this.onAfterGetColumnHeaderRenderers(array));
|
162
193
|
this.addHook('modifyColWidth', function () {
|
163
194
|
return _this.onModifyColWidth(...arguments);
|
@@ -171,9 +202,17 @@ class NestedHeaders extends _base.BasePlugin {
|
|
171
202
|
this.addHook('beforeCopy', function () {
|
172
203
|
return _this.onBeforeCopy(...arguments);
|
173
204
|
});
|
205
|
+
this.addHook('beforeSelectColumns', function () {
|
206
|
+
return _this.onBeforeSelectColumns(...arguments);
|
207
|
+
});
|
174
208
|
this.addHook('afterViewportColumnCalculatorOverride', function () {
|
175
209
|
return _this.onAfterViewportColumnCalculatorOverride(...arguments);
|
176
210
|
});
|
211
|
+
this.addHook('modifyFocusedElement', function () {
|
212
|
+
return _this.onModifyFocusedElement(...arguments);
|
213
|
+
});
|
214
|
+
this.hot.columnIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
|
215
|
+
this.hot.rowIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
|
177
216
|
super.enablePlugin();
|
178
217
|
this.updatePlugin(); // @TODO: Workaround for broken plugin initialization abstraction.
|
179
218
|
}
|
@@ -389,6 +428,67 @@ class NestedHeaders extends _base.BasePlugin {
|
|
389
428
|
return this.hot.getColHeader(visualColumnIndex, headerLevel);
|
390
429
|
}
|
391
430
|
|
431
|
+
/**
|
432
|
+
* Updates the selection focus highlight position to point to the nested header root element (TH)
|
433
|
+
* even when the logical coordinates point in-between the header.
|
434
|
+
*
|
435
|
+
* @private
|
436
|
+
*/
|
437
|
+
updateFocusHighlightPosition() {
|
438
|
+
var _this$hot;
|
439
|
+
const selection = (_this$hot = this.hot) === null || _this$hot === void 0 ? void 0 : _this$hot.getSelectedRangeLast();
|
440
|
+
if (!selection) {
|
441
|
+
return;
|
442
|
+
}
|
443
|
+
const {
|
444
|
+
highlight
|
445
|
+
} = selection;
|
446
|
+
const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
|
447
|
+
if (isNestedHeadersRange) {
|
448
|
+
const columnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
|
449
|
+
const focusHighlight = this.hot.selection.highlight.getFocus();
|
450
|
+
|
451
|
+
// Correct the highlight/focus selection to highlight the correct TH element
|
452
|
+
focusHighlight.visualCellRange.highlight.col = columnIndex;
|
453
|
+
focusHighlight.visualCellRange.from.col = columnIndex;
|
454
|
+
focusHighlight.visualCellRange.to.col = columnIndex;
|
455
|
+
focusHighlight.commit();
|
456
|
+
}
|
457
|
+
}
|
458
|
+
|
459
|
+
/**
|
460
|
+
* Allows to control to which column index the viewport will be scrolled. To ensure that the viewport
|
461
|
+
* is scrolled to the correct column for the nested header the most left and the most right visual column
|
462
|
+
* indexes are used.
|
463
|
+
*
|
464
|
+
* @private
|
465
|
+
* @param {number} visualColumn A visual column index to which the viewport will be scrolled.
|
466
|
+
* @returns {number}
|
467
|
+
*/
|
468
|
+
onBeforeViewportScrollHorizontally(visualColumn) {
|
469
|
+
const selection = this.hot.getSelectedRangeLast();
|
470
|
+
if (!selection) {
|
471
|
+
return visualColumn;
|
472
|
+
}
|
473
|
+
const {
|
474
|
+
highlight
|
475
|
+
} = selection;
|
476
|
+
const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
|
477
|
+
if (!isNestedHeadersRange) {
|
478
|
+
return visualColumn;
|
479
|
+
}
|
480
|
+
const firstColumn = this.hot.view.getFirstFullyVisibleColumn();
|
481
|
+
const lastColumn = this.hot.view.getLastFullyVisibleColumn();
|
482
|
+
const mostLeftColumnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
|
483
|
+
const mostRightColumnIndex = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(highlight.row, highlight.col);
|
484
|
+
|
485
|
+
// do not scroll the viewport when the header is wider than the viewport
|
486
|
+
if (mostLeftColumnIndex < firstColumn && mostRightColumnIndex > lastColumn) {
|
487
|
+
return visualColumn;
|
488
|
+
}
|
489
|
+
return mostLeftColumnIndex < firstColumn ? mostLeftColumnIndex : mostRightColumnIndex;
|
490
|
+
}
|
491
|
+
|
392
492
|
/**
|
393
493
|
* Allows to control which header DOM element will be used to highlight.
|
394
494
|
*
|
@@ -404,7 +504,6 @@ class NestedHeaders extends _base.BasePlugin {
|
|
404
504
|
return visualColumn;
|
405
505
|
}
|
406
506
|
const {
|
407
|
-
classNames,
|
408
507
|
columnCursor,
|
409
508
|
selectionType,
|
410
509
|
selectionWidth
|
@@ -419,8 +518,8 @@ class NestedHeaders extends _base.BasePlugin {
|
|
419
518
|
}
|
420
519
|
} else if (selectionType === _selection.ACTIVE_HEADER_TYPE) {
|
421
520
|
if (colspan > selectionWidth - columnCursor || !isRoot) {
|
422
|
-
//
|
423
|
-
|
521
|
+
// Prevents adding any CSS class names to the TH element
|
522
|
+
return null;
|
424
523
|
}
|
425
524
|
}
|
426
525
|
return visualColumn;
|
@@ -508,6 +607,8 @@ class NestedHeaders extends _base.BasePlugin {
|
|
508
607
|
if (!headerNodeData) {
|
509
608
|
return;
|
510
609
|
}
|
610
|
+
_classPrivateFieldSet(this, _focusInitialCoords, coords.clone());
|
611
|
+
_classPrivateFieldSet(this, _isColumnsSelectionInProgress, true);
|
511
612
|
const {
|
512
613
|
selection
|
513
614
|
} = this.hot;
|
@@ -573,14 +674,129 @@ class NestedHeaders extends _base.BasePlugin {
|
|
573
674
|
controller.column = true;
|
574
675
|
controller.cell = true;
|
575
676
|
const columnsToSelect = [];
|
677
|
+
const headerLevel = (0, _number.clamp)(coords.row, -Infinity, -1);
|
576
678
|
if (coords.col < from.col) {
|
577
|
-
columnsToSelect.push(bottomEndCoords.col, columnIndex);
|
679
|
+
columnsToSelect.push(bottomEndCoords.col, columnIndex, headerLevel);
|
578
680
|
} else if (coords.col > from.col) {
|
579
|
-
columnsToSelect.push(topStartCoords.col, columnIndex + origColspan - 1);
|
681
|
+
columnsToSelect.push(topStartCoords.col, columnIndex + origColspan - 1, headerLevel);
|
580
682
|
} else {
|
581
|
-
columnsToSelect.push(columnIndex, columnIndex + origColspan - 1);
|
683
|
+
columnsToSelect.push(columnIndex, columnIndex + origColspan - 1, headerLevel);
|
684
|
+
}
|
685
|
+
this.hot.selection.selectColumns(...columnsToSelect);
|
686
|
+
}
|
687
|
+
|
688
|
+
/**
|
689
|
+
* Switches internal flag about selection progress to `false`.
|
690
|
+
*
|
691
|
+
* @private
|
692
|
+
*/
|
693
|
+
onBeforeOnCellMouseUp() {
|
694
|
+
_classPrivateFieldSet(this, _isColumnsSelectionInProgress, false);
|
695
|
+
}
|
696
|
+
|
697
|
+
/**
|
698
|
+
* The hook checks and ensures that the focus position that depends on the selected columns
|
699
|
+
* range is always positioned within the range.
|
700
|
+
*
|
701
|
+
* @private
|
702
|
+
*/
|
703
|
+
onBeforeSelectionHighlightSet() {
|
704
|
+
const {
|
705
|
+
navigableHeaders
|
706
|
+
} = this.hot.getSettings();
|
707
|
+
if (!this.hot.view.isMouseDown() || !_classPrivateFieldGet(this, _isColumnsSelectionInProgress) || !navigableHeaders) {
|
708
|
+
return;
|
709
|
+
}
|
710
|
+
const selectedRange = this.hot.getSelectedRangeLast();
|
711
|
+
const columnStart = selectedRange.getTopStartCorner().col;
|
712
|
+
const columnEnd = selectedRange.getBottomEndCorner().col;
|
713
|
+
const {
|
714
|
+
columnIndex,
|
715
|
+
origColspan
|
716
|
+
} = _classPrivateFieldGet(this, _stateManager).getHeaderTreeNodeData(_classPrivateFieldGet(this, _focusInitialCoords).row, _classPrivateFieldGet(this, _focusInitialCoords).col);
|
717
|
+
selectedRange.setHighlight(_classPrivateFieldGet(this, _focusInitialCoords));
|
718
|
+
if (origColspan > selectedRange.getWidth() || columnIndex < columnStart || columnIndex + origColspan - 1 > columnEnd) {
|
719
|
+
const headerLevel = _classPrivateFieldGet(this, _stateManager).findTopMostEntireHeaderLevel((0, _number.clamp)(columnStart, columnIndex, columnIndex + origColspan - 1), (0, _number.clamp)(columnEnd, columnIndex, columnIndex + origColspan - 1));
|
720
|
+
selectedRange.highlight.row = headerLevel;
|
721
|
+
selectedRange.highlight.col = selectedRange.from.col;
|
722
|
+
}
|
723
|
+
}
|
724
|
+
|
725
|
+
/**
|
726
|
+
* `modifyTransformStart` hook is called every time the keyboard navigation is used.
|
727
|
+
*
|
728
|
+
* @private
|
729
|
+
* @param {object} delta The transformation delta.
|
730
|
+
*/
|
731
|
+
onModifyTransformStart(delta) {
|
732
|
+
const {
|
733
|
+
highlight
|
734
|
+
} = this.hot.getSelectedRangeLast();
|
735
|
+
const nextCoords = this.hot._createCellCoords(highlight.row + delta.row, highlight.col + delta.col);
|
736
|
+
const isNestedHeadersRange = nextCoords.isHeader() && nextCoords.col >= 0;
|
737
|
+
if (!isNestedHeadersRange) {
|
738
|
+
return;
|
739
|
+
}
|
740
|
+
const visualColumnIndexStart = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(nextCoords.row, nextCoords.col);
|
741
|
+
const visualColumnIndexEnd = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(nextCoords.row, nextCoords.col);
|
742
|
+
if (delta.col < 0) {
|
743
|
+
const nextColumn = highlight.col >= visualColumnIndexStart && highlight.col <= visualColumnIndexEnd ? visualColumnIndexStart - 1 : visualColumnIndexEnd;
|
744
|
+
const notHiddenColumnIndex = this.hot.columnIndexMapper.getNearestNotHiddenIndex(nextColumn, -1);
|
745
|
+
if (notHiddenColumnIndex === null) {
|
746
|
+
// There are no visible columns anymore, so move the selection out of the table edge. This will
|
747
|
+
// be processed by the selection Transformer class as a move selection to the previous row (if autoWrapRow is enabled).
|
748
|
+
delta.col = -this.hot.view.countRenderableColumnsInRange(0, highlight.col);
|
749
|
+
} else {
|
750
|
+
delta.col = -Math.max(this.hot.view.countRenderableColumnsInRange(notHiddenColumnIndex, highlight.col) - 1, 1);
|
751
|
+
}
|
752
|
+
} else if (delta.col > 0) {
|
753
|
+
const nextColumn = highlight.col >= visualColumnIndexStart && highlight.col <= visualColumnIndexEnd ? visualColumnIndexEnd + 1 : visualColumnIndexStart;
|
754
|
+
const notHiddenColumnIndex = this.hot.columnIndexMapper.getNearestNotHiddenIndex(nextColumn, 1);
|
755
|
+
if (notHiddenColumnIndex === null) {
|
756
|
+
// There are no visible columns anymore, so move the selection out of the table edge. This will
|
757
|
+
// be processed by the selection Transformer class as a move selection to the next row (if autoWrapRow is enabled).
|
758
|
+
delta.col = this.hot.view.countRenderableColumnsInRange(highlight.col, this.hot.countCols());
|
759
|
+
} else {
|
760
|
+
delta.col = Math.max(this.hot.view.countRenderableColumnsInRange(highlight.col, notHiddenColumnIndex) - 1, 1);
|
761
|
+
}
|
762
|
+
}
|
763
|
+
}
|
764
|
+
|
765
|
+
/**
|
766
|
+
* The hook observes the column selection from the Selection API and modifies the column range to
|
767
|
+
* ensure that the whole nested column will be covered.
|
768
|
+
*
|
769
|
+
* @private
|
770
|
+
* @param {CellCoords} from The coords object where the selection starts.
|
771
|
+
* @param {CellCoords} to The coords object where the selection ends.
|
772
|
+
*/
|
773
|
+
onBeforeSelectColumns(from, to) {
|
774
|
+
const headerLevel = from.row;
|
775
|
+
const startNodeData = this._getHeaderTreeNodeDataByCoords({
|
776
|
+
row: headerLevel,
|
777
|
+
col: from.col
|
778
|
+
});
|
779
|
+
const endNodeData = this._getHeaderTreeNodeDataByCoords({
|
780
|
+
row: headerLevel,
|
781
|
+
col: to.col
|
782
|
+
});
|
783
|
+
if (to.col < from.col) {
|
784
|
+
// Column selection from right to left
|
785
|
+
if (startNodeData) {
|
786
|
+
from.col = startNodeData.columnIndex + startNodeData.origColspan - 1;
|
787
|
+
}
|
788
|
+
if (endNodeData) {
|
789
|
+
to.col = endNodeData.columnIndex;
|
790
|
+
}
|
791
|
+
} else if (to.col >= from.col) {
|
792
|
+
// Column selection from left to right or a single column selection
|
793
|
+
if (startNodeData) {
|
794
|
+
from.col = startNodeData.columnIndex;
|
795
|
+
}
|
796
|
+
if (endNodeData) {
|
797
|
+
to.col = endNodeData.columnIndex + endNodeData.origColspan - 1;
|
798
|
+
}
|
582
799
|
}
|
583
|
-
this.hot.selectColumns(...columnsToSelect);
|
584
800
|
}
|
585
801
|
|
586
802
|
/**
|
@@ -665,6 +881,20 @@ class NestedHeaders extends _base.BasePlugin {
|
|
665
881
|
return label;
|
666
882
|
}
|
667
883
|
|
884
|
+
/**
|
885
|
+
* `modifyFocusedElement` hook callback.
|
886
|
+
*
|
887
|
+
* @private
|
888
|
+
* @param {number} row Row index.
|
889
|
+
* @param {number} column Column index.
|
890
|
+
* @returns {HTMLTableCellElement} The `TH` element to be focused.
|
891
|
+
*/
|
892
|
+
onModifyFocusedElement(row, column) {
|
893
|
+
if (row < 0) {
|
894
|
+
return this.hot.getCell(row, _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(row, column), true);
|
895
|
+
}
|
896
|
+
}
|
897
|
+
|
668
898
|
/**
|
669
899
|
* Updates the plugin state after HoT initialization.
|
670
900
|
*
|
@@ -11,9 +11,9 @@ function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classEx
|
|
11
11
|
function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
|
12
12
|
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
|
13
13
|
import { addClass, removeClass } from "../../helpers/dom/element.mjs";
|
14
|
-
import { isNumeric } from "../../helpers/number.mjs";
|
15
|
-
import { isLeftClick, isRightClick } from "../../helpers/dom/event.mjs";
|
14
|
+
import { isNumeric, clamp } from "../../helpers/number.mjs";
|
16
15
|
import { toSingleLine } from "../../helpers/templateLiteralTag.mjs";
|
16
|
+
import { isLeftClick, isRightClick } from "../../helpers/dom/event.mjs";
|
17
17
|
import { warn } from "../../helpers/console.mjs";
|
18
18
|
import { ACTIVE_HEADER_TYPE, HEADER_TYPE } from "../../selection/index.mjs";
|
19
19
|
import { BasePlugin } from "../base/index.mjs";
|
@@ -69,13 +69,14 @@ export const PLUGIN_PRIORITY = 280;
|
|
69
69
|
*/
|
70
70
|
var _stateManager = /*#__PURE__*/new WeakMap();
|
71
71
|
var _hidingIndexMapObserver = /*#__PURE__*/new WeakMap();
|
72
|
+
var _focusInitialCoords = /*#__PURE__*/new WeakMap();
|
73
|
+
var _isColumnsSelectionInProgress = /*#__PURE__*/new WeakMap();
|
72
74
|
export class NestedHeaders extends BasePlugin {
|
73
75
|
constructor() {
|
74
76
|
super(...arguments);
|
75
77
|
/**
|
76
78
|
* The state manager for the nested headers.
|
77
79
|
*
|
78
|
-
* @private
|
79
80
|
* @type {StateManager}
|
80
81
|
*/
|
81
82
|
_classPrivateFieldInitSpec(this, _stateManager, {
|
@@ -86,13 +87,30 @@ export class NestedHeaders extends BasePlugin {
|
|
86
87
|
* The instance of the ChangesObservable class that allows track the changes that happens in the
|
87
88
|
* column indexes.
|
88
89
|
*
|
89
|
-
* @private
|
90
90
|
* @type {ChangesObservable}
|
91
91
|
*/
|
92
92
|
_classPrivateFieldInitSpec(this, _hidingIndexMapObserver, {
|
93
93
|
writable: true,
|
94
94
|
value: null
|
95
95
|
});
|
96
|
+
/**
|
97
|
+
* Holds the coords that points to the place where the column selection starts.
|
98
|
+
*
|
99
|
+
* @type {number|null}
|
100
|
+
*/
|
101
|
+
_classPrivateFieldInitSpec(this, _focusInitialCoords, {
|
102
|
+
writable: true,
|
103
|
+
value: null
|
104
|
+
});
|
105
|
+
/**
|
106
|
+
* Determines if there is performed the column selection.
|
107
|
+
*
|
108
|
+
* @type {boolean}
|
109
|
+
*/
|
110
|
+
_classPrivateFieldInitSpec(this, _isColumnsSelectionInProgress, {
|
111
|
+
writable: true,
|
112
|
+
value: false
|
113
|
+
});
|
96
114
|
/**
|
97
115
|
* Custom helper for getting widths of the nested headers.
|
98
116
|
*
|
@@ -152,6 +170,19 @@ export class NestedHeaders extends BasePlugin {
|
|
152
170
|
this.addHook('beforeOnCellMouseOver', function () {
|
153
171
|
return _this.onBeforeOnCellMouseOver(...arguments);
|
154
172
|
});
|
173
|
+
this.addHook('beforeOnCellMouseUp', function () {
|
174
|
+
return _this.onBeforeOnCellMouseUp(...arguments);
|
175
|
+
});
|
176
|
+
this.addHook('beforeSelectionHighlightSet', function () {
|
177
|
+
return _this.onBeforeSelectionHighlightSet(...arguments);
|
178
|
+
});
|
179
|
+
this.addHook('modifyTransformStart', function () {
|
180
|
+
return _this.onModifyTransformStart(...arguments);
|
181
|
+
});
|
182
|
+
this.addHook('afterSelection', () => this.updateFocusHighlightPosition());
|
183
|
+
this.addHook('beforeViewportScrollHorizontally', function () {
|
184
|
+
return _this.onBeforeViewportScrollHorizontally(...arguments);
|
185
|
+
});
|
155
186
|
this.addHook('afterGetColumnHeaderRenderers', array => this.onAfterGetColumnHeaderRenderers(array));
|
156
187
|
this.addHook('modifyColWidth', function () {
|
157
188
|
return _this.onModifyColWidth(...arguments);
|
@@ -165,9 +196,17 @@ export class NestedHeaders extends BasePlugin {
|
|
165
196
|
this.addHook('beforeCopy', function () {
|
166
197
|
return _this.onBeforeCopy(...arguments);
|
167
198
|
});
|
199
|
+
this.addHook('beforeSelectColumns', function () {
|
200
|
+
return _this.onBeforeSelectColumns(...arguments);
|
201
|
+
});
|
168
202
|
this.addHook('afterViewportColumnCalculatorOverride', function () {
|
169
203
|
return _this.onAfterViewportColumnCalculatorOverride(...arguments);
|
170
204
|
});
|
205
|
+
this.addHook('modifyFocusedElement', function () {
|
206
|
+
return _this.onModifyFocusedElement(...arguments);
|
207
|
+
});
|
208
|
+
this.hot.columnIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
|
209
|
+
this.hot.rowIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
|
171
210
|
super.enablePlugin();
|
172
211
|
this.updatePlugin(); // @TODO: Workaround for broken plugin initialization abstraction.
|
173
212
|
}
|
@@ -383,6 +422,67 @@ export class NestedHeaders extends BasePlugin {
|
|
383
422
|
return this.hot.getColHeader(visualColumnIndex, headerLevel);
|
384
423
|
}
|
385
424
|
|
425
|
+
/**
|
426
|
+
* Updates the selection focus highlight position to point to the nested header root element (TH)
|
427
|
+
* even when the logical coordinates point in-between the header.
|
428
|
+
*
|
429
|
+
* @private
|
430
|
+
*/
|
431
|
+
updateFocusHighlightPosition() {
|
432
|
+
var _this$hot;
|
433
|
+
const selection = (_this$hot = this.hot) === null || _this$hot === void 0 ? void 0 : _this$hot.getSelectedRangeLast();
|
434
|
+
if (!selection) {
|
435
|
+
return;
|
436
|
+
}
|
437
|
+
const {
|
438
|
+
highlight
|
439
|
+
} = selection;
|
440
|
+
const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
|
441
|
+
if (isNestedHeadersRange) {
|
442
|
+
const columnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
|
443
|
+
const focusHighlight = this.hot.selection.highlight.getFocus();
|
444
|
+
|
445
|
+
// Correct the highlight/focus selection to highlight the correct TH element
|
446
|
+
focusHighlight.visualCellRange.highlight.col = columnIndex;
|
447
|
+
focusHighlight.visualCellRange.from.col = columnIndex;
|
448
|
+
focusHighlight.visualCellRange.to.col = columnIndex;
|
449
|
+
focusHighlight.commit();
|
450
|
+
}
|
451
|
+
}
|
452
|
+
|
453
|
+
/**
|
454
|
+
* Allows to control to which column index the viewport will be scrolled. To ensure that the viewport
|
455
|
+
* is scrolled to the correct column for the nested header the most left and the most right visual column
|
456
|
+
* indexes are used.
|
457
|
+
*
|
458
|
+
* @private
|
459
|
+
* @param {number} visualColumn A visual column index to which the viewport will be scrolled.
|
460
|
+
* @returns {number}
|
461
|
+
*/
|
462
|
+
onBeforeViewportScrollHorizontally(visualColumn) {
|
463
|
+
const selection = this.hot.getSelectedRangeLast();
|
464
|
+
if (!selection) {
|
465
|
+
return visualColumn;
|
466
|
+
}
|
467
|
+
const {
|
468
|
+
highlight
|
469
|
+
} = selection;
|
470
|
+
const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
|
471
|
+
if (!isNestedHeadersRange) {
|
472
|
+
return visualColumn;
|
473
|
+
}
|
474
|
+
const firstColumn = this.hot.view.getFirstFullyVisibleColumn();
|
475
|
+
const lastColumn = this.hot.view.getLastFullyVisibleColumn();
|
476
|
+
const mostLeftColumnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
|
477
|
+
const mostRightColumnIndex = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(highlight.row, highlight.col);
|
478
|
+
|
479
|
+
// do not scroll the viewport when the header is wider than the viewport
|
480
|
+
if (mostLeftColumnIndex < firstColumn && mostRightColumnIndex > lastColumn) {
|
481
|
+
return visualColumn;
|
482
|
+
}
|
483
|
+
return mostLeftColumnIndex < firstColumn ? mostLeftColumnIndex : mostRightColumnIndex;
|
484
|
+
}
|
485
|
+
|
386
486
|
/**
|
387
487
|
* Allows to control which header DOM element will be used to highlight.
|
388
488
|
*
|
@@ -398,7 +498,6 @@ export class NestedHeaders extends BasePlugin {
|
|
398
498
|
return visualColumn;
|
399
499
|
}
|
400
500
|
const {
|
401
|
-
classNames,
|
402
501
|
columnCursor,
|
403
502
|
selectionType,
|
404
503
|
selectionWidth
|
@@ -413,8 +512,8 @@ export class NestedHeaders extends BasePlugin {
|
|
413
512
|
}
|
414
513
|
} else if (selectionType === ACTIVE_HEADER_TYPE) {
|
415
514
|
if (colspan > selectionWidth - columnCursor || !isRoot) {
|
416
|
-
//
|
417
|
-
|
515
|
+
// Prevents adding any CSS class names to the TH element
|
516
|
+
return null;
|
418
517
|
}
|
419
518
|
}
|
420
519
|
return visualColumn;
|
@@ -502,6 +601,8 @@ export class NestedHeaders extends BasePlugin {
|
|
502
601
|
if (!headerNodeData) {
|
503
602
|
return;
|
504
603
|
}
|
604
|
+
_classPrivateFieldSet(this, _focusInitialCoords, coords.clone());
|
605
|
+
_classPrivateFieldSet(this, _isColumnsSelectionInProgress, true);
|
505
606
|
const {
|
506
607
|
selection
|
507
608
|
} = this.hot;
|
@@ -567,14 +668,129 @@ export class NestedHeaders extends BasePlugin {
|
|
567
668
|
controller.column = true;
|
568
669
|
controller.cell = true;
|
569
670
|
const columnsToSelect = [];
|
671
|
+
const headerLevel = clamp(coords.row, -Infinity, -1);
|
570
672
|
if (coords.col < from.col) {
|
571
|
-
columnsToSelect.push(bottomEndCoords.col, columnIndex);
|
673
|
+
columnsToSelect.push(bottomEndCoords.col, columnIndex, headerLevel);
|
572
674
|
} else if (coords.col > from.col) {
|
573
|
-
columnsToSelect.push(topStartCoords.col, columnIndex + origColspan - 1);
|
675
|
+
columnsToSelect.push(topStartCoords.col, columnIndex + origColspan - 1, headerLevel);
|
574
676
|
} else {
|
575
|
-
columnsToSelect.push(columnIndex, columnIndex + origColspan - 1);
|
677
|
+
columnsToSelect.push(columnIndex, columnIndex + origColspan - 1, headerLevel);
|
678
|
+
}
|
679
|
+
this.hot.selection.selectColumns(...columnsToSelect);
|
680
|
+
}
|
681
|
+
|
682
|
+
/**
|
683
|
+
* Switches internal flag about selection progress to `false`.
|
684
|
+
*
|
685
|
+
* @private
|
686
|
+
*/
|
687
|
+
onBeforeOnCellMouseUp() {
|
688
|
+
_classPrivateFieldSet(this, _isColumnsSelectionInProgress, false);
|
689
|
+
}
|
690
|
+
|
691
|
+
/**
|
692
|
+
* The hook checks and ensures that the focus position that depends on the selected columns
|
693
|
+
* range is always positioned within the range.
|
694
|
+
*
|
695
|
+
* @private
|
696
|
+
*/
|
697
|
+
onBeforeSelectionHighlightSet() {
|
698
|
+
const {
|
699
|
+
navigableHeaders
|
700
|
+
} = this.hot.getSettings();
|
701
|
+
if (!this.hot.view.isMouseDown() || !_classPrivateFieldGet(this, _isColumnsSelectionInProgress) || !navigableHeaders) {
|
702
|
+
return;
|
703
|
+
}
|
704
|
+
const selectedRange = this.hot.getSelectedRangeLast();
|
705
|
+
const columnStart = selectedRange.getTopStartCorner().col;
|
706
|
+
const columnEnd = selectedRange.getBottomEndCorner().col;
|
707
|
+
const {
|
708
|
+
columnIndex,
|
709
|
+
origColspan
|
710
|
+
} = _classPrivateFieldGet(this, _stateManager).getHeaderTreeNodeData(_classPrivateFieldGet(this, _focusInitialCoords).row, _classPrivateFieldGet(this, _focusInitialCoords).col);
|
711
|
+
selectedRange.setHighlight(_classPrivateFieldGet(this, _focusInitialCoords));
|
712
|
+
if (origColspan > selectedRange.getWidth() || columnIndex < columnStart || columnIndex + origColspan - 1 > columnEnd) {
|
713
|
+
const headerLevel = _classPrivateFieldGet(this, _stateManager).findTopMostEntireHeaderLevel(clamp(columnStart, columnIndex, columnIndex + origColspan - 1), clamp(columnEnd, columnIndex, columnIndex + origColspan - 1));
|
714
|
+
selectedRange.highlight.row = headerLevel;
|
715
|
+
selectedRange.highlight.col = selectedRange.from.col;
|
716
|
+
}
|
717
|
+
}
|
718
|
+
|
719
|
+
/**
|
720
|
+
* `modifyTransformStart` hook is called every time the keyboard navigation is used.
|
721
|
+
*
|
722
|
+
* @private
|
723
|
+
* @param {object} delta The transformation delta.
|
724
|
+
*/
|
725
|
+
onModifyTransformStart(delta) {
|
726
|
+
const {
|
727
|
+
highlight
|
728
|
+
} = this.hot.getSelectedRangeLast();
|
729
|
+
const nextCoords = this.hot._createCellCoords(highlight.row + delta.row, highlight.col + delta.col);
|
730
|
+
const isNestedHeadersRange = nextCoords.isHeader() && nextCoords.col >= 0;
|
731
|
+
if (!isNestedHeadersRange) {
|
732
|
+
return;
|
733
|
+
}
|
734
|
+
const visualColumnIndexStart = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(nextCoords.row, nextCoords.col);
|
735
|
+
const visualColumnIndexEnd = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(nextCoords.row, nextCoords.col);
|
736
|
+
if (delta.col < 0) {
|
737
|
+
const nextColumn = highlight.col >= visualColumnIndexStart && highlight.col <= visualColumnIndexEnd ? visualColumnIndexStart - 1 : visualColumnIndexEnd;
|
738
|
+
const notHiddenColumnIndex = this.hot.columnIndexMapper.getNearestNotHiddenIndex(nextColumn, -1);
|
739
|
+
if (notHiddenColumnIndex === null) {
|
740
|
+
// There are no visible columns anymore, so move the selection out of the table edge. This will
|
741
|
+
// be processed by the selection Transformer class as a move selection to the previous row (if autoWrapRow is enabled).
|
742
|
+
delta.col = -this.hot.view.countRenderableColumnsInRange(0, highlight.col);
|
743
|
+
} else {
|
744
|
+
delta.col = -Math.max(this.hot.view.countRenderableColumnsInRange(notHiddenColumnIndex, highlight.col) - 1, 1);
|
745
|
+
}
|
746
|
+
} else if (delta.col > 0) {
|
747
|
+
const nextColumn = highlight.col >= visualColumnIndexStart && highlight.col <= visualColumnIndexEnd ? visualColumnIndexEnd + 1 : visualColumnIndexStart;
|
748
|
+
const notHiddenColumnIndex = this.hot.columnIndexMapper.getNearestNotHiddenIndex(nextColumn, 1);
|
749
|
+
if (notHiddenColumnIndex === null) {
|
750
|
+
// There are no visible columns anymore, so move the selection out of the table edge. This will
|
751
|
+
// be processed by the selection Transformer class as a move selection to the next row (if autoWrapRow is enabled).
|
752
|
+
delta.col = this.hot.view.countRenderableColumnsInRange(highlight.col, this.hot.countCols());
|
753
|
+
} else {
|
754
|
+
delta.col = Math.max(this.hot.view.countRenderableColumnsInRange(highlight.col, notHiddenColumnIndex) - 1, 1);
|
755
|
+
}
|
756
|
+
}
|
757
|
+
}
|
758
|
+
|
759
|
+
/**
|
760
|
+
* The hook observes the column selection from the Selection API and modifies the column range to
|
761
|
+
* ensure that the whole nested column will be covered.
|
762
|
+
*
|
763
|
+
* @private
|
764
|
+
* @param {CellCoords} from The coords object where the selection starts.
|
765
|
+
* @param {CellCoords} to The coords object where the selection ends.
|
766
|
+
*/
|
767
|
+
onBeforeSelectColumns(from, to) {
|
768
|
+
const headerLevel = from.row;
|
769
|
+
const startNodeData = this._getHeaderTreeNodeDataByCoords({
|
770
|
+
row: headerLevel,
|
771
|
+
col: from.col
|
772
|
+
});
|
773
|
+
const endNodeData = this._getHeaderTreeNodeDataByCoords({
|
774
|
+
row: headerLevel,
|
775
|
+
col: to.col
|
776
|
+
});
|
777
|
+
if (to.col < from.col) {
|
778
|
+
// Column selection from right to left
|
779
|
+
if (startNodeData) {
|
780
|
+
from.col = startNodeData.columnIndex + startNodeData.origColspan - 1;
|
781
|
+
}
|
782
|
+
if (endNodeData) {
|
783
|
+
to.col = endNodeData.columnIndex;
|
784
|
+
}
|
785
|
+
} else if (to.col >= from.col) {
|
786
|
+
// Column selection from left to right or a single column selection
|
787
|
+
if (startNodeData) {
|
788
|
+
from.col = startNodeData.columnIndex;
|
789
|
+
}
|
790
|
+
if (endNodeData) {
|
791
|
+
to.col = endNodeData.columnIndex + endNodeData.origColspan - 1;
|
792
|
+
}
|
576
793
|
}
|
577
|
-
this.hot.selectColumns(...columnsToSelect);
|
578
794
|
}
|
579
795
|
|
580
796
|
/**
|
@@ -659,6 +875,20 @@ export class NestedHeaders extends BasePlugin {
|
|
659
875
|
return label;
|
660
876
|
}
|
661
877
|
|
878
|
+
/**
|
879
|
+
* `modifyFocusedElement` hook callback.
|
880
|
+
*
|
881
|
+
* @private
|
882
|
+
* @param {number} row Row index.
|
883
|
+
* @param {number} column Column index.
|
884
|
+
* @returns {HTMLTableCellElement} The `TH` element to be focused.
|
885
|
+
*/
|
886
|
+
onModifyFocusedElement(row, column) {
|
887
|
+
if (row < 0) {
|
888
|
+
return this.hot.getCell(row, _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(row, column), true);
|
889
|
+
}
|
890
|
+
}
|
891
|
+
|
662
892
|
/**
|
663
893
|
* Updates the plugin state after HoT initialization.
|
664
894
|
*
|