handsontable 12.1.2 → 12.2.0

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