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.

Files changed (373) hide show
  1. package/3rdparty/walkontable/src/cell/coords.d.ts +6 -1
  2. package/3rdparty/walkontable/src/cell/coords.js +87 -33
  3. package/3rdparty/walkontable/src/cell/coords.mjs +87 -33
  4. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  5. package/3rdparty/walkontable/src/cell/range.js +92 -46
  6. package/3rdparty/walkontable/src/cell/range.mjs +92 -46
  7. package/3rdparty/walkontable/src/core/_base.js +41 -33
  8. package/3rdparty/walkontable/src/core/_base.mjs +41 -33
  9. package/3rdparty/walkontable/src/core/clone.js +8 -5
  10. package/3rdparty/walkontable/src/core/clone.mjs +8 -5
  11. package/3rdparty/walkontable/src/core/core.js +3 -2
  12. package/3rdparty/walkontable/src/core/core.mjs +3 -2
  13. package/3rdparty/walkontable/src/event.js +9 -8
  14. package/3rdparty/walkontable/src/event.mjs +9 -8
  15. package/3rdparty/walkontable/src/facade/core.js +2 -2
  16. package/3rdparty/walkontable/src/facade/core.mjs +2 -2
  17. package/3rdparty/walkontable/src/index.js +10 -2
  18. package/3rdparty/walkontable/src/index.mjs +2 -2
  19. package/3rdparty/walkontable/src/overlay/_base.js +11 -9
  20. package/3rdparty/walkontable/src/overlay/_base.mjs +11 -9
  21. package/3rdparty/walkontable/src/overlay/bottom.js +10 -8
  22. package/3rdparty/walkontable/src/overlay/bottom.mjs +10 -8
  23. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
  24. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
  25. package/3rdparty/walkontable/src/overlay/top.js +12 -14
  26. package/3rdparty/walkontable/src/overlay/top.mjs +12 -14
  27. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.js +16 -13
  28. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.mjs +16 -13
  29. package/3rdparty/walkontable/src/overlays.js +75 -80
  30. package/3rdparty/walkontable/src/overlays.mjs +75 -80
  31. package/3rdparty/walkontable/src/scroll.js +27 -24
  32. package/3rdparty/walkontable/src/scroll.mjs +27 -24
  33. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +7 -12
  34. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  35. package/3rdparty/walkontable/src/selection/border/constants.js +16 -0
  36. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  37. package/3rdparty/walkontable/src/selection/constants.js +62 -0
  38. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  39. package/3rdparty/walkontable/src/selection/index.js +26 -0
  40. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  41. package/3rdparty/walkontable/src/selection/manager.js +259 -0
  42. package/3rdparty/walkontable/src/selection/manager.mjs +254 -0
  43. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  44. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  45. package/3rdparty/walkontable/src/selection/selection.js +101 -0
  46. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  47. package/3rdparty/walkontable/src/settings.js +18 -17
  48. package/3rdparty/walkontable/src/settings.mjs +18 -17
  49. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
  50. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  51. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
  52. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  53. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
  54. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  55. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
  56. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  57. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
  58. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  59. package/3rdparty/walkontable/src/table.js +48 -115
  60. package/3rdparty/walkontable/src/table.mjs +49 -116
  61. package/base.js +2 -2
  62. package/base.mjs +2 -2
  63. package/core/focusCatcher/focusDetector.js +58 -0
  64. package/core/focusCatcher/focusDetector.mjs +54 -0
  65. package/core/focusCatcher/index.js +142 -0
  66. package/core/focusCatcher/index.mjs +138 -0
  67. package/core/index.js +9 -0
  68. package/core/index.mjs +1 -0
  69. package/core.d.ts +6 -3
  70. package/core.js +181 -298
  71. package/core.mjs +181 -298
  72. package/dataMap/metaManager/metaLayers/cellMeta.js +2 -1
  73. package/dataMap/metaManager/metaLayers/cellMeta.mjs +2 -1
  74. package/dataMap/metaManager/metaLayers/globalMeta.js +1 -1
  75. package/dataMap/metaManager/metaLayers/globalMeta.mjs +1 -1
  76. package/dataMap/metaManager/metaSchema.js +41 -0
  77. package/dataMap/metaManager/metaSchema.mjs +41 -0
  78. package/dataMap/metaManager/mods/dynamicCellMeta.js +3 -2
  79. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +3 -2
  80. package/dataMap/metaManager/utils.js +4 -2
  81. package/dataMap/metaManager/utils.mjs +4 -2
  82. package/dist/handsontable.css +19 -3
  83. package/dist/handsontable.full.css +19 -3
  84. package/dist/handsontable.full.js +10739 -7037
  85. package/dist/handsontable.full.min.css +3 -3
  86. package/dist/handsontable.full.min.js +25 -25
  87. package/dist/handsontable.js +24884 -21182
  88. package/dist/handsontable.min.css +3 -3
  89. package/dist/handsontable.min.js +19 -19
  90. package/editorManager.js +11 -75
  91. package/editorManager.mjs +11 -74
  92. package/editors/autocompleteEditor/autocompleteEditor.js +70 -67
  93. package/editors/autocompleteEditor/autocompleteEditor.mjs +70 -67
  94. package/editors/baseEditor/baseEditor.js +1 -1
  95. package/editors/baseEditor/baseEditor.mjs +1 -1
  96. package/editors/dateEditor/dateEditor.js +2 -1
  97. package/editors/dateEditor/dateEditor.mjs +2 -1
  98. package/editors/textEditor/textEditor.js +3 -11
  99. package/editors/textEditor/textEditor.mjs +4 -12
  100. package/helpers/mixed.js +1 -1
  101. package/helpers/mixed.mjs +1 -1
  102. package/helpers/number.d.ts +1 -0
  103. package/helpers/number.js +18 -0
  104. package/helpers/number.mjs +17 -0
  105. package/helpers/object.js +1 -0
  106. package/helpers/object.mjs +1 -0
  107. package/index.js +5 -5
  108. package/index.mjs +5 -5
  109. package/package.json +1 -1
  110. package/pluginHooks.d.ts +7 -1
  111. package/pluginHooks.js +106 -1
  112. package/pluginHooks.mjs +106 -1
  113. package/plugins/autoColumnSize/autoColumnSize.js +4 -1
  114. package/plugins/autoColumnSize/autoColumnSize.mjs +4 -1
  115. package/plugins/collapsibleColumns/collapsibleColumns.js +110 -40
  116. package/plugins/collapsibleColumns/collapsibleColumns.mjs +110 -40
  117. package/plugins/columnSorting/columnSorting.js +40 -1
  118. package/plugins/columnSorting/columnSorting.mjs +40 -3
  119. package/plugins/columnSorting/columnStatesManager.js +2 -1
  120. package/plugins/columnSorting/columnStatesManager.mjs +2 -1
  121. package/plugins/columnSorting/index.js +3 -1
  122. package/plugins/columnSorting/index.mjs +1 -1
  123. package/plugins/comments/commentEditor.js +1 -0
  124. package/plugins/comments/commentEditor.mjs +1 -0
  125. package/plugins/comments/comments.js +253 -191
  126. package/plugins/comments/comments.mjs +252 -192
  127. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  128. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  129. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  130. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  131. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  132. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  133. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  134. package/plugins/contextMenu/contextMenu.js +72 -30
  135. package/plugins/contextMenu/contextMenu.mjs +73 -31
  136. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  137. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  138. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  139. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  140. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  141. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  142. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  143. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  144. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  145. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  146. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  147. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  148. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  149. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  150. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  151. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  152. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  153. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  154. package/plugins/contextMenu/utils.js +28 -16
  155. package/plugins/contextMenu/utils.mjs +27 -15
  156. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  157. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  158. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  159. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  160. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  161. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  162. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  163. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  164. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  165. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  166. package/plugins/copyPaste/copyPaste.js +12 -6
  167. package/plugins/copyPaste/copyPaste.mjs +12 -6
  168. package/plugins/customBorders/customBorders.js +36 -29
  169. package/plugins/customBorders/customBorders.mjs +37 -30
  170. package/plugins/customBorders/utils.js +3 -3
  171. package/plugins/customBorders/utils.mjs +3 -3
  172. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  173. package/plugins/dropdownMenu/dropdownMenu.js +89 -32
  174. package/plugins/dropdownMenu/dropdownMenu.mjs +89 -32
  175. package/plugins/filters/conditionCollection.js +6 -5
  176. package/plugins/filters/conditionCollection.mjs +6 -5
  177. package/plugins/filters/filters.js +44 -21
  178. package/plugins/filters/filters.mjs +43 -20
  179. package/plugins/formulas/engine/register.js +3 -3
  180. package/plugins/formulas/engine/register.mjs +3 -3
  181. package/plugins/formulas/engine/settings.js +6 -3
  182. package/plugins/formulas/engine/settings.mjs +6 -3
  183. package/plugins/formulas/formulas.js +151 -143
  184. package/plugins/formulas/formulas.mjs +151 -143
  185. package/plugins/formulas/indexSyncer/axisSyncer.js +115 -79
  186. package/plugins/formulas/indexSyncer/axisSyncer.mjs +115 -79
  187. package/plugins/formulas/indexSyncer/index.js +100 -64
  188. package/plugins/formulas/indexSyncer/index.mjs +100 -64
  189. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +2 -2
  190. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +2 -2
  191. package/plugins/hiddenColumns/hiddenColumns.js +51 -34
  192. package/plugins/hiddenColumns/hiddenColumns.mjs +51 -34
  193. package/plugins/hiddenRows/contextMenuItem/showRow.js +2 -2
  194. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +2 -2
  195. package/plugins/hiddenRows/hiddenRows.js +50 -33
  196. package/plugins/hiddenRows/hiddenRows.mjs +50 -33
  197. package/plugins/manualRowResize/manualRowResize.js +2 -1
  198. package/plugins/manualRowResize/manualRowResize.mjs +2 -1
  199. package/plugins/mergeCells/mergeCells.js +6 -17
  200. package/plugins/mergeCells/mergeCells.mjs +6 -17
  201. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  202. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  203. package/plugins/nestedHeaders/nestedHeaders.js +209 -75
  204. package/plugins/nestedHeaders/nestedHeaders.mjs +208 -74
  205. package/plugins/nestedHeaders/stateManager/headersTree.js +58 -38
  206. package/plugins/nestedHeaders/stateManager/headersTree.mjs +58 -38
  207. package/plugins/nestedHeaders/stateManager/index.js +107 -49
  208. package/plugins/nestedHeaders/stateManager/index.mjs +105 -47
  209. package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.js +1 -1
  210. package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.mjs +1 -1
  211. package/plugins/nestedHeaders/stateManager/sourceSettings.js +57 -37
  212. package/plugins/nestedHeaders/stateManager/sourceSettings.mjs +57 -37
  213. package/plugins/nestedHeaders/utils/ghostTable.js +39 -35
  214. package/plugins/nestedHeaders/utils/ghostTable.mjs +39 -35
  215. package/plugins/nestedRows/data/dataManager.js +4 -2
  216. package/plugins/nestedRows/data/dataManager.mjs +4 -2
  217. package/plugins/nestedRows/nestedRows.js +41 -0
  218. package/plugins/nestedRows/nestedRows.mjs +41 -0
  219. package/plugins/persistentState/storage.js +1 -0
  220. package/plugins/persistentState/storage.mjs +1 -0
  221. package/plugins/undoRedo/undoRedo.js +2 -1
  222. package/plugins/undoRedo/undoRedo.mjs +2 -1
  223. package/renderers/checkboxRenderer/checkboxRenderer.js +2 -2
  224. package/renderers/checkboxRenderer/checkboxRenderer.mjs +1 -1
  225. package/selection/highlight/highlight.js +256 -71
  226. package/selection/highlight/highlight.mjs +250 -71
  227. package/selection/highlight/types/activeHeader.js +10 -8
  228. package/selection/highlight/types/activeHeader.mjs +10 -8
  229. package/selection/highlight/types/area.js +6 -18
  230. package/selection/highlight/types/area.mjs +6 -18
  231. package/selection/highlight/types/areaLayered.js +31 -0
  232. package/selection/highlight/types/areaLayered.mjs +26 -0
  233. package/selection/highlight/types/column.js +27 -0
  234. package/selection/highlight/types/column.mjs +22 -0
  235. package/selection/highlight/types/customSelection.js +7 -9
  236. package/selection/highlight/types/customSelection.mjs +7 -9
  237. package/selection/highlight/types/fill.js +5 -7
  238. package/selection/highlight/types/fill.mjs +5 -7
  239. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  240. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  241. package/selection/highlight/types/header.js +9 -18
  242. package/selection/highlight/types/header.mjs +9 -18
  243. package/selection/highlight/types/row.js +27 -0
  244. package/selection/highlight/types/row.mjs +22 -0
  245. package/selection/highlight/visualSelection.js +41 -33
  246. package/selection/highlight/visualSelection.mjs +41 -33
  247. package/selection/index.js +4 -7
  248. package/selection/index.mjs +2 -3
  249. package/selection/mouseEventHandler.js +1 -1
  250. package/selection/mouseEventHandler.mjs +1 -1
  251. package/selection/range.js +8 -8
  252. package/selection/range.mjs +8 -8
  253. package/selection/selection.js +290 -154
  254. package/selection/selection.mjs +287 -153
  255. package/selection/transformation.js +232 -90
  256. package/selection/transformation.mjs +232 -90
  257. package/selection/utils.js +15 -21
  258. package/selection/utils.mjs +16 -21
  259. package/settings.d.ts +2 -0
  260. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  261. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  262. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  263. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  264. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  265. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  266. package/shortcutContexts/commands/editor/index.js +16 -0
  267. package/shortcutContexts/commands/editor/index.mjs +12 -0
  268. package/shortcutContexts/commands/editor/open.js +27 -0
  269. package/shortcutContexts/commands/editor/open.mjs +23 -0
  270. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  271. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  272. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  273. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  274. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +21 -0
  275. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +17 -0
  276. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  277. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  278. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  279. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  280. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  281. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  282. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  283. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  284. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  285. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  286. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  287. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  288. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  289. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  290. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  291. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  292. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  293. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  294. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  295. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  296. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  297. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  298. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  299. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  300. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +21 -0
  301. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +17 -0
  302. package/shortcutContexts/commands/index.js +35 -0
  303. package/shortcutContexts/commands/index.mjs +31 -0
  304. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  305. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  306. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +31 -0
  307. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +27 -0
  308. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  309. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  310. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  311. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  312. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  313. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  314. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  315. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  316. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  317. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  318. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  319. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  320. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  321. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  322. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  323. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  324. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  325. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  326. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  327. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  328. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  329. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  330. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  331. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  332. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  333. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  334. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  335. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  336. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +31 -0
  337. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +27 -0
  338. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  339. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  340. package/shortcutContexts/commands/scrollToFocusedCell.js +36 -0
  341. package/shortcutContexts/commands/scrollToFocusedCell.mjs +32 -0
  342. package/shortcutContexts/commands/selectAll.js +10 -0
  343. package/shortcutContexts/commands/selectAll.mjs +6 -0
  344. package/shortcutContexts/constants.js +13 -0
  345. package/shortcutContexts/constants.mjs +8 -0
  346. package/shortcutContexts/editor.js +25 -0
  347. package/shortcutContexts/editor.mjs +21 -0
  348. package/shortcutContexts/grid.js +163 -0
  349. package/shortcutContexts/grid.mjs +159 -0
  350. package/shortcutContexts/index.js +24 -0
  351. package/shortcutContexts/index.mjs +11 -0
  352. package/shortcuts/manager.js +2 -0
  353. package/shortcuts/manager.mjs +2 -0
  354. package/shortcuts/recorder.js +2 -2
  355. package/shortcuts/recorder.mjs +2 -2
  356. package/shortcuts/utils.js +19 -5
  357. package/shortcuts/utils.mjs +18 -4
  358. package/tableView.js +163 -91
  359. package/tableView.mjs +163 -91
  360. package/translations/changesObservable/observable.js +82 -54
  361. package/translations/changesObservable/observable.mjs +82 -54
  362. package/translations/changesObservable/observer.js +24 -11
  363. package/translations/changesObservable/observer.mjs +24 -11
  364. package/translations/maps/linkedPhysicalIndexToValueMap.js +14 -8
  365. package/translations/maps/linkedPhysicalIndexToValueMap.mjs +14 -8
  366. package/utils/dataStructures/tree.js +21 -18
  367. package/utils/dataStructures/tree.mjs +21 -18
  368. package/3rdparty/walkontable/src/selection.js +0 -295
  369. package/3rdparty/walkontable/src/selection.mjs +0 -290
  370. package/selection/highlight/constants.js +0 -15
  371. package/selection/highlight/constants.mjs +0 -6
  372. package/selection/highlight/types/index.js +0 -35
  373. 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 { hasClass, index, offset, removeClass, removeTextNodes, overlayContainsElement, closest, outerHeight, outerWidth, innerHeight, isVisible } from "../../../helpers/dom/element.mjs";
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.refreshSelections(runFastDraw);
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
- renderedRowIndex = this.rowFilter?.sourceRowToVisibleColHeadedRow(rowIndex);
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
- renderedRowIndex = this.rowFilter?.sourceToRendered(rowIndex);
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?.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(col)];
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 TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];
629
- return TR?.childNodes[level];
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?.childNodes[renderedRowIndex];
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 = "13/07/2023 07:56:12";
47
- Handsontable.version = "0.0.0-next-b66c79f-20230713";
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 = "13/07/2023 07:56:21";
39
- Handsontable.version = "0.0.0-next-b66c79f-20230713";
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";