handsontable 14.6.1-next-689aaa6-20241016 → 15.0.0-next-4472a60-20241203

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.js +23 -0
  2. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.mjs +23 -0
  3. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.js +23 -0
  4. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.mjs +23 -0
  5. package/3rdparty/walkontable/src/calculator/index.js +1 -2
  6. package/3rdparty/walkontable/src/calculator/index.mjs +2 -2
  7. package/3rdparty/walkontable/src/calculator/viewportBase.js +2 -0
  8. package/3rdparty/walkontable/src/calculator/viewportBase.mjs +2 -0
  9. package/3rdparty/walkontable/src/calculator/viewportRows.js +3 -3
  10. package/3rdparty/walkontable/src/calculator/viewportRows.mjs +3 -3
  11. package/3rdparty/walkontable/src/core/_base.js +29 -23
  12. package/3rdparty/walkontable/src/core/_base.mjs +29 -23
  13. package/3rdparty/walkontable/src/core/clone.js +1 -0
  14. package/3rdparty/walkontable/src/core/clone.mjs +1 -0
  15. package/3rdparty/walkontable/src/core/core.js +2 -0
  16. package/3rdparty/walkontable/src/core/core.mjs +2 -0
  17. package/3rdparty/walkontable/src/facade/core.js +12 -6
  18. package/3rdparty/walkontable/src/facade/core.mjs +12 -6
  19. package/3rdparty/walkontable/src/index.js +0 -1
  20. package/3rdparty/walkontable/src/index.mjs +2 -2
  21. package/3rdparty/walkontable/src/overlay/_base.js +8 -1
  22. package/3rdparty/walkontable/src/overlay/_base.mjs +8 -1
  23. package/3rdparty/walkontable/src/overlay/bottom.js +5 -6
  24. package/3rdparty/walkontable/src/overlay/bottom.mjs +5 -6
  25. package/3rdparty/walkontable/src/overlay/index.js +2 -0
  26. package/3rdparty/walkontable/src/overlay/inlineStart.js +8 -7
  27. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +9 -8
  28. package/3rdparty/walkontable/src/overlay/top.js +9 -8
  29. package/3rdparty/walkontable/src/overlay/top.mjs +10 -9
  30. package/3rdparty/walkontable/src/overlays.js +10 -26
  31. package/3rdparty/walkontable/src/overlays.mjs +10 -26
  32. package/3rdparty/walkontable/src/renderer/colGroup.js +1 -1
  33. package/3rdparty/walkontable/src/renderer/colGroup.mjs +1 -1
  34. package/3rdparty/walkontable/src/renderer/index.js +4 -2
  35. package/3rdparty/walkontable/src/renderer/index.mjs +4 -2
  36. package/3rdparty/walkontable/src/renderer/table.js +13 -4
  37. package/3rdparty/walkontable/src/renderer/table.mjs +13 -4
  38. package/3rdparty/walkontable/src/scroll.js +46 -37
  39. package/3rdparty/walkontable/src/scroll.mjs +46 -37
  40. package/3rdparty/walkontable/src/selection/border/border.js +52 -58
  41. package/3rdparty/walkontable/src/selection/border/border.mjs +53 -59
  42. package/3rdparty/walkontable/src/selection/border/utils.js +26 -0
  43. package/3rdparty/walkontable/src/selection/border/utils.mjs +22 -0
  44. package/3rdparty/walkontable/src/selection/index.js +6 -4
  45. package/3rdparty/walkontable/src/selection/index.mjs +1 -1
  46. package/3rdparty/walkontable/src/selection/manager.js +3 -0
  47. package/3rdparty/walkontable/src/selection/manager.mjs +3 -0
  48. package/3rdparty/walkontable/src/selection/scanner.js +46 -11
  49. package/3rdparty/walkontable/src/selection/scanner.mjs +46 -11
  50. package/3rdparty/walkontable/src/settings.js +8 -9
  51. package/3rdparty/walkontable/src/settings.mjs +8 -9
  52. package/3rdparty/walkontable/src/table/master.js +1 -1
  53. package/3rdparty/walkontable/src/table/master.mjs +2 -2
  54. package/3rdparty/walkontable/src/table.js +25 -36
  55. package/3rdparty/walkontable/src/table.mjs +25 -36
  56. package/3rdparty/walkontable/src/types.js +1 -0
  57. package/3rdparty/walkontable/src/types.mjs +1 -0
  58. package/3rdparty/walkontable/src/utils/column.js +1 -43
  59. package/3rdparty/walkontable/src/utils/column.mjs +1 -43
  60. package/3rdparty/walkontable/src/utils/stylesHandler.js +295 -0
  61. package/3rdparty/walkontable/src/utils/stylesHandler.mjs +291 -0
  62. package/3rdparty/walkontable/src/viewport.js +94 -91
  63. package/3rdparty/walkontable/src/viewport.mjs +95 -92
  64. package/CHANGELOG.md +36 -0
  65. package/README.md +1 -1
  66. package/base.js +4 -4
  67. package/base.mjs +3 -3
  68. package/core/focusCatcher/focusDetector.js +1 -0
  69. package/core/focusCatcher/focusDetector.mjs +1 -0
  70. package/core/hooks/bucket.js +184 -0
  71. package/core/hooks/bucket.mjs +180 -0
  72. package/{pluginHooks.mjs → core/hooks/constants.js} +38 -486
  73. package/{pluginHooks.js → core/hooks/constants.mjs} +34 -489
  74. package/{pluginHooks.d.ts → core/hooks/index.d.ts} +22 -25
  75. package/core/hooks/index.js +385 -0
  76. package/core/hooks/index.mjs +381 -0
  77. package/core/index.js +2 -0
  78. package/core.d.ts +5 -3
  79. package/core.js +77 -35
  80. package/core.mjs +69 -27
  81. package/dataMap/dataMap.js +3 -0
  82. package/dataMap/dataMap.mjs +3 -0
  83. package/dataMap/dataSource.js +2 -0
  84. package/dataMap/dataSource.mjs +2 -0
  85. package/dataMap/metaManager/index.js +2 -0
  86. package/dataMap/metaManager/index.mjs +2 -0
  87. package/dataMap/metaManager/metaSchema.js +91 -5
  88. package/dataMap/metaManager/metaSchema.mjs +91 -5
  89. package/dataMap/metaManager/mods/dynamicCellMeta.js +2 -3
  90. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +1 -1
  91. package/dataMap/metaManager/mods/extendMetaProperties.js +2 -0
  92. package/dataMap/metaManager/mods/extendMetaProperties.mjs +2 -0
  93. package/dist/handsontable.css +84 -72
  94. package/dist/handsontable.full.css +317 -304
  95. package/dist/handsontable.full.js +14826 -7294
  96. package/dist/handsontable.full.min.css +15 -10
  97. package/dist/handsontable.full.min.js +262 -69
  98. package/dist/handsontable.js +7826 -5552
  99. package/dist/handsontable.min.css +10 -6
  100. package/dist/handsontable.min.js +33 -33
  101. package/dist/languages/all.js +1 -1
  102. package/dist/languages/ar-AR.js +1 -1
  103. package/dist/languages/cs-CZ.js +1 -1
  104. package/dist/languages/de-CH.js +1 -1
  105. package/dist/languages/de-DE.js +1 -1
  106. package/dist/languages/en-US.js +1 -1
  107. package/dist/languages/es-MX.js +1 -1
  108. package/dist/languages/fr-FR.js +1 -1
  109. package/dist/languages/hr-HR.js +1 -1
  110. package/dist/languages/it-IT.js +1 -1
  111. package/dist/languages/ja-JP.js +1 -1
  112. package/dist/languages/ko-KR.js +1 -1
  113. package/dist/languages/lv-LV.js +1 -1
  114. package/dist/languages/nb-NO.js +1 -1
  115. package/dist/languages/nl-NL.js +1 -1
  116. package/dist/languages/pl-PL.js +1 -1
  117. package/dist/languages/pt-BR.js +1 -1
  118. package/dist/languages/ru-RU.js +1 -1
  119. package/dist/languages/sr-SP.js +1 -1
  120. package/dist/languages/zh-CN.js +1 -1
  121. package/dist/languages/zh-TW.js +1 -1
  122. package/editorManager.js +2 -2
  123. package/editorManager.mjs +2 -2
  124. package/editors/autocompleteEditor/autocompleteEditor.js +34 -16
  125. package/editors/autocompleteEditor/autocompleteEditor.mjs +34 -16
  126. package/editors/baseEditor/baseEditor.js +25 -18
  127. package/editors/baseEditor/baseEditor.mjs +26 -19
  128. package/editors/dateEditor/dateEditor.js +9 -0
  129. package/editors/dateEditor/dateEditor.mjs +10 -1
  130. package/editors/dropdownEditor/dropdownEditor.js +4 -3
  131. package/editors/dropdownEditor/dropdownEditor.mjs +3 -1
  132. package/editors/handsontableEditor/handsontableEditor.js +36 -2
  133. package/editors/handsontableEditor/handsontableEditor.mjs +36 -2
  134. package/editors/passwordEditor/passwordEditor.js +18 -0
  135. package/editors/passwordEditor/passwordEditor.mjs +18 -0
  136. package/editors/registry.js +2 -2
  137. package/editors/registry.mjs +1 -1
  138. package/editors/selectEditor/selectEditor.js +20 -9
  139. package/editors/selectEditor/selectEditor.mjs +20 -9
  140. package/editors/textEditor/textEditor.js +5 -12
  141. package/editors/textEditor/textEditor.mjs +6 -13
  142. package/focusManager.js +5 -7
  143. package/focusManager.mjs +5 -7
  144. package/helpers/array.js +2 -0
  145. package/helpers/array.mjs +2 -0
  146. package/helpers/data.js +3 -0
  147. package/helpers/data.mjs +3 -0
  148. package/helpers/dom/element.js +39 -18
  149. package/helpers/dom/element.mjs +38 -17
  150. package/helpers/mixed.js +3 -3
  151. package/helpers/mixed.mjs +3 -3
  152. package/helpers/moves.js +3 -0
  153. package/helpers/moves.mjs +3 -0
  154. package/helpers/number.js +1 -0
  155. package/helpers/number.mjs +1 -0
  156. package/helpers/object.js +2 -0
  157. package/helpers/object.mjs +2 -0
  158. package/helpers/themes.js +17 -0
  159. package/helpers/themes.mjs +13 -0
  160. package/i18n/index.js +2 -0
  161. package/i18n/languages/index.d.ts +8 -0
  162. package/i18n/languages/ja-JP.d.ts +1 -1
  163. package/i18n/phraseFormatters/substituteVariables.js +1 -0
  164. package/i18n/phraseFormatters/substituteVariables.mjs +1 -0
  165. package/index.d.ts +9 -1
  166. package/languages/all.js +1 -1
  167. package/languages/ar-AR.js +1 -1
  168. package/languages/cs-CZ.js +1 -1
  169. package/languages/de-CH.js +1 -1
  170. package/languages/de-DE.js +1 -1
  171. package/languages/en-US.js +1 -1
  172. package/languages/es-MX.js +1 -1
  173. package/languages/fr-FR.js +1 -1
  174. package/languages/hr-HR.js +1 -1
  175. package/languages/index.js +1 -1
  176. package/languages/it-IT.js +1 -1
  177. package/languages/ja-JP.js +1 -1
  178. package/languages/ko-KR.js +1 -1
  179. package/languages/lv-LV.js +1 -1
  180. package/languages/nb-NO.js +1 -1
  181. package/languages/nl-NL.js +1 -1
  182. package/languages/pl-PL.js +1 -1
  183. package/languages/pt-BR.js +1 -1
  184. package/languages/ru-RU.js +1 -1
  185. package/languages/sr-SP.js +1 -1
  186. package/languages/zh-CN.js +1 -1
  187. package/languages/zh-TW.js +1 -1
  188. package/package.json +22 -7
  189. package/plugins/autoColumnSize/autoColumnSize.js +22 -27
  190. package/plugins/autoColumnSize/autoColumnSize.mjs +22 -27
  191. package/plugins/autoRowSize/autoRowSize.js +20 -22
  192. package/plugins/autoRowSize/autoRowSize.mjs +21 -23
  193. package/plugins/autofill/autofill.js +4 -5
  194. package/plugins/autofill/autofill.mjs +1 -1
  195. package/plugins/base/base.d.ts +1 -1
  196. package/plugins/base/base.js +41 -0
  197. package/plugins/base/base.mjs +42 -1
  198. package/plugins/base/index.js +2 -1
  199. package/plugins/base/index.mjs +1 -1
  200. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +2 -5
  201. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.mjs +2 -5
  202. package/plugins/columnSorting/columnSorting.js +5 -4
  203. package/plugins/columnSorting/columnSorting.mjs +3 -1
  204. package/plugins/columnSorting/columnStatesManager.js +1 -0
  205. package/plugins/columnSorting/columnStatesManager.mjs +1 -0
  206. package/plugins/columnSorting/utils.js +3 -0
  207. package/plugins/columnSorting/utils.mjs +3 -0
  208. package/plugins/columnSummary/endpoints.js +3 -0
  209. package/plugins/columnSummary/endpoints.mjs +3 -0
  210. package/plugins/comments/commentEditor.js +9 -0
  211. package/plugins/comments/commentEditor.mjs +9 -0
  212. package/plugins/comments/comments.js +24 -18
  213. package/plugins/comments/comments.mjs +26 -20
  214. package/plugins/comments/editorResizeObserver.js +2 -0
  215. package/plugins/comments/editorResizeObserver.mjs +2 -0
  216. package/plugins/contextMenu/contextMenu.d.ts +2 -1
  217. package/plugins/contextMenu/contextMenu.js +6 -7
  218. package/plugins/contextMenu/contextMenu.mjs +1 -1
  219. package/plugins/contextMenu/menu/index.js +2 -0
  220. package/plugins/contextMenu/menu/menu.js +10 -5
  221. package/plugins/contextMenu/menu/menu.mjs +11 -6
  222. package/plugins/contextMenu/menu/positioner.js +4 -2
  223. package/plugins/contextMenu/menu/positioner.mjs +4 -2
  224. package/plugins/contextMenu/menu/shortcuts.js +3 -1
  225. package/plugins/contextMenu/menu/shortcuts.mjs +3 -1
  226. package/plugins/contextMenu/predefinedItems/alignment.js +7 -84
  227. package/plugins/contextMenu/predefinedItems/alignment.mjs +8 -85
  228. package/plugins/contextMenu/utils.js +0 -10
  229. package/plugins/contextMenu/utils.mjs +0 -9
  230. package/plugins/copyPaste/copyPaste.d.ts +1 -0
  231. package/plugins/copyPaste/copyPaste.js +32 -23
  232. package/plugins/copyPaste/copyPaste.mjs +24 -15
  233. package/plugins/customBorders/utils.js +2 -0
  234. package/plugins/customBorders/utils.mjs +2 -0
  235. package/plugins/dropdownMenu/dropdownMenu.d.ts +2 -1
  236. package/plugins/dropdownMenu/dropdownMenu.js +6 -7
  237. package/plugins/dropdownMenu/dropdownMenu.mjs +1 -1
  238. package/plugins/exportFile/types/csv.js +1 -0
  239. package/plugins/exportFile/types/csv.mjs +1 -0
  240. package/plugins/filters/component/condition.js +2 -0
  241. package/plugins/filters/component/condition.mjs +2 -0
  242. package/plugins/filters/component/operators.js +2 -0
  243. package/plugins/filters/component/operators.mjs +2 -0
  244. package/plugins/filters/component/value.js +3 -0
  245. package/plugins/filters/component/value.mjs +3 -0
  246. package/plugins/filters/conditionCollection.js +3 -0
  247. package/plugins/filters/conditionCollection.mjs +3 -0
  248. package/plugins/filters/conditionUpdateObserver.js +2 -0
  249. package/plugins/filters/conditionUpdateObserver.mjs +2 -0
  250. package/plugins/filters/filters.js +43 -13
  251. package/plugins/filters/filters.mjs +43 -13
  252. package/plugins/filters/logicalOperations/conjunction.js +2 -0
  253. package/plugins/filters/logicalOperations/conjunction.mjs +2 -0
  254. package/plugins/filters/logicalOperations/disjunction.js +2 -0
  255. package/plugins/filters/logicalOperations/disjunction.mjs +2 -0
  256. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.js +2 -0
  257. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.mjs +2 -0
  258. package/plugins/filters/menu/focusController.js +38 -14
  259. package/plugins/filters/menu/focusController.mjs +38 -14
  260. package/plugins/filters/ui/multipleSelect.js +10 -0
  261. package/plugins/filters/ui/multipleSelect.mjs +10 -0
  262. package/plugins/formulas/engine/register.js +3 -0
  263. package/plugins/formulas/engine/register.mjs +3 -0
  264. package/plugins/formulas/engine/settings.js +3 -0
  265. package/plugins/formulas/engine/settings.mjs +3 -0
  266. package/plugins/formulas/formulas.js +12 -7
  267. package/plugins/formulas/formulas.mjs +6 -1
  268. package/plugins/formulas/indexSyncer/axisSyncer.js +3 -0
  269. package/plugins/formulas/indexSyncer/axisSyncer.mjs +3 -0
  270. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +2 -0
  271. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +2 -0
  272. package/plugins/hiddenColumns/hiddenColumns.js +22 -30
  273. package/plugins/hiddenColumns/hiddenColumns.mjs +18 -26
  274. package/plugins/hiddenRows/contextMenuItem/showRow.js +2 -0
  275. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +2 -0
  276. package/plugins/hiddenRows/hiddenRows.js +21 -29
  277. package/plugins/hiddenRows/hiddenRows.mjs +17 -25
  278. package/plugins/index.d.ts +3 -0
  279. package/plugins/index.js +3 -0
  280. package/plugins/index.mjs +3 -1
  281. package/plugins/manualColumnFreeze/manualColumnFreeze.js +7 -5
  282. package/plugins/manualColumnFreeze/manualColumnFreeze.mjs +3 -1
  283. package/plugins/manualColumnMove/manualColumnMove.js +6 -6
  284. package/plugins/manualColumnMove/manualColumnMove.mjs +4 -4
  285. package/plugins/manualColumnResize/manualColumnResize.js +26 -12
  286. package/plugins/manualColumnResize/manualColumnResize.mjs +26 -12
  287. package/plugins/manualRowMove/manualRowMove.js +8 -6
  288. package/plugins/manualRowMove/manualRowMove.mjs +6 -4
  289. package/plugins/manualRowResize/manualRowResize.js +3 -2
  290. package/plugins/manualRowResize/manualRowResize.mjs +4 -3
  291. package/plugins/mergeCells/cellsCollection.js +19 -3
  292. package/plugins/mergeCells/cellsCollection.mjs +20 -4
  293. package/plugins/mergeCells/mergeCells.d.ts +6 -2
  294. package/plugins/mergeCells/mergeCells.js +84 -56
  295. package/plugins/mergeCells/mergeCells.mjs +82 -54
  296. package/plugins/mergeCells/renderer.js +13 -3
  297. package/plugins/mergeCells/renderer.mjs +13 -3
  298. package/plugins/multiColumnSorting/domHelpers.js +2 -0
  299. package/plugins/multiColumnSorting/domHelpers.mjs +2 -0
  300. package/plugins/nestedHeaders/nestedHeaders.js +63 -16
  301. package/plugins/nestedHeaders/nestedHeaders.mjs +63 -16
  302. package/plugins/nestedHeaders/stateManager/index.js +1 -0
  303. package/plugins/nestedHeaders/stateManager/index.mjs +1 -0
  304. package/plugins/nestedRows/nestedRows.js +3 -0
  305. package/plugins/nestedRows/nestedRows.mjs +3 -0
  306. package/plugins/nestedRows/ui/headers.js +7 -1
  307. package/plugins/nestedRows/ui/headers.mjs +7 -1
  308. package/plugins/nestedRows/utils/rowMoveController.js +4 -0
  309. package/plugins/nestedRows/utils/rowMoveController.mjs +4 -0
  310. package/plugins/persistentState/persistentState.js +4 -4
  311. package/plugins/persistentState/persistentState.mjs +1 -1
  312. package/plugins/stretchColumns/calculator.js +162 -0
  313. package/plugins/stretchColumns/calculator.mjs +158 -0
  314. package/plugins/stretchColumns/index.d.ts +1 -0
  315. package/plugins/stretchColumns/index.js +7 -0
  316. package/plugins/stretchColumns/index.mjs +1 -0
  317. package/plugins/stretchColumns/strategies/_base.js +85 -0
  318. package/plugins/stretchColumns/strategies/_base.mjs +81 -0
  319. package/plugins/stretchColumns/strategies/all.js +71 -0
  320. package/plugins/stretchColumns/strategies/all.mjs +67 -0
  321. package/plugins/stretchColumns/strategies/last.js +79 -0
  322. package/plugins/stretchColumns/strategies/last.mjs +75 -0
  323. package/plugins/stretchColumns/stretchColumns.d.ts +11 -0
  324. package/plugins/stretchColumns/stretchColumns.js +222 -0
  325. package/plugins/stretchColumns/stretchColumns.mjs +218 -0
  326. package/plugins/trimRows/trimRows.js +2 -0
  327. package/plugins/trimRows/trimRows.mjs +2 -0
  328. package/plugins/undoRedo/undoRedo.js +9 -5
  329. package/plugins/undoRedo/undoRedo.mjs +8 -3
  330. package/renderers/checkboxRenderer/checkboxRenderer.js +19 -8
  331. package/renderers/checkboxRenderer/checkboxRenderer.mjs +18 -7
  332. package/selection/index.js +2 -0
  333. package/selection/range.js +2 -0
  334. package/selection/range.mjs +2 -0
  335. package/selection/selection.js +7 -2
  336. package/selection/selection.mjs +7 -2
  337. package/selection/utils.js +2 -0
  338. package/selection/utils.mjs +2 -0
  339. package/settings.d.ts +4 -1
  340. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +1 -1
  341. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +1 -1
  342. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +1 -1
  343. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +1 -1
  344. package/shortcutContexts/commands/index.js +2 -0
  345. package/shortcutContexts/commands/index.mjs +2 -0
  346. package/shortcutContexts/commands/scrollToFocusedCell.js +4 -4
  347. package/shortcutContexts/commands/scrollToFocusedCell.mjs +4 -4
  348. package/shortcutContexts/index.js +2 -0
  349. package/shortcutContexts/index.mjs +2 -0
  350. package/shortcuts/context.js +3 -0
  351. package/shortcuts/context.mjs +3 -0
  352. package/shortcuts/recorder.js +3 -3
  353. package/shortcuts/recorder.mjs +3 -3
  354. package/shortcuts/utils.js +1 -0
  355. package/shortcuts/utils.mjs +1 -0
  356. package/styles/handsontable.css +2307 -0
  357. package/styles/handsontable.min.css +30 -0
  358. package/styles/ht-theme-horizon.css +607 -0
  359. package/styles/ht-theme-horizon.min.css +30 -0
  360. package/styles/ht-theme-main.css +613 -0
  361. package/styles/ht-theme-main.min.css +30 -0
  362. package/tableView.js +205 -33
  363. package/tableView.mjs +206 -34
  364. package/translations/changesObservable/observable.js +2 -0
  365. package/translations/changesObservable/observable.mjs +2 -0
  366. package/translations/index.js +2 -0
  367. package/translations/indexMapper.js +4 -0
  368. package/translations/indexMapper.mjs +4 -0
  369. package/translations/mapCollections/index.js +2 -0
  370. package/translations/mapCollections/mapCollection.js +2 -0
  371. package/translations/mapCollections/mapCollection.mjs +2 -0
  372. package/translations/maps/index.js +2 -0
  373. package/translations/maps/linkedPhysicalIndexToValueMap.js +1 -0
  374. package/translations/maps/linkedPhysicalIndexToValueMap.mjs +1 -0
  375. package/translations/maps/utils/actionsOnIndexes.js +2 -0
  376. package/translations/maps/utils/actionsOnIndexes.mjs +2 -0
  377. package/translations/maps/utils/physicallyIndexed.js +1 -0
  378. package/translations/maps/utils/physicallyIndexed.mjs +1 -0
  379. package/utils/autoResize.js +11 -3
  380. package/utils/autoResize.mjs +11 -3
  381. package/utils/dataStructures/priorityMap.js +1 -0
  382. package/utils/dataStructures/priorityMap.mjs +1 -0
  383. package/utils/dataStructures/uniqueMap.js +2 -0
  384. package/utils/dataStructures/uniqueMap.mjs +2 -0
  385. package/utils/ghostTable.js +7 -3
  386. package/utils/ghostTable.mjs +7 -3
  387. package/utils/parseTable.js +4 -0
  388. package/utils/parseTable.mjs +4 -0
  389. package/3rdparty/walkontable/src/selection/border/constants.js +0 -15
  390. package/3rdparty/walkontable/src/selection/border/constants.mjs +0 -12
  391. package/3rdparty/walkontable/src/utils/columnStretching.js +0 -197
  392. package/3rdparty/walkontable/src/utils/columnStretching.mjs +0 -193
@@ -7,6 +7,11 @@ import "core-js/modules/es.set.is-subset-of.v2.js";
7
7
  import "core-js/modules/es.set.is-superset-of.v2.js";
8
8
  import "core-js/modules/es.set.symmetric-difference.v2.js";
9
9
  import "core-js/modules/es.set.union.v2.js";
10
+ import "core-js/modules/esnext.iterator.constructor.js";
11
+ import "core-js/modules/esnext.iterator.filter.js";
12
+ import "core-js/modules/esnext.iterator.for-each.js";
13
+ import "core-js/modules/esnext.iterator.map.js";
14
+ import "core-js/modules/esnext.iterator.reduce.js";
10
15
  function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
11
16
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
12
17
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -16,8 +21,8 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
16
21
  function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
17
22
  function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
18
23
  function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
19
- import { BasePlugin } from "../base/index.mjs";
20
- import Hooks from "../../pluginHooks.mjs";
24
+ import { BasePlugin, defaultMainSettingSymbol } from "../base/index.mjs";
25
+ import { Hooks } from "../../core/hooks/index.mjs";
21
26
  import MergedCellsCollection from "./cellsCollection.mjs";
22
27
  import MergedCellCoords from "./cellCoords.mjs";
23
28
  import AutofillCalculations from "./calculations/autofill.mjs";
@@ -26,7 +31,7 @@ import toggleMergeItem from "./contextMenuItem/toggleMerge.mjs";
26
31
  import { arrayEach } from "../../helpers/array.mjs";
27
32
  import { isObject } from "../../helpers/object.mjs";
28
33
  import { warn } from "../../helpers/console.mjs";
29
- import { rangeEach } from "../../helpers/number.mjs";
34
+ import { rangeEach, clamp } from "../../helpers/number.mjs";
30
35
  import { getStyle } from "../../helpers/dom/element.mjs";
31
36
  import { isChrome } from "../../helpers/browser.mjs";
32
37
  import { FocusOrder } from "./focusOrder.mjs";
@@ -149,6 +154,13 @@ export class MergeCells extends BasePlugin {
149
154
  static get PLUGIN_PRIORITY() {
150
155
  return PLUGIN_PRIORITY;
151
156
  }
157
+ static get DEFAULT_SETTINGS() {
158
+ return {
159
+ [defaultMainSettingSymbol]: 'cells',
160
+ virtualized: false,
161
+ cells: []
162
+ };
163
+ }
152
164
  /**
153
165
  * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit}
154
166
  * hook and if it returns `true` then the {@link MergeCells#enablePlugin} method is called.
@@ -236,102 +248,108 @@ export class MergeCells extends BasePlugin {
236
248
  }
237
249
  return _assertClassBrand(_MergeCells_brand, _this, _onModifyGetCellCoords).call(_this, ...args);
238
250
  });
239
- this.addHook('afterIsMultipleSelection', function () {
251
+ this.addHook('modifyGetCoordsElement', function () {
240
252
  for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
241
253
  args[_key12] = arguments[_key12];
242
254
  }
255
+ return _assertClassBrand(_MergeCells_brand, _this, _onModifyGetCellCoords).call(_this, ...args);
256
+ });
257
+ this.addHook('afterIsMultipleSelection', function () {
258
+ for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
259
+ args[_key13] = arguments[_key13];
260
+ }
243
261
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterIsMultipleSelection).call(_this, ...args);
244
262
  });
245
263
  this.addHook('afterRenderer', function () {
246
264
  return _classPrivateFieldGet(_cellRenderer, _this).after(...arguments);
247
265
  });
248
266
  this.addHook('afterContextMenuDefaultOptions', function () {
249
- for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
250
- args[_key13] = arguments[_key13];
267
+ for (var _len14 = arguments.length, args = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {
268
+ args[_key14] = arguments[_key14];
251
269
  }
252
270
  return _assertClassBrand(_MergeCells_brand, _this, _addMergeActionsToContextMenu).call(_this, ...args);
253
271
  });
254
272
  this.addHook('afterGetCellMeta', function () {
255
- for (var _len14 = arguments.length, args = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {
256
- args[_key14] = arguments[_key14];
273
+ for (var _len15 = arguments.length, args = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {
274
+ args[_key15] = arguments[_key15];
257
275
  }
258
276
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterGetCellMeta).call(_this, ...args);
259
277
  });
260
278
  this.addHook('afterViewportRowCalculatorOverride', function () {
261
- for (var _len15 = arguments.length, args = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {
262
- args[_key15] = arguments[_key15];
279
+ for (var _len16 = arguments.length, args = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) {
280
+ args[_key16] = arguments[_key16];
263
281
  }
264
282
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterViewportRowCalculatorOverride).call(_this, ...args);
265
283
  });
266
284
  this.addHook('afterViewportColumnCalculatorOverride', function () {
267
- for (var _len16 = arguments.length, args = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) {
268
- args[_key16] = arguments[_key16];
285
+ for (var _len17 = arguments.length, args = new Array(_len17), _key17 = 0; _key17 < _len17; _key17++) {
286
+ args[_key17] = arguments[_key17];
269
287
  }
270
288
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterViewportColumnCalculatorOverride).call(_this, ...args);
271
289
  });
272
290
  this.addHook('modifyAutofillRange', function () {
273
- for (var _len17 = arguments.length, args = new Array(_len17), _key17 = 0; _key17 < _len17; _key17++) {
274
- args[_key17] = arguments[_key17];
291
+ for (var _len18 = arguments.length, args = new Array(_len18), _key18 = 0; _key18 < _len18; _key18++) {
292
+ args[_key18] = arguments[_key18];
275
293
  }
276
294
  return _assertClassBrand(_MergeCells_brand, _this, _onModifyAutofillRange).call(_this, ...args);
277
295
  });
278
296
  this.addHook('afterCreateCol', function () {
279
- for (var _len18 = arguments.length, args = new Array(_len18), _key18 = 0; _key18 < _len18; _key18++) {
280
- args[_key18] = arguments[_key18];
297
+ for (var _len19 = arguments.length, args = new Array(_len19), _key19 = 0; _key19 < _len19; _key19++) {
298
+ args[_key19] = arguments[_key19];
281
299
  }
282
300
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterCreateCol).call(_this, ...args);
283
301
  });
284
302
  this.addHook('afterRemoveCol', function () {
285
- for (var _len19 = arguments.length, args = new Array(_len19), _key19 = 0; _key19 < _len19; _key19++) {
286
- args[_key19] = arguments[_key19];
303
+ for (var _len20 = arguments.length, args = new Array(_len20), _key20 = 0; _key20 < _len20; _key20++) {
304
+ args[_key20] = arguments[_key20];
287
305
  }
288
306
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterRemoveCol).call(_this, ...args);
289
307
  });
290
308
  this.addHook('afterCreateRow', function () {
291
- for (var _len20 = arguments.length, args = new Array(_len20), _key20 = 0; _key20 < _len20; _key20++) {
292
- args[_key20] = arguments[_key20];
309
+ for (var _len21 = arguments.length, args = new Array(_len21), _key21 = 0; _key21 < _len21; _key21++) {
310
+ args[_key21] = arguments[_key21];
293
311
  }
294
312
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterCreateRow).call(_this, ...args);
295
313
  });
296
314
  this.addHook('afterRemoveRow', function () {
297
- for (var _len21 = arguments.length, args = new Array(_len21), _key21 = 0; _key21 < _len21; _key21++) {
298
- args[_key21] = arguments[_key21];
315
+ for (var _len22 = arguments.length, args = new Array(_len22), _key22 = 0; _key22 < _len22; _key22++) {
316
+ args[_key22] = arguments[_key22];
299
317
  }
300
318
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterRemoveRow).call(_this, ...args);
301
319
  });
302
320
  this.addHook('afterChange', function () {
303
- for (var _len22 = arguments.length, args = new Array(_len22), _key22 = 0; _key22 < _len22; _key22++) {
304
- args[_key22] = arguments[_key22];
321
+ for (var _len23 = arguments.length, args = new Array(_len23), _key23 = 0; _key23 < _len23; _key23++) {
322
+ args[_key23] = arguments[_key23];
305
323
  }
306
324
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterChange).call(_this, ...args);
307
325
  });
308
326
  this.addHook('beforeDrawBorders', function () {
309
- for (var _len23 = arguments.length, args = new Array(_len23), _key23 = 0; _key23 < _len23; _key23++) {
310
- args[_key23] = arguments[_key23];
327
+ for (var _len24 = arguments.length, args = new Array(_len24), _key24 = 0; _key24 < _len24; _key24++) {
328
+ args[_key24] = arguments[_key24];
311
329
  }
312
330
  return _assertClassBrand(_MergeCells_brand, _this, _onBeforeDrawAreaBorders).call(_this, ...args);
313
331
  });
314
332
  this.addHook('afterDrawSelection', function () {
315
- for (var _len24 = arguments.length, args = new Array(_len24), _key24 = 0; _key24 < _len24; _key24++) {
316
- args[_key24] = arguments[_key24];
333
+ for (var _len25 = arguments.length, args = new Array(_len25), _key25 = 0; _key25 < _len25; _key25++) {
334
+ args[_key25] = arguments[_key25];
317
335
  }
318
336
  return _assertClassBrand(_MergeCells_brand, _this, _onAfterDrawSelection).call(_this, ...args);
319
337
  });
320
338
  this.addHook('beforeRemoveCellClassNames', function () {
321
- for (var _len25 = arguments.length, args = new Array(_len25), _key25 = 0; _key25 < _len25; _key25++) {
322
- args[_key25] = arguments[_key25];
339
+ for (var _len26 = arguments.length, args = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) {
340
+ args[_key26] = arguments[_key26];
323
341
  }
324
342
  return _assertClassBrand(_MergeCells_brand, _this, _onBeforeRemoveCellClassNames).call(_this, ...args);
325
343
  });
326
344
  this.addHook('beforeBeginEditing', function () {
327
- for (var _len26 = arguments.length, args = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) {
328
- args[_key26] = arguments[_key26];
345
+ for (var _len27 = arguments.length, args = new Array(_len27), _key27 = 0; _key27 < _len27; _key27++) {
346
+ args[_key27] = arguments[_key27];
329
347
  }
330
348
  return _assertClassBrand(_MergeCells_brand, _this, _onBeforeBeginEditing).call(_this, ...args);
331
349
  });
332
350
  this.addHook('modifyRowHeightByOverlayName', function () {
333
- for (var _len27 = arguments.length, args = new Array(_len27), _key27 = 0; _key27 < _len27; _key27++) {
334
- args[_key27] = arguments[_key27];
351
+ for (var _len28 = arguments.length, args = new Array(_len28), _key28 = 0; _key28 < _len28; _key28++) {
352
+ args[_key28] = arguments[_key28];
335
353
  }
336
354
  return _assertClassBrand(_MergeCells_brand, _this, _onModifyRowHeightByOverlayName).call(_this, ...args);
337
355
  });
@@ -362,10 +380,9 @@ export class MergeCells extends BasePlugin {
362
380
  * - [`mergeCells`](@/api/options.md#mergecells)
363
381
  */
364
382
  updatePlugin() {
365
- const settings = this.hot.getSettings()[PLUGIN_KEY];
366
383
  this.disablePlugin();
367
384
  this.enablePlugin();
368
- this.generateFromSettings(settings);
385
+ this.generateFromSettings();
369
386
  super.updatePlugin();
370
387
  }
371
388
 
@@ -450,13 +467,9 @@ export class MergeCells extends BasePlugin {
450
467
  * Generates the merged cells from the settings provided to the plugin.
451
468
  *
452
469
  * @private
453
- * @param {Array|boolean} settings The settings provided to the plugin.
454
470
  */
455
- generateFromSettings(settings) {
456
- if (!Array.isArray(settings)) {
457
- return;
458
- }
459
- const validSettings = settings.filter(mergeCellInfo => this.validateSetting(mergeCellInfo));
471
+ generateFromSettings() {
472
+ const validSettings = this.getSetting('cells').filter(mergeCellInfo => this.validateSetting(mergeCellInfo));
460
473
  const nonOverlappingSettings = this.mergedCellsCollection.filterOverlappingMergeCells(validSettings);
461
474
  const populatedNulls = [];
462
475
  nonOverlappingSettings.forEach(mergeCellInfo => {
@@ -898,7 +911,7 @@ export class MergeCells extends BasePlugin {
898
911
  */
899
912
  }
900
913
  function _onAfterInit() {
901
- this.generateFromSettings(this.hot.getSettings()[PLUGIN_KEY]);
914
+ this.generateFromSettings();
902
915
  this.hot.render();
903
916
  }
904
917
  function _onAfterIsMultipleSelection(isMultiple) {
@@ -1092,13 +1105,16 @@ function _onBeforeSelectionHighlightSet() {
1092
1105
  }
1093
1106
  }
1094
1107
  /**
1095
- * `modifyGetCellCoords` hook callback. Swaps the `getCell` coords with the merged parent coords.
1108
+ * The `modifyGetCellCoords` hook callback allows forwarding all `getCell` calls that point in-between the merged cells
1109
+ * to the root element of the cell.
1096
1110
  *
1097
1111
  * @param {number} row Row index.
1098
1112
  * @param {number} column Visual column index.
1113
+ * @param {boolean} topmost Indicates if the requested element belongs to the topmost layer (any overlay) or not.
1114
+ * @param {string} [source] String that identifies how this coords change will be processed.
1099
1115
  * @returns {Array|undefined} Visual coordinates of the merge.
1100
1116
  */
1101
- function _onModifyGetCellCoords(row, column) {
1117
+ function _onModifyGetCellCoords(row, column, topmost, source) {
1102
1118
  if (row < 0 || column < 0) {
1103
1119
  return;
1104
1120
  }
@@ -1112,11 +1128,17 @@ function _onModifyGetCellCoords(row, column) {
1112
1128
  colspan,
1113
1129
  rowspan
1114
1130
  } = mergeParent;
1115
- return [
1116
- // Most top-left merged cell coords.
1117
- mergeRow, mergeColumn,
1118
- // Most bottom-right merged cell coords.
1119
- mergeRow + rowspan - 1, mergeColumn + colspan - 1];
1131
+ const topStartRow = mergeRow;
1132
+ const topStartColumn = mergeColumn;
1133
+ const bottomEndRow = mergeRow + rowspan - 1;
1134
+ const bottomEndColumn = mergeColumn + colspan - 1;
1135
+ if (source === 'render' && this.getSetting('virtualized')) {
1136
+ const overlayName = this.hot.view.getActiveOverlayName();
1137
+ const firstRenderedRow = ['top', 'top_inline_start_corner'].includes(overlayName) ? 0 : this.hot.getFirstRenderedVisibleRow();
1138
+ const firstRenderedColumn = ['inline_start', 'top_inline_start_corner', 'bottom_inline_start_corner'].includes(overlayName) ? 0 : this.hot.getFirstRenderedVisibleColumn();
1139
+ return [clamp(firstRenderedRow, topStartRow, bottomEndRow), clamp(firstRenderedColumn, topStartColumn, bottomEndColumn), clamp(this.hot.getLastRenderedVisibleRow(), topStartRow, bottomEndRow), clamp(this.hot.getLastRenderedVisibleColumn(), topStartColumn, bottomEndColumn)];
1140
+ }
1141
+ return [topStartRow, topStartColumn, bottomEndRow, bottomEndColumn];
1120
1142
  }
1121
1143
  /**
1122
1144
  * `afterContextMenuDefaultOptions` hook callback.
@@ -1252,11 +1274,17 @@ function _onAfterGetCellMeta(row, col, cellProperties) {
1252
1274
  * @param {object} calc The row calculator object.
1253
1275
  */
1254
1276
  function _onAfterViewportRowCalculatorOverride(calc) {
1277
+ if (this.getSetting('virtualized')) {
1278
+ return;
1279
+ }
1255
1280
  const nrOfColumns = this.hot.countCols();
1256
1281
  this.modifyViewportRowStart(calc, nrOfColumns);
1257
1282
  this.modifyViewportRowEnd(calc, nrOfColumns);
1258
1283
  }
1259
1284
  function _onAfterViewportColumnCalculatorOverride(calc) {
1285
+ if (this.getSetting('virtualized')) {
1286
+ return;
1287
+ }
1260
1288
  const nrOfRows = this.hot.countRows();
1261
1289
  this.modifyViewportColumnStart(calc, nrOfRows);
1262
1290
  this.modifyViewportColumnEnd(calc, nrOfRows);
@@ -1415,8 +1443,8 @@ function _onModifyRowHeightByOverlayName(height, row, overlayType) {
1415
1443
  let firstColumn;
1416
1444
  let lastColumn;
1417
1445
  if (overlayType === 'master') {
1418
- firstColumn = this.hot.view.getFirstRenderedVisibleColumn();
1419
- lastColumn = this.hot.view.getLastRenderedVisibleColumn();
1446
+ firstColumn = this.hot.getFirstRenderedVisibleColumn();
1447
+ lastColumn = this.hot.getLastRenderedVisibleColumn();
1420
1448
  } else {
1421
1449
  const activeOverlay = this.hot.view.getOverlayByName(overlayType);
1422
1450
  firstColumn = this.hot.columnIndexMapper.getVisualFromRenderableIndex(activeOverlay.clone.wtTable.getFirstRenderedColumn());
@@ -1429,7 +1457,7 @@ function _onModifyRowHeightByOverlayName(height, row, overlayType) {
1429
1457
  const from = this.hot._createCellCoords(row, firstColumn);
1430
1458
  const to = this.hot._createCellCoords(row, lastColumn);
1431
1459
  const viewportRange = this.hot._createCellRange(from, from, to);
1432
- const mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(viewportRange);
1460
+ const mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(viewportRange, true);
1433
1461
  const maxRowspan = mergedCellsWithinRange.reduce((acc, _ref) => {
1434
1462
  let {
1435
1463
  rowspan
@@ -1463,7 +1491,7 @@ function _onModifyRowHeightByOverlayName(height, row, overlayType) {
1463
1491
  * @returns {number}
1464
1492
  */
1465
1493
  function _sumCellsHeights(row, rowspan) {
1466
- const defaultHeight = this.hot.view._wt.wtSettings.getSettingPure('defaultRowHeight');
1494
+ const defaultHeight = this.hot.view.getDefaultRowHeight();
1467
1495
  const autoRowSizePlugin = this.hot.getPlugin('autoRowSize');
1468
1496
  let height = 0;
1469
1497
  for (let i = row; i < row + rowspan; i++) {
@@ -31,7 +31,7 @@ function createMergeCellRenderer(plugin) {
31
31
  *
32
32
  * @private
33
33
  * @param {HTMLElement} TD The cell to be modified.
34
- * @param {number} row Row index.
34
+ * @param {number} row Visual row index.
35
35
  * @param {number} col Visual column index.
36
36
  */
37
37
  function after(TD, row, col) {
@@ -49,13 +49,23 @@ function createMergeCellRenderer(plugin) {
49
49
  rowspan: origRowspan
50
50
  } = mergedCell;
51
51
  const [lastMergedRowIndex, lastMergedColumnIndex] = plugin.translateMergedCellToRenderable(origRow, origRowspan, origColumn, origColspan);
52
+ const isVirtualRenderingEnabled = plugin.getSetting('virtualized');
52
53
  const renderedRowIndex = rowMapper.getRenderableFromVisualIndex(row);
53
54
  const renderedColumnIndex = columnMapper.getRenderableFromVisualIndex(col);
54
55
  const maxRowSpan = lastMergedRowIndex - renderedRowIndex + 1; // Number of rendered columns.
55
56
  const maxColSpan = lastMergedColumnIndex - renderedColumnIndex + 1; // Number of rendered columns.
56
57
 
57
- const notHiddenRow = rowMapper.getNearestNotHiddenIndex(origRow, 1);
58
- const notHiddenColumn = columnMapper.getNearestNotHiddenIndex(origColumn, 1);
58
+ let notHiddenRow = rowMapper.getNearestNotHiddenIndex(origRow, 1);
59
+ let notHiddenColumn = columnMapper.getNearestNotHiddenIndex(origColumn, 1);
60
+ if (isVirtualRenderingEnabled) {
61
+ const overlayName = hot.view.getActiveOverlayName();
62
+ if (!['top', 'top_inline_start_corner'].includes(overlayName)) {
63
+ notHiddenRow = Math.max(notHiddenRow, hot.getFirstRenderedVisibleRow());
64
+ }
65
+ if (!['inline_start', 'top_inline_start_corner', 'bottom_inline_start_corner'].includes(overlayName)) {
66
+ notHiddenColumn = Math.max(notHiddenColumn, hot.getFirstRenderedVisibleColumn());
67
+ }
68
+ }
59
69
  const notHiddenRowspan = Math.min(origRowspan, maxRowSpan);
60
70
  const notHiddenColspan = Math.min(origColspan, maxColSpan);
61
71
  if (notHiddenRow === row && notHiddenColumn === col) {
@@ -27,7 +27,7 @@ export function createMergeCellRenderer(plugin) {
27
27
  *
28
28
  * @private
29
29
  * @param {HTMLElement} TD The cell to be modified.
30
- * @param {number} row Row index.
30
+ * @param {number} row Visual row index.
31
31
  * @param {number} col Visual column index.
32
32
  */
33
33
  function after(TD, row, col) {
@@ -45,13 +45,23 @@ export function createMergeCellRenderer(plugin) {
45
45
  rowspan: origRowspan
46
46
  } = mergedCell;
47
47
  const [lastMergedRowIndex, lastMergedColumnIndex] = plugin.translateMergedCellToRenderable(origRow, origRowspan, origColumn, origColspan);
48
+ const isVirtualRenderingEnabled = plugin.getSetting('virtualized');
48
49
  const renderedRowIndex = rowMapper.getRenderableFromVisualIndex(row);
49
50
  const renderedColumnIndex = columnMapper.getRenderableFromVisualIndex(col);
50
51
  const maxRowSpan = lastMergedRowIndex - renderedRowIndex + 1; // Number of rendered columns.
51
52
  const maxColSpan = lastMergedColumnIndex - renderedColumnIndex + 1; // Number of rendered columns.
52
53
 
53
- const notHiddenRow = rowMapper.getNearestNotHiddenIndex(origRow, 1);
54
- const notHiddenColumn = columnMapper.getNearestNotHiddenIndex(origColumn, 1);
54
+ let notHiddenRow = rowMapper.getNearestNotHiddenIndex(origRow, 1);
55
+ let notHiddenColumn = columnMapper.getNearestNotHiddenIndex(origColumn, 1);
56
+ if (isVirtualRenderingEnabled) {
57
+ const overlayName = hot.view.getActiveOverlayName();
58
+ if (!['top', 'top_inline_start_corner'].includes(overlayName)) {
59
+ notHiddenRow = Math.max(notHiddenRow, hot.getFirstRenderedVisibleRow());
60
+ }
61
+ if (!['inline_start', 'top_inline_start_corner', 'bottom_inline_start_corner'].includes(overlayName)) {
62
+ notHiddenColumn = Math.max(notHiddenColumn, hot.getFirstRenderedVisibleColumn());
63
+ }
64
+ }
55
65
  const notHiddenRowspan = Math.min(origRowspan, maxRowSpan);
56
66
  const notHiddenColspan = Math.min(origColspan, maxColSpan);
57
67
  if (notHiddenRow === row && notHiddenColumn === col) {
@@ -4,6 +4,8 @@ exports.__esModule = true;
4
4
  exports.getClassesToAdd = getClassesToAdd;
5
5
  exports.getClassesToRemove = getClassesToRemove;
6
6
  require("core-js/modules/es.array.push.js");
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.filter.js");
7
9
  const COLUMN_ORDER_PREFIX = 'sort';
8
10
 
9
11
  /**
@@ -1,4 +1,6 @@
1
1
  import "core-js/modules/es.array.push.js";
2
+ import "core-js/modules/esnext.iterator.constructor.js";
3
+ import "core-js/modules/esnext.iterator.filter.js";
2
4
  const COLUMN_ORDER_PREFIX = 'sort';
3
5
 
4
6
  /**
@@ -3,6 +3,8 @@
3
3
  exports.__esModule = true;
4
4
  require("core-js/modules/es.error.cause.js");
5
5
  require("core-js/modules/es.array.push.js");
6
+ require("core-js/modules/esnext.iterator.constructor.js");
7
+ require("core-js/modules/esnext.iterator.for-each.js");
6
8
  var _element = require("../../helpers/dom/element");
7
9
  var _number = require("../../helpers/number");
8
10
  var _templateLiteralTag = require("../../helpers/templateLiteralTag");
@@ -75,6 +77,7 @@ var _stateManager = /*#__PURE__*/new WeakMap();
75
77
  var _hidingIndexMapObserver = /*#__PURE__*/new WeakMap();
76
78
  var _focusInitialCoords = /*#__PURE__*/new WeakMap();
77
79
  var _isColumnsSelectionInProgress = /*#__PURE__*/new WeakMap();
80
+ var _recentlyHighlightCoords = /*#__PURE__*/new WeakMap();
78
81
  var _NestedHeaders_brand = /*#__PURE__*/new WeakSet();
79
82
  class NestedHeaders extends _base.BasePlugin {
80
83
  constructor() {
@@ -109,6 +112,14 @@ class NestedHeaders extends _base.BasePlugin {
109
112
  * @type {boolean}
110
113
  */
111
114
  _classPrivateFieldInitSpec(this, _isColumnsSelectionInProgress, false);
115
+ /**
116
+ * Keeps the last highlight position made by column selection. The coords are necessary to scroll
117
+ * the viewport to the correct position when the nested header is clicked when the `navigableHeaders`
118
+ * option is disabled.
119
+ *
120
+ * @type {CellCoords | null}
121
+ */
122
+ _classPrivateFieldInitSpec(this, _recentlyHighlightCoords, null);
112
123
  /**
113
124
  * Custom helper for getting widths of the nested headers.
114
125
  *
@@ -529,9 +540,13 @@ function _updateFocusHighlightPosition() {
529
540
  * indexes are used.
530
541
  *
531
542
  * @param {number} visualColumn A visual column index to which the viewport will be scrolled.
543
+ * @param {{ value: 'auto' | 'start' | 'end' }} snapping If `'start'`, viewport is scrolled to show
544
+ * the cell on the left of the table. If `'end'`, viewport is scrolled to show the cell on the right of
545
+ * the table. When `'auto'`, the viewport is scrolled only when the column is outside of the viewport.
532
546
  * @returns {number}
533
547
  */
534
- function _onBeforeViewportScrollHorizontally(visualColumn) {
548
+ function _onBeforeViewportScrollHorizontally(visualColumn, snapping) {
549
+ var _classPrivateFieldGet4;
535
550
  const selection = this.hot.getSelectedRangeLast();
536
551
  if (!selection) {
537
552
  return visualColumn;
@@ -539,20 +554,50 @@ function _onBeforeViewportScrollHorizontally(visualColumn) {
539
554
  const {
540
555
  highlight
541
556
  } = selection;
542
- const isNestedHeadersRange = highlight.isHeader() && highlight.col >= 0;
557
+ const {
558
+ navigableHeaders
559
+ } = this.hot.getSettings();
560
+ const isSelectedByColumnHeader = this.hot.selection.isSelectedByColumnHeader();
561
+ const highlightRow = navigableHeaders ? highlight.row : (_classPrivateFieldGet4 = _classPrivateFieldGet(_recentlyHighlightCoords, this)) === null || _classPrivateFieldGet4 === void 0 ? void 0 : _classPrivateFieldGet4.row;
562
+ const highlightColumn = isSelectedByColumnHeader ? visualColumn : highlight.col;
563
+ const isNestedHeadersRange = highlightRow < 0 && highlightColumn >= 0;
564
+ _classPrivateFieldSet(_recentlyHighlightCoords, this, null);
543
565
  if (!isNestedHeadersRange) {
544
566
  return visualColumn;
545
567
  }
546
- const firstColumn = this.hot.view.getFirstFullyVisibleColumn();
547
- const lastColumn = this.hot.view.getLastFullyVisibleColumn();
548
- const mostLeftColumnIndex = _classPrivateFieldGet(_stateManager, this).findLeftMostColumnIndex(highlight.row, highlight.col);
549
- const mostRightColumnIndex = _classPrivateFieldGet(_stateManager, this).findRightMostColumnIndex(highlight.row, highlight.col);
568
+ const firstVisibleColumn = this.hot.getFirstFullyVisibleColumn();
569
+ const lastVisibleColumn = this.hot.getLastFullyVisibleColumn();
570
+ const viewportWidth = lastVisibleColumn - firstVisibleColumn + 1;
571
+ const mostLeftColumnIndex = _classPrivateFieldGet(_stateManager, this).findLeftMostColumnIndex(highlightRow, highlightColumn);
572
+ const mostRightColumnIndex = _classPrivateFieldGet(_stateManager, this).findRightMostColumnIndex(highlightRow, highlightColumn);
573
+ const headerWidth = mostRightColumnIndex - mostLeftColumnIndex + 1;
550
574
 
551
- // do not scroll the viewport when the header is wider than the viewport
552
- if (mostLeftColumnIndex < firstColumn && mostRightColumnIndex > lastColumn) {
553
- return visualColumn;
575
+ // scroll the viewport always to the left when the header is wider than the viewport
576
+ if (mostLeftColumnIndex < firstVisibleColumn && mostRightColumnIndex > lastVisibleColumn) {
577
+ return mostLeftColumnIndex;
578
+ }
579
+ if (isSelectedByColumnHeader) {
580
+ let scrollColumnIndex = null;
581
+ if (mostLeftColumnIndex >= firstVisibleColumn && mostRightColumnIndex > lastVisibleColumn) {
582
+ if (headerWidth > viewportWidth) {
583
+ snapping.value = 'start';
584
+ scrollColumnIndex = mostLeftColumnIndex;
585
+ } else {
586
+ snapping.value = 'end';
587
+ scrollColumnIndex = mostRightColumnIndex;
588
+ }
589
+ } else if (mostLeftColumnIndex < firstVisibleColumn && mostRightColumnIndex <= lastVisibleColumn) {
590
+ if (headerWidth > viewportWidth) {
591
+ snapping.value = 'end';
592
+ scrollColumnIndex = mostRightColumnIndex;
593
+ } else {
594
+ snapping.value = 'start';
595
+ scrollColumnIndex = mostLeftColumnIndex;
596
+ }
597
+ }
598
+ return scrollColumnIndex;
554
599
  }
555
- return mostLeftColumnIndex < firstColumn ? mostLeftColumnIndex : mostRightColumnIndex;
600
+ return mostLeftColumnIndex <= firstVisibleColumn ? mostLeftColumnIndex : mostRightColumnIndex;
556
601
  }
557
602
  /**
558
603
  * Allows to control which header DOM element will be used to highlight.
@@ -623,13 +668,13 @@ function _onBeforeCopy(data, copyableRanges, _ref2) {
623
668
  }
624
669
  for (let column = startCol; column <= endCol; column++) {
625
670
  for (let row = startRow; row <= endRow; row++) {
626
- var _classPrivateFieldGet4;
671
+ var _classPrivateFieldGet5;
627
672
  const zeroBasedColumnHeaderLevel = rowsCount + row;
628
673
  const zeroBasedColumnIndex = column - startCol;
629
674
  if (zeroBasedColumnIndex === 0) {
630
675
  continue; // eslint-disable-line no-continue
631
676
  }
632
- const isRoot = (_classPrivateFieldGet4 = _classPrivateFieldGet(_stateManager, this).getHeaderTreeNodeData(row, column)) === null || _classPrivateFieldGet4 === void 0 ? void 0 : _classPrivateFieldGet4.isRoot;
677
+ const isRoot = (_classPrivateFieldGet5 = _classPrivateFieldGet(_stateManager, this).getHeaderTreeNodeData(row, column)) === null || _classPrivateFieldGet5 === void 0 ? void 0 : _classPrivateFieldGet5.isRoot;
633
678
  if (isRoot === false) {
634
679
  data[zeroBasedColumnHeaderLevel][zeroBasedColumnIndex] = '';
635
680
  }
@@ -707,7 +752,7 @@ function _onAfterOnCellMouseDown(event, coords) {
707
752
  * a boolean value that allows or disallows changing the selection for that particular area.
708
753
  */
709
754
  function _onBeforeOnCellMouseOver(event, coords, TD, controller) {
710
- if (!this.hot.view.isMouseDown()) {
755
+ if (!this.hot.view.isMouseDown() || controller.column) {
711
756
  return;
712
757
  }
713
758
  const headerNodeData = this._getHeaderTreeNodeDataByCoords(coords);
@@ -815,8 +860,9 @@ function _onModifyTransformStart(delta) {
815
860
  *
816
861
  * @param {CellCoords} from The coords object where the selection starts.
817
862
  * @param {CellCoords} to The coords object where the selection ends.
863
+ * @param {CellCoords} highlight The coords object where the focus is.
818
864
  */
819
- function _onBeforeSelectColumns(from, to) {
865
+ function _onBeforeSelectColumns(from, to, highlight) {
820
866
  const headerLevel = from.row;
821
867
  const startNodeData = this._getHeaderTreeNodeDataByCoords({
822
868
  row: headerLevel,
@@ -826,6 +872,7 @@ function _onBeforeSelectColumns(from, to) {
826
872
  row: headerLevel,
827
873
  col: to.col
828
874
  });
875
+ _classPrivateFieldSet(_recentlyHighlightCoords, this, highlight.clone());
829
876
  if (to.col < from.col) {
830
877
  // Column selection from right to left
831
878
  if (startNodeData) {
@@ -910,10 +957,10 @@ function _onModifyColWidth(width, column) {
910
957
  * @returns {string} Returns the column header value to update.
911
958
  */
912
959
  function _onModifyColumnHeaderValue(value, visualColumnIndex, headerLevel) {
913
- var _classPrivateFieldGet5;
960
+ var _classPrivateFieldGet6;
914
961
  const {
915
962
  label
916
- } = (_classPrivateFieldGet5 = _classPrivateFieldGet(_stateManager, this).getHeaderTreeNodeData(headerLevel, visualColumnIndex)) !== null && _classPrivateFieldGet5 !== void 0 ? _classPrivateFieldGet5 : {
963
+ } = (_classPrivateFieldGet6 = _classPrivateFieldGet(_stateManager, this).getHeaderTreeNodeData(headerLevel, visualColumnIndex)) !== null && _classPrivateFieldGet6 !== void 0 ? _classPrivateFieldGet6 : {
917
964
  label: ''
918
965
  };
919
966
  return label;