handsontable 0.0.0-next-b66c79f-20230713 → 0.0.0-next-08765b9-20230714
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 +87 -33
- package/3rdparty/walkontable/src/cell/coords.mjs +87 -33
- package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
- package/3rdparty/walkontable/src/cell/range.js +92 -46
- package/3rdparty/walkontable/src/cell/range.mjs +92 -46
- package/3rdparty/walkontable/src/core/_base.js +41 -33
- package/3rdparty/walkontable/src/core/_base.mjs +41 -33
- package/3rdparty/walkontable/src/core/clone.js +8 -5
- package/3rdparty/walkontable/src/core/clone.mjs +8 -5
- package/3rdparty/walkontable/src/core/core.js +3 -2
- package/3rdparty/walkontable/src/core/core.mjs +3 -2
- package/3rdparty/walkontable/src/event.js +9 -8
- package/3rdparty/walkontable/src/event.mjs +9 -8
- 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 +11 -9
- package/3rdparty/walkontable/src/overlay/_base.mjs +11 -9
- package/3rdparty/walkontable/src/overlay/bottom.js +10 -8
- package/3rdparty/walkontable/src/overlay/bottom.mjs +10 -8
- 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 +12 -14
- package/3rdparty/walkontable/src/overlay/top.mjs +12 -14
- package/3rdparty/walkontable/src/overlay/topInlineStartCorner.js +16 -13
- package/3rdparty/walkontable/src/overlay/topInlineStartCorner.mjs +16 -13
- package/3rdparty/walkontable/src/overlays.js +75 -80
- package/3rdparty/walkontable/src/overlays.mjs +75 -80
- package/3rdparty/walkontable/src/scroll.js +27 -24
- package/3rdparty/walkontable/src/scroll.mjs +27 -24
- 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 +259 -0
- package/3rdparty/walkontable/src/selection/manager.mjs +254 -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 +18 -17
- package/3rdparty/walkontable/src/settings.mjs +18 -17
- 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 +48 -115
- package/3rdparty/walkontable/src/table.mjs +49 -116
- package/base.js +2 -2
- package/base.mjs +2 -2
- package/core/focusCatcher/focusDetector.js +58 -0
- package/core/focusCatcher/focusDetector.mjs +54 -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 +6 -3
- package/core.js +181 -298
- package/core.mjs +181 -298
- package/dataMap/metaManager/metaLayers/cellMeta.js +2 -1
- package/dataMap/metaManager/metaLayers/cellMeta.mjs +2 -1
- package/dataMap/metaManager/metaLayers/globalMeta.js +1 -1
- package/dataMap/metaManager/metaLayers/globalMeta.mjs +1 -1
- package/dataMap/metaManager/metaSchema.js +41 -0
- package/dataMap/metaManager/metaSchema.mjs +41 -0
- package/dataMap/metaManager/mods/dynamicCellMeta.js +3 -2
- package/dataMap/metaManager/mods/dynamicCellMeta.mjs +3 -2
- package/dataMap/metaManager/utils.js +4 -2
- package/dataMap/metaManager/utils.mjs +4 -2
- package/dist/handsontable.css +19 -3
- package/dist/handsontable.full.css +19 -3
- package/dist/handsontable.full.js +10739 -7037
- package/dist/handsontable.full.min.css +3 -3
- package/dist/handsontable.full.min.js +25 -25
- package/dist/handsontable.js +24884 -21182
- package/dist/handsontable.min.css +3 -3
- package/dist/handsontable.min.js +19 -19
- package/editorManager.js +11 -75
- package/editorManager.mjs +11 -74
- package/editors/autocompleteEditor/autocompleteEditor.js +70 -67
- package/editors/autocompleteEditor/autocompleteEditor.mjs +70 -67
- package/editors/baseEditor/baseEditor.js +1 -1
- package/editors/baseEditor/baseEditor.mjs +1 -1
- package/editors/dateEditor/dateEditor.js +2 -1
- package/editors/dateEditor/dateEditor.mjs +2 -1
- package/editors/textEditor/textEditor.js +3 -11
- package/editors/textEditor/textEditor.mjs +4 -12
- 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/helpers/object.js +1 -0
- package/helpers/object.mjs +1 -0
- package/index.js +5 -5
- package/index.mjs +5 -5
- package/package.json +1 -1
- package/pluginHooks.d.ts +7 -1
- package/pluginHooks.js +106 -1
- package/pluginHooks.mjs +106 -1
- package/plugins/autoColumnSize/autoColumnSize.js +4 -1
- package/plugins/autoColumnSize/autoColumnSize.mjs +4 -1
- package/plugins/collapsibleColumns/collapsibleColumns.js +110 -40
- package/plugins/collapsibleColumns/collapsibleColumns.mjs +110 -40
- package/plugins/columnSorting/columnSorting.js +40 -1
- package/plugins/columnSorting/columnSorting.mjs +40 -3
- package/plugins/columnSorting/columnStatesManager.js +2 -1
- package/plugins/columnSorting/columnStatesManager.mjs +2 -1
- 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 +253 -191
- package/plugins/comments/comments.mjs +252 -192
- 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/contextMenu.d.ts +1 -1
- package/plugins/contextMenu/contextMenu.js +72 -30
- package/plugins/contextMenu/contextMenu.mjs +73 -31
- 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/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 +28 -16
- package/plugins/contextMenu/utils.mjs +27 -15
- 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 +12 -6
- package/plugins/copyPaste/copyPaste.mjs +12 -6
- package/plugins/customBorders/customBorders.js +36 -29
- package/plugins/customBorders/customBorders.mjs +37 -30
- package/plugins/customBorders/utils.js +3 -3
- package/plugins/customBorders/utils.mjs +3 -3
- package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
- package/plugins/dropdownMenu/dropdownMenu.js +89 -32
- package/plugins/dropdownMenu/dropdownMenu.mjs +89 -32
- package/plugins/filters/conditionCollection.js +6 -5
- package/plugins/filters/conditionCollection.mjs +6 -5
- package/plugins/filters/filters.js +44 -21
- package/plugins/filters/filters.mjs +43 -20
- package/plugins/formulas/engine/register.js +3 -3
- package/plugins/formulas/engine/register.mjs +3 -3
- package/plugins/formulas/engine/settings.js +6 -3
- package/plugins/formulas/engine/settings.mjs +6 -3
- package/plugins/formulas/formulas.js +151 -143
- package/plugins/formulas/formulas.mjs +151 -143
- package/plugins/formulas/indexSyncer/axisSyncer.js +115 -79
- package/plugins/formulas/indexSyncer/axisSyncer.mjs +115 -79
- package/plugins/formulas/indexSyncer/index.js +100 -64
- package/plugins/formulas/indexSyncer/index.mjs +100 -64
- package/plugins/hiddenColumns/contextMenuItem/showColumn.js +2 -2
- package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +2 -2
- package/plugins/hiddenColumns/hiddenColumns.js +51 -34
- package/plugins/hiddenColumns/hiddenColumns.mjs +51 -34
- package/plugins/hiddenRows/contextMenuItem/showRow.js +2 -2
- package/plugins/hiddenRows/contextMenuItem/showRow.mjs +2 -2
- package/plugins/hiddenRows/hiddenRows.js +50 -33
- package/plugins/hiddenRows/hiddenRows.mjs +50 -33
- package/plugins/manualRowResize/manualRowResize.js +2 -1
- package/plugins/manualRowResize/manualRowResize.mjs +2 -1
- package/plugins/mergeCells/mergeCells.js +6 -17
- package/plugins/mergeCells/mergeCells.mjs +6 -17
- package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
- package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
- package/plugins/nestedHeaders/nestedHeaders.js +209 -75
- package/plugins/nestedHeaders/nestedHeaders.mjs +208 -74
- package/plugins/nestedHeaders/stateManager/headersTree.js +58 -38
- package/plugins/nestedHeaders/stateManager/headersTree.mjs +58 -38
- package/plugins/nestedHeaders/stateManager/index.js +107 -49
- package/plugins/nestedHeaders/stateManager/index.mjs +105 -47
- package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.js +1 -1
- package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.mjs +1 -1
- package/plugins/nestedHeaders/stateManager/sourceSettings.js +57 -37
- package/plugins/nestedHeaders/stateManager/sourceSettings.mjs +57 -37
- package/plugins/nestedHeaders/utils/ghostTable.js +39 -35
- package/plugins/nestedHeaders/utils/ghostTable.mjs +39 -35
- package/plugins/nestedRows/data/dataManager.js +4 -2
- package/plugins/nestedRows/data/dataManager.mjs +4 -2
- package/plugins/nestedRows/nestedRows.js +41 -0
- package/plugins/nestedRows/nestedRows.mjs +41 -0
- package/plugins/persistentState/storage.js +1 -0
- package/plugins/persistentState/storage.mjs +1 -0
- package/plugins/undoRedo/undoRedo.js +2 -1
- package/plugins/undoRedo/undoRedo.mjs +2 -1
- package/renderers/checkboxRenderer/checkboxRenderer.js +2 -2
- package/renderers/checkboxRenderer/checkboxRenderer.mjs +1 -1
- 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 +41 -33
- package/selection/highlight/visualSelection.mjs +41 -33
- package/selection/index.js +4 -7
- package/selection/index.mjs +2 -3
- package/selection/mouseEventHandler.js +1 -1
- package/selection/mouseEventHandler.mjs +1 -1
- package/selection/range.js +8 -8
- package/selection/range.mjs +8 -8
- package/selection/selection.js +290 -154
- package/selection/selection.mjs +287 -153
- 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 +2 -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 +21 -0
- package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +17 -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 +21 -0
- package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +17 -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 +31 -0
- package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +27 -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 +31 -0
- package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +27 -0
- package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
- package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
- package/shortcutContexts/commands/scrollToFocusedCell.js +36 -0
- package/shortcutContexts/commands/scrollToFocusedCell.mjs +32 -0
- package/shortcutContexts/commands/selectAll.js +10 -0
- package/shortcutContexts/commands/selectAll.mjs +6 -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/manager.js +2 -0
- package/shortcuts/manager.mjs +2 -0
- package/shortcuts/recorder.js +2 -2
- package/shortcuts/recorder.mjs +2 -2
- package/shortcuts/utils.js +19 -5
- package/shortcuts/utils.mjs +18 -4
- package/tableView.js +163 -91
- package/tableView.mjs +163 -91
- package/translations/changesObservable/observable.js +82 -54
- package/translations/changesObservable/observable.mjs +82 -54
- package/translations/changesObservable/observer.js +24 -11
- package/translations/changesObservable/observer.mjs +24 -11
- package/translations/maps/linkedPhysicalIndexToValueMap.js +14 -8
- package/translations/maps/linkedPhysicalIndexToValueMap.mjs +14 -8
- package/utils/dataStructures/tree.js +21 -18
- package/utils/dataStructures/tree.mjs +21 -18
- package/3rdparty/walkontable/src/selection.js +0 -295
- package/3rdparty/walkontable/src/selection.mjs +0 -290
- 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
@@ -1,6 +1,9 @@
|
|
1
|
-
import "core-js/modules/es.array.push.js";
|
2
1
|
import "core-js/modules/es.error.cause.js";
|
3
|
-
import
|
2
|
+
import "core-js/modules/es.array.push.js";
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
4
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
5
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
6
|
+
import { hasClass, index, offset, removeTextNodes, overlayContainsElement, closest, outerHeight, outerWidth, innerHeight, isVisible } from "../../../helpers/dom/element.mjs";
|
4
7
|
import { isFunction } from "../../../helpers/function.mjs";
|
5
8
|
import ColumnFilter from "./filter/column.mjs";
|
6
9
|
import RowFilter from "./filter/row.mjs";
|
@@ -20,38 +23,6 @@ import { CLONE_TOP, CLONE_BOTTOM, CLONE_INLINE_START, CLONE_TOP_INLINE_START_COR
|
|
20
23
|
* @abstract
|
21
24
|
*/
|
22
25
|
class Table {
|
23
|
-
/**
|
24
|
-
* The walkontable settings.
|
25
|
-
*
|
26
|
-
* @protected
|
27
|
-
* @type {Settings}
|
28
|
-
*/
|
29
|
-
wtSettings = null;
|
30
|
-
domBindings;
|
31
|
-
TBODY = null;
|
32
|
-
THEAD = null;
|
33
|
-
COLGROUP = null;
|
34
|
-
/**
|
35
|
-
* Indicates if the table has height bigger than 0px.
|
36
|
-
*
|
37
|
-
* @type {boolean}
|
38
|
-
*/
|
39
|
-
hasTableHeight = true;
|
40
|
-
/**
|
41
|
-
* Indicates if the table has width bigger than 0px.
|
42
|
-
*
|
43
|
-
* @type {boolean}
|
44
|
-
*/
|
45
|
-
hasTableWidth = true;
|
46
|
-
/**
|
47
|
-
* Indicates if the table is visible. By visible, it means that the holder
|
48
|
-
* element has CSS 'display' property different than 'none'.
|
49
|
-
*
|
50
|
-
* @type {boolean}
|
51
|
-
*/
|
52
|
-
isTableVisible = false;
|
53
|
-
tableOffset = 0;
|
54
|
-
holderOffset = 0;
|
55
26
|
/**
|
56
27
|
*
|
57
28
|
* @abstract
|
@@ -62,6 +33,38 @@ class Table {
|
|
62
33
|
* @param {'master'|CLONE_TYPES_ENUM} name Overlay name.
|
63
34
|
*/
|
64
35
|
constructor(dataAccessObject, facadeGetter, domBindings, wtSettings, name) {
|
36
|
+
/**
|
37
|
+
* The walkontable settings.
|
38
|
+
*
|
39
|
+
* @protected
|
40
|
+
* @type {Settings}
|
41
|
+
*/
|
42
|
+
_defineProperty(this, "wtSettings", null);
|
43
|
+
_defineProperty(this, "domBindings", void 0);
|
44
|
+
_defineProperty(this, "TBODY", null);
|
45
|
+
_defineProperty(this, "THEAD", null);
|
46
|
+
_defineProperty(this, "COLGROUP", null);
|
47
|
+
/**
|
48
|
+
* Indicates if the table has height bigger than 0px.
|
49
|
+
*
|
50
|
+
* @type {boolean}
|
51
|
+
*/
|
52
|
+
_defineProperty(this, "hasTableHeight", true);
|
53
|
+
/**
|
54
|
+
* Indicates if the table has width bigger than 0px.
|
55
|
+
*
|
56
|
+
* @type {boolean}
|
57
|
+
*/
|
58
|
+
_defineProperty(this, "hasTableWidth", true);
|
59
|
+
/**
|
60
|
+
* Indicates if the table is visible. By visible, it means that the holder
|
61
|
+
* element has CSS 'display' property different than 'none'.
|
62
|
+
*
|
63
|
+
* @type {boolean}
|
64
|
+
*/
|
65
|
+
_defineProperty(this, "isTableVisible", false);
|
66
|
+
_defineProperty(this, "tableOffset", 0);
|
67
|
+
_defineProperty(this, "holderOffset", 0);
|
65
68
|
this.domBindings = domBindings;
|
66
69
|
/**
|
67
70
|
* Indicates if this instance is of type `MasterTable` (i.e. It is NOT an overlay).
|
@@ -338,7 +341,7 @@ class Table {
|
|
338
341
|
wtOverlays.refreshAll(); // `refreshAll()` internally already calls `refreshSelections()` method
|
339
342
|
wtOverlays.adjustElementsSize();
|
340
343
|
} else {
|
341
|
-
this.
|
344
|
+
this.dataAccessObject.selectionManager.setActiveOverlay(this.facadeGetter()).render(runFastDraw);
|
342
345
|
}
|
343
346
|
if (syncScroll) {
|
344
347
|
wtOverlays.syncScrollWithMaster();
|
@@ -430,75 +433,6 @@ class Table {
|
|
430
433
|
}
|
431
434
|
}
|
432
435
|
|
433
|
-
/**
|
434
|
-
* @param {string} className The CSS class name to remove from the table cells.
|
435
|
-
*/
|
436
|
-
removeClassFromCells(className) {
|
437
|
-
const nodes = this.TABLE.querySelectorAll(`.${className}`);
|
438
|
-
for (let i = 0, len = nodes.length; i < len; i++) {
|
439
|
-
removeClass(nodes[i], className);
|
440
|
-
}
|
441
|
-
}
|
442
|
-
|
443
|
-
/**
|
444
|
-
* Refresh the table selection by re-rendering Selection instances connected with that instance.
|
445
|
-
*
|
446
|
-
* @param {boolean} fastDraw If fast drawing is enabled than additionally className clearing is applied.
|
447
|
-
*/
|
448
|
-
refreshSelections(fastDraw) {
|
449
|
-
const {
|
450
|
-
wtSettings
|
451
|
-
} = this;
|
452
|
-
const {
|
453
|
-
selections
|
454
|
-
} = this.dataAccessObject;
|
455
|
-
if (!selections) {
|
456
|
-
return;
|
457
|
-
}
|
458
|
-
const highlights = Array.from(selections);
|
459
|
-
const len = highlights.length;
|
460
|
-
if (fastDraw) {
|
461
|
-
const classesToRemove = [];
|
462
|
-
for (let i = 0; i < len; i++) {
|
463
|
-
const {
|
464
|
-
highlightHeaderClassName,
|
465
|
-
highlightRowClassName,
|
466
|
-
highlightColumnClassName
|
467
|
-
} = highlights[i].settings;
|
468
|
-
const classNames = highlights[i].classNames;
|
469
|
-
const classNamesLength = classNames.length;
|
470
|
-
for (let j = 0; j < classNamesLength; j++) {
|
471
|
-
if (!classesToRemove.includes(classNames[j])) {
|
472
|
-
classesToRemove.push(classNames[j]);
|
473
|
-
}
|
474
|
-
}
|
475
|
-
if (highlightHeaderClassName && !classesToRemove.includes(highlightHeaderClassName)) {
|
476
|
-
classesToRemove.push(highlightHeaderClassName);
|
477
|
-
}
|
478
|
-
if (highlightRowClassName && !classesToRemove.includes(highlightRowClassName)) {
|
479
|
-
classesToRemove.push(highlightRowClassName);
|
480
|
-
}
|
481
|
-
if (highlightColumnClassName && !classesToRemove.includes(highlightColumnClassName)) {
|
482
|
-
classesToRemove.push(highlightColumnClassName);
|
483
|
-
}
|
484
|
-
}
|
485
|
-
const additionalClassesToRemove = wtSettings.getSetting('onBeforeRemoveCellClassNames');
|
486
|
-
if (Array.isArray(additionalClassesToRemove)) {
|
487
|
-
for (let i = 0; i < additionalClassesToRemove.length; i++) {
|
488
|
-
classesToRemove.push(additionalClassesToRemove[i]);
|
489
|
-
}
|
490
|
-
}
|
491
|
-
const classesToRemoveLength = classesToRemove.length;
|
492
|
-
for (let i = 0; i < classesToRemoveLength; i++) {
|
493
|
-
// there was no rerender, so we need to remove classNames by ourselves
|
494
|
-
this.removeClassFromCells(classesToRemove[i]);
|
495
|
-
}
|
496
|
-
}
|
497
|
-
for (let i = 0; i < len; i++) {
|
498
|
-
highlights[i].draw(this.facadeGetter(), fastDraw);
|
499
|
-
}
|
500
|
-
}
|
501
|
-
|
502
436
|
/**
|
503
437
|
* Get cell element at coords.
|
504
438
|
* Negative coords.row or coords.col are used to retrieve header cells. If there are multiple header levels, the
|
@@ -560,10 +494,12 @@ class Table {
|
|
560
494
|
let renderedRowIndex = null;
|
561
495
|
let parentElement = null;
|
562
496
|
if (rowIndex < 0) {
|
563
|
-
|
497
|
+
var _this$rowFilter;
|
498
|
+
renderedRowIndex = (_this$rowFilter = this.rowFilter) === null || _this$rowFilter === void 0 ? void 0 : _this$rowFilter.sourceRowToVisibleColHeadedRow(rowIndex);
|
564
499
|
parentElement = this.THEAD;
|
565
500
|
} else {
|
566
|
-
|
501
|
+
var _this$rowFilter2;
|
502
|
+
renderedRowIndex = (_this$rowFilter2 = this.rowFilter) === null || _this$rowFilter2 === void 0 ? void 0 : _this$rowFilter2.sourceToRendered(rowIndex);
|
567
503
|
parentElement = this.TBODY;
|
568
504
|
}
|
569
505
|
if (renderedRowIndex !== void 0 && parentElement !== void 0) {
|
@@ -587,7 +523,7 @@ class Table {
|
|
587
523
|
getColumnHeader(col) {
|
588
524
|
let level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
589
525
|
const TR = this.THEAD.childNodes[level];
|
590
|
-
return TR
|
526
|
+
return TR === null || TR === void 0 ? void 0 : TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(col)];
|
591
527
|
}
|
592
528
|
|
593
529
|
/**
|
@@ -618,15 +554,15 @@ class Table {
|
|
618
554
|
*/
|
619
555
|
getRowHeader(row) {
|
620
556
|
let level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
621
|
-
if (this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0) === 0) {
|
622
|
-
return;
|
623
|
-
}
|
624
557
|
const rowHeadersCount = this.wtSettings.getSetting('rowHeaders').length;
|
625
558
|
if (level >= rowHeadersCount) {
|
626
559
|
return;
|
627
560
|
}
|
628
|
-
const
|
629
|
-
|
561
|
+
const renderedRow = this.rowFilter.sourceToRendered(row);
|
562
|
+
const visibleRow = renderedRow < 0 ? this.rowFilter.sourceRowToVisibleColHeadedRow(row) : renderedRow;
|
563
|
+
const parentElement = renderedRow < 0 ? this.THEAD : this.TBODY;
|
564
|
+
const TR = parentElement.childNodes[visibleRow];
|
565
|
+
return TR === null || TR === void 0 ? void 0 : TR.childNodes[level];
|
630
566
|
}
|
631
567
|
|
632
568
|
/**
|
@@ -636,14 +572,11 @@ class Table {
|
|
636
572
|
* @returns {HTMLTableCellElement[]}
|
637
573
|
*/
|
638
574
|
getRowHeaders(row) {
|
639
|
-
if (this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0) === 0) {
|
640
|
-
return [];
|
641
|
-
}
|
642
575
|
const THs = [];
|
643
576
|
const rowHeadersCount = this.wtSettings.getSetting('rowHeaders').length;
|
644
577
|
for (let renderedRowIndex = 0; renderedRowIndex < rowHeadersCount; renderedRowIndex++) {
|
645
578
|
const TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];
|
646
|
-
const TH = TR
|
579
|
+
const TH = TR === null || TR === void 0 ? void 0 : TR.childNodes[renderedRowIndex];
|
647
580
|
if (TH) {
|
648
581
|
THs.push(TH);
|
649
582
|
}
|
package/base.js
CHANGED
@@ -43,8 +43,8 @@ Handsontable.hooks = _pluginHooks.default.getSingleton();
|
|
43
43
|
Handsontable.CellCoords = _src.CellCoords;
|
44
44
|
Handsontable.CellRange = _src.CellRange;
|
45
45
|
Handsontable.packageName = 'handsontable';
|
46
|
-
Handsontable.buildDate = "
|
47
|
-
Handsontable.version = "0.0.0-next-
|
46
|
+
Handsontable.buildDate = "14/07/2023 08:17:22";
|
47
|
+
Handsontable.version = "0.0.0-next-08765b9-20230714";
|
48
48
|
Handsontable.languages = {
|
49
49
|
dictionaryKeys: _registry.dictionaryKeys,
|
50
50
|
getLanguageDictionary: _registry.getLanguageDictionary,
|
package/base.mjs
CHANGED
@@ -35,8 +35,8 @@ Handsontable.hooks = Hooks.getSingleton();
|
|
35
35
|
Handsontable.CellCoords = CellCoords;
|
36
36
|
Handsontable.CellRange = CellRange;
|
37
37
|
Handsontable.packageName = 'handsontable';
|
38
|
-
Handsontable.buildDate = "
|
39
|
-
Handsontable.version = "0.0.0-next-
|
38
|
+
Handsontable.buildDate = "14/07/2023 08:17:30";
|
39
|
+
Handsontable.version = "0.0.0-next-08765b9-20230714";
|
40
40
|
Handsontable.languages = {
|
41
41
|
dictionaryKeys,
|
42
42
|
getLanguageDictionary,
|
@@ -0,0 +1,58 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
exports.installFocusDetector = installFocusDetector;
|
5
|
+
/**
|
6
|
+
* Installs a focus detector module. The module appends two input elements into the DOM side by side.
|
7
|
+
* When the first input is focused, then it means that a user entered to the component using the TAB key
|
8
|
+
* from the element above. When the second input is focused, a user enters to the component from
|
9
|
+
* the element below the table. Each action, once detected, triggers the specific hook.
|
10
|
+
*
|
11
|
+
* @param {Handsontable} hot The Handsontable instance.
|
12
|
+
* @param {{ onFocusFromTop: Function, onFocusFromBottom: Function }} hooks An object with defined callbacks to call.
|
13
|
+
* @returns {{ activate: Function, deactivate: Function }}
|
14
|
+
*/
|
15
|
+
function installFocusDetector(hot) {
|
16
|
+
let hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
17
|
+
const rootDocument = hot.rootDocument;
|
18
|
+
const rootElement = hot.rootElement;
|
19
|
+
const inputTrapTop = createInputElement(rootDocument);
|
20
|
+
const inputTrapBottom = createInputElement(rootDocument);
|
21
|
+
inputTrapTop.addEventListener('focus', () => hooks === null || hooks === void 0 ? void 0 : hooks.onFocusFromTop());
|
22
|
+
inputTrapBottom.addEventListener('focus', () => hooks === null || hooks === void 0 ? void 0 : hooks.onFocusFromBottom());
|
23
|
+
rootElement.firstChild.before(inputTrapTop);
|
24
|
+
rootElement.lastChild.after(inputTrapBottom);
|
25
|
+
return {
|
26
|
+
/**
|
27
|
+
* Activates the detector by resetting the tabIndex of the input elements.
|
28
|
+
*/
|
29
|
+
activate() {
|
30
|
+
hot._registerTimeout(() => {
|
31
|
+
inputTrapTop.tabIndex = 0;
|
32
|
+
inputTrapBottom.tabIndex = 0;
|
33
|
+
}, 10);
|
34
|
+
},
|
35
|
+
/**
|
36
|
+
* Deactivates the detector by setting tabIndex to -1.
|
37
|
+
*/
|
38
|
+
deactivate() {
|
39
|
+
hot._registerTimeout(() => {
|
40
|
+
inputTrapTop.tabIndex = -1;
|
41
|
+
inputTrapBottom.tabIndex = -1;
|
42
|
+
}, 10);
|
43
|
+
}
|
44
|
+
};
|
45
|
+
}
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Creates a new HTML input element.
|
49
|
+
*
|
50
|
+
* @param {Document} rootDocument The owner document element.
|
51
|
+
* @returns {HTMLInputElement}
|
52
|
+
*/
|
53
|
+
function createInputElement(rootDocument) {
|
54
|
+
const input = rootDocument.createElement('input');
|
55
|
+
input.type = 'text';
|
56
|
+
input.classList.add('htFocusCatcher');
|
57
|
+
return input;
|
58
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
/**
|
2
|
+
* Installs a focus detector module. The module appends two input elements into the DOM side by side.
|
3
|
+
* When the first input is focused, then it means that a user entered to the component using the TAB key
|
4
|
+
* from the element above. When the second input is focused, a user enters to the component from
|
5
|
+
* the element below the table. Each action, once detected, triggers the specific hook.
|
6
|
+
*
|
7
|
+
* @param {Handsontable} hot The Handsontable instance.
|
8
|
+
* @param {{ onFocusFromTop: Function, onFocusFromBottom: Function }} hooks An object with defined callbacks to call.
|
9
|
+
* @returns {{ activate: Function, deactivate: Function }}
|
10
|
+
*/
|
11
|
+
export function installFocusDetector(hot) {
|
12
|
+
let hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
13
|
+
const rootDocument = hot.rootDocument;
|
14
|
+
const rootElement = hot.rootElement;
|
15
|
+
const inputTrapTop = createInputElement(rootDocument);
|
16
|
+
const inputTrapBottom = createInputElement(rootDocument);
|
17
|
+
inputTrapTop.addEventListener('focus', () => hooks === null || hooks === void 0 ? void 0 : hooks.onFocusFromTop());
|
18
|
+
inputTrapBottom.addEventListener('focus', () => hooks === null || hooks === void 0 ? void 0 : hooks.onFocusFromBottom());
|
19
|
+
rootElement.firstChild.before(inputTrapTop);
|
20
|
+
rootElement.lastChild.after(inputTrapBottom);
|
21
|
+
return {
|
22
|
+
/**
|
23
|
+
* Activates the detector by resetting the tabIndex of the input elements.
|
24
|
+
*/
|
25
|
+
activate() {
|
26
|
+
hot._registerTimeout(() => {
|
27
|
+
inputTrapTop.tabIndex = 0;
|
28
|
+
inputTrapBottom.tabIndex = 0;
|
29
|
+
}, 10);
|
30
|
+
},
|
31
|
+
/**
|
32
|
+
* Deactivates the detector by setting tabIndex to -1.
|
33
|
+
*/
|
34
|
+
deactivate() {
|
35
|
+
hot._registerTimeout(() => {
|
36
|
+
inputTrapTop.tabIndex = -1;
|
37
|
+
inputTrapBottom.tabIndex = -1;
|
38
|
+
}, 10);
|
39
|
+
}
|
40
|
+
};
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Creates a new HTML input element.
|
45
|
+
*
|
46
|
+
* @param {Document} rootDocument The owner document element.
|
47
|
+
* @returns {HTMLInputElement}
|
48
|
+
*/
|
49
|
+
function createInputElement(rootDocument) {
|
50
|
+
const input = rootDocument.createElement('input');
|
51
|
+
input.type = 'text';
|
52
|
+
input.classList.add('htFocusCatcher');
|
53
|
+
return input;
|
54
|
+
}
|
@@ -0,0 +1,142 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
exports.installFocusCatcher = installFocusCatcher;
|
5
|
+
var _shortcutContexts = require("../../shortcutContexts");
|
6
|
+
var _focusDetector = require("./focusDetector");
|
7
|
+
/**
|
8
|
+
* Installs a focus catcher module. The module observes when the table is focused and depending on
|
9
|
+
* from the which side it was focused on it selects a specified cell or releases the TAB navigation
|
10
|
+
* to the browser.
|
11
|
+
*
|
12
|
+
* @param {Core} hot The Handsontable instance.
|
13
|
+
*/
|
14
|
+
function installFocusCatcher(hot) {
|
15
|
+
let recentlyAddedFocusCoords;
|
16
|
+
const {
|
17
|
+
activate,
|
18
|
+
deactivate
|
19
|
+
} = (0, _focusDetector.installFocusDetector)(hot, {
|
20
|
+
onFocusFromTop() {
|
21
|
+
var _recentlyAddedFocusCo;
|
22
|
+
const mostTopStartCoords = (_recentlyAddedFocusCo = recentlyAddedFocusCoords) !== null && _recentlyAddedFocusCo !== void 0 ? _recentlyAddedFocusCo : getMostTopStartPosition(hot);
|
23
|
+
if (mostTopStartCoords) {
|
24
|
+
hot.runHooks('modifyFocusOnTabNavigation', 'from_above', mostTopStartCoords);
|
25
|
+
hot.selectCell(mostTopStartCoords.row, mostTopStartCoords.col);
|
26
|
+
}
|
27
|
+
hot.listen();
|
28
|
+
},
|
29
|
+
onFocusFromBottom() {
|
30
|
+
var _recentlyAddedFocusCo2;
|
31
|
+
const mostBottomEndCoords = (_recentlyAddedFocusCo2 = recentlyAddedFocusCoords) !== null && _recentlyAddedFocusCo2 !== void 0 ? _recentlyAddedFocusCo2 : getMostBottomEndPosition(hot);
|
32
|
+
if (mostBottomEndCoords) {
|
33
|
+
hot.runHooks('modifyFocusOnTabNavigation', 'from_below', mostBottomEndCoords);
|
34
|
+
hot.selectCell(mostBottomEndCoords.row, mostBottomEndCoords.col);
|
35
|
+
}
|
36
|
+
hot.listen();
|
37
|
+
}
|
38
|
+
});
|
39
|
+
hot.addHook('afterListen', () => deactivate());
|
40
|
+
hot.addHook('afterUnlisten', () => activate());
|
41
|
+
hot.addHook('afterSelection', () => {
|
42
|
+
var _hot$getSelectedRange;
|
43
|
+
recentlyAddedFocusCoords = (_hot$getSelectedRange = hot.getSelectedRangeLast()) === null || _hot$getSelectedRange === void 0 ? void 0 : _hot$getSelectedRange.highlight;
|
44
|
+
});
|
45
|
+
hot.getShortcutManager().getContext('grid').addShortcut({
|
46
|
+
keys: [['Tab'], ['Shift', 'Tab']],
|
47
|
+
callback: event => {
|
48
|
+
var _hot$getSelectedRange2;
|
49
|
+
const {
|
50
|
+
disableTabNavigation,
|
51
|
+
autoWrapRow
|
52
|
+
} = hot.getSettings();
|
53
|
+
if (disableTabNavigation) {
|
54
|
+
hot.deselectCell();
|
55
|
+
hot.unlisten();
|
56
|
+
return false;
|
57
|
+
}
|
58
|
+
const isSelected = hot.selection.isSelected();
|
59
|
+
const highlight = (_hot$getSelectedRange2 = hot.getSelectedRangeLast()) === null || _hot$getSelectedRange2 === void 0 ? void 0 : _hot$getSelectedRange2.highlight;
|
60
|
+
const mostTopStartCoords = getMostTopStartPosition(hot);
|
61
|
+
const mostBottomEndCoords = getMostBottomEndPosition(hot);
|
62
|
+
|
63
|
+
// For disabled `autoWrapRow` option set the row to the same position as the currently selected row.
|
64
|
+
if (!autoWrapRow) {
|
65
|
+
mostTopStartCoords.row = highlight.row;
|
66
|
+
mostBottomEndCoords.row = highlight.row;
|
67
|
+
}
|
68
|
+
if (event.shiftKey && (!isSelected || highlight.isEqual(mostTopStartCoords)) || !event.shiftKey && (!isSelected || highlight.isEqual(mostBottomEndCoords))) {
|
69
|
+
hot.deselectCell();
|
70
|
+
hot.unlisten();
|
71
|
+
return false;
|
72
|
+
}
|
73
|
+
return true;
|
74
|
+
},
|
75
|
+
runOnlyIf: () => !hot.getSettings().minSpareCols,
|
76
|
+
preventDefault: false,
|
77
|
+
stopPropagation: false,
|
78
|
+
position: 'before',
|
79
|
+
relativeToGroup: _shortcutContexts.GRID_GROUP,
|
80
|
+
group: 'focusCatcher'
|
81
|
+
});
|
82
|
+
}
|
83
|
+
|
84
|
+
/**
|
85
|
+
* Gets the coordinates of the most top-start cell or header (depends on the table settings and its size).
|
86
|
+
*
|
87
|
+
* @param {Core} hot The Handsontable instance.
|
88
|
+
* @returns {CellCoords|null}
|
89
|
+
*/
|
90
|
+
function getMostTopStartPosition(hot) {
|
91
|
+
const {
|
92
|
+
rowIndexMapper,
|
93
|
+
columnIndexMapper
|
94
|
+
} = hot;
|
95
|
+
const {
|
96
|
+
navigableHeaders
|
97
|
+
} = hot.getSettings();
|
98
|
+
let topRow = navigableHeaders && hot.countColHeaders() > 0 ? -hot.countColHeaders() : 0;
|
99
|
+
let startColumn = navigableHeaders && hot.countRowHeaders() > 0 ? -hot.countRowHeaders() : 0;
|
100
|
+
if (topRow === 0) {
|
101
|
+
topRow = rowIndexMapper.getVisualFromRenderableIndex(topRow);
|
102
|
+
}
|
103
|
+
if (startColumn === 0) {
|
104
|
+
startColumn = columnIndexMapper.getVisualFromRenderableIndex(startColumn);
|
105
|
+
}
|
106
|
+
if (topRow === null || startColumn === null) {
|
107
|
+
return null;
|
108
|
+
}
|
109
|
+
return hot._createCellCoords(topRow, startColumn);
|
110
|
+
}
|
111
|
+
|
112
|
+
/**
|
113
|
+
* Gets the coordinates of the most bottom-end cell or header (depends on the table settings and its size).
|
114
|
+
*
|
115
|
+
* @param {Core} hot The Handsontable instance.
|
116
|
+
* @returns {CellCoords|null}
|
117
|
+
*/
|
118
|
+
function getMostBottomEndPosition(hot) {
|
119
|
+
var _rowIndexMapper$getVi, _columnIndexMapper$ge;
|
120
|
+
const {
|
121
|
+
rowIndexMapper,
|
122
|
+
columnIndexMapper
|
123
|
+
} = hot;
|
124
|
+
const {
|
125
|
+
navigableHeaders
|
126
|
+
} = hot.getSettings();
|
127
|
+
let bottomRow = rowIndexMapper.getRenderableIndexesLength() - 1;
|
128
|
+
let endColumn = columnIndexMapper.getRenderableIndexesLength() - 1;
|
129
|
+
if (bottomRow < 0) {
|
130
|
+
if (!navigableHeaders || hot.countColHeaders() === 0) {
|
131
|
+
return null;
|
132
|
+
}
|
133
|
+
bottomRow = -1;
|
134
|
+
}
|
135
|
+
if (endColumn < 0) {
|
136
|
+
if (!navigableHeaders || hot.countColHeaders() === 0) {
|
137
|
+
return null;
|
138
|
+
}
|
139
|
+
endColumn = -1;
|
140
|
+
}
|
141
|
+
return hot._createCellCoords((_rowIndexMapper$getVi = rowIndexMapper.getVisualFromRenderableIndex(bottomRow)) !== null && _rowIndexMapper$getVi !== void 0 ? _rowIndexMapper$getVi : bottomRow, (_columnIndexMapper$ge = columnIndexMapper.getVisualFromRenderableIndex(endColumn)) !== null && _columnIndexMapper$ge !== void 0 ? _columnIndexMapper$ge : endColumn);
|
142
|
+
}
|
@@ -0,0 +1,138 @@
|
|
1
|
+
import { GRID_GROUP } from "../../shortcutContexts/index.mjs";
|
2
|
+
import { installFocusDetector } from "./focusDetector.mjs";
|
3
|
+
/**
|
4
|
+
* Installs a focus catcher module. The module observes when the table is focused and depending on
|
5
|
+
* from the which side it was focused on it selects a specified cell or releases the TAB navigation
|
6
|
+
* to the browser.
|
7
|
+
*
|
8
|
+
* @param {Core} hot The Handsontable instance.
|
9
|
+
*/
|
10
|
+
export function installFocusCatcher(hot) {
|
11
|
+
let recentlyAddedFocusCoords;
|
12
|
+
const {
|
13
|
+
activate,
|
14
|
+
deactivate
|
15
|
+
} = installFocusDetector(hot, {
|
16
|
+
onFocusFromTop() {
|
17
|
+
var _recentlyAddedFocusCo;
|
18
|
+
const mostTopStartCoords = (_recentlyAddedFocusCo = recentlyAddedFocusCoords) !== null && _recentlyAddedFocusCo !== void 0 ? _recentlyAddedFocusCo : getMostTopStartPosition(hot);
|
19
|
+
if (mostTopStartCoords) {
|
20
|
+
hot.runHooks('modifyFocusOnTabNavigation', 'from_above', mostTopStartCoords);
|
21
|
+
hot.selectCell(mostTopStartCoords.row, mostTopStartCoords.col);
|
22
|
+
}
|
23
|
+
hot.listen();
|
24
|
+
},
|
25
|
+
onFocusFromBottom() {
|
26
|
+
var _recentlyAddedFocusCo2;
|
27
|
+
const mostBottomEndCoords = (_recentlyAddedFocusCo2 = recentlyAddedFocusCoords) !== null && _recentlyAddedFocusCo2 !== void 0 ? _recentlyAddedFocusCo2 : getMostBottomEndPosition(hot);
|
28
|
+
if (mostBottomEndCoords) {
|
29
|
+
hot.runHooks('modifyFocusOnTabNavigation', 'from_below', mostBottomEndCoords);
|
30
|
+
hot.selectCell(mostBottomEndCoords.row, mostBottomEndCoords.col);
|
31
|
+
}
|
32
|
+
hot.listen();
|
33
|
+
}
|
34
|
+
});
|
35
|
+
hot.addHook('afterListen', () => deactivate());
|
36
|
+
hot.addHook('afterUnlisten', () => activate());
|
37
|
+
hot.addHook('afterSelection', () => {
|
38
|
+
var _hot$getSelectedRange;
|
39
|
+
recentlyAddedFocusCoords = (_hot$getSelectedRange = hot.getSelectedRangeLast()) === null || _hot$getSelectedRange === void 0 ? void 0 : _hot$getSelectedRange.highlight;
|
40
|
+
});
|
41
|
+
hot.getShortcutManager().getContext('grid').addShortcut({
|
42
|
+
keys: [['Tab'], ['Shift', 'Tab']],
|
43
|
+
callback: event => {
|
44
|
+
var _hot$getSelectedRange2;
|
45
|
+
const {
|
46
|
+
disableTabNavigation,
|
47
|
+
autoWrapRow
|
48
|
+
} = hot.getSettings();
|
49
|
+
if (disableTabNavigation) {
|
50
|
+
hot.deselectCell();
|
51
|
+
hot.unlisten();
|
52
|
+
return false;
|
53
|
+
}
|
54
|
+
const isSelected = hot.selection.isSelected();
|
55
|
+
const highlight = (_hot$getSelectedRange2 = hot.getSelectedRangeLast()) === null || _hot$getSelectedRange2 === void 0 ? void 0 : _hot$getSelectedRange2.highlight;
|
56
|
+
const mostTopStartCoords = getMostTopStartPosition(hot);
|
57
|
+
const mostBottomEndCoords = getMostBottomEndPosition(hot);
|
58
|
+
|
59
|
+
// For disabled `autoWrapRow` option set the row to the same position as the currently selected row.
|
60
|
+
if (!autoWrapRow) {
|
61
|
+
mostTopStartCoords.row = highlight.row;
|
62
|
+
mostBottomEndCoords.row = highlight.row;
|
63
|
+
}
|
64
|
+
if (event.shiftKey && (!isSelected || highlight.isEqual(mostTopStartCoords)) || !event.shiftKey && (!isSelected || highlight.isEqual(mostBottomEndCoords))) {
|
65
|
+
hot.deselectCell();
|
66
|
+
hot.unlisten();
|
67
|
+
return false;
|
68
|
+
}
|
69
|
+
return true;
|
70
|
+
},
|
71
|
+
runOnlyIf: () => !hot.getSettings().minSpareCols,
|
72
|
+
preventDefault: false,
|
73
|
+
stopPropagation: false,
|
74
|
+
position: 'before',
|
75
|
+
relativeToGroup: GRID_GROUP,
|
76
|
+
group: 'focusCatcher'
|
77
|
+
});
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Gets the coordinates of the most top-start cell or header (depends on the table settings and its size).
|
82
|
+
*
|
83
|
+
* @param {Core} hot The Handsontable instance.
|
84
|
+
* @returns {CellCoords|null}
|
85
|
+
*/
|
86
|
+
function getMostTopStartPosition(hot) {
|
87
|
+
const {
|
88
|
+
rowIndexMapper,
|
89
|
+
columnIndexMapper
|
90
|
+
} = hot;
|
91
|
+
const {
|
92
|
+
navigableHeaders
|
93
|
+
} = hot.getSettings();
|
94
|
+
let topRow = navigableHeaders && hot.countColHeaders() > 0 ? -hot.countColHeaders() : 0;
|
95
|
+
let startColumn = navigableHeaders && hot.countRowHeaders() > 0 ? -hot.countRowHeaders() : 0;
|
96
|
+
if (topRow === 0) {
|
97
|
+
topRow = rowIndexMapper.getVisualFromRenderableIndex(topRow);
|
98
|
+
}
|
99
|
+
if (startColumn === 0) {
|
100
|
+
startColumn = columnIndexMapper.getVisualFromRenderableIndex(startColumn);
|
101
|
+
}
|
102
|
+
if (topRow === null || startColumn === null) {
|
103
|
+
return null;
|
104
|
+
}
|
105
|
+
return hot._createCellCoords(topRow, startColumn);
|
106
|
+
}
|
107
|
+
|
108
|
+
/**
|
109
|
+
* Gets the coordinates of the most bottom-end cell or header (depends on the table settings and its size).
|
110
|
+
*
|
111
|
+
* @param {Core} hot The Handsontable instance.
|
112
|
+
* @returns {CellCoords|null}
|
113
|
+
*/
|
114
|
+
function getMostBottomEndPosition(hot) {
|
115
|
+
var _rowIndexMapper$getVi, _columnIndexMapper$ge;
|
116
|
+
const {
|
117
|
+
rowIndexMapper,
|
118
|
+
columnIndexMapper
|
119
|
+
} = hot;
|
120
|
+
const {
|
121
|
+
navigableHeaders
|
122
|
+
} = hot.getSettings();
|
123
|
+
let bottomRow = rowIndexMapper.getRenderableIndexesLength() - 1;
|
124
|
+
let endColumn = columnIndexMapper.getRenderableIndexesLength() - 1;
|
125
|
+
if (bottomRow < 0) {
|
126
|
+
if (!navigableHeaders || hot.countColHeaders() === 0) {
|
127
|
+
return null;
|
128
|
+
}
|
129
|
+
bottomRow = -1;
|
130
|
+
}
|
131
|
+
if (endColumn < 0) {
|
132
|
+
if (!navigableHeaders || hot.countColHeaders() === 0) {
|
133
|
+
return null;
|
134
|
+
}
|
135
|
+
endColumn = -1;
|
136
|
+
}
|
137
|
+
return hot._createCellCoords((_rowIndexMapper$getVi = rowIndexMapper.getVisualFromRenderableIndex(bottomRow)) !== null && _rowIndexMapper$getVi !== void 0 ? _rowIndexMapper$getVi : bottomRow, (_columnIndexMapper$ge = columnIndexMapper.getVisualFromRenderableIndex(endColumn)) !== null && _columnIndexMapper$ge !== void 0 ? _columnIndexMapper$ge : endColumn);
|
138
|
+
}
|
package/core/index.js
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
var _focusCatcher = require("./focusCatcher");
|
5
|
+
Object.keys(_focusCatcher).forEach(function (key) {
|
6
|
+
if (key === "default" || key === "__esModule") return;
|
7
|
+
if (key in exports && exports[key] === _focusCatcher[key]) return;
|
8
|
+
exports[key] = _focusCatcher[key];
|
9
|
+
});
|
package/core/index.mjs
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export * from "./focusCatcher/index.mjs";
|