handsontable 0.0.0-next-010265d-20231005 → 0.0.0-next-9379dd1-20231020

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 (414) hide show
  1. package/3rdparty/walkontable/src/cell/coords.d.ts +6 -1
  2. package/3rdparty/walkontable/src/cell/coords.js +50 -11
  3. package/3rdparty/walkontable/src/cell/coords.mjs +50 -11
  4. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  5. package/3rdparty/walkontable/src/cell/range.js +38 -7
  6. package/3rdparty/walkontable/src/cell/range.mjs +38 -7
  7. package/3rdparty/walkontable/src/core/_base.js +9 -3
  8. package/3rdparty/walkontable/src/core/_base.mjs +9 -3
  9. package/3rdparty/walkontable/src/core/clone.js +2 -2
  10. package/3rdparty/walkontable/src/core/clone.mjs +2 -2
  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 +12 -10
  14. package/3rdparty/walkontable/src/event.mjs +12 -10
  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 +13 -2
  20. package/3rdparty/walkontable/src/overlay/_base.mjs +14 -3
  21. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
  22. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
  23. package/3rdparty/walkontable/src/overlay/top.js +2 -6
  24. package/3rdparty/walkontable/src/overlay/top.mjs +2 -6
  25. package/3rdparty/walkontable/src/renderer/cells.js +10 -0
  26. package/3rdparty/walkontable/src/renderer/cells.mjs +11 -1
  27. package/3rdparty/walkontable/src/renderer/columnHeaders.js +10 -0
  28. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +11 -1
  29. package/3rdparty/walkontable/src/renderer/rowHeaders.js +5 -0
  30. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +5 -0
  31. package/3rdparty/walkontable/src/renderer/rows.js +13 -0
  32. package/3rdparty/walkontable/src/renderer/rows.mjs +13 -0
  33. package/3rdparty/walkontable/src/renderer/table.js +9 -0
  34. package/3rdparty/walkontable/src/renderer/table.mjs +9 -0
  35. package/3rdparty/walkontable/src/scroll.js +2 -0
  36. package/3rdparty/walkontable/src/scroll.mjs +2 -0
  37. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +7 -12
  38. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  39. package/3rdparty/walkontable/src/selection/border/constants.js +16 -0
  40. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  41. package/3rdparty/walkontable/src/selection/constants.js +62 -0
  42. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  43. package/3rdparty/walkontable/src/selection/index.js +26 -0
  44. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  45. package/3rdparty/walkontable/src/selection/manager.js +274 -0
  46. package/3rdparty/walkontable/src/selection/manager.mjs +269 -0
  47. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  48. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  49. package/3rdparty/walkontable/src/selection/selection.js +101 -0
  50. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  51. package/3rdparty/walkontable/src/settings.js +13 -4
  52. package/3rdparty/walkontable/src/settings.mjs +13 -4
  53. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
  54. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  55. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
  56. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  57. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
  58. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  59. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
  60. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  61. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
  62. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  63. package/3rdparty/walkontable/src/table.js +19 -78
  64. package/3rdparty/walkontable/src/table.mjs +20 -79
  65. package/base.js +2 -2
  66. package/base.mjs +2 -2
  67. package/cellTypes/dateType/dateType.d.ts +3 -3
  68. package/cellTypes/dateType/dateType.js +2 -2
  69. package/cellTypes/dateType/dateType.mjs +2 -2
  70. package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
  71. package/cellTypes/handsontableType/handsontableType.js +2 -2
  72. package/cellTypes/handsontableType/handsontableType.mjs +2 -2
  73. package/cellTypes/index.d.ts +3 -0
  74. package/cellTypes/index.js +4 -0
  75. package/cellTypes/index.mjs +3 -1
  76. package/cellTypes/selectType/index.d.ts +1 -0
  77. package/cellTypes/selectType/index.js +6 -0
  78. package/cellTypes/selectType/index.mjs +1 -0
  79. package/cellTypes/selectType/selectType.d.ts +14 -0
  80. package/cellTypes/selectType/selectType.js +13 -0
  81. package/cellTypes/selectType/selectType.mjs +8 -0
  82. package/core/focusCatcher/focusDetector.js +63 -0
  83. package/core/focusCatcher/focusDetector.mjs +59 -0
  84. package/core/focusCatcher/index.js +142 -0
  85. package/core/focusCatcher/index.mjs +138 -0
  86. package/core/index.js +9 -0
  87. package/core/index.mjs +1 -0
  88. package/core.d.ts +9 -4
  89. package/core.js +285 -327
  90. package/core.mjs +285 -327
  91. package/dataMap/metaManager/metaSchema.js +65 -0
  92. package/dataMap/metaManager/metaSchema.mjs +65 -0
  93. package/dataMap/metaManager/mods/extendMetaProperties.js +7 -1
  94. package/dataMap/metaManager/mods/extendMetaProperties.mjs +7 -1
  95. package/dataMap/replaceData.js +5 -0
  96. package/dataMap/replaceData.mjs +5 -0
  97. package/dist/handsontable.css +40 -5
  98. package/dist/handsontable.full.css +40 -5
  99. package/dist/handsontable.full.js +11744 -6945
  100. package/dist/handsontable.full.min.css +4 -4
  101. package/dist/handsontable.full.min.js +141 -141
  102. package/dist/handsontable.js +14036 -9237
  103. package/dist/handsontable.min.css +3 -3
  104. package/dist/handsontable.min.js +21 -21
  105. package/dist/languages/all.js +6 -2
  106. package/dist/languages/all.min.js +1 -1
  107. package/dist/languages/en-US.js +3 -1
  108. package/dist/languages/en-US.min.js +1 -1
  109. package/dist/languages/pl-PL.js +3 -1
  110. package/dist/languages/pl-PL.min.js +1 -1
  111. package/editorManager.js +15 -87
  112. package/editorManager.mjs +16 -87
  113. package/editors/autocompleteEditor/autocompleteEditor.js +53 -2
  114. package/editors/autocompleteEditor/autocompleteEditor.mjs +54 -3
  115. package/editors/dateEditor/dateEditor.js +26 -7
  116. package/editors/dateEditor/dateEditor.mjs +27 -8
  117. package/editors/handsontableEditor/handsontableEditor.js +9 -1
  118. package/editors/handsontableEditor/handsontableEditor.mjs +10 -2
  119. package/editors/textEditor/textEditor.js +19 -27
  120. package/editors/textEditor/textEditor.mjs +22 -30
  121. package/focusManager.d.ts +12 -0
  122. package/focusManager.js +265 -0
  123. package/focusManager.mjs +261 -0
  124. package/helpers/a11y.js +79 -0
  125. package/helpers/a11y.mjs +38 -0
  126. package/helpers/dom/element.js +188 -9
  127. package/helpers/dom/element.mjs +182 -9
  128. package/helpers/mixed.js +1 -1
  129. package/helpers/mixed.mjs +1 -1
  130. package/helpers/number.d.ts +1 -0
  131. package/helpers/number.js +18 -0
  132. package/helpers/number.mjs +17 -0
  133. package/i18n/constants.js +7 -1
  134. package/i18n/constants.mjs +4 -1
  135. package/i18n/languages/en-US.js +3 -1
  136. package/i18n/languages/en-US.mjs +3 -1
  137. package/i18n/languages/pl-PL.js +3 -1
  138. package/i18n/languages/pl-PL.mjs +3 -1
  139. package/languages/all.js +6 -2
  140. package/languages/en-US.js +3 -1
  141. package/languages/en-US.mjs +3 -1
  142. package/languages/index.js +6 -2
  143. package/languages/pl-PL.js +3 -1
  144. package/languages/pl-PL.mjs +3 -1
  145. package/package.json +21 -1
  146. package/pluginHooks.d.ts +12 -1
  147. package/pluginHooks.js +152 -1
  148. package/pluginHooks.mjs +152 -1
  149. package/plugins/collapsibleColumns/collapsibleColumns.js +74 -4
  150. package/plugins/collapsibleColumns/collapsibleColumns.mjs +75 -5
  151. package/plugins/columnSorting/columnSorting.js +43 -0
  152. package/plugins/columnSorting/columnSorting.mjs +44 -3
  153. package/plugins/columnSorting/index.js +3 -1
  154. package/plugins/columnSorting/index.mjs +1 -1
  155. package/plugins/comments/commentEditor.js +1 -0
  156. package/plugins/comments/commentEditor.mjs +1 -0
  157. package/plugins/comments/comments.js +252 -189
  158. package/plugins/comments/comments.mjs +251 -190
  159. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  160. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  161. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  162. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  163. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  164. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  165. package/plugins/contextMenu/commandExecutor.js +2 -3
  166. package/plugins/contextMenu/commandExecutor.mjs +2 -3
  167. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  168. package/plugins/contextMenu/contextMenu.js +75 -36
  169. package/plugins/contextMenu/contextMenu.mjs +74 -35
  170. package/plugins/contextMenu/itemsFactory.js +2 -3
  171. package/plugins/contextMenu/itemsFactory.mjs +3 -4
  172. package/plugins/contextMenu/{cursor.mjs → menu/cursor.js} +6 -4
  173. package/plugins/contextMenu/{cursor.js → menu/cursor.mjs} +4 -10
  174. package/plugins/contextMenu/menu/index.js +9 -0
  175. package/plugins/contextMenu/menu/index.mjs +1 -0
  176. package/plugins/contextMenu/{menu.js → menu/menu.js} +96 -308
  177. package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +97 -309
  178. package/plugins/contextMenu/menu/navigator.js +152 -0
  179. package/plugins/contextMenu/menu/navigator.mjs +148 -0
  180. package/plugins/contextMenu/menu/positioner.js +213 -0
  181. package/plugins/contextMenu/menu/positioner.mjs +209 -0
  182. package/plugins/contextMenu/menu/utils.js +177 -0
  183. package/plugins/contextMenu/menu/utils.mjs +163 -0
  184. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  185. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  186. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  187. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  188. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  189. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  190. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  191. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  192. package/plugins/contextMenu/{predefinedItems.js → predefinedItems/index.js} +14 -14
  193. package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
  194. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  195. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  196. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  197. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  198. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  199. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  200. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  201. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  202. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  203. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  204. package/plugins/contextMenu/utils.js +35 -151
  205. package/plugins/contextMenu/utils.mjs +35 -144
  206. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  207. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  208. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  209. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  210. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  211. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  212. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  213. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  214. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  215. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  216. package/plugins/copyPaste/copyPaste.js +127 -78
  217. package/plugins/copyPaste/copyPaste.mjs +128 -79
  218. package/plugins/customBorders/customBorders.js +23 -20
  219. package/plugins/customBorders/customBorders.mjs +24 -21
  220. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  221. package/plugins/dropdownMenu/dropdownMenu.js +97 -38
  222. package/plugins/dropdownMenu/dropdownMenu.mjs +96 -37
  223. package/plugins/filters/constants.mjs +1 -1
  224. package/plugins/filters/filters.js +31 -14
  225. package/plugins/filters/filters.mjs +31 -14
  226. package/plugins/filters/ui/select.js +3 -3
  227. package/plugins/filters/ui/select.mjs +2 -2
  228. package/plugins/hiddenColumns/hiddenColumns.mjs +1 -1
  229. package/plugins/hiddenRows/hiddenRows.mjs +1 -1
  230. package/plugins/manualColumnMove/manualColumnMove.js +3 -1
  231. package/plugins/manualColumnMove/manualColumnMove.mjs +3 -1
  232. package/plugins/mergeCells/mergeCells.js +5 -16
  233. package/plugins/mergeCells/mergeCells.mjs +5 -16
  234. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  235. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  236. package/plugins/nestedHeaders/nestedHeaders.js +240 -10
  237. package/plugins/nestedHeaders/nestedHeaders.mjs +241 -11
  238. package/plugins/nestedHeaders/stateManager/index.js +102 -3
  239. package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
  240. package/plugins/nestedRows/nestedRows.js +41 -0
  241. package/plugins/nestedRows/nestedRows.mjs +41 -0
  242. package/plugins/nestedRows/ui/headers.js +11 -0
  243. package/plugins/nestedRows/ui/headers.mjs +12 -1
  244. package/renderers/autocompleteRenderer/autocompleteRenderer.js +8 -0
  245. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
  246. package/renderers/baseRenderer/baseRenderer.js +17 -0
  247. package/renderers/baseRenderer/baseRenderer.mjs +18 -1
  248. package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
  249. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  250. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  251. package/renderers/dateRenderer/dateRenderer.js +29 -0
  252. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  253. package/renderers/dateRenderer/index.d.ts +1 -0
  254. package/renderers/dateRenderer/index.js +6 -0
  255. package/renderers/dateRenderer/index.mjs +1 -0
  256. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  257. package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
  258. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  259. package/renderers/handsontableRenderer/index.d.ts +1 -0
  260. package/renderers/handsontableRenderer/index.js +6 -0
  261. package/renderers/handsontableRenderer/index.mjs +1 -0
  262. package/renderers/index.d.ts +9 -0
  263. package/renderers/selectRenderer/index.d.ts +1 -0
  264. package/renderers/selectRenderer/index.js +6 -0
  265. package/renderers/selectRenderer/index.mjs +1 -0
  266. package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
  267. package/renderers/selectRenderer/selectRenderer.js +27 -0
  268. package/renderers/selectRenderer/selectRenderer.mjs +22 -0
  269. package/selection/highlight/highlight.js +256 -71
  270. package/selection/highlight/highlight.mjs +250 -71
  271. package/selection/highlight/types/activeHeader.js +10 -8
  272. package/selection/highlight/types/activeHeader.mjs +10 -8
  273. package/selection/highlight/types/area.js +6 -18
  274. package/selection/highlight/types/area.mjs +6 -18
  275. package/selection/highlight/types/areaLayered.js +31 -0
  276. package/selection/highlight/types/areaLayered.mjs +26 -0
  277. package/selection/highlight/types/column.js +27 -0
  278. package/selection/highlight/types/column.mjs +22 -0
  279. package/selection/highlight/types/customSelection.js +7 -9
  280. package/selection/highlight/types/customSelection.mjs +7 -9
  281. package/selection/highlight/types/fill.js +5 -7
  282. package/selection/highlight/types/fill.mjs +5 -7
  283. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  284. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  285. package/selection/highlight/types/header.js +9 -18
  286. package/selection/highlight/types/header.mjs +9 -18
  287. package/selection/highlight/types/row.js +27 -0
  288. package/selection/highlight/types/row.mjs +22 -0
  289. package/selection/highlight/visualSelection.js +31 -27
  290. package/selection/highlight/visualSelection.mjs +31 -27
  291. package/selection/index.js +4 -7
  292. package/selection/index.mjs +2 -3
  293. package/selection/mouseEventHandler.js +7 -1
  294. package/selection/mouseEventHandler.mjs +7 -1
  295. package/selection/range.js +8 -8
  296. package/selection/range.mjs +8 -8
  297. package/selection/selection.js +321 -152
  298. package/selection/selection.mjs +318 -151
  299. package/selection/transformation.js +232 -90
  300. package/selection/transformation.mjs +232 -90
  301. package/selection/utils.js +15 -21
  302. package/selection/utils.mjs +16 -21
  303. package/settings.d.ts +4 -0
  304. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  305. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  306. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  307. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  308. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  309. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  310. package/shortcutContexts/commands/editor/index.js +16 -0
  311. package/shortcutContexts/commands/editor/index.mjs +12 -0
  312. package/shortcutContexts/commands/editor/open.js +27 -0
  313. package/shortcutContexts/commands/editor/open.mjs +23 -0
  314. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  315. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  316. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  317. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  318. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +25 -0
  319. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
  320. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  321. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  322. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  323. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  324. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  325. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  326. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  327. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  328. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  329. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  330. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  331. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  332. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  333. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  334. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  335. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  336. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  337. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  338. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  339. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  340. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  341. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  342. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  343. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  344. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +25 -0
  345. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
  346. package/shortcutContexts/commands/index.js +35 -0
  347. package/shortcutContexts/commands/index.mjs +31 -0
  348. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  349. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  350. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +33 -0
  351. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
  352. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  353. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  354. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  355. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  356. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  357. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  358. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  359. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  360. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  361. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  362. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  363. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  364. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  365. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  366. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  367. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  368. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  369. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  370. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  371. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  372. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  373. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  374. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  375. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  376. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  377. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  378. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  379. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  380. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +33 -0
  381. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
  382. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  383. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  384. package/shortcutContexts/commands/scrollToFocusedCell.js +35 -0
  385. package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
  386. package/shortcutContexts/commands/selectAll.js +12 -0
  387. package/shortcutContexts/commands/selectAll.mjs +8 -0
  388. package/shortcutContexts/constants.js +13 -0
  389. package/shortcutContexts/constants.mjs +8 -0
  390. package/shortcutContexts/editor.js +25 -0
  391. package/shortcutContexts/editor.mjs +21 -0
  392. package/shortcutContexts/grid.js +163 -0
  393. package/shortcutContexts/grid.mjs +159 -0
  394. package/shortcutContexts/index.js +24 -0
  395. package/shortcutContexts/index.mjs +11 -0
  396. package/shortcuts/context.js +20 -2
  397. package/shortcuts/context.mjs +20 -3
  398. package/shortcuts/manager.js +25 -7
  399. package/shortcuts/manager.mjs +26 -7
  400. package/shortcuts/recorder.js +3 -3
  401. package/shortcuts/recorder.mjs +3 -3
  402. package/shortcuts/utils.js +19 -5
  403. package/shortcuts/utils.mjs +18 -4
  404. package/tableView.js +111 -13
  405. package/tableView.mjs +112 -14
  406. package/3rdparty/walkontable/src/selection.js +0 -295
  407. package/3rdparty/walkontable/src/selection.mjs +0 -290
  408. package/plugins/contextMenu/predefinedItems.mjs +0 -68
  409. package/plugins/copyPaste/focusableElement.js +0 -186
  410. package/plugins/copyPaste/focusableElement.mjs +0 -180
  411. package/selection/highlight/constants.js +0 -15
  412. package/selection/highlight/constants.mjs +0 -6
  413. package/selection/highlight/types/index.js +0 -35
  414. package/selection/highlight/types/index.mjs +0 -31
@@ -11,9 +11,9 @@ function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classEx
11
11
  function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
12
12
  function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
13
13
  import { addClass, removeClass } from "../../helpers/dom/element.mjs";
14
- import { isNumeric } from "../../helpers/number.mjs";
15
- import { isLeftClick, isRightClick } from "../../helpers/dom/event.mjs";
14
+ import { isNumeric, clamp } from "../../helpers/number.mjs";
16
15
  import { toSingleLine } from "../../helpers/templateLiteralTag.mjs";
16
+ import { isLeftClick, isRightClick } from "../../helpers/dom/event.mjs";
17
17
  import { warn } from "../../helpers/console.mjs";
18
18
  import { ACTIVE_HEADER_TYPE, HEADER_TYPE } from "../../selection/index.mjs";
19
19
  import { BasePlugin } from "../base/index.mjs";
@@ -69,13 +69,14 @@ export const PLUGIN_PRIORITY = 280;
69
69
  */
70
70
  var _stateManager = /*#__PURE__*/new WeakMap();
71
71
  var _hidingIndexMapObserver = /*#__PURE__*/new WeakMap();
72
+ var _focusInitialCoords = /*#__PURE__*/new WeakMap();
73
+ var _isColumnsSelectionInProgress = /*#__PURE__*/new WeakMap();
72
74
  export class NestedHeaders extends BasePlugin {
73
75
  constructor() {
74
76
  super(...arguments);
75
77
  /**
76
78
  * The state manager for the nested headers.
77
79
  *
78
- * @private
79
80
  * @type {StateManager}
80
81
  */
81
82
  _classPrivateFieldInitSpec(this, _stateManager, {
@@ -86,13 +87,30 @@ export class NestedHeaders extends BasePlugin {
86
87
  * The instance of the ChangesObservable class that allows track the changes that happens in the
87
88
  * column indexes.
88
89
  *
89
- * @private
90
90
  * @type {ChangesObservable}
91
91
  */
92
92
  _classPrivateFieldInitSpec(this, _hidingIndexMapObserver, {
93
93
  writable: true,
94
94
  value: null
95
95
  });
96
+ /**
97
+ * Holds the coords that points to the place where the column selection starts.
98
+ *
99
+ * @type {number|null}
100
+ */
101
+ _classPrivateFieldInitSpec(this, _focusInitialCoords, {
102
+ writable: true,
103
+ value: null
104
+ });
105
+ /**
106
+ * Determines if there is performed the column selection.
107
+ *
108
+ * @type {boolean}
109
+ */
110
+ _classPrivateFieldInitSpec(this, _isColumnsSelectionInProgress, {
111
+ writable: true,
112
+ value: false
113
+ });
96
114
  /**
97
115
  * Custom helper for getting widths of the nested headers.
98
116
  *
@@ -152,6 +170,19 @@ export class NestedHeaders extends BasePlugin {
152
170
  this.addHook('beforeOnCellMouseOver', function () {
153
171
  return _this.onBeforeOnCellMouseOver(...arguments);
154
172
  });
173
+ this.addHook('beforeOnCellMouseUp', function () {
174
+ return _this.onBeforeOnCellMouseUp(...arguments);
175
+ });
176
+ this.addHook('beforeSelectionHighlightSet', function () {
177
+ return _this.onBeforeSelectionHighlightSet(...arguments);
178
+ });
179
+ this.addHook('modifyTransformStart', function () {
180
+ return _this.onModifyTransformStart(...arguments);
181
+ });
182
+ this.addHook('afterSelection', () => this.updateFocusHighlightPosition());
183
+ this.addHook('beforeViewportScrollHorizontally', function () {
184
+ return _this.onBeforeViewportScrollHorizontally(...arguments);
185
+ });
155
186
  this.addHook('afterGetColumnHeaderRenderers', array => this.onAfterGetColumnHeaderRenderers(array));
156
187
  this.addHook('modifyColWidth', function () {
157
188
  return _this.onModifyColWidth(...arguments);
@@ -165,9 +196,17 @@ export class NestedHeaders extends BasePlugin {
165
196
  this.addHook('beforeCopy', function () {
166
197
  return _this.onBeforeCopy(...arguments);
167
198
  });
199
+ this.addHook('beforeSelectColumns', function () {
200
+ return _this.onBeforeSelectColumns(...arguments);
201
+ });
168
202
  this.addHook('afterViewportColumnCalculatorOverride', function () {
169
203
  return _this.onAfterViewportColumnCalculatorOverride(...arguments);
170
204
  });
205
+ this.addHook('modifyFocusedElement', function () {
206
+ return _this.onModifyFocusedElement(...arguments);
207
+ });
208
+ this.hot.columnIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
209
+ this.hot.rowIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
171
210
  super.enablePlugin();
172
211
  this.updatePlugin(); // @TODO: Workaround for broken plugin initialization abstraction.
173
212
  }
@@ -383,6 +422,67 @@ export class NestedHeaders extends BasePlugin {
383
422
  return this.hot.getColHeader(visualColumnIndex, headerLevel);
384
423
  }
385
424
 
425
+ /**
426
+ * Updates the selection focus highlight position to point to the nested header root element (TH)
427
+ * even when the logical coordinates point in-between the header.
428
+ *
429
+ * @private
430
+ */
431
+ updateFocusHighlightPosition() {
432
+ var _this$hot;
433
+ const selection = (_this$hot = this.hot) === null || _this$hot === void 0 ? void 0 : _this$hot.getSelectedRangeLast();
434
+ if (!selection) {
435
+ return;
436
+ }
437
+ const {
438
+ highlight
439
+ } = selection;
440
+ const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
441
+ if (isNestedHeadersRange) {
442
+ const columnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
443
+ const focusHighlight = this.hot.selection.highlight.getFocus();
444
+
445
+ // Correct the highlight/focus selection to highlight the correct TH element
446
+ focusHighlight.visualCellRange.highlight.col = columnIndex;
447
+ focusHighlight.visualCellRange.from.col = columnIndex;
448
+ focusHighlight.visualCellRange.to.col = columnIndex;
449
+ focusHighlight.commit();
450
+ }
451
+ }
452
+
453
+ /**
454
+ * Allows to control to which column index the viewport will be scrolled. To ensure that the viewport
455
+ * is scrolled to the correct column for the nested header the most left and the most right visual column
456
+ * indexes are used.
457
+ *
458
+ * @private
459
+ * @param {number} visualColumn A visual column index to which the viewport will be scrolled.
460
+ * @returns {number}
461
+ */
462
+ onBeforeViewportScrollHorizontally(visualColumn) {
463
+ const selection = this.hot.getSelectedRangeLast();
464
+ if (!selection) {
465
+ return visualColumn;
466
+ }
467
+ const {
468
+ highlight
469
+ } = selection;
470
+ const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
471
+ if (!isNestedHeadersRange) {
472
+ return visualColumn;
473
+ }
474
+ const firstColumn = this.hot.view.getFirstFullyVisibleColumn();
475
+ const lastColumn = this.hot.view.getLastFullyVisibleColumn();
476
+ const mostLeftColumnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
477
+ const mostRightColumnIndex = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(highlight.row, highlight.col);
478
+
479
+ // do not scroll the viewport when the header is wider than the viewport
480
+ if (mostLeftColumnIndex < firstColumn && mostRightColumnIndex > lastColumn) {
481
+ return visualColumn;
482
+ }
483
+ return mostLeftColumnIndex < firstColumn ? mostLeftColumnIndex : mostRightColumnIndex;
484
+ }
485
+
386
486
  /**
387
487
  * Allows to control which header DOM element will be used to highlight.
388
488
  *
@@ -398,7 +498,6 @@ export class NestedHeaders extends BasePlugin {
398
498
  return visualColumn;
399
499
  }
400
500
  const {
401
- classNames,
402
501
  columnCursor,
403
502
  selectionType,
404
503
  selectionWidth
@@ -413,8 +512,8 @@ export class NestedHeaders extends BasePlugin {
413
512
  }
414
513
  } else if (selectionType === ACTIVE_HEADER_TYPE) {
415
514
  if (colspan > selectionWidth - columnCursor || !isRoot) {
416
- // Reset the class names array so the generated TH element won't be modified.
417
- classNames.length = 0;
515
+ // Prevents adding any CSS class names to the TH element
516
+ return null;
418
517
  }
419
518
  }
420
519
  return visualColumn;
@@ -502,6 +601,8 @@ export class NestedHeaders extends BasePlugin {
502
601
  if (!headerNodeData) {
503
602
  return;
504
603
  }
604
+ _classPrivateFieldSet(this, _focusInitialCoords, coords.clone());
605
+ _classPrivateFieldSet(this, _isColumnsSelectionInProgress, true);
505
606
  const {
506
607
  selection
507
608
  } = this.hot;
@@ -567,14 +668,129 @@ export class NestedHeaders extends BasePlugin {
567
668
  controller.column = true;
568
669
  controller.cell = true;
569
670
  const columnsToSelect = [];
671
+ const headerLevel = clamp(coords.row, -Infinity, -1);
570
672
  if (coords.col < from.col) {
571
- columnsToSelect.push(bottomEndCoords.col, columnIndex);
673
+ columnsToSelect.push(bottomEndCoords.col, columnIndex, headerLevel);
572
674
  } else if (coords.col > from.col) {
573
- columnsToSelect.push(topStartCoords.col, columnIndex + origColspan - 1);
675
+ columnsToSelect.push(topStartCoords.col, columnIndex + origColspan - 1, headerLevel);
574
676
  } else {
575
- columnsToSelect.push(columnIndex, columnIndex + origColspan - 1);
677
+ columnsToSelect.push(columnIndex, columnIndex + origColspan - 1, headerLevel);
678
+ }
679
+ this.hot.selection.selectColumns(...columnsToSelect);
680
+ }
681
+
682
+ /**
683
+ * Switches internal flag about selection progress to `false`.
684
+ *
685
+ * @private
686
+ */
687
+ onBeforeOnCellMouseUp() {
688
+ _classPrivateFieldSet(this, _isColumnsSelectionInProgress, false);
689
+ }
690
+
691
+ /**
692
+ * The hook checks and ensures that the focus position that depends on the selected columns
693
+ * range is always positioned within the range.
694
+ *
695
+ * @private
696
+ */
697
+ onBeforeSelectionHighlightSet() {
698
+ const {
699
+ navigableHeaders
700
+ } = this.hot.getSettings();
701
+ if (!this.hot.view.isMouseDown() || !_classPrivateFieldGet(this, _isColumnsSelectionInProgress) || !navigableHeaders) {
702
+ return;
703
+ }
704
+ const selectedRange = this.hot.getSelectedRangeLast();
705
+ const columnStart = selectedRange.getTopStartCorner().col;
706
+ const columnEnd = selectedRange.getBottomEndCorner().col;
707
+ const {
708
+ columnIndex,
709
+ origColspan
710
+ } = _classPrivateFieldGet(this, _stateManager).getHeaderTreeNodeData(_classPrivateFieldGet(this, _focusInitialCoords).row, _classPrivateFieldGet(this, _focusInitialCoords).col);
711
+ selectedRange.setHighlight(_classPrivateFieldGet(this, _focusInitialCoords));
712
+ if (origColspan > selectedRange.getWidth() || columnIndex < columnStart || columnIndex + origColspan - 1 > columnEnd) {
713
+ const headerLevel = _classPrivateFieldGet(this, _stateManager).findTopMostEntireHeaderLevel(clamp(columnStart, columnIndex, columnIndex + origColspan - 1), clamp(columnEnd, columnIndex, columnIndex + origColspan - 1));
714
+ selectedRange.highlight.row = headerLevel;
715
+ selectedRange.highlight.col = selectedRange.from.col;
716
+ }
717
+ }
718
+
719
+ /**
720
+ * `modifyTransformStart` hook is called every time the keyboard navigation is used.
721
+ *
722
+ * @private
723
+ * @param {object} delta The transformation delta.
724
+ */
725
+ onModifyTransformStart(delta) {
726
+ const {
727
+ highlight
728
+ } = this.hot.getSelectedRangeLast();
729
+ const nextCoords = this.hot._createCellCoords(highlight.row + delta.row, highlight.col + delta.col);
730
+ const isNestedHeadersRange = nextCoords.isHeader() && nextCoords.col >= 0;
731
+ if (!isNestedHeadersRange) {
732
+ return;
733
+ }
734
+ const visualColumnIndexStart = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(nextCoords.row, nextCoords.col);
735
+ const visualColumnIndexEnd = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(nextCoords.row, nextCoords.col);
736
+ if (delta.col < 0) {
737
+ const nextColumn = highlight.col >= visualColumnIndexStart && highlight.col <= visualColumnIndexEnd ? visualColumnIndexStart - 1 : visualColumnIndexEnd;
738
+ const notHiddenColumnIndex = this.hot.columnIndexMapper.getNearestNotHiddenIndex(nextColumn, -1);
739
+ if (notHiddenColumnIndex === null) {
740
+ // There are no visible columns anymore, so move the selection out of the table edge. This will
741
+ // be processed by the selection Transformer class as a move selection to the previous row (if autoWrapRow is enabled).
742
+ delta.col = -this.hot.view.countRenderableColumnsInRange(0, highlight.col);
743
+ } else {
744
+ delta.col = -Math.max(this.hot.view.countRenderableColumnsInRange(notHiddenColumnIndex, highlight.col) - 1, 1);
745
+ }
746
+ } else if (delta.col > 0) {
747
+ const nextColumn = highlight.col >= visualColumnIndexStart && highlight.col <= visualColumnIndexEnd ? visualColumnIndexEnd + 1 : visualColumnIndexStart;
748
+ const notHiddenColumnIndex = this.hot.columnIndexMapper.getNearestNotHiddenIndex(nextColumn, 1);
749
+ if (notHiddenColumnIndex === null) {
750
+ // There are no visible columns anymore, so move the selection out of the table edge. This will
751
+ // be processed by the selection Transformer class as a move selection to the next row (if autoWrapRow is enabled).
752
+ delta.col = this.hot.view.countRenderableColumnsInRange(highlight.col, this.hot.countCols());
753
+ } else {
754
+ delta.col = Math.max(this.hot.view.countRenderableColumnsInRange(highlight.col, notHiddenColumnIndex) - 1, 1);
755
+ }
756
+ }
757
+ }
758
+
759
+ /**
760
+ * The hook observes the column selection from the Selection API and modifies the column range to
761
+ * ensure that the whole nested column will be covered.
762
+ *
763
+ * @private
764
+ * @param {CellCoords} from The coords object where the selection starts.
765
+ * @param {CellCoords} to The coords object where the selection ends.
766
+ */
767
+ onBeforeSelectColumns(from, to) {
768
+ const headerLevel = from.row;
769
+ const startNodeData = this._getHeaderTreeNodeDataByCoords({
770
+ row: headerLevel,
771
+ col: from.col
772
+ });
773
+ const endNodeData = this._getHeaderTreeNodeDataByCoords({
774
+ row: headerLevel,
775
+ col: to.col
776
+ });
777
+ if (to.col < from.col) {
778
+ // Column selection from right to left
779
+ if (startNodeData) {
780
+ from.col = startNodeData.columnIndex + startNodeData.origColspan - 1;
781
+ }
782
+ if (endNodeData) {
783
+ to.col = endNodeData.columnIndex;
784
+ }
785
+ } else if (to.col >= from.col) {
786
+ // Column selection from left to right or a single column selection
787
+ if (startNodeData) {
788
+ from.col = startNodeData.columnIndex;
789
+ }
790
+ if (endNodeData) {
791
+ to.col = endNodeData.columnIndex + endNodeData.origColspan - 1;
792
+ }
576
793
  }
577
- this.hot.selectColumns(...columnsToSelect);
578
794
  }
579
795
 
580
796
  /**
@@ -659,6 +875,20 @@ export class NestedHeaders extends BasePlugin {
659
875
  return label;
660
876
  }
661
877
 
878
+ /**
879
+ * `modifyFocusedElement` hook callback.
880
+ *
881
+ * @private
882
+ * @param {number} row Row index.
883
+ * @param {number} column Column index.
884
+ * @returns {HTMLTableCellElement} The `TH` element to be focused.
885
+ */
886
+ onModifyFocusedElement(row, column) {
887
+ if (row < 0) {
888
+ return this.hot.getCell(row, _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(row, column), true);
889
+ }
890
+ }
891
+
662
892
  /**
663
893
  * Updates the plugin state after HoT initialization.
664
894
  *
@@ -8,6 +8,7 @@ var _sourceSettings2 = _interopRequireDefault(require("./sourceSettings"));
8
8
  var _headersTree2 = _interopRequireDefault(require("./headersTree"));
9
9
  var _nodeModifiers = require("./nodeModifiers");
10
10
  var _matrixGenerator = require("./matrixGenerator");
11
+ var _tree = require("../../../utils/dataStructures/tree");
11
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
13
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
13
14
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
@@ -317,6 +318,23 @@ class StateManager {
317
318
  * @returns {object|null}
318
319
  */
319
320
  getHeaderTreeNodeData(headerLevel, columnIndex) {
321
+ const node = this.getHeaderTreeNode(headerLevel, columnIndex);
322
+ if (!node) {
323
+ return null;
324
+ }
325
+ return {
326
+ ...node.data
327
+ };
328
+ }
329
+
330
+ /**
331
+ * Gets tree node that is connected to the column header.
332
+ *
333
+ * @param {number} headerLevel Header level (there is support for negative and positive values).
334
+ * @param {number} columnIndex A visual column index.
335
+ * @returns {TreeNode|null}
336
+ */
337
+ getHeaderTreeNode(headerLevel, columnIndex) {
320
338
  if (headerLevel < 0) {
321
339
  headerLevel = this.rowCoordsToLevel(headerLevel);
322
340
  }
@@ -327,9 +345,53 @@ class StateManager {
327
345
  if (!node) {
328
346
  return null;
329
347
  }
330
- return {
331
- ...node.data
332
- };
348
+ return node;
349
+ }
350
+
351
+ /**
352
+ * Finds the most top header level of the column header that is rendered entirely within
353
+ * the passed visual columns range. If multiple columns headers are found within the range the
354
+ * most top header level value will be returned.
355
+ *
356
+ * @param {number} columnIndexFrom A visual column index.
357
+ * @param {number} [columnIndexTo] A visual column index.
358
+ * @returns {number} Returns a header level in format -1 to -N.
359
+ */
360
+ findTopMostEntireHeaderLevel(columnIndexFrom) {
361
+ var _headerLevel;
362
+ let columnIndexTo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : columnIndexFrom;
363
+ const columnsWidth = columnIndexTo - columnIndexFrom + 1;
364
+ let atLeastOneRootFound = false;
365
+ let headerLevel = null;
366
+ for (let columnIndex = columnIndexFrom; columnIndex <= columnIndexTo; columnIndex++) {
367
+ const rootNode = _classPrivateFieldGet(this, _headersTree).getRootByColumn(columnIndex);
368
+ if (!rootNode) {
369
+ break;
370
+ }
371
+ atLeastOneRootFound = true;
372
+
373
+ // eslint-disable-next-line
374
+ rootNode.walkDown(node => {
375
+ const {
376
+ columnIndex: nodeColumnIndex,
377
+ headerLevel: nodeHeaderLevel,
378
+ origColspan,
379
+ isHidden
380
+ } = node.data;
381
+ if (isHidden) {
382
+ return;
383
+ }
384
+
385
+ // if the header fits entirely within the columns range get and save the node header level
386
+ if (origColspan <= columnsWidth && nodeColumnIndex >= columnIndexFrom && nodeColumnIndex + origColspan - 1 <= columnIndexTo && (headerLevel === null || nodeHeaderLevel < headerLevel)) {
387
+ headerLevel = nodeHeaderLevel;
388
+ }
389
+ }, _tree.TRAVERSAL_DF_PRE);
390
+ }
391
+ if (atLeastOneRootFound && headerLevel === null) {
392
+ return -1;
393
+ }
394
+ return this.levelToRowCoords((_headerLevel = headerLevel) !== null && _headerLevel !== void 0 ? _headerLevel : 0);
333
395
  }
334
396
 
335
397
  /**
@@ -367,6 +429,43 @@ class StateManager {
367
429
  return stepBackColumn;
368
430
  }
369
431
 
432
+ /**
433
+ * The method is helpful in cases where the column index targets in-between currently
434
+ * collapsed column. In that case, the method returns the right-most column index
435
+ * where the nested header ends.
436
+ *
437
+ * @param {number} headerLevel Header level (there is support for negative and positive values).
438
+ * @param {number} columnIndex A visual column index.
439
+ * @returns {number}
440
+ */
441
+ findRightMostColumnIndex(headerLevel, columnIndex) {
442
+ var _this$getHeaderSettin3;
443
+ const {
444
+ isRoot,
445
+ origColspan
446
+ } = (_this$getHeaderSettin3 = this.getHeaderSettings(headerLevel, columnIndex)) !== null && _this$getHeaderSettin3 !== void 0 ? _this$getHeaderSettin3 : {
447
+ isRoot: true,
448
+ origColspan: 1
449
+ };
450
+ if (isRoot) {
451
+ return columnIndex + origColspan - 1;
452
+ }
453
+ let stepForthColumn = columnIndex + 1;
454
+ while (stepForthColumn < this.getColumnsCount()) {
455
+ var _this$getHeaderSettin4;
456
+ const {
457
+ isRoot: isRootNode
458
+ } = (_this$getHeaderSettin4 = this.getHeaderSettings(headerLevel, stepForthColumn)) !== null && _this$getHeaderSettin4 !== void 0 ? _this$getHeaderSettin4 : {
459
+ isRoot: true
460
+ };
461
+ if (isRootNode) {
462
+ break;
463
+ }
464
+ stepForthColumn += 1;
465
+ }
466
+ return stepForthColumn - 1;
467
+ }
468
+
370
469
  /**
371
470
  * Gets a total number of headers levels.
372
471
  *
@@ -12,6 +12,7 @@ import SourceSettings from "./sourceSettings.mjs";
12
12
  import HeadersTree from "./headersTree.mjs";
13
13
  import { triggerNodeModification } from "./nodeModifiers/index.mjs";
14
14
  import { generateMatrix } from "./matrixGenerator.mjs";
15
+ import { TRAVERSAL_DF_PRE } from "../../../utils/dataStructures/tree.mjs";
15
16
  /**
16
17
  * The state manager is a source of truth for nested headers configuration.
17
18
  * The state generation process is divided into three stages.
@@ -313,6 +314,23 @@ export default class StateManager {
313
314
  * @returns {object|null}
314
315
  */
315
316
  getHeaderTreeNodeData(headerLevel, columnIndex) {
317
+ const node = this.getHeaderTreeNode(headerLevel, columnIndex);
318
+ if (!node) {
319
+ return null;
320
+ }
321
+ return {
322
+ ...node.data
323
+ };
324
+ }
325
+
326
+ /**
327
+ * Gets tree node that is connected to the column header.
328
+ *
329
+ * @param {number} headerLevel Header level (there is support for negative and positive values).
330
+ * @param {number} columnIndex A visual column index.
331
+ * @returns {TreeNode|null}
332
+ */
333
+ getHeaderTreeNode(headerLevel, columnIndex) {
316
334
  if (headerLevel < 0) {
317
335
  headerLevel = this.rowCoordsToLevel(headerLevel);
318
336
  }
@@ -323,9 +341,53 @@ export default class StateManager {
323
341
  if (!node) {
324
342
  return null;
325
343
  }
326
- return {
327
- ...node.data
328
- };
344
+ return node;
345
+ }
346
+
347
+ /**
348
+ * Finds the most top header level of the column header that is rendered entirely within
349
+ * the passed visual columns range. If multiple columns headers are found within the range the
350
+ * most top header level value will be returned.
351
+ *
352
+ * @param {number} columnIndexFrom A visual column index.
353
+ * @param {number} [columnIndexTo] A visual column index.
354
+ * @returns {number} Returns a header level in format -1 to -N.
355
+ */
356
+ findTopMostEntireHeaderLevel(columnIndexFrom) {
357
+ var _headerLevel;
358
+ let columnIndexTo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : columnIndexFrom;
359
+ const columnsWidth = columnIndexTo - columnIndexFrom + 1;
360
+ let atLeastOneRootFound = false;
361
+ let headerLevel = null;
362
+ for (let columnIndex = columnIndexFrom; columnIndex <= columnIndexTo; columnIndex++) {
363
+ const rootNode = _classPrivateFieldGet(this, _headersTree).getRootByColumn(columnIndex);
364
+ if (!rootNode) {
365
+ break;
366
+ }
367
+ atLeastOneRootFound = true;
368
+
369
+ // eslint-disable-next-line
370
+ rootNode.walkDown(node => {
371
+ const {
372
+ columnIndex: nodeColumnIndex,
373
+ headerLevel: nodeHeaderLevel,
374
+ origColspan,
375
+ isHidden
376
+ } = node.data;
377
+ if (isHidden) {
378
+ return;
379
+ }
380
+
381
+ // if the header fits entirely within the columns range get and save the node header level
382
+ if (origColspan <= columnsWidth && nodeColumnIndex >= columnIndexFrom && nodeColumnIndex + origColspan - 1 <= columnIndexTo && (headerLevel === null || nodeHeaderLevel < headerLevel)) {
383
+ headerLevel = nodeHeaderLevel;
384
+ }
385
+ }, TRAVERSAL_DF_PRE);
386
+ }
387
+ if (atLeastOneRootFound && headerLevel === null) {
388
+ return -1;
389
+ }
390
+ return this.levelToRowCoords((_headerLevel = headerLevel) !== null && _headerLevel !== void 0 ? _headerLevel : 0);
329
391
  }
330
392
 
331
393
  /**
@@ -363,6 +425,43 @@ export default class StateManager {
363
425
  return stepBackColumn;
364
426
  }
365
427
 
428
+ /**
429
+ * The method is helpful in cases where the column index targets in-between currently
430
+ * collapsed column. In that case, the method returns the right-most column index
431
+ * where the nested header ends.
432
+ *
433
+ * @param {number} headerLevel Header level (there is support for negative and positive values).
434
+ * @param {number} columnIndex A visual column index.
435
+ * @returns {number}
436
+ */
437
+ findRightMostColumnIndex(headerLevel, columnIndex) {
438
+ var _this$getHeaderSettin3;
439
+ const {
440
+ isRoot,
441
+ origColspan
442
+ } = (_this$getHeaderSettin3 = this.getHeaderSettings(headerLevel, columnIndex)) !== null && _this$getHeaderSettin3 !== void 0 ? _this$getHeaderSettin3 : {
443
+ isRoot: true,
444
+ origColspan: 1
445
+ };
446
+ if (isRoot) {
447
+ return columnIndex + origColspan - 1;
448
+ }
449
+ let stepForthColumn = columnIndex + 1;
450
+ while (stepForthColumn < this.getColumnsCount()) {
451
+ var _this$getHeaderSettin4;
452
+ const {
453
+ isRoot: isRootNode
454
+ } = (_this$getHeaderSettin4 = this.getHeaderSettings(headerLevel, stepForthColumn)) !== null && _this$getHeaderSettin4 !== void 0 ? _this$getHeaderSettin4 : {
455
+ isRoot: true
456
+ };
457
+ if (isRootNode) {
458
+ break;
459
+ }
460
+ stepForthColumn += 1;
461
+ }
462
+ return stepForthColumn - 1;
463
+ }
464
+
366
465
  /**
367
466
  * Gets a total number of headers levels.
368
467
  *
@@ -16,6 +16,7 @@ const PLUGIN_KEY = 'nestedRows';
16
16
  exports.PLUGIN_KEY = PLUGIN_KEY;
17
17
  const PLUGIN_PRIORITY = 300;
18
18
  exports.PLUGIN_PRIORITY = PLUGIN_PRIORITY;
19
+ const SHORTCUTS_GROUP = PLUGIN_KEY;
19
20
  const privatePool = new WeakMap();
20
21
 
21
22
  /* eslint-disable jsdoc/require-description-complete-sentence */
@@ -150,6 +151,7 @@ class NestedRows extends _base.BasePlugin {
150
151
  });
151
152
  this.addHook('beforeLoadData', data => this.onBeforeLoadData(data));
152
153
  this.addHook('beforeUpdateData', data => this.onBeforeLoadData(data));
154
+ this.registerShortcuts();
153
155
  super.enablePlugin();
154
156
  }
155
157
 
@@ -158,6 +160,7 @@ class NestedRows extends _base.BasePlugin {
158
160
  */
159
161
  disablePlugin() {
160
162
  this.hot.rowIndexMapper.unregisterMap('nestedRows');
163
+ this.unregisterShortcuts();
161
164
  super.disablePlugin();
162
165
  }
163
166
 
@@ -179,6 +182,44 @@ class NestedRows extends _base.BasePlugin {
179
182
  super.updatePlugin();
180
183
  }
181
184
 
185
+ /**
186
+ * Register shortcuts responsible for toggling collapsible columns.
187
+ *
188
+ * @private
189
+ */
190
+ registerShortcuts() {
191
+ this.hot.getShortcutManager().getContext('grid').addShortcut({
192
+ keys: [['Enter']],
193
+ callback: () => {
194
+ const {
195
+ highlight
196
+ } = this.hot.getSelectedRangeLast();
197
+ if (highlight.col === -1 && highlight.row >= 0) {
198
+ const row = this.collapsingUI.translateTrimmedRow(highlight.row);
199
+ if (this.collapsingUI.areChildrenCollapsed(row)) {
200
+ this.collapsingUI.expandChildren(row);
201
+ } else {
202
+ this.collapsingUI.collapseChildren(row);
203
+ }
204
+ }
205
+ },
206
+ runOnlyIf: () => {
207
+ var _this$hot$getSelected;
208
+ return (_this$hot$getSelected = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected === void 0 ? void 0 : _this$hot$getSelected.highlight.isHeader();
209
+ },
210
+ group: SHORTCUTS_GROUP
211
+ });
212
+ }
213
+
214
+ /**
215
+ * Unregister shortcuts responsible for toggling collapsible columns.
216
+ *
217
+ * @private
218
+ */
219
+ unregisterShortcuts() {
220
+ this.hot.getShortcutManager().getContext('grid').removeShortcutsByGroup(SHORTCUTS_GROUP);
221
+ }
222
+
182
223
  /**
183
224
  * `beforeRowMove` hook callback.
184
225
  *