handsontable 13.1.0 → 14.0.0-next-d97b156-20231027

Sign up to get free protection for your applications and to get access to all the features.
Files changed (691) hide show
  1. package/3rdparty/walkontable/src/calculator/constants.js +3 -6
  2. package/3rdparty/walkontable/src/calculator/viewportColumns.js +1 -2
  3. package/3rdparty/walkontable/src/calculator/viewportRows.js +1 -2
  4. package/3rdparty/walkontable/src/cell/coords.d.ts +8 -1
  5. package/3rdparty/walkontable/src/cell/coords.js +81 -13
  6. package/3rdparty/walkontable/src/cell/coords.mjs +80 -11
  7. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  8. package/3rdparty/walkontable/src/cell/range.js +39 -9
  9. package/3rdparty/walkontable/src/cell/range.mjs +38 -7
  10. package/3rdparty/walkontable/src/core/_base.js +9 -3
  11. package/3rdparty/walkontable/src/core/_base.mjs +9 -3
  12. package/3rdparty/walkontable/src/core/clone.js +2 -2
  13. package/3rdparty/walkontable/src/core/clone.mjs +2 -2
  14. package/3rdparty/walkontable/src/core/core.js +3 -2
  15. package/3rdparty/walkontable/src/core/core.mjs +3 -2
  16. package/3rdparty/walkontable/src/event.js +13 -12
  17. package/3rdparty/walkontable/src/event.mjs +12 -10
  18. package/3rdparty/walkontable/src/facade/core.js +2 -2
  19. package/3rdparty/walkontable/src/facade/core.mjs +2 -2
  20. package/3rdparty/walkontable/src/filter/column.js +1 -2
  21. package/3rdparty/walkontable/src/filter/row.js +1 -2
  22. package/3rdparty/walkontable/src/index.js +12 -4
  23. package/3rdparty/walkontable/src/index.mjs +2 -2
  24. package/3rdparty/walkontable/src/overlay/_base.js +13 -2
  25. package/3rdparty/walkontable/src/overlay/_base.mjs +14 -3
  26. package/3rdparty/walkontable/src/overlay/constants.js +7 -14
  27. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
  28. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
  29. package/3rdparty/walkontable/src/overlay/top.js +2 -6
  30. package/3rdparty/walkontable/src/overlay/top.mjs +2 -6
  31. package/3rdparty/walkontable/src/overlays.js +1 -2
  32. package/3rdparty/walkontable/src/renderer/cells.js +10 -0
  33. package/3rdparty/walkontable/src/renderer/cells.mjs +11 -1
  34. package/3rdparty/walkontable/src/renderer/columnHeaders.js +13 -0
  35. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +14 -1
  36. package/3rdparty/walkontable/src/renderer/rowHeaders.js +8 -0
  37. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +8 -0
  38. package/3rdparty/walkontable/src/renderer/rows.js +13 -0
  39. package/3rdparty/walkontable/src/renderer/rows.mjs +13 -0
  40. package/3rdparty/walkontable/src/renderer/table.js +9 -0
  41. package/3rdparty/walkontable/src/renderer/table.mjs +9 -0
  42. package/3rdparty/walkontable/src/scroll.js +3 -2
  43. package/3rdparty/walkontable/src/scroll.mjs +2 -0
  44. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +8 -14
  45. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  46. package/3rdparty/walkontable/src/selection/border/constants.js +15 -0
  47. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  48. package/3rdparty/walkontable/src/selection/constants.js +54 -0
  49. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  50. package/3rdparty/walkontable/src/selection/index.js +26 -0
  51. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  52. package/3rdparty/walkontable/src/selection/manager.js +274 -0
  53. package/3rdparty/walkontable/src/selection/manager.mjs +269 -0
  54. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  55. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  56. package/3rdparty/walkontable/src/selection/selection.js +100 -0
  57. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  58. package/3rdparty/walkontable/src/settings.js +13 -4
  59. package/3rdparty/walkontable/src/settings.mjs +13 -4
  60. package/3rdparty/walkontable/src/table/bottom.js +1 -2
  61. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.js +1 -2
  62. package/3rdparty/walkontable/src/table/inlineStart.js +1 -2
  63. package/3rdparty/walkontable/src/table/master.js +3 -6
  64. package/3rdparty/walkontable/src/table/master.mjs +2 -4
  65. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +10 -2
  66. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  67. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +10 -2
  68. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  69. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +10 -2
  70. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  71. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +10 -2
  72. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  73. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +10 -2
  74. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  75. package/3rdparty/walkontable/src/table/top.js +1 -2
  76. package/3rdparty/walkontable/src/table/topInlineStartCorner.js +1 -2
  77. package/3rdparty/walkontable/src/table.js +20 -80
  78. package/3rdparty/walkontable/src/table.mjs +20 -79
  79. package/3rdparty/walkontable/src/utils/orderView/constants.js +3 -6
  80. package/3rdparty/walkontable/src/viewport.js +1 -2
  81. package/CHANGELOG.md +51 -0
  82. package/base.js +3 -4
  83. package/base.mjs +2 -2
  84. package/cellTypes/autocompleteType/autocompleteType.js +3 -5
  85. package/cellTypes/checkboxType/checkboxType.js +3 -5
  86. package/cellTypes/dateType/dateType.d.ts +3 -3
  87. package/cellTypes/dateType/dateType.js +5 -7
  88. package/cellTypes/dateType/dateType.mjs +2 -2
  89. package/cellTypes/dropdownType/dropdownType.js +3 -5
  90. package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
  91. package/cellTypes/handsontableType/handsontableType.js +5 -7
  92. package/cellTypes/handsontableType/handsontableType.mjs +2 -2
  93. package/cellTypes/index.d.ts +3 -0
  94. package/cellTypes/index.js +4 -0
  95. package/cellTypes/index.mjs +3 -1
  96. package/cellTypes/numericType/numericType.js +3 -5
  97. package/cellTypes/passwordType/passwordType.js +3 -5
  98. package/cellTypes/selectType/index.d.ts +1 -0
  99. package/cellTypes/selectType/index.js +6 -0
  100. package/cellTypes/selectType/index.mjs +1 -0
  101. package/cellTypes/selectType/selectType.d.ts +14 -0
  102. package/cellTypes/selectType/selectType.js +11 -0
  103. package/cellTypes/selectType/selectType.mjs +8 -0
  104. package/cellTypes/textType/textType.js +3 -5
  105. package/cellTypes/timeType/timeType.js +3 -5
  106. package/common.d.ts +1 -1
  107. package/core/focusCatcher/focusDetector.js +63 -0
  108. package/core/focusCatcher/focusDetector.mjs +59 -0
  109. package/core/focusCatcher/index.js +148 -0
  110. package/core/focusCatcher/index.mjs +144 -0
  111. package/core/index.js +9 -0
  112. package/core/index.mjs +1 -0
  113. package/core.d.ts +10 -5
  114. package/core.js +327 -359
  115. package/core.mjs +327 -359
  116. package/dataMap/dataMap.js +1 -2
  117. package/dataMap/dataSource.js +1 -2
  118. package/dataMap/metaManager/metaSchema.js +65 -0
  119. package/dataMap/metaManager/metaSchema.mjs +65 -0
  120. package/dataMap/metaManager/mods/extendMetaProperties.js +7 -1
  121. package/dataMap/metaManager/mods/extendMetaProperties.mjs +7 -1
  122. package/dataMap/replaceData.js +5 -0
  123. package/dataMap/replaceData.mjs +5 -0
  124. package/dist/handsontable.css +94 -76
  125. package/dist/handsontable.full.css +94 -76
  126. package/dist/handsontable.full.js +21236 -14104
  127. package/dist/handsontable.full.min.css +8 -8
  128. package/dist/handsontable.full.min.js +170 -152
  129. package/dist/handsontable.js +22016 -15254
  130. package/dist/handsontable.min.css +7 -7
  131. package/dist/handsontable.min.js +31 -23
  132. package/dist/languages/all.js +47 -40
  133. package/dist/languages/all.min.js +1 -1
  134. package/dist/languages/ar-AR.js +1 -2
  135. package/dist/languages/cs-CZ.js +1 -2
  136. package/dist/languages/de-CH.js +1 -2
  137. package/dist/languages/de-DE.js +1 -2
  138. package/dist/languages/en-US.js +15 -3
  139. package/dist/languages/en-US.min.js +1 -1
  140. package/dist/languages/es-MX.js +1 -2
  141. package/dist/languages/fr-FR.js +1 -2
  142. package/dist/languages/it-IT.js +1 -2
  143. package/dist/languages/ja-JP.js +1 -2
  144. package/dist/languages/ko-KR.js +1 -2
  145. package/dist/languages/lv-LV.js +1 -2
  146. package/dist/languages/nb-NO.js +1 -2
  147. package/dist/languages/nl-NL.js +1 -2
  148. package/dist/languages/pl-PL.js +15 -3
  149. package/dist/languages/pl-PL.min.js +1 -1
  150. package/dist/languages/pt-BR.js +1 -2
  151. package/dist/languages/ru-RU.js +1 -2
  152. package/dist/languages/sr-SP.js +1 -2
  153. package/dist/languages/zh-CN.js +1 -2
  154. package/dist/languages/zh-TW.js +1 -2
  155. package/editorManager.js +17 -91
  156. package/editorManager.mjs +16 -87
  157. package/editors/autocompleteEditor/autocompleteEditor.js +65 -11
  158. package/editors/autocompleteEditor/autocompleteEditor.mjs +65 -10
  159. package/editors/baseEditor/baseEditor.js +19 -13
  160. package/editors/baseEditor/baseEditor.mjs +16 -7
  161. package/editors/checkboxEditor/checkboxEditor.js +1 -2
  162. package/editors/dateEditor/dateEditor.js +27 -9
  163. package/editors/dateEditor/dateEditor.mjs +27 -8
  164. package/editors/dropdownEditor/dropdownEditor.js +1 -2
  165. package/editors/handsontableEditor/handsontableEditor.js +14 -7
  166. package/editors/handsontableEditor/handsontableEditor.mjs +14 -6
  167. package/editors/numericEditor/numericEditor.js +1 -2
  168. package/editors/passwordEditor/passwordEditor.js +1 -2
  169. package/editors/selectEditor/selectEditor.js +1 -2
  170. package/editors/textEditor/textEditor.js +20 -29
  171. package/editors/textEditor/textEditor.mjs +22 -30
  172. package/editors/timeEditor/timeEditor.js +1 -2
  173. package/eventManager.js +1 -2
  174. package/focusManager.d.ts +12 -0
  175. package/focusManager.js +265 -0
  176. package/focusManager.mjs +261 -0
  177. package/helpers/a11y.js +81 -0
  178. package/helpers/a11y.mjs +39 -0
  179. package/helpers/dom/element.js +224 -12
  180. package/helpers/dom/element.mjs +216 -10
  181. package/helpers/dom/event.d.ts +1 -0
  182. package/helpers/dom/event.js +25 -0
  183. package/helpers/dom/event.mjs +24 -0
  184. package/helpers/mixed.js +2 -2
  185. package/helpers/mixed.mjs +2 -2
  186. package/helpers/number.d.ts +1 -0
  187. package/helpers/number.js +18 -0
  188. package/helpers/number.mjs +17 -0
  189. package/helpers/unicode.js +1 -2
  190. package/i18n/constants.js +97 -160
  191. package/i18n/constants.mjs +17 -1
  192. package/i18n/languages/ar-AR.js +3 -4
  193. package/i18n/languages/cs-CZ.js +3 -4
  194. package/i18n/languages/de-CH.js +3 -4
  195. package/i18n/languages/de-DE.js +3 -4
  196. package/i18n/languages/en-US.js +17 -5
  197. package/i18n/languages/en-US.mjs +14 -1
  198. package/i18n/languages/es-MX.js +3 -4
  199. package/i18n/languages/fr-FR.js +3 -4
  200. package/i18n/languages/it-IT.js +3 -4
  201. package/i18n/languages/ja-JP.js +3 -4
  202. package/i18n/languages/ko-KR.js +3 -4
  203. package/i18n/languages/lv-LV.js +3 -4
  204. package/i18n/languages/nb-NO.js +3 -4
  205. package/i18n/languages/nl-NL.js +3 -4
  206. package/i18n/languages/pl-PL.js +17 -5
  207. package/i18n/languages/pl-PL.mjs +14 -1
  208. package/i18n/languages/pt-BR.js +3 -4
  209. package/i18n/languages/ru-RU.js +3 -4
  210. package/i18n/languages/sr-SP.js +3 -4
  211. package/i18n/languages/zh-CN.js +3 -4
  212. package/i18n/languages/zh-TW.js +3 -4
  213. package/i18n/registry.js +4 -6
  214. package/index.js +3 -4
  215. package/languages/all.js +47 -40
  216. package/languages/ar-AR.js +1 -2
  217. package/languages/cs-CZ.js +1 -2
  218. package/languages/de-CH.js +1 -2
  219. package/languages/de-DE.js +1 -2
  220. package/languages/en-US.js +15 -3
  221. package/languages/en-US.mjs +14 -1
  222. package/languages/es-MX.js +1 -2
  223. package/languages/fr-FR.js +1 -2
  224. package/languages/index.js +47 -40
  225. package/languages/it-IT.js +1 -2
  226. package/languages/ja-JP.js +1 -2
  227. package/languages/ko-KR.js +1 -2
  228. package/languages/lv-LV.js +1 -2
  229. package/languages/nb-NO.js +1 -2
  230. package/languages/nl-NL.js +1 -2
  231. package/languages/pl-PL.js +15 -3
  232. package/languages/pl-PL.mjs +14 -1
  233. package/languages/pt-BR.js +1 -2
  234. package/languages/ru-RU.js +1 -2
  235. package/languages/sr-SP.js +1 -2
  236. package/languages/zh-CN.js +1 -2
  237. package/languages/zh-TW.js +1 -2
  238. package/mixins/hooksRefRegisterer.js +1 -2
  239. package/mixins/localHooks.js +1 -2
  240. package/package.json +119 -96
  241. package/pluginHooks.d.ts +42 -7
  242. package/pluginHooks.js +301 -65
  243. package/pluginHooks.mjs +300 -63
  244. package/plugins/autoColumnSize/autoColumnSize.d.ts +2 -0
  245. package/plugins/autoColumnSize/autoColumnSize.js +2 -4
  246. package/plugins/autoRowSize/autoRowSize.d.ts +2 -0
  247. package/plugins/autoRowSize/autoRowSize.js +15 -10
  248. package/plugins/autoRowSize/autoRowSize.mjs +13 -6
  249. package/plugins/autofill/autofill.js +2 -4
  250. package/plugins/autofill/utils.js +1 -2
  251. package/plugins/base/base.js +1 -2
  252. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +2 -4
  253. package/plugins/bindRowsWithHeaders/maps/looseBindsMap.js +1 -2
  254. package/plugins/bindRowsWithHeaders/maps/strictBindsMap.js +1 -2
  255. package/plugins/collapsibleColumns/collapsibleColumns.js +77 -8
  256. package/plugins/collapsibleColumns/collapsibleColumns.mjs +76 -5
  257. package/plugins/columnSorting/columnSorting.js +71 -6
  258. package/plugins/columnSorting/columnSorting.mjs +70 -3
  259. package/plugins/columnSorting/index.js +3 -1
  260. package/plugins/columnSorting/index.mjs +1 -1
  261. package/plugins/columnSorting/sortFunction/checkbox.js +1 -2
  262. package/plugins/columnSorting/sortFunction/date.js +1 -2
  263. package/plugins/columnSorting/sortFunction/default.js +1 -2
  264. package/plugins/columnSorting/sortFunction/numeric.js +1 -2
  265. package/plugins/columnSorting/sortService/engine.js +3 -6
  266. package/plugins/columnSorting/utils.js +3 -6
  267. package/plugins/columnSummary/columnSummary.js +2 -4
  268. package/plugins/columnSummary/endpoints.js +1 -2
  269. package/plugins/comments/commentEditor.js +2 -2
  270. package/plugins/comments/commentEditor.mjs +1 -0
  271. package/plugins/comments/comments.js +254 -197
  272. package/plugins/comments/comments.mjs +251 -190
  273. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  274. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  275. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  276. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  277. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  278. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  279. package/plugins/comments/displaySwitch.js +1 -2
  280. package/plugins/contextMenu/commandExecutor.js +2 -3
  281. package/plugins/contextMenu/commandExecutor.mjs +2 -3
  282. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  283. package/plugins/contextMenu/contextMenu.js +77 -40
  284. package/plugins/contextMenu/contextMenu.mjs +74 -35
  285. package/plugins/contextMenu/itemsFactory.js +2 -3
  286. package/plugins/contextMenu/itemsFactory.mjs +3 -4
  287. package/plugins/contextMenu/{cursor.mjs → menu/cursor.js} +6 -4
  288. package/plugins/contextMenu/{cursor.js → menu/cursor.mjs} +4 -10
  289. package/plugins/contextMenu/menu/defaultShortcutsList.js +88 -0
  290. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
  291. package/plugins/contextMenu/menu/index.js +9 -0
  292. package/plugins/contextMenu/menu/index.mjs +1 -0
  293. package/plugins/contextMenu/{menu.js → menu/menu.js} +145 -421
  294. package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +146 -422
  295. package/plugins/contextMenu/menu/menuItemRenderer.js +70 -0
  296. package/plugins/contextMenu/menu/menuItemRenderer.mjs +66 -0
  297. package/plugins/contextMenu/menu/navigator.js +27 -0
  298. package/plugins/contextMenu/menu/navigator.mjs +23 -0
  299. package/plugins/contextMenu/menu/positioner.js +213 -0
  300. package/plugins/contextMenu/menu/positioner.mjs +209 -0
  301. package/plugins/contextMenu/menu/shortcuts.js +114 -0
  302. package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
  303. package/plugins/contextMenu/menu/utils.js +177 -0
  304. package/plugins/contextMenu/menu/utils.mjs +163 -0
  305. package/plugins/contextMenu/predefinedItems/alignment.js +10 -4
  306. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  307. package/plugins/contextMenu/predefinedItems/clearColumn.js +8 -7
  308. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  309. package/plugins/contextMenu/predefinedItems/columnLeft.js +8 -7
  310. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  311. package/plugins/contextMenu/predefinedItems/columnRight.js +8 -7
  312. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  313. package/plugins/contextMenu/predefinedItems/index.js +75 -0
  314. package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
  315. package/plugins/contextMenu/predefinedItems/noItems.js +1 -2
  316. package/plugins/contextMenu/predefinedItems/readOnly.js +10 -4
  317. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  318. package/plugins/contextMenu/predefinedItems/redo.js +3 -4
  319. package/plugins/contextMenu/predefinedItems/removeColumn.js +10 -9
  320. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  321. package/plugins/contextMenu/predefinedItems/removeRow.js +10 -9
  322. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  323. package/plugins/contextMenu/predefinedItems/rowAbove.js +8 -7
  324. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  325. package/plugins/contextMenu/predefinedItems/rowBelow.js +8 -7
  326. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  327. package/plugins/contextMenu/predefinedItems/separator.js +1 -2
  328. package/plugins/contextMenu/predefinedItems/undo.js +3 -4
  329. package/plugins/contextMenu/utils.js +35 -151
  330. package/plugins/contextMenu/utils.mjs +35 -144
  331. package/plugins/copyPaste/clipboardData/clipboardData.js +516 -0
  332. package/plugins/copyPaste/clipboardData/clipboardData.mjs +512 -0
  333. package/plugins/copyPaste/clipboardData/copyClipboardData.js +69 -0
  334. package/plugins/copyPaste/clipboardData/copyClipboardData.mjs +65 -0
  335. package/plugins/copyPaste/clipboardData/index.js +9 -0
  336. package/plugins/copyPaste/clipboardData/index.mjs +4 -0
  337. package/plugins/copyPaste/clipboardData/pasteClipboardData.js +81 -0
  338. package/plugins/copyPaste/clipboardData/pasteClipboardData.mjs +77 -0
  339. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  340. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  341. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  342. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  343. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  344. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  345. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  346. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  347. package/plugins/copyPaste/contextMenuItem/cut.js +9 -2
  348. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  349. package/plugins/copyPaste/copyPaste.js +160 -167
  350. package/plugins/copyPaste/copyPaste.mjs +161 -166
  351. package/plugins/customBorders/contextMenuItem/bottom.js +2 -2
  352. package/plugins/customBorders/contextMenuItem/left.js +2 -2
  353. package/plugins/customBorders/contextMenuItem/noBorders.js +2 -2
  354. package/plugins/customBorders/contextMenuItem/right.js +2 -2
  355. package/plugins/customBorders/contextMenuItem/top.js +2 -2
  356. package/plugins/customBorders/customBorders.js +27 -26
  357. package/plugins/customBorders/customBorders.mjs +24 -21
  358. package/plugins/dragToScroll/dragToScroll.js +2 -4
  359. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  360. package/plugins/dropdownMenu/dropdownMenu.js +130 -44
  361. package/plugins/dropdownMenu/dropdownMenu.mjs +127 -39
  362. package/plugins/exportFile/dataProvider.js +1 -2
  363. package/plugins/exportFile/exportFile.js +4 -6
  364. package/plugins/exportFile/typeFactory.js +5 -8
  365. package/plugins/exportFile/types/_base.js +1 -2
  366. package/plugins/exportFile/types/csv.js +1 -2
  367. package/plugins/filters/component/_base.js +23 -8
  368. package/plugins/filters/component/_base.mjs +23 -8
  369. package/plugins/filters/component/actionBar.js +31 -29
  370. package/plugins/filters/component/actionBar.mjs +26 -23
  371. package/plugins/filters/component/condition.js +48 -61
  372. package/plugins/filters/component/condition.mjs +40 -52
  373. package/plugins/filters/component/operators.js +21 -22
  374. package/plugins/filters/component/operators.mjs +18 -18
  375. package/plugins/filters/component/value.js +37 -28
  376. package/plugins/filters/component/value.mjs +32 -22
  377. package/plugins/filters/condition/beginsWith.js +3 -4
  378. package/plugins/filters/condition/between.js +3 -4
  379. package/plugins/filters/condition/byValue.js +1 -2
  380. package/plugins/filters/condition/contains.js +3 -4
  381. package/plugins/filters/condition/date/after.js +3 -4
  382. package/plugins/filters/condition/date/before.js +3 -4
  383. package/plugins/filters/condition/date/today.js +3 -4
  384. package/plugins/filters/condition/date/tomorrow.js +3 -4
  385. package/plugins/filters/condition/date/yesterday.js +3 -4
  386. package/plugins/filters/condition/empty.js +3 -4
  387. package/plugins/filters/condition/endsWith.js +3 -4
  388. package/plugins/filters/condition/equal.js +3 -4
  389. package/plugins/filters/condition/false.js +1 -2
  390. package/plugins/filters/condition/greaterThan.js +3 -4
  391. package/plugins/filters/condition/greaterThanOrEqual.js +3 -4
  392. package/plugins/filters/condition/lessThan.js +3 -4
  393. package/plugins/filters/condition/lessThanOrEqual.js +3 -4
  394. package/plugins/filters/condition/none.js +3 -4
  395. package/plugins/filters/condition/notBetween.js +3 -4
  396. package/plugins/filters/condition/notContains.js +3 -4
  397. package/plugins/filters/condition/notEmpty.js +3 -4
  398. package/plugins/filters/condition/notEqual.js +3 -4
  399. package/plugins/filters/condition/true.js +1 -2
  400. package/plugins/filters/conditionCollection.d.ts +3 -2
  401. package/plugins/filters/conditionCollection.js +1 -2
  402. package/plugins/filters/conditionRegisterer.js +1 -2
  403. package/plugins/filters/conditionUpdateObserver.js +1 -2
  404. package/plugins/filters/constants.js +4 -8
  405. package/plugins/filters/constants.mjs +1 -1
  406. package/plugins/filters/dataFilter.js +1 -2
  407. package/plugins/filters/filters.d.ts +3 -5
  408. package/plugins/filters/filters.js +108 -66
  409. package/plugins/filters/filters.mjs +99 -55
  410. package/plugins/filters/logicalOperationRegisterer.js +1 -2
  411. package/plugins/filters/logicalOperations/conjunction.js +4 -6
  412. package/plugins/filters/logicalOperations/disjunction.js +4 -6
  413. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.js +4 -6
  414. package/plugins/filters/menu/focusController.js +123 -0
  415. package/plugins/filters/menu/focusController.mjs +119 -0
  416. package/plugins/filters/menu/focusNavigator.js +30 -0
  417. package/plugins/filters/menu/focusNavigator.mjs +26 -0
  418. package/plugins/filters/ui/_base.js +37 -15
  419. package/plugins/filters/ui/_base.mjs +35 -13
  420. package/plugins/filters/ui/input.js +43 -35
  421. package/plugins/filters/ui/input.mjs +42 -33
  422. package/plugins/filters/ui/link.js +44 -12
  423. package/plugins/filters/ui/link.mjs +44 -11
  424. package/plugins/filters/ui/multipleSelect.js +237 -133
  425. package/plugins/filters/ui/multipleSelect.mjs +232 -127
  426. package/plugins/filters/ui/radioInput.js +42 -18
  427. package/plugins/filters/ui/radioInput.mjs +42 -17
  428. package/plugins/filters/ui/select.js +152 -77
  429. package/plugins/filters/ui/select.mjs +148 -72
  430. package/plugins/formulas/engine/settings.js +2 -4
  431. package/plugins/formulas/formulas.js +3 -6
  432. package/plugins/formulas/indexSyncer/axisSyncer.js +1 -2
  433. package/plugins/formulas/indexSyncer/index.js +1 -2
  434. package/plugins/hiddenColumns/contextMenuItem/hideColumn.js +2 -2
  435. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +2 -2
  436. package/plugins/hiddenColumns/hiddenColumns.d.ts +1 -0
  437. package/plugins/hiddenColumns/hiddenColumns.js +49 -6
  438. package/plugins/hiddenColumns/hiddenColumns.mjs +48 -3
  439. package/plugins/hiddenRows/contextMenuItem/hideRow.js +2 -2
  440. package/plugins/hiddenRows/contextMenuItem/showRow.js +2 -2
  441. package/plugins/hiddenRows/hiddenRows.d.ts +1 -0
  442. package/plugins/hiddenRows/hiddenRows.js +49 -6
  443. package/plugins/hiddenRows/hiddenRows.mjs +48 -3
  444. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js +2 -2
  445. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js +2 -2
  446. package/plugins/manualColumnFreeze/manualColumnFreeze.js +2 -4
  447. package/plugins/manualColumnMove/manualColumnMove.js +9 -17
  448. package/plugins/manualColumnMove/manualColumnMove.mjs +7 -13
  449. package/plugins/manualColumnMove/ui/_base.js +1 -2
  450. package/plugins/manualColumnMove/ui/backlight.js +1 -2
  451. package/plugins/manualColumnMove/ui/guideline.js +1 -2
  452. package/plugins/manualColumnResize/manualColumnResize.js +2 -4
  453. package/plugins/manualRowMove/manualRowMove.js +6 -23
  454. package/plugins/manualRowMove/manualRowMove.mjs +4 -19
  455. package/plugins/manualRowMove/ui/_base.js +1 -2
  456. package/plugins/manualRowMove/ui/backlight.js +1 -2
  457. package/plugins/manualRowMove/ui/guideline.js +1 -2
  458. package/plugins/manualRowResize/manualRowResize.js +2 -4
  459. package/plugins/mergeCells/calculations/autofill.js +1 -2
  460. package/plugins/mergeCells/calculations/selection.js +1 -2
  461. package/plugins/mergeCells/cellCoords.js +1 -2
  462. package/plugins/mergeCells/cellsCollection.js +1 -2
  463. package/plugins/mergeCells/contextMenuItem/toggleMerge.js +2 -2
  464. package/plugins/mergeCells/mergeCells.js +7 -20
  465. package/plugins/mergeCells/mergeCells.mjs +5 -16
  466. package/plugins/multiColumnSorting/multiColumnSorting.js +60 -6
  467. package/plugins/multiColumnSorting/multiColumnSorting.mjs +59 -3
  468. package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +2 -4
  469. package/plugins/nestedHeaders/nestedHeaders.js +263 -36
  470. package/plugins/nestedHeaders/nestedHeaders.mjs +262 -33
  471. package/plugins/nestedHeaders/stateManager/index.js +102 -3
  472. package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
  473. package/plugins/nestedHeaders/stateManager/sourceSettings.js +1 -2
  474. package/plugins/nestedHeaders/utils/ghostTable.js +1 -2
  475. package/plugins/nestedRows/data/dataManager.js +1 -2
  476. package/plugins/nestedRows/nestedRows.js +47 -10
  477. package/plugins/nestedRows/nestedRows.mjs +45 -6
  478. package/plugins/nestedRows/ui/_base.js +1 -2
  479. package/plugins/nestedRows/ui/collapsing.js +1 -2
  480. package/plugins/nestedRows/ui/contextMenu.js +3 -4
  481. package/plugins/nestedRows/ui/headers.js +13 -3
  482. package/plugins/nestedRows/ui/headers.mjs +13 -2
  483. package/plugins/persistentState/persistentState.js +2 -4
  484. package/plugins/persistentState/storage.js +1 -2
  485. package/plugins/search/search.js +2 -4
  486. package/plugins/touchScroll/touchScroll.js +2 -4
  487. package/plugins/trimRows/trimRows.js +2 -4
  488. package/plugins/undoRedo/index.js +2 -2
  489. package/plugins/undoRedo/undoRedo.js +2 -4
  490. package/renderers/autocompleteRenderer/autocompleteRenderer.js +9 -2
  491. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
  492. package/renderers/baseRenderer/baseRenderer.js +18 -2
  493. package/renderers/baseRenderer/baseRenderer.mjs +18 -1
  494. package/renderers/checkboxRenderer/checkboxRenderer.js +10 -6
  495. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  496. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  497. package/renderers/dateRenderer/dateRenderer.js +28 -0
  498. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  499. package/renderers/dateRenderer/index.d.ts +1 -0
  500. package/renderers/dateRenderer/index.js +6 -0
  501. package/renderers/dateRenderer/index.mjs +1 -0
  502. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  503. package/renderers/handsontableRenderer/handsontableRenderer.js +28 -0
  504. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  505. package/renderers/handsontableRenderer/index.d.ts +1 -0
  506. package/renderers/handsontableRenderer/index.js +6 -0
  507. package/renderers/handsontableRenderer/index.mjs +1 -0
  508. package/renderers/htmlRenderer/htmlRenderer.js +1 -2
  509. package/renderers/index.d.ts +9 -0
  510. package/renderers/numericRenderer/numericRenderer.js +1 -2
  511. package/renderers/passwordRenderer/passwordRenderer.js +1 -2
  512. package/renderers/selectRenderer/index.d.ts +1 -0
  513. package/renderers/selectRenderer/index.js +6 -0
  514. package/renderers/selectRenderer/index.mjs +1 -0
  515. package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
  516. package/renderers/selectRenderer/selectRenderer.js +26 -0
  517. package/renderers/selectRenderer/selectRenderer.mjs +22 -0
  518. package/renderers/textRenderer/textRenderer.js +1 -2
  519. package/renderers/timeRenderer/timeRenderer.js +1 -2
  520. package/selection/highlight/highlight.js +257 -73
  521. package/selection/highlight/highlight.mjs +250 -71
  522. package/selection/highlight/types/activeHeader.js +10 -8
  523. package/selection/highlight/types/activeHeader.mjs +10 -8
  524. package/selection/highlight/types/area.js +6 -18
  525. package/selection/highlight/types/area.mjs +6 -18
  526. package/selection/highlight/types/areaLayered.js +31 -0
  527. package/selection/highlight/types/areaLayered.mjs +26 -0
  528. package/selection/highlight/types/column.js +27 -0
  529. package/selection/highlight/types/column.mjs +22 -0
  530. package/selection/highlight/types/customSelection.js +7 -9
  531. package/selection/highlight/types/customSelection.mjs +7 -9
  532. package/selection/highlight/types/fill.js +5 -7
  533. package/selection/highlight/types/fill.mjs +5 -7
  534. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  535. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  536. package/selection/highlight/types/header.js +9 -18
  537. package/selection/highlight/types/header.mjs +9 -18
  538. package/selection/highlight/types/row.js +27 -0
  539. package/selection/highlight/types/row.mjs +22 -0
  540. package/selection/highlight/visualSelection.js +32 -29
  541. package/selection/highlight/visualSelection.mjs +31 -27
  542. package/selection/index.js +4 -7
  543. package/selection/index.mjs +2 -3
  544. package/selection/mouseEventHandler.js +7 -1
  545. package/selection/mouseEventHandler.mjs +7 -1
  546. package/selection/range.js +9 -10
  547. package/selection/range.mjs +8 -8
  548. package/selection/selection.js +334 -154
  549. package/selection/selection.mjs +330 -151
  550. package/selection/transformation.js +233 -94
  551. package/selection/transformation.mjs +232 -92
  552. package/selection/utils.js +20 -31
  553. package/selection/utils.mjs +16 -21
  554. package/settings.d.ts +4 -0
  555. package/shortcutContexts/commands/editor/closeAndSave.js +11 -0
  556. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  557. package/shortcutContexts/commands/editor/closeWithoutSaving.js +11 -0
  558. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  559. package/shortcutContexts/commands/editor/fastOpen.js +15 -0
  560. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  561. package/shortcutContexts/commands/editor/index.js +16 -0
  562. package/shortcutContexts/commands/editor/index.mjs +12 -0
  563. package/shortcutContexts/commands/editor/open.js +26 -0
  564. package/shortcutContexts/commands/editor/open.mjs +23 -0
  565. package/shortcutContexts/commands/emptySelectedCells.js +10 -0
  566. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  567. package/shortcutContexts/commands/extendCellsSelection/down.js +14 -0
  568. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  569. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +24 -0
  570. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
  571. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  572. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  573. package/shortcutContexts/commands/extendCellsSelection/left.js +14 -0
  574. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  575. package/shortcutContexts/commands/extendCellsSelection/right.js +14 -0
  576. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  577. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +18 -0
  578. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  579. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +28 -0
  580. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  581. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +18 -0
  582. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  583. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +18 -0
  584. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  585. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +28 -0
  586. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  587. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +28 -0
  588. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  589. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +28 -0
  590. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  591. package/shortcutContexts/commands/extendCellsSelection/toRows.js +18 -0
  592. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  593. package/shortcutContexts/commands/extendCellsSelection/up.js +14 -0
  594. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  595. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +24 -0
  596. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
  597. package/shortcutContexts/commands/index.js +35 -0
  598. package/shortcutContexts/commands/index.mjs +31 -0
  599. package/shortcutContexts/commands/moveCellSelection/down.js +12 -0
  600. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  601. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +32 -0
  602. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
  603. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  604. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  605. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +11 -0
  606. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  607. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +11 -0
  608. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  609. package/shortcutContexts/commands/moveCellSelection/left.js +9 -0
  610. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  611. package/shortcutContexts/commands/moveCellSelection/right.js +9 -0
  612. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  613. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +16 -0
  614. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  615. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +17 -0
  616. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  617. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +13 -0
  618. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  619. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +16 -0
  620. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  621. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +18 -0
  622. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  623. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +20 -0
  624. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  625. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +16 -0
  626. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  627. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +18 -0
  628. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  629. package/shortcutContexts/commands/moveCellSelection/up.js +12 -0
  630. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  631. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +32 -0
  632. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
  633. package/shortcutContexts/commands/populateSelectedCellsData.js +28 -0
  634. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  635. package/shortcutContexts/commands/scrollToFocusedCell.js +34 -0
  636. package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
  637. package/shortcutContexts/commands/selectAll.js +11 -0
  638. package/shortcutContexts/commands/selectAll.mjs +8 -0
  639. package/shortcutContexts/constants.js +11 -0
  640. package/shortcutContexts/constants.mjs +8 -0
  641. package/shortcutContexts/editor.js +25 -0
  642. package/shortcutContexts/editor.mjs +21 -0
  643. package/shortcutContexts/grid.js +167 -0
  644. package/shortcutContexts/grid.mjs +163 -0
  645. package/shortcutContexts/index.js +24 -0
  646. package/shortcutContexts/index.mjs +11 -0
  647. package/shortcuts/context.d.ts +1 -0
  648. package/shortcuts/context.js +23 -4
  649. package/shortcuts/context.mjs +23 -5
  650. package/shortcuts/manager.js +31 -7
  651. package/shortcuts/manager.mjs +32 -7
  652. package/shortcuts/recorder.js +30 -14
  653. package/shortcuts/recorder.mjs +30 -14
  654. package/shortcuts/utils.js +19 -5
  655. package/shortcuts/utils.mjs +18 -4
  656. package/tableView.js +113 -16
  657. package/tableView.mjs +113 -15
  658. package/utils/dataStructures/linkedList.js +1 -2
  659. package/utils/dataStructures/priorityMap.js +2 -4
  660. package/utils/dataStructures/queue.js +1 -2
  661. package/utils/dataStructures/stack.js +1 -2
  662. package/utils/dataStructures/tree.js +3 -6
  663. package/utils/ghostTable.js +32 -17
  664. package/utils/ghostTable.mjs +31 -15
  665. package/utils/interval.js +1 -2
  666. package/utils/paginator.js +151 -0
  667. package/utils/paginator.mjs +147 -0
  668. package/utils/parseTable.js +527 -83
  669. package/utils/parseTable.mjs +523 -82
  670. package/utils/rootInstance.js +2 -4
  671. package/utils/samplesGenerator.js +21 -13
  672. package/utils/samplesGenerator.mjs +20 -11
  673. package/utils/staticRegister.js +1 -2
  674. package/validators/autocompleteValidator/autocompleteValidator.js +1 -2
  675. package/validators/dateValidator/dateValidator.js +1 -2
  676. package/validators/numericValidator/numericValidator.js +1 -2
  677. package/validators/timeValidator/timeValidator.js +1 -2
  678. package/3rdparty/walkontable/src/selection.js +0 -295
  679. package/3rdparty/walkontable/src/selection.mjs +0 -290
  680. package/plugins/contextMenu/predefinedItems.js +0 -76
  681. package/plugins/contextMenu/predefinedItems.mjs +0 -68
  682. package/plugins/copyPaste/clipboardData.js +0 -18
  683. package/plugins/copyPaste/clipboardData.mjs +0 -14
  684. package/plugins/copyPaste/focusableElement.js +0 -186
  685. package/plugins/copyPaste/focusableElement.mjs +0 -180
  686. package/plugins/copyPaste/pasteEvent.js +0 -14
  687. package/plugins/copyPaste/pasteEvent.mjs +0 -9
  688. package/selection/highlight/constants.js +0 -15
  689. package/selection/highlight/constants.mjs +0 -6
  690. package/selection/highlight/types/index.js +0 -35
  691. package/selection/highlight/types/index.mjs +0 -31
package/core.mjs CHANGED
@@ -8,6 +8,7 @@ import { isMobileBrowser, isIpadOS } from "./helpers/browser.mjs";
8
8
  import EditorManager from "./editorManager.mjs";
9
9
  import EventManager from "./eventManager.mjs";
10
10
  import { deepClone, duckSchema, isObjectEqual, isObject, deepObjectSize, hasOwnProperty, createObjectPropListener, objectEach } from "./helpers/object.mjs";
11
+ import { FocusManager } from "./focusManager.mjs";
11
12
  import { arrayMap, arrayEach, arrayReduce, getDifferenceOfArrays, stringToArray, pivot } from "./helpers/array.mjs";
12
13
  import { instanceToHTML } from "./utils/parseTable.mjs";
13
14
  import { getPlugin, getPluginsNames } from "./plugins/registry.mjs";
@@ -27,11 +28,21 @@ import { hasLanguageDictionary, getValidLanguageCode, getTranslatedPhrase } from
27
28
  import { warnUserAboutLanguageRegistration, normalizeLanguageCode } from "./i18n/utils.mjs";
28
29
  import { Selection } from "./selection/index.mjs";
29
30
  import { MetaManager, DynamicCellMetaMod, ExtendMetaPropertiesMod, replaceData } from "./dataMap/index.mjs";
31
+ import { installFocusCatcher } from "./core/index.mjs";
30
32
  import { createUniqueMap } from "./utils/dataStructures/uniqueMap.mjs";
31
33
  import { createShortcutManager } from "./shortcuts/index.mjs";
32
- const SHORTCUTS_GROUP = 'gridDefault';
34
+ import { registerAllShortcutContexts } from "./shortcutContexts/index.mjs";
33
35
  let activeGuid = null;
34
36
 
37
+ /**
38
+ * Keeps the collection of the all Handsontable instances created on the same page. The
39
+ * list is then used to trigger the "afterUnlisten" hook when the "listen()" method was
40
+ * called on another instance.
41
+ *
42
+ * @type {Map<string, Core>}
43
+ */
44
+ const foreignHotInstances = new Map();
45
+
35
46
  /**
36
47
  * A set of deprecated feature names.
37
48
  *
@@ -91,7 +102,8 @@ const deprecationWarns = new Set();
91
102
  * @param {boolean} [rootInstanceSymbol=false] Indicates if the instance is root of all later instances created.
92
103
  */
93
104
  export default function Core(rootElement, userSettings) {
94
- var _userSettings$layoutD;
105
+ var _userSettings$layoutD,
106
+ _this = this;
95
107
  let rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
96
108
  let preventScrollingToCell = false;
97
109
  let instance = this;
@@ -100,6 +112,7 @@ export default function Core(rootElement, userSettings) {
100
112
  let dataSource;
101
113
  let grid;
102
114
  let editorManager;
115
+ let focusManager;
103
116
  let firstRun = true;
104
117
  if (hasValidParameter(rootInstanceSymbol)) {
105
118
  registerAsRootInstance(this);
@@ -208,6 +221,8 @@ export default function Core(rootElement, userSettings) {
208
221
  }
209
222
  this.guid = `ht_${randomString()}`; // this is the namespace for global events
210
223
 
224
+ foreignHotInstances.set(this.guid, this);
225
+
211
226
  /**
212
227
  * Instance of index mapper which is responsible for managing the column indexes.
213
228
  *
@@ -256,14 +271,16 @@ export default function Core(rootElement, userSettings) {
256
271
  };
257
272
 
258
273
  let selection = new Selection(tableMeta, {
259
- rowIndexMapper: () => instance.rowIndexMapper,
260
- columnIndexMapper: () => instance.columnIndexMapper,
274
+ rowIndexMapper: instance.rowIndexMapper,
275
+ columnIndexMapper: instance.columnIndexMapper,
261
276
  countCols: () => instance.countCols(),
262
277
  countRows: () => instance.countRows(),
263
278
  propToCol: prop => datamap.propToCol(prop),
264
279
  isEditorOpened: () => instance.getActiveEditor() ? instance.getActiveEditor().isOpened() : false,
265
- countColsTranslated: () => this.view.countRenderableColumns(),
266
- countRowsTranslated: () => this.view.countRenderableRows(),
280
+ countRenderableColumns: () => this.view.countRenderableColumns(),
281
+ countRenderableRows: () => this.view.countRenderableRows(),
282
+ countRowHeaders: () => this.countRowHeaders(),
283
+ countColHeaders: () => this.countColHeaders(),
267
284
  getShortcutManager: () => instance.getShortcutManager(),
268
285
  createCellCoords: (row, column) => instance._createCellCoords(row, column),
269
286
  createCellRange: (highlight, from, to) => instance._createCellRange(highlight, from, to),
@@ -282,21 +299,6 @@ export default function Core(rootElement, userSettings) {
282
299
  };
283
300
  this.columnIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);
284
301
  this.rowIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);
285
- this.selection.addLocalHook('beforeSetRangeStart', cellCoords => {
286
- this.runHooks('beforeSetRangeStart', cellCoords);
287
- });
288
- this.selection.addLocalHook('beforeSetRangeStartOnly', cellCoords => {
289
- this.runHooks('beforeSetRangeStartOnly', cellCoords);
290
- });
291
- this.selection.addLocalHook('beforeSetRangeEnd', cellCoords => {
292
- this.runHooks('beforeSetRangeEnd', cellCoords);
293
- if (cellCoords.row < 0) {
294
- cellCoords.row = this.view._wt.wtTable.getFirstVisibleRow();
295
- }
296
- if (cellCoords.col < 0) {
297
- cellCoords.col = this.view._wt.wtTable.getFirstVisibleColumn();
298
- }
299
- });
300
302
  this.selection.addLocalHook('afterSetRangeEnd', cellCoords => {
301
303
  const preventScrolling = createObjectPropListener(false);
302
304
  const selectionRange = this.selection.getSelectedRange();
@@ -308,8 +310,6 @@ export default function Core(rootElement, userSettings) {
308
310
  this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);
309
311
  this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel); // eslint-disable-line max-len
310
312
 
311
- const isSelectedByAnyHeader = this.selection.isSelectedByAnyHeader();
312
- const currentSelectedRange = this.selection.selectedRange.current();
313
313
  let scrollToCell = true;
314
314
  if (preventScrollingToCell) {
315
315
  scrollToCell = false;
@@ -317,19 +317,42 @@ export default function Core(rootElement, userSettings) {
317
317
  if (preventScrolling.isTouched()) {
318
318
  scrollToCell = !preventScrolling.value;
319
319
  }
320
+ const currentSelectedRange = this.selection.selectedRange.current();
321
+ const isSelectedByAnyHeader = this.selection.isSelectedByAnyHeader();
320
322
  const isSelectedByRowHeader = this.selection.isSelectedByRowHeader();
321
323
  const isSelectedByColumnHeader = this.selection.isSelectedByColumnHeader();
322
324
  if (scrollToCell !== false) {
323
325
  if (!isSelectedByAnyHeader) {
324
326
  if (currentSelectedRange && !this.selection.isMultiple()) {
325
- this.view.scrollViewport(visualToRenderableCoords(currentSelectedRange.from));
327
+ const {
328
+ row,
329
+ col
330
+ } = currentSelectedRange.from;
331
+ if (row < 0 && col >= 0) {
332
+ this.scrollViewportTo({
333
+ col
334
+ });
335
+ } else if (col < 0 && row >= 0) {
336
+ this.scrollViewportTo({
337
+ row
338
+ });
339
+ } else {
340
+ this.scrollViewportTo({
341
+ row,
342
+ col
343
+ });
344
+ }
326
345
  } else {
327
- this.view.scrollViewport(visualToRenderableCoords(cellCoords));
346
+ this.scrollViewportTo(cellCoords.toObject());
328
347
  }
329
348
  } else if (isSelectedByRowHeader) {
330
- this.view.scrollViewportVertically(instance.rowIndexMapper.getRenderableFromVisualIndex(cellCoords.row));
349
+ this.scrollViewportTo({
350
+ row: cellCoords.row
351
+ });
331
352
  } else if (isSelectedByColumnHeader) {
332
- this.view.scrollViewportHorizontally(instance.columnIndexMapper.getRenderableFromVisualIndex(cellCoords.col));
353
+ this.scrollViewportTo({
354
+ col: cellCoords.col
355
+ });
333
356
  }
334
357
  }
335
358
 
@@ -364,30 +387,78 @@ export default function Core(rootElement, userSettings) {
364
387
  isMultiple.value = changedIsMultiple;
365
388
  }
366
389
  });
367
- this.selection.addLocalHook('beforeModifyTransformStart', cellCoordsDelta => {
368
- this.runHooks('modifyTransformStart', cellCoordsDelta);
369
- });
370
- this.selection.addLocalHook('afterModifyTransformStart', (coords, rowTransformDir, colTransformDir) => {
371
- this.runHooks('afterModifyTransformStart', coords, rowTransformDir, colTransformDir);
372
- });
373
- this.selection.addLocalHook('beforeModifyTransformEnd', cellCoordsDelta => {
374
- this.runHooks('modifyTransformEnd', cellCoordsDelta);
375
- });
376
- this.selection.addLocalHook('afterModifyTransformEnd', (coords, rowTransformDir, colTransformDir) => {
377
- this.runHooks('afterModifyTransformEnd', coords, rowTransformDir, colTransformDir);
378
- });
379
390
  this.selection.addLocalHook('afterDeselect', () => {
380
391
  editorManager.destroyEditor();
381
392
  this._refreshBorders();
382
393
  removeClass(this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);
383
394
  this.runHooks('afterDeselect');
384
395
  });
385
- this.selection.addLocalHook('insertRowRequire', totalRows => {
386
- this.alter('insert_row_above', totalRows, 1, 'auto');
387
- });
388
- this.selection.addLocalHook('insertColRequire', totalCols => {
389
- this.alter('insert_col_start', totalCols, 1, 'auto');
390
- });
396
+ this.selection.addLocalHook('beforeHighlightSet', () => this.runHooks('beforeSelectionHighlightSet')).addLocalHook('beforeSetRangeStart', function () {
397
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
398
+ args[_key] = arguments[_key];
399
+ }
400
+ return _this.runHooks('beforeSetRangeStart', ...args);
401
+ }).addLocalHook('beforeSetRangeStartOnly', function () {
402
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
403
+ args[_key2] = arguments[_key2];
404
+ }
405
+ return _this.runHooks('beforeSetRangeStartOnly', ...args);
406
+ }).addLocalHook('beforeSetRangeEnd', function () {
407
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
408
+ args[_key3] = arguments[_key3];
409
+ }
410
+ return _this.runHooks('beforeSetRangeEnd', ...args);
411
+ }).addLocalHook('beforeSelectColumns', function () {
412
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
413
+ args[_key4] = arguments[_key4];
414
+ }
415
+ return _this.runHooks('beforeSelectColumns', ...args);
416
+ }).addLocalHook('afterSelectColumns', function () {
417
+ for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
418
+ args[_key5] = arguments[_key5];
419
+ }
420
+ return _this.runHooks('afterSelectColumns', ...args);
421
+ }).addLocalHook('beforeSelectRows', function () {
422
+ for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
423
+ args[_key6] = arguments[_key6];
424
+ }
425
+ return _this.runHooks('beforeSelectRows', ...args);
426
+ }).addLocalHook('afterSelectRows', function () {
427
+ for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
428
+ args[_key7] = arguments[_key7];
429
+ }
430
+ return _this.runHooks('afterSelectRows', ...args);
431
+ }).addLocalHook('beforeModifyTransformStart', function () {
432
+ for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
433
+ args[_key8] = arguments[_key8];
434
+ }
435
+ return _this.runHooks('modifyTransformStart', ...args);
436
+ }).addLocalHook('afterModifyTransformStart', function () {
437
+ for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
438
+ args[_key9] = arguments[_key9];
439
+ }
440
+ return _this.runHooks('afterModifyTransformStart', ...args);
441
+ }).addLocalHook('beforeModifyTransformEnd', function () {
442
+ for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
443
+ args[_key10] = arguments[_key10];
444
+ }
445
+ return _this.runHooks('modifyTransformEnd', ...args);
446
+ }).addLocalHook('afterModifyTransformEnd', function () {
447
+ for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
448
+ args[_key11] = arguments[_key11];
449
+ }
450
+ return _this.runHooks('afterModifyTransformEnd', ...args);
451
+ }).addLocalHook('beforeRowWrap', function () {
452
+ for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
453
+ args[_key12] = arguments[_key12];
454
+ }
455
+ return _this.runHooks('beforeRowWrap', ...args);
456
+ }).addLocalHook('beforeColumnWrap', function () {
457
+ for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
458
+ args[_key13] = arguments[_key13];
459
+ }
460
+ return _this.runHooks('beforeColumnWrap', ...args);
461
+ }).addLocalHook('insertRowRequire', totalRows => this.alter('insert_row_above', totalRows, 1, 'auto')).addLocalHook('insertColRequire', totalCols => this.alter('insert_col_start', totalCols, 1, 'auto'));
391
462
  grid = {
392
463
  /**
393
464
  * Inserts or removes rows and columns.
@@ -469,7 +540,9 @@ export default function Core(rootElement, userSettings) {
469
540
  const currentFromRow = currentFromRange === null || currentFromRange === void 0 ? void 0 : currentFromRange.row;
470
541
  const startVisualRowIndex = instance.toVisualRow(startRowPhysicalIndex);
471
542
  if (selection.isSelectedByCorner()) {
472
- instance.selectAll();
543
+ selection.selectAll(true, true, {
544
+ disableHeadersHighlight: true
545
+ });
473
546
  } else if (isDefined(currentFromRow) && currentFromRow >= startVisualRowIndex) {
474
547
  // Moving the selection (if it exists) downward – it should be applied to the "old" row.
475
548
  // TODO: The logic here should be handled by selection module.
@@ -523,7 +596,9 @@ export default function Core(rootElement, userSettings) {
523
596
  const currentFromColumn = currentFromRange === null || currentFromRange === void 0 ? void 0 : currentFromRange.col;
524
597
  const startVisualColumnIndex = instance.toVisualColumn(startColumnPhysicalIndex);
525
598
  if (selection.isSelectedByCorner()) {
526
- instance.selectAll();
599
+ selection.selectAll(true, true, {
600
+ disableHeadersHighlight: true
601
+ });
527
602
  } else if (isDefined(currentFromColumn) && currentFromColumn >= startVisualColumnIndex) {
528
603
  // Moving the selection (if it exists) rightward – it should be applied to the "old" column.
529
604
  // TODO: The logic here should be handled by selection module.
@@ -1013,6 +1088,10 @@ export default function Core(rootElement, userSettings) {
1013
1088
  this.updateSettings(tableMeta, true);
1014
1089
  this.view = new TableView(this);
1015
1090
  editorManager = EditorManager.getInstance(instance, tableMeta, selection);
1091
+ focusManager = new FocusManager(instance);
1092
+ if (isRootInstance(this)) {
1093
+ installFocusCatcher(instance);
1094
+ }
1016
1095
  instance.runHooks('init');
1017
1096
  this.forceFullRender = true; // used when data was changed
1018
1097
  this.view.render();
@@ -1426,6 +1505,11 @@ export default function Core(rootElement, userSettings) {
1426
1505
  */
1427
1506
  this.listen = function () {
1428
1507
  if (instance && !instance.isListening()) {
1508
+ foreignHotInstances.forEach(foreignHot => {
1509
+ if (instance !== foreignHot) {
1510
+ foreignHot.unlisten();
1511
+ }
1512
+ });
1429
1513
  activeGuid = instance.guid;
1430
1514
  instance.runHooks('afterListen');
1431
1515
  }
@@ -1510,8 +1594,8 @@ export default function Core(rootElement, userSettings) {
1510
1594
  * @returns {Array} Returns removed portion of columns.
1511
1595
  */
1512
1596
  this.spliceCol = function (column, index, amount) {
1513
- for (var _len = arguments.length, elements = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
1514
- elements[_key - 3] = arguments[_key];
1597
+ for (var _len14 = arguments.length, elements = new Array(_len14 > 3 ? _len14 - 3 : 0), _key14 = 3; _key14 < _len14; _key14++) {
1598
+ elements[_key14 - 3] = arguments[_key14];
1515
1599
  }
1516
1600
  return datamap.spliceCol(column, index, amount, ...elements);
1517
1601
  };
@@ -1528,8 +1612,8 @@ export default function Core(rootElement, userSettings) {
1528
1612
  * @returns {Array} Returns removed portion of rows.
1529
1613
  */
1530
1614
  this.spliceRow = function (row, index, amount) {
1531
- for (var _len2 = arguments.length, elements = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {
1532
- elements[_key2 - 3] = arguments[_key2];
1615
+ for (var _len15 = arguments.length, elements = new Array(_len15 > 3 ? _len15 - 3 : 0), _key15 = 3; _key15 < _len15; _key15++) {
1616
+ elements[_key15 - 3] = arguments[_key15];
1533
1617
  }
1534
1618
  return datamap.spliceRow(row, index, amount, ...elements);
1535
1619
  };
@@ -1626,6 +1710,9 @@ export default function Core(rootElement, userSettings) {
1626
1710
  }
1627
1711
  const changes = [];
1628
1712
  arrayEach(selection.getSelectedRange(), cellRange => {
1713
+ if (cellRange.isSingleHeader()) {
1714
+ return;
1715
+ }
1629
1716
  const topStart = cellRange.getTopStartCorner();
1630
1717
  const bottomEnd = cellRange.getBottomEndCorner();
1631
1718
  rangeEach(topStart.row, bottomEnd.row, row => {
@@ -2923,8 +3010,8 @@ export default function Core(rootElement, userSettings) {
2923
3010
  */
2924
3011
  this.spliceCellsMeta = function (visualIndex) {
2925
3012
  let deleteAmount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
2926
- for (var _len3 = arguments.length, cellMetaRows = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
2927
- cellMetaRows[_key3 - 2] = arguments[_key3];
3013
+ for (var _len16 = arguments.length, cellMetaRows = new Array(_len16 > 2 ? _len16 - 2 : 0), _key16 = 2; _key16 < _len16; _key16++) {
3014
+ cellMetaRows[_key16 - 2] = arguments[_key16];
2928
3015
  }
2929
3016
  if (cellMetaRows.length > 0 && !Array.isArray(cellMetaRows[0])) {
2930
3017
  throw new Error('The 3rd argument (cellMetaRows) has to be passed as an array of cell meta objects array.');
@@ -3615,6 +3702,30 @@ export default function Core(rootElement, userSettings) {
3615
3702
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getVisibleColumnsCount() : -1;
3616
3703
  };
3617
3704
 
3705
+ /**
3706
+ * Returns the number of rendered row headers.
3707
+ *
3708
+ * @since 14.0.0
3709
+ * @memberof Core#
3710
+ * @function countRowHeaders
3711
+ * @returns {number} Number of row headers.
3712
+ */
3713
+ this.countRowHeaders = function () {
3714
+ return this.view.getRowHeadersCount();
3715
+ };
3716
+
3717
+ /**
3718
+ * Returns the number of rendered column headers.
3719
+ *
3720
+ * @since 14.0.0
3721
+ * @memberof Core#
3722
+ * @function countColHeaders
3723
+ * @returns {number} Number of column headers.
3724
+ */
3725
+ this.countColHeaders = function () {
3726
+ return this.view.getColumnHeadersCount();
3727
+ };
3728
+
3618
3729
  /**
3619
3730
  * Returns the number of empty rows. If the optional ending parameter is `true`, returns the
3620
3731
  * number of empty rows at the bottom of the table.
@@ -3819,6 +3930,10 @@ export default function Core(rootElement, userSettings) {
3819
3930
  * hot.selectColumns('id');
3820
3931
  * // Select range of columns using visual indexes.
3821
3932
  * hot.selectColumns(1, 4);
3933
+ * // Select range of columns using visual indexes and mark the first header as highlighted.
3934
+ * hot.selectColumns(1, 2, -1);
3935
+ * // Select range of columns using visual indexes and mark the second cell as highlighted.
3936
+ * hot.selectColumns(2, 1, 1);
3822
3937
  * // Select range of columns using column properties.
3823
3938
  * hot.selectColumns('id', 'last_name');
3824
3939
  * ```
@@ -3829,11 +3944,15 @@ export default function Core(rootElement, userSettings) {
3829
3944
  * @param {number} startColumn The visual column index from which the selection starts.
3830
3945
  * @param {number} [endColumn=startColumn] The visual column index to which the selection finishes. If `endColumn`
3831
3946
  * is not defined the column defined by `startColumn` will be selected.
3947
+ * @param {number} [focusPosition=0] The argument allows changing the cell/header focus position.
3948
+ * The value can take visual row index from -N to N, where negative values
3949
+ * point to the headers and positive values point to the cell range.
3832
3950
  * @returns {boolean} `true` if selection was successful, `false` otherwise.
3833
3951
  */
3834
3952
  this.selectColumns = function (startColumn) {
3835
3953
  let endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;
3836
- return selection.selectColumns(startColumn, endColumn);
3954
+ let focusPosition = arguments.length > 2 ? arguments[2] : undefined;
3955
+ return selection.selectColumns(startColumn, endColumn, focusPosition);
3837
3956
  };
3838
3957
 
3839
3958
  /**
@@ -3843,8 +3962,12 @@ export default function Core(rootElement, userSettings) {
3843
3962
  * ```js
3844
3963
  * // Select row using visual index.
3845
3964
  * hot.selectRows(1);
3846
- * // Select range of rows using visual indexes.
3965
+ * // select a range of rows, using visual indexes.
3847
3966
  * hot.selectRows(1, 4);
3967
+ * // select a range of rows, using visual indexes, and mark the header as highlighted.
3968
+ * hot.selectRows(1, 2, -1);
3969
+ * // Select range of rows using visual indexes and mark the second cell as highlighted.
3970
+ * hot.selectRows(2, 1, 1);
3848
3971
  * ```
3849
3972
  *
3850
3973
  * @memberof Core#
@@ -3853,11 +3976,15 @@ export default function Core(rootElement, userSettings) {
3853
3976
  * @param {number} startRow The visual row index from which the selection starts.
3854
3977
  * @param {number} [endRow=startRow] The visual row index to which the selection finishes. If `endRow`
3855
3978
  * is not defined the row defined by `startRow` will be selected.
3979
+ * @param {number} [focusPosition=0] The argument allows changing the cell/header focus position.
3980
+ * The value can take visual column index from -N to N, where negative values
3981
+ * point to the headers and positive values point to the cell range.
3856
3982
  * @returns {boolean} `true` if selection was successful, `false` otherwise.
3857
3983
  */
3858
3984
  this.selectRows = function (startRow) {
3859
3985
  let endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;
3860
- return selection.selectRows(startRow, endRow);
3986
+ let focusPosition = arguments.length > 2 ? arguments[2] : undefined;
3987
+ return selection.selectRows(startRow, endRow, focusPosition);
3861
3988
  };
3862
3989
 
3863
3990
  /**
@@ -3876,9 +4003,16 @@ export default function Core(rootElement, userSettings) {
3876
4003
  * The previous selection is overwritten.
3877
4004
  *
3878
4005
  * ```js
3879
- * // select all cells in the table, including all headers
4006
+ * // select all cells in the table, including all headers and the corner cell
3880
4007
  * hot.selectAll();
3881
4008
  *
4009
+ * // select all cells in the table, including row headers but excluding the corner cell
4010
+ * hot.selectAll(true, false);
4011
+ *
4012
+ * // select all cells in the table, including all headers and the corner cell, but move the focus
4013
+ * // highlight to position -2, -1
4014
+ * hot.selectAll(-2, -1);
4015
+ *
3882
4016
  * // select all cells in the table, without headers
3883
4017
  * hot.selectAll(false);
3884
4018
  * ```
@@ -3886,15 +4020,25 @@ export default function Core(rootElement, userSettings) {
3886
4020
  * @since 0.38.2
3887
4021
  * @memberof Core#
3888
4022
  * @function selectAll
3889
- * @param {boolean} [includeHeaders=true] `true`: include all row, column and corner headers.
3890
- * `false`: don't include any headers.
4023
+ * @param {boolean} [includeRowHeaders=false] `true` If the selection should include the row headers,
4024
+ * `false` otherwise.
4025
+ * @param {boolean} [includeColumnHeaders=false] `true` If the selection should include the column
4026
+ * headers, `false` otherwise.
4027
+ *
4028
+ * @param {object} [options] Additional object with options.
4029
+ * @param {{row: number, col: number} | boolean} [options.focusPosition] The argument allows changing the cell/header
4030
+ * focus position. The value takes an object with a `row` and `col` properties from -N to N, where
4031
+ * negative values point to the headers and positive values point to the cell range. If `false`, the focus
4032
+ * position won't be changed.
4033
+ * @param {boolean} [options.disableHeadersHighlight] If `true`, disables highlighting the headers even when
4034
+ * the logical coordinates points on them.
3891
4035
  */
3892
4036
  this.selectAll = function () {
3893
- let includeHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
3894
- const includeRowHeaders = includeHeaders && this.hasRowHeaders();
3895
- const includeColumnHeaders = includeHeaders && this.hasColHeaders();
4037
+ let includeRowHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
4038
+ let includeColumnHeaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : includeRowHeaders;
4039
+ let options = arguments.length > 2 ? arguments[2] : undefined;
3896
4040
  preventScrollingToCell = true;
3897
- selection.selectAll(includeRowHeaders, includeColumnHeaders);
4041
+ selection.selectAll(includeRowHeaders, includeColumnHeaders, options);
3898
4042
  preventScrollingToCell = false;
3899
4043
  };
3900
4044
  const getIndexToScroll = (indexMapper, visualIndex) => {
@@ -3903,55 +4047,117 @@ export default function Core(rootElement, userSettings) {
3903
4047
  };
3904
4048
 
3905
4049
  /**
3906
- * Scroll viewport to coordinates specified by the `row` and `column` arguments.
4050
+ * Scroll viewport to coordinates specified by the `row` and/or `col` object properties.
4051
+ *
4052
+ * ```js
4053
+ * // scroll the viewport to the visual row index (leave the horizontal scroll untouched)
4054
+ * hot.scrollViewportTo({ row: 50 });
4055
+ *
4056
+ * // scroll the viewport to the passed coordinates so that the cell at 50, 50 will be snapped to
4057
+ * // the bottom-end table's edge.
4058
+ * hot.scrollViewportTo({
4059
+ * row: 50,
4060
+ * col: 50,
4061
+ * verticalSnap: 'bottom',
4062
+ * horizontalSnap: 'end',
4063
+ * });
4064
+ * ```
3907
4065
  *
3908
4066
  * @memberof Core#
3909
4067
  * @function scrollViewportTo
3910
- * @param {number} [row] Row index. If the last argument isn't defined we treat the index as a visual row index. Otherwise,
3911
- * we are using the index for numbering only this rows which may be rendered (we don't consider hidden rows).
3912
- * @param {number} [column] Column index. If the last argument isn't defined we treat the index as a visual column index.
3913
- * Otherwise, we are using the index for numbering only this columns which may be rendered (we don't consider hidden columns).
3914
- * @param {boolean} [snapToBottom=false] If `true`, the viewport is scrolled to show the cell at the bottom of the table.
3915
- * However, if the cell's height is greater than the table's viewport height, the cell is snapped to the top edge.
3916
- * @param {boolean} [snapToRight=false] If `true`, the viewport is scrolled to show the cell at the right side of the table.
3917
- * However, if the cell is wider than the table's viewport width, the cell is snapped to the left edge (or to the right edge, if the layout direction is set to `rtl`).
3918
- * @param {boolean} [considerHiddenIndexes=true] If `true`, we handle visual indexes, otherwise we handle only indexes which
4068
+ * @param {object} options A dictionary containing the following parameters:
4069
+ * @param {number} [options.row] Specifies the number of visual rows along the Y axis to scroll the viewport.
4070
+ * @param {number} [options.col] Specifies the number of visual columns along the X axis to scroll the viewport.
4071
+ * @param {'top' | 'bottom'} [options.verticalSnap] Determines to which edge of the table the viewport will be scrolled based on the passed coordinates.
4072
+ * This option is a string which must take one of the following values:
4073
+ * - `top`: The viewport will be scrolled to a row in such a way that it will be positioned on the top of the viewport;
4074
+ * - `bottom`: The viewport will be scrolled to a row in such a way that it will be positioned on the bottom of the viewport;
4075
+ * - If the property is not defined the vertical auto-snapping is enabled. Depending on where the viewport is scrolled from, a row will
4076
+ * be positioned at the top or bottom of the viewport.
4077
+ * @param {'start' | 'end'} [options.horizontalSnap] Determines to which edge of the table the viewport will be scrolled based on the passed coordinates.
4078
+ * This option is a string which must take one of the following values:
4079
+ * - `start`: The viewport will be scrolled to a column in such a way that it will be positioned on the start (left edge or right, if the layout direction is set to `rtl`) of the viewport;
4080
+ * - `end`: The viewport will be scrolled to a column in such a way that it will be positioned on the end (right edge or left, if the layout direction is set to `rtl`) of the viewport;
4081
+ * - If the property is not defined the horizontal auto-snapping is enabled. Depending on where the viewport is scrolled from, a column will
4082
+ * be positioned at the start or end of the viewport.
4083
+ * @param {boolean} [options.considerHiddenIndexes=true] If `true`, we handle visual indexes, otherwise we handle only indexes which
3919
4084
  * may be rendered when they are in the viewport (we don't consider hidden indexes as they aren't rendered).
3920
- * @returns {boolean} `true` if scroll was successful, `false` otherwise.
3921
- */
3922
- this.scrollViewportTo = function (row, column) {
3923
- let snapToBottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
3924
- let snapToRight = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
3925
- let considerHiddenIndexes = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
3926
- const snapToTop = !snapToBottom;
3927
- const snapToLeft = !snapToRight;
4085
+ * @returns {boolean} `true` if viewport was scrolled, `false` otherwise.
4086
+ */
4087
+ this.scrollViewportTo = function () {
4088
+ let {
4089
+ row,
4090
+ col,
4091
+ verticalSnap,
4092
+ horizontalSnap,
4093
+ considerHiddenIndexes
4094
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
4095
+ let snapToTop;
4096
+ let snapToBottom;
4097
+ let snapToInlineStart;
4098
+ let snapToInlineEnd;
4099
+ if (verticalSnap !== undefined) {
4100
+ snapToTop = verticalSnap === 'top';
4101
+ snapToBottom = !snapToTop;
4102
+ }
4103
+ if (horizontalSnap !== undefined) {
4104
+ snapToInlineStart = horizontalSnap === 'start';
4105
+ snapToInlineEnd = !snapToInlineStart;
4106
+ }
3928
4107
  let renderableRow = row;
3929
- let renderableColumn = column;
3930
- if (considerHiddenIndexes) {
3931
- const isRowInteger = Number.isInteger(row);
3932
- const isColumnInteger = Number.isInteger(column);
3933
- const visualRowToScroll = isRowInteger ? getIndexToScroll(this.rowIndexMapper, row) : void 0;
3934
- const visualColumnToScroll = isColumnInteger ? getIndexToScroll(this.columnIndexMapper, column) : void 0;
4108
+ let renderableColumn = col;
4109
+ if (considerHiddenIndexes === undefined || considerHiddenIndexes) {
4110
+ const isValidRowGrid = Number.isInteger(row) && row >= 0;
4111
+ const isValidColumnGrid = Number.isInteger(col) && col >= 0;
4112
+ const visualRowToScroll = isValidRowGrid ? getIndexToScroll(this.rowIndexMapper, row) : undefined;
4113
+ const visualColumnToScroll = isValidColumnGrid ? getIndexToScroll(this.columnIndexMapper, col) : undefined;
3935
4114
  if (visualRowToScroll === null || visualColumnToScroll === null) {
3936
4115
  return false;
3937
4116
  }
3938
- renderableRow = isRowInteger ? instance.rowIndexMapper.getRenderableFromVisualIndex(visualRowToScroll) : void 0;
3939
- renderableColumn = isColumnInteger ? instance.columnIndexMapper.getRenderableFromVisualIndex(visualColumnToScroll) : void 0;
4117
+ renderableRow = isValidRowGrid ? instance.rowIndexMapper.getRenderableFromVisualIndex(visualRowToScroll) : row;
4118
+ renderableColumn = isValidColumnGrid ? instance.columnIndexMapper.getRenderableFromVisualIndex(visualColumnToScroll) : col;
3940
4119
  }
3941
4120
  const isRowInteger = Number.isInteger(renderableRow);
3942
4121
  const isColumnInteger = Number.isInteger(renderableColumn);
3943
- if (isRowInteger && isColumnInteger) {
3944
- return instance.view.scrollViewport(instance._createCellCoords(renderableRow, renderableColumn), snapToTop, snapToRight, snapToBottom, snapToLeft);
4122
+ if (isRowInteger && renderableRow >= 0 && isColumnInteger && renderableColumn >= 0) {
4123
+ return instance.view.scrollViewport(instance._createCellCoords(renderableRow, renderableColumn), snapToTop, snapToInlineEnd, snapToBottom, snapToInlineStart);
3945
4124
  }
3946
- if (isRowInteger && isColumnInteger === false) {
4125
+ if (isRowInteger && renderableRow >= 0 && (isColumnInteger && renderableColumn < 0 || !isColumnInteger)) {
3947
4126
  return instance.view.scrollViewportVertically(renderableRow, snapToTop, snapToBottom);
3948
4127
  }
3949
- if (isColumnInteger && isRowInteger === false) {
3950
- return instance.view.scrollViewportHorizontally(renderableColumn, snapToRight, snapToLeft);
4128
+ if (isColumnInteger && renderableColumn >= 0 && (isRowInteger && renderableRow < 0 || !isRowInteger)) {
4129
+ return instance.view.scrollViewportHorizontally(renderableColumn, snapToInlineEnd, snapToInlineStart);
3951
4130
  }
3952
4131
  return false;
3953
4132
  };
3954
4133
 
4134
+ /**
4135
+ * Scrolls the viewport to coordinates specified by the currently focused cell.
4136
+ *
4137
+ * @since 14.0.0
4138
+ * @memberof Core#
4139
+ * @fires Hooks#afterScroll
4140
+ * @function scrollToFocusedCell
4141
+ * @param {Function} callback The callback function to call after the viewport is scrolled.
4142
+ */
4143
+ this.scrollToFocusedCell = function () {
4144
+ let callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : () => {};
4145
+ if (!this.selection.isSelected()) {
4146
+ return;
4147
+ }
4148
+ this.addHookOnce('afterScroll', callback);
4149
+ const {
4150
+ highlight
4151
+ } = this.getSelectedRangeLast();
4152
+ const isScrolled = this.scrollViewportTo(highlight.toObject());
4153
+ if (isScrolled) {
4154
+ this.view.render();
4155
+ } else {
4156
+ this.removeHook('afterScroll', callback);
4157
+ this._registerImmediate(() => callback());
4158
+ }
4159
+ };
4160
+
3955
4161
  /**
3956
4162
  * Removes the table from the DOM and destroys the instance of the Handsontable.
3957
4163
  *
@@ -3972,6 +4178,7 @@ export default function Core(rootElement, userSettings) {
3972
4178
  dataSource = null;
3973
4179
  this.getShortcutManager().destroy();
3974
4180
  metaManager.clearCache();
4181
+ foreignHotInstances.delete(this.guid);
3975
4182
  if (isRootInstance(instance)) {
3976
4183
  const licenseInfo = this.rootDocument.querySelector('.hot-display-license-info');
3977
4184
  if (licenseInfo) {
@@ -4196,7 +4403,7 @@ export default function Core(rootElement, userSettings) {
4196
4403
  * @function getTranslatedPhrase
4197
4404
  * @since 0.35.0
4198
4405
  * @param {string} dictionaryKey Constant which is dictionary key.
4199
- * @param {*} extraArguments Arguments which will be handled by formatters.
4406
+ * @param {*} [extraArguments] Arguments which will be handled by formatters.
4200
4407
  * @returns {string}
4201
4408
  */
4202
4409
  this.getTranslatedPhrase = function (dictionaryKey, extraArguments) {
@@ -4295,6 +4502,16 @@ export default function Core(rootElement, userSettings) {
4295
4502
  }
4296
4503
  };
4297
4504
 
4505
+ /**
4506
+ * Gets the instance of the EditorManager.
4507
+ *
4508
+ * @private
4509
+ * @returns {EditorManager}
4510
+ */
4511
+ this._getEditorManager = function () {
4512
+ return editorManager;
4513
+ };
4514
+
4298
4515
  /**
4299
4516
  * Check if currently it is RTL direction.
4300
4517
  *
@@ -4331,10 +4548,8 @@ export default function Core(rootElement, userSettings) {
4331
4548
  return instance.isLtr() ? 1 : -1;
4332
4549
  };
4333
4550
  const shortcutManager = createShortcutManager({
4334
- handleEvent(event) {
4335
- const isListening = instance.isListening();
4336
- const isKeyboardEventWithKey = (event === null || event === void 0 ? void 0 : event.key) !== void 0;
4337
- return isListening && isKeyboardEventWithKey;
4551
+ handleEvent() {
4552
+ return instance.isListening();
4338
4553
  },
4339
4554
  beforeKeyDown: event => {
4340
4555
  return this.runHooks('beforeKeyDown', event);
@@ -4367,270 +4582,23 @@ export default function Core(rootElement, userSettings) {
4367
4582
  this.getShortcutManager = function () {
4368
4583
  return shortcutManager;
4369
4584
  };
4370
- const gridContext = shortcutManager.addContext('grid');
4371
- const gridConfig = {
4372
- runOnlyIf: () => {
4373
- return isDefined(instance.getSelected()) && instance.countRenderedRows() > 0 && instance.countRenderedCols() > 0;
4374
- },
4375
- group: SHORTCUTS_GROUP
4585
+
4586
+ /**
4587
+ * Return the Focus Manager responsible for managing the browser's focus in the table.
4588
+ *
4589
+ * @memberof Core#
4590
+ * @since 14.0.0
4591
+ * @function getFocusManager
4592
+ * @returns {FocusManager}
4593
+ */
4594
+ this.getFocusManager = function () {
4595
+ return focusManager;
4376
4596
  };
4377
- shortcutManager.setActiveContextName('grid');
4378
- gridContext.addShortcuts([{
4379
- keys: [['Control/Meta', 'A']],
4380
- callback: () => {
4381
- instance.selectAll();
4382
- }
4383
- }, {
4384
- keys: [['Control/Meta', 'Enter']],
4385
- callback: () => {
4386
- const selectedRange = instance.getSelectedRange();
4387
- const {
4388
- row: highlightRow,
4389
- col: highlightColumn
4390
- } = selectedRange[selectedRange.length - 1].highlight;
4391
- const valueToPopulate = instance.getDataAtCell(highlightRow, highlightColumn);
4392
- const cellValues = new Map();
4393
- for (let i = 0; i < selectedRange.length; i++) {
4394
- selectedRange[i].forAll((row, column) => {
4395
- if (row >= 0 && column >= 0 && (row !== highlightRow || column !== highlightColumn)) {
4396
- const {
4397
- readOnly
4398
- } = instance.getCellMeta(row, column);
4399
- if (!readOnly) {
4400
- cellValues.set(`${row}x${column}`, [row, column, valueToPopulate]);
4401
- }
4402
- }
4403
- });
4404
- }
4405
- instance.setDataAtCell(Array.from(cellValues.values()));
4406
- },
4407
- runOnlyIf: () => instance.getSelectedRangeLast().getCellsCount() > 1
4408
- }, {
4409
- keys: [['ArrowUp']],
4410
- callback: () => {
4411
- selection.transformStart(-1, 0);
4412
- }
4413
- }, {
4414
- keys: [['ArrowUp', 'Control/Meta']],
4415
- captureCtrl: true,
4416
- callback: () => {
4417
- selection.setRangeStart(instance._createCellCoords(instance.rowIndexMapper.getNearestNotHiddenIndex(0, 1), instance.getSelectedRangeLast().highlight.col));
4418
- }
4419
- }, {
4420
- keys: [['ArrowUp', 'Shift']],
4421
- callback: () => {
4422
- selection.transformEnd(-1, 0);
4423
- }
4424
- }, {
4425
- keys: [['ArrowUp', 'Shift', 'Control/Meta']],
4426
- captureCtrl: true,
4427
- callback: () => {
4428
- const {
4429
- from,
4430
- to
4431
- } = instance.getSelectedRangeLast();
4432
- const row = instance.rowIndexMapper.getNearestNotHiddenIndex(0, 1);
4433
- selection.setRangeStart(from.clone());
4434
- selection.setRangeEnd(instance._createCellCoords(row, to.col));
4435
- },
4436
- runOnlyIf: () => !(instance.selection.isSelectedByCorner() || instance.selection.isSelectedByColumnHeader())
4437
- }, {
4438
- keys: [['ArrowDown']],
4439
- callback: () => {
4440
- selection.transformStart(1, 0);
4441
- }
4442
- }, {
4443
- keys: [['ArrowDown', 'Control/Meta']],
4444
- captureCtrl: true,
4445
- callback: () => {
4446
- selection.setRangeStart(instance._createCellCoords(instance.rowIndexMapper.getNearestNotHiddenIndex(instance.countRows() - 1, -1), instance.getSelectedRangeLast().highlight.col));
4447
- }
4448
- }, {
4449
- keys: [['ArrowDown', 'Shift']],
4450
- callback: () => {
4451
- selection.transformEnd(1, 0);
4452
- }
4453
- }, {
4454
- keys: [['ArrowDown', 'Shift', 'Control/Meta']],
4455
- captureCtrl: true,
4456
- callback: () => {
4457
- const {
4458
- from,
4459
- to
4460
- } = instance.getSelectedRangeLast();
4461
- const row = instance.rowIndexMapper.getNearestNotHiddenIndex(instance.countRows() - 1, -1);
4462
- selection.setRangeStart(from.clone());
4463
- selection.setRangeEnd(instance._createCellCoords(row, to.col));
4464
- },
4465
- runOnlyIf: () => !(instance.selection.isSelectedByCorner() || instance.selection.isSelectedByColumnHeader())
4466
- }, {
4467
- keys: [['ArrowLeft']],
4468
- callback: () => {
4469
- selection.transformStart(0, -1 * instance.getDirectionFactor());
4470
- }
4471
- }, {
4472
- keys: [['ArrowLeft', 'Control/Meta']],
4473
- captureCtrl: true,
4474
- callback: () => {
4475
- const row = instance.getSelectedRangeLast().highlight.row;
4476
- const column = instance.columnIndexMapper.getNearestNotHiddenIndex(...(instance.isRtl() ? [instance.countCols() - 1, -1] : [0, 1]));
4477
- selection.setRangeStart(instance._createCellCoords(row, column));
4478
- }
4479
- }, {
4480
- keys: [['ArrowLeft', 'Shift']],
4481
- callback: () => {
4482
- selection.transformEnd(0, -1 * instance.getDirectionFactor());
4483
- }
4484
- }, {
4485
- keys: [['ArrowLeft', 'Shift', 'Control/Meta']],
4486
- captureCtrl: true,
4487
- callback: () => {
4488
- const {
4489
- from,
4490
- to
4491
- } = instance.getSelectedRangeLast();
4492
- const column = instance.columnIndexMapper.getNearestNotHiddenIndex(...(instance.isRtl() ? [instance.countCols() - 1, -1] : [0, 1]));
4493
- selection.setRangeStart(from.clone());
4494
- selection.setRangeEnd(instance._createCellCoords(to.row, column));
4495
- },
4496
- runOnlyIf: () => !(instance.selection.isSelectedByCorner() || instance.selection.isSelectedByRowHeader())
4497
- }, {
4498
- keys: [['ArrowRight']],
4499
- callback: () => {
4500
- selection.transformStart(0, instance.getDirectionFactor());
4501
- }
4502
- }, {
4503
- keys: [['ArrowRight', 'Control/Meta']],
4504
- captureCtrl: true,
4505
- callback: () => {
4506
- const row = instance.getSelectedRangeLast().highlight.row;
4507
- const column = instance.columnIndexMapper.getNearestNotHiddenIndex(...(instance.isRtl() ? [0, 1] : [instance.countCols() - 1, -1]));
4508
- selection.setRangeStart(instance._createCellCoords(row, column));
4509
- }
4510
- }, {
4511
- keys: [['ArrowRight', 'Shift']],
4512
- callback: () => {
4513
- selection.transformEnd(0, instance.getDirectionFactor());
4514
- }
4515
- }, {
4516
- keys: [['ArrowRight', 'Shift', 'Control/Meta']],
4517
- captureCtrl: true,
4518
- callback: () => {
4519
- const {
4520
- from,
4521
- to
4522
- } = instance.getSelectedRangeLast();
4523
- const column = instance.columnIndexMapper.getNearestNotHiddenIndex(...(instance.isRtl() ? [0, 1] : [instance.countCols() - 1, -1]));
4524
- selection.setRangeStart(from.clone());
4525
- selection.setRangeEnd(instance._createCellCoords(to.row, column));
4526
- },
4527
- runOnlyIf: () => !(instance.selection.isSelectedByCorner() || instance.selection.isSelectedByRowHeader())
4528
- }, {
4529
- keys: [['Home']],
4530
- captureCtrl: true,
4531
- callback: () => {
4532
- const fixedColumns = parseInt(instance.getSettings().fixedColumnsStart, 10);
4533
- const row = instance.getSelectedRangeLast().highlight.row;
4534
- const column = instance.columnIndexMapper.getNearestNotHiddenIndex(fixedColumns, 1);
4535
- selection.setRangeStart(instance._createCellCoords(row, column));
4536
- },
4537
- runOnlyIf: () => instance.view.isMainTableNotFullyCoveredByOverlays()
4538
- }, {
4539
- keys: [['Home', 'Shift']],
4540
- callback: () => {
4541
- selection.setRangeEnd(instance._createCellCoords(selection.selectedRange.current().from.row, instance.columnIndexMapper.getNearestNotHiddenIndex(0, 1)));
4542
- }
4543
- }, {
4544
- keys: [['Home', 'Control/Meta']],
4545
- captureCtrl: true,
4546
- callback: () => {
4547
- const fixedRows = parseInt(instance.getSettings().fixedRowsTop, 10);
4548
- const fixedColumns = parseInt(instance.getSettings().fixedColumnsStart, 10);
4549
- const row = instance.rowIndexMapper.getNearestNotHiddenIndex(fixedRows, 1);
4550
- const column = instance.columnIndexMapper.getNearestNotHiddenIndex(fixedColumns, 1);
4551
- selection.setRangeStart(instance._createCellCoords(row, column));
4552
- },
4553
- runOnlyIf: () => instance.view.isMainTableNotFullyCoveredByOverlays()
4554
- }, {
4555
- keys: [['End']],
4556
- captureCtrl: true,
4557
- callback: () => {
4558
- selection.setRangeStart(instance._createCellCoords(instance.getSelectedRangeLast().highlight.row, instance.columnIndexMapper.getNearestNotHiddenIndex(instance.countCols() - 1, -1)));
4559
- },
4560
- runOnlyIf: () => instance.view.isMainTableNotFullyCoveredByOverlays()
4561
- }, {
4562
- keys: [['End', 'Shift']],
4563
- callback: () => {
4564
- selection.setRangeEnd(instance._createCellCoords(selection.selectedRange.current().from.row, instance.columnIndexMapper.getNearestNotHiddenIndex(instance.countCols() - 1, -1)));
4565
- }
4566
- }, {
4567
- keys: [['End', 'Control/Meta']],
4568
- captureCtrl: true,
4569
- callback: () => {
4570
- const fixedRows = parseInt(instance.getSettings().fixedRowsBottom, 10);
4571
- const row = instance.rowIndexMapper.getNearestNotHiddenIndex(instance.countRows() - fixedRows - 1, -1);
4572
- const column = instance.columnIndexMapper.getNearestNotHiddenIndex(instance.countCols() - 1, -1);
4573
- selection.setRangeStart(instance._createCellCoords(row, column));
4574
- },
4575
- runOnlyIf: () => instance.view.isMainTableNotFullyCoveredByOverlays()
4576
- }, {
4577
- keys: [['PageUp']],
4578
- callback: () => {
4579
- selection.transformStart(-instance.countVisibleRows(), 0);
4580
- }
4581
- }, {
4582
- keys: [['PageUp', 'Shift']],
4583
- callback: () => {
4584
- const {
4585
- to
4586
- } = instance.getSelectedRangeLast();
4587
- const nextRowIndexToSelect = Math.max(to.row - instance.countVisibleRows(), 0);
4588
- const row = instance.rowIndexMapper.getNearestNotHiddenIndex(nextRowIndexToSelect, 1);
4589
- if (row !== null) {
4590
- const coords = instance._createCellCoords(row, to.col);
4591
- const scrollPadding = to.row - instance.view.getFirstFullyVisibleRow();
4592
- const nextVerticalScroll = Math.max(coords.row - scrollPadding, 0);
4593
- selection.setRangeEnd(coords);
4594
- instance.scrollViewportTo(nextVerticalScroll);
4595
- }
4596
- }
4597
- }, {
4598
- keys: [['PageDown']],
4599
- callback: () => {
4600
- selection.transformStart(instance.countVisibleRows(), 0);
4601
- }
4602
- }, {
4603
- keys: [['PageDown', 'Shift']],
4604
- callback: () => {
4605
- const {
4606
- to
4607
- } = instance.getSelectedRangeLast();
4608
- const nextRowIndexToSelect = Math.min(to.row + instance.countVisibleRows(), instance.countRows() - 1);
4609
- const row = instance.rowIndexMapper.getNearestNotHiddenIndex(nextRowIndexToSelect, -1);
4610
- if (row !== null) {
4611
- const coords = instance._createCellCoords(row, to.col);
4612
- const scrollPadding = to.row - instance.view.getFirstFullyVisibleRow();
4613
- const nextVerticalScroll = Math.min(coords.row - scrollPadding, instance.countRows() - 1);
4614
- selection.setRangeEnd(coords);
4615
- instance.scrollViewportTo(nextVerticalScroll);
4616
- }
4617
- }
4618
- }, {
4619
- keys: [['Tab']],
4620
- callback: event => {
4621
- const tabMoves = typeof tableMeta.tabMoves === 'function' ? tableMeta.tabMoves(event) : tableMeta.tabMoves;
4622
- selection.transformStart(tabMoves.row, tabMoves.col, true);
4623
- }
4624
- }, {
4625
- keys: [['Shift', 'Tab']],
4626
- callback: event => {
4627
- const tabMoves = typeof tableMeta.tabMoves === 'function' ? tableMeta.tabMoves(event) : tableMeta.tabMoves;
4628
- selection.transformStart(-tabMoves.row, -tabMoves.col);
4629
- }
4630
- }], gridConfig);
4631
4597
  getPluginsNames().forEach(pluginName => {
4632
4598
  const PluginClass = getPlugin(pluginName);
4633
4599
  pluginsRegistry.addItem(pluginName, new PluginClass(this));
4634
4600
  });
4601
+ registerAllShortcutContexts(instance);
4602
+ shortcutManager.setActiveContextName('grid');
4635
4603
  Hooks.getSingleton().run(instance, 'construct');
4636
4604
  }