handsontable 12.1.3 → 12.3.0-next-bb1a7c2-20221208

Sign up to get free protection for your applications and to get access to all the features.
Files changed (948) hide show
  1. package/3rdparty/SheetClip/SheetClip.js +3 -32
  2. package/3rdparty/SheetClip/SheetClip.mjs +3 -23
  3. package/3rdparty/SheetClip/index.js +0 -2
  4. package/3rdparty/autoResize/autoResize.js +119 -145
  5. package/3rdparty/autoResize/autoResize.mjs +119 -143
  6. package/3rdparty/autoResize/index.js +0 -2
  7. package/3rdparty/walkontable/src/border.js +44 -154
  8. package/3rdparty/walkontable/src/border.mjs +41 -136
  9. package/3rdparty/walkontable/src/calculator/constants.js +0 -3
  10. package/3rdparty/walkontable/src/calculator/constants.mjs +0 -2
  11. package/3rdparty/walkontable/src/calculator/index.js +0 -10
  12. package/3rdparty/walkontable/src/calculator/viewportColumns.js +36 -77
  13. package/3rdparty/walkontable/src/calculator/viewportColumns.mjs +36 -70
  14. package/3rdparty/walkontable/src/calculator/viewportRows.js +30 -49
  15. package/3rdparty/walkontable/src/calculator/viewportRows.mjs +30 -42
  16. package/3rdparty/walkontable/src/cell/coords.d.ts +1 -1
  17. package/3rdparty/walkontable/src/cell/coords.js +73 -65
  18. package/3rdparty/walkontable/src/cell/coords.mjs +73 -60
  19. package/3rdparty/walkontable/src/cell/range.d.ts +19 -16
  20. package/3rdparty/walkontable/src/cell/range.js +251 -231
  21. package/3rdparty/walkontable/src/cell/range.mjs +251 -222
  22. package/3rdparty/walkontable/src/core/_base.js +30 -74
  23. package/3rdparty/walkontable/src/core/_base.mjs +30 -67
  24. package/3rdparty/walkontable/src/core/clone.js +11 -44
  25. package/3rdparty/walkontable/src/core/clone.mjs +11 -32
  26. package/3rdparty/walkontable/src/core/core.js +8 -56
  27. package/3rdparty/walkontable/src/core/core.mjs +8 -38
  28. package/3rdparty/walkontable/src/event.js +41 -79
  29. package/3rdparty/walkontable/src/event.mjs +41 -66
  30. package/3rdparty/walkontable/src/facade/core.js +14 -16
  31. package/3rdparty/walkontable/src/facade/core.mjs +14 -13
  32. package/3rdparty/walkontable/src/filter/column.js +22 -17
  33. package/3rdparty/walkontable/src/filter/column.mjs +22 -16
  34. package/3rdparty/walkontable/src/filter/row.js +22 -17
  35. package/3rdparty/walkontable/src/filter/row.mjs +22 -16
  36. package/3rdparty/walkontable/src/index.js +0 -31
  37. package/3rdparty/walkontable/src/overlay/_base.js +38 -69
  38. package/3rdparty/walkontable/src/overlay/_base.mjs +38 -61
  39. package/3rdparty/walkontable/src/overlay/bottom.js +38 -103
  40. package/3rdparty/walkontable/src/overlay/bottom.mjs +38 -88
  41. package/3rdparty/walkontable/src/overlay/bottomInlineStartCorner.js +12 -52
  42. package/3rdparty/walkontable/src/overlay/bottomInlineStartCorner.mjs +12 -37
  43. package/3rdparty/walkontable/src/overlay/constants.js +0 -6
  44. package/3rdparty/walkontable/src/overlay/constants.mjs +0 -1
  45. package/3rdparty/walkontable/src/overlay/index.js +0 -17
  46. package/3rdparty/walkontable/src/overlay/inlineStart.js +26 -90
  47. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +26 -75
  48. package/3rdparty/walkontable/src/overlay/top.js +37 -104
  49. package/3rdparty/walkontable/src/overlay/top.mjs +37 -89
  50. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.js +14 -55
  51. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.mjs +14 -40
  52. package/3rdparty/walkontable/src/overlays.js +124 -145
  53. package/3rdparty/walkontable/src/overlays.mjs +124 -135
  54. package/3rdparty/walkontable/src/renderer/_base.js +17 -19
  55. package/3rdparty/walkontable/src/renderer/_base.mjs +17 -17
  56. package/3rdparty/walkontable/src/renderer/cells.js +15 -53
  57. package/3rdparty/walkontable/src/renderer/cells.mjs +15 -39
  58. package/3rdparty/walkontable/src/renderer/colGroup.js +15 -46
  59. package/3rdparty/walkontable/src/renderer/colGroup.mjs +15 -34
  60. package/3rdparty/walkontable/src/renderer/columnHeaders.js +13 -49
  61. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +13 -37
  62. package/3rdparty/walkontable/src/renderer/index.js +26 -35
  63. package/3rdparty/walkontable/src/renderer/index.mjs +26 -22
  64. package/3rdparty/walkontable/src/renderer/rowHeaders.js +13 -49
  65. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +13 -36
  66. package/3rdparty/walkontable/src/renderer/rows.js +11 -49
  67. package/3rdparty/walkontable/src/renderer/rows.mjs +11 -32
  68. package/3rdparty/walkontable/src/renderer/table.js +35 -48
  69. package/3rdparty/walkontable/src/renderer/table.mjs +35 -47
  70. package/3rdparty/walkontable/src/scroll.js +69 -86
  71. package/3rdparty/walkontable/src/scroll.mjs +69 -84
  72. package/3rdparty/walkontable/src/selection.js +28 -103
  73. package/3rdparty/walkontable/src/selection.mjs +26 -83
  74. package/3rdparty/walkontable/src/settings.js +25 -31
  75. package/3rdparty/walkontable/src/settings.mjs +25 -29
  76. package/3rdparty/walkontable/src/table/bottom.js +6 -34
  77. package/3rdparty/walkontable/src/table/bottom.mjs +6 -19
  78. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.js +6 -34
  79. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.mjs +6 -19
  80. package/3rdparty/walkontable/src/table/inlineStart.js +6 -34
  81. package/3rdparty/walkontable/src/table/inlineStart.mjs +6 -19
  82. package/3rdparty/walkontable/src/table/master.js +15 -54
  83. package/3rdparty/walkontable/src/table/master.mjs +15 -38
  84. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +1 -16
  85. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +1 -14
  86. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +1 -16
  87. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +1 -14
  88. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +1 -10
  89. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +1 -8
  90. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +1 -11
  91. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +1 -9
  92. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +1 -10
  93. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +1 -8
  94. package/3rdparty/walkontable/src/table/top.js +6 -34
  95. package/3rdparty/walkontable/src/table/top.mjs +6 -19
  96. package/3rdparty/walkontable/src/table/topInlineStartCorner.js +6 -34
  97. package/3rdparty/walkontable/src/table/topInlineStartCorner.mjs +6 -19
  98. package/3rdparty/walkontable/src/table.js +73 -233
  99. package/3rdparty/walkontable/src/table.mjs +71 -210
  100. package/3rdparty/walkontable/src/types.js +0 -5
  101. package/3rdparty/walkontable/src/types.mjs +0 -5
  102. package/3rdparty/walkontable/src/utils/column.js +18 -30
  103. package/3rdparty/walkontable/src/utils/column.mjs +18 -25
  104. package/3rdparty/walkontable/src/utils/nodesPool.js +16 -11
  105. package/3rdparty/walkontable/src/utils/nodesPool.mjs +16 -10
  106. package/3rdparty/walkontable/src/utils/orderView/constants.js +0 -3
  107. package/3rdparty/walkontable/src/utils/orderView/constants.mjs +0 -2
  108. package/3rdparty/walkontable/src/utils/orderView/index.js +0 -5
  109. package/3rdparty/walkontable/src/utils/orderView/sharedView.js +7 -32
  110. package/3rdparty/walkontable/src/utils/orderView/sharedView.mjs +7 -21
  111. package/3rdparty/walkontable/src/utils/orderView/view.js +27 -45
  112. package/3rdparty/walkontable/src/utils/orderView/view.mjs +27 -42
  113. package/3rdparty/walkontable/src/utils/orderView/viewSize.js +16 -14
  114. package/3rdparty/walkontable/src/utils/orderView/viewSize.mjs +16 -13
  115. package/3rdparty/walkontable/src/utils/orderView/viewSizeSet.js +21 -21
  116. package/3rdparty/walkontable/src/utils/orderView/viewSizeSet.mjs +21 -18
  117. package/3rdparty/walkontable/src/utils/row.js +15 -12
  118. package/3rdparty/walkontable/src/utils/row.mjs +15 -11
  119. package/3rdparty/walkontable/src/viewport.js +51 -99
  120. package/3rdparty/walkontable/src/viewport.mjs +51 -96
  121. package/CHANGELOG.md +99 -1
  122. package/base.d.ts +1 -0
  123. package/base.js +11 -17
  124. package/base.mjs +10 -11
  125. package/cellTypes/autocompleteType/autocompleteType.js +0 -4
  126. package/cellTypes/autocompleteType/index.js +0 -2
  127. package/cellTypes/checkboxType/checkboxType.js +0 -3
  128. package/cellTypes/checkboxType/index.js +0 -2
  129. package/cellTypes/dateType/dateType.js +0 -4
  130. package/cellTypes/dateType/index.js +0 -2
  131. package/cellTypes/dropdownType/dropdownType.js +0 -4
  132. package/cellTypes/dropdownType/index.js +0 -2
  133. package/cellTypes/handsontableType/handsontableType.js +0 -3
  134. package/cellTypes/handsontableType/index.js +0 -2
  135. package/cellTypes/index.js +0 -21
  136. package/cellTypes/index.mjs +0 -1
  137. package/cellTypes/numericType/index.js +0 -2
  138. package/cellTypes/numericType/numericType.js +0 -4
  139. package/cellTypes/passwordType/index.js +0 -2
  140. package/cellTypes/passwordType/passwordType.js +0 -3
  141. package/cellTypes/registry.js +10 -25
  142. package/cellTypes/registry.mjs +10 -20
  143. package/cellTypes/textType/index.js +0 -2
  144. package/cellTypes/textType/textType.js +0 -3
  145. package/cellTypes/timeType/index.js +0 -2
  146. package/cellTypes/timeType/timeType.js +0 -4
  147. package/core.d.ts +6 -2
  148. package/core.js +714 -1070
  149. package/core.mjs +717 -1015
  150. package/dataMap/dataMap.js +202 -236
  151. package/dataMap/dataMap.mjs +201 -209
  152. package/{dataSource.js → dataMap/dataSource.js} +29 -65
  153. package/{dataSource.mjs → dataMap/dataSource.mjs} +29 -57
  154. package/dataMap/index.js +0 -13
  155. package/dataMap/metaManager/index.js +33 -45
  156. package/dataMap/metaManager/index.mjs +33 -37
  157. package/dataMap/metaManager/lazyFactoryMap.js +17 -62
  158. package/dataMap/metaManager/lazyFactoryMap.mjs +17 -46
  159. package/dataMap/metaManager/metaLayers/cellMeta.js +26 -57
  160. package/dataMap/metaManager/metaLayers/cellMeta.mjs +25 -41
  161. package/dataMap/metaManager/metaLayers/columnMeta.js +23 -24
  162. package/dataMap/metaManager/metaLayers/columnMeta.mjs +24 -21
  163. package/dataMap/metaManager/metaLayers/globalMeta.js +30 -21
  164. package/dataMap/metaManager/metaLayers/globalMeta.mjs +31 -18
  165. package/dataMap/metaManager/metaLayers/tableMeta.js +18 -15
  166. package/dataMap/metaManager/metaLayers/tableMeta.mjs +19 -14
  167. package/dataMap/metaManager/metaSchema.js +173 -213
  168. package/dataMap/metaManager/metaSchema.mjs +173 -204
  169. package/dataMap/metaManager/mods/dynamicCellMeta.js +15 -35
  170. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +15 -24
  171. package/dataMap/metaManager/mods/extendMetaProperties.js +14 -27
  172. package/dataMap/metaManager/mods/extendMetaProperties.mjs +14 -19
  173. package/dataMap/metaManager/utils.js +49 -28
  174. package/dataMap/metaManager/utils.mjs +50 -21
  175. package/dataMap/replaceData.js +15 -35
  176. package/dataMap/replaceData.mjs +15 -23
  177. package/dist/handsontable.css +9 -9
  178. package/dist/handsontable.full.css +9 -9
  179. package/dist/handsontable.full.js +13065 -28165
  180. package/dist/handsontable.full.min.css +2 -2
  181. package/dist/handsontable.full.min.js +108 -114
  182. package/dist/handsontable.js +11528 -21792
  183. package/dist/handsontable.min.css +2 -2
  184. package/dist/handsontable.min.js +3 -3
  185. package/dist/languages/all.js +111 -240
  186. package/dist/languages/all.min.js +1 -1
  187. package/dist/languages/ar-AR.js +50 -14
  188. package/dist/languages/ar-AR.min.js +1 -1
  189. package/dist/languages/cs-CZ.js +52 -16
  190. package/dist/languages/cs-CZ.min.js +1 -1
  191. package/dist/languages/de-CH.js +52 -16
  192. package/dist/languages/de-CH.min.js +1 -1
  193. package/dist/languages/de-DE.js +53 -17
  194. package/dist/languages/de-DE.min.js +1 -1
  195. package/dist/languages/en-US.js +56 -20
  196. package/dist/languages/en-US.min.js +1 -1
  197. package/dist/languages/es-MX.js +56 -20
  198. package/dist/languages/es-MX.min.js +1 -1
  199. package/dist/languages/fr-FR.js +55 -19
  200. package/dist/languages/fr-FR.min.js +1 -1
  201. package/dist/languages/it-IT.js +55 -19
  202. package/dist/languages/it-IT.min.js +1 -1
  203. package/dist/languages/ja-JP.js +83 -43
  204. package/dist/languages/ja-JP.min.js +1 -1
  205. package/dist/languages/ko-KR.js +84 -43
  206. package/dist/languages/ko-KR.min.js +1 -1
  207. package/dist/languages/lv-LV.js +85 -43
  208. package/dist/languages/lv-LV.min.js +1 -1
  209. package/dist/languages/nb-NO.js +86 -43
  210. package/dist/languages/nb-NO.min.js +1 -1
  211. package/dist/languages/nl-NL.js +87 -43
  212. package/dist/languages/nl-NL.min.js +1 -1
  213. package/dist/languages/pl-PL.js +88 -43
  214. package/dist/languages/pl-PL.min.js +1 -1
  215. package/dist/languages/pt-BR.js +67 -28
  216. package/dist/languages/pt-BR.min.js +1 -1
  217. package/dist/languages/ru-RU.js +67 -28
  218. package/dist/languages/ru-RU.min.js +1 -1
  219. package/dist/languages/sr-SP.js +55 -16
  220. package/dist/languages/sr-SP.min.js +1 -1
  221. package/dist/languages/zh-CN.js +55 -16
  222. package/dist/languages/zh-CN.min.js +1 -1
  223. package/dist/languages/zh-TW.js +55 -16
  224. package/dist/languages/zh-TW.min.js +1 -1
  225. package/editorManager.js +53 -113
  226. package/editorManager.mjs +50 -90
  227. package/editors/autocompleteEditor/autocompleteEditor.js +36 -138
  228. package/editors/autocompleteEditor/autocompleteEditor.mjs +35 -108
  229. package/editors/autocompleteEditor/index.js +0 -2
  230. package/editors/baseEditor/baseEditor.js +55 -160
  231. package/editors/baseEditor/baseEditor.mjs +54 -133
  232. package/editors/baseEditor/index.js +0 -2
  233. package/editors/checkboxEditor/checkboxEditor.js +8 -34
  234. package/editors/checkboxEditor/checkboxEditor.mjs +8 -20
  235. package/editors/checkboxEditor/index.js +0 -2
  236. package/editors/dateEditor/dateEditor.js +26 -97
  237. package/editors/dateEditor/dateEditor.mjs +26 -76
  238. package/editors/dateEditor/index.js +0 -2
  239. package/editors/dropdownEditor/dropdownEditor.js +7 -42
  240. package/editors/dropdownEditor/dropdownEditor.mjs +7 -23
  241. package/editors/dropdownEditor/index.js +0 -2
  242. package/editors/handsontableEditor/handsontableEditor.js +19 -86
  243. package/editors/handsontableEditor/handsontableEditor.mjs +19 -67
  244. package/editors/handsontableEditor/index.js +0 -2
  245. package/editors/index.js +0 -25
  246. package/editors/index.mjs +0 -1
  247. package/editors/numericEditor/index.js +0 -2
  248. package/editors/numericEditor/numericEditor.js +7 -32
  249. package/editors/numericEditor/numericEditor.mjs +7 -19
  250. package/editors/passwordEditor/index.js +0 -2
  251. package/editors/passwordEditor/passwordEditor.js +7 -39
  252. package/editors/passwordEditor/passwordEditor.mjs +7 -23
  253. package/editors/registry.js +13 -36
  254. package/editors/registry.mjs +12 -26
  255. package/editors/selectEditor/index.js +0 -2
  256. package/editors/selectEditor/selectEditor.js +27 -74
  257. package/editors/selectEditor/selectEditor.mjs +27 -57
  258. package/editors/textEditor/caretPositioner.js +0 -8
  259. package/editors/textEditor/caretPositioner.mjs +0 -7
  260. package/editors/textEditor/index.js +0 -2
  261. package/editors/textEditor/textEditor.js +45 -139
  262. package/editors/textEditor/textEditor.mjs +45 -108
  263. package/editors/timeEditor/index.js +0 -2
  264. package/editors/timeEditor/timeEditor.js +7 -37
  265. package/editors/timeEditor/timeEditor.mjs +7 -22
  266. package/eventManager.js +26 -47
  267. package/eventManager.mjs +27 -45
  268. package/helpers/array.js +22 -88
  269. package/helpers/array.mjs +22 -58
  270. package/helpers/browser.js +25 -51
  271. package/helpers/browser.mjs +25 -32
  272. package/helpers/console.js +3 -13
  273. package/helpers/console.mjs +3 -10
  274. package/helpers/data.d.ts +0 -2
  275. package/helpers/data.js +8 -102
  276. package/helpers/data.mjs +9 -80
  277. package/helpers/date.js +2 -3
  278. package/helpers/date.mjs +2 -2
  279. package/helpers/dom/element.js +89 -256
  280. package/helpers/dom/element.mjs +88 -184
  281. package/helpers/dom/event.js +3 -7
  282. package/helpers/dom/event.mjs +3 -3
  283. package/helpers/feature.js +21 -82
  284. package/helpers/feature.mjs +15 -60
  285. package/helpers/function.js +14 -59
  286. package/helpers/function.mjs +14 -45
  287. package/helpers/mixed.js +9 -64
  288. package/helpers/mixed.mjs +9 -43
  289. package/helpers/number.js +4 -46
  290. package/helpers/number.mjs +4 -23
  291. package/helpers/object.js +30 -77
  292. package/helpers/object.mjs +25 -47
  293. package/helpers/string.js +6 -28
  294. package/helpers/string.mjs +6 -14
  295. package/helpers/templateLiteralTag.js +0 -6
  296. package/helpers/templateLiteralTag.mjs +0 -2
  297. package/helpers/unicode.js +17 -22
  298. package/helpers/unicode.mjs +17 -13
  299. package/helpers/wrappers/jquery.js +4 -14
  300. package/helpers/wrappers/jquery.mjs +4 -13
  301. package/i18n/constants.js +50 -45
  302. package/i18n/constants.mjs +46 -42
  303. package/i18n/index.js +0 -7
  304. package/i18n/languages/ar-AR.js +12 -23
  305. package/i18n/languages/ar-AR.mjs +14 -3
  306. package/i18n/languages/cs-CZ.js +12 -23
  307. package/i18n/languages/cs-CZ.mjs +14 -3
  308. package/i18n/languages/de-CH.js +12 -23
  309. package/i18n/languages/de-CH.mjs +14 -3
  310. package/i18n/languages/de-DE.js +12 -23
  311. package/i18n/languages/de-DE.mjs +14 -3
  312. package/i18n/languages/en-US.js +13 -24
  313. package/i18n/languages/en-US.mjs +15 -4
  314. package/i18n/languages/es-MX.js +13 -24
  315. package/i18n/languages/es-MX.mjs +17 -5
  316. package/i18n/languages/fr-FR.js +12 -23
  317. package/i18n/languages/fr-FR.mjs +14 -3
  318. package/i18n/languages/index.js +0 -39
  319. package/i18n/languages/it-IT.js +12 -23
  320. package/i18n/languages/it-IT.mjs +14 -3
  321. package/i18n/languages/ja-JP.js +12 -23
  322. package/i18n/languages/ja-JP.mjs +14 -3
  323. package/i18n/languages/ko-KR.js +12 -23
  324. package/i18n/languages/ko-KR.mjs +14 -3
  325. package/i18n/languages/lv-LV.js +13 -24
  326. package/i18n/languages/lv-LV.mjs +17 -6
  327. package/i18n/languages/nb-NO.js +12 -23
  328. package/i18n/languages/nb-NO.mjs +14 -3
  329. package/i18n/languages/nl-NL.js +13 -24
  330. package/i18n/languages/nl-NL.mjs +17 -6
  331. package/i18n/languages/pl-PL.js +13 -24
  332. package/i18n/languages/pl-PL.mjs +16 -5
  333. package/i18n/languages/pt-BR.js +12 -23
  334. package/i18n/languages/pt-BR.mjs +14 -3
  335. package/i18n/languages/ru-RU.js +12 -23
  336. package/i18n/languages/ru-RU.mjs +14 -3
  337. package/i18n/languages/sr-SP.js +12 -23
  338. package/i18n/languages/sr-SP.mjs +14 -3
  339. package/i18n/languages/zh-CN.js +12 -23
  340. package/i18n/languages/zh-CN.mjs +14 -3
  341. package/i18n/languages/zh-TW.js +12 -23
  342. package/i18n/languages/zh-TW.mjs +14 -3
  343. package/i18n/phraseFormatters/index.js +4 -11
  344. package/i18n/phraseFormatters/index.mjs +4 -6
  345. package/i18n/phraseFormatters/pluralize.js +0 -5
  346. package/i18n/phraseFormatters/pluralize.mjs +0 -3
  347. package/i18n/phraseFormatters/substituteVariables.js +0 -4
  348. package/i18n/phraseFormatters/substituteVariables.mjs +0 -2
  349. package/i18n/registry.js +18 -59
  350. package/i18n/registry.mjs +18 -30
  351. package/i18n/utils.js +4 -22
  352. package/i18n/utils.mjs +4 -11
  353. package/index.d.ts +9 -0
  354. package/index.js +23 -58
  355. package/index.mjs +21 -16
  356. package/languages/all.js +111 -240
  357. package/languages/ar-AR.js +50 -14
  358. package/languages/ar-AR.mjs +14 -3
  359. package/languages/cs-CZ.js +52 -16
  360. package/languages/cs-CZ.mjs +14 -3
  361. package/languages/de-CH.js +52 -16
  362. package/languages/de-CH.mjs +14 -3
  363. package/languages/de-DE.js +53 -17
  364. package/languages/de-DE.mjs +14 -3
  365. package/languages/en-US.js +56 -20
  366. package/languages/en-US.mjs +15 -4
  367. package/languages/es-MX.js +56 -20
  368. package/languages/es-MX.mjs +17 -5
  369. package/languages/fr-FR.js +55 -19
  370. package/languages/fr-FR.mjs +14 -3
  371. package/languages/index.js +111 -240
  372. package/languages/it-IT.js +55 -19
  373. package/languages/it-IT.mjs +14 -3
  374. package/languages/ja-JP.js +83 -43
  375. package/languages/ja-JP.mjs +14 -3
  376. package/languages/ko-KR.js +84 -43
  377. package/languages/ko-KR.mjs +14 -3
  378. package/languages/lv-LV.js +85 -43
  379. package/languages/lv-LV.mjs +17 -6
  380. package/languages/nb-NO.js +86 -43
  381. package/languages/nb-NO.mjs +14 -3
  382. package/languages/nl-NL.js +87 -43
  383. package/languages/nl-NL.mjs +17 -6
  384. package/languages/pl-PL.js +88 -43
  385. package/languages/pl-PL.mjs +16 -5
  386. package/languages/pt-BR.js +67 -28
  387. package/languages/pt-BR.mjs +14 -3
  388. package/languages/ru-RU.js +67 -28
  389. package/languages/ru-RU.mjs +14 -3
  390. package/languages/sr-SP.js +55 -16
  391. package/languages/sr-SP.mjs +14 -3
  392. package/languages/zh-CN.js +55 -16
  393. package/languages/zh-CN.mjs +14 -3
  394. package/languages/zh-TW.js +55 -16
  395. package/languages/zh-TW.mjs +14 -3
  396. package/mixins/hooksRefRegisterer.js +1 -12
  397. package/mixins/hooksRefRegisterer.mjs +1 -9
  398. package/mixins/localHooks.js +4 -11
  399. package/mixins/localHooks.mjs +4 -8
  400. package/package.json +2 -2
  401. package/pluginHooks.d.ts +10 -5
  402. package/pluginHooks.js +376 -116
  403. package/pluginHooks.mjs +375 -103
  404. package/plugins/autoColumnSize/autoColumnSize.js +81 -174
  405. package/plugins/autoColumnSize/autoColumnSize.mjs +81 -139
  406. package/plugins/autoColumnSize/index.js +0 -2
  407. package/plugins/autoRowSize/autoRowSize.js +89 -160
  408. package/plugins/autoRowSize/autoRowSize.mjs +89 -131
  409. package/plugins/autoRowSize/index.js +0 -2
  410. package/plugins/autofill/autofill.js +53 -165
  411. package/plugins/autofill/autofill.mjs +53 -133
  412. package/plugins/autofill/index.js +0 -2
  413. package/plugins/autofill/utils.js +4 -26
  414. package/plugins/autofill/utils.mjs +4 -18
  415. package/plugins/base/base.js +28 -91
  416. package/plugins/base/base.mjs +28 -63
  417. package/plugins/base/index.js +0 -2
  418. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +25 -53
  419. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.mjs +25 -34
  420. package/plugins/bindRowsWithHeaders/index.js +0 -2
  421. package/plugins/bindRowsWithHeaders/maps/looseBindsMap.js +11 -42
  422. package/plugins/bindRowsWithHeaders/maps/looseBindsMap.mjs +11 -30
  423. package/plugins/bindRowsWithHeaders/maps/strictBindsMap.js +12 -54
  424. package/plugins/bindRowsWithHeaders/maps/strictBindsMap.mjs +12 -38
  425. package/plugins/collapsibleColumns/collapsibleColumns.js +106 -193
  426. package/plugins/collapsibleColumns/collapsibleColumns.mjs +106 -162
  427. package/plugins/collapsibleColumns/index.js +0 -2
  428. package/plugins/columnSorting/columnSorting.js +58 -192
  429. package/plugins/columnSorting/columnSorting.mjs +58 -147
  430. package/plugins/columnSorting/columnStatesManager.js +27 -77
  431. package/plugins/columnSorting/columnStatesManager.mjs +24 -51
  432. package/plugins/columnSorting/domHelpers.js +2 -18
  433. package/plugins/columnSorting/domHelpers.mjs +2 -7
  434. package/plugins/columnSorting/index.js +0 -2
  435. package/plugins/columnSorting/rootComparator.js +5 -24
  436. package/plugins/columnSorting/rootComparator.mjs +5 -13
  437. package/plugins/columnSorting/sortFunction/checkbox.js +8 -16
  438. package/plugins/columnSorting/sortFunction/checkbox.mjs +8 -12
  439. package/plugins/columnSorting/sortFunction/date.js +2 -19
  440. package/plugins/columnSorting/sortFunction/date.mjs +2 -14
  441. package/plugins/columnSorting/sortFunction/default.js +2 -17
  442. package/plugins/columnSorting/sortFunction/default.mjs +2 -14
  443. package/plugins/columnSorting/sortFunction/numeric.js +2 -11
  444. package/plugins/columnSorting/sortFunction/numeric.mjs +2 -8
  445. package/plugins/columnSorting/sortService/engine.js +1 -7
  446. package/plugins/columnSorting/sortService/engine.mjs +1 -3
  447. package/plugins/columnSorting/sortService/index.js +0 -5
  448. package/plugins/columnSorting/sortService/registry.js +6 -18
  449. package/plugins/columnSorting/sortService/registry.mjs +6 -10
  450. package/plugins/columnSorting/utils.js +9 -34
  451. package/plugins/columnSorting/utils.mjs +9 -15
  452. package/plugins/columnSummary/columnSummary.js +65 -126
  453. package/plugins/columnSummary/columnSummary.mjs +65 -101
  454. package/plugins/columnSummary/endpoints.js +33 -109
  455. package/plugins/columnSummary/endpoints.mjs +33 -105
  456. package/plugins/columnSummary/index.js +0 -2
  457. package/plugins/columnSummary/utils.js +0 -1
  458. package/plugins/comments/commentEditor.js +29 -27
  459. package/plugins/comments/commentEditor.mjs +29 -26
  460. package/plugins/comments/comments.js +106 -178
  461. package/plugins/comments/comments.mjs +106 -152
  462. package/plugins/comments/displaySwitch.js +20 -24
  463. package/plugins/comments/displaySwitch.mjs +20 -19
  464. package/plugins/comments/index.js +0 -2
  465. package/plugins/contextMenu/commandExecutor.js +17 -29
  466. package/plugins/contextMenu/commandExecutor.mjs +17 -27
  467. package/plugins/contextMenu/contextMenu.d.ts +4 -3
  468. package/plugins/contextMenu/contextMenu.js +28 -121
  469. package/plugins/contextMenu/contextMenu.mjs +28 -91
  470. package/plugins/contextMenu/cursor.js +19 -19
  471. package/plugins/contextMenu/cursor.mjs +19 -18
  472. package/plugins/contextMenu/index.js +0 -2
  473. package/plugins/contextMenu/itemsFactory.js +21 -35
  474. package/plugins/contextMenu/itemsFactory.mjs +21 -31
  475. package/plugins/contextMenu/menu.js +71 -180
  476. package/plugins/contextMenu/menu.mjs +70 -151
  477. package/plugins/contextMenu/predefinedItems/alignment.js +1 -55
  478. package/plugins/contextMenu/predefinedItems/alignment.mjs +1 -37
  479. package/plugins/contextMenu/predefinedItems/clearColumn.js +1 -20
  480. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +1 -4
  481. package/plugins/contextMenu/predefinedItems/columnLeft.js +6 -43
  482. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +6 -26
  483. package/plugins/contextMenu/predefinedItems/columnRight.js +4 -42
  484. package/plugins/contextMenu/predefinedItems/columnRight.mjs +4 -25
  485. package/plugins/contextMenu/predefinedItems/noItems.js +1 -4
  486. package/plugins/contextMenu/predefinedItems/noItems.mjs +1 -1
  487. package/plugins/contextMenu/predefinedItems/readOnly.js +1 -25
  488. package/plugins/contextMenu/predefinedItems/readOnly.mjs +1 -8
  489. package/plugins/contextMenu/predefinedItems/redo.js +1 -16
  490. package/plugins/contextMenu/predefinedItems/redo.mjs +1 -1
  491. package/plugins/contextMenu/predefinedItems/removeColumn.js +4 -39
  492. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +4 -19
  493. package/plugins/contextMenu/predefinedItems/removeRow.js +4 -38
  494. package/plugins/contextMenu/predefinedItems/removeRow.mjs +4 -18
  495. package/plugins/contextMenu/predefinedItems/rowAbove.js +6 -35
  496. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +6 -19
  497. package/plugins/contextMenu/predefinedItems/rowBelow.js +4 -42
  498. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +4 -25
  499. package/plugins/contextMenu/predefinedItems/separator.js +1 -2
  500. package/plugins/contextMenu/predefinedItems/separator.mjs +1 -1
  501. package/plugins/contextMenu/predefinedItems/undo.js +1 -16
  502. package/plugins/contextMenu/predefinedItems/undo.mjs +1 -1
  503. package/plugins/contextMenu/predefinedItems.js +14 -55
  504. package/plugins/contextMenu/predefinedItems.mjs +16 -8
  505. package/plugins/contextMenu/utils.js +17 -57
  506. package/plugins/contextMenu/utils.mjs +17 -34
  507. package/plugins/copyPaste/clipboardData.js +14 -9
  508. package/plugins/copyPaste/clipboardData.mjs +14 -8
  509. package/plugins/copyPaste/contextMenuItem/copy.js +5 -32
  510. package/plugins/copyPaste/contextMenuItem/copy.mjs +5 -7
  511. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +35 -0
  512. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +31 -0
  513. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +35 -0
  514. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +31 -0
  515. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +35 -0
  516. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +31 -0
  517. package/plugins/copyPaste/contextMenuItem/cut.js +2 -17
  518. package/plugins/copyPaste/contextMenuItem/cut.mjs +2 -4
  519. package/plugins/copyPaste/copyPaste.d.ts +10 -2
  520. package/plugins/copyPaste/copyPaste.js +339 -372
  521. package/plugins/copyPaste/copyPaste.mjs +339 -331
  522. package/plugins/copyPaste/copyableRanges.js +269 -0
  523. package/plugins/copyPaste/copyableRanges.mjs +264 -0
  524. package/plugins/copyPaste/focusableElement.js +21 -55
  525. package/plugins/copyPaste/focusableElement.mjs +21 -45
  526. package/plugins/copyPaste/index.js +0 -2
  527. package/plugins/copyPaste/pasteEvent.js +14 -9
  528. package/plugins/copyPaste/pasteEvent.mjs +14 -7
  529. package/plugins/customBorders/contextMenuItem/bottom.js +0 -17
  530. package/plugins/customBorders/contextMenuItem/bottom.mjs +0 -3
  531. package/plugins/customBorders/contextMenuItem/index.js +0 -11
  532. package/plugins/customBorders/contextMenuItem/left.js +0 -17
  533. package/plugins/customBorders/contextMenuItem/left.mjs +0 -3
  534. package/plugins/customBorders/contextMenuItem/noBorders.js +0 -15
  535. package/plugins/customBorders/contextMenuItem/noBorders.mjs +0 -1
  536. package/plugins/customBorders/contextMenuItem/right.js +0 -17
  537. package/plugins/customBorders/contextMenuItem/right.mjs +0 -3
  538. package/plugins/customBorders/contextMenuItem/top.js +0 -17
  539. package/plugins/customBorders/contextMenuItem/top.mjs +0 -3
  540. package/plugins/customBorders/customBorders.js +64 -188
  541. package/plugins/customBorders/customBorders.mjs +63 -153
  542. package/plugins/customBorders/index.js +0 -2
  543. package/plugins/customBorders/utils.js +13 -52
  544. package/plugins/customBorders/utils.mjs +13 -31
  545. package/plugins/dragToScroll/dragToScroll.js +23 -75
  546. package/plugins/dragToScroll/dragToScroll.mjs +23 -56
  547. package/plugins/dragToScroll/index.js +0 -2
  548. package/plugins/dropdownMenu/dropdownMenu.js +49 -127
  549. package/plugins/dropdownMenu/dropdownMenu.mjs +49 -96
  550. package/plugins/dropdownMenu/index.js +0 -2
  551. package/plugins/exportFile/dataProvider.js +34 -72
  552. package/plugins/exportFile/dataProvider.mjs +31 -58
  553. package/plugins/exportFile/exportFile.js +56 -61
  554. package/plugins/exportFile/exportFile.mjs +54 -37
  555. package/plugins/exportFile/index.js +0 -2
  556. package/plugins/exportFile/typeFactory.js +15 -12
  557. package/plugins/exportFile/typeFactory.mjs +15 -5
  558. package/plugins/exportFile/types/_base.js +15 -15
  559. package/plugins/exportFile/types/_base.mjs +15 -13
  560. package/plugins/exportFile/types/csv.js +8 -51
  561. package/plugins/exportFile/types/csv.mjs +8 -30
  562. package/plugins/filters/component/_base.js +25 -31
  563. package/plugins/filters/component/_base.mjs +25 -26
  564. package/plugins/filters/component/actionBar.js +13 -56
  565. package/plugins/filters/component/actionBar.mjs +11 -34
  566. package/plugins/filters/component/condition.js +22 -95
  567. package/plugins/filters/component/condition.mjs +20 -63
  568. package/plugins/filters/component/operators.js +18 -71
  569. package/plugins/filters/component/operators.mjs +18 -48
  570. package/plugins/filters/component/value.js +22 -97
  571. package/plugins/filters/component/value.mjs +22 -67
  572. package/plugins/filters/condition/beginsWith.js +3 -33
  573. package/plugins/filters/condition/beginsWith.mjs +3 -11
  574. package/plugins/filters/condition/between.js +4 -38
  575. package/plugins/filters/condition/between.mjs +4 -16
  576. package/plugins/filters/condition/byValue.js +4 -28
  577. package/plugins/filters/condition/byValue.mjs +4 -13
  578. package/plugins/filters/condition/contains.js +3 -33
  579. package/plugins/filters/condition/contains.mjs +3 -11
  580. package/plugins/filters/condition/date/after.js +3 -35
  581. package/plugins/filters/condition/date/after.mjs +3 -13
  582. package/plugins/filters/condition/date/before.js +3 -35
  583. package/plugins/filters/condition/date/before.mjs +3 -13
  584. package/plugins/filters/condition/date/today.js +1 -22
  585. package/plugins/filters/condition/date/today.mjs +1 -3
  586. package/plugins/filters/condition/date/tomorrow.js +1 -22
  587. package/plugins/filters/condition/date/tomorrow.mjs +1 -3
  588. package/plugins/filters/condition/date/yesterday.js +1 -22
  589. package/plugins/filters/condition/date/yesterday.mjs +1 -3
  590. package/plugins/filters/condition/empty.js +1 -19
  591. package/plugins/filters/condition/empty.mjs +1 -1
  592. package/plugins/filters/condition/endsWith.js +3 -33
  593. package/plugins/filters/condition/endsWith.mjs +3 -11
  594. package/plugins/filters/condition/equal.js +3 -32
  595. package/plugins/filters/condition/equal.mjs +3 -11
  596. package/plugins/filters/condition/false.js +1 -5
  597. package/plugins/filters/condition/false.mjs +1 -1
  598. package/plugins/filters/condition/greaterThan.js +3 -33
  599. package/plugins/filters/condition/greaterThan.mjs +3 -13
  600. package/plugins/filters/condition/greaterThanOrEqual.js +3 -33
  601. package/plugins/filters/condition/greaterThanOrEqual.mjs +3 -13
  602. package/plugins/filters/condition/lessThan.js +3 -33
  603. package/plugins/filters/condition/lessThan.mjs +3 -13
  604. package/plugins/filters/condition/lessThanOrEqual.js +3 -33
  605. package/plugins/filters/condition/lessThanOrEqual.mjs +3 -13
  606. package/plugins/filters/condition/none.js +1 -18
  607. package/plugins/filters/condition/none.mjs +1 -1
  608. package/plugins/filters/condition/notBetween.js +1 -19
  609. package/plugins/filters/condition/notBetween.mjs +1 -1
  610. package/plugins/filters/condition/notContains.js +1 -19
  611. package/plugins/filters/condition/notContains.mjs +1 -1
  612. package/plugins/filters/condition/notEmpty.js +1 -19
  613. package/plugins/filters/condition/notEmpty.mjs +1 -1
  614. package/plugins/filters/condition/notEqual.js +1 -19
  615. package/plugins/filters/condition/notEqual.mjs +1 -1
  616. package/plugins/filters/condition/true.js +1 -5
  617. package/plugins/filters/condition/true.mjs +1 -1
  618. package/plugins/filters/conditionCollection.js +31 -84
  619. package/plugins/filters/conditionCollection.mjs +39 -69
  620. package/plugins/filters/conditionRegisterer.js +5 -14
  621. package/plugins/filters/conditionRegisterer.mjs +5 -9
  622. package/plugins/filters/conditionUpdateObserver.js +29 -56
  623. package/plugins/filters/conditionUpdateObserver.mjs +29 -44
  624. package/plugins/filters/constants.js +15 -67
  625. package/plugins/filters/constants.mjs +15 -9
  626. package/plugins/filters/dataFilter.js +17 -20
  627. package/plugins/filters/dataFilter.mjs +17 -19
  628. package/plugins/filters/filters.js +110 -210
  629. package/plugins/filters/filters.mjs +110 -165
  630. package/plugins/filters/index.js +0 -2
  631. package/plugins/filters/logicalOperationRegisterer.js +3 -9
  632. package/plugins/filters/logicalOperationRegisterer.mjs +3 -4
  633. package/plugins/filters/logicalOperations/conjunction.js +2 -19
  634. package/plugins/filters/logicalOperations/conjunction.mjs +2 -2
  635. package/plugins/filters/logicalOperations/disjunction.js +2 -19
  636. package/plugins/filters/logicalOperations/disjunction.mjs +2 -2
  637. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.js +2 -21
  638. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.mjs +2 -3
  639. package/plugins/filters/ui/_base.js +24 -62
  640. package/plugins/filters/ui/_base.mjs +26 -36
  641. package/plugins/filters/ui/input.js +13 -53
  642. package/plugins/filters/ui/input.mjs +13 -35
  643. package/plugins/filters/ui/link.js +9 -44
  644. package/plugins/filters/ui/link.mjs +9 -26
  645. package/plugins/filters/ui/multipleSelect.js +25 -113
  646. package/plugins/filters/ui/multipleSelect.mjs +26 -77
  647. package/plugins/filters/ui/radioInput.js +12 -48
  648. package/plugins/filters/ui/radioInput.mjs +12 -31
  649. package/plugins/filters/ui/select.js +20 -77
  650. package/plugins/filters/ui/select.mjs +20 -53
  651. package/plugins/filters/utils.js +6 -39
  652. package/plugins/filters/utils.mjs +6 -23
  653. package/plugins/formulas/engine/register.js +24 -74
  654. package/plugins/formulas/engine/register.mjs +24 -45
  655. package/plugins/formulas/engine/settings.js +16 -25
  656. package/plugins/formulas/engine/settings.mjs +16 -13
  657. package/plugins/formulas/formulas.js +127 -306
  658. package/plugins/formulas/formulas.mjs +128 -259
  659. package/plugins/formulas/index.js +0 -2
  660. package/plugins/formulas/utils.js +1 -3
  661. package/plugins/formulas/utils.mjs +1 -1
  662. package/plugins/hiddenColumns/contextMenuItem/hideColumn.js +5 -39
  663. package/plugins/hiddenColumns/contextMenuItem/hideColumn.mjs +5 -21
  664. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +17 -45
  665. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +17 -24
  666. package/plugins/hiddenColumns/hiddenColumns.js +77 -150
  667. package/plugins/hiddenColumns/hiddenColumns.mjs +77 -109
  668. package/plugins/hiddenColumns/index.js +0 -2
  669. package/plugins/hiddenRows/contextMenuItem/hideRow.js +5 -39
  670. package/plugins/hiddenRows/contextMenuItem/hideRow.mjs +5 -21
  671. package/plugins/hiddenRows/contextMenuItem/showRow.js +17 -45
  672. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +17 -24
  673. package/plugins/hiddenRows/hiddenRows.js +75 -149
  674. package/plugins/hiddenRows/hiddenRows.mjs +75 -108
  675. package/plugins/hiddenRows/index.js +0 -2
  676. package/plugins/index.js +0 -71
  677. package/plugins/index.mjs +0 -1
  678. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js +2 -29
  679. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.mjs +2 -13
  680. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js +2 -29
  681. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.mjs +2 -13
  682. package/plugins/manualColumnFreeze/index.js +0 -2
  683. package/plugins/manualColumnFreeze/manualColumnFreeze.js +27 -79
  684. package/plugins/manualColumnFreeze/manualColumnFreeze.mjs +27 -55
  685. package/plugins/manualColumnMove/index.js +0 -2
  686. package/plugins/manualColumnMove/manualColumnMove.js +51 -135
  687. package/plugins/manualColumnMove/manualColumnMove.mjs +51 -107
  688. package/plugins/manualColumnMove/ui/_base.js +26 -31
  689. package/plugins/manualColumnMove/ui/_base.mjs +26 -28
  690. package/plugins/manualColumnMove/ui/backlight.js +7 -38
  691. package/plugins/manualColumnMove/ui/backlight.mjs +7 -23
  692. package/plugins/manualColumnMove/ui/guideline.js +7 -38
  693. package/plugins/manualColumnMove/ui/guideline.mjs +7 -23
  694. package/plugins/manualColumnResize/index.js +0 -2
  695. package/plugins/manualColumnResize/manualColumnResize.js +50 -144
  696. package/plugins/manualColumnResize/manualColumnResize.mjs +49 -119
  697. package/plugins/manualRowMove/index.js +0 -2
  698. package/plugins/manualRowMove/manualRowMove.js +51 -138
  699. package/plugins/manualRowMove/manualRowMove.mjs +51 -110
  700. package/plugins/manualRowMove/ui/_base.js +26 -28
  701. package/plugins/manualRowMove/ui/_base.mjs +26 -27
  702. package/plugins/manualRowMove/ui/backlight.js +7 -38
  703. package/plugins/manualRowMove/ui/backlight.mjs +7 -23
  704. package/plugins/manualRowMove/ui/guideline.js +7 -38
  705. package/plugins/manualRowMove/ui/guideline.mjs +7 -23
  706. package/plugins/manualRowResize/index.js +0 -2
  707. package/plugins/manualRowResize/manualRowResize.js +48 -139
  708. package/plugins/manualRowResize/manualRowResize.mjs +47 -113
  709. package/plugins/mergeCells/calculations/autofill.js +49 -133
  710. package/plugins/mergeCells/calculations/autofill.mjs +46 -117
  711. package/plugins/mergeCells/calculations/selection.js +22 -39
  712. package/plugins/mergeCells/calculations/selection.mjs +22 -36
  713. package/plugins/mergeCells/cellCoords.js +43 -50
  714. package/plugins/mergeCells/cellCoords.mjs +43 -48
  715. package/plugins/mergeCells/cellsCollection.js +22 -86
  716. package/plugins/mergeCells/cellsCollection.mjs +19 -63
  717. package/plugins/mergeCells/contextMenuItem/toggleMerge.js +0 -22
  718. package/plugins/mergeCells/contextMenuItem/toggleMerge.mjs +0 -6
  719. package/plugins/mergeCells/index.js +0 -2
  720. package/plugins/mergeCells/mergeCells.js +136 -334
  721. package/plugins/mergeCells/mergeCells.mjs +136 -293
  722. package/plugins/mergeCells/utils.js +0 -3
  723. package/plugins/mergeCells/utils.mjs +0 -1
  724. package/plugins/multiColumnSorting/domHelpers.js +2 -12
  725. package/plugins/multiColumnSorting/domHelpers.mjs +2 -5
  726. package/plugins/multiColumnSorting/index.js +0 -2
  727. package/plugins/multiColumnSorting/multiColumnSorting.js +20 -67
  728. package/plugins/multiColumnSorting/multiColumnSorting.mjs +20 -45
  729. package/plugins/multiColumnSorting/rootComparator.js +2 -26
  730. package/plugins/multiColumnSorting/rootComparator.mjs +2 -15
  731. package/plugins/multiColumnSorting/utils.js +0 -7
  732. package/plugins/multiColumnSorting/utils.mjs +0 -4
  733. package/plugins/multipleSelectionHandles/index.js +0 -2
  734. package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +12 -110
  735. package/plugins/multipleSelectionHandles/multipleSelectionHandles.mjs +12 -88
  736. package/plugins/nestedHeaders/index.js +0 -2
  737. package/plugins/nestedHeaders/nestedHeaders.js +198 -211
  738. package/plugins/nestedHeaders/nestedHeaders.mjs +206 -191
  739. package/plugins/nestedHeaders/stateManager/headersTree.js +26 -96
  740. package/plugins/nestedHeaders/stateManager/headersTree.mjs +26 -76
  741. package/plugins/nestedHeaders/stateManager/index.js +55 -118
  742. package/plugins/nestedHeaders/stateManager/index.mjs +61 -105
  743. package/plugins/nestedHeaders/stateManager/matrixGenerator.js +7 -25
  744. package/plugins/nestedHeaders/stateManager/matrixGenerator.mjs +7 -18
  745. package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.js +12 -27
  746. package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.mjs +12 -17
  747. package/plugins/nestedHeaders/stateManager/nodeModifiers/expand.js +10 -25
  748. package/plugins/nestedHeaders/stateManager/nodeModifiers/expand.mjs +10 -15
  749. package/plugins/nestedHeaders/stateManager/nodeModifiers/hideColumn.js +3 -19
  750. package/plugins/nestedHeaders/stateManager/nodeModifiers/hideColumn.mjs +3 -13
  751. package/plugins/nestedHeaders/stateManager/nodeModifiers/index.js +2 -12
  752. package/plugins/nestedHeaders/stateManager/nodeModifiers/index.mjs +1 -3
  753. package/plugins/nestedHeaders/stateManager/nodeModifiers/showColumn.js +3 -22
  754. package/plugins/nestedHeaders/stateManager/nodeModifiers/showColumn.mjs +3 -14
  755. package/plugins/nestedHeaders/stateManager/nodeModifiers/utils/tree.js +3 -10
  756. package/plugins/nestedHeaders/stateManager/nodeModifiers/utils/tree.mjs +3 -7
  757. package/plugins/nestedHeaders/stateManager/settingsNormalizer.js +5 -36
  758. package/plugins/nestedHeaders/stateManager/settingsNormalizer.mjs +5 -20
  759. package/plugins/nestedHeaders/stateManager/sourceSettings.js +27 -81
  760. package/plugins/nestedHeaders/stateManager/sourceSettings.mjs +33 -71
  761. package/plugins/nestedHeaders/stateManager/utils.js +19 -22
  762. package/plugins/nestedHeaders/stateManager/utils.mjs +19 -20
  763. package/plugins/nestedHeaders/utils/ghostTable.js +23 -37
  764. package/plugins/nestedHeaders/utils/ghostTable.mjs +23 -36
  765. package/plugins/nestedRows/data/dataManager.js +47 -162
  766. package/plugins/nestedRows/data/dataManager.mjs +45 -143
  767. package/plugins/nestedRows/index.js +0 -2
  768. package/plugins/nestedRows/nestedRows.js +46 -119
  769. package/plugins/nestedRows/nestedRows.mjs +46 -86
  770. package/plugins/nestedRows/ui/_base.js +14 -8
  771. package/plugins/nestedRows/ui/_base.mjs +14 -7
  772. package/plugins/nestedRows/ui/collapsing.js +33 -133
  773. package/plugins/nestedRows/ui/collapsing.mjs +33 -111
  774. package/plugins/nestedRows/ui/contextMenu.js +9 -55
  775. package/plugins/nestedRows/ui/contextMenu.mjs +8 -33
  776. package/plugins/nestedRows/ui/headers.js +10 -49
  777. package/plugins/nestedRows/ui/headers.mjs +10 -34
  778. package/plugins/nestedRows/utils/rowMoveController.js +36 -79
  779. package/plugins/nestedRows/utils/rowMoveController.mjs +45 -71
  780. package/plugins/persistentState/index.js +0 -2
  781. package/plugins/persistentState/persistentState.js +16 -59
  782. package/plugins/persistentState/persistentState.mjs +16 -38
  783. package/plugins/persistentState/storage.js +22 -24
  784. package/plugins/persistentState/storage.mjs +22 -22
  785. package/plugins/registry.js +8 -52
  786. package/plugins/registry.mjs +8 -33
  787. package/plugins/search/index.js +0 -2
  788. package/plugins/search/search.js +22 -97
  789. package/plugins/search/search.mjs +22 -68
  790. package/plugins/touchScroll/index.js +0 -2
  791. package/plugins/touchScroll/touchScroll.js +21 -77
  792. package/plugins/touchScroll/touchScroll.mjs +21 -59
  793. package/plugins/trimRows/index.js +0 -2
  794. package/plugins/trimRows/trimRows.js +64 -86
  795. package/plugins/trimRows/trimRows.mjs +64 -63
  796. package/plugins/undoRedo/index.js +0 -14
  797. package/plugins/undoRedo/undoRedo.js +98 -250
  798. package/plugins/undoRedo/undoRedo.mjs +98 -220
  799. package/registry.js +0 -11
  800. package/registry.mjs +1 -2
  801. package/renderers/autocompleteRenderer/autocompleteRenderer.js +5 -14
  802. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +5 -6
  803. package/renderers/autocompleteRenderer/index.js +0 -2
  804. package/renderers/baseRenderer/baseRenderer.js +2 -11
  805. package/renderers/baseRenderer/baseRenderer.mjs +1 -7
  806. package/renderers/baseRenderer/index.js +0 -2
  807. package/renderers/checkboxRenderer/checkboxRenderer.js +22 -103
  808. package/renderers/checkboxRenderer/checkboxRenderer.mjs +22 -81
  809. package/renderers/checkboxRenderer/index.js +0 -2
  810. package/renderers/htmlRenderer/htmlRenderer.js +1 -7
  811. package/renderers/htmlRenderer/htmlRenderer.mjs +1 -1
  812. package/renderers/htmlRenderer/index.js +0 -2
  813. package/renderers/index.js +0 -19
  814. package/renderers/index.mjs +0 -1
  815. package/renderers/numericRenderer/index.js +0 -2
  816. package/renderers/numericRenderer/numericRenderer.js +1 -21
  817. package/renderers/numericRenderer/numericRenderer.mjs +1 -9
  818. package/renderers/passwordRenderer/index.js +0 -2
  819. package/renderers/passwordRenderer/passwordRenderer.js +1 -8
  820. package/renderers/passwordRenderer/passwordRenderer.mjs +1 -1
  821. package/renderers/registry.js +7 -16
  822. package/renderers/registry.mjs +7 -14
  823. package/renderers/textRenderer/index.js +0 -2
  824. package/renderers/textRenderer/textRenderer.js +1 -13
  825. package/renderers/textRenderer/textRenderer.mjs +1 -5
  826. package/renderers/timeRenderer/index.js +0 -2
  827. package/renderers/timeRenderer/timeRenderer.js +1 -6
  828. package/renderers/timeRenderer/timeRenderer.mjs +1 -1
  829. package/selection/highlight/highlight.js +24 -73
  830. package/selection/highlight/highlight.mjs +24 -50
  831. package/selection/highlight/types/activeHeader.js +14 -23
  832. package/selection/highlight/types/activeHeader.mjs +14 -12
  833. package/selection/highlight/types/area.js +15 -24
  834. package/selection/highlight/types/area.mjs +15 -13
  835. package/selection/highlight/types/cell.js +14 -23
  836. package/selection/highlight/types/cell.mjs +14 -12
  837. package/selection/highlight/types/customSelection.js +15 -24
  838. package/selection/highlight/types/customSelection.mjs +15 -13
  839. package/selection/highlight/types/fill.js +16 -20
  840. package/selection/highlight/types/fill.mjs +16 -9
  841. package/selection/highlight/types/header.js +16 -25
  842. package/selection/highlight/types/header.mjs +16 -14
  843. package/selection/highlight/types/index.js +17 -27
  844. package/selection/highlight/types/index.mjs +17 -13
  845. package/selection/highlight/visualSelection.js +35 -80
  846. package/selection/highlight/visualSelection.mjs +35 -68
  847. package/selection/index.js +0 -14
  848. package/selection/mouseEventHandler.js +19 -30
  849. package/selection/mouseEventHandler.mjs +19 -22
  850. package/selection/range.js +17 -30
  851. package/selection/range.mjs +17 -21
  852. package/selection/selection.js +72 -160
  853. package/selection/selection.mjs +77 -137
  854. package/selection/transformation.js +23 -39
  855. package/selection/transformation.mjs +23 -36
  856. package/selection/utils.js +23 -71
  857. package/selection/utils.mjs +23 -48
  858. package/shortcuts/context.js +24 -79
  859. package/shortcuts/context.mjs +24 -56
  860. package/shortcuts/index.js +0 -2
  861. package/shortcuts/keyObserver.js +0 -9
  862. package/shortcuts/keyObserver.mjs +0 -4
  863. package/shortcuts/manager.js +17 -37
  864. package/shortcuts/manager.mjs +17 -34
  865. package/shortcuts/recorder.js +9 -40
  866. package/shortcuts/recorder.mjs +9 -31
  867. package/shortcuts/utils.js +5 -20
  868. package/shortcuts/utils.mjs +5 -6
  869. package/tableView.js +239 -330
  870. package/tableView.mjs +239 -308
  871. package/translations/changesObservable/observable.js +14 -53
  872. package/translations/changesObservable/observable.mjs +14 -43
  873. package/translations/changesObservable/observer.js +13 -31
  874. package/translations/changesObservable/observer.mjs +13 -23
  875. package/translations/changesObservable/utils.js +1 -5
  876. package/translations/changesObservable/utils.mjs +1 -4
  877. package/translations/index.js +0 -11
  878. package/translations/indexMapper.js +80 -162
  879. package/translations/indexMapper.mjs +85 -134
  880. package/translations/mapCollections/aggregatedCollection.js +14 -50
  881. package/translations/mapCollections/aggregatedCollection.mjs +14 -37
  882. package/translations/mapCollections/index.js +0 -7
  883. package/translations/mapCollections/mapCollection.js +20 -34
  884. package/translations/mapCollections/mapCollection.mjs +20 -23
  885. package/translations/maps/hidingMap.js +7 -34
  886. package/translations/maps/hidingMap.mjs +7 -22
  887. package/translations/maps/index.js +1 -24
  888. package/translations/maps/index.mjs +1 -3
  889. package/translations/maps/indexMap.js +25 -33
  890. package/translations/maps/indexMap.mjs +25 -27
  891. package/translations/maps/indexesSequence.js +8 -40
  892. package/translations/maps/indexesSequence.mjs +8 -25
  893. package/translations/maps/linkedPhysicalIndexToValueMap.js +18 -81
  894. package/translations/maps/linkedPhysicalIndexToValueMap.mjs +17 -54
  895. package/translations/maps/physicalIndexToValueMap.js +7 -38
  896. package/translations/maps/physicalIndexToValueMap.mjs +7 -24
  897. package/translations/maps/trimmingMap.js +7 -34
  898. package/translations/maps/trimmingMap.mjs +7 -22
  899. package/translations/maps/utils/actionsOnIndexes.js +1 -7
  900. package/translations/maps/utils/actionsOnIndexes.mjs +1 -3
  901. package/translations/maps/utils/index.js +0 -13
  902. package/translations/maps/utils/index.mjs +0 -3
  903. package/translations/maps/utils/indexesSequence.js +1 -24
  904. package/translations/maps/utils/indexesSequence.mjs +1 -9
  905. package/translations/maps/utils/physicallyIndexed.js +1 -27
  906. package/translations/maps/utils/physicallyIndexed.mjs +1 -10
  907. package/utils/dataStructures/linkedList.js +23 -50
  908. package/utils/dataStructures/linkedList.mjs +23 -48
  909. package/utils/dataStructures/priorityMap.js +9 -47
  910. package/utils/dataStructures/priorityMap.mjs +9 -30
  911. package/utils/dataStructures/queue.js +19 -16
  912. package/utils/dataStructures/queue.mjs +19 -15
  913. package/utils/dataStructures/stack.js +19 -16
  914. package/utils/dataStructures/stack.mjs +19 -15
  915. package/utils/dataStructures/tree.js +19 -77
  916. package/utils/dataStructures/tree.mjs +19 -56
  917. package/utils/dataStructures/uniqueMap.js +18 -57
  918. package/utils/dataStructures/uniqueMap.mjs +18 -43
  919. package/utils/dataStructures/uniqueSet.js +5 -32
  920. package/utils/dataStructures/uniqueSet.mjs +5 -19
  921. package/utils/ghostTable.js +42 -106
  922. package/utils/ghostTable.mjs +40 -90
  923. package/utils/interval.js +17 -29
  924. package/utils/interval.mjs +18 -26
  925. package/utils/parseTable.js +11 -92
  926. package/utils/parseTable.mjs +11 -62
  927. package/utils/rootInstance.js +3 -14
  928. package/utils/rootInstance.mjs +3 -3
  929. package/utils/samplesGenerator.js +25 -51
  930. package/utils/samplesGenerator.mjs +25 -42
  931. package/utils/staticRegister.js +6 -33
  932. package/utils/staticRegister.mjs +6 -19
  933. package/validators/autocompleteValidator/autocompleteValidator.js +2 -10
  934. package/validators/autocompleteValidator/autocompleteValidator.mjs +2 -8
  935. package/validators/autocompleteValidator/index.js +0 -2
  936. package/validators/dateValidator/dateValidator.js +2 -21
  937. package/validators/dateValidator/dateValidator.mjs +2 -11
  938. package/validators/dateValidator/index.js +0 -2
  939. package/validators/index.js +0 -11
  940. package/validators/index.mjs +0 -1
  941. package/validators/numericValidator/index.js +0 -2
  942. package/validators/numericValidator/numericValidator.js +1 -7
  943. package/validators/numericValidator/numericValidator.mjs +1 -3
  944. package/validators/registry.js +7 -16
  945. package/validators/registry.mjs +7 -14
  946. package/validators/timeValidator/index.js +0 -2
  947. package/validators/timeValidator/timeValidator.js +6 -18
  948. package/validators/timeValidator/timeValidator.mjs +8 -13
package/core.mjs CHANGED
@@ -1,25 +1,26 @@
1
+ import "core-js/modules/es.symbol.js";
2
+ import "core-js/modules/es.symbol.description.js";
3
+ import "core-js/modules/es.symbol.iterator.js";
4
+ import "core-js/modules/es.function.name.js";
5
+ import "core-js/modules/es.object.freeze.js";
6
+ var _templateObject, _templateObject2;
1
7
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
-
8
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
3
9
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
-
5
10
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
-
7
- function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
8
-
11
+ function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
9
12
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
10
-
11
13
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
12
-
13
14
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
-
15
15
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
-
17
16
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
18
-
19
17
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
20
-
21
18
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
22
-
19
+ import "core-js/modules/es.array.iterator.js";
20
+ import "core-js/modules/es.object.to-string.js";
21
+ import "core-js/modules/es.set.js";
22
+ import "core-js/modules/es.string.iterator.js";
23
+ import "core-js/modules/web.dom-collections.iterator.js";
23
24
  import "core-js/modules/es.array.includes.js";
24
25
  import "core-js/modules/es.array.sort.js";
25
26
  import "core-js/modules/es.array.splice.js";
@@ -32,24 +33,18 @@ import "core-js/modules/es.array.map.js";
32
33
  import "core-js/modules/es.regexp.exec.js";
33
34
  import "core-js/modules/es.string.replace.js";
34
35
  import "core-js/modules/es.array.from.js";
35
- import "core-js/modules/es.string.iterator.js";
36
36
  import "core-js/modules/es.array.index-of.js";
37
37
  import "core-js/modules/es.array.reverse.js";
38
- import "core-js/modules/es.object.to-string.js";
39
38
  import "core-js/modules/web.dom-collections.for-each.js";
40
39
  import "core-js/modules/web.timers.js";
41
40
  import "core-js/modules/web.immediate.js";
42
- import "core-js/modules/es.array.iterator.js";
43
41
  import "core-js/modules/es.map.js";
44
- import "core-js/modules/web.dom-collections.iterator.js";
45
- import "core-js/modules/es.symbol.js";
46
- import "core-js/modules/es.symbol.description.js";
47
- import "core-js/modules/es.symbol.iterator.js";
48
- import "core-js/modules/es.function.name.js";
49
- import { addClass, empty, removeClass } from "./helpers/dom/element.mjs";
42
+ import { addClass, empty, observeVisibilityChangeOnce, removeClass } from "./helpers/dom/element.mjs";
50
43
  import { isFunction } from "./helpers/function.mjs";
51
44
  import { isDefined, isUndefined, isRegExp, _injectProductInfo, isEmpty } from "./helpers/mixed.mjs";
52
45
  import { isMobileBrowser, isIpadOS } from "./helpers/browser.mjs";
46
+ import { warn } from "./helpers/console.mjs";
47
+ import { toSingleLine } from "./helpers/templateLiteralTag.mjs";
53
48
  import EditorManager from "./editorManager.mjs";
54
49
  import EventManager from "./eventManager.mjs";
55
50
  import { deepClone, duckSchema, isObjectEqual, isObject, deepObjectSize, hasOwnProperty, createObjectPropListener, objectEach } from "./helpers/object.mjs";
@@ -57,12 +52,13 @@ import { arrayMap, arrayEach, arrayReduce, getDifferenceOfArrays, stringToArray,
57
52
  import { instanceToHTML } from "./utils/parseTable.mjs";
58
53
  import { getPlugin, getPluginsNames } from "./plugins/registry.mjs";
59
54
  import { getRenderer } from "./renderers/registry.mjs";
55
+ import { getEditor } from "./editors/registry.mjs";
60
56
  import { getValidator } from "./validators/registry.mjs";
61
57
  import { randomString, toUpperCaseFirst } from "./helpers/string.mjs";
62
58
  import { rangeEach, rangeEachReverse, isNumericLike } from "./helpers/number.mjs";
63
59
  import TableView from "./tableView.mjs";
64
- import DataSource from "./dataSource.mjs";
65
- import { cellMethodLookupFactory, spreadsheetColumnLabel } from "./helpers/data.mjs";
60
+ import DataSource from "./dataMap/dataSource.mjs";
61
+ import { spreadsheetColumnLabel } from "./helpers/data.mjs";
66
62
  import { IndexMapper } from "./translations/index.mjs";
67
63
  import { registerAsRootInstance, hasValidParameter, isRootInstance } from "./utils/rootInstance.mjs";
68
64
  import { ViewportColumnsCalculator } from "./3rdparty/walkontable/src/index.mjs";
@@ -75,8 +71,9 @@ import { createUniqueMap } from "./utils/dataStructures/uniqueMap.mjs";
75
71
  import { createShortcutManager } from "./shortcuts/index.mjs";
76
72
  var SHORTCUTS_GROUP = 'gridDefault';
77
73
  var activeGuid = null;
78
- /* eslint-disable jsdoc/require-description-complete-sentence */
74
+ var deprecationWarns = new Set();
79
75
 
76
+ /* eslint-disable jsdoc/require-description-complete-sentence */
80
77
  /**
81
78
  * Handsontable constructor.
82
79
  *
@@ -84,27 +81,51 @@ var activeGuid = null;
84
81
  * @class Core
85
82
  * @description
86
83
  *
87
- * The `Handsontable` class to which we refer as to `Core`, allows you to modify the grid's behavior by using one of the available public methods.
84
+ * The `Handsontable` class (known as the `Core`) lets you modify the grid's behavior by using Handsontable's public API methods.
85
+ *
86
+ * ::: only-for react
87
+ * To use these methods, associate a Handsontable instance with your instance
88
+ * of the [`HotTable` component](@/guides/getting-started/installation.md#use-the-hottable-component),
89
+ * by using React's `ref` feature (read more on the [Instance methods](@/guides/getting-started/react-methods.md) page).
90
+ * :::
88
91
  *
89
92
  * ## How to call a method
90
93
  *
94
+ * ::: only-for javascript
91
95
  * ```js
92
- * // First, let's contruct Handsontable
96
+ * // create a Handsontable instance
93
97
  * const hot = new Handsontable(document.getElementById('example'), options);
94
98
  *
95
- * // Then, let's use the setDataAtCell method
99
+ * // call a method
96
100
  * hot.setDataAtCell(0, 0, 'new value');
97
101
  * ```
102
+ * :::
103
+ *
104
+ * ::: only-for react
105
+ * ```jsx{3,7,13}
106
+ * import { useRef } from 'react';
107
+ *
108
+ * const hotTableComponent = useRef(null);
109
+ *
110
+ * <HotTable
111
+ * // associate your `HotTable` component with a Handsontable instance
112
+ * ref={hotTableComponent}
113
+ * settings={options}
114
+ * />
115
+ *
116
+ * // access the Handsontable instance, under the `.current.hotInstance` property
117
+ * // call a method
118
+ * hotTableComponent.current.hotInstance.setDataAtCell(0, 0, 'new value');
119
+ * ```
120
+ * :::
98
121
  *
99
122
  * @param {HTMLElement} rootElement The element to which the Handsontable instance is injected.
100
123
  * @param {object} userSettings The user defined options.
101
124
  * @param {boolean} [rootInstanceSymbol=false] Indicates if the instance is root of all later instances created.
102
125
  */
103
-
104
126
  export default function Core(rootElement, userSettings) {
105
127
  var _userSettings$layoutD,
106
- _this = this;
107
-
128
+ _this = this;
108
129
  var rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
109
130
  var preventScrollingToCell = false;
110
131
  var instance = this;
@@ -114,19 +135,17 @@ export default function Core(rootElement, userSettings) {
114
135
  var grid;
115
136
  var editorManager;
116
137
  var firstRun = true;
117
-
118
138
  if (hasValidParameter(rootInstanceSymbol)) {
119
139
  registerAsRootInstance(this);
120
- } // TODO: check if references to DOM elements should be move to UI layer (Walkontable)
140
+ }
121
141
 
142
+ // TODO: check if references to DOM elements should be move to UI layer (Walkontable)
122
143
  /**
123
144
  * Reference to the container element.
124
145
  *
125
146
  * @private
126
147
  * @type {HTMLElement}
127
148
  */
128
-
129
-
130
149
  this.rootElement = rootElement;
131
150
  /**
132
151
  * The nearest document over container.
@@ -134,7 +153,6 @@ export default function Core(rootElement, userSettings) {
134
153
  * @private
135
154
  * @type {Document}
136
155
  */
137
-
138
156
  this.rootDocument = rootElement.ownerDocument;
139
157
  /**
140
158
  * Window object over container's document.
@@ -142,7 +160,6 @@ export default function Core(rootElement, userSettings) {
142
160
  * @private
143
161
  * @type {Window}
144
162
  */
145
-
146
163
  this.rootWindow = this.rootDocument.defaultView;
147
164
  /**
148
165
  * A boolean to tell if the Handsontable has been fully destroyed. This is set to `true`
@@ -152,7 +169,6 @@ export default function Core(rootElement, userSettings) {
152
169
  * @member isDestroyed
153
170
  * @type {boolean}
154
171
  */
155
-
156
172
  this.isDestroyed = false;
157
173
  /**
158
174
  * The counter determines how many times the render suspending was called. It allows
@@ -163,7 +179,6 @@ export default function Core(rootElement, userSettings) {
163
179
  * @private
164
180
  * @type {number}
165
181
  */
166
-
167
182
  this.renderSuspendedCounter = 0;
168
183
  /**
169
184
  * The counter determines how many times the execution suspending was called. It allows
@@ -174,11 +189,11 @@ export default function Core(rootElement, userSettings) {
174
189
  * @private
175
190
  * @type {number}
176
191
  */
177
-
178
192
  this.executionSuspendedCounter = 0;
179
193
  var layoutDirection = (_userSettings$layoutD = userSettings === null || userSettings === void 0 ? void 0 : userSettings.layoutDirection) !== null && _userSettings$layoutD !== void 0 ? _userSettings$layoutD : 'inherit';
180
194
  var rootElementDirection = ['rtl', 'ltr'].includes(layoutDirection) ? layoutDirection : this.rootWindow.getComputedStyle(this.rootElement).direction;
181
195
  this.rootElement.setAttribute('dir', rootElementDirection);
196
+
182
197
  /**
183
198
  * Checks if the grid is rendered using the right-to-left layout direction.
184
199
  *
@@ -187,10 +202,10 @@ export default function Core(rootElement, userSettings) {
187
202
  * @function isRtl
188
203
  * @returns {boolean} True if RTL.
189
204
  */
190
-
191
205
  this.isRtl = function () {
192
206
  return rootElementDirection === 'rtl';
193
207
  };
208
+
194
209
  /**
195
210
  * Checks if the grid is rendered using the left-to-right layout direction.
196
211
  *
@@ -199,11 +214,10 @@ export default function Core(rootElement, userSettings) {
199
214
  * @function isLtr
200
215
  * @returns {boolean} True if LTR.
201
216
  */
202
-
203
-
204
217
  this.isLtr = function () {
205
218
  return !instance.isRtl();
206
219
  };
220
+
207
221
  /**
208
222
  * Returns 1 for LTR; -1 for RTL. Useful for calculations.
209
223
  *
@@ -212,12 +226,9 @@ export default function Core(rootElement, userSettings) {
212
226
  * @function getDirectionFactor
213
227
  * @returns {number} Returns 1 for LTR; -1 for RTL.
214
228
  */
215
-
216
-
217
229
  this.getDirectionFactor = function () {
218
230
  return instance.isLtr() ? 1 : -1;
219
231
  };
220
-
221
232
  userSettings.language = getValidLanguageCode(userSettings.language);
222
233
  var metaManager = new MetaManager(instance, userSettings, [DynamicCellMetaMod, ExtendMetaPropertiesMod]);
223
234
  var tableMeta = metaManager.getTableMeta();
@@ -226,11 +237,9 @@ export default function Core(rootElement, userSettings) {
226
237
  this.container = this.rootDocument.createElement('div');
227
238
  this.renderCall = false;
228
239
  rootElement.insertBefore(this.container, rootElement.firstChild);
229
-
230
240
  if (isRootInstance(this)) {
231
241
  _injectProductInfo(userSettings.licenseKey, rootElement);
232
242
  }
233
-
234
243
  this.guid = "ht_".concat(randomString()); // this is the namespace for global events
235
244
 
236
245
  /**
@@ -240,7 +249,6 @@ export default function Core(rootElement, userSettings) {
240
249
  * @member columnIndexMapper
241
250
  * @type {IndexMapper}
242
251
  */
243
-
244
252
  this.columnIndexMapper = new IndexMapper();
245
253
  /**
246
254
  * Instance of index mapper which is responsible for managing the row indexes.
@@ -249,25 +257,24 @@ export default function Core(rootElement, userSettings) {
249
257
  * @member rowIndexMapper
250
258
  * @type {IndexMapper}
251
259
  */
252
-
253
260
  this.rowIndexMapper = new IndexMapper();
254
261
  dataSource = new DataSource(instance);
255
-
256
262
  if (!this.rootElement.id || this.rootElement.id.substring(0, 3) === 'ht_') {
257
263
  this.rootElement.id = this.guid; // if root element does not have an id, assign a random id
258
264
  }
259
265
 
260
266
  var visualToRenderableCoords = function visualToRenderableCoords(coords) {
261
267
  var visualRow = coords.row,
262
- visualColumn = coords.col;
263
- return instance._createCellCoords( // We just store indexes for rows and columns without headers.
268
+ visualColumn = coords.col;
269
+ return instance._createCellCoords(
270
+ // We just store indexes for rows and columns without headers.
264
271
  visualRow >= 0 ? instance.rowIndexMapper.getRenderableFromVisualIndex(visualRow) : visualRow, visualColumn >= 0 ? instance.columnIndexMapper.getRenderableFromVisualIndex(visualColumn) : visualColumn);
265
272
  };
266
-
267
273
  var renderableToVisualCoords = function renderableToVisualCoords(coords) {
268
274
  var renderableRow = coords.row,
269
- renderableColumn = coords.col;
270
- return instance._createCellCoords( // We just store indexes for rows and columns without headers.
275
+ renderableColumn = coords.col;
276
+ return instance._createCellCoords(
277
+ // We just store indexes for rows and columns without headers.
271
278
  renderableRow >= 0 ? instance.rowIndexMapper.getVisualFromRenderableIndex(renderableRow) : renderableRow, renderableColumn >= 0 ? instance.columnIndexMapper.getVisualFromRenderableIndex(renderableColumn) : renderableColumn // eslint-disable-line max-len
272
279
  );
273
280
  };
@@ -313,15 +320,12 @@ export default function Core(rootElement, userSettings) {
313
320
  }
314
321
  });
315
322
  this.selection = selection;
316
-
317
323
  var onIndexMapperCacheUpdate = function onIndexMapperCacheUpdate(_ref) {
318
324
  var hiddenIndexesChanged = _ref.hiddenIndexesChanged;
319
-
320
325
  if (hiddenIndexesChanged) {
321
326
  _this.selection.refresh();
322
327
  }
323
328
  };
324
-
325
329
  this.columnIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);
326
330
  this.rowIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);
327
331
  this.selection.addLocalHook('beforeSetRangeStart', function (cellCoords) {
@@ -332,49 +336,34 @@ export default function Core(rootElement, userSettings) {
332
336
  });
333
337
  this.selection.addLocalHook('beforeSetRangeEnd', function (cellCoords) {
334
338
  _this.runHooks('beforeSetRangeEnd', cellCoords);
335
-
336
339
  if (cellCoords.row < 0) {
337
340
  cellCoords.row = _this.view._wt.wtTable.getFirstVisibleRow();
338
341
  }
339
-
340
342
  if (cellCoords.col < 0) {
341
343
  cellCoords.col = _this.view._wt.wtTable.getFirstVisibleColumn();
342
344
  }
343
345
  });
344
346
  this.selection.addLocalHook('afterSetRangeEnd', function (cellCoords) {
345
347
  var preventScrolling = createObjectPropListener(false);
346
-
347
348
  var selectionRange = _this.selection.getSelectedRange();
348
-
349
349
  var _selectionRange$curre = selectionRange.current(),
350
- from = _selectionRange$curre.from,
351
- to = _selectionRange$curre.to;
352
-
350
+ from = _selectionRange$curre.from,
351
+ to = _selectionRange$curre.to;
353
352
  var selectionLayerLevel = selectionRange.size() - 1;
354
-
355
353
  _this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);
356
-
357
354
  _this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel); // eslint-disable-line max-len
358
355
 
359
-
360
356
  var isSelectedByAnyHeader = _this.selection.isSelectedByAnyHeader();
361
-
362
357
  var currentSelectedRange = _this.selection.selectedRange.current();
363
-
364
358
  var scrollToCell = true;
365
-
366
359
  if (preventScrollingToCell) {
367
360
  scrollToCell = false;
368
361
  }
369
-
370
362
  if (preventScrolling.isTouched()) {
371
363
  scrollToCell = !preventScrolling.value;
372
364
  }
373
-
374
365
  var isSelectedByRowHeader = _this.selection.isSelectedByRowHeader();
375
-
376
366
  var isSelectedByColumnHeader = _this.selection.isSelectedByColumnHeader();
377
-
378
367
  if (scrollToCell !== false) {
379
368
  if (!isSelectedByAnyHeader) {
380
369
  if (currentSelectedRange && !_this.selection.isMultiple()) {
@@ -387,11 +376,11 @@ export default function Core(rootElement, userSettings) {
387
376
  } else if (isSelectedByColumnHeader) {
388
377
  _this.view.scrollViewportHorizontally(instance.columnIndexMapper.getRenderableFromVisualIndex(cellCoords.col));
389
378
  }
390
- } // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected
379
+ }
380
+
381
+ // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected
391
382
  // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing
392
383
  // the Border class this should be removed.
393
-
394
-
395
384
  if (isSelectedByRowHeader && isSelectedByColumnHeader) {
396
385
  addClass(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);
397
386
  } else if (isSelectedByRowHeader) {
@@ -403,22 +392,18 @@ export default function Core(rootElement, userSettings) {
403
392
  } else {
404
393
  removeClass(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);
405
394
  }
406
-
407
395
  _this._refreshBorders(null);
408
396
  });
409
397
  this.selection.addLocalHook('afterSelectionFinished', function (cellRanges) {
410
398
  var selectionLayerLevel = cellRanges.length - 1;
411
399
  var _cellRanges$selection = cellRanges[selectionLayerLevel],
412
- from = _cellRanges$selection.from,
413
- to = _cellRanges$selection.to;
414
-
400
+ from = _cellRanges$selection.from,
401
+ to = _cellRanges$selection.to;
415
402
  _this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);
416
-
417
403
  _this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);
418
404
  });
419
405
  this.selection.addLocalHook('afterIsMultipleSelection', function (isMultiple) {
420
406
  var changedIsMultiple = _this.runHooks('afterIsMultipleSelection', isMultiple.value);
421
-
422
407
  if (isMultiple.value) {
423
408
  isMultiple.value = changedIsMultiple;
424
409
  }
@@ -437,299 +422,297 @@ export default function Core(rootElement, userSettings) {
437
422
  });
438
423
  this.selection.addLocalHook('afterDeselect', function () {
439
424
  editorManager.destroyEditor();
440
-
441
425
  _this._refreshBorders();
442
-
443
426
  removeClass(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);
444
-
445
427
  _this.runHooks('afterDeselect');
446
428
  });
447
429
  this.selection.addLocalHook('insertRowRequire', function (totalRows) {
448
- _this.alter('insert_row', totalRows, 1, 'auto');
430
+ _this.alter('insert_row_above', totalRows, 1, 'auto');
449
431
  });
450
432
  this.selection.addLocalHook('insertColRequire', function (totalCols) {
451
- _this.alter('insert_col', totalCols, 1, 'auto');
433
+ _this.alter('insert_col_start', totalCols, 1, 'auto');
452
434
  });
453
435
  grid = {
454
436
  /**
455
437
  * Inserts or removes rows and columns.
456
438
  *
457
439
  * @private
458
- * @param {string} action Possible values: "insert_row", "insert_col", "remove_row", "remove_col".
440
+ * @param {string} action Possible values: "insert_row_above", "insert_row_below", "insert_col_start", "insert_col_end",
441
+ * "remove_row", "remove_col".
459
442
  * @param {number|Array} index Row or column visual index which from the alter action will be triggered.
460
443
  * Alter actions such as "remove_row" and "remove_col" support array indexes in the
461
444
  * format `[[index, amount], [index, amount]...]` this can be used to remove
462
445
  * non-consecutive columns or rows in one call.
463
- * @param {number} [amount=1] Ammount rows or columns to remove.
446
+ * @param {number} [amount=1] Amount of rows or columns to remove.
464
447
  * @param {string} [source] Optional. Source of hook runner.
465
448
  * @param {boolean} [keepEmptyRows] Optional. Flag for preventing deletion of empty rows.
466
449
  */
467
450
  alter: function alter(action, index) {
451
+ var _index, _index2;
468
452
  var amount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
469
453
  var source = arguments.length > 3 ? arguments[3] : undefined;
470
454
  var keepEmptyRows = arguments.length > 4 ? arguments[4] : undefined;
471
- var delta;
472
-
473
455
  var normalizeIndexesGroup = function normalizeIndexesGroup(indexes) {
474
456
  if (indexes.length === 0) {
475
457
  return [];
476
458
  }
459
+ var sortedIndexes = _toConsumableArray(indexes);
477
460
 
478
- var sortedIndexes = _toConsumableArray(indexes); // Sort the indexes in ascending order.
479
-
480
-
461
+ // Sort the indexes in ascending order.
481
462
  sortedIndexes.sort(function (_ref2, _ref3) {
482
463
  var _ref4 = _slicedToArray(_ref2, 1),
483
- indexA = _ref4[0];
484
-
464
+ indexA = _ref4[0];
485
465
  var _ref5 = _slicedToArray(_ref3, 1),
486
- indexB = _ref5[0];
487
-
466
+ indexB = _ref5[0];
488
467
  if (indexA === indexB) {
489
468
  return 0;
490
469
  }
491
-
492
470
  return indexA > indexB ? 1 : -1;
493
- }); // Normalize the {index, amount} groups into bigger groups.
471
+ });
494
472
 
473
+ // Normalize the {index, amount} groups into bigger groups.
495
474
  var normalizedIndexes = arrayReduce(sortedIndexes, function (acc, _ref6) {
496
475
  var _ref7 = _slicedToArray(_ref6, 2),
497
- groupIndex = _ref7[0],
498
- groupAmount = _ref7[1];
499
-
476
+ groupIndex = _ref7[0],
477
+ groupAmount = _ref7[1];
500
478
  var previousItem = acc[acc.length - 1];
501
-
502
479
  var _previousItem = _slicedToArray(previousItem, 2),
503
- prevIndex = _previousItem[0],
504
- prevAmount = _previousItem[1];
505
-
480
+ prevIndex = _previousItem[0],
481
+ prevAmount = _previousItem[1];
506
482
  var prevLastIndex = prevIndex + prevAmount;
507
-
508
483
  if (groupIndex <= prevLastIndex) {
509
484
  var amountToAdd = Math.max(groupAmount - (prevLastIndex - groupIndex), 0);
510
485
  previousItem[1] += amountToAdd;
511
486
  } else {
512
487
  acc.push([groupIndex, groupAmount]);
513
488
  }
514
-
515
489
  return acc;
516
490
  }, [sortedIndexes[0]]);
517
491
  return normalizedIndexes;
518
492
  };
519
- /* eslint-disable no-case-declarations */
520
-
521
493
 
494
+ /* eslint-disable no-case-declarations */
522
495
  switch (action) {
523
496
  case 'insert_row':
497
+ // backward compatibility
498
+ if (!deprecationWarns.has(action)) {
499
+ deprecationWarns.add(action);
500
+ warn(toSingleLine(_templateObject || (_templateObject = _taggedTemplateLiteral(["The `", "` action of the `alter()` method is deprecated and will be removed \n in the next major release of Handsontable. Use the `insert_row_above` action instead."], ["The \\`", "\\` action of the \\`alter()\\` method is deprecated and will be removed\\x20\n in the next major release of Handsontable. Use the \\`insert_row_above\\` action instead."])), action));
501
+ }
502
+ // falls through
503
+ case 'insert_row_below':
504
+ case 'insert_row_above':
524
505
  var numberOfSourceRows = instance.countSourceRows();
525
-
526
506
  if (tableMeta.maxRows === numberOfSourceRows) {
527
507
  return;
528
- } // eslint-disable-next-line no-param-reassign
529
-
530
-
531
- index = isDefined(index) ? index : numberOfSourceRows;
532
- delta = datamap.createRow(index, amount, source);
508
+ }
533
509
 
534
- if (delta) {
535
- metaManager.createRow(instance.toPhysicalRow(index), amount);
510
+ // `above` is the default behavior for creating new rows
511
+ var insertRowMode = action === 'insert_row_below' ? 'below' : 'above';
512
+
513
+ // The line below ensures backward compatibility of the `alter()` method's `insert_row` action.
514
+ // Calling the `insert_row` action with no arguments adds a new row at the end of the data set.
515
+ // Calling the `insert_row_above` action adds a new row at the beginning of the data set.
516
+ // eslint-disable-next-line no-param-reassign
517
+ index = (_index = index) !== null && _index !== void 0 ? _index : action === 'insert_row' || insertRowMode === 'below' ? numberOfSourceRows : 0;
518
+ var _datamap$createRow = datamap.createRow(index, amount, {
519
+ source: source,
520
+ mode: insertRowMode
521
+ }),
522
+ rowDelta = _datamap$createRow.delta,
523
+ startRowPhysicalIndex = _datamap$createRow.startPhysicalIndex;
524
+ if (rowDelta) {
536
525
  var currentSelectedRange = selection.selectedRange.current();
537
526
  var currentFromRange = currentSelectedRange === null || currentSelectedRange === void 0 ? void 0 : currentSelectedRange.from;
538
- var currentFromRow = currentFromRange === null || currentFromRange === void 0 ? void 0 : currentFromRange.row; // Moving down the selection (when it exist). It should be present on the "old" row.
539
- // TODO: The logic here should be handled by selection module.
540
-
541
- if (isDefined(currentFromRow) && currentFromRow >= index) {
527
+ var currentFromRow = currentFromRange === null || currentFromRange === void 0 ? void 0 : currentFromRange.row;
528
+ var startVisualRowIndex = instance.toVisualRow(startRowPhysicalIndex);
529
+ if (selection.isSelectedByCorner()) {
530
+ instance.selectAll();
531
+ } else if (isDefined(currentFromRow) && currentFromRow >= startVisualRowIndex) {
532
+ // Moving the selection (if it exists) downward – it should be applied to the "old" row.
533
+ // TODO: The logic here should be handled by selection module.
542
534
  var _currentSelectedRange = currentSelectedRange.to,
543
- currentToRow = _currentSelectedRange.row,
544
- currentToColumn = _currentSelectedRange.col;
545
- var currentFromColumn = currentFromRange.col; // Workaround: headers are not stored inside selection.
535
+ currentToRow = _currentSelectedRange.row,
536
+ currentToColumn = _currentSelectedRange.col;
537
+ var currentFromColumn = currentFromRange.col;
546
538
 
539
+ // Workaround: headers are not stored inside selection.
547
540
  if (selection.isSelectedByRowHeader()) {
548
541
  currentFromColumn = -1;
549
- } // Remove from the stack the last added selection as that selection below will be
550
- // replaced by new transformed selection.
551
-
552
-
553
- selection.getSelectedRange().pop(); // I can't use transforms as they don't work in negative indexes.
542
+ }
554
543
 
555
- selection.setRangeStartOnly(instance._createCellCoords(currentFromRow + delta, currentFromColumn), true);
556
- selection.setRangeEnd(instance._createCellCoords(currentToRow + delta, currentToColumn)); // will call render() internally
544
+ // Remove from the stack the last added selection as that selection below will be
545
+ // replaced by new transformed selection.
546
+ selection.getSelectedRange().pop();
547
+ // I can't use transforms as they don't work in negative indexes.
548
+ selection.setRangeStartOnly(instance._createCellCoords(currentFromRow + rowDelta, currentFromColumn), true);
549
+ selection.setRangeEnd(instance._createCellCoords(currentToRow + rowDelta, currentToColumn)); // will call render() internally
557
550
  } else {
558
551
  instance._refreshBorders(); // it will call render and prepare methods
559
-
560
552
  }
561
553
  }
562
554
 
563
555
  break;
564
-
565
556
  case 'insert_col':
566
- delta = datamap.createCol(index, amount, source);
567
-
568
- if (delta) {
569
- metaManager.createColumn(instance.toPhysicalColumn(index), amount);
570
-
557
+ // backward compatibility
558
+ if (!deprecationWarns.has(action)) {
559
+ deprecationWarns.add(action);
560
+ warn(toSingleLine(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["The `", "` action of the `alter()` method is deprecated and will be removed \n in the next major release of Handsontable. Use the `insert_col_start` action instead."], ["The \\`", "\\` action of the \\`alter()\\` method is deprecated and will be removed\\x20\n in the next major release of Handsontable. Use the \\`insert_col_start\\` action instead."])), action));
561
+ }
562
+ // falls through
563
+ case 'insert_col_start':
564
+ case 'insert_col_end':
565
+ // "start" is a default behavior for creating new columns
566
+ var insertColumnMode = action === 'insert_col_end' ? 'end' : 'start';
567
+
568
+ // The line below ensures backward compatibility of the `alter()` method's `insert_col` action.
569
+ // Calling the `insert_col` action with no arguments adds a new column to the right of the data set.
570
+ // Calling the `insert_col_start` action adds a new column to the left of the data set.
571
+ // eslint-disable-next-line no-param-reassign
572
+ index = (_index2 = index) !== null && _index2 !== void 0 ? _index2 : action === 'insert_col' || insertColumnMode === 'end' ? instance.countSourceCols() : 0;
573
+ var _datamap$createCol = datamap.createCol(index, amount, {
574
+ source: source,
575
+ mode: insertColumnMode
576
+ }),
577
+ colDelta = _datamap$createCol.delta,
578
+ startColumnPhysicalIndex = _datamap$createCol.startPhysicalIndex;
579
+ if (colDelta) {
571
580
  if (Array.isArray(tableMeta.colHeaders)) {
572
- var spliceArray = [index, 0];
573
- spliceArray.length += delta; // inserts empty (undefined) elements at the end of an array
574
-
581
+ var spliceArray = [instance.toVisualColumn(startColumnPhysicalIndex), 0];
582
+ spliceArray.length += colDelta; // inserts empty (undefined) elements at the end of an array
575
583
  Array.prototype.splice.apply(tableMeta.colHeaders, spliceArray); // inserts empty (undefined) elements into the colHeader array
576
584
  }
577
585
 
578
586
  var _currentSelectedRange2 = selection.selectedRange.current();
579
-
580
587
  var _currentFromRange = _currentSelectedRange2 === null || _currentSelectedRange2 === void 0 ? void 0 : _currentSelectedRange2.from;
581
-
582
- var _currentFromColumn = _currentFromRange === null || _currentFromRange === void 0 ? void 0 : _currentFromRange.col; // Moving right the selection (when it exist). It should be present on the "old" row.
583
- // TODO: The logic here should be handled by selection module.
584
-
585
-
586
- if (isDefined(_currentFromColumn) && _currentFromColumn >= index) {
588
+ var _currentFromColumn = _currentFromRange === null || _currentFromRange === void 0 ? void 0 : _currentFromRange.col;
589
+ var startVisualColumnIndex = instance.toVisualColumn(startColumnPhysicalIndex);
590
+ if (selection.isSelectedByCorner()) {
591
+ instance.selectAll();
592
+ } else if (isDefined(_currentFromColumn) && _currentFromColumn >= startVisualColumnIndex) {
593
+ // Moving the selection (if it exists) rightward it should be applied to the "old" column.
594
+ // TODO: The logic here should be handled by selection module.
587
595
  var _currentSelectedRange3 = _currentSelectedRange2.to,
588
- _currentToRow = _currentSelectedRange3.row,
589
- _currentToColumn = _currentSelectedRange3.col;
590
- var _currentFromRow = _currentFromRange.row; // Workaround: headers are not stored inside selection.
596
+ _currentToRow = _currentSelectedRange3.row,
597
+ _currentToColumn = _currentSelectedRange3.col;
598
+ var _currentFromRow = _currentFromRange.row;
591
599
 
600
+ // Workaround: headers are not stored inside selection.
592
601
  if (selection.isSelectedByColumnHeader()) {
593
602
  _currentFromRow = -1;
594
- } // Remove from the stack the last added selection as that selection below will be
595
- // replaced by new transformed selection.
596
-
603
+ }
597
604
 
598
- selection.getSelectedRange().pop(); // I can't use transforms as they don't work in negative indexes.
605
+ // Remove from the stack the last added selection as that selection below will be
606
+ // replaced by new transformed selection.
607
+ selection.getSelectedRange().pop();
599
608
 
600
- selection.setRangeStartOnly(instance._createCellCoords(_currentFromRow, _currentFromColumn + delta), true);
601
- selection.setRangeEnd(instance._createCellCoords(_currentToRow, _currentToColumn + delta)); // will call render() internally
609
+ // I can't use transforms as they don't work in negative indexes.
610
+ selection.setRangeStartOnly(instance._createCellCoords(_currentFromRow, _currentFromColumn + colDelta), true);
611
+ selection.setRangeEnd(instance._createCellCoords(_currentToRow, _currentToColumn + colDelta)); // will call render() internally
602
612
  } else {
603
613
  instance._refreshBorders(); // it will call render and prepare methods
604
-
605
614
  }
606
615
  }
607
616
 
608
617
  break;
609
-
610
618
  case 'remove_row':
611
619
  var removeRow = function removeRow(indexes) {
612
- var offset = 0; // Normalize the {index, amount} groups into bigger groups.
620
+ var offset = 0;
613
621
 
622
+ // Normalize the {index, amount} groups into bigger groups.
614
623
  arrayEach(indexes, function (_ref8) {
615
624
  var _ref9 = _slicedToArray(_ref8, 2),
616
- groupIndex = _ref9[0],
617
- groupAmount = _ref9[1];
625
+ groupIndex = _ref9[0],
626
+ groupAmount = _ref9[1];
627
+ var calcIndex = isEmpty(groupIndex) ? instance.countRows() - 1 : Math.max(groupIndex - offset, 0);
618
628
 
619
- var calcIndex = isEmpty(groupIndex) ? instance.countRows() - 1 : Math.max(groupIndex - offset, 0); // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value
629
+ // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value
620
630
  // compatible with datamap.removeCol method.
621
-
622
631
  if (Number.isInteger(groupIndex)) {
623
632
  // eslint-disable-next-line no-param-reassign
624
633
  groupIndex = Math.max(groupIndex - offset, 0);
625
- } // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic
626
- // inside the datamap.removeRow breaks the removing functionality.
627
-
634
+ }
628
635
 
636
+ // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic
637
+ // inside the datamap.removeRow breaks the removing functionality.
629
638
  var wasRemoved = datamap.removeRow(groupIndex, groupAmount, source);
630
-
631
639
  if (!wasRemoved) {
632
640
  return;
633
641
  }
634
-
635
- metaManager.removeRow(instance.toPhysicalRow(calcIndex), groupAmount);
636
642
  var totalRows = instance.countRows();
637
643
  var fixedRowsTop = tableMeta.fixedRowsTop;
638
-
639
644
  if (fixedRowsTop >= calcIndex + 1) {
640
645
  tableMeta.fixedRowsTop -= Math.min(groupAmount, fixedRowsTop - calcIndex);
641
646
  }
642
-
643
647
  var fixedRowsBottom = tableMeta.fixedRowsBottom;
644
-
645
648
  if (fixedRowsBottom && calcIndex >= totalRows - fixedRowsBottom) {
646
649
  tableMeta.fixedRowsBottom -= Math.min(groupAmount, fixedRowsBottom);
647
650
  }
648
-
649
651
  offset += groupAmount;
650
652
  });
651
653
  };
652
-
653
654
  if (Array.isArray(index)) {
654
655
  removeRow(normalizeIndexesGroup(index));
655
656
  } else {
656
657
  removeRow([[index, amount]]);
657
658
  }
658
-
659
659
  grid.adjustRowsAndCols();
660
-
661
660
  instance._refreshBorders(); // it will call render and prepare methods
662
-
663
-
664
661
  break;
665
-
666
662
  case 'remove_col':
667
663
  var removeCol = function removeCol(indexes) {
668
- var offset = 0; // Normalize the {index, amount} groups into bigger groups.
664
+ var offset = 0;
669
665
 
666
+ // Normalize the {index, amount} groups into bigger groups.
670
667
  arrayEach(indexes, function (_ref10) {
671
668
  var _ref11 = _slicedToArray(_ref10, 2),
672
- groupIndex = _ref11[0],
673
- groupAmount = _ref11[1];
674
-
669
+ groupIndex = _ref11[0],
670
+ groupAmount = _ref11[1];
675
671
  var calcIndex = isEmpty(groupIndex) ? instance.countCols() - 1 : Math.max(groupIndex - offset, 0);
676
- var physicalColumnIndex = instance.toPhysicalColumn(calcIndex); // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value
677
- // compatible with datamap.removeCol method.
672
+ var physicalColumnIndex = instance.toPhysicalColumn(calcIndex);
678
673
 
674
+ // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value
675
+ // compatible with datamap.removeCol method.
679
676
  if (Number.isInteger(groupIndex)) {
680
677
  // eslint-disable-next-line no-param-reassign
681
678
  groupIndex = Math.max(groupIndex - offset, 0);
682
- } // TODO: for datamap.removeCol index should be passed as it is (with undefined and null values). If not, the logic
683
- // inside the datamap.removeCol breaks the removing functionality.
684
-
679
+ }
685
680
 
681
+ // TODO: for datamap.removeCol index should be passed as it is (with undefined and null values). If not, the logic
682
+ // inside the datamap.removeCol breaks the removing functionality.
686
683
  var wasRemoved = datamap.removeCol(groupIndex, groupAmount, source);
687
-
688
684
  if (!wasRemoved) {
689
685
  return;
690
686
  }
691
-
692
- metaManager.removeColumn(physicalColumnIndex, groupAmount);
693
687
  var fixedColumnsStart = tableMeta.fixedColumnsStart;
694
-
695
688
  if (fixedColumnsStart >= calcIndex + 1) {
696
689
  tableMeta.fixedColumnsStart -= Math.min(groupAmount, fixedColumnsStart - calcIndex);
697
690
  }
698
-
699
691
  if (Array.isArray(tableMeta.colHeaders)) {
700
692
  if (typeof physicalColumnIndex === 'undefined') {
701
693
  physicalColumnIndex = -1;
702
694
  }
703
-
704
695
  tableMeta.colHeaders.splice(physicalColumnIndex, groupAmount);
705
696
  }
706
-
707
697
  offset += groupAmount;
708
698
  });
709
699
  };
710
-
711
700
  if (Array.isArray(index)) {
712
701
  removeCol(normalizeIndexesGroup(index));
713
702
  } else {
714
703
  removeCol([[index, amount]]);
715
704
  }
716
-
717
705
  grid.adjustRowsAndCols();
718
-
719
706
  instance._refreshBorders(); // it will call render and prepare methods
720
707
 
721
-
722
708
  break;
723
-
724
709
  default:
725
710
  throw new Error("There is no such action \"".concat(action, "\""));
726
711
  }
727
-
728
712
  if (!keepEmptyRows) {
729
713
  grid.adjustRowsAndCols(); // makes sure that we did not add rows that will be removed in next refresh
730
714
  }
731
715
  },
732
-
733
716
  /**
734
717
  * Makes sure there are empty rows at the bottom of the table.
735
718
  *
@@ -740,118 +723,114 @@ export default function Core(rootElement, userSettings) {
740
723
  var minSpareRows = tableMeta.minSpareRows;
741
724
  var minCols = tableMeta.minCols;
742
725
  var minSpareCols = tableMeta.minSpareCols;
743
-
726
+ if (instance.countRows() === 0 && instance.countCols() === 0) {
727
+ selection.deselect();
728
+ }
744
729
  if (minRows) {
745
730
  // should I add empty rows to data source to meet minRows?
746
731
  var nrOfRows = instance.countRows();
747
-
748
732
  if (nrOfRows < minRows) {
749
733
  // The synchronization with cell meta is not desired here. For `minRows` option,
750
734
  // we don't want to touch/shift cell meta objects.
751
- datamap.createRow(nrOfRows, minRows - nrOfRows, 'auto');
735
+ datamap.createRow(nrOfRows, minRows - nrOfRows, {
736
+ source: 'auto'
737
+ });
752
738
  }
753
739
  }
754
-
755
740
  if (minSpareRows) {
756
- var emptyRows = instance.countEmptyRows(true); // should I add empty rows to meet minSpareRows?
741
+ var emptyRows = instance.countEmptyRows(true);
757
742
 
743
+ // should I add empty rows to meet minSpareRows?
758
744
  if (emptyRows < minSpareRows) {
759
745
  var emptyRowsMissing = minSpareRows - emptyRows;
760
- var rowsToCreate = Math.min(emptyRowsMissing, tableMeta.maxRows - instance.countSourceRows()); // The synchronization with cell meta is not desired here. For `minSpareRows` option,
761
- // we don't want to touch/shift cell meta objects.
746
+ var rowsToCreate = Math.min(emptyRowsMissing, tableMeta.maxRows - instance.countSourceRows());
762
747
 
763
- datamap.createRow(instance.countRows(), rowsToCreate, 'auto');
748
+ // The synchronization with cell meta is not desired here. For `minSpareRows` option,
749
+ // we don't want to touch/shift cell meta objects.
750
+ datamap.createRow(instance.countRows(), rowsToCreate, {
751
+ source: 'auto'
752
+ });
764
753
  }
765
754
  }
766
-
767
755
  {
768
- var emptyCols; // count currently empty cols
756
+ var emptyCols;
769
757
 
758
+ // count currently empty cols
770
759
  if (minCols || minSpareCols) {
771
760
  emptyCols = instance.countEmptyCols(true);
772
761
  }
762
+ var nrOfColumns = instance.countCols();
773
763
 
774
- var nrOfColumns = instance.countCols(); // should I add empty cols to meet minCols?
775
-
764
+ // should I add empty cols to meet minCols?
776
765
  if (minCols && !tableMeta.columns && nrOfColumns < minCols) {
777
766
  // The synchronization with cell meta is not desired here. For `minSpareRows` option,
778
767
  // we don't want to touch/shift cell meta objects.
779
768
  var colsToCreate = minCols - nrOfColumns;
780
769
  emptyCols += colsToCreate;
781
- datamap.createCol(nrOfColumns, colsToCreate, 'auto');
782
- } // should I add empty cols to meet minSpareCols?
783
-
784
-
770
+ datamap.createCol(nrOfColumns, colsToCreate, {
771
+ source: 'auto'
772
+ });
773
+ }
774
+ // should I add empty cols to meet minSpareCols?
785
775
  if (minSpareCols && !tableMeta.columns && instance.dataType === 'array' && emptyCols < minSpareCols) {
786
776
  nrOfColumns = instance.countCols();
787
777
  var emptyColsMissing = minSpareCols - emptyCols;
778
+ var _colsToCreate = Math.min(emptyColsMissing, tableMeta.maxCols - nrOfColumns);
788
779
 
789
- var _colsToCreate = Math.min(emptyColsMissing, tableMeta.maxCols - nrOfColumns); // The synchronization with cell meta is not desired here. For `minSpareRows` option,
780
+ // The synchronization with cell meta is not desired here. For `minSpareRows` option,
790
781
  // we don't want to touch/shift cell meta objects.
791
-
792
-
793
- datamap.createCol(nrOfColumns, _colsToCreate, 'auto');
782
+ datamap.createCol(nrOfColumns, _colsToCreate, {
783
+ source: 'auto'
784
+ });
794
785
  }
795
786
  }
796
- var rowCount = instance.countRows();
797
- var colCount = instance.countCols();
798
-
799
- if (rowCount === 0 || colCount === 0) {
800
- selection.deselect();
801
- }
802
-
803
787
  if (selection.isSelected()) {
788
+ var rowCount = instance.countRows();
789
+ var colCount = instance.countCols();
804
790
  arrayEach(selection.selectedRange, function (range) {
805
791
  var selectionChanged = false;
806
792
  var fromRow = range.from.row;
807
793
  var fromCol = range.from.col;
808
794
  var toRow = range.to.row;
809
- var toCol = range.to.col; // if selection is outside, move selection to last row
795
+ var toCol = range.to.col;
810
796
 
797
+ // if selection is outside, move selection to last row
811
798
  if (fromRow > rowCount - 1) {
812
799
  fromRow = rowCount - 1;
813
800
  selectionChanged = true;
814
-
815
801
  if (toRow > fromRow) {
816
802
  toRow = fromRow;
817
803
  }
818
804
  } else if (toRow > rowCount - 1) {
819
805
  toRow = rowCount - 1;
820
806
  selectionChanged = true;
821
-
822
807
  if (fromRow > toRow) {
823
808
  fromRow = toRow;
824
809
  }
825
- } // if selection is outside, move selection to last row
826
-
827
-
810
+ }
811
+ // if selection is outside, move selection to last row
828
812
  if (fromCol > colCount - 1) {
829
813
  fromCol = colCount - 1;
830
814
  selectionChanged = true;
831
-
832
815
  if (toCol > fromCol) {
833
816
  toCol = fromCol;
834
817
  }
835
818
  } else if (toCol > colCount - 1) {
836
819
  toCol = colCount - 1;
837
820
  selectionChanged = true;
838
-
839
821
  if (fromCol > toCol) {
840
822
  fromCol = toCol;
841
823
  }
842
824
  }
843
-
844
825
  if (selectionChanged) {
845
826
  instance.selectCell(fromRow, fromCol, toRow, toCol);
846
827
  }
847
828
  });
848
829
  }
849
-
850
830
  if (instance.view) {
851
831
  instance.view.adjustElementsSize();
852
832
  }
853
833
  },
854
-
855
834
  /**
856
835
  * Populate the data from the provided 2d array from the given cell coordinates.
857
836
  *
@@ -878,38 +857,34 @@ export default function Core(rootElement, userSettings) {
878
857
  var startRow = start.row;
879
858
  var startColumn = start.col;
880
859
  rlen = input.length;
881
-
882
860
  if (rlen === 0) {
883
861
  return false;
884
862
  }
885
-
886
863
  var columnsPopulationEnd = 0;
887
864
  var rowsPopulationEnd = 0;
888
-
889
865
  if (isObject(end)) {
890
866
  columnsPopulationEnd = end.col - startColumn + 1;
891
867
  rowsPopulationEnd = end.row - startRow + 1;
892
- } // insert data with specified pasteMode method
893
-
868
+ }
894
869
 
870
+ // insert data with specified pasteMode method
895
871
  switch (method) {
896
872
  case 'shift_down':
897
873
  // translate data from a list of rows to a list of columns
898
874
  var populatedDataByColumns = pivot(input);
899
- var numberOfDataColumns = populatedDataByColumns.length; // method's argument can extend the range of data population (data would be repeated)
900
-
875
+ var numberOfDataColumns = populatedDataByColumns.length;
876
+ // method's argument can extend the range of data population (data would be repeated)
901
877
  var numberOfColumnsToPopulate = Math.max(numberOfDataColumns, columnsPopulationEnd);
902
- var pushedDownDataByRows = instance.getData().slice(startRow); // translate data from a list of rows to a list of columns
878
+ var pushedDownDataByRows = instance.getData().slice(startRow);
903
879
 
880
+ // translate data from a list of rows to a list of columns
904
881
  var pushedDownDataByColumns = pivot(pushedDownDataByRows).slice(startColumn, startColumn + numberOfColumnsToPopulate);
905
-
906
882
  for (c = 0; c < numberOfColumnsToPopulate; c += 1) {
907
883
  if (c < numberOfDataColumns) {
908
884
  for (r = 0, rlen = populatedDataByColumns[c].length; r < rowsPopulationEnd - rlen; r += 1) {
909
885
  // repeating data for rows
910
886
  populatedDataByColumns[c].push(populatedDataByColumns[c][r % rlen]);
911
887
  }
912
-
913
888
  if (c < pushedDownDataByColumns.length) {
914
889
  newDataByColumns.push(populatedDataByColumns[c].concat(pushedDownDataByColumns[c]));
915
890
  } else {
@@ -922,32 +897,27 @@ export default function Core(rootElement, userSettings) {
922
897
  newDataByColumns.push(populatedDataByColumns[c % numberOfDataColumns].concat(pushedDownDataByColumns[c]));
923
898
  }
924
899
  }
925
-
926
900
  instance.populateFromArray(startRow, startColumn, pivot(newDataByColumns));
927
901
  break;
928
-
929
902
  case 'shift_right':
930
- var numberOfDataRows = input.length; // method's argument can extend the range of data population (data would be repeated)
931
-
903
+ var numberOfDataRows = input.length;
904
+ // method's argument can extend the range of data population (data would be repeated)
932
905
  var numberOfRowsToPopulate = Math.max(numberOfDataRows, rowsPopulationEnd);
933
906
  var pushedRightDataByRows = instance.getData().slice(startRow).map(function (rowData) {
934
907
  return rowData.slice(startColumn);
935
908
  });
936
-
937
909
  for (r = 0; r < numberOfRowsToPopulate; r += 1) {
938
910
  if (r < numberOfDataRows) {
939
911
  for (c = 0, clen = input[r].length; c < columnsPopulationEnd - clen; c += 1) {
940
912
  // repeating data for rows
941
913
  input[r].push(input[r][c % clen]);
942
914
  }
943
-
944
915
  if (r < pushedRightDataByRows.length) {
945
916
  for (var i = 0; i < pushedRightDataByRows[r].length; i += 1) {
946
917
  input[r].push(pushedRightDataByRows[r][i]);
947
918
  }
948
919
  } else {
949
920
  var _input$r;
950
-
951
921
  // if before data population, there was no data in the row
952
922
  // we fill the required columns' newly-created cells with `null` values
953
923
  (_input$r = input[r]).push.apply(_input$r, _toConsumableArray(new Array(pushedRightDataByRows[0].length).fill(null)));
@@ -957,10 +927,8 @@ export default function Core(rootElement, userSettings) {
957
927
  input.push(input[r % rlen].slice(0, numberOfRowsToPopulate).concat(pushedRightDataByRows[r]));
958
928
  }
959
929
  }
960
-
961
930
  instance.populateFromArray(startRow, startColumn, input);
962
931
  break;
963
-
964
932
  case 'overwrite':
965
933
  default:
966
934
  // overwrite and other not specified options
@@ -975,77 +943,59 @@ export default function Core(rootElement, userSettings) {
975
943
  var skippedColumn = 0;
976
944
  var pushData = true;
977
945
  var cellMeta;
978
-
979
946
  var getInputValue = function getInputValue(row) {
980
947
  var col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
981
948
  var rowValue = input[row % input.length];
982
-
983
949
  if (col !== null) {
984
950
  return rowValue[col % rowValue.length];
985
951
  }
986
-
987
952
  return rowValue;
988
953
  };
989
-
990
954
  var rowInputLength = input.length;
991
955
  var rowSelectionLength = end ? end.row - start.row + 1 : 0;
992
-
993
956
  if (end) {
994
957
  rlen = rowSelectionLength;
995
958
  } else {
996
959
  rlen = Math.max(rowInputLength, rowSelectionLength);
997
960
  }
998
-
999
961
  for (r = 0; r < rlen; r++) {
1000
962
  if (end && current.row > end.row && rowSelectionLength > rowInputLength || !tableMeta.allowInsertRow && current.row > instance.countRows() - 1 || current.row >= tableMeta.maxRows) {
1001
963
  break;
1002
964
  }
1003
-
1004
965
  var visualRow = r - skippedRow;
1005
966
  var colInputLength = getInputValue(visualRow).length;
1006
967
  var colSelectionLength = end ? end.col - start.col + 1 : 0;
1007
-
1008
968
  if (end) {
1009
969
  clen = colSelectionLength;
1010
970
  } else {
1011
971
  clen = Math.max(colInputLength, colSelectionLength);
1012
972
  }
1013
-
1014
973
  current.col = start.col;
1015
974
  cellMeta = instance.getCellMeta(current.row, current.col);
1016
-
1017
975
  if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipRowOnPaste) {
1018
976
  skippedRow += 1;
1019
977
  current.row += 1;
1020
978
  rlen += 1;
1021
979
  /* eslint-disable no-continue */
1022
-
1023
980
  continue;
1024
981
  }
1025
-
1026
982
  skippedColumn = 0;
1027
-
1028
983
  for (c = 0; c < clen; c++) {
1029
984
  if (end && current.col > end.col && colSelectionLength > colInputLength || !tableMeta.allowInsertColumn && current.col > instance.countCols() - 1 || current.col >= tableMeta.maxCols) {
1030
985
  break;
1031
986
  }
1032
-
1033
987
  cellMeta = instance.getCellMeta(current.row, current.col);
1034
-
1035
988
  if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipColumnOnPaste) {
1036
989
  skippedColumn += 1;
1037
990
  current.col += 1;
1038
991
  clen += 1;
1039
992
  continue;
1040
993
  }
1041
-
1042
994
  if (cellMeta.readOnly && source !== 'UndoRedo.undo') {
1043
995
  current.col += 1;
1044
996
  /* eslint-disable no-continue */
1045
-
1046
997
  continue;
1047
998
  }
1048
-
1049
999
  var visualColumn = c - skippedColumn;
1050
1000
  var value = getInputValue(visualRow, visualColumn);
1051
1001
  var orgValue = instance.getDataAtCell(current.row, current.col);
@@ -1053,29 +1003,25 @@ export default function Core(rootElement, userSettings) {
1053
1003
  row: visualRow,
1054
1004
  col: visualColumn
1055
1005
  };
1056
-
1057
1006
  if (source === 'Autofill.fill') {
1058
1007
  var result = instance.runHooks('beforeAutofillInsidePopulate', index, direction, input, deltas, {}, selected);
1059
-
1060
1008
  if (result) {
1061
1009
  value = isUndefined(result.value) ? value : result.value;
1062
1010
  }
1063
1011
  }
1064
-
1065
1012
  if (value !== null && _typeof(value) === 'object') {
1066
1013
  // when 'value' is array and 'orgValue' is null, set 'orgValue' to
1067
1014
  // an empty array so that the null value can be compared to 'value'
1068
1015
  // as an empty value for the array context
1069
1016
  if (Array.isArray(value) && orgValue === null) orgValue = [];
1070
-
1071
1017
  if (orgValue === null || _typeof(orgValue) !== 'object') {
1072
1018
  pushData = false;
1073
1019
  } else {
1074
1020
  var orgValueSchema = duckSchema(Array.isArray(orgValue) ? orgValue : orgValue[0] || orgValue);
1075
1021
  var valueSchema = duckSchema(Array.isArray(value) ? value : value[0] || value);
1076
- /* eslint-disable max-depth */
1077
1022
 
1078
- if (isObjectEqual(orgValueSchema, valueSchema)) {
1023
+ // Allow overwriting values with the same object-based schema or any array-based schema.
1024
+ if (isObjectEqual(orgValueSchema, valueSchema) || Array.isArray(orgValueSchema) && Array.isArray(valueSchema)) {
1079
1025
  value = deepClone(value);
1080
1026
  } else {
1081
1027
  pushData = false;
@@ -1084,23 +1030,20 @@ export default function Core(rootElement, userSettings) {
1084
1030
  } else if (orgValue !== null && _typeof(orgValue) === 'object') {
1085
1031
  pushData = false;
1086
1032
  }
1087
-
1088
1033
  if (pushData) {
1089
1034
  setData.push([current.row, current.col, value]);
1090
1035
  }
1091
-
1092
1036
  pushData = true;
1093
1037
  current.col += 1;
1094
1038
  }
1095
-
1096
1039
  current.row += 1;
1097
1040
  }
1098
-
1099
1041
  instance.setDataAtCell(setData, null, null, source || 'populateFromArray');
1100
1042
  break;
1101
1043
  }
1102
1044
  }
1103
1045
  };
1046
+
1104
1047
  /**
1105
1048
  * Internal function to set `language` key of settings.
1106
1049
  *
@@ -1108,10 +1051,8 @@ export default function Core(rootElement, userSettings) {
1108
1051
  * @param {string} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.
1109
1052
  * @fires Hooks#afterLanguageChange
1110
1053
  */
1111
-
1112
1054
  function setLanguage(languageCode) {
1113
1055
  var normalizedLanguageCode = normalizeLanguageCode(languageCode);
1114
-
1115
1056
  if (hasLanguageDictionary(normalizedLanguageCode)) {
1116
1057
  instance.runHooks('beforeLanguageChange', normalizedLanguageCode);
1117
1058
  globalMeta.language = normalizedLanguageCode;
@@ -1120,6 +1061,7 @@ export default function Core(rootElement, userSettings) {
1120
1061
  warnUserAboutLanguageRegistration(languageCode);
1121
1062
  }
1122
1063
  }
1064
+
1123
1065
  /**
1124
1066
  * Internal function to set `className` or `tableClassName`, depending on the key from the settings object.
1125
1067
  *
@@ -1127,69 +1069,63 @@ export default function Core(rootElement, userSettings) {
1127
1069
  * @param {string} className `className` or `tableClassName` from the key in the settings object.
1128
1070
  * @param {string|string[]} classSettings String or array of strings. Contains class name(s) from settings object.
1129
1071
  */
1130
-
1131
-
1132
1072
  function setClassName(className, classSettings) {
1133
1073
  var element = className === 'className' ? instance.rootElement : instance.table;
1134
-
1135
1074
  if (firstRun) {
1136
1075
  addClass(element, classSettings);
1137
1076
  } else {
1138
1077
  var globalMetaSettingsArray = [];
1139
1078
  var settingsArray = [];
1140
-
1141
1079
  if (globalMeta[className]) {
1142
1080
  globalMetaSettingsArray = Array.isArray(globalMeta[className]) ? globalMeta[className] : stringToArray(globalMeta[className]);
1143
1081
  }
1144
-
1145
1082
  if (classSettings) {
1146
1083
  settingsArray = Array.isArray(classSettings) ? classSettings : stringToArray(classSettings);
1147
1084
  }
1148
-
1149
1085
  var classNameToRemove = getDifferenceOfArrays(globalMetaSettingsArray, settingsArray);
1150
1086
  var classNameToAdd = getDifferenceOfArrays(settingsArray, globalMetaSettingsArray);
1151
-
1152
1087
  if (classNameToRemove.length) {
1153
1088
  removeClass(element, classNameToRemove);
1154
1089
  }
1155
-
1156
1090
  if (classNameToAdd.length) {
1157
1091
  addClass(element, classNameToAdd);
1158
1092
  }
1159
1093
  }
1160
-
1161
1094
  globalMeta[className] = classSettings;
1162
1095
  }
1163
-
1164
1096
  this.init = function () {
1165
1097
  dataSource.setData(tableMeta.data);
1166
1098
  instance.runHooks('beforeInit');
1167
-
1168
1099
  if (isMobileBrowser() || isIpadOS()) {
1169
1100
  addClass(instance.rootElement, 'mobile');
1170
1101
  }
1171
-
1172
1102
  this.updateSettings(tableMeta, true);
1173
1103
  this.view = new TableView(this);
1174
1104
  editorManager = EditorManager.getInstance(instance, tableMeta, selection);
1175
1105
  instance.runHooks('init');
1176
1106
  this.forceFullRender = true; // used when data was changed
1177
-
1178
1107
  this.view.render();
1179
1108
 
1109
+ // Run the logic only if it's the table's initialization and the root element is not visible.
1110
+ if (!!firstRun && instance.rootElement.offsetParent === null) {
1111
+ observeVisibilityChangeOnce(instance.rootElement, function () {
1112
+ // Update the spreader size cache before rendering.
1113
+ instance.view._wt.wtOverlays.updateLastSpreaderSize();
1114
+ instance.render();
1115
+ instance.view.adjustElementsSize();
1116
+ });
1117
+ }
1180
1118
  if (_typeof(firstRun) === 'object') {
1181
1119
  instance.runHooks('afterChange', firstRun[0], firstRun[1]);
1182
1120
  firstRun = false;
1183
1121
  }
1184
-
1185
1122
  instance.runHooks('afterInit');
1186
1123
  };
1124
+
1187
1125
  /**
1188
1126
  * @ignore
1189
1127
  * @returns {object}
1190
1128
  */
1191
-
1192
-
1193
1129
  function ValidatorsQueue() {
1194
1130
  // moved this one level up so it can be used in any function here. Probably this should be moved to a separate file
1195
1131
  var resolved = false;
@@ -1213,6 +1149,7 @@ export default function Core(rootElement, userSettings) {
1213
1149
  }
1214
1150
  };
1215
1151
  }
1152
+
1216
1153
  /**
1217
1154
  * Get parsed number from numeric string.
1218
1155
  *
@@ -1220,51 +1157,40 @@ export default function Core(rootElement, userSettings) {
1220
1157
  * @param {string} numericData Float (separated by a dot or a comma) or integer.
1221
1158
  * @returns {number} Number if we get data in parsable format, not changed value otherwise.
1222
1159
  */
1223
-
1224
-
1225
1160
  function getParsedNumber(numericData) {
1226
1161
  // Unifying "float like" string. Change from value with comma determiner to value with dot determiner,
1227
1162
  // for example from `450,65` to `450.65`.
1228
1163
  var unifiedNumericData = numericData.replace(',', '.');
1229
-
1230
1164
  if (isNaN(parseFloat(unifiedNumericData)) === false) {
1231
1165
  return parseFloat(unifiedNumericData);
1232
1166
  }
1233
-
1234
1167
  return numericData;
1235
1168
  }
1169
+
1236
1170
  /**
1237
1171
  * @ignore
1238
1172
  * @param {Array} changes The 2D array containing information about each of the edited cells.
1239
1173
  * @param {string} source The string that identifies source of validation.
1240
1174
  * @param {Function} callback The callback function fot async validation.
1241
1175
  */
1242
-
1243
-
1244
1176
  function validateChanges(changes, source, callback) {
1245
1177
  if (!changes.length) {
1246
1178
  return;
1247
1179
  }
1248
-
1249
1180
  var activeEditor = instance.getActiveEditor();
1250
1181
  var beforeChangeResult = instance.runHooks('beforeChange', changes, source || 'edit');
1251
1182
  var shouldBeCanceled = true;
1252
-
1253
1183
  if (beforeChangeResult === false) {
1254
1184
  if (activeEditor) {
1255
1185
  activeEditor.cancelChanges();
1256
1186
  }
1257
-
1258
1187
  return;
1259
1188
  }
1260
-
1261
1189
  var waitingForValidator = new ValidatorsQueue();
1262
-
1263
1190
  waitingForValidator.onQueueEmpty = function (isValid) {
1264
1191
  if (activeEditor && shouldBeCanceled) {
1265
1192
  activeEditor.cancelChanges();
1266
1193
  }
1267
-
1268
1194
  callback(isValid); // called when async validators are resolved and beforeChange was not async
1269
1195
  };
1270
1196
 
@@ -1273,19 +1199,16 @@ export default function Core(rootElement, userSettings) {
1273
1199
  changes.splice(i, 1);
1274
1200
  } else {
1275
1201
  var _changes$i = _slicedToArray(changes[i], 4),
1276
- row = _changes$i[0],
1277
- prop = _changes$i[1],
1278
- newValue = _changes$i[3];
1279
-
1202
+ row = _changes$i[0],
1203
+ prop = _changes$i[1],
1204
+ newValue = _changes$i[3];
1280
1205
  var col = datamap.propToCol(prop);
1281
1206
  var cellProperties = instance.getCellMeta(row, col);
1282
-
1283
1207
  if (cellProperties.type === 'numeric' && typeof newValue === 'string' && isNumericLike(newValue)) {
1284
1208
  changes[i][3] = getParsedNumber(newValue);
1285
1209
  }
1286
- /* eslint-disable no-loop-func */
1287
-
1288
1210
 
1211
+ /* eslint-disable no-loop-func */
1289
1212
  if (instance.getCellValidator(cellProperties)) {
1290
1213
  waitingForValidator.addValidatorToQueue();
1291
1214
  instance.validateCell(changes[i][3], cellProperties, function (index, cellPropertiesReference) {
@@ -1293,19 +1216,16 @@ export default function Core(rootElement, userSettings) {
1293
1216
  if (typeof result !== 'boolean') {
1294
1217
  throw new Error('Validation error: result is not boolean');
1295
1218
  }
1296
-
1297
1219
  if (result === false && cellPropertiesReference.allowInvalid === false) {
1298
1220
  shouldBeCanceled = false;
1299
1221
  changes.splice(index, 1); // cancel the change
1300
-
1301
1222
  cellPropertiesReference.valid = true; // we cancelled the change, so cell value is still valid
1302
1223
 
1303
1224
  var cell = instance.getCell(cellPropertiesReference.visualRow, cellPropertiesReference.visualCol);
1304
-
1305
1225
  if (cell !== null) {
1306
1226
  removeClass(cell, tableMeta.invalidCellClassName);
1307
- } // index -= 1;
1308
-
1227
+ }
1228
+ // index -= 1;
1309
1229
  }
1310
1230
 
1311
1231
  waitingForValidator.removeValidatorFormQueue();
@@ -1314,9 +1234,9 @@ export default function Core(rootElement, userSettings) {
1314
1234
  }
1315
1235
  }
1316
1236
  }
1317
-
1318
1237
  waitingForValidator.checkIfQueueIsEmpty();
1319
1238
  }
1239
+
1320
1240
  /**
1321
1241
  * Internal function to apply changes. Called after validateChanges.
1322
1242
  *
@@ -1326,81 +1246,66 @@ export default function Core(rootElement, userSettings) {
1326
1246
  * @fires Hooks#beforeChangeRender
1327
1247
  * @fires Hooks#afterChange
1328
1248
  */
1329
-
1330
-
1331
1249
  function applyChanges(changes, source) {
1332
1250
  var i = changes.length - 1;
1333
-
1334
1251
  if (i < 0) {
1335
1252
  return;
1336
1253
  }
1337
-
1338
1254
  for (; i >= 0; i--) {
1339
1255
  var skipThisChange = false;
1340
-
1341
1256
  if (changes[i] === null) {
1342
1257
  changes.splice(i, 1);
1343
1258
  /* eslint-disable no-continue */
1344
-
1345
1259
  continue;
1346
1260
  }
1347
-
1348
1261
  if ((changes[i][2] === null || changes[i][2] === void 0) && (changes[i][3] === null || changes[i][3] === void 0)) {
1349
1262
  /* eslint-disable no-continue */
1350
1263
  continue;
1351
1264
  }
1352
-
1353
1265
  if (tableMeta.allowInsertRow) {
1354
1266
  while (changes[i][0] > instance.countRows() - 1) {
1355
- var numberOfCreatedRows = datamap.createRow(void 0, void 0, source);
1356
-
1357
- if (numberOfCreatedRows >= 1) {
1358
- metaManager.createRow(null, numberOfCreatedRows);
1359
- } else {
1267
+ var _datamap$createRow2 = datamap.createRow(void 0, void 0, {
1268
+ source: source
1269
+ }),
1270
+ numberOfCreatedRows = _datamap$createRow2.delta;
1271
+ if (numberOfCreatedRows === 0) {
1360
1272
  skipThisChange = true;
1361
1273
  break;
1362
1274
  }
1363
1275
  }
1364
1276
  }
1365
-
1366
1277
  if (instance.dataType === 'array' && (!tableMeta.columns || tableMeta.columns.length === 0) && tableMeta.allowInsertColumn) {
1367
1278
  while (datamap.propToCol(changes[i][1]) > instance.countCols() - 1) {
1368
- var numberOfCreatedColumns = datamap.createCol(void 0, void 0, source);
1369
-
1370
- if (numberOfCreatedColumns >= 1) {
1371
- metaManager.createColumn(null, numberOfCreatedColumns);
1372
- } else {
1279
+ var _datamap$createCol2 = datamap.createCol(void 0, void 0, {
1280
+ source: source
1281
+ }),
1282
+ numberOfCreatedColumns = _datamap$createCol2.delta;
1283
+ if (numberOfCreatedColumns === 0) {
1373
1284
  skipThisChange = true;
1374
1285
  break;
1375
1286
  }
1376
1287
  }
1377
1288
  }
1378
-
1379
1289
  if (skipThisChange) {
1380
1290
  /* eslint-disable no-continue */
1381
1291
  continue;
1382
1292
  }
1383
-
1384
1293
  datamap.set(changes[i][0], changes[i][1], changes[i][3]);
1385
1294
  }
1386
-
1387
1295
  instance.forceFullRender = true; // used when data was changed
1388
-
1389
1296
  grid.adjustRowsAndCols();
1390
1297
  instance.runHooks('beforeChangeRender', changes, source);
1391
1298
  editorManager.lockEditor();
1392
-
1393
1299
  instance._refreshBorders(null);
1394
-
1395
1300
  editorManager.unlockEditor();
1396
1301
  instance.view.adjustElementsSize();
1397
1302
  instance.runHooks('afterChange', changes, source || 'edit');
1398
1303
  var activeEditor = instance.getActiveEditor();
1399
-
1400
1304
  if (activeEditor && isDefined(activeEditor.refreshValue)) {
1401
1305
  activeEditor.refreshValue();
1402
1306
  }
1403
1307
  }
1308
+
1404
1309
  /**
1405
1310
  * Creates and returns the CellCoords object.
1406
1311
  *
@@ -1411,11 +1316,10 @@ export default function Core(rootElement, userSettings) {
1411
1316
  * @param {number} column The column index.
1412
1317
  * @returns {CellCoords}
1413
1318
  */
1414
-
1415
-
1416
1319
  this._createCellCoords = function (row, column) {
1417
1320
  return instance.view._wt.createCellCoords(row, column);
1418
1321
  };
1322
+
1419
1323
  /**
1420
1324
  * Creates and returns the CellRange object.
1421
1325
  *
@@ -1428,11 +1332,10 @@ export default function Core(rootElement, userSettings) {
1428
1332
  * @param {CellCoords} to Final coordinates.
1429
1333
  * @returns {CellRange}
1430
1334
  */
1431
-
1432
-
1433
1335
  this._createCellRange = function (highlight, from, to) {
1434
1336
  return instance.view._wt.createCellRange(highlight, from, to);
1435
1337
  };
1338
+
1436
1339
  /**
1437
1340
  * Validate a single cell.
1438
1341
  *
@@ -1443,41 +1346,33 @@ export default function Core(rootElement, userSettings) {
1443
1346
  * @param {Function} callback The callback function.
1444
1347
  * @param {string} source The string that identifies source of the validation.
1445
1348
  */
1446
-
1447
-
1448
1349
  this.validateCell = function (value, cellProperties, callback, source) {
1449
- var validator = instance.getCellValidator(cellProperties); // the `canBeValidated = false` argument suggests, that the cell passes validation by default.
1350
+ var validator = instance.getCellValidator(cellProperties);
1450
1351
 
1352
+ // the `canBeValidated = false` argument suggests, that the cell passes validation by default.
1451
1353
  /**
1452
1354
  * @private
1453
1355
  * @function done
1454
1356
  * @param {boolean} valid Indicates if the validation was successful.
1455
1357
  * @param {boolean} [canBeValidated=true] Flag which controls the validation process.
1456
1358
  */
1457
-
1458
1359
  function done(valid) {
1459
1360
  var canBeValidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1460
-
1461
1361
  // Fixes GH#3903
1462
1362
  if (!canBeValidated || cellProperties.hidden === true) {
1463
1363
  callback(valid);
1464
1364
  return;
1465
1365
  }
1466
-
1467
1366
  var col = cellProperties.visualCol;
1468
1367
  var row = cellProperties.visualRow;
1469
1368
  var td = instance.getCell(row, col, true);
1470
-
1471
1369
  if (td && td.nodeName !== 'TH') {
1472
1370
  var renderableRow = instance.rowIndexMapper.getRenderableFromVisualIndex(row);
1473
1371
  var renderableColumn = instance.columnIndexMapper.getRenderableFromVisualIndex(col);
1474
-
1475
1372
  instance.view._wt.getSetting('cellRenderer', renderableRow, renderableColumn, td);
1476
1373
  }
1477
-
1478
1374
  callback(valid);
1479
1375
  }
1480
-
1481
1376
  if (isRegExp(validator)) {
1482
1377
  validator = function (expression) {
1483
1378
  return function (cellValue, validatorCallback) {
@@ -1485,18 +1380,17 @@ export default function Core(rootElement, userSettings) {
1485
1380
  };
1486
1381
  }(validator);
1487
1382
  }
1488
-
1489
1383
  if (isFunction(validator)) {
1490
1384
  // eslint-disable-next-line no-param-reassign
1491
- value = instance.runHooks('beforeValidate', value, cellProperties.visualRow, cellProperties.prop, source); // To provide consistent behaviour, validation should be always asynchronous
1385
+ value = instance.runHooks('beforeValidate', value, cellProperties.visualRow, cellProperties.prop, source);
1492
1386
 
1387
+ // To provide consistent behaviour, validation should be always asynchronous
1493
1388
  instance._registerImmediate(function () {
1494
1389
  validator.call(cellProperties, value, function (valid) {
1495
1390
  if (!instance) {
1496
1391
  return;
1497
- } // eslint-disable-next-line no-param-reassign
1498
-
1499
-
1392
+ }
1393
+ // eslint-disable-next-line no-param-reassign
1500
1394
  valid = instance.runHooks('afterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);
1501
1395
  cellProperties.valid = valid;
1502
1396
  done(valid);
@@ -1511,6 +1405,7 @@ export default function Core(rootElement, userSettings) {
1511
1405
  });
1512
1406
  }
1513
1407
  };
1408
+
1514
1409
  /**
1515
1410
  * @ignore
1516
1411
  * @param {number} row The visual row index.
@@ -1518,16 +1413,14 @@ export default function Core(rootElement, userSettings) {
1518
1413
  * @param {*} value The cell value.
1519
1414
  * @returns {Array}
1520
1415
  */
1521
-
1522
-
1523
1416
  function setDataInputToArray(row, propOrCol, value) {
1524
1417
  if (Array.isArray(row)) {
1525
1418
  // it's an array of changes
1526
1419
  return row;
1527
1420
  }
1528
-
1529
1421
  return [[row, propOrCol, value]];
1530
1422
  }
1423
+
1531
1424
  /**
1532
1425
  * @description
1533
1426
  * Set new value to a cell. To change many cells at once (recommended way), pass an array of `changes` in format
@@ -1540,8 +1433,6 @@ export default function Core(rootElement, userSettings) {
1540
1433
  * @param {string} [value] New value.
1541
1434
  * @param {string} [source] String that identifies how this change will be described in the changes array (useful in afterChange or beforeChange callback). Set to 'edit' if left empty.
1542
1435
  */
1543
-
1544
-
1545
1436
  this.setDataAtCell = function (row, column, value, source) {
1546
1437
  var input = setDataInputToArray(row, column, value);
1547
1438
  var changes = [];
@@ -1549,12 +1440,10 @@ export default function Core(rootElement, userSettings) {
1549
1440
  var i;
1550
1441
  var ilen;
1551
1442
  var prop;
1552
-
1553
1443
  for (i = 0, ilen = input.length; i < ilen; i++) {
1554
1444
  if (_typeof(input[i]) !== 'object') {
1555
1445
  throw new Error('Method `setDataAtCell` accepts row number or changes array of arrays as its first parameter');
1556
1446
  }
1557
-
1558
1447
  if (typeof input[i][1] !== 'number') {
1559
1448
  throw new Error('Method `setDataAtCell` accepts row and column number as its parameters. If you want to use object property name, use method `setDataAtRowProp`'); // eslint-disable-line max-len
1560
1449
  }
@@ -1564,19 +1453,17 @@ export default function Core(rootElement, userSettings) {
1564
1453
  } else {
1565
1454
  prop = datamap.colToProp(input[i][1]);
1566
1455
  }
1567
-
1568
1456
  changes.push([input[i][0], prop, dataSource.getAtCell(this.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);
1569
1457
  }
1570
-
1571
1458
  if (!changeSource && _typeof(row) === 'object') {
1572
1459
  changeSource = column;
1573
1460
  }
1574
-
1575
1461
  instance.runHooks('afterSetDataAtCell', changes, changeSource);
1576
1462
  validateChanges(changes, changeSource, function () {
1577
1463
  applyChanges(changes, changeSource);
1578
1464
  });
1579
1465
  };
1466
+
1580
1467
  /**
1581
1468
  * @description
1582
1469
  * Set new value to a cell. To change many cells at once (recommended way), pass an array of `changes` in format
@@ -1589,28 +1476,24 @@ export default function Core(rootElement, userSettings) {
1589
1476
  * @param {string} value Value to be set.
1590
1477
  * @param {string} [source] String that identifies how this change will be described in changes array (useful in onChange callback).
1591
1478
  */
1592
-
1593
-
1594
1479
  this.setDataAtRowProp = function (row, prop, value, source) {
1595
1480
  var input = setDataInputToArray(row, prop, value);
1596
1481
  var changes = [];
1597
1482
  var changeSource = source;
1598
1483
  var i;
1599
1484
  var ilen;
1600
-
1601
1485
  for (i = 0, ilen = input.length; i < ilen; i++) {
1602
1486
  changes.push([input[i][0], input[i][1], dataSource.getAtCell(this.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);
1603
1487
  }
1604
-
1605
1488
  if (!changeSource && _typeof(row) === 'object') {
1606
1489
  changeSource = prop;
1607
1490
  }
1608
-
1609
1491
  instance.runHooks('afterSetDataAtRowProp', changes, changeSource);
1610
1492
  validateChanges(changes, changeSource, function () {
1611
1493
  applyChanges(changes, changeSource);
1612
1494
  });
1613
1495
  };
1496
+
1614
1497
  /**
1615
1498
  * Listen to the keyboard input on document body. This allows Handsontable to capture keyboard events and respond
1616
1499
  * in the right way.
@@ -1619,14 +1502,13 @@ export default function Core(rootElement, userSettings) {
1619
1502
  * @function listen
1620
1503
  * @fires Hooks#afterListen
1621
1504
  */
1622
-
1623
-
1624
1505
  this.listen = function () {
1625
1506
  if (instance && !instance.isListening()) {
1626
1507
  activeGuid = instance.guid;
1627
1508
  instance.runHooks('afterListen');
1628
1509
  }
1629
1510
  };
1511
+
1630
1512
  /**
1631
1513
  * Stop listening to keyboard input on the document body. Calling this method makes the Handsontable inactive for
1632
1514
  * any keyboard events.
@@ -1634,14 +1516,13 @@ export default function Core(rootElement, userSettings) {
1634
1516
  * @memberof Core#
1635
1517
  * @function unlisten
1636
1518
  */
1637
-
1638
-
1639
1519
  this.unlisten = function () {
1640
1520
  if (this.isListening()) {
1641
1521
  activeGuid = null;
1642
1522
  instance.runHooks('afterUnlisten');
1643
1523
  }
1644
1524
  };
1525
+
1645
1526
  /**
1646
1527
  * Returns `true` if the current Handsontable instance is listening to keyboard input on document body.
1647
1528
  *
@@ -1649,11 +1530,10 @@ export default function Core(rootElement, userSettings) {
1649
1530
  * @function isListening
1650
1531
  * @returns {boolean} `true` if the instance is listening, `false` otherwise.
1651
1532
  */
1652
-
1653
-
1654
1533
  this.isListening = function () {
1655
1534
  return activeGuid === instance.guid;
1656
1535
  };
1536
+
1657
1537
  /**
1658
1538
  * Destroys the current editor, render the table and prepares the editor of the newly selected cell.
1659
1539
  *
@@ -1662,14 +1542,12 @@ export default function Core(rootElement, userSettings) {
1662
1542
  * @param {boolean} [revertOriginal=false] If `true`, the previous value will be restored. Otherwise, the edited value will be saved.
1663
1543
  * @param {boolean} [prepareEditorIfNeeded=true] If `true` the editor under the selected cell will be prepared to open.
1664
1544
  */
1665
-
1666
-
1667
1545
  this.destroyEditor = function () {
1668
1546
  var revertOriginal = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
1669
1547
  var prepareEditorIfNeeded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1670
-
1671
1548
  instance._refreshBorders(revertOriginal, prepareEditorIfNeeded);
1672
1549
  };
1550
+
1673
1551
  /**
1674
1552
  * Populates cells at position with 2D input array (e.g. `[[1, 2], [3, 4]]`). Use `endRow`, `endCol` when you
1675
1553
  * want to cut input when a certain row is reached.
@@ -1692,8 +1570,6 @@ export default function Core(rootElement, userSettings) {
1692
1570
  * Useful **only** when the type of handled cells is `numeric`.
1693
1571
  * @returns {object|undefined} Ending td in pasted area (only if any cell was changed).
1694
1572
  */
1695
-
1696
-
1697
1573
  this.populateFromArray = function (row, column, input, endRow, endCol, source, method, direction, deltas) {
1698
1574
  if (!(_typeof(input) === 'object' && _typeof(input[0]) === 'object')) {
1699
1575
  throw new Error('populateFromArray parameter `input` must be an array of arrays'); // API changed in 0.9-beta2, let's check if you use it correctly
@@ -1702,6 +1578,7 @@ export default function Core(rootElement, userSettings) {
1702
1578
  var c = typeof endRow === 'number' ? instance._createCellCoords(endRow, endCol) : null;
1703
1579
  return grid.populateFromArray(instance._createCellCoords(row, column), input, c, source, method, direction, deltas);
1704
1580
  };
1581
+
1705
1582
  /**
1706
1583
  * Adds/removes data from the column. This method works the same as Array.splice for arrays.
1707
1584
  *
@@ -1713,17 +1590,14 @@ export default function Core(rootElement, userSettings) {
1713
1590
  * @param {...number} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.
1714
1591
  * @returns {Array} Returns removed portion of columns.
1715
1592
  */
1716
-
1717
-
1718
1593
  this.spliceCol = function (column, index, amount) {
1719
1594
  var _datamap;
1720
-
1721
1595
  for (var _len = arguments.length, elements = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
1722
1596
  elements[_key - 3] = arguments[_key];
1723
1597
  }
1724
-
1725
1598
  return (_datamap = datamap).spliceCol.apply(_datamap, [column, index, amount].concat(elements));
1726
1599
  };
1600
+
1727
1601
  /**
1728
1602
  * Adds/removes data from the row. This method works the same as Array.splice for arrays.
1729
1603
  *
@@ -1735,17 +1609,14 @@ export default function Core(rootElement, userSettings) {
1735
1609
  * @param {...number} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.
1736
1610
  * @returns {Array} Returns removed portion of rows.
1737
1611
  */
1738
-
1739
-
1740
1612
  this.spliceRow = function (row, index, amount) {
1741
1613
  var _datamap2;
1742
-
1743
1614
  for (var _len2 = arguments.length, elements = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {
1744
1615
  elements[_key2 - 3] = arguments[_key2];
1745
1616
  }
1746
-
1747
1617
  return (_datamap2 = datamap).spliceRow.apply(_datamap2, [row, index, amount].concat(elements));
1748
1618
  };
1619
+
1749
1620
  /**
1750
1621
  * Returns indexes of the currently selected cells as an array of arrays `[[startRow, startCol, endRow, endCol],...]`.
1751
1622
  *
@@ -1759,18 +1630,17 @@ export default function Core(rootElement, userSettings) {
1759
1630
  * @function getSelected
1760
1631
  * @returns {Array[]|undefined} An array of arrays of the selection's coordinates.
1761
1632
  */
1762
-
1763
-
1764
1633
  this.getSelected = function () {
1765
1634
  // https://github.com/handsontable/handsontable/issues/44 //cjl
1766
1635
  if (selection.isSelected()) {
1767
1636
  return arrayMap(selection.getSelectedRange(), function (_ref12) {
1768
1637
  var from = _ref12.from,
1769
- to = _ref12.to;
1638
+ to = _ref12.to;
1770
1639
  return [from.row, from.col, to.row, to.col];
1771
1640
  });
1772
1641
  }
1773
1642
  };
1643
+
1774
1644
  /**
1775
1645
  * Returns the last coordinates applied to the table as a an array `[startRow, startCol, endRow, endCol]`.
1776
1646
  *
@@ -1779,18 +1649,15 @@ export default function Core(rootElement, userSettings) {
1779
1649
  * @function getSelectedLast
1780
1650
  * @returns {Array|undefined} An array of the selection's coordinates.
1781
1651
  */
1782
-
1783
-
1784
1652
  this.getSelectedLast = function () {
1785
1653
  var selected = this.getSelected();
1786
1654
  var result;
1787
-
1788
1655
  if (selected && selected.length > 0) {
1789
1656
  result = selected[selected.length - 1];
1790
1657
  }
1791
-
1792
1658
  return result;
1793
1659
  };
1660
+
1794
1661
  /**
1795
1662
  * Returns the current selection as an array of CellRange objects.
1796
1663
  *
@@ -1802,14 +1669,13 @@ export default function Core(rootElement, userSettings) {
1802
1669
  * @function getSelectedRange
1803
1670
  * @returns {CellRange[]|undefined} Selected range object or undefined if there is no selection.
1804
1671
  */
1805
-
1806
-
1807
1672
  this.getSelectedRange = function () {
1808
1673
  // https://github.com/handsontable/handsontable/issues/44 //cjl
1809
1674
  if (selection.isSelected()) {
1810
1675
  return Array.from(selection.getSelectedRange());
1811
1676
  }
1812
1677
  };
1678
+
1813
1679
  /**
1814
1680
  * Returns the last coordinates applied to the table as a CellRange object.
1815
1681
  *
@@ -1818,18 +1684,15 @@ export default function Core(rootElement, userSettings) {
1818
1684
  * @since 0.36.0
1819
1685
  * @returns {CellRange|undefined} Selected range object or undefined` if there is no selection.
1820
1686
  */
1821
-
1822
-
1823
1687
  this.getSelectedRangeLast = function () {
1824
1688
  var selectedRange = this.getSelectedRange();
1825
1689
  var result;
1826
-
1827
1690
  if (selectedRange && selectedRange.length > 0) {
1828
1691
  result = selectedRange[selectedRange.length - 1];
1829
1692
  }
1830
-
1831
1693
  return result;
1832
1694
  };
1695
+
1833
1696
  /**
1834
1697
  * Erases content from cells that have been selected in the table.
1835
1698
  *
@@ -1838,15 +1701,11 @@ export default function Core(rootElement, userSettings) {
1838
1701
  * @param {string} [source] String that identifies how this change will be described in the changes array (useful in afterChange or beforeChange callback). Set to 'edit' if left empty.
1839
1702
  * @since 0.36.0
1840
1703
  */
1841
-
1842
-
1843
1704
  this.emptySelectedCells = function (source) {
1844
1705
  var _this2 = this;
1845
-
1846
1706
  if (!selection.isSelected() || this.countRows() === 0 || this.countCols() === 0) {
1847
1707
  return;
1848
1708
  }
1849
-
1850
1709
  var changes = [];
1851
1710
  arrayEach(selection.getSelectedRange(), function (cellRange) {
1852
1711
  var topStart = cellRange.getTopStartCorner();
@@ -1859,11 +1718,11 @@ export default function Core(rootElement, userSettings) {
1859
1718
  });
1860
1719
  });
1861
1720
  });
1862
-
1863
1721
  if (changes.length > 0) {
1864
1722
  this.setDataAtCell(changes, source);
1865
1723
  }
1866
1724
  };
1725
+
1867
1726
  /**
1868
1727
  * Checks if the table rendering process was suspended. See explanation in {@link Core#suspendRender}.
1869
1728
  *
@@ -1872,11 +1731,10 @@ export default function Core(rootElement, userSettings) {
1872
1731
  * @since 8.3.0
1873
1732
  * @returns {boolean}
1874
1733
  */
1875
-
1876
-
1877
1734
  this.isRenderSuspended = function () {
1878
1735
  return this.renderSuspendedCounter > 0;
1879
1736
  };
1737
+
1880
1738
  /**
1881
1739
  * Suspends the rendering process. It's helpful to wrap the table render
1882
1740
  * cycles triggered by API calls or UI actions (or both) and call the "render"
@@ -1900,8 +1758,8 @@ export default function Core(rootElement, userSettings) {
1900
1758
  * @example
1901
1759
  * ```js
1902
1760
  * hot.suspendRender();
1903
- * hot.alter('insert_row', 5, 45);
1904
- * hot.alter('insert_col', 10, 40);
1761
+ * hot.alter('insert_row_above', 5, 45);
1762
+ * hot.alter('insert_col_start', 10, 40);
1905
1763
  * hot.setDataAtCell(1, 1, 'John');
1906
1764
  * hot.setDataAtCell(2, 2, 'Mark');
1907
1765
  * hot.setDataAtCell(3, 3, 'Ann');
@@ -1911,11 +1769,10 @@ export default function Core(rootElement, userSettings) {
1911
1769
  * hot.resumeRender(); // It re-renders the table internally
1912
1770
  * ```
1913
1771
  */
1914
-
1915
-
1916
1772
  this.suspendRender = function () {
1917
1773
  this.renderSuspendedCounter += 1;
1918
1774
  };
1775
+
1919
1776
  /**
1920
1777
  * Resumes the rendering process. In combination with the {@link Core#suspendRender}
1921
1778
  * method it allows aggregating the table render cycles triggered by API calls or UI
@@ -1935,8 +1792,8 @@ export default function Core(rootElement, userSettings) {
1935
1792
  * @example
1936
1793
  * ```js
1937
1794
  * hot.suspendRender();
1938
- * hot.alter('insert_row', 5, 45);
1939
- * hot.alter('insert_col', 10, 40);
1795
+ * hot.alter('insert_row_above', 5, 45);
1796
+ * hot.alter('insert_col_start', 10, 40);
1940
1797
  * hot.setDataAtCell(1, 1, 'John');
1941
1798
  * hot.setDataAtCell(2, 2, 'Mark');
1942
1799
  * hot.setDataAtCell(3, 3, 'Ann');
@@ -1946,12 +1803,9 @@ export default function Core(rootElement, userSettings) {
1946
1803
  * hot.resumeRender(); // It re-renders the table internally
1947
1804
  * ```
1948
1805
  */
1949
-
1950
-
1951
1806
  this.resumeRender = function () {
1952
1807
  var nextValue = this.renderSuspendedCounter - 1;
1953
1808
  this.renderSuspendedCounter = Math.max(nextValue, 0);
1954
-
1955
1809
  if (!this.isRenderSuspended() && nextValue === this.renderSuspendedCounter) {
1956
1810
  if (this.renderCall) {
1957
1811
  this.render();
@@ -1960,6 +1814,7 @@ export default function Core(rootElement, userSettings) {
1960
1814
  }
1961
1815
  }
1962
1816
  };
1817
+
1963
1818
  /**
1964
1819
  * Rerender the table. Calling this method starts the process of recalculating, redrawing and applying the changes
1965
1820
  * to the DOM. While rendering the table all cell renderers are recalled.
@@ -1970,8 +1825,6 @@ export default function Core(rootElement, userSettings) {
1970
1825
  * @memberof Core#
1971
1826
  * @function render
1972
1827
  */
1973
-
1974
-
1975
1828
  this.render = function () {
1976
1829
  if (this.view) {
1977
1830
  this.renderCall = true;
@@ -1979,13 +1832,12 @@ export default function Core(rootElement, userSettings) {
1979
1832
 
1980
1833
  if (!this.isRenderSuspended()) {
1981
1834
  editorManager.lockEditor();
1982
-
1983
1835
  this._refreshBorders(null);
1984
-
1985
1836
  editorManager.unlockEditor();
1986
1837
  }
1987
1838
  }
1988
1839
  };
1840
+
1989
1841
  /**
1990
1842
  * The method aggregates multi-line API calls into a callback and postpones the
1991
1843
  * table rendering process. After the execution of the operations, the table is
@@ -2000,8 +1852,8 @@ export default function Core(rootElement, userSettings) {
2000
1852
  * @example
2001
1853
  * ```js
2002
1854
  * hot.batchRender(() => {
2003
- * hot.alter('insert_row', 5, 45);
2004
- * hot.alter('insert_col', 10, 40);
1855
+ * hot.alter('insert_row_above', 5, 45);
1856
+ * hot.alter('insert_col_start', 10, 40);
2005
1857
  * hot.setDataAtCell(1, 1, 'John');
2006
1858
  * hot.setDataAtCell(2, 2, 'Mark');
2007
1859
  * hot.setDataAtCell(3, 3, 'Ann');
@@ -2012,14 +1864,13 @@ export default function Core(rootElement, userSettings) {
2012
1864
  * });
2013
1865
  * ```
2014
1866
  */
2015
-
2016
-
2017
1867
  this.batchRender = function (wrappedOperations) {
2018
1868
  this.suspendRender();
2019
1869
  var result = wrappedOperations();
2020
1870
  this.resumeRender();
2021
1871
  return result;
2022
1872
  };
1873
+
2023
1874
  /**
2024
1875
  * Checks if the table indexes recalculation process was suspended. See explanation
2025
1876
  * in {@link Core#suspendExecution}.
@@ -2029,11 +1880,10 @@ export default function Core(rootElement, userSettings) {
2029
1880
  * @since 8.3.0
2030
1881
  * @returns {boolean}
2031
1882
  */
2032
-
2033
-
2034
1883
  this.isExecutionSuspended = function () {
2035
1884
  return this.executionSuspendedCounter > 0;
2036
1885
  };
1886
+
2037
1887
  /**
2038
1888
  * Suspends the execution process. It's helpful to wrap the table logic changes
2039
1889
  * such as index changes into one call after which the cache is updated. As a result,
@@ -2056,13 +1906,12 @@ export default function Core(rootElement, userSettings) {
2056
1906
  * hot.resumeExecution(); // It updates the cache internally
2057
1907
  * ```
2058
1908
  */
2059
-
2060
-
2061
1909
  this.suspendExecution = function () {
2062
1910
  this.executionSuspendedCounter += 1;
2063
1911
  this.columnIndexMapper.suspendOperations();
2064
1912
  this.rowIndexMapper.suspendOperations();
2065
1913
  };
1914
+
2066
1915
  /**
2067
1916
  * Resumes the execution process. In combination with the {@link Core#suspendExecution}
2068
1917
  * method it allows aggregating the table logic changes after which the cache is
@@ -2089,18 +1938,16 @@ export default function Core(rootElement, userSettings) {
2089
1938
  * hot.resumeExecution(); // It updates the cache internally
2090
1939
  * ```
2091
1940
  */
2092
-
2093
-
2094
1941
  this.resumeExecution = function () {
2095
1942
  var forceFlushChanges = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
2096
1943
  var nextValue = this.executionSuspendedCounter - 1;
2097
1944
  this.executionSuspendedCounter = Math.max(nextValue, 0);
2098
-
2099
1945
  if (!this.isExecutionSuspended() && nextValue === this.executionSuspendedCounter || forceFlushChanges) {
2100
1946
  this.columnIndexMapper.resumeOperations();
2101
1947
  this.rowIndexMapper.resumeOperations();
2102
1948
  }
2103
1949
  };
1950
+
2104
1951
  /**
2105
1952
  * The method aggregates multi-line API calls into a callback and postpones the
2106
1953
  * table execution process. After the execution of the operations, the internal table
@@ -2127,8 +1974,6 @@ export default function Core(rootElement, userSettings) {
2127
1974
  * });
2128
1975
  * ```
2129
1976
  */
2130
-
2131
-
2132
1977
  this.batchExecution = function (wrappedOperations) {
2133
1978
  var forceFlushChanges = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2134
1979
  this.suspendExecution();
@@ -2136,6 +1981,7 @@ export default function Core(rootElement, userSettings) {
2136
1981
  this.resumeExecution(forceFlushChanges);
2137
1982
  return result;
2138
1983
  };
1984
+
2139
1985
  /**
2140
1986
  * It batches the rendering process and index recalculations. The method aggregates
2141
1987
  * multi-line API calls into a callback and postpones the table rendering process
@@ -2152,8 +1998,8 @@ export default function Core(rootElement, userSettings) {
2152
1998
  * @example
2153
1999
  * ```js
2154
2000
  * hot.batch(() => {
2155
- * hot.alter('insert_row', 5, 45);
2156
- * hot.alter('insert_col', 10, 40);
2001
+ * hot.alter('insert_row_above', 5, 45);
2002
+ * hot.alter('insert_col_start', 10, 40);
2157
2003
  * hot.setDataAtCell(1, 1, 'x');
2158
2004
  * hot.setDataAtCell(2, 2, 'c');
2159
2005
  * hot.setDataAtCell(3, 3, 'v');
@@ -2170,8 +2016,6 @@ export default function Core(rootElement, userSettings) {
2170
2016
  * });
2171
2017
  * ```
2172
2018
  */
2173
-
2174
-
2175
2019
  this.batch = function (wrappedOperations) {
2176
2020
  this.suspendRender();
2177
2021
  this.suspendExecution();
@@ -2180,6 +2024,7 @@ export default function Core(rootElement, userSettings) {
2180
2024
  this.resumeRender();
2181
2025
  return result;
2182
2026
  };
2027
+
2183
2028
  /**
2184
2029
  * Updates dimensions of the table. The method compares previous dimensions with the current ones and updates accordingly.
2185
2030
  *
@@ -2188,21 +2033,16 @@ export default function Core(rootElement, userSettings) {
2188
2033
  * @fires Hooks#beforeRefreshDimensions
2189
2034
  * @fires Hooks#afterRefreshDimensions
2190
2035
  */
2191
-
2192
-
2193
2036
  this.refreshDimensions = function () {
2194
2037
  if (!instance.view) {
2195
2038
  return;
2196
2039
  }
2197
-
2198
2040
  var _instance$view$getLas = instance.view.getLastSize(),
2199
- lastWidth = _instance$view$getLas.width,
2200
- lastHeight = _instance$view$getLas.height;
2201
-
2041
+ lastWidth = _instance$view$getLas.width,
2042
+ lastHeight = _instance$view$getLas.height;
2202
2043
  var _instance$rootElement = instance.rootElement.getBoundingClientRect(),
2203
- width = _instance$rootElement.width,
2204
- height = _instance$rootElement.height;
2205
-
2044
+ width = _instance$rootElement.width,
2045
+ height = _instance$rootElement.height;
2206
2046
  var isSizeChanged = width !== lastWidth || height !== lastHeight;
2207
2047
  var isResizeBlocked = instance.runHooks('beforeRefreshDimensions', {
2208
2048
  width: lastWidth,
@@ -2211,16 +2051,13 @@ export default function Core(rootElement, userSettings) {
2211
2051
  width: width,
2212
2052
  height: height
2213
2053
  }, isSizeChanged) === false;
2214
-
2215
2054
  if (isResizeBlocked) {
2216
2055
  return;
2217
2056
  }
2218
-
2219
2057
  if (isSizeChanged || instance.view._wt.wtOverlays.scrollableElement === instance.rootWindow) {
2220
2058
  instance.view.setLastSize(width, height);
2221
2059
  instance.render();
2222
2060
  }
2223
-
2224
2061
  instance.runHooks('afterRefreshDimensions', {
2225
2062
  width: lastWidth,
2226
2063
  height: lastHeight
@@ -2229,6 +2066,7 @@ export default function Core(rootElement, userSettings) {
2229
2066
  height: height
2230
2067
  }, isSizeChanged);
2231
2068
  };
2069
+
2232
2070
  /**
2233
2071
  * The `updateData()` method replaces Handsontable's [`data`](@/api/options.md#data) with a new dataset.
2234
2072
  *
@@ -2252,11 +2090,8 @@ export default function Core(rootElement, userSettings) {
2252
2090
  * @fires Hooks#afterUpdateData
2253
2091
  * @fires Hooks#afterChange
2254
2092
  */
2255
-
2256
-
2257
2093
  this.updateData = function (data, source) {
2258
2094
  var _this3 = this;
2259
-
2260
2095
  replaceData(data, function (newDataMap) {
2261
2096
  datamap = newDataMap;
2262
2097
  }, function (newDataMap) {
@@ -2270,9 +2105,11 @@ export default function Core(rootElement, userSettings) {
2270
2105
  dataSource: dataSource,
2271
2106
  internalSource: 'updateData',
2272
2107
  source: source,
2108
+ metaManager: metaManager,
2273
2109
  firstRun: firstRun
2274
2110
  });
2275
2111
  };
2112
+
2276
2113
  /**
2277
2114
  * The `loadData()` method replaces Handsontable's [`data`](@/api/options.md#data) with a new dataset.
2278
2115
  *
@@ -2295,8 +2132,6 @@ export default function Core(rootElement, userSettings) {
2295
2132
  * @fires Hooks#afterLoadData
2296
2133
  * @fires Hooks#afterChange
2297
2134
  */
2298
-
2299
-
2300
2135
  this.loadData = function (data, source) {
2301
2136
  replaceData(data, function (newDataMap) {
2302
2137
  datamap = newDataMap;
@@ -2304,7 +2139,6 @@ export default function Core(rootElement, userSettings) {
2304
2139
  metaManager.clearCellsCache();
2305
2140
  instance.initIndexMappers();
2306
2141
  grid.adjustRowsAndCols();
2307
-
2308
2142
  if (firstRun) {
2309
2143
  firstRun = [null, 'loadData'];
2310
2144
  }
@@ -2314,60 +2148,62 @@ export default function Core(rootElement, userSettings) {
2314
2148
  dataSource: dataSource,
2315
2149
  internalSource: 'loadData',
2316
2150
  source: source,
2151
+ metaManager: metaManager,
2317
2152
  firstRun: firstRun
2318
2153
  });
2319
2154
  };
2155
+
2320
2156
  /**
2321
2157
  * Gets the initial column count, calculated based on the `columns` setting.
2322
2158
  *
2323
2159
  * @private
2324
2160
  * @returns {number} The calculated number of columns.
2325
2161
  */
2326
-
2327
-
2328
2162
  this.getInitialColumnCount = function () {
2329
2163
  var columnsSettings = tableMeta.columns;
2330
- var finalNrOfColumns = 0; // We will check number of columns when the `columns` property was defined as an array. Columns option may
2331
- // narrow down or expand displayed dataset in that case.
2164
+ var finalNrOfColumns = 0;
2332
2165
 
2166
+ // We will check number of columns when the `columns` property was defined as an array. Columns option may
2167
+ // narrow down or expand displayed dataset in that case.
2333
2168
  if (Array.isArray(columnsSettings)) {
2334
2169
  finalNrOfColumns = columnsSettings.length;
2335
2170
  } else if (isFunction(columnsSettings)) {
2336
2171
  if (instance.dataType === 'array') {
2337
2172
  var nrOfSourceColumns = this.countSourceCols();
2338
-
2339
2173
  for (var columnIndex = 0; columnIndex < nrOfSourceColumns; columnIndex += 1) {
2340
2174
  if (columnsSettings(columnIndex)) {
2341
2175
  finalNrOfColumns += 1;
2342
2176
  }
2343
- } // Extended dataset by the `columns` property? Moved code right from the refactored `countCols` method.
2177
+ }
2344
2178
 
2179
+ // Extended dataset by the `columns` property? Moved code right from the refactored `countCols` method.
2345
2180
  } else if (instance.dataType === 'object' || instance.dataType === 'function') {
2346
2181
  finalNrOfColumns = datamap.colToPropCache.length;
2347
- } // In some cases we need to check columns length from the schema, i.e. `data` may be empty.
2182
+ }
2348
2183
 
2184
+ // In some cases we need to check columns length from the schema, i.e. `data` may be empty.
2349
2185
  } else if (isDefined(tableMeta.dataSchema)) {
2350
- var schema = datamap.getSchema(); // Schema may be defined as an array of objects. Each object will define column.
2186
+ var schema = datamap.getSchema();
2351
2187
 
2188
+ // Schema may be defined as an array of objects. Each object will define column.
2352
2189
  finalNrOfColumns = Array.isArray(schema) ? schema.length : deepObjectSize(schema);
2353
2190
  } else {
2354
2191
  // We init index mappers by length of source data to provide indexes also for skipped indexes.
2355
2192
  finalNrOfColumns = this.countSourceCols();
2356
2193
  }
2357
-
2358
2194
  return finalNrOfColumns;
2359
2195
  };
2196
+
2360
2197
  /**
2361
2198
  * Init index mapper which manage indexes assigned to the data.
2362
2199
  *
2363
2200
  * @private
2364
2201
  */
2365
-
2366
-
2367
2202
  this.initIndexMappers = function () {
2368
2203
  this.columnIndexMapper.initToLength(this.getInitialColumnCount());
2369
2204
  this.rowIndexMapper.initToLength(this.countSourceRows());
2370
2205
  };
2206
+
2371
2207
  /**
2372
2208
  * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method,
2373
2209
  * unless some modifications have been applied (i.e. Sequence of rows/columns was changed, some row/column was skipped).
@@ -2392,15 +2228,13 @@ export default function Core(rootElement, userSettings) {
2392
2228
  * hot.getData(2, 1, 3, 3);
2393
2229
  * ```
2394
2230
  */
2395
-
2396
-
2397
2231
  this.getData = function (row, column, row2, column2) {
2398
2232
  if (isUndefined(row)) {
2399
2233
  return datamap.getAll();
2400
2234
  }
2401
-
2402
2235
  return datamap.getRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2), datamap.DESTINATION_RENDERER);
2403
2236
  };
2237
+
2404
2238
  /**
2405
2239
  * Returns a string value of the selected range. Each column is separated by tab, each row is separated by a new
2406
2240
  * line character.
@@ -2413,11 +2247,10 @@ export default function Core(rootElement, userSettings) {
2413
2247
  * @param {number} endCol To visual column index.
2414
2248
  * @returns {string}
2415
2249
  */
2416
-
2417
-
2418
2250
  this.getCopyableText = function (startRow, startCol, endRow, endCol) {
2419
2251
  return datamap.getCopyableText(instance._createCellCoords(startRow, startCol), instance._createCellCoords(endRow, endCol));
2420
2252
  };
2253
+
2421
2254
  /**
2422
2255
  * Returns the data's copyable value at specified `row` and `column` index.
2423
2256
  *
@@ -2427,11 +2260,10 @@ export default function Core(rootElement, userSettings) {
2427
2260
  * @param {number} column Visual column index.
2428
2261
  * @returns {string}
2429
2262
  */
2430
-
2431
-
2432
2263
  this.getCopyableData = function (row, column) {
2433
2264
  return datamap.getCopyable(row, datamap.colToProp(column));
2434
2265
  };
2266
+
2435
2267
  /**
2436
2268
  * Returns schema provided by constructor settings. If it doesn't exist then it returns the schema based on the data
2437
2269
  * structure in the first row.
@@ -2440,11 +2272,10 @@ export default function Core(rootElement, userSettings) {
2440
2272
  * @function getSchema
2441
2273
  * @returns {object} Schema object.
2442
2274
  */
2443
-
2444
-
2445
2275
  this.getSchema = function () {
2446
2276
  return datamap.getSchema();
2447
2277
  };
2278
+
2448
2279
  /**
2449
2280
  * Use it if you need to change configuration after initialization. The `settings` argument is an object containing the changed
2450
2281
  * settings, declared the same way as in the initial settings object.
@@ -2473,37 +2304,32 @@ export default function Core(rootElement, userSettings) {
2473
2304
  * @fires Hooks#afterCellMetaReset
2474
2305
  * @fires Hooks#afterUpdateSettings
2475
2306
  */
2476
-
2477
-
2478
2307
  this.updateSettings = function (settings) {
2479
2308
  var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2480
2309
  var dataUpdateFunction = (firstRun ? instance.loadData : instance.updateData).bind(this);
2481
2310
  var columnsAsFunc = false;
2482
2311
  var i;
2483
2312
  var j;
2484
-
2485
2313
  if (isDefined(settings.rows)) {
2486
2314
  throw new Error('The "rows" setting is no longer supported. Do you mean startRows, minRows or maxRows?');
2487
2315
  }
2488
-
2489
2316
  if (isDefined(settings.cols)) {
2490
2317
  throw new Error('The "cols" setting is no longer supported. Do you mean startCols, minCols or maxCols?');
2491
2318
  }
2492
-
2493
2319
  if (isDefined(settings.ganttChart)) {
2494
2320
  throw new Error('Since 8.0.0 the "ganttChart" setting is no longer supported.');
2495
- } // eslint-disable-next-line no-restricted-syntax
2496
-
2321
+ }
2497
2322
 
2323
+ // eslint-disable-next-line no-restricted-syntax
2498
2324
  for (i in settings) {
2499
- if (i === 'data') {// Do nothing. loadData will be triggered later
2325
+ if (i === 'data') {
2326
+ // Do nothing. loadData will be triggered later
2500
2327
  } else if (i === 'language') {
2501
2328
  setLanguage(settings.language);
2502
2329
  } else if (i === 'className') {
2503
2330
  setClassName('className', settings.className);
2504
2331
  } else if (i === 'tableClassName' && instance.table) {
2505
2332
  setClassName('tableClassName', settings.tableClassName);
2506
-
2507
2333
  instance.view._wt.wtOverlays.syncOverlayTableClassNames();
2508
2334
  } else if (Hooks.getSingleton().isRegistered(i) || Hooks.getSingleton().isDeprecated(i)) {
2509
2335
  if (isFunction(settings[i]) || Array.isArray(settings[i])) {
@@ -2514,76 +2340,65 @@ export default function Core(rootElement, userSettings) {
2514
2340
  // Update settings
2515
2341
  globalMeta[i] = settings[i];
2516
2342
  }
2517
- } // Load data or create data map
2518
-
2343
+ }
2519
2344
 
2345
+ // Load data or create data map
2520
2346
  if (settings.data === void 0 && tableMeta.data === void 0) {
2521
2347
  dataUpdateFunction(null, 'updateSettings'); // data source created just now
2522
2348
  } else if (settings.data !== void 0) {
2523
2349
  dataUpdateFunction(settings.data, 'updateSettings'); // data source given as option
2524
2350
  } else if (settings.columns !== void 0) {
2525
- datamap.createMap(); // The `column` property has changed - dataset may be expanded or narrowed down. The `loadData` do the same.
2351
+ datamap.createMap();
2526
2352
 
2353
+ // The `column` property has changed - dataset may be expanded or narrowed down. The `loadData` do the same.
2527
2354
  instance.initIndexMappers();
2528
2355
  }
2529
-
2530
2356
  var clen = instance.countCols();
2531
- var columnSetting = tableMeta.columns; // Init columns constructors configuration
2357
+ var columnSetting = tableMeta.columns;
2532
2358
 
2359
+ // Init columns constructors configuration
2533
2360
  if (columnSetting && isFunction(columnSetting)) {
2534
2361
  columnsAsFunc = true;
2535
- } // Clear cell meta cache
2536
-
2362
+ }
2537
2363
 
2364
+ // Clear cell meta cache
2538
2365
  if (settings.cell !== void 0 || settings.cells !== void 0 || settings.columns !== void 0) {
2539
2366
  metaManager.clearCache();
2540
2367
  }
2541
-
2542
2368
  if (clen > 0) {
2543
2369
  for (i = 0, j = 0; i < clen; i++) {
2544
2370
  // Use settings provided by user
2545
2371
  if (columnSetting) {
2546
2372
  var column = columnsAsFunc ? columnSetting(i) : columnSetting[j];
2547
-
2548
2373
  if (column) {
2549
2374
  metaManager.updateColumnMeta(j, column);
2550
2375
  }
2551
2376
  }
2552
-
2553
2377
  j += 1;
2554
2378
  }
2555
2379
  }
2556
-
2557
2380
  if (isDefined(settings.cell)) {
2558
2381
  objectEach(settings.cell, function (cell) {
2559
2382
  instance.setCellMetaObject(cell.row, cell.col, cell);
2560
2383
  });
2561
2384
  }
2562
-
2563
2385
  instance.runHooks('afterCellMetaReset');
2564
2386
  var currentHeight = instance.rootElement.style.height;
2565
-
2566
2387
  if (currentHeight !== '') {
2567
2388
  currentHeight = parseInt(instance.rootElement.style.height, 10);
2568
2389
  }
2569
-
2570
2390
  var height = settings.height;
2571
-
2572
2391
  if (isFunction(height)) {
2573
2392
  height = height();
2574
2393
  }
2575
-
2576
2394
  if (init) {
2577
2395
  var initialStyle = instance.rootElement.getAttribute('style');
2578
-
2579
2396
  if (initialStyle) {
2580
2397
  instance.rootElement.setAttribute('data-initialstyle', instance.rootElement.getAttribute('style'));
2581
2398
  }
2582
2399
  }
2583
-
2584
2400
  if (height === null) {
2585
2401
  var _initialStyle = instance.rootElement.getAttribute('data-initialstyle');
2586
-
2587
2402
  if (_initialStyle && (_initialStyle.indexOf('height') > -1 || _initialStyle.indexOf('overflow') > -1)) {
2588
2403
  instance.rootElement.setAttribute('style', _initialStyle);
2589
2404
  } else {
@@ -2594,45 +2409,33 @@ export default function Core(rootElement, userSettings) {
2594
2409
  instance.rootElement.style.height = isNaN(height) ? "".concat(height) : "".concat(height, "px");
2595
2410
  instance.rootElement.style.overflow = 'hidden';
2596
2411
  }
2597
-
2598
2412
  if (typeof settings.width !== 'undefined') {
2599
2413
  var width = settings.width;
2600
-
2601
2414
  if (isFunction(width)) {
2602
2415
  width = width();
2603
2416
  }
2604
-
2605
2417
  instance.rootElement.style.width = isNaN(width) ? "".concat(width) : "".concat(width, "px");
2606
2418
  }
2607
-
2608
2419
  if (!init) {
2609
2420
  if (instance.view) {
2610
2421
  instance.view._wt.wtViewport.resetHasOversizedColumnHeadersMarked();
2611
-
2612
2422
  instance.view._wt.exportSettingsAsClassNames();
2613
2423
  }
2614
-
2615
2424
  instance.runHooks('afterUpdateSettings', settings);
2616
2425
  }
2617
-
2618
2426
  grid.adjustRowsAndCols();
2619
-
2620
2427
  if (instance.view && !firstRun) {
2621
2428
  instance.forceFullRender = true; // used when data was changed
2622
-
2623
2429
  editorManager.lockEditor();
2624
-
2625
2430
  instance._refreshBorders(null);
2626
-
2627
2431
  instance.view._wt.wtOverlays.adjustElementsSize();
2628
-
2629
2432
  editorManager.unlockEditor();
2630
2433
  }
2631
-
2632
2434
  if (!init && instance.view && (currentHeight === '' || height === '' || height === void 0) && currentHeight !== height) {
2633
2435
  instance.view._wt.wtOverlays.updateMainScrollableElements();
2634
2436
  }
2635
2437
  };
2438
+
2636
2439
  /**
2637
2440
  * Get value from the selected cell.
2638
2441
  *
@@ -2640,11 +2443,8 @@ export default function Core(rootElement, userSettings) {
2640
2443
  * @function getValue
2641
2444
  * @returns {*} Value of selected cell.
2642
2445
  */
2643
-
2644
-
2645
2446
  this.getValue = function () {
2646
2447
  var sel = instance.getSelectedLast();
2647
-
2648
2448
  if (tableMeta.getValue) {
2649
2449
  if (isFunction(tableMeta.getValue)) {
2650
2450
  return tableMeta.getValue.call(instance);
@@ -2655,6 +2455,7 @@ export default function Core(rootElement, userSettings) {
2655
2455
  return instance.getDataAtCell(sel[0], sel[1]);
2656
2456
  }
2657
2457
  };
2458
+
2658
2459
  /**
2659
2460
  * Returns the object settings.
2660
2461
  *
@@ -2662,58 +2463,94 @@ export default function Core(rootElement, userSettings) {
2662
2463
  * @function getSettings
2663
2464
  * @returns {TableMeta} Object containing the current table settings.
2664
2465
  */
2665
-
2666
-
2667
2466
  this.getSettings = function () {
2668
2467
  return tableMeta;
2669
2468
  };
2469
+
2670
2470
  /**
2671
2471
  * Clears the data from the table (the table settings remain intact).
2672
2472
  *
2673
2473
  * @memberof Core#
2674
2474
  * @function clear
2675
2475
  */
2676
-
2677
-
2678
2476
  this.clear = function () {
2679
2477
  this.selectAll();
2680
2478
  this.emptySelectedCells();
2681
2479
  };
2480
+
2682
2481
  /**
2683
- * Allows altering the table structure by either inserting/removing rows or columns.
2684
- * This method works with an array data structure only.
2482
+ * The `alter()` method lets you alter the grid's structure
2483
+ * by adding or removing rows and columns at specified positions.
2484
+ *
2485
+ * ::: tip
2486
+ * The `alter()` method works only when your [`data`](@/api/options.md#data)
2487
+ * is an [array of arrays](@/guides/getting-started/binding-to-data.md#array-of-arrays).
2488
+ * :::
2489
+ *
2490
+ * ```js
2491
+ * // above row 10 (by visual index), insert 1 new row
2492
+ * hot.alter('insert_row_above', 10);
2493
+ * ```
2494
+ *
2495
+ * | Action | With `index` | Without `index` |
2496
+ * | -------------------- | ------------ | --------------- |
2497
+ * | `'insert_row_above'` | Inserts rows above the `index` row. | Inserts rows above the first row. |
2498
+ * | `'insert_row_below'` | Inserts rows below the `index` row. | Inserts rows below the last row. |
2499
+ * | `'remove_row'` | Removes rows, starting from the `index` row. | Removes rows, starting from the last row. |
2500
+ * | `'insert_col_start'` | Inserts columns before the `index` column. | Inserts columns before the first column. |
2501
+ * | `'insert_col_end'` | Inserts columns after the `index` column. | Inserts columns after the last column. |
2502
+ * | `'remove_col'` | Removes columns, starting from the `index` column. | Removes columns, starting from the last column. |
2503
+ * | `'insert_row'` (<b>Deprecated</b>) | Inserts rows above the `index` row. | Inserts rows below the last row. |
2504
+ * | `'insert_col'` (<b>Deprecated</b>) | Inserts columns before the `index` column. | Inserts columns after the last column. |
2505
+ *
2506
+ * The behavior of `'insert_col_start'`, `'insert_col_end'`, and `'insert_col'` depends on your [`layoutDirection`](@/api/options.md#layoutdirection).
2685
2507
  *
2686
2508
  * @memberof Core#
2687
2509
  * @function alter
2688
- * @param {string} action Possible alter operations:
2689
- * <ul>
2690
- * <li> `'insert_row'` </li>
2691
- * <li> `'insert_col'` </li>
2692
- * <li> `'remove_row'` </li>
2510
+ * @param {string} action Available operations:
2511
+ * <ul>
2512
+ * <li> `'insert_row_above'` </li>
2513
+ * <li> `'insert_row_below'` </li>
2514
+ * <li> `'remove_row'` </li> </li>
2515
+ * <li> `'insert_col_start'` </li>
2516
+ * <li> `'insert_col_end'` </li>
2693
2517
  * <li> `'remove_col'` </li>
2694
- * </ul>.
2695
- * @param {number|number[]} index Visual index of the row/column before which the new row/column will be
2696
- * inserted/removed or an array of arrays in format `[[index, amount],...]`.
2697
- * @param {number} [amount=1] Amount of rows/columns to be inserted or removed.
2518
+ * <li> `'insert_row'` (<b>Deprecated</b>) </li>
2519
+ * <li> `'insert_col'` (<b>Deprecated</b>) </li>
2520
+ * </ul>
2521
+ * @param {number|number[]} [index] A visual index of the row/column before or after which the new row/column will be
2522
+ * inserted or removed. Can also be an array of arrays, in format `[[index, amount],...]`.
2523
+ * @param {number} [amount] The amount of rows or columns to be inserted or removed (default: `1`).
2698
2524
  * @param {string} [source] Source indicator.
2699
- * @param {boolean} [keepEmptyRows] Flag for preventing deletion of empty rows.
2525
+ * @param {boolean} [keepEmptyRows] If set to `true`: prevents removing empty rows.
2700
2526
  * @example
2701
2527
  * ```js
2702
- * // Insert new row above the row at given visual index.
2703
- * hot.alter('insert_row', 10);
2704
- * // Insert 3 new columns before 10th column.
2705
- * hot.alter('insert_col', 10, 3);
2706
- * // Remove 2 rows starting from 10th row.
2528
+ * // above row 10 (by visual index), insert 1 new row
2529
+ * hot.alter('insert_row_above', 10);
2530
+ *
2531
+ * // below row 10 (by visual index), insert 3 new rows
2532
+ * hot.alter('insert_row_below', 10, 3);
2533
+ *
2534
+ * // in the LTR layout direction: to the left of column 10 (by visual index), insert 3 new columns
2535
+ * // in the RTL layout direction: to the right of column 10 (by visual index), insert 3 new columns
2536
+ * hot.alter('insert_col_start', 10, 3);
2537
+ *
2538
+ * // in the LTR layout direction: to the right of column 10 (by visual index), insert 1 new column
2539
+ * // in the RTL layout direction: to the left of column 10 (by visual index), insert 1 new column
2540
+ * hot.alter('insert_col_end', 10);
2541
+ *
2542
+ * // remove 2 rows, starting from row 10 (by visual index)
2707
2543
  * hot.alter('remove_row', 10, 2);
2708
- * // Remove 5 non-contiquous rows (it removes 3 rows from visual index 1 and 2 rows from visual index 5).
2544
+ *
2545
+ * // remove 3 rows, starting from row 1 (by visual index)
2546
+ * // remove 2 rows, starting from row 5 (by visual index)
2709
2547
  * hot.alter('remove_row', [[1, 3], [5, 2]]);
2710
2548
  * ```
2711
2549
  */
2712
-
2713
-
2714
2550
  this.alter = function (action, index, amount, source, keepEmptyRows) {
2715
2551
  grid.alter(action, index, amount, source, keepEmptyRows);
2716
2552
  };
2553
+
2717
2554
  /**
2718
2555
  * Returns a TD element for the given `row` and `column` arguments, if it is rendered on screen.
2719
2556
  * Returns `null` if the TD is not rendered on screen (probably because that part of the table is not visible).
@@ -2726,36 +2563,29 @@ export default function Core(rootElement, userSettings) {
2726
2563
  * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.
2727
2564
  * @returns {HTMLTableCellElement|null} The cell's TD element.
2728
2565
  */
2729
-
2730
-
2731
2566
  this.getCell = function (row, column) {
2732
2567
  var topmost = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2733
2568
  var renderableColumnIndex = column; // Handling also column headers.
2734
-
2735
2569
  var renderableRowIndex = row; // Handling also row headers.
2736
2570
 
2737
2571
  if (column >= 0) {
2738
2572
  if (this.columnIndexMapper.isHidden(this.toPhysicalColumn(column))) {
2739
2573
  return null;
2740
2574
  }
2741
-
2742
2575
  renderableColumnIndex = this.columnIndexMapper.getRenderableFromVisualIndex(column);
2743
2576
  }
2744
-
2745
2577
  if (row >= 0) {
2746
2578
  if (this.rowIndexMapper.isHidden(this.toPhysicalRow(row))) {
2747
2579
  return null;
2748
2580
  }
2749
-
2750
2581
  renderableRowIndex = this.rowIndexMapper.getRenderableFromVisualIndex(row);
2751
2582
  }
2752
-
2753
2583
  if (renderableRowIndex === null || renderableColumnIndex === null) {
2754
2584
  return null;
2755
2585
  }
2756
-
2757
2586
  return instance.view.getCellAtCoords(instance._createCellCoords(renderableRowIndex, renderableColumnIndex), topmost);
2758
2587
  };
2588
+
2759
2589
  /**
2760
2590
  * Returns the coordinates of the cell, provided as a HTML table cell element.
2761
2591
  *
@@ -2769,30 +2599,24 @@ export default function Core(rootElement, userSettings) {
2769
2599
  * // it returns CellCoords object instance with props row: 1 and col: 1.
2770
2600
  * ```
2771
2601
  */
2772
-
2773
-
2774
2602
  this.getCoords = function (element) {
2775
2603
  var renderableCoords = this.view._wt.wtTable.getCoords(element);
2776
-
2777
2604
  if (renderableCoords === null) {
2778
2605
  return null;
2779
2606
  }
2780
-
2781
2607
  var renderableRow = renderableCoords.row,
2782
- renderableColumn = renderableCoords.col;
2608
+ renderableColumn = renderableCoords.col;
2783
2609
  var visualRow = renderableRow;
2784
2610
  var visualColumn = renderableColumn;
2785
-
2786
2611
  if (renderableRow >= 0) {
2787
2612
  visualRow = this.rowIndexMapper.getVisualFromRenderableIndex(renderableRow);
2788
2613
  }
2789
-
2790
2614
  if (renderableColumn >= 0) {
2791
2615
  visualColumn = this.columnIndexMapper.getVisualFromRenderableIndex(renderableColumn);
2792
2616
  }
2793
-
2794
2617
  return instance._createCellCoords(visualRow, visualColumn);
2795
2618
  };
2619
+
2796
2620
  /**
2797
2621
  * Returns the property name that corresponds with the given column index.
2798
2622
  * If the data source is an array of arrays, it returns the columns index.
@@ -2802,11 +2626,10 @@ export default function Core(rootElement, userSettings) {
2802
2626
  * @param {number} column Visual column index.
2803
2627
  * @returns {string|number} Column property or physical column index.
2804
2628
  */
2805
-
2806
-
2807
2629
  this.colToProp = function (column) {
2808
2630
  return datamap.colToProp(column);
2809
2631
  };
2632
+
2810
2633
  /**
2811
2634
  * Returns column index that corresponds with the given property.
2812
2635
  *
@@ -2815,11 +2638,10 @@ export default function Core(rootElement, userSettings) {
2815
2638
  * @param {string|number} prop Property name or physical column index.
2816
2639
  * @returns {number} Visual column index.
2817
2640
  */
2818
-
2819
-
2820
2641
  this.propToCol = function (prop) {
2821
2642
  return datamap.propToCol(prop);
2822
2643
  };
2644
+
2823
2645
  /**
2824
2646
  * Translate physical row index into visual.
2825
2647
  *
@@ -2831,11 +2653,10 @@ export default function Core(rootElement, userSettings) {
2831
2653
  * @param {number} row Physical row index.
2832
2654
  * @returns {number} Returns visual row index.
2833
2655
  */
2834
-
2835
-
2836
2656
  this.toVisualRow = function (row) {
2837
2657
  return _this.rowIndexMapper.getVisualFromPhysicalIndex(row);
2838
2658
  };
2659
+
2839
2660
  /**
2840
2661
  * Translate physical column index into visual.
2841
2662
  *
@@ -2847,11 +2668,10 @@ export default function Core(rootElement, userSettings) {
2847
2668
  * @param {number} column Physical column index.
2848
2669
  * @returns {number} Returns visual column index.
2849
2670
  */
2850
-
2851
-
2852
2671
  this.toVisualColumn = function (column) {
2853
2672
  return _this.columnIndexMapper.getVisualFromPhysicalIndex(column);
2854
2673
  };
2674
+
2855
2675
  /**
2856
2676
  * Translate visual row index into physical.
2857
2677
  *
@@ -2863,11 +2683,10 @@ export default function Core(rootElement, userSettings) {
2863
2683
  * @param {number} row Visual row index.
2864
2684
  * @returns {number} Returns physical row index.
2865
2685
  */
2866
-
2867
-
2868
2686
  this.toPhysicalRow = function (row) {
2869
2687
  return _this.rowIndexMapper.getPhysicalFromVisualIndex(row);
2870
2688
  };
2689
+
2871
2690
  /**
2872
2691
  * Translate visual column index into physical.
2873
2692
  *
@@ -2879,11 +2698,10 @@ export default function Core(rootElement, userSettings) {
2879
2698
  * @param {number} column Visual column index.
2880
2699
  * @returns {number} Returns physical column index.
2881
2700
  */
2882
-
2883
-
2884
2701
  this.toPhysicalColumn = function (column) {
2885
2702
  return _this.columnIndexMapper.getPhysicalFromVisualIndex(column);
2886
2703
  };
2704
+
2887
2705
  /**
2888
2706
  * @description
2889
2707
  * Returns the cell value at `row`, `column`.
@@ -2896,11 +2714,10 @@ export default function Core(rootElement, userSettings) {
2896
2714
  * @param {number} column Visual column index.
2897
2715
  * @returns {*} Data at cell.
2898
2716
  */
2899
-
2900
-
2901
2717
  this.getDataAtCell = function (row, column) {
2902
2718
  return datamap.get(row, datamap.colToProp(column));
2903
2719
  };
2720
+
2904
2721
  /**
2905
2722
  * Returns value at visual `row` and `prop` indexes.
2906
2723
  *
@@ -2912,11 +2729,10 @@ export default function Core(rootElement, userSettings) {
2912
2729
  * @param {string} prop Property name.
2913
2730
  * @returns {*} Cell value.
2914
2731
  */
2915
-
2916
-
2917
2732
  this.getDataAtRowProp = function (row, prop) {
2918
2733
  return datamap.get(row, prop);
2919
2734
  };
2735
+
2920
2736
  /**
2921
2737
  * @description
2922
2738
  * Returns array of column values from the data source.
@@ -2928,13 +2744,11 @@ export default function Core(rootElement, userSettings) {
2928
2744
  * @param {number} column Visual column index.
2929
2745
  * @returns {Array} Array of cell values.
2930
2746
  */
2931
-
2932
-
2933
2747
  this.getDataAtCol = function (column) {
2934
2748
  var _ref13;
2935
-
2936
2749
  return (_ref13 = []).concat.apply(_ref13, _toConsumableArray(datamap.getRange(instance._createCellCoords(0, column), instance._createCellCoords(tableMeta.data.length - 1, column), datamap.DESTINATION_RENDERER)));
2937
2750
  };
2751
+
2938
2752
  /**
2939
2753
  * Given the object property name (e.g. `'first.name'` or `'0'`), returns an array of column's values from the table data.
2940
2754
  * You can also provide a column index as the first argument.
@@ -2945,14 +2759,12 @@ export default function Core(rootElement, userSettings) {
2945
2759
  * @returns {Array} Array of cell values.
2946
2760
  */
2947
2761
  // TODO: Getting data from `datamap` should work on visual indexes.
2948
-
2949
-
2950
2762
  this.getDataAtProp = function (prop) {
2951
2763
  var _ref14;
2952
-
2953
2764
  var range = datamap.getRange(instance._createCellCoords(0, datamap.propToCol(prop)), instance._createCellCoords(tableMeta.data.length - 1, datamap.propToCol(prop)), datamap.DESTINATION_RENDERER);
2954
2765
  return (_ref14 = []).concat.apply(_ref14, _toConsumableArray(range));
2955
2766
  };
2767
+
2956
2768
  /**
2957
2769
  * Returns a clone of the source data object.
2958
2770
  * Optionally you can provide a cell range by using the `row`, `column`, `row2`, `column2` arguments, to get only a
@@ -2969,19 +2781,16 @@ export default function Core(rootElement, userSettings) {
2969
2781
  * @param {number} [column2] To physical column index (or visual index, if data type is an array of objects).
2970
2782
  * @returns {Array[]|object[]} The table data.
2971
2783
  */
2972
-
2973
-
2974
2784
  this.getSourceData = function (row, column, row2, column2) {
2975
2785
  var data;
2976
-
2977
2786
  if (row === void 0) {
2978
2787
  data = dataSource.getData();
2979
2788
  } else {
2980
2789
  data = dataSource.getByRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2));
2981
2790
  }
2982
-
2983
2791
  return data;
2984
2792
  };
2793
+
2985
2794
  /**
2986
2795
  * Returns the source data object as an arrays of arrays format even when source data was provided in another format.
2987
2796
  * Optionally you can provide a cell range by using the `row`, `column`, `row2`, `column2` arguments, to get only a
@@ -2998,19 +2807,16 @@ export default function Core(rootElement, userSettings) {
2998
2807
  * @param {number} [column2] To physical column index (or visual index, if data type is an array of objects).
2999
2808
  * @returns {Array} An array of arrays.
3000
2809
  */
3001
-
3002
-
3003
2810
  this.getSourceDataArray = function (row, column, row2, column2) {
3004
2811
  var data;
3005
-
3006
2812
  if (row === void 0) {
3007
2813
  data = dataSource.getData(true);
3008
2814
  } else {
3009
2815
  data = dataSource.getByRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2), true);
3010
2816
  }
3011
-
3012
2817
  return data;
3013
2818
  };
2819
+
3014
2820
  /**
3015
2821
  * Returns an array of column values from the data source.
3016
2822
  *
@@ -3020,13 +2826,11 @@ export default function Core(rootElement, userSettings) {
3020
2826
  * @returns {Array} Array of the column's cell values.
3021
2827
  */
3022
2828
  // TODO: Getting data from `sourceData` should work always on physical indexes.
3023
-
3024
-
3025
2829
  this.getSourceDataAtCol = function (column) {
3026
2830
  return dataSource.getAtColumn(column);
3027
2831
  };
3028
- /* eslint-disable jsdoc/require-param */
3029
2832
 
2833
+ /* eslint-disable jsdoc/require-param */
3030
2834
  /**
3031
2835
  * Set the provided value in the source data set at the provided coordinates.
3032
2836
  *
@@ -3037,47 +2841,39 @@ export default function Core(rootElement, userSettings) {
3037
2841
  * @param {*} value The value to be set at the provided coordinates.
3038
2842
  * @param {string} [source] Source of the change as a string.
3039
2843
  */
3040
-
3041
2844
  /* eslint-enable jsdoc/require-param */
3042
-
3043
-
3044
2845
  this.setSourceDataAtCell = function (row, column, value, source) {
3045
2846
  var input = setDataInputToArray(row, column, value);
3046
2847
  var isThereAnySetSourceListener = this.hasHook('afterSetSourceDataAtCell');
3047
2848
  var changesForHook = [];
3048
-
3049
2849
  if (isThereAnySetSourceListener) {
3050
2850
  arrayEach(input, function (_ref15) {
3051
2851
  var _ref16 = _slicedToArray(_ref15, 3),
3052
- changeRow = _ref16[0],
3053
- changeProp = _ref16[1],
3054
- changeValue = _ref16[2];
3055
-
3056
- changesForHook.push([changeRow, changeProp, dataSource.getAtCell(changeRow, changeProp), // The previous value.
2852
+ changeRow = _ref16[0],
2853
+ changeProp = _ref16[1],
2854
+ changeValue = _ref16[2];
2855
+ changesForHook.push([changeRow, changeProp, dataSource.getAtCell(changeRow, changeProp),
2856
+ // The previous value.
3057
2857
  changeValue]);
3058
2858
  });
3059
2859
  }
3060
-
3061
2860
  arrayEach(input, function (_ref17) {
3062
2861
  var _ref18 = _slicedToArray(_ref17, 3),
3063
- changeRow = _ref18[0],
3064
- changeProp = _ref18[1],
3065
- changeValue = _ref18[2];
3066
-
2862
+ changeRow = _ref18[0],
2863
+ changeProp = _ref18[1],
2864
+ changeValue = _ref18[2];
3067
2865
  dataSource.setAtCell(changeRow, changeProp, changeValue);
3068
2866
  });
3069
-
3070
2867
  if (isThereAnySetSourceListener) {
3071
2868
  this.runHooks('afterSetSourceDataAtCell', changesForHook, source);
3072
2869
  }
3073
-
3074
2870
  this.render();
3075
2871
  var activeEditor = instance.getActiveEditor();
3076
-
3077
2872
  if (activeEditor && isDefined(activeEditor.refreshValue)) {
3078
2873
  activeEditor.refreshValue();
3079
2874
  }
3080
2875
  };
2876
+
3081
2877
  /**
3082
2878
  * Returns a single row of the data (array or object, depending on what data format you use).
3083
2879
  *
@@ -3089,11 +2885,10 @@ export default function Core(rootElement, userSettings) {
3089
2885
  * @param {number} row Physical row index.
3090
2886
  * @returns {Array|object} Single row of data.
3091
2887
  */
3092
-
3093
-
3094
2888
  this.getSourceDataAtRow = function (row) {
3095
2889
  return dataSource.getAtRow(row);
3096
2890
  };
2891
+
3097
2892
  /**
3098
2893
  * Returns a single value from the data source.
3099
2894
  *
@@ -3104,11 +2899,10 @@ export default function Core(rootElement, userSettings) {
3104
2899
  * @returns {*} Cell data.
3105
2900
  */
3106
2901
  // TODO: Getting data from `sourceData` should work always on physical indexes.
3107
-
3108
-
3109
2902
  this.getSourceDataAtCell = function (row, column) {
3110
2903
  return dataSource.getAtCell(row, column);
3111
2904
  };
2905
+
3112
2906
  /**
3113
2907
  * @description
3114
2908
  * Returns a single row of the data.
@@ -3120,12 +2914,11 @@ export default function Core(rootElement, userSettings) {
3120
2914
  * @param {number} row Visual row index.
3121
2915
  * @returns {Array} Array of row's cell data.
3122
2916
  */
3123
-
3124
-
3125
2917
  this.getDataAtRow = function (row) {
3126
2918
  var data = datamap.getRange(instance._createCellCoords(row, 0), instance._createCellCoords(row, this.countCols() - 1), datamap.DESTINATION_RENDERER);
3127
2919
  return data[0] || [];
3128
2920
  };
2921
+
3129
2922
  /**
3130
2923
  * @description
3131
2924
  * Returns a data type defined in the Handsontable settings under the `type` key ({@link Options#type}).
@@ -3141,41 +2934,32 @@ export default function Core(rootElement, userSettings) {
3141
2934
  * @param {number} columnTo To visual column index.
3142
2935
  * @returns {string} Cell type (e.q: `'mixed'`, `'text'`, `'numeric'`, `'autocomplete'`).
3143
2936
  */
3144
-
3145
-
3146
2937
  this.getDataType = function (rowFrom, columnFrom, rowTo, columnTo) {
3147
2938
  var _this4 = this;
3148
-
3149
2939
  var coords = rowFrom === void 0 ? [0, 0, this.countRows(), this.countCols()] : [rowFrom, columnFrom, rowTo, columnTo];
3150
2940
  var rowStart = coords[0],
3151
- columnStart = coords[1];
2941
+ columnStart = coords[1];
3152
2942
  var rowEnd = coords[2],
3153
- columnEnd = coords[3];
2943
+ columnEnd = coords[3];
3154
2944
  var previousType = null;
3155
2945
  var currentType = null;
3156
-
3157
2946
  if (rowEnd === void 0) {
3158
2947
  rowEnd = rowStart;
3159
2948
  }
3160
-
3161
2949
  if (columnEnd === void 0) {
3162
2950
  columnEnd = columnStart;
3163
2951
  }
3164
-
3165
2952
  var type = 'mixed';
3166
2953
  rangeEach(Math.max(Math.min(rowStart, rowEnd), 0), Math.max(rowStart, rowEnd), function (row) {
3167
2954
  var isTypeEqual = true;
3168
2955
  rangeEach(Math.max(Math.min(columnStart, columnEnd), 0), Math.max(columnStart, columnEnd), function (column) {
3169
2956
  var cellType = _this4.getCellMeta(row, column);
3170
-
3171
2957
  currentType = cellType.type;
3172
-
3173
2958
  if (previousType) {
3174
2959
  isTypeEqual = previousType === currentType;
3175
2960
  } else {
3176
2961
  previousType = currentType;
3177
2962
  }
3178
-
3179
2963
  return isTypeEqual;
3180
2964
  });
3181
2965
  type = isTypeEqual ? currentType : 'mixed';
@@ -3183,6 +2967,7 @@ export default function Core(rootElement, userSettings) {
3183
2967
  });
3184
2968
  return type;
3185
2969
  };
2970
+
3186
2971
  /**
3187
2972
  * Remove a property defined by the `key` argument from the cell meta object for the provided `row` and `column` coordinates.
3188
2973
  *
@@ -3194,22 +2979,19 @@ export default function Core(rootElement, userSettings) {
3194
2979
  * @fires Hooks#beforeRemoveCellMeta
3195
2980
  * @fires Hooks#afterRemoveCellMeta
3196
2981
  */
3197
-
3198
-
3199
2982
  this.removeCellMeta = function (row, column, key) {
3200
2983
  var _ref19 = [this.toPhysicalRow(row), this.toPhysicalColumn(column)],
3201
- physicalRow = _ref19[0],
3202
- physicalColumn = _ref19[1];
2984
+ physicalRow = _ref19[0],
2985
+ physicalColumn = _ref19[1];
3203
2986
  var cachedValue = metaManager.getCellMetaKeyValue(physicalRow, physicalColumn, key);
3204
2987
  var hookResult = instance.runHooks('beforeRemoveCellMeta', row, column, key, cachedValue);
3205
-
3206
2988
  if (hookResult !== false) {
3207
2989
  metaManager.removeCellMeta(physicalRow, physicalColumn, key);
3208
2990
  instance.runHooks('afterRemoveCellMeta', row, column, key, cachedValue);
3209
2991
  }
3210
-
3211
2992
  cachedValue = null;
3212
2993
  };
2994
+
3213
2995
  /**
3214
2996
  * Removes or adds one or more rows of the cell meta objects to the cell meta collections.
3215
2997
  *
@@ -3220,25 +3002,18 @@ export default function Core(rootElement, userSettings) {
3220
3002
  * @param {number} [deleteAmount=0] The number of items to be removed. If set to 0, no cell meta objects will be removed.
3221
3003
  * @param {...object} [cellMetaRows] The new cell meta row objects to be added to the cell meta collection.
3222
3004
  */
3223
-
3224
-
3225
3005
  this.spliceCellsMeta = function (visualIndex) {
3226
3006
  var _this5 = this;
3227
-
3228
3007
  var deleteAmount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
3229
-
3230
3008
  for (var _len3 = arguments.length, cellMetaRows = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
3231
3009
  cellMetaRows[_key3 - 2] = arguments[_key3];
3232
3010
  }
3233
-
3234
3011
  if (cellMetaRows.length > 0 && !Array.isArray(cellMetaRows[0])) {
3235
3012
  throw new Error('The 3rd argument (cellMetaRows) has to be passed as an array of cell meta objects array.');
3236
3013
  }
3237
-
3238
3014
  if (deleteAmount > 0) {
3239
3015
  metaManager.removeRow(this.toPhysicalRow(visualIndex), deleteAmount);
3240
3016
  }
3241
-
3242
3017
  if (cellMetaRows.length > 0) {
3243
3018
  arrayEach(cellMetaRows.reverse(), function (cellMetaRow) {
3244
3019
  metaManager.createRow(_this5.toPhysicalRow(visualIndex));
@@ -3247,9 +3022,9 @@ export default function Core(rootElement, userSettings) {
3247
3022
  });
3248
3023
  });
3249
3024
  }
3250
-
3251
3025
  instance.render();
3252
3026
  };
3027
+
3253
3028
  /**
3254
3029
  * Set cell meta data object defined by `prop` to the corresponding params `row` and `column`.
3255
3030
  *
@@ -3259,17 +3034,15 @@ export default function Core(rootElement, userSettings) {
3259
3034
  * @param {number} column Visual column index.
3260
3035
  * @param {object} prop Meta object.
3261
3036
  */
3262
-
3263
-
3264
3037
  this.setCellMetaObject = function (row, column, prop) {
3265
3038
  var _this6 = this;
3266
-
3267
3039
  if (_typeof(prop) === 'object') {
3268
3040
  objectEach(prop, function (value, key) {
3269
3041
  _this6.setCellMeta(row, column, key, value);
3270
3042
  });
3271
3043
  }
3272
3044
  };
3045
+
3273
3046
  /**
3274
3047
  * Sets a property defined by the `key` property to the meta object of a cell corresponding to params `row` and `column`.
3275
3048
  *
@@ -3282,29 +3055,23 @@ export default function Core(rootElement, userSettings) {
3282
3055
  * @fires Hooks#beforeSetCellMeta
3283
3056
  * @fires Hooks#afterSetCellMeta
3284
3057
  */
3285
-
3286
-
3287
3058
  this.setCellMeta = function (row, column, key, value) {
3288
3059
  var allowSetCellMeta = instance.runHooks('beforeSetCellMeta', row, column, key, value);
3289
-
3290
3060
  if (allowSetCellMeta === false) {
3291
3061
  return;
3292
3062
  }
3293
-
3294
3063
  var physicalRow = row;
3295
3064
  var physicalColumn = column;
3296
-
3297
3065
  if (row < this.countRows()) {
3298
3066
  physicalRow = this.toPhysicalRow(row);
3299
3067
  }
3300
-
3301
3068
  if (column < this.countCols()) {
3302
3069
  physicalColumn = this.toPhysicalColumn(column);
3303
3070
  }
3304
-
3305
3071
  metaManager.setCellMeta(physicalRow, physicalColumn, key, value);
3306
3072
  instance.runHooks('afterSetCellMeta', row, column, key, value);
3307
3073
  };
3074
+
3308
3075
  /**
3309
3076
  * Get all the cells meta settings at least once generated in the table (in order of cell initialization).
3310
3077
  *
@@ -3312,11 +3079,10 @@ export default function Core(rootElement, userSettings) {
3312
3079
  * @function getCellsMeta
3313
3080
  * @returns {Array} Returns an array of ColumnSettings object instances.
3314
3081
  */
3315
-
3316
-
3317
3082
  this.getCellsMeta = function () {
3318
3083
  return metaManager.getCellsMeta();
3319
3084
  };
3085
+
3320
3086
  /**
3321
3087
  * Returns the cell properties object for the given `row` and `column` coordinates.
3322
3088
  *
@@ -3328,25 +3094,21 @@ export default function Core(rootElement, userSettings) {
3328
3094
  * @fires Hooks#beforeGetCellMeta
3329
3095
  * @fires Hooks#afterGetCellMeta
3330
3096
  */
3331
-
3332
-
3333
3097
  this.getCellMeta = function (row, column) {
3334
3098
  var physicalRow = this.toPhysicalRow(row);
3335
3099
  var physicalColumn = this.toPhysicalColumn(column);
3336
-
3337
3100
  if (physicalRow === null) {
3338
3101
  physicalRow = row;
3339
3102
  }
3340
-
3341
3103
  if (physicalColumn === null) {
3342
3104
  physicalColumn = column;
3343
3105
  }
3344
-
3345
3106
  return metaManager.getCellMeta(physicalRow, physicalColumn, {
3346
3107
  visualRow: row,
3347
3108
  visualColumn: column
3348
3109
  });
3349
3110
  };
3111
+
3350
3112
  /**
3351
3113
  * Returns an array of cell meta objects for specified physical row index.
3352
3114
  *
@@ -3355,11 +3117,10 @@ export default function Core(rootElement, userSettings) {
3355
3117
  * @param {number} row Physical row index.
3356
3118
  * @returns {Array}
3357
3119
  */
3358
-
3359
-
3360
3120
  this.getCellMetaAtRow = function (row) {
3361
3121
  return metaManager.getCellsMetaAtRow(row);
3362
3122
  };
3123
+
3363
3124
  /**
3364
3125
  * Checks if the data format and config allows user to modify the column structure.
3365
3126
  *
@@ -3367,21 +3128,18 @@ export default function Core(rootElement, userSettings) {
3367
3128
  * @function isColumnModificationAllowed
3368
3129
  * @returns {boolean}
3369
3130
  */
3370
-
3371
-
3372
3131
  this.isColumnModificationAllowed = function () {
3373
3132
  return !(instance.dataType === 'object' || tableMeta.columns);
3374
3133
  };
3375
3134
 
3376
- var rendererLookup = cellMethodLookupFactory('renderer');
3377
3135
  /**
3378
3136
  * Returns the cell renderer function by given `row` and `column` arguments.
3379
3137
  *
3380
3138
  * @memberof Core#
3381
3139
  * @function getCellRenderer
3382
- * @param {number|object} row Visual row index or cell meta object (see {@link Core#getCellMeta}).
3140
+ * @param {number|object} rowOrMeta Visual row index or cell meta object (see {@link Core#getCellMeta}).
3383
3141
  * @param {number} column Visual column index.
3384
- * @returns {Function} The renderer function.
3142
+ * @returns {Function} Returns the renderer function.
3385
3143
  * @example
3386
3144
  * ```js
3387
3145
  * // Get cell renderer using `row` and `column` coordinates.
@@ -3390,18 +3148,22 @@ export default function Core(rootElement, userSettings) {
3390
3148
  * hot.getCellRenderer(hot.getCellMeta(1, 1));
3391
3149
  * ```
3392
3150
  */
3393
-
3394
- this.getCellRenderer = function (row, column) {
3395
- return getRenderer(rendererLookup.call(this, row, column));
3151
+ this.getCellRenderer = function (rowOrMeta, column) {
3152
+ var cellRenderer = typeof rowOrMeta === 'number' ? instance.getCellMeta(rowOrMeta, column).renderer : rowOrMeta.renderer;
3153
+ if (typeof cellRenderer === 'string') {
3154
+ return getRenderer(cellRenderer);
3155
+ }
3156
+ return isUndefined(cellRenderer) ? getRenderer('text') : cellRenderer;
3396
3157
  };
3158
+
3397
3159
  /**
3398
3160
  * Returns the cell editor class by the provided `row` and `column` arguments.
3399
3161
  *
3400
3162
  * @memberof Core#
3401
3163
  * @function getCellEditor
3402
- * @param {number} row Visual row index or cell meta object (see {@link Core#getCellMeta}).
3164
+ * @param {number} rowOrMeta Visual row index or cell meta object (see {@link Core#getCellMeta}).
3403
3165
  * @param {number} column Visual column index.
3404
- * @returns {Function} The editor class.
3166
+ * @returns {Function|boolean} Returns the editor class or `false` is cell editor is disabled.
3405
3167
  * @example
3406
3168
  * ```js
3407
3169
  * // Get cell editor class using `row` and `column` coordinates.
@@ -3410,36 +3172,38 @@ export default function Core(rootElement, userSettings) {
3410
3172
  * hot.getCellEditor(hot.getCellMeta(1, 1));
3411
3173
  * ```
3412
3174
  */
3175
+ this.getCellEditor = function (rowOrMeta, column) {
3176
+ var cellEditor = typeof rowOrMeta === 'number' ? instance.getCellMeta(rowOrMeta, column).editor : rowOrMeta.editor;
3177
+ if (typeof cellEditor === 'string') {
3178
+ return getEditor(cellEditor);
3179
+ }
3180
+ return isUndefined(cellEditor) ? getEditor('text') : cellEditor;
3181
+ };
3413
3182
 
3414
-
3415
- this.getCellEditor = cellMethodLookupFactory('editor');
3416
- var validatorLookup = cellMethodLookupFactory('validator');
3417
3183
  /**
3418
3184
  * Returns the cell validator by `row` and `column`.
3419
3185
  *
3420
3186
  * @memberof Core#
3421
3187
  * @function getCellValidator
3422
- * @param {number|object} row Visual row index or cell meta object (see {@link Core#getCellMeta}).
3188
+ * @param {number|object} rowOrMeta Visual row index or cell meta object (see {@link Core#getCellMeta}).
3423
3189
  * @param {number} column Visual column index.
3424
3190
  * @returns {Function|RegExp|undefined} The validator function.
3425
3191
  * @example
3426
3192
  * ```js
3427
- * // Get cell valiator using `row` and `column` coordinates.
3193
+ * // Get cell validator using `row` and `column` coordinates.
3428
3194
  * hot.getCellValidator(1, 1);
3429
- * // Get cell valiator using cell meta object.
3195
+ * // Get cell validator using cell meta object.
3430
3196
  * hot.getCellValidator(hot.getCellMeta(1, 1));
3431
3197
  * ```
3432
3198
  */
3433
-
3434
- this.getCellValidator = function (row, column) {
3435
- var validator = validatorLookup.call(this, row, column);
3436
-
3437
- if (typeof validator === 'string') {
3438
- validator = getValidator(validator);
3199
+ this.getCellValidator = function (rowOrMeta, column) {
3200
+ var cellValidator = typeof rowOrMeta === 'number' ? instance.getCellMeta(rowOrMeta, column).validator : rowOrMeta.validator;
3201
+ if (typeof cellValidator === 'string') {
3202
+ return getValidator(cellValidator);
3439
3203
  }
3440
-
3441
- return validator;
3204
+ return cellValidator;
3442
3205
  };
3206
+
3443
3207
  /**
3444
3208
  * Validates all cells using their validator functions and calls callback when finished.
3445
3209
  *
@@ -3458,11 +3222,10 @@ export default function Core(rootElement, userSettings) {
3458
3222
  * })
3459
3223
  * ```
3460
3224
  */
3461
-
3462
-
3463
3225
  this.validateCells = function (callback) {
3464
3226
  this._validateCells(callback);
3465
3227
  };
3228
+
3466
3229
  /**
3467
3230
  * Validates rows using their validator functions and calls callback when finished.
3468
3231
  *
@@ -3482,15 +3245,13 @@ export default function Core(rootElement, userSettings) {
3482
3245
  * })
3483
3246
  * ```
3484
3247
  */
3485
-
3486
-
3487
3248
  this.validateRows = function (rows, callback) {
3488
3249
  if (!Array.isArray(rows)) {
3489
3250
  throw new Error('validateRows parameter `rows` must be an array');
3490
3251
  }
3491
-
3492
3252
  this._validateCells(callback, rows);
3493
3253
  };
3254
+
3494
3255
  /**
3495
3256
  * Validates columns using their validator functions and calls callback when finished.
3496
3257
  *
@@ -3510,15 +3271,13 @@ export default function Core(rootElement, userSettings) {
3510
3271
  * })
3511
3272
  * ```
3512
3273
  */
3513
-
3514
-
3515
3274
  this.validateColumns = function (columns, callback) {
3516
3275
  if (!Array.isArray(columns)) {
3517
3276
  throw new Error('validateColumns parameter `columns` must be an array');
3518
3277
  }
3519
-
3520
3278
  this._validateCells(callback, undefined, columns);
3521
3279
  };
3280
+
3522
3281
  /**
3523
3282
  * Validates all cells using their validator functions and calls callback when finished.
3524
3283
  *
@@ -3533,51 +3292,40 @@ export default function Core(rootElement, userSettings) {
3533
3292
  * @param {Array} [rows] An array of validation target visual row indexes.
3534
3293
  * @param {Array} [columns] An array of validation target visual column indexes.
3535
3294
  */
3536
-
3537
-
3538
3295
  this._validateCells = function (callback, rows, columns) {
3539
3296
  var waitingForValidator = new ValidatorsQueue();
3540
-
3541
3297
  if (callback) {
3542
3298
  waitingForValidator.onQueueEmpty = callback;
3543
3299
  }
3544
-
3545
3300
  var i = instance.countRows() - 1;
3546
-
3547
3301
  while (i >= 0) {
3548
3302
  if (rows !== undefined && rows.indexOf(i) === -1) {
3549
3303
  i -= 1;
3550
3304
  continue;
3551
3305
  }
3552
-
3553
3306
  var j = instance.countCols() - 1;
3554
-
3555
3307
  while (j >= 0) {
3556
3308
  if (columns !== undefined && columns.indexOf(j) === -1) {
3557
3309
  j -= 1;
3558
3310
  continue;
3559
3311
  }
3560
-
3561
3312
  waitingForValidator.addValidatorToQueue();
3562
3313
  instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), function (result) {
3563
3314
  if (typeof result !== 'boolean') {
3564
3315
  throw new Error('Validation error: result is not boolean');
3565
3316
  }
3566
-
3567
3317
  if (result === false) {
3568
3318
  waitingForValidator.valid = false;
3569
3319
  }
3570
-
3571
3320
  waitingForValidator.removeValidatorFormQueue();
3572
3321
  }, 'validateCells');
3573
3322
  j -= 1;
3574
3323
  }
3575
-
3576
3324
  i -= 1;
3577
3325
  }
3578
-
3579
3326
  waitingForValidator.checkIfQueueIsEmpty();
3580
3327
  };
3328
+
3581
3329
  /**
3582
3330
  * Returns an array of row headers' values (if they are enabled). If param `row` was given, it returns the header of the given row as a string.
3583
3331
  *
@@ -3587,16 +3335,12 @@ export default function Core(rootElement, userSettings) {
3587
3335
  * @fires Hooks#modifyRowHeader
3588
3336
  * @returns {Array|string|number} Array of header values / single header value.
3589
3337
  */
3590
-
3591
-
3592
3338
  this.getRowHeader = function (row) {
3593
3339
  var rowHeader = tableMeta.rowHeaders;
3594
3340
  var physicalRow = row;
3595
-
3596
3341
  if (physicalRow !== void 0) {
3597
3342
  physicalRow = instance.runHooks('modifyRowHeader', physicalRow);
3598
3343
  }
3599
-
3600
3344
  if (physicalRow === void 0) {
3601
3345
  rowHeader = [];
3602
3346
  rangeEach(instance.countRows() - 1, function (i) {
@@ -3609,9 +3353,9 @@ export default function Core(rootElement, userSettings) {
3609
3353
  } else if (rowHeader && typeof rowHeader !== 'string' && typeof rowHeader !== 'number') {
3610
3354
  rowHeader = physicalRow + 1;
3611
3355
  }
3612
-
3613
3356
  return rowHeader;
3614
3357
  };
3358
+
3615
3359
  /**
3616
3360
  * Returns information about if this table is configured to display row headers.
3617
3361
  *
@@ -3619,11 +3363,10 @@ export default function Core(rootElement, userSettings) {
3619
3363
  * @function hasRowHeaders
3620
3364
  * @returns {boolean} `true` if the instance has the row headers enabled, `false` otherwise.
3621
3365
  */
3622
-
3623
-
3624
3366
  this.hasRowHeaders = function () {
3625
3367
  return !!tableMeta.rowHeaders;
3626
3368
  };
3369
+
3627
3370
  /**
3628
3371
  * Returns information about if this table is configured to display column headers.
3629
3372
  *
@@ -3631,82 +3374,101 @@ export default function Core(rootElement, userSettings) {
3631
3374
  * @function hasColHeaders
3632
3375
  * @returns {boolean} `true` if the instance has the column headers enabled, `false` otherwise.
3633
3376
  */
3634
-
3635
-
3636
3377
  this.hasColHeaders = function () {
3637
3378
  if (tableMeta.colHeaders !== void 0 && tableMeta.colHeaders !== null) {
3638
3379
  // Polymer has empty value = null
3639
3380
  return !!tableMeta.colHeaders;
3640
3381
  }
3641
-
3642
3382
  for (var i = 0, ilen = instance.countCols(); i < ilen; i++) {
3643
3383
  if (instance.getColHeader(i)) {
3644
3384
  return true;
3645
3385
  }
3646
3386
  }
3647
-
3648
3387
  return false;
3649
3388
  };
3389
+
3650
3390
  /**
3651
- * Returns an array of column headers (in string format, if they are enabled). If param `column` is given, it
3652
- * returns the header at the given column.
3391
+ * Gets the values of column headers (if column headers are [enabled](@/api/options.md#colheaders)).
3392
+ *
3393
+ * To get an array with the values of all
3394
+ * [bottom-most](@/guides/cell-features/clipboard.md#copy-with-headers) column headers,
3395
+ * call `getColHeader()` with no arguments.
3396
+ *
3397
+ * To get the value of the bottom-most header of a specific column, use the `column` parameter.
3398
+ *
3399
+ * To get the value of a [specific-level](@/guides/columns/column-groups.md) header
3400
+ * of a specific column, use the `column` and `headerLevel` parameters.
3401
+ *
3402
+ * Read more:
3403
+ * - [Guides: Column groups](@/guides/columns/column-groups.md)
3404
+ * - [Options: `colHeaders`](@/api/options.md#colheaders)
3405
+ * - [Guides: Copy with headers](@/guides/cell-features/clipboard.md#copy-with-headers)
3406
+ *
3407
+ * ```js
3408
+ * // get the contents of all bottom-most column headers
3409
+ * hot.getColHeader();
3410
+ *
3411
+ * // get the contents of the bottom-most header of a specific column
3412
+ * hot.getColHeader(5);
3413
+ *
3414
+ * // get the contents of a specific column header at a specific level
3415
+ * hot.getColHeader(5, -2);
3416
+ * ```
3653
3417
  *
3654
3418
  * @memberof Core#
3655
3419
  * @function getColHeader
3656
- * @param {number} [column] Visual column index.
3420
+ * @param {number} [column] A visual column index.
3421
+ * @param {number} [headerLevel=-1] (Since 12.3.0) Header level index. Accepts positive (0 to n)
3422
+ * and negative (-1 to -n) values. For positive values, 0 points to the
3423
+ * topmost header. For negative values, -1 points to the bottom-most
3424
+ * header (the header closest to the cells).
3657
3425
  * @fires Hooks#modifyColHeader
3658
- * @returns {Array|string|number} The column header(s).
3426
+ * @fires Hooks#modifyColumnHeaderValue
3427
+ * @returns {Array|string|number} Column header values.
3659
3428
  */
3660
-
3661
-
3662
3429
  this.getColHeader = function (column) {
3430
+ var headerLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
3663
3431
  var columnIndex = instance.runHooks('modifyColHeader', column);
3664
- var result = tableMeta.colHeaders;
3665
-
3666
3432
  if (columnIndex === void 0) {
3667
3433
  var out = [];
3668
3434
  var ilen = instance.countCols();
3669
-
3670
- for (var i = 0; i < ilen; i++) {
3671
- out.push(instance.getColHeader(i));
3672
- }
3673
-
3674
- result = out;
3675
- } else {
3676
- var translateVisualIndexToColumns = function translateVisualIndexToColumns(visualColumnIndex) {
3677
- var arr = [];
3678
- var columnsLen = instance.countCols();
3679
- var index = 0;
3680
-
3681
- for (; index < columnsLen; index++) {
3682
- if (isFunction(tableMeta.columns) && tableMeta.columns(index)) {
3683
- arr.push(index);
3684
- }
3685
- }
3686
-
3687
- return arr[visualColumnIndex];
3688
- };
3689
-
3690
- var physicalColumn = instance.toPhysicalColumn(columnIndex);
3691
- var prop = translateVisualIndexToColumns(physicalColumn);
3692
-
3693
- if (tableMeta.colHeaders === false) {
3694
- result = null;
3695
- } else if (tableMeta.columns && isFunction(tableMeta.columns) && tableMeta.columns(prop) && tableMeta.columns(prop).title) {
3696
- result = tableMeta.columns(prop).title;
3697
- } else if (tableMeta.columns && tableMeta.columns[physicalColumn] && tableMeta.columns[physicalColumn].title) {
3698
- result = tableMeta.columns[physicalColumn].title;
3699
- } else if (Array.isArray(tableMeta.colHeaders) && tableMeta.colHeaders[physicalColumn] !== void 0) {
3700
- result = tableMeta.colHeaders[physicalColumn];
3701
- } else if (isFunction(tableMeta.colHeaders)) {
3702
- result = tableMeta.colHeaders(physicalColumn);
3703
- } else if (tableMeta.colHeaders && typeof tableMeta.colHeaders !== 'string' && typeof tableMeta.colHeaders !== 'number') {
3704
- result = spreadsheetColumnLabel(columnIndex); // see #1458
3435
+ for (var i = 0; i < ilen; i++) {
3436
+ out.push(instance.getColHeader(i));
3705
3437
  }
3438
+ return out;
3706
3439
  }
3707
-
3440
+ var result = tableMeta.colHeaders;
3441
+ var translateVisualIndexToColumns = function translateVisualIndexToColumns(visualColumnIndex) {
3442
+ var arr = [];
3443
+ var columnsLen = instance.countCols();
3444
+ var index = 0;
3445
+ for (; index < columnsLen; index++) {
3446
+ if (isFunction(tableMeta.columns) && tableMeta.columns(index)) {
3447
+ arr.push(index);
3448
+ }
3449
+ }
3450
+ return arr[visualColumnIndex];
3451
+ };
3452
+ var physicalColumn = instance.toPhysicalColumn(columnIndex);
3453
+ var prop = translateVisualIndexToColumns(physicalColumn);
3454
+ if (tableMeta.colHeaders === false) {
3455
+ result = null;
3456
+ } else if (tableMeta.columns && isFunction(tableMeta.columns) && tableMeta.columns(prop) && tableMeta.columns(prop).title) {
3457
+ result = tableMeta.columns(prop).title;
3458
+ } else if (tableMeta.columns && tableMeta.columns[physicalColumn] && tableMeta.columns[physicalColumn].title) {
3459
+ result = tableMeta.columns[physicalColumn].title;
3460
+ } else if (Array.isArray(tableMeta.colHeaders) && tableMeta.colHeaders[physicalColumn] !== void 0) {
3461
+ result = tableMeta.colHeaders[physicalColumn];
3462
+ } else if (isFunction(tableMeta.colHeaders)) {
3463
+ result = tableMeta.colHeaders(physicalColumn);
3464
+ } else if (tableMeta.colHeaders && typeof tableMeta.colHeaders !== 'string' && typeof tableMeta.colHeaders !== 'number') {
3465
+ result = spreadsheetColumnLabel(columnIndex); // see #1458
3466
+ }
3467
+
3468
+ result = instance.runHooks('modifyColumnHeaderValue', result, column, headerLevel);
3708
3469
  return result;
3709
3470
  };
3471
+
3710
3472
  /**
3711
3473
  * Return column width from settings (no guessing). Private use intended.
3712
3474
  *
@@ -3716,42 +3478,36 @@ export default function Core(rootElement, userSettings) {
3716
3478
  * @param {number} col Visual col index.
3717
3479
  * @returns {number}
3718
3480
  */
3719
-
3720
-
3721
3481
  this._getColWidthFromSettings = function (col) {
3722
- var width; // We currently don't support cell meta objects for headers (negative values)
3482
+ var width;
3723
3483
 
3484
+ // We currently don't support cell meta objects for headers (negative values)
3724
3485
  if (col >= 0) {
3725
3486
  var cellProperties = instance.getCellMeta(0, col);
3726
3487
  width = cellProperties.width;
3727
3488
  }
3728
-
3729
3489
  if (width === void 0 || width === tableMeta.width) {
3730
3490
  width = tableMeta.colWidths;
3731
3491
  }
3732
-
3733
3492
  if (width !== void 0 && width !== null) {
3734
3493
  switch (_typeof(width)) {
3735
3494
  case 'object':
3736
3495
  // array
3737
3496
  width = width[col];
3738
3497
  break;
3739
-
3740
3498
  case 'function':
3741
3499
  width = width(col);
3742
3500
  break;
3743
-
3744
3501
  default:
3745
3502
  break;
3746
3503
  }
3747
-
3748
3504
  if (typeof width === 'string') {
3749
3505
  width = parseInt(width, 10);
3750
3506
  }
3751
3507
  }
3752
-
3753
3508
  return width;
3754
3509
  };
3510
+
3755
3511
  /**
3756
3512
  * Returns the width of the requested column.
3757
3513
  *
@@ -3761,19 +3517,15 @@ export default function Core(rootElement, userSettings) {
3761
3517
  * @returns {number} Column width.
3762
3518
  * @fires Hooks#modifyColWidth
3763
3519
  */
3764
-
3765
-
3766
3520
  this.getColWidth = function (column) {
3767
3521
  var width = instance._getColWidthFromSettings(column);
3768
-
3769
3522
  width = instance.runHooks('modifyColWidth', width, column);
3770
-
3771
3523
  if (width === void 0) {
3772
3524
  width = ViewportColumnsCalculator.DEFAULT_WIDTH;
3773
3525
  }
3774
-
3775
3526
  return width;
3776
3527
  };
3528
+
3777
3529
  /**
3778
3530
  * Return row height from settings (no guessing). Private use intended.
3779
3531
  *
@@ -3783,8 +3535,6 @@ export default function Core(rootElement, userSettings) {
3783
3535
  * @param {number} row Visual row index.
3784
3536
  * @returns {number}
3785
3537
  */
3786
-
3787
-
3788
3538
  this._getRowHeightFromSettings = function (row) {
3789
3539
  // let cellProperties = instance.getCellMeta(row, 0);
3790
3540
  // let height = cellProperties.height;
@@ -3793,48 +3543,57 @@ export default function Core(rootElement, userSettings) {
3793
3543
  // height = cellProperties.rowHeights;
3794
3544
  // }
3795
3545
  var height = tableMeta.rowHeights;
3796
-
3797
3546
  if (height !== void 0 && height !== null) {
3798
3547
  switch (_typeof(height)) {
3799
3548
  case 'object':
3800
3549
  // array
3801
3550
  height = height[row];
3802
3551
  break;
3803
-
3804
3552
  case 'function':
3805
3553
  height = height(row);
3806
3554
  break;
3807
-
3808
3555
  default:
3809
3556
  break;
3810
3557
  }
3811
-
3812
3558
  if (typeof height === 'string') {
3813
3559
  height = parseInt(height, 10);
3814
3560
  }
3815
3561
  }
3816
-
3817
3562
  return height;
3818
3563
  };
3564
+
3819
3565
  /**
3820
- * Returns the row height.
3566
+ * Returns a row's height, as recognized by Handsontable.
3567
+ *
3568
+ * Depending on your configuration, the method returns (in order of priority):
3569
+ * 1. The row height set by the [`ManualRowResize`](@/api/manualRowResize.md) plugin
3570
+ * (if the plugin is enabled).
3571
+ * 2. The row height set by the [`rowHeights`](@/api/options.md#rowheights) configuration option
3572
+ * (if the option is set).
3573
+ * 3. The row height as measured in the DOM by the [`AutoRowSize`](@/api/autoRowSize.md) plugin
3574
+ * (if the plugin is enabled).
3575
+ * 4. `undefined`, if neither [`ManualRowResize`](@/api/manualRowResize.md),
3576
+ * nor [`rowHeights`](@/api/options.md#rowheights),
3577
+ * nor [`AutoRowSize`](@/api/autoRowSize.md) is used.
3821
3578
  *
3822
- * Mind that this method is different from the [AutoRowSize](@/api/autoRowSize.md) plugin's [`getRowHeight()`](@/api/autoRowSize.md#getrowheight) method.
3579
+ * The height returned includes 1 px of the row's bottom border.
3580
+ *
3581
+ * Mind that this method is different from the
3582
+ * [`getRowHeight()`](@/api/autoRowSize.md#getrowheight) method
3583
+ * of the [`AutoRowSize`](@/api/autoRowSize.md) plugin.
3823
3584
  *
3824
3585
  * @memberof Core#
3825
3586
  * @function getRowHeight
3826
- * @param {number} row Visual row index.
3827
- * @returns {number} The given row's height.
3587
+ * @param {number} row A visual row index.
3588
+ * @returns {number|undefined} The height of the specified row, in pixels.
3828
3589
  * @fires Hooks#modifyRowHeight
3829
3590
  */
3830
-
3831
-
3832
3591
  this.getRowHeight = function (row) {
3833
3592
  var height = instance._getRowHeightFromSettings(row);
3834
-
3835
3593
  height = instance.runHooks('modifyRowHeight', height, row);
3836
3594
  return height;
3837
3595
  };
3596
+
3838
3597
  /**
3839
3598
  * Returns the total number of rows in the data source.
3840
3599
  *
@@ -3842,11 +3601,10 @@ export default function Core(rootElement, userSettings) {
3842
3601
  * @function countSourceRows
3843
3602
  * @returns {number} Total number of rows.
3844
3603
  */
3845
-
3846
-
3847
3604
  this.countSourceRows = function () {
3848
3605
  return dataSource.countRows();
3849
3606
  };
3607
+
3850
3608
  /**
3851
3609
  * Returns the total number of columns in the data source.
3852
3610
  *
@@ -3854,11 +3612,10 @@ export default function Core(rootElement, userSettings) {
3854
3612
  * @function countSourceCols
3855
3613
  * @returns {number} Total number of columns.
3856
3614
  */
3857
-
3858
-
3859
3615
  this.countSourceCols = function () {
3860
3616
  return dataSource.countFirstRowKeys();
3861
3617
  };
3618
+
3862
3619
  /**
3863
3620
  * Returns the total number of visual rows in the table.
3864
3621
  *
@@ -3866,11 +3623,10 @@ export default function Core(rootElement, userSettings) {
3866
3623
  * @function countRows
3867
3624
  * @returns {number} Total number of rows.
3868
3625
  */
3869
-
3870
-
3871
3626
  this.countRows = function () {
3872
3627
  return datamap.getLength();
3873
3628
  };
3629
+
3874
3630
  /**
3875
3631
  * Returns the total number of visible columns in the table.
3876
3632
  *
@@ -3878,13 +3634,12 @@ export default function Core(rootElement, userSettings) {
3878
3634
  * @function countCols
3879
3635
  * @returns {number} Total number of columns.
3880
3636
  */
3881
-
3882
-
3883
3637
  this.countCols = function () {
3884
3638
  var maxCols = tableMeta.maxCols;
3885
3639
  var dataLen = this.columnIndexMapper.getNotTrimmedIndexesLength();
3886
3640
  return Math.min(maxCols, dataLen);
3887
3641
  };
3642
+
3888
3643
  /**
3889
3644
  * Returns the number of rendered rows including rows that are partially or fully rendered
3890
3645
  * outside the table viewport.
@@ -3893,11 +3648,10 @@ export default function Core(rootElement, userSettings) {
3893
3648
  * @function countRenderedRows
3894
3649
  * @returns {number} Returns -1 if table is not visible.
3895
3650
  */
3896
-
3897
-
3898
3651
  this.countRenderedRows = function () {
3899
3652
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getRenderedRowsCount() : -1;
3900
3653
  };
3654
+
3901
3655
  /**
3902
3656
  * Returns the number of rendered rows that are only visible in the table viewport.
3903
3657
  * The rows that are partially visible are not counted.
@@ -3906,11 +3660,10 @@ export default function Core(rootElement, userSettings) {
3906
3660
  * @function countVisibleRows
3907
3661
  * @returns {number} Number of visible rows or -1.
3908
3662
  */
3909
-
3910
-
3911
3663
  this.countVisibleRows = function () {
3912
3664
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getVisibleRowsCount() : -1;
3913
3665
  };
3666
+
3914
3667
  /**
3915
3668
  * Returns the number of rendered rows including columns that are partially or fully rendered
3916
3669
  * outside the table viewport.
@@ -3919,11 +3672,10 @@ export default function Core(rootElement, userSettings) {
3919
3672
  * @function countRenderedCols
3920
3673
  * @returns {number} Returns -1 if table is not visible.
3921
3674
  */
3922
-
3923
-
3924
3675
  this.countRenderedCols = function () {
3925
3676
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getRenderedColumnsCount() : -1;
3926
3677
  };
3678
+
3927
3679
  /**
3928
3680
  * Returns the number of rendered columns that are only visible in the table viewport.
3929
3681
  * The columns that are partially visible are not counted.
@@ -3932,11 +3684,10 @@ export default function Core(rootElement, userSettings) {
3932
3684
  * @function countVisibleCols
3933
3685
  * @returns {number} Number of visible columns or -1.
3934
3686
  */
3935
-
3936
-
3937
3687
  this.countVisibleCols = function () {
3938
3688
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getVisibleColumnsCount() : -1;
3939
3689
  };
3690
+
3940
3691
  /**
3941
3692
  * Returns the number of empty rows. If the optional ending parameter is `true`, returns the
3942
3693
  * number of empty rows at the bottom of the table.
@@ -3946,8 +3697,6 @@ export default function Core(rootElement, userSettings) {
3946
3697
  * @param {boolean} [ending=false] If `true`, will only count empty rows at the end of the data source.
3947
3698
  * @returns {number} Count empty rows.
3948
3699
  */
3949
-
3950
-
3951
3700
  this.countEmptyRows = function () {
3952
3701
  var ending = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
3953
3702
  var emptyRows = 0;
@@ -3960,6 +3709,7 @@ export default function Core(rootElement, userSettings) {
3960
3709
  });
3961
3710
  return emptyRows;
3962
3711
  };
3712
+
3963
3713
  /**
3964
3714
  * Returns the number of empty columns. If the optional ending parameter is `true`, returns the number of empty
3965
3715
  * columns at right hand edge of the table.
@@ -3969,15 +3719,8 @@ export default function Core(rootElement, userSettings) {
3969
3719
  * @param {boolean} [ending=false] If `true`, will only count empty columns at the end of the data source row.
3970
3720
  * @returns {number} Count empty cols.
3971
3721
  */
3972
-
3973
-
3974
3722
  this.countEmptyCols = function () {
3975
3723
  var ending = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
3976
-
3977
- if (instance.countRows() < 1) {
3978
- return 0;
3979
- }
3980
-
3981
3724
  var emptyColumns = 0;
3982
3725
  rangeEachReverse(instance.countCols() - 1, function (visualIndex) {
3983
3726
  if (instance.isEmptyCol(visualIndex)) {
@@ -3988,6 +3731,7 @@ export default function Core(rootElement, userSettings) {
3988
3731
  });
3989
3732
  return emptyColumns;
3990
3733
  };
3734
+
3991
3735
  /**
3992
3736
  * Check if all cells in the row declared by the `row` argument are empty.
3993
3737
  *
@@ -3996,11 +3740,10 @@ export default function Core(rootElement, userSettings) {
3996
3740
  * @param {number} row Visual row index.
3997
3741
  * @returns {boolean} `true` if the row at the given `row` is empty, `false` otherwise.
3998
3742
  */
3999
-
4000
-
4001
3743
  this.isEmptyRow = function (row) {
4002
3744
  return tableMeta.isEmptyRow.call(instance, row);
4003
3745
  };
3746
+
4004
3747
  /**
4005
3748
  * Check if all cells in the the column declared by the `column` argument are empty.
4006
3749
  *
@@ -4009,73 +3752,106 @@ export default function Core(rootElement, userSettings) {
4009
3752
  * @param {number} column Column index.
4010
3753
  * @returns {boolean} `true` if the column at the given `col` is empty, `false` otherwise.
4011
3754
  */
4012
-
4013
-
4014
3755
  this.isEmptyCol = function (column) {
4015
3756
  return tableMeta.isEmptyCol.call(instance, column);
4016
3757
  };
3758
+
4017
3759
  /**
4018
- * Select cell specified by `row` and `column` values or a range of cells finishing at `endRow`, `endCol`. If the table
4019
- * was configured to support data column properties that properties can be used to making a selection.
3760
+ * Select a single cell, or a single range of adjacent cells.
3761
+ *
3762
+ * To select a cell, pass its visual row and column indexes, for example: `selectCell(2, 4)`.
3763
+ *
3764
+ * To select a range, pass the visual indexes of the first and last cell in the range, for example: `selectCell(2, 4, 3, 5)`.
3765
+ *
3766
+ * If your columns have properties, you can pass those properties' values instead of column indexes, for example: `selectCell(2, 'first_name')`.
4020
3767
  *
4021
- * By default, viewport will be scrolled to the selection. After the `selectCell` method had finished, the instance
4022
- * will be listening to keyboard input on the document.
3768
+ * By default, `selectCell()` also:
3769
+ * - Scrolls the viewport to the newly-selected cells.
3770
+ * - Switches the keyboard focus to Handsontable (by calling Handsontable's [`listen()`](#listen) method).
4023
3771
  *
4024
3772
  * @example
4025
3773
  * ```js
4026
3774
  * // select a single cell
4027
3775
  * hot.selectCell(2, 4);
4028
- * // select a single cell using column property
4029
- * hot.selectCell(2, 'address');
3776
+ *
4030
3777
  * // select a range of cells
4031
3778
  * hot.selectCell(2, 4, 3, 5);
4032
- * // select a range of cells using column properties
4033
- * hot.selectCell(2, 'address', 3, 'phone_number');
4034
- * // select a range of cells without scrolling to them
4035
- * hot.selectCell(2, 'address', 3, 'phone_number', false);
3779
+ *
3780
+ * // select a single cell, using a column property
3781
+ * hot.selectCell(2, 'first_name');
3782
+ *
3783
+ * // select a range of cells, using column properties
3784
+ * hot.selectCell(2, 'first_name', 3, 'last_name');
3785
+ *
3786
+ * // select a range of cells, without scrolling to them
3787
+ * hot.selectCell(2, 4, 3, 5, false);
3788
+ *
3789
+ * // select a range of cells, without switching the keyboard focus to Handsontable
3790
+ * hot.selectCell(2, 4, 3, 5, null, false);
4036
3791
  * ```
4037
3792
  *
4038
3793
  * @memberof Core#
4039
3794
  * @function selectCell
4040
- * @param {number} row Visual row index.
4041
- * @param {number|string} column Visual column index or column property.
4042
- * @param {number} [endRow] Visual end row index (if selecting a range).
4043
- * @param {number|string} [endColumn] Visual end column index or column property (if selecting a range).
4044
- * @param {boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.
4045
- * @param {boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.
4046
- * @returns {boolean} `true` if selection was successful, `false` otherwise.
3795
+ * @param {number} row A visual row index.
3796
+ * @param {number|string} column A visual column index (`number`), or a column property's value (`string`).
3797
+ * @param {number} [endRow] If selecting a range: the visual row index of the last cell in the range.
3798
+ * @param {number|string} [endColumn] If selecting a range: the visual column index (or a column property's value) of the last cell in the range.
3799
+ * @param {boolean} [scrollToCell=true] `true`: scroll the viewport to the newly-selected cells. `false`: keep the previous viewport.
3800
+ * @param {boolean} [changeListener=true] `true`: switch the keyboard focus to Handsontable. `false`: keep the previous keyboard focus.
3801
+ * @returns {boolean} `true`: the selection was successful, `false`: the selection failed.
4047
3802
  */
4048
-
4049
-
4050
3803
  this.selectCell = function (row, column, endRow, endColumn) {
4051
3804
  var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
4052
3805
  var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
4053
-
4054
3806
  if (isUndefined(row) || isUndefined(column)) {
4055
3807
  return false;
4056
3808
  }
4057
-
4058
3809
  return this.selectCells([[row, column, endRow, endColumn]], scrollToCell, changeListener);
4059
3810
  };
3811
+
4060
3812
  /**
4061
- * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells
4062
- * finishing at `endRow`, `endColumn`. The method supports two input formats which are the same as that
4063
- * produces by `getSelected` and `getSelectedRange` methods.
3813
+ * Select multiple cells or ranges of cells, adjacent or non-adjacent.
3814
+ *
3815
+ * You can pass one of the below:
3816
+ * - An array of arrays (which matches the output of Handsontable's [`getSelected()`](#getselected) method).
3817
+ * - An array of [`CellRange`](@/api/cellRange.md) objects (which matches the output of Handsontable's [`getSelectedRange()`](#getselectedrange) method).
3818
+ *
3819
+ * To select multiple cells, pass the visual row and column indexes of each cell, for example: `hot.selectCells([[1, 1], [5, 5]])`.
3820
+ *
3821
+ * To select multiple ranges, pass the visual indexes of the first and last cell in each range, for example: `hot.selectCells([[1, 1, 2, 2], [6, 2, 0, 2]])`.
3822
+ *
3823
+ * If your columns have properties, you can pass those properties' values instead of column indexes, for example: `hot.selectCells([[1, 'first_name'], [5, 'last_name']])`.
4064
3824
  *
4065
- * By default, viewport will be scrolled to selection. After the `selectCells` method had finished, the instance
4066
- * will be listening to keyboard input on the document.
3825
+ * By default, `selectCell()` also:
3826
+ * - Scrolls the viewport to the newly-selected cells.
3827
+ * - Switches the keyboard focus to Handsontable (by calling Handsontable's [`listen()`](#listen) method).
4067
3828
  *
4068
3829
  * @example
4069
3830
  * ```js
4070
- * // Using an array of arrays.
3831
+ * // select non-adjacent cells
3832
+ * hot.selectCells([[1, 1], [5, 5], [10, 10]]);
3833
+ *
3834
+ * // select non-adjacent ranges of cells
3835
+ * hot.selectCells([[1, 1, 2, 2], [10, 10, 20, 20]]);
3836
+ *
3837
+ * // select cells and ranges of cells
4071
3838
  * hot.selectCells([[1, 1, 2, 2], [3, 3], [6, 2, 0, 2]]);
4072
- * // Using an array of arrays with defined columns as props.
3839
+ *
3840
+ * // select cells, using column properties
4073
3841
  * hot.selectCells([[1, 'id', 2, 'first_name'], [3, 'full_name'], [6, 'last_name', 0, 'first_name']]);
4074
- * // Using an array of CellRange objects (produced by `.getSelectedRange()` method).
3842
+ *
3843
+ * // select multiple ranges, using an array of `CellRange` objects
4075
3844
  * const selected = hot.getSelectedRange();
4076
3845
  *
4077
3846
  * selected[0].from.row = 0;
4078
3847
  * selected[0].from.col = 0;
3848
+ * selected[0].to.row = 5;
3849
+ * selected[0].to.col = 5;
3850
+ *
3851
+ * selected[1].from.row = 10;
3852
+ * selected[1].from.col = 10;
3853
+ * selected[1].to.row = 20;
3854
+ * selected[1].to.col = 20;
4079
3855
  *
4080
3856
  * hot.selectCells(selected);
4081
3857
  * ```
@@ -4083,33 +3859,28 @@ export default function Core(rootElement, userSettings) {
4083
3859
  * @memberof Core#
4084
3860
  * @since 0.38.0
4085
3861
  * @function selectCells
4086
- * @param {Array[]|CellRange[]} coords Visual coords passed as an array of array (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`)
4087
- * the same format as `getSelected` method returns or as an CellRange objects
4088
- * which is the same format what `getSelectedRange` method returns.
4089
- * @param {boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.
4090
- * @param {boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.
4091
- * @returns {boolean} `true` if selection was successful, `false` otherwise.
3862
+ * @param {Array[]|CellRange[]} coords Visual coordinates,
3863
+ * passed either as an array of arrays (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`)
3864
+ * or as an array of [`CellRange`](@/api/cellRange.md) objects.
3865
+ * @param {boolean} [scrollToCell=true] `true`: scroll the viewport to the newly-selected cells. `false`: keep the previous viewport.
3866
+ * @param {boolean} [changeListener=true] `true`: switch the keyboard focus to Handsontable. `false`: keep the previous keyboard focus.
3867
+ * @returns {boolean} `true`: the selection was successful, `false`: the selection failed.
4092
3868
  */
4093
-
4094
-
4095
3869
  this.selectCells = function () {
4096
3870
  var coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [[]];
4097
3871
  var scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
4098
3872
  var changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
4099
-
4100
3873
  if (scrollToCell === false) {
4101
3874
  preventScrollingToCell = true;
4102
3875
  }
4103
-
4104
3876
  var wasSelected = selection.selectCells(coords);
4105
-
4106
3877
  if (wasSelected && changeListener) {
4107
3878
  instance.listen();
4108
3879
  }
4109
-
4110
3880
  preventScrollingToCell = false;
4111
3881
  return wasSelected;
4112
3882
  };
3883
+
4113
3884
  /**
4114
3885
  * Select column specified by `startColumn` visual index, column property or a range of columns finishing at `endColumn`.
4115
3886
  *
@@ -4133,12 +3904,11 @@ export default function Core(rootElement, userSettings) {
4133
3904
  * is not defined the column defined by `startColumn` will be selected.
4134
3905
  * @returns {boolean} `true` if selection was successful, `false` otherwise.
4135
3906
  */
4136
-
4137
-
4138
3907
  this.selectColumns = function (startColumn) {
4139
3908
  var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;
4140
3909
  return selection.selectColumns(startColumn, endColumn);
4141
3910
  };
3911
+
4142
3912
  /**
4143
3913
  * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.
4144
3914
  *
@@ -4158,34 +3928,40 @@ export default function Core(rootElement, userSettings) {
4158
3928
  * is not defined the row defined by `startRow` will be selected.
4159
3929
  * @returns {boolean} `true` if selection was successful, `false` otherwise.
4160
3930
  */
4161
-
4162
-
4163
3931
  this.selectRows = function (startRow) {
4164
3932
  var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;
4165
3933
  return selection.selectRows(startRow, endRow);
4166
3934
  };
3935
+
4167
3936
  /**
4168
3937
  * Deselects the current cell selection on the table.
4169
3938
  *
4170
3939
  * @memberof Core#
4171
3940
  * @function deselectCell
4172
3941
  */
4173
-
4174
-
4175
3942
  this.deselectCell = function () {
4176
3943
  selection.deselect();
4177
3944
  };
3945
+
4178
3946
  /**
4179
- * Select the whole table. The previous selection will be overwritten.
3947
+ * Select the whole table.
3948
+ *
3949
+ * The previous selection is overwritten.
3950
+ *
3951
+ * ```js
3952
+ * // select all cells in the table, including all headers
3953
+ * hot.selectAll();
3954
+ *
3955
+ * // select all cells in the table, without headers
3956
+ * hot.selectAll(false);
3957
+ * ```
4180
3958
  *
4181
3959
  * @since 0.38.2
4182
3960
  * @memberof Core#
4183
3961
  * @function selectAll
4184
- * @param {boolean} [includeHeaders=true] `true` If the selection should include the row, column and corner headers,
4185
- * `false` otherwise.
3962
+ * @param {boolean} [includeHeaders=true] `true`: include all row, column and corner headers.
3963
+ * `false`: don't include any headers.
4186
3964
  */
4187
-
4188
-
4189
3965
  this.selectAll = function () {
4190
3966
  var includeHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
4191
3967
  var includeRowHeaders = includeHeaders && this.hasRowHeaders();
@@ -4194,11 +3970,11 @@ export default function Core(rootElement, userSettings) {
4194
3970
  selection.selectAll(includeRowHeaders, includeColumnHeaders);
4195
3971
  preventScrollingToCell = false;
4196
3972
  };
4197
-
4198
3973
  var getIndexToScroll = function getIndexToScroll(indexMapper, visualIndex) {
4199
3974
  // Looking for a visual index on the right and then (when not found) on the left.
4200
3975
  return indexMapper.getNearestNotHiddenIndex(visualIndex, 1, true);
4201
3976
  };
3977
+
4202
3978
  /**
4203
3979
  * Scroll viewport to coordinates specified by the `row` and `column` arguments.
4204
3980
  *
@@ -4216,8 +3992,6 @@ export default function Core(rootElement, userSettings) {
4216
3992
  * may be rendered when they are in the viewport (we don't consider hidden indexes as they aren't rendered).
4217
3993
  * @returns {boolean} `true` if scroll was successful, `false` otherwise.
4218
3994
  */
4219
-
4220
-
4221
3995
  this.scrollViewportTo = function (row, column) {
4222
3996
  var snapToBottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
4223
3997
  var snapToRight = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
@@ -4226,40 +4000,31 @@ export default function Core(rootElement, userSettings) {
4226
4000
  var snapToLeft = !snapToRight;
4227
4001
  var renderableRow = row;
4228
4002
  var renderableColumn = column;
4229
-
4230
4003
  if (considerHiddenIndexes) {
4231
4004
  var _isRowInteger = Number.isInteger(row);
4232
-
4233
4005
  var _isColumnInteger = Number.isInteger(column);
4234
-
4235
4006
  var visualRowToScroll = _isRowInteger ? getIndexToScroll(this.rowIndexMapper, row) : void 0;
4236
4007
  var visualColumnToScroll = _isColumnInteger ? getIndexToScroll(this.columnIndexMapper, column) : void 0;
4237
-
4238
4008
  if (visualRowToScroll === null || visualColumnToScroll === null) {
4239
4009
  return false;
4240
4010
  }
4241
-
4242
4011
  renderableRow = _isRowInteger ? instance.rowIndexMapper.getRenderableFromVisualIndex(visualRowToScroll) : void 0;
4243
4012
  renderableColumn = _isColumnInteger ? instance.columnIndexMapper.getRenderableFromVisualIndex(visualColumnToScroll) : void 0;
4244
4013
  }
4245
-
4246
4014
  var isRowInteger = Number.isInteger(renderableRow);
4247
4015
  var isColumnInteger = Number.isInteger(renderableColumn);
4248
-
4249
4016
  if (isRowInteger && isColumnInteger) {
4250
4017
  return instance.view.scrollViewport(instance._createCellCoords(renderableRow, renderableColumn), snapToTop, snapToRight, snapToBottom, snapToLeft);
4251
4018
  }
4252
-
4253
4019
  if (isRowInteger && isColumnInteger === false) {
4254
4020
  return instance.view.scrollViewportVertically(renderableRow, snapToTop, snapToBottom);
4255
4021
  }
4256
-
4257
4022
  if (isColumnInteger && isRowInteger === false) {
4258
4023
  return instance.view.scrollViewportHorizontally(renderableColumn, snapToRight, snapToLeft);
4259
4024
  }
4260
-
4261
4025
  return false;
4262
4026
  };
4027
+
4263
4028
  /**
4264
4029
  * Removes the table from the DOM and destroys the instance of the Handsontable.
4265
4030
  *
@@ -4267,50 +4032,39 @@ export default function Core(rootElement, userSettings) {
4267
4032
  * @function destroy
4268
4033
  * @fires Hooks#afterDestroy
4269
4034
  */
4270
-
4271
-
4272
4035
  this.destroy = function () {
4273
4036
  instance._clearTimeouts();
4274
-
4275
4037
  instance._clearImmediates();
4276
-
4277
4038
  if (instance.view) {
4278
4039
  // in case HT is destroyed before initialization has finished
4279
4040
  instance.view.destroy();
4280
4041
  }
4281
-
4282
4042
  if (dataSource) {
4283
4043
  dataSource.destroy();
4284
4044
  }
4285
-
4286
4045
  dataSource = null;
4287
4046
  this.getShortcutManager().destroy();
4288
4047
  metaManager.clearCache();
4289
-
4290
4048
  if (isRootInstance(instance)) {
4291
4049
  var licenseInfo = this.rootDocument.querySelector('#hot-display-license-info');
4292
-
4293
4050
  if (licenseInfo) {
4294
4051
  licenseInfo.parentNode.removeChild(licenseInfo);
4295
4052
  }
4296
4053
  }
4297
-
4298
4054
  empty(instance.rootElement);
4299
4055
  eventManager.destroy();
4300
-
4301
4056
  if (editorManager) {
4302
4057
  editorManager.destroy();
4303
- } // The plugin's `destroy` method is called as a consequence and it should handle
4304
- // unregistration of plugin's maps. Some unregistered maps reset the cache.
4305
-
4058
+ }
4306
4059
 
4060
+ // The plugin's `destroy` method is called as a consequence and it should handle
4061
+ // unregistration of plugin's maps. Some unregistered maps reset the cache.
4307
4062
  instance.batchExecution(function () {
4308
4063
  instance.rowIndexMapper.unregisterAll();
4309
4064
  instance.columnIndexMapper.unregisterAll();
4310
4065
  pluginsRegistry.getItems().forEach(function (_ref20) {
4311
4066
  var _ref21 = _slicedToArray(_ref20, 2),
4312
- plugin = _ref21[1];
4313
-
4067
+ plugin = _ref21[1];
4314
4068
  plugin.destroy();
4315
4069
  });
4316
4070
  pluginsRegistry.clear();
@@ -4327,13 +4081,13 @@ export default function Core(rootElement, userSettings) {
4327
4081
  obj[key] = null;
4328
4082
  }
4329
4083
  });
4330
- instance.isDestroyed = true; // replace private properties with null (restores memory)
4331
- // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests
4084
+ instance.isDestroyed = true;
4332
4085
 
4086
+ // replace private properties with null (restores memory)
4087
+ // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests
4333
4088
  if (datamap) {
4334
4089
  datamap.destroy();
4335
4090
  }
4336
-
4337
4091
  instance.rowIndexMapper = null;
4338
4092
  instance.columnIndexMapper = null;
4339
4093
  datamap = null;
@@ -4342,6 +4096,7 @@ export default function Core(rootElement, userSettings) {
4342
4096
  editorManager = null;
4343
4097
  instance = null;
4344
4098
  };
4099
+
4345
4100
  /**
4346
4101
  * Replacement for all methods after the Handsontable was destroyed.
4347
4102
  *
@@ -4349,13 +4104,12 @@ export default function Core(rootElement, userSettings) {
4349
4104
  * @param {string} method The method name.
4350
4105
  * @returns {Function}
4351
4106
  */
4352
-
4353
-
4354
4107
  function postMortem(method) {
4355
4108
  return function () {
4356
4109
  throw new Error("The \"".concat(method, "\" method cannot be called because this Handsontable instance has been destroyed"));
4357
4110
  };
4358
4111
  }
4112
+
4359
4113
  /**
4360
4114
  * Returns the active editor class instance.
4361
4115
  *
@@ -4363,11 +4117,10 @@ export default function Core(rootElement, userSettings) {
4363
4117
  * @function getActiveEditor
4364
4118
  * @returns {BaseEditor} The active editor instance.
4365
4119
  */
4366
-
4367
-
4368
4120
  this.getActiveEditor = function () {
4369
4121
  return editorManager.getActiveEditor();
4370
4122
  };
4123
+
4371
4124
  /**
4372
4125
  * Returns plugin instance by provided its name.
4373
4126
  *
@@ -4376,17 +4129,16 @@ export default function Core(rootElement, userSettings) {
4376
4129
  * @param {string} pluginName The plugin name.
4377
4130
  * @returns {BasePlugin|undefined} The plugin instance or undefined if there is no plugin.
4378
4131
  */
4379
-
4380
-
4381
4132
  this.getPlugin = function (pluginName) {
4382
- var unifiedPluginName = toUpperCaseFirst(pluginName); // Workaround for the UndoRedo plugin which, currently doesn't follow the plugin architecture.
4133
+ var unifiedPluginName = toUpperCaseFirst(pluginName);
4383
4134
 
4135
+ // Workaround for the UndoRedo plugin which, currently doesn't follow the plugin architecture.
4384
4136
  if (unifiedPluginName === 'UndoRedo') {
4385
4137
  return this.undoRedo;
4386
4138
  }
4387
-
4388
4139
  return pluginsRegistry.getItem(unifiedPluginName);
4389
4140
  };
4141
+
4390
4142
  /**
4391
4143
  * Returns name of the passed plugin.
4392
4144
  *
@@ -4395,16 +4147,14 @@ export default function Core(rootElement, userSettings) {
4395
4147
  * @param {BasePlugin} plugin The plugin instance.
4396
4148
  * @returns {string}
4397
4149
  */
4398
-
4399
-
4400
4150
  this.getPluginName = function (plugin) {
4401
4151
  // Workaround for the UndoRedo plugin which, currently doesn't follow the plugin architecture.
4402
4152
  if (plugin === this.undoRedo) {
4403
4153
  return this.undoRedo.constructor.PLUGIN_KEY;
4404
4154
  }
4405
-
4406
4155
  return pluginsRegistry.getId(plugin);
4407
4156
  };
4157
+
4408
4158
  /**
4409
4159
  * Returns the Handsontable instance.
4410
4160
  *
@@ -4412,11 +4162,10 @@ export default function Core(rootElement, userSettings) {
4412
4162
  * @function getInstance
4413
4163
  * @returns {Handsontable} The Handsontable instance.
4414
4164
  */
4415
-
4416
-
4417
4165
  this.getInstance = function () {
4418
4166
  return instance;
4419
4167
  };
4168
+
4420
4169
  /**
4421
4170
  * Adds listener to the specified hook name (only for this Handsontable instance).
4422
4171
  *
@@ -4430,11 +4179,10 @@ export default function Core(rootElement, userSettings) {
4430
4179
  * hot.addHook('beforeInit', myCallback);
4431
4180
  * ```
4432
4181
  */
4433
-
4434
-
4435
4182
  this.addHook = function (key, callback) {
4436
4183
  Hooks.getSingleton().add(key, callback, instance);
4437
4184
  };
4185
+
4438
4186
  /**
4439
4187
  * Check if for a specified hook name there are added listeners (only for this Handsontable instance). All available
4440
4188
  * hooks you will find {@link Hooks}.
@@ -4450,11 +4198,10 @@ export default function Core(rootElement, userSettings) {
4450
4198
  * const hasBeforeInitListeners = hot.hasHook('beforeInit');
4451
4199
  * ```
4452
4200
  */
4453
-
4454
-
4455
4201
  this.hasHook = function (key) {
4456
4202
  return Hooks.getSingleton().has(key, instance) || Hooks.getSingleton().has(key);
4457
4203
  };
4204
+
4458
4205
  /**
4459
4206
  * Adds listener to specified hook name (only for this Handsontable instance). After the listener is triggered,
4460
4207
  * it will be automatically removed.
@@ -4469,11 +4216,10 @@ export default function Core(rootElement, userSettings) {
4469
4216
  * hot.addHookOnce('beforeInit', myCallback);
4470
4217
  * ```
4471
4218
  */
4472
-
4473
-
4474
4219
  this.addHookOnce = function (key, callback) {
4475
4220
  Hooks.getSingleton().once(key, callback, instance);
4476
4221
  };
4222
+
4477
4223
  /**
4478
4224
  * Removes the hook listener previously registered with {@link Core#addHook}.
4479
4225
  *
@@ -4488,11 +4234,10 @@ export default function Core(rootElement, userSettings) {
4488
4234
  * hot.removeHook('beforeInit', myCallback);
4489
4235
  * ```
4490
4236
  */
4491
-
4492
-
4493
4237
  this.removeHook = function (key, callback) {
4494
4238
  Hooks.getSingleton().remove(key, callback, instance);
4495
4239
  };
4240
+
4496
4241
  /**
4497
4242
  * Run the callbacks for the hook provided in the `key` argument using the parameters given in the other arguments.
4498
4243
  *
@@ -4516,11 +4261,10 @@ export default function Core(rootElement, userSettings) {
4516
4261
  * hot.runHooks('customAction', 10, 'foo');
4517
4262
  * ```
4518
4263
  */
4519
-
4520
-
4521
4264
  this.runHooks = function (key, p1, p2, p3, p4, p5, p6) {
4522
4265
  return Hooks.getSingleton().run(instance, key, p1, p2, p3, p4, p5, p6);
4523
4266
  };
4267
+
4524
4268
  /**
4525
4269
  * Get language phrase for specified dictionary key.
4526
4270
  *
@@ -4531,11 +4275,10 @@ export default function Core(rootElement, userSettings) {
4531
4275
  * @param {*} extraArguments Arguments which will be handled by formatters.
4532
4276
  * @returns {string}
4533
4277
  */
4534
-
4535
-
4536
4278
  this.getTranslatedPhrase = function (dictionaryKey, extraArguments) {
4537
4279
  return getTranslatedPhrase(tableMeta.language, dictionaryKey, extraArguments);
4538
4280
  };
4281
+
4539
4282
  /**
4540
4283
  * Converts instance into outerHTML of HTMLTableElement.
4541
4284
  *
@@ -4544,11 +4287,10 @@ export default function Core(rootElement, userSettings) {
4544
4287
  * @since 7.1.0
4545
4288
  * @returns {string}
4546
4289
  */
4547
-
4548
-
4549
4290
  this.toHTML = function () {
4550
4291
  return instanceToHTML(_this);
4551
4292
  };
4293
+
4552
4294
  /**
4553
4295
  * Converts instance into HTMLTableElement.
4554
4296
  *
@@ -4557,16 +4299,13 @@ export default function Core(rootElement, userSettings) {
4557
4299
  * @since 7.1.0
4558
4300
  * @returns {HTMLTableElement}
4559
4301
  */
4560
-
4561
-
4562
4302
  this.toTableElement = function () {
4563
4303
  var tempElement = _this.rootDocument.createElement('div');
4564
-
4565
4304
  tempElement.insertAdjacentHTML('afterbegin', instanceToHTML(_this));
4566
4305
  return tempElement.firstElementChild;
4567
4306
  };
4568
-
4569
4307
  this.timeouts = [];
4308
+
4570
4309
  /**
4571
4310
  * Sets timeout. Purpose of this method is to clear all known timeouts when `destroy` method is called.
4572
4311
  *
@@ -4575,53 +4314,48 @@ export default function Core(rootElement, userSettings) {
4575
4314
  * @param {number} [delay=0] If first argument is passed as a function this argument set delay of the execution of that function.
4576
4315
  * @private
4577
4316
  */
4578
-
4579
4317
  this._registerTimeout = function (handle) {
4580
4318
  var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
4581
4319
  var handleFunc = handle;
4582
-
4583
4320
  if (typeof handleFunc === 'function') {
4584
4321
  handleFunc = setTimeout(handleFunc, delay);
4585
4322
  }
4586
-
4587
4323
  this.timeouts.push(handleFunc);
4588
4324
  };
4325
+
4589
4326
  /**
4590
4327
  * Clears all known timeouts.
4591
4328
  *
4592
4329
  * @private
4593
4330
  */
4594
-
4595
-
4596
4331
  this._clearTimeouts = function () {
4597
4332
  arrayEach(this.timeouts, function (handler) {
4598
4333
  clearTimeout(handler);
4599
4334
  });
4600
4335
  };
4601
-
4602
4336
  this.immediates = [];
4337
+
4603
4338
  /**
4604
4339
  * Execute function execution to the next event loop cycle. Purpose of this method is to clear all known timeouts when `destroy` method is called.
4605
4340
  *
4606
4341
  * @param {Function} callback Function to be delayed in execution.
4607
4342
  * @private
4608
4343
  */
4609
-
4610
4344
  this._registerImmediate = function (callback) {
4611
4345
  this.immediates.push(setImmediate(callback));
4612
4346
  };
4347
+
4613
4348
  /**
4614
4349
  * Clears all known timeouts.
4615
4350
  *
4616
4351
  * @private
4617
4352
  */
4618
-
4619
-
4620
4353
  this._clearImmediates = function () {
4621
4354
  arrayEach(this.immediates, function (handler) {
4622
4355
  clearImmediate(handler);
4623
4356
  });
4624
4357
  };
4358
+
4625
4359
  /**
4626
4360
  * Refresh selection borders. This is temporary method relic after selection rewrite.
4627
4361
  *
@@ -4629,18 +4363,16 @@ export default function Core(rootElement, userSettings) {
4629
4363
  * @param {boolean} [revertOriginal=false] If `true`, the previous value will be restored. Otherwise, the edited value will be saved.
4630
4364
  * @param {boolean} [prepareEditorIfNeeded=true] If `true` the editor under the selected cell will be prepared to open.
4631
4365
  */
4632
-
4633
-
4634
4366
  this._refreshBorders = function () {
4635
4367
  var revertOriginal = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4636
4368
  var prepareEditorIfNeeded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
4637
4369
  editorManager.destroyEditor(revertOriginal);
4638
4370
  instance.view.render();
4639
-
4640
4371
  if (prepareEditorIfNeeded && selection.isSelected()) {
4641
4372
  editorManager.prepareEditor();
4642
4373
  }
4643
4374
  };
4375
+
4644
4376
  /**
4645
4377
  * Check if currently it is RTL direction.
4646
4378
  *
@@ -4649,11 +4381,10 @@ export default function Core(rootElement, userSettings) {
4649
4381
  * @function isRtl
4650
4382
  * @returns {boolean} True if RTL.
4651
4383
  */
4652
-
4653
-
4654
4384
  this.isRtl = function () {
4655
4385
  return instance.rootWindow.getComputedStyle(instance.rootElement).direction === 'rtl';
4656
4386
  };
4387
+
4657
4388
  /**
4658
4389
  * Check if currently it is LTR direction.
4659
4390
  *
@@ -4662,11 +4393,10 @@ export default function Core(rootElement, userSettings) {
4662
4393
  * @function isLtr
4663
4394
  * @returns {boolean} True if LTR.
4664
4395
  */
4665
-
4666
-
4667
4396
  this.isLtr = function () {
4668
4397
  return !instance.isRtl();
4669
4398
  };
4399
+
4670
4400
  /**
4671
4401
  * Returns 1 for LTR; -1 for RTL. Useful for calculations.
4672
4402
  *
@@ -4675,12 +4405,9 @@ export default function Core(rootElement, userSettings) {
4675
4405
  * @function getDirectionFactor
4676
4406
  * @returns {number} Returns 1 for LTR; -1 for RTL.
4677
4407
  */
4678
-
4679
-
4680
4408
  this.getDirectionFactor = function () {
4681
4409
  return instance.isLtr() ? 1 : -1;
4682
4410
  };
4683
-
4684
4411
  var shortcutManager = createShortcutManager({
4685
4412
  handleEvent: function handleEvent(event) {
4686
4413
  var isListening = instance.isListening();
@@ -4695,11 +4422,11 @@ export default function Core(rootElement, userSettings) {
4695
4422
  // Handsontable could be destroyed after performing action (executing a callback).
4696
4423
  return;
4697
4424
  }
4698
-
4699
4425
  instance.runHooks('afterDocumentKeyDown', event);
4700
4426
  },
4701
4427
  ownerWindow: this.rootWindow
4702
4428
  });
4429
+
4703
4430
  /**
4704
4431
  * Returns instance of a manager responsible for handling shortcuts stored in some contexts. It run actions after
4705
4432
  * pressing key combination in active Handsontable instance.
@@ -4709,11 +4436,9 @@ export default function Core(rootElement, userSettings) {
4709
4436
  * @function getShortcutManager
4710
4437
  * @returns {ShortcutManager} Instance of {@link ShortcutManager}
4711
4438
  */
4712
-
4713
4439
  this.getShortcutManager = function () {
4714
4440
  return shortcutManager;
4715
4441
  };
4716
-
4717
4442
  var gridContext = shortcutManager.addContext('grid');
4718
4443
  var gridConfig = {
4719
4444
  runOnlyIf: function runOnlyIf() {
@@ -4732,24 +4457,21 @@ export default function Core(rootElement, userSettings) {
4732
4457
  callback: function callback() {
4733
4458
  var selectedRange = instance.getSelectedRange();
4734
4459
  var _selectedRange$highli = selectedRange[selectedRange.length - 1].highlight,
4735
- highlightRow = _selectedRange$highli.row,
4736
- highlightColumn = _selectedRange$highli.col;
4460
+ highlightRow = _selectedRange$highli.row,
4461
+ highlightColumn = _selectedRange$highli.col;
4737
4462
  var valueToPopulate = instance.getDataAtCell(highlightRow, highlightColumn);
4738
4463
  var cellValues = new Map();
4739
-
4740
4464
  for (var i = 0; i < selectedRange.length; i++) {
4741
4465
  selectedRange[i].forAll(function (row, column) {
4742
4466
  if (row >= 0 && column >= 0 && (row !== highlightRow || column !== highlightColumn)) {
4743
4467
  var _instance$getCellMeta = instance.getCellMeta(row, column),
4744
- readOnly = _instance$getCellMeta.readOnly;
4745
-
4468
+ readOnly = _instance$getCellMeta.readOnly;
4746
4469
  if (!readOnly) {
4747
4470
  cellValues.set("".concat(row, "x").concat(column), [row, column, valueToPopulate]);
4748
4471
  }
4749
4472
  }
4750
4473
  });
4751
4474
  }
4752
-
4753
4475
  instance.setDataAtCell(Array.from(cellValues.values()));
4754
4476
  },
4755
4477
  runOnlyIf: function runOnlyIf() {
@@ -4776,9 +4498,8 @@ export default function Core(rootElement, userSettings) {
4776
4498
  captureCtrl: true,
4777
4499
  callback: function callback() {
4778
4500
  var _instance$getSelected = instance.getSelectedRangeLast(),
4779
- from = _instance$getSelected.from,
4780
- to = _instance$getSelected.to;
4781
-
4501
+ from = _instance$getSelected.from,
4502
+ to = _instance$getSelected.to;
4782
4503
  var row = instance.rowIndexMapper.getNearestNotHiddenIndex(0, 1);
4783
4504
  selection.setRangeStart(from.clone());
4784
4505
  selection.setRangeEnd(instance._createCellCoords(row, to.col));
@@ -4807,9 +4528,8 @@ export default function Core(rootElement, userSettings) {
4807
4528
  captureCtrl: true,
4808
4529
  callback: function callback() {
4809
4530
  var _instance$getSelected2 = instance.getSelectedRangeLast(),
4810
- from = _instance$getSelected2.from,
4811
- to = _instance$getSelected2.to;
4812
-
4531
+ from = _instance$getSelected2.from,
4532
+ to = _instance$getSelected2.to;
4813
4533
  var row = instance.rowIndexMapper.getNearestNotHiddenIndex(instance.countRows() - 1, -1);
4814
4534
  selection.setRangeStart(from.clone());
4815
4535
  selection.setRangeEnd(instance._createCellCoords(row, to.col));
@@ -4827,11 +4547,8 @@ export default function Core(rootElement, userSettings) {
4827
4547
  captureCtrl: true,
4828
4548
  callback: function callback() {
4829
4549
  var _instance$columnIndex;
4830
-
4831
4550
  var row = instance.getSelectedRangeLast().highlight.row;
4832
-
4833
4551
  var column = (_instance$columnIndex = instance.columnIndexMapper).getNearestNotHiddenIndex.apply(_instance$columnIndex, _toConsumableArray(instance.isRtl() ? [instance.countCols() - 1, -1] : [0, 1]));
4834
-
4835
4552
  selection.setRangeStart(instance._createCellCoords(row, column));
4836
4553
  }
4837
4554
  }, {
@@ -4844,13 +4561,10 @@ export default function Core(rootElement, userSettings) {
4844
4561
  captureCtrl: true,
4845
4562
  callback: function callback() {
4846
4563
  var _instance$columnIndex2;
4847
-
4848
4564
  var _instance$getSelected3 = instance.getSelectedRangeLast(),
4849
- from = _instance$getSelected3.from,
4850
- to = _instance$getSelected3.to;
4851
-
4565
+ from = _instance$getSelected3.from,
4566
+ to = _instance$getSelected3.to;
4852
4567
  var column = (_instance$columnIndex2 = instance.columnIndexMapper).getNearestNotHiddenIndex.apply(_instance$columnIndex2, _toConsumableArray(instance.isRtl() ? [instance.countCols() - 1, -1] : [0, 1]));
4853
-
4854
4568
  selection.setRangeStart(from.clone());
4855
4569
  selection.setRangeEnd(instance._createCellCoords(to.row, column));
4856
4570
  },
@@ -4867,11 +4581,8 @@ export default function Core(rootElement, userSettings) {
4867
4581
  captureCtrl: true,
4868
4582
  callback: function callback() {
4869
4583
  var _instance$columnIndex3;
4870
-
4871
4584
  var row = instance.getSelectedRangeLast().highlight.row;
4872
-
4873
4585
  var column = (_instance$columnIndex3 = instance.columnIndexMapper).getNearestNotHiddenIndex.apply(_instance$columnIndex3, _toConsumableArray(instance.isRtl() ? [0, 1] : [instance.countCols() - 1, -1]));
4874
-
4875
4586
  selection.setRangeStart(instance._createCellCoords(row, column));
4876
4587
  }
4877
4588
  }, {
@@ -4884,13 +4595,10 @@ export default function Core(rootElement, userSettings) {
4884
4595
  captureCtrl: true,
4885
4596
  callback: function callback() {
4886
4597
  var _instance$columnIndex4;
4887
-
4888
4598
  var _instance$getSelected4 = instance.getSelectedRangeLast(),
4889
- from = _instance$getSelected4.from,
4890
- to = _instance$getSelected4.to;
4891
-
4599
+ from = _instance$getSelected4.from,
4600
+ to = _instance$getSelected4.to;
4892
4601
  var column = (_instance$columnIndex4 = instance.columnIndexMapper).getNearestNotHiddenIndex.apply(_instance$columnIndex4, _toConsumableArray(instance.isRtl() ? [0, 1] : [instance.countCols() - 1, -1]));
4893
-
4894
4602
  selection.setRangeStart(from.clone());
4895
4603
  selection.setRangeEnd(instance._createCellCoords(to.row, column));
4896
4604
  },
@@ -4962,14 +4670,11 @@ export default function Core(rootElement, userSettings) {
4962
4670
  keys: [['PageUp', 'Shift']],
4963
4671
  callback: function callback() {
4964
4672
  var _instance$getSelected5 = instance.getSelectedRangeLast(),
4965
- to = _instance$getSelected5.to;
4966
-
4673
+ to = _instance$getSelected5.to;
4967
4674
  var nextRowIndexToSelect = Math.max(to.row - instance.countVisibleRows(), 0);
4968
4675
  var row = instance.rowIndexMapper.getNearestNotHiddenIndex(nextRowIndexToSelect, 1);
4969
-
4970
4676
  if (row !== null) {
4971
4677
  var coords = instance._createCellCoords(row, to.col);
4972
-
4973
4678
  var scrollPadding = to.row - instance.view.getFirstFullyVisibleRow();
4974
4679
  var nextVerticalScroll = Math.max(coords.row - scrollPadding, 0);
4975
4680
  selection.setRangeEnd(coords);
@@ -4985,14 +4690,11 @@ export default function Core(rootElement, userSettings) {
4985
4690
  keys: [['PageDown', 'Shift']],
4986
4691
  callback: function callback() {
4987
4692
  var _instance$getSelected6 = instance.getSelectedRangeLast(),
4988
- to = _instance$getSelected6.to;
4989
-
4693
+ to = _instance$getSelected6.to;
4990
4694
  var nextRowIndexToSelect = Math.min(to.row + instance.countVisibleRows(), instance.countRows() - 1);
4991
4695
  var row = instance.rowIndexMapper.getNearestNotHiddenIndex(nextRowIndexToSelect, -1);
4992
-
4993
4696
  if (row !== null) {
4994
4697
  var coords = instance._createCellCoords(row, to.col);
4995
-
4996
4698
  var scrollPadding = to.row - instance.view.getFirstFullyVisibleRow();
4997
4699
  var nextVerticalScroll = Math.min(coords.row - scrollPadding, instance.countRows() - 1);
4998
4700
  selection.setRangeEnd(coords);