handsontable 0.0.0-next-9059914-20231025 → 0.0.0-next-21d91d0-20231025

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of handsontable might be problematic. Click here for more details.

Files changed (446) 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 +51 -15
  98. package/dist/handsontable.full.css +51 -15
  99. package/dist/handsontable.full.js +13360 -7840
  100. package/dist/handsontable.full.min.css +7 -7
  101. package/dist/handsontable.full.min.js +136 -136
  102. package/dist/handsontable.js +20955 -15435
  103. package/dist/handsontable.min.css +6 -6
  104. package/dist/handsontable.min.js +24 -24
  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/defaultShortcutsList.js +88 -0
  175. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
  176. package/plugins/contextMenu/menu/index.js +9 -0
  177. package/plugins/contextMenu/menu/index.mjs +1 -0
  178. package/plugins/contextMenu/{menu.js → menu/menu.js} +145 -421
  179. package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +146 -422
  180. package/plugins/contextMenu/menu/menuItemRenderer.js +58 -0
  181. package/plugins/contextMenu/menu/menuItemRenderer.mjs +54 -0
  182. package/plugins/contextMenu/menu/navigator.js +27 -0
  183. package/plugins/contextMenu/menu/navigator.mjs +23 -0
  184. package/plugins/contextMenu/menu/positioner.js +213 -0
  185. package/plugins/contextMenu/menu/positioner.mjs +209 -0
  186. package/plugins/contextMenu/menu/shortcuts.js +114 -0
  187. package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
  188. package/plugins/contextMenu/menu/utils.js +177 -0
  189. package/plugins/contextMenu/menu/utils.mjs +163 -0
  190. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  191. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  192. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  193. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  194. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  195. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  196. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  197. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  198. package/plugins/contextMenu/{predefinedItems.js → predefinedItems/index.js} +14 -14
  199. package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
  200. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  201. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  202. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  203. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  204. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  205. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  206. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  207. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  208. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  209. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  210. package/plugins/contextMenu/utils.js +35 -151
  211. package/plugins/contextMenu/utils.mjs +35 -144
  212. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  213. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  214. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  215. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  216. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  217. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  218. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  219. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  220. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  221. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  222. package/plugins/copyPaste/copyPaste.js +127 -78
  223. package/plugins/copyPaste/copyPaste.mjs +128 -79
  224. package/plugins/customBorders/customBorders.js +23 -20
  225. package/plugins/customBorders/customBorders.mjs +24 -21
  226. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  227. package/plugins/dropdownMenu/dropdownMenu.js +127 -40
  228. package/plugins/dropdownMenu/dropdownMenu.mjs +126 -39
  229. package/plugins/filters/component/_base.js +23 -8
  230. package/plugins/filters/component/_base.mjs +23 -8
  231. package/plugins/filters/component/actionBar.js +29 -27
  232. package/plugins/filters/component/actionBar.mjs +26 -23
  233. package/plugins/filters/component/condition.js +46 -59
  234. package/plugins/filters/component/condition.mjs +40 -52
  235. package/plugins/filters/component/operators.js +21 -22
  236. package/plugins/filters/component/operators.mjs +18 -18
  237. package/plugins/filters/component/value.js +35 -26
  238. package/plugins/filters/component/value.mjs +32 -22
  239. package/plugins/filters/constants.mjs +1 -1
  240. package/plugins/filters/filters.js +106 -62
  241. package/plugins/filters/filters.mjs +99 -55
  242. package/plugins/filters/menu/focusController.js +123 -0
  243. package/plugins/filters/menu/focusController.mjs +119 -0
  244. package/plugins/filters/menu/focusNavigator.js +30 -0
  245. package/plugins/filters/menu/focusNavigator.mjs +26 -0
  246. package/plugins/filters/ui/_base.js +35 -13
  247. package/plugins/filters/ui/_base.mjs +35 -13
  248. package/plugins/filters/ui/input.js +43 -32
  249. package/plugins/filters/ui/input.mjs +42 -30
  250. package/plugins/filters/ui/link.js +44 -12
  251. package/plugins/filters/ui/link.mjs +44 -11
  252. package/plugins/filters/ui/multipleSelect.js +234 -129
  253. package/plugins/filters/ui/multipleSelect.mjs +232 -127
  254. package/plugins/filters/ui/radioInput.js +42 -18
  255. package/plugins/filters/ui/radioInput.mjs +42 -17
  256. package/plugins/filters/ui/select.js +144 -75
  257. package/plugins/filters/ui/select.mjs +142 -72
  258. package/plugins/hiddenColumns/hiddenColumns.mjs +1 -1
  259. package/plugins/hiddenRows/hiddenRows.mjs +1 -1
  260. package/plugins/manualColumnMove/manualColumnMove.js +3 -1
  261. package/plugins/manualColumnMove/manualColumnMove.mjs +3 -1
  262. package/plugins/mergeCells/mergeCells.js +5 -16
  263. package/plugins/mergeCells/mergeCells.mjs +5 -16
  264. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  265. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  266. package/plugins/nestedHeaders/nestedHeaders.js +240 -10
  267. package/plugins/nestedHeaders/nestedHeaders.mjs +241 -11
  268. package/plugins/nestedHeaders/stateManager/index.js +102 -3
  269. package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
  270. package/plugins/nestedRows/nestedRows.js +41 -0
  271. package/plugins/nestedRows/nestedRows.mjs +41 -0
  272. package/plugins/nestedRows/ui/headers.js +11 -0
  273. package/plugins/nestedRows/ui/headers.mjs +12 -1
  274. package/renderers/autocompleteRenderer/autocompleteRenderer.js +8 -0
  275. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
  276. package/renderers/baseRenderer/baseRenderer.js +17 -0
  277. package/renderers/baseRenderer/baseRenderer.mjs +18 -1
  278. package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
  279. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  280. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  281. package/renderers/dateRenderer/dateRenderer.js +29 -0
  282. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  283. package/renderers/dateRenderer/index.d.ts +1 -0
  284. package/renderers/dateRenderer/index.js +6 -0
  285. package/renderers/dateRenderer/index.mjs +1 -0
  286. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  287. package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
  288. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  289. package/renderers/handsontableRenderer/index.d.ts +1 -0
  290. package/renderers/handsontableRenderer/index.js +6 -0
  291. package/renderers/handsontableRenderer/index.mjs +1 -0
  292. package/renderers/index.d.ts +9 -0
  293. package/renderers/selectRenderer/index.d.ts +1 -0
  294. package/renderers/selectRenderer/index.js +6 -0
  295. package/renderers/selectRenderer/index.mjs +1 -0
  296. package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
  297. package/renderers/selectRenderer/selectRenderer.js +27 -0
  298. package/renderers/selectRenderer/selectRenderer.mjs +22 -0
  299. package/selection/highlight/highlight.js +256 -71
  300. package/selection/highlight/highlight.mjs +250 -71
  301. package/selection/highlight/types/activeHeader.js +10 -8
  302. package/selection/highlight/types/activeHeader.mjs +10 -8
  303. package/selection/highlight/types/area.js +6 -18
  304. package/selection/highlight/types/area.mjs +6 -18
  305. package/selection/highlight/types/areaLayered.js +31 -0
  306. package/selection/highlight/types/areaLayered.mjs +26 -0
  307. package/selection/highlight/types/column.js +27 -0
  308. package/selection/highlight/types/column.mjs +22 -0
  309. package/selection/highlight/types/customSelection.js +7 -9
  310. package/selection/highlight/types/customSelection.mjs +7 -9
  311. package/selection/highlight/types/fill.js +5 -7
  312. package/selection/highlight/types/fill.mjs +5 -7
  313. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  314. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  315. package/selection/highlight/types/header.js +9 -18
  316. package/selection/highlight/types/header.mjs +9 -18
  317. package/selection/highlight/types/row.js +27 -0
  318. package/selection/highlight/types/row.mjs +22 -0
  319. package/selection/highlight/visualSelection.js +31 -27
  320. package/selection/highlight/visualSelection.mjs +31 -27
  321. package/selection/index.js +4 -7
  322. package/selection/index.mjs +2 -3
  323. package/selection/mouseEventHandler.js +7 -1
  324. package/selection/mouseEventHandler.mjs +7 -1
  325. package/selection/range.js +8 -8
  326. package/selection/range.mjs +8 -8
  327. package/selection/selection.js +321 -152
  328. package/selection/selection.mjs +318 -151
  329. package/selection/transformation.js +232 -90
  330. package/selection/transformation.mjs +232 -90
  331. package/selection/utils.js +15 -21
  332. package/selection/utils.mjs +16 -21
  333. package/settings.d.ts +4 -0
  334. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  335. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  336. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  337. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  338. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  339. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  340. package/shortcutContexts/commands/editor/index.js +16 -0
  341. package/shortcutContexts/commands/editor/index.mjs +12 -0
  342. package/shortcutContexts/commands/editor/open.js +27 -0
  343. package/shortcutContexts/commands/editor/open.mjs +23 -0
  344. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  345. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  346. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  347. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  348. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +25 -0
  349. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
  350. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  351. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  352. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  353. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  354. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  355. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  356. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  357. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  358. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  359. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  360. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  361. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  362. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  363. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  364. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  365. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  366. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  367. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  368. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  369. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  370. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  371. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  372. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  373. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  374. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +25 -0
  375. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
  376. package/shortcutContexts/commands/index.js +35 -0
  377. package/shortcutContexts/commands/index.mjs +31 -0
  378. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  379. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  380. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +33 -0
  381. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
  382. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  383. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  384. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  385. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  386. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  387. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  388. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  389. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  390. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  391. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  392. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  393. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  394. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  395. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  396. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  397. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  398. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  399. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  400. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  401. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  402. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  403. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  404. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  405. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  406. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  407. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  408. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  409. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  410. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +33 -0
  411. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
  412. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  413. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  414. package/shortcutContexts/commands/scrollToFocusedCell.js +35 -0
  415. package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
  416. package/shortcutContexts/commands/selectAll.js +12 -0
  417. package/shortcutContexts/commands/selectAll.mjs +8 -0
  418. package/shortcutContexts/constants.js +13 -0
  419. package/shortcutContexts/constants.mjs +8 -0
  420. package/shortcutContexts/editor.js +25 -0
  421. package/shortcutContexts/editor.mjs +21 -0
  422. package/shortcutContexts/grid.js +163 -0
  423. package/shortcutContexts/grid.mjs +159 -0
  424. package/shortcutContexts/index.js +24 -0
  425. package/shortcutContexts/index.mjs +11 -0
  426. package/shortcuts/context.js +23 -4
  427. package/shortcuts/context.mjs +23 -5
  428. package/shortcuts/manager.js +25 -7
  429. package/shortcuts/manager.mjs +26 -7
  430. package/shortcuts/recorder.js +3 -3
  431. package/shortcuts/recorder.mjs +3 -3
  432. package/shortcuts/utils.js +19 -5
  433. package/shortcuts/utils.mjs +18 -4
  434. package/tableView.js +111 -13
  435. package/tableView.mjs +112 -14
  436. package/utils/paginator.js +151 -0
  437. package/utils/paginator.mjs +147 -0
  438. package/3rdparty/walkontable/src/selection.js +0 -295
  439. package/3rdparty/walkontable/src/selection.mjs +0 -290
  440. package/plugins/contextMenu/predefinedItems.mjs +0 -68
  441. package/plugins/copyPaste/focusableElement.js +0 -186
  442. package/plugins/copyPaste/focusableElement.mjs +0 -180
  443. package/selection/highlight/constants.js +0 -15
  444. package/selection/highlight/constants.mjs +0 -6
  445. package/selection/highlight/types/index.js +0 -35
  446. package/selection/highlight/types/index.mjs +0 -31
@@ -5,8 +5,8 @@ exports.__esModule = true;
5
5
  require("core-js/modules/es.array.push.js");
6
6
  var _element = require("../../helpers/dom/element");
7
7
  var _number = require("../../helpers/number");
8
- var _event = require("../../helpers/dom/event");
9
8
  var _templateLiteralTag = require("../../helpers/templateLiteralTag");
9
+ var _event = require("../../helpers/dom/event");
10
10
  var _console = require("../../helpers/console");
11
11
  var _selection = require("../../selection");
12
12
  var _base = require("../base");
@@ -75,13 +75,14 @@ const PLUGIN_PRIORITY = 280;
75
75
  exports.PLUGIN_PRIORITY = PLUGIN_PRIORITY;
76
76
  var _stateManager = /*#__PURE__*/new WeakMap();
77
77
  var _hidingIndexMapObserver = /*#__PURE__*/new WeakMap();
78
+ var _focusInitialCoords = /*#__PURE__*/new WeakMap();
79
+ var _isColumnsSelectionInProgress = /*#__PURE__*/new WeakMap();
78
80
  class NestedHeaders extends _base.BasePlugin {
79
81
  constructor() {
80
82
  super(...arguments);
81
83
  /**
82
84
  * The state manager for the nested headers.
83
85
  *
84
- * @private
85
86
  * @type {StateManager}
86
87
  */
87
88
  _classPrivateFieldInitSpec(this, _stateManager, {
@@ -92,13 +93,30 @@ class NestedHeaders extends _base.BasePlugin {
92
93
  * The instance of the ChangesObservable class that allows track the changes that happens in the
93
94
  * column indexes.
94
95
  *
95
- * @private
96
96
  * @type {ChangesObservable}
97
97
  */
98
98
  _classPrivateFieldInitSpec(this, _hidingIndexMapObserver, {
99
99
  writable: true,
100
100
  value: null
101
101
  });
102
+ /**
103
+ * Holds the coords that points to the place where the column selection starts.
104
+ *
105
+ * @type {number|null}
106
+ */
107
+ _classPrivateFieldInitSpec(this, _focusInitialCoords, {
108
+ writable: true,
109
+ value: null
110
+ });
111
+ /**
112
+ * Determines if there is performed the column selection.
113
+ *
114
+ * @type {boolean}
115
+ */
116
+ _classPrivateFieldInitSpec(this, _isColumnsSelectionInProgress, {
117
+ writable: true,
118
+ value: false
119
+ });
102
120
  /**
103
121
  * Custom helper for getting widths of the nested headers.
104
122
  *
@@ -158,6 +176,19 @@ class NestedHeaders extends _base.BasePlugin {
158
176
  this.addHook('beforeOnCellMouseOver', function () {
159
177
  return _this.onBeforeOnCellMouseOver(...arguments);
160
178
  });
179
+ this.addHook('beforeOnCellMouseUp', function () {
180
+ return _this.onBeforeOnCellMouseUp(...arguments);
181
+ });
182
+ this.addHook('beforeSelectionHighlightSet', function () {
183
+ return _this.onBeforeSelectionHighlightSet(...arguments);
184
+ });
185
+ this.addHook('modifyTransformStart', function () {
186
+ return _this.onModifyTransformStart(...arguments);
187
+ });
188
+ this.addHook('afterSelection', () => this.updateFocusHighlightPosition());
189
+ this.addHook('beforeViewportScrollHorizontally', function () {
190
+ return _this.onBeforeViewportScrollHorizontally(...arguments);
191
+ });
161
192
  this.addHook('afterGetColumnHeaderRenderers', array => this.onAfterGetColumnHeaderRenderers(array));
162
193
  this.addHook('modifyColWidth', function () {
163
194
  return _this.onModifyColWidth(...arguments);
@@ -171,9 +202,17 @@ class NestedHeaders extends _base.BasePlugin {
171
202
  this.addHook('beforeCopy', function () {
172
203
  return _this.onBeforeCopy(...arguments);
173
204
  });
205
+ this.addHook('beforeSelectColumns', function () {
206
+ return _this.onBeforeSelectColumns(...arguments);
207
+ });
174
208
  this.addHook('afterViewportColumnCalculatorOverride', function () {
175
209
  return _this.onAfterViewportColumnCalculatorOverride(...arguments);
176
210
  });
211
+ this.addHook('modifyFocusedElement', function () {
212
+ return _this.onModifyFocusedElement(...arguments);
213
+ });
214
+ this.hot.columnIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
215
+ this.hot.rowIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
177
216
  super.enablePlugin();
178
217
  this.updatePlugin(); // @TODO: Workaround for broken plugin initialization abstraction.
179
218
  }
@@ -389,6 +428,67 @@ class NestedHeaders extends _base.BasePlugin {
389
428
  return this.hot.getColHeader(visualColumnIndex, headerLevel);
390
429
  }
391
430
 
431
+ /**
432
+ * Updates the selection focus highlight position to point to the nested header root element (TH)
433
+ * even when the logical coordinates point in-between the header.
434
+ *
435
+ * @private
436
+ */
437
+ updateFocusHighlightPosition() {
438
+ var _this$hot;
439
+ const selection = (_this$hot = this.hot) === null || _this$hot === void 0 ? void 0 : _this$hot.getSelectedRangeLast();
440
+ if (!selection) {
441
+ return;
442
+ }
443
+ const {
444
+ highlight
445
+ } = selection;
446
+ const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
447
+ if (isNestedHeadersRange) {
448
+ const columnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
449
+ const focusHighlight = this.hot.selection.highlight.getFocus();
450
+
451
+ // Correct the highlight/focus selection to highlight the correct TH element
452
+ focusHighlight.visualCellRange.highlight.col = columnIndex;
453
+ focusHighlight.visualCellRange.from.col = columnIndex;
454
+ focusHighlight.visualCellRange.to.col = columnIndex;
455
+ focusHighlight.commit();
456
+ }
457
+ }
458
+
459
+ /**
460
+ * Allows to control to which column index the viewport will be scrolled. To ensure that the viewport
461
+ * is scrolled to the correct column for the nested header the most left and the most right visual column
462
+ * indexes are used.
463
+ *
464
+ * @private
465
+ * @param {number} visualColumn A visual column index to which the viewport will be scrolled.
466
+ * @returns {number}
467
+ */
468
+ onBeforeViewportScrollHorizontally(visualColumn) {
469
+ const selection = this.hot.getSelectedRangeLast();
470
+ if (!selection) {
471
+ return visualColumn;
472
+ }
473
+ const {
474
+ highlight
475
+ } = selection;
476
+ const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
477
+ if (!isNestedHeadersRange) {
478
+ return visualColumn;
479
+ }
480
+ const firstColumn = this.hot.view.getFirstFullyVisibleColumn();
481
+ const lastColumn = this.hot.view.getLastFullyVisibleColumn();
482
+ const mostLeftColumnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
483
+ const mostRightColumnIndex = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(highlight.row, highlight.col);
484
+
485
+ // do not scroll the viewport when the header is wider than the viewport
486
+ if (mostLeftColumnIndex < firstColumn && mostRightColumnIndex > lastColumn) {
487
+ return visualColumn;
488
+ }
489
+ return mostLeftColumnIndex < firstColumn ? mostLeftColumnIndex : mostRightColumnIndex;
490
+ }
491
+
392
492
  /**
393
493
  * Allows to control which header DOM element will be used to highlight.
394
494
  *
@@ -404,7 +504,6 @@ class NestedHeaders extends _base.BasePlugin {
404
504
  return visualColumn;
405
505
  }
406
506
  const {
407
- classNames,
408
507
  columnCursor,
409
508
  selectionType,
410
509
  selectionWidth
@@ -419,8 +518,8 @@ class NestedHeaders extends _base.BasePlugin {
419
518
  }
420
519
  } else if (selectionType === _selection.ACTIVE_HEADER_TYPE) {
421
520
  if (colspan > selectionWidth - columnCursor || !isRoot) {
422
- // Reset the class names array so the generated TH element won't be modified.
423
- classNames.length = 0;
521
+ // Prevents adding any CSS class names to the TH element
522
+ return null;
424
523
  }
425
524
  }
426
525
  return visualColumn;
@@ -508,6 +607,8 @@ class NestedHeaders extends _base.BasePlugin {
508
607
  if (!headerNodeData) {
509
608
  return;
510
609
  }
610
+ _classPrivateFieldSet(this, _focusInitialCoords, coords.clone());
611
+ _classPrivateFieldSet(this, _isColumnsSelectionInProgress, true);
511
612
  const {
512
613
  selection
513
614
  } = this.hot;
@@ -573,14 +674,129 @@ class NestedHeaders extends _base.BasePlugin {
573
674
  controller.column = true;
574
675
  controller.cell = true;
575
676
  const columnsToSelect = [];
677
+ const headerLevel = (0, _number.clamp)(coords.row, -Infinity, -1);
576
678
  if (coords.col < from.col) {
577
- columnsToSelect.push(bottomEndCoords.col, columnIndex);
679
+ columnsToSelect.push(bottomEndCoords.col, columnIndex, headerLevel);
578
680
  } else if (coords.col > from.col) {
579
- columnsToSelect.push(topStartCoords.col, columnIndex + origColspan - 1);
681
+ columnsToSelect.push(topStartCoords.col, columnIndex + origColspan - 1, headerLevel);
580
682
  } else {
581
- columnsToSelect.push(columnIndex, columnIndex + origColspan - 1);
683
+ columnsToSelect.push(columnIndex, columnIndex + origColspan - 1, headerLevel);
684
+ }
685
+ this.hot.selection.selectColumns(...columnsToSelect);
686
+ }
687
+
688
+ /**
689
+ * Switches internal flag about selection progress to `false`.
690
+ *
691
+ * @private
692
+ */
693
+ onBeforeOnCellMouseUp() {
694
+ _classPrivateFieldSet(this, _isColumnsSelectionInProgress, false);
695
+ }
696
+
697
+ /**
698
+ * The hook checks and ensures that the focus position that depends on the selected columns
699
+ * range is always positioned within the range.
700
+ *
701
+ * @private
702
+ */
703
+ onBeforeSelectionHighlightSet() {
704
+ const {
705
+ navigableHeaders
706
+ } = this.hot.getSettings();
707
+ if (!this.hot.view.isMouseDown() || !_classPrivateFieldGet(this, _isColumnsSelectionInProgress) || !navigableHeaders) {
708
+ return;
709
+ }
710
+ const selectedRange = this.hot.getSelectedRangeLast();
711
+ const columnStart = selectedRange.getTopStartCorner().col;
712
+ const columnEnd = selectedRange.getBottomEndCorner().col;
713
+ const {
714
+ columnIndex,
715
+ origColspan
716
+ } = _classPrivateFieldGet(this, _stateManager).getHeaderTreeNodeData(_classPrivateFieldGet(this, _focusInitialCoords).row, _classPrivateFieldGet(this, _focusInitialCoords).col);
717
+ selectedRange.setHighlight(_classPrivateFieldGet(this, _focusInitialCoords));
718
+ if (origColspan > selectedRange.getWidth() || columnIndex < columnStart || columnIndex + origColspan - 1 > columnEnd) {
719
+ const headerLevel = _classPrivateFieldGet(this, _stateManager).findTopMostEntireHeaderLevel((0, _number.clamp)(columnStart, columnIndex, columnIndex + origColspan - 1), (0, _number.clamp)(columnEnd, columnIndex, columnIndex + origColspan - 1));
720
+ selectedRange.highlight.row = headerLevel;
721
+ selectedRange.highlight.col = selectedRange.from.col;
722
+ }
723
+ }
724
+
725
+ /**
726
+ * `modifyTransformStart` hook is called every time the keyboard navigation is used.
727
+ *
728
+ * @private
729
+ * @param {object} delta The transformation delta.
730
+ */
731
+ onModifyTransformStart(delta) {
732
+ const {
733
+ highlight
734
+ } = this.hot.getSelectedRangeLast();
735
+ const nextCoords = this.hot._createCellCoords(highlight.row + delta.row, highlight.col + delta.col);
736
+ const isNestedHeadersRange = nextCoords.isHeader() && nextCoords.col >= 0;
737
+ if (!isNestedHeadersRange) {
738
+ return;
739
+ }
740
+ const visualColumnIndexStart = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(nextCoords.row, nextCoords.col);
741
+ const visualColumnIndexEnd = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(nextCoords.row, nextCoords.col);
742
+ if (delta.col < 0) {
743
+ const nextColumn = highlight.col >= visualColumnIndexStart && highlight.col <= visualColumnIndexEnd ? visualColumnIndexStart - 1 : visualColumnIndexEnd;
744
+ const notHiddenColumnIndex = this.hot.columnIndexMapper.getNearestNotHiddenIndex(nextColumn, -1);
745
+ if (notHiddenColumnIndex === null) {
746
+ // There are no visible columns anymore, so move the selection out of the table edge. This will
747
+ // be processed by the selection Transformer class as a move selection to the previous row (if autoWrapRow is enabled).
748
+ delta.col = -this.hot.view.countRenderableColumnsInRange(0, highlight.col);
749
+ } else {
750
+ delta.col = -Math.max(this.hot.view.countRenderableColumnsInRange(notHiddenColumnIndex, highlight.col) - 1, 1);
751
+ }
752
+ } else if (delta.col > 0) {
753
+ const nextColumn = highlight.col >= visualColumnIndexStart && highlight.col <= visualColumnIndexEnd ? visualColumnIndexEnd + 1 : visualColumnIndexStart;
754
+ const notHiddenColumnIndex = this.hot.columnIndexMapper.getNearestNotHiddenIndex(nextColumn, 1);
755
+ if (notHiddenColumnIndex === null) {
756
+ // There are no visible columns anymore, so move the selection out of the table edge. This will
757
+ // be processed by the selection Transformer class as a move selection to the next row (if autoWrapRow is enabled).
758
+ delta.col = this.hot.view.countRenderableColumnsInRange(highlight.col, this.hot.countCols());
759
+ } else {
760
+ delta.col = Math.max(this.hot.view.countRenderableColumnsInRange(highlight.col, notHiddenColumnIndex) - 1, 1);
761
+ }
762
+ }
763
+ }
764
+
765
+ /**
766
+ * The hook observes the column selection from the Selection API and modifies the column range to
767
+ * ensure that the whole nested column will be covered.
768
+ *
769
+ * @private
770
+ * @param {CellCoords} from The coords object where the selection starts.
771
+ * @param {CellCoords} to The coords object where the selection ends.
772
+ */
773
+ onBeforeSelectColumns(from, to) {
774
+ const headerLevel = from.row;
775
+ const startNodeData = this._getHeaderTreeNodeDataByCoords({
776
+ row: headerLevel,
777
+ col: from.col
778
+ });
779
+ const endNodeData = this._getHeaderTreeNodeDataByCoords({
780
+ row: headerLevel,
781
+ col: to.col
782
+ });
783
+ if (to.col < from.col) {
784
+ // Column selection from right to left
785
+ if (startNodeData) {
786
+ from.col = startNodeData.columnIndex + startNodeData.origColspan - 1;
787
+ }
788
+ if (endNodeData) {
789
+ to.col = endNodeData.columnIndex;
790
+ }
791
+ } else if (to.col >= from.col) {
792
+ // Column selection from left to right or a single column selection
793
+ if (startNodeData) {
794
+ from.col = startNodeData.columnIndex;
795
+ }
796
+ if (endNodeData) {
797
+ to.col = endNodeData.columnIndex + endNodeData.origColspan - 1;
798
+ }
582
799
  }
583
- this.hot.selectColumns(...columnsToSelect);
584
800
  }
585
801
 
586
802
  /**
@@ -665,6 +881,20 @@ class NestedHeaders extends _base.BasePlugin {
665
881
  return label;
666
882
  }
667
883
 
884
+ /**
885
+ * `modifyFocusedElement` hook callback.
886
+ *
887
+ * @private
888
+ * @param {number} row Row index.
889
+ * @param {number} column Column index.
890
+ * @returns {HTMLTableCellElement} The `TH` element to be focused.
891
+ */
892
+ onModifyFocusedElement(row, column) {
893
+ if (row < 0) {
894
+ return this.hot.getCell(row, _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(row, column), true);
895
+ }
896
+ }
897
+
668
898
  /**
669
899
  * Updates the plugin state after HoT initialization.
670
900
  *
@@ -11,9 +11,9 @@ function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classEx
11
11
  function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
12
12
  function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
13
13
  import { addClass, removeClass } from "../../helpers/dom/element.mjs";
14
- import { isNumeric } from "../../helpers/number.mjs";
15
- import { isLeftClick, isRightClick } from "../../helpers/dom/event.mjs";
14
+ import { isNumeric, clamp } from "../../helpers/number.mjs";
16
15
  import { toSingleLine } from "../../helpers/templateLiteralTag.mjs";
16
+ import { isLeftClick, isRightClick } from "../../helpers/dom/event.mjs";
17
17
  import { warn } from "../../helpers/console.mjs";
18
18
  import { ACTIVE_HEADER_TYPE, HEADER_TYPE } from "../../selection/index.mjs";
19
19
  import { BasePlugin } from "../base/index.mjs";
@@ -69,13 +69,14 @@ export const PLUGIN_PRIORITY = 280;
69
69
  */
70
70
  var _stateManager = /*#__PURE__*/new WeakMap();
71
71
  var _hidingIndexMapObserver = /*#__PURE__*/new WeakMap();
72
+ var _focusInitialCoords = /*#__PURE__*/new WeakMap();
73
+ var _isColumnsSelectionInProgress = /*#__PURE__*/new WeakMap();
72
74
  export class NestedHeaders extends BasePlugin {
73
75
  constructor() {
74
76
  super(...arguments);
75
77
  /**
76
78
  * The state manager for the nested headers.
77
79
  *
78
- * @private
79
80
  * @type {StateManager}
80
81
  */
81
82
  _classPrivateFieldInitSpec(this, _stateManager, {
@@ -86,13 +87,30 @@ export class NestedHeaders extends BasePlugin {
86
87
  * The instance of the ChangesObservable class that allows track the changes that happens in the
87
88
  * column indexes.
88
89
  *
89
- * @private
90
90
  * @type {ChangesObservable}
91
91
  */
92
92
  _classPrivateFieldInitSpec(this, _hidingIndexMapObserver, {
93
93
  writable: true,
94
94
  value: null
95
95
  });
96
+ /**
97
+ * Holds the coords that points to the place where the column selection starts.
98
+ *
99
+ * @type {number|null}
100
+ */
101
+ _classPrivateFieldInitSpec(this, _focusInitialCoords, {
102
+ writable: true,
103
+ value: null
104
+ });
105
+ /**
106
+ * Determines if there is performed the column selection.
107
+ *
108
+ * @type {boolean}
109
+ */
110
+ _classPrivateFieldInitSpec(this, _isColumnsSelectionInProgress, {
111
+ writable: true,
112
+ value: false
113
+ });
96
114
  /**
97
115
  * Custom helper for getting widths of the nested headers.
98
116
  *
@@ -152,6 +170,19 @@ export class NestedHeaders extends BasePlugin {
152
170
  this.addHook('beforeOnCellMouseOver', function () {
153
171
  return _this.onBeforeOnCellMouseOver(...arguments);
154
172
  });
173
+ this.addHook('beforeOnCellMouseUp', function () {
174
+ return _this.onBeforeOnCellMouseUp(...arguments);
175
+ });
176
+ this.addHook('beforeSelectionHighlightSet', function () {
177
+ return _this.onBeforeSelectionHighlightSet(...arguments);
178
+ });
179
+ this.addHook('modifyTransformStart', function () {
180
+ return _this.onModifyTransformStart(...arguments);
181
+ });
182
+ this.addHook('afterSelection', () => this.updateFocusHighlightPosition());
183
+ this.addHook('beforeViewportScrollHorizontally', function () {
184
+ return _this.onBeforeViewportScrollHorizontally(...arguments);
185
+ });
155
186
  this.addHook('afterGetColumnHeaderRenderers', array => this.onAfterGetColumnHeaderRenderers(array));
156
187
  this.addHook('modifyColWidth', function () {
157
188
  return _this.onModifyColWidth(...arguments);
@@ -165,9 +196,17 @@ export class NestedHeaders extends BasePlugin {
165
196
  this.addHook('beforeCopy', function () {
166
197
  return _this.onBeforeCopy(...arguments);
167
198
  });
199
+ this.addHook('beforeSelectColumns', function () {
200
+ return _this.onBeforeSelectColumns(...arguments);
201
+ });
168
202
  this.addHook('afterViewportColumnCalculatorOverride', function () {
169
203
  return _this.onAfterViewportColumnCalculatorOverride(...arguments);
170
204
  });
205
+ this.addHook('modifyFocusedElement', function () {
206
+ return _this.onModifyFocusedElement(...arguments);
207
+ });
208
+ this.hot.columnIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
209
+ this.hot.rowIndexMapper.addLocalHook('cacheUpdated', () => this.updateFocusHighlightPosition());
171
210
  super.enablePlugin();
172
211
  this.updatePlugin(); // @TODO: Workaround for broken plugin initialization abstraction.
173
212
  }
@@ -383,6 +422,67 @@ export class NestedHeaders extends BasePlugin {
383
422
  return this.hot.getColHeader(visualColumnIndex, headerLevel);
384
423
  }
385
424
 
425
+ /**
426
+ * Updates the selection focus highlight position to point to the nested header root element (TH)
427
+ * even when the logical coordinates point in-between the header.
428
+ *
429
+ * @private
430
+ */
431
+ updateFocusHighlightPosition() {
432
+ var _this$hot;
433
+ const selection = (_this$hot = this.hot) === null || _this$hot === void 0 ? void 0 : _this$hot.getSelectedRangeLast();
434
+ if (!selection) {
435
+ return;
436
+ }
437
+ const {
438
+ highlight
439
+ } = selection;
440
+ const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
441
+ if (isNestedHeadersRange) {
442
+ const columnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
443
+ const focusHighlight = this.hot.selection.highlight.getFocus();
444
+
445
+ // Correct the highlight/focus selection to highlight the correct TH element
446
+ focusHighlight.visualCellRange.highlight.col = columnIndex;
447
+ focusHighlight.visualCellRange.from.col = columnIndex;
448
+ focusHighlight.visualCellRange.to.col = columnIndex;
449
+ focusHighlight.commit();
450
+ }
451
+ }
452
+
453
+ /**
454
+ * Allows to control to which column index the viewport will be scrolled. To ensure that the viewport
455
+ * is scrolled to the correct column for the nested header the most left and the most right visual column
456
+ * indexes are used.
457
+ *
458
+ * @private
459
+ * @param {number} visualColumn A visual column index to which the viewport will be scrolled.
460
+ * @returns {number}
461
+ */
462
+ onBeforeViewportScrollHorizontally(visualColumn) {
463
+ const selection = this.hot.getSelectedRangeLast();
464
+ if (!selection) {
465
+ return visualColumn;
466
+ }
467
+ const {
468
+ highlight
469
+ } = selection;
470
+ const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
471
+ if (!isNestedHeadersRange) {
472
+ return visualColumn;
473
+ }
474
+ const firstColumn = this.hot.view.getFirstFullyVisibleColumn();
475
+ const lastColumn = this.hot.view.getLastFullyVisibleColumn();
476
+ const mostLeftColumnIndex = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(highlight.row, highlight.col);
477
+ const mostRightColumnIndex = _classPrivateFieldGet(this, _stateManager).findRightMostColumnIndex(highlight.row, highlight.col);
478
+
479
+ // do not scroll the viewport when the header is wider than the viewport
480
+ if (mostLeftColumnIndex < firstColumn && mostRightColumnIndex > lastColumn) {
481
+ return visualColumn;
482
+ }
483
+ return mostLeftColumnIndex < firstColumn ? mostLeftColumnIndex : mostRightColumnIndex;
484
+ }
485
+
386
486
  /**
387
487
  * Allows to control which header DOM element will be used to highlight.
388
488
  *
@@ -398,7 +498,6 @@ export class NestedHeaders extends BasePlugin {
398
498
  return visualColumn;
399
499
  }
400
500
  const {
401
- classNames,
402
501
  columnCursor,
403
502
  selectionType,
404
503
  selectionWidth
@@ -413,8 +512,8 @@ export class NestedHeaders extends BasePlugin {
413
512
  }
414
513
  } else if (selectionType === ACTIVE_HEADER_TYPE) {
415
514
  if (colspan > selectionWidth - columnCursor || !isRoot) {
416
- // 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
  *