handsontable 12.1.3 → 12.2.0

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