handsontable 12.1.2 → 12.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (918) hide show
  1. package/3rdparty/SheetClip/SheetClip.js +3 -32
  2. package/3rdparty/SheetClip/SheetClip.mjs +3 -23
  3. package/3rdparty/SheetClip/index.js +0 -2
  4. package/3rdparty/autoResize/autoResize.js +119 -145
  5. package/3rdparty/autoResize/autoResize.mjs +119 -143
  6. package/3rdparty/autoResize/index.js +0 -2
  7. package/3rdparty/walkontable/src/border.js +72 -174
  8. package/3rdparty/walkontable/src/border.mjs +74 -161
  9. package/3rdparty/walkontable/src/calculator/constants.js +0 -3
  10. package/3rdparty/walkontable/src/calculator/constants.mjs +0 -2
  11. package/3rdparty/walkontable/src/calculator/index.js +0 -10
  12. package/3rdparty/walkontable/src/calculator/viewportColumns.js +26 -76
  13. package/3rdparty/walkontable/src/calculator/viewportColumns.mjs +26 -69
  14. package/3rdparty/walkontable/src/calculator/viewportRows.js +20 -48
  15. package/3rdparty/walkontable/src/calculator/viewportRows.mjs +20 -41
  16. package/3rdparty/walkontable/src/cell/coords.js +13 -43
  17. package/3rdparty/walkontable/src/cell/coords.mjs +13 -38
  18. package/3rdparty/walkontable/src/cell/range.js +55 -130
  19. package/3rdparty/walkontable/src/cell/range.mjs +60 -126
  20. package/3rdparty/walkontable/src/core/_base.js +16 -74
  21. package/3rdparty/walkontable/src/core/_base.mjs +19 -70
  22. package/3rdparty/walkontable/src/core/clone.js +1 -40
  23. package/3rdparty/walkontable/src/core/clone.mjs +3 -30
  24. package/3rdparty/walkontable/src/core/core.js +3 -57
  25. package/3rdparty/walkontable/src/core/core.mjs +5 -41
  26. package/3rdparty/walkontable/src/event.js +31 -78
  27. package/3rdparty/walkontable/src/event.mjs +31 -65
  28. package/3rdparty/walkontable/src/facade/core.js +1 -17
  29. package/3rdparty/walkontable/src/facade/core.mjs +7 -20
  30. package/3rdparty/walkontable/src/filter/column.js +9 -18
  31. package/3rdparty/walkontable/src/filter/column.mjs +9 -17
  32. package/3rdparty/walkontable/src/filter/row.js +9 -18
  33. package/3rdparty/walkontable/src/filter/row.mjs +9 -17
  34. package/3rdparty/walkontable/src/index.js +0 -31
  35. package/3rdparty/walkontable/src/overlay/_base.js +24 -69
  36. package/3rdparty/walkontable/src/overlay/_base.mjs +31 -68
  37. package/3rdparty/walkontable/src/overlay/bottom.js +28 -99
  38. package/3rdparty/walkontable/src/overlay/bottom.mjs +30 -86
  39. package/3rdparty/walkontable/src/overlay/bottomInlineStartCorner.js +7 -53
  40. package/3rdparty/walkontable/src/overlay/bottomInlineStartCorner.mjs +9 -40
  41. package/3rdparty/walkontable/src/overlay/constants.js +0 -6
  42. package/3rdparty/walkontable/src/overlay/constants.mjs +0 -1
  43. package/3rdparty/walkontable/src/overlay/index.js +0 -17
  44. package/3rdparty/walkontable/src/overlay/inlineStart.js +21 -91
  45. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +23 -78
  46. package/3rdparty/walkontable/src/overlay/top.js +27 -100
  47. package/3rdparty/walkontable/src/overlay/top.mjs +29 -87
  48. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.js +4 -51
  49. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.mjs +6 -38
  50. package/3rdparty/walkontable/src/overlays.js +58 -129
  51. package/3rdparty/walkontable/src/overlays.mjs +60 -121
  52. package/3rdparty/walkontable/src/renderer/_base.js +4 -20
  53. package/3rdparty/walkontable/src/renderer/_base.mjs +8 -22
  54. package/3rdparty/walkontable/src/renderer/cells.js +10 -54
  55. package/3rdparty/walkontable/src/renderer/cells.mjs +22 -52
  56. package/3rdparty/walkontable/src/renderer/colGroup.js +10 -47
  57. package/3rdparty/walkontable/src/renderer/colGroup.mjs +21 -46
  58. package/3rdparty/walkontable/src/renderer/columnHeaders.js +8 -50
  59. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +19 -49
  60. package/3rdparty/walkontable/src/renderer/index.js +13 -36
  61. package/3rdparty/walkontable/src/renderer/index.mjs +17 -27
  62. package/3rdparty/walkontable/src/renderer/rowHeaders.js +8 -50
  63. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +20 -49
  64. package/3rdparty/walkontable/src/renderer/rows.js +3 -46
  65. package/3rdparty/walkontable/src/renderer/rows.mjs +3 -29
  66. package/3rdparty/walkontable/src/renderer/table.js +22 -49
  67. package/3rdparty/walkontable/src/renderer/table.mjs +22 -48
  68. package/3rdparty/walkontable/src/scroll.js +56 -86
  69. package/3rdparty/walkontable/src/scroll.mjs +58 -86
  70. package/3rdparty/walkontable/src/selection.js +20 -101
  71. package/3rdparty/walkontable/src/selection.mjs +22 -85
  72. package/3rdparty/walkontable/src/settings.js +9 -29
  73. package/3rdparty/walkontable/src/settings.mjs +9 -27
  74. package/3rdparty/walkontable/src/table/bottom.js +1 -35
  75. package/3rdparty/walkontable/src/table/bottom.mjs +6 -25
  76. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.js +1 -35
  77. package/3rdparty/walkontable/src/table/bottomInlineStartCorner.mjs +7 -26
  78. package/3rdparty/walkontable/src/table/inlineStart.js +1 -35
  79. package/3rdparty/walkontable/src/table/inlineStart.mjs +3 -22
  80. package/3rdparty/walkontable/src/table/master.js +10 -55
  81. package/3rdparty/walkontable/src/table/master.mjs +15 -44
  82. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +7 -28
  83. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +7 -26
  84. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +7 -28
  85. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +7 -26
  86. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +7 -22
  87. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +7 -20
  88. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +7 -23
  89. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +7 -21
  90. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +7 -22
  91. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +7 -20
  92. package/3rdparty/walkontable/src/table/top.js +1 -35
  93. package/3rdparty/walkontable/src/table/top.mjs +6 -25
  94. package/3rdparty/walkontable/src/table/topInlineStartCorner.js +1 -35
  95. package/3rdparty/walkontable/src/table/topInlineStartCorner.mjs +7 -26
  96. package/3rdparty/walkontable/src/table.js +74 -238
  97. package/3rdparty/walkontable/src/table.mjs +84 -227
  98. package/3rdparty/walkontable/src/types.js +0 -5
  99. package/3rdparty/walkontable/src/types.mjs +0 -5
  100. package/3rdparty/walkontable/src/utils/column.js +9 -31
  101. package/3rdparty/walkontable/src/utils/column.mjs +13 -30
  102. package/3rdparty/walkontable/src/utils/nodesPool.js +3 -12
  103. package/3rdparty/walkontable/src/utils/nodesPool.mjs +3 -11
  104. package/3rdparty/walkontable/src/utils/orderView/constants.js +0 -3
  105. package/3rdparty/walkontable/src/utils/orderView/constants.mjs +0 -2
  106. package/3rdparty/walkontable/src/utils/orderView/index.js +0 -5
  107. package/3rdparty/walkontable/src/utils/orderView/sharedView.js +2 -33
  108. package/3rdparty/walkontable/src/utils/orderView/sharedView.mjs +6 -26
  109. package/3rdparty/walkontable/src/utils/orderView/view.js +14 -46
  110. package/3rdparty/walkontable/src/utils/orderView/view.mjs +21 -50
  111. package/3rdparty/walkontable/src/utils/orderView/viewSize.js +3 -15
  112. package/3rdparty/walkontable/src/utils/orderView/viewSize.mjs +3 -14
  113. package/3rdparty/walkontable/src/utils/orderView/viewSizeSet.js +8 -22
  114. package/3rdparty/walkontable/src/utils/orderView/viewSizeSet.mjs +23 -34
  115. package/3rdparty/walkontable/src/utils/row.js +2 -13
  116. package/3rdparty/walkontable/src/utils/row.mjs +2 -12
  117. package/3rdparty/walkontable/src/viewport.js +38 -100
  118. package/3rdparty/walkontable/src/viewport.mjs +40 -99
  119. package/CHANGELOG.md +103 -5
  120. package/base.js +6 -17
  121. package/base.mjs +6 -12
  122. package/cellTypes/autocompleteType/autocompleteType.js +0 -4
  123. package/cellTypes/autocompleteType/index.js +0 -2
  124. package/cellTypes/checkboxType/checkboxType.js +0 -3
  125. package/cellTypes/checkboxType/index.js +0 -2
  126. package/cellTypes/dateType/dateType.js +0 -4
  127. package/cellTypes/dateType/index.js +0 -2
  128. package/cellTypes/dropdownType/dropdownType.js +0 -4
  129. package/cellTypes/dropdownType/index.js +0 -2
  130. package/cellTypes/handsontableType/handsontableType.js +0 -3
  131. package/cellTypes/handsontableType/index.js +0 -2
  132. package/cellTypes/index.js +0 -21
  133. package/cellTypes/index.mjs +3 -5
  134. package/cellTypes/numericType/index.js +0 -2
  135. package/cellTypes/numericType/numericType.js +0 -4
  136. package/cellTypes/passwordType/index.js +0 -2
  137. package/cellTypes/passwordType/passwordType.js +0 -3
  138. package/cellTypes/registry.js +10 -25
  139. package/cellTypes/registry.mjs +10 -20
  140. package/cellTypes/textType/index.js +0 -2
  141. package/cellTypes/textType/textType.js +0 -3
  142. package/cellTypes/timeType/index.js +0 -2
  143. package/cellTypes/timeType/timeType.js +0 -4
  144. package/core.d.ts +6 -4
  145. package/core.js +514 -974
  146. package/core.mjs +519 -921
  147. package/dataMap/dataMap.js +127 -212
  148. package/dataMap/dataMap.mjs +127 -188
  149. package/{dataSource.js → dataMap/dataSource.js} +18 -66
  150. package/{dataSource.mjs → dataMap/dataSource.mjs} +20 -60
  151. package/dataMap/index.js +0 -13
  152. package/dataMap/metaManager/index.js +21 -46
  153. package/dataMap/metaManager/index.mjs +47 -64
  154. package/dataMap/metaManager/lazyFactoryMap.js +23 -55
  155. package/dataMap/metaManager/lazyFactoryMap.mjs +23 -43
  156. package/dataMap/metaManager/metaLayers/cellMeta.js +16 -52
  157. package/dataMap/metaManager/metaLayers/cellMeta.mjs +16 -37
  158. package/dataMap/metaManager/metaLayers/columnMeta.js +8 -22
  159. package/dataMap/metaManager/metaLayers/columnMeta.mjs +14 -25
  160. package/dataMap/metaManager/metaLayers/globalMeta.js +4 -19
  161. package/dataMap/metaManager/metaLayers/globalMeta.mjs +4 -15
  162. package/dataMap/metaManager/metaLayers/tableMeta.js +4 -15
  163. package/dataMap/metaManager/metaLayers/tableMeta.mjs +28 -37
  164. package/dataMap/metaManager/metaSchema.js +196 -257
  165. package/dataMap/metaManager/metaSchema.mjs +196 -248
  166. package/dataMap/metaManager/mods/dynamicCellMeta.js +6 -36
  167. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +20 -39
  168. package/dataMap/metaManager/mods/extendMetaProperties.js +5 -28
  169. package/dataMap/metaManager/mods/extendMetaProperties.mjs +4 -18
  170. package/dataMap/metaManager/utils.js +11 -20
  171. package/dataMap/metaManager/utils.mjs +21 -23
  172. package/dataMap/replaceData.js +14 -35
  173. package/dataMap/replaceData.mjs +35 -45
  174. package/dist/handsontable.css +2 -2
  175. package/dist/handsontable.full.css +2 -2
  176. package/dist/handsontable.full.js +64469 -93042
  177. package/dist/handsontable.full.min.css +2 -2
  178. package/dist/handsontable.full.min.js +527 -284
  179. package/dist/handsontable.js +9616 -21414
  180. package/dist/handsontable.min.css +2 -2
  181. package/dist/handsontable.min.js +3 -3
  182. package/dist/languages/all.js +0 -175
  183. package/dist/languages/ar-AR.js +0 -10
  184. package/dist/languages/cs-CZ.js +0 -10
  185. package/dist/languages/de-CH.js +0 -10
  186. package/dist/languages/de-DE.js +0 -10
  187. package/dist/languages/en-US.js +0 -10
  188. package/dist/languages/es-MX.js +0 -10
  189. package/dist/languages/fr-FR.js +0 -10
  190. package/dist/languages/it-IT.js +0 -10
  191. package/dist/languages/ja-JP.js +0 -10
  192. package/dist/languages/ko-KR.js +0 -10
  193. package/dist/languages/lv-LV.js +0 -10
  194. package/dist/languages/nb-NO.js +0 -10
  195. package/dist/languages/nl-NL.js +0 -10
  196. package/dist/languages/pl-PL.js +0 -10
  197. package/dist/languages/pt-BR.js +0 -10
  198. package/dist/languages/ru-RU.js +0 -10
  199. package/dist/languages/sr-SP.js +0 -10
  200. package/dist/languages/zh-CN.js +0 -10
  201. package/dist/languages/zh-TW.js +0 -10
  202. package/editorManager.js +89 -124
  203. package/editorManager.mjs +89 -104
  204. package/editors/autocompleteEditor/autocompleteEditor.js +26 -133
  205. package/editors/autocompleteEditor/autocompleteEditor.mjs +26 -104
  206. package/editors/autocompleteEditor/index.js +0 -2
  207. package/editors/baseEditor/baseEditor.js +45 -155
  208. package/editors/baseEditor/baseEditor.mjs +45 -129
  209. package/editors/baseEditor/index.js +0 -2
  210. package/editors/checkboxEditor/checkboxEditor.js +2 -33
  211. package/editors/checkboxEditor/checkboxEditor.mjs +2 -19
  212. package/editors/checkboxEditor/index.js +0 -2
  213. package/editors/dateEditor/dateEditor.js +36 -97
  214. package/editors/dateEditor/dateEditor.mjs +35 -74
  215. package/editors/dateEditor/index.js +0 -2
  216. package/editors/dropdownEditor/dropdownEditor.js +1 -41
  217. package/editors/dropdownEditor/dropdownEditor.mjs +1 -22
  218. package/editors/dropdownEditor/index.js +0 -2
  219. package/editors/handsontableEditor/handsontableEditor.js +13 -85
  220. package/editors/handsontableEditor/handsontableEditor.mjs +13 -66
  221. package/editors/handsontableEditor/index.js +0 -2
  222. package/editors/index.js +0 -25
  223. package/editors/index.mjs +3 -5
  224. package/editors/numericEditor/index.js +0 -2
  225. package/editors/numericEditor/numericEditor.js +1 -31
  226. package/editors/numericEditor/numericEditor.mjs +1 -18
  227. package/editors/passwordEditor/index.js +0 -2
  228. package/editors/passwordEditor/passwordEditor.js +1 -38
  229. package/editors/passwordEditor/passwordEditor.mjs +1 -22
  230. package/editors/registry.js +10 -36
  231. package/editors/registry.mjs +10 -28
  232. package/editors/selectEditor/index.js +0 -2
  233. package/editors/selectEditor/selectEditor.js +21 -73
  234. package/editors/selectEditor/selectEditor.mjs +21 -56
  235. package/editors/textEditor/caretPositioner.js +0 -12
  236. package/editors/textEditor/caretPositioner.mjs +10 -20
  237. package/editors/textEditor/index.js +0 -2
  238. package/editors/textEditor/textEditor.js +38 -137
  239. package/editors/textEditor/textEditor.mjs +38 -106
  240. package/editors/timeEditor/index.js +0 -2
  241. package/editors/timeEditor/timeEditor.js +1 -36
  242. package/editors/timeEditor/timeEditor.mjs +1 -21
  243. package/eventManager.js +20 -56
  244. package/eventManager.mjs +23 -56
  245. package/helpers/array.js +22 -88
  246. package/helpers/array.mjs +22 -58
  247. package/helpers/browser.js +25 -51
  248. package/helpers/browser.mjs +25 -32
  249. package/helpers/console.js +3 -13
  250. package/helpers/console.mjs +8 -16
  251. package/helpers/data.d.ts +0 -1
  252. package/helpers/data.js +10 -55
  253. package/helpers/data.mjs +10 -33
  254. package/helpers/date.js +2 -3
  255. package/helpers/date.mjs +2 -2
  256. package/helpers/dom/element.js +67 -259
  257. package/helpers/dom/element.mjs +74 -194
  258. package/helpers/dom/event.js +3 -7
  259. package/helpers/dom/event.mjs +3 -3
  260. package/helpers/feature.js +13 -47
  261. package/helpers/feature.mjs +13 -31
  262. package/helpers/function.js +14 -59
  263. package/helpers/function.mjs +20 -52
  264. package/helpers/mixed.js +9 -66
  265. package/helpers/mixed.mjs +15 -51
  266. package/helpers/number.js +4 -46
  267. package/helpers/number.mjs +4 -23
  268. package/helpers/object.js +15 -72
  269. package/helpers/object.mjs +21 -52
  270. package/helpers/string.js +6 -28
  271. package/helpers/string.mjs +12 -21
  272. package/helpers/templateLiteralTag.js +0 -6
  273. package/helpers/templateLiteralTag.mjs +7 -10
  274. package/helpers/unicode.js +17 -26
  275. package/helpers/unicode.mjs +17 -15
  276. package/helpers/wrappers/jquery.js +4 -14
  277. package/helpers/wrappers/jquery.mjs +4 -13
  278. package/i18n/constants.js +1 -3
  279. package/i18n/constants.mjs +1 -1
  280. package/i18n/index.js +0 -7
  281. package/i18n/languages/ar-AR.js +0 -16
  282. package/i18n/languages/ar-AR.mjs +1 -4
  283. package/i18n/languages/cs-CZ.js +0 -16
  284. package/i18n/languages/cs-CZ.mjs +1 -4
  285. package/i18n/languages/de-CH.js +0 -16
  286. package/i18n/languages/de-CH.mjs +1 -4
  287. package/i18n/languages/de-DE.js +0 -16
  288. package/i18n/languages/de-DE.mjs +1 -4
  289. package/i18n/languages/en-US.js +0 -16
  290. package/i18n/languages/en-US.mjs +1 -4
  291. package/i18n/languages/es-MX.js +0 -16
  292. package/i18n/languages/es-MX.mjs +1 -4
  293. package/i18n/languages/fr-FR.js +0 -16
  294. package/i18n/languages/fr-FR.mjs +1 -4
  295. package/i18n/languages/index.js +0 -39
  296. package/i18n/languages/it-IT.js +0 -16
  297. package/i18n/languages/it-IT.mjs +1 -4
  298. package/i18n/languages/ja-JP.js +0 -16
  299. package/i18n/languages/ja-JP.mjs +1 -4
  300. package/i18n/languages/ko-KR.js +0 -16
  301. package/i18n/languages/ko-KR.mjs +1 -4
  302. package/i18n/languages/lv-LV.js +0 -16
  303. package/i18n/languages/lv-LV.mjs +1 -4
  304. package/i18n/languages/nb-NO.js +0 -16
  305. package/i18n/languages/nb-NO.mjs +1 -4
  306. package/i18n/languages/nl-NL.js +0 -16
  307. package/i18n/languages/nl-NL.mjs +1 -4
  308. package/i18n/languages/pl-PL.js +0 -16
  309. package/i18n/languages/pl-PL.mjs +1 -4
  310. package/i18n/languages/pt-BR.js +0 -16
  311. package/i18n/languages/pt-BR.mjs +1 -4
  312. package/i18n/languages/ru-RU.js +0 -16
  313. package/i18n/languages/ru-RU.mjs +1 -4
  314. package/i18n/languages/sr-SP.js +0 -16
  315. package/i18n/languages/sr-SP.mjs +1 -4
  316. package/i18n/languages/zh-CN.js +0 -16
  317. package/i18n/languages/zh-CN.mjs +1 -4
  318. package/i18n/languages/zh-TW.js +0 -16
  319. package/i18n/languages/zh-TW.mjs +1 -4
  320. package/i18n/phraseFormatters/index.js +4 -11
  321. package/i18n/phraseFormatters/index.mjs +4 -6
  322. package/i18n/phraseFormatters/pluralize.js +0 -5
  323. package/i18n/phraseFormatters/pluralize.mjs +0 -3
  324. package/i18n/phraseFormatters/substituteVariables.js +0 -4
  325. package/i18n/phraseFormatters/substituteVariables.mjs +8 -11
  326. package/i18n/registry.js +18 -59
  327. package/i18n/registry.mjs +18 -30
  328. package/i18n/utils.js +4 -22
  329. package/i18n/utils.mjs +13 -21
  330. package/index.js +19 -56
  331. package/index.mjs +19 -15
  332. package/languages/all.js +0 -175
  333. package/languages/ar-AR.js +0 -10
  334. package/languages/ar-AR.mjs +1 -4
  335. package/languages/cs-CZ.js +0 -10
  336. package/languages/cs-CZ.mjs +1 -4
  337. package/languages/de-CH.js +0 -10
  338. package/languages/de-CH.mjs +1 -4
  339. package/languages/de-DE.js +0 -10
  340. package/languages/de-DE.mjs +1 -4
  341. package/languages/en-US.js +0 -10
  342. package/languages/en-US.mjs +1 -4
  343. package/languages/es-MX.js +0 -10
  344. package/languages/es-MX.mjs +1 -4
  345. package/languages/fr-FR.js +0 -10
  346. package/languages/fr-FR.mjs +1 -4
  347. package/languages/index.js +0 -175
  348. package/languages/it-IT.js +0 -10
  349. package/languages/it-IT.mjs +1 -4
  350. package/languages/ja-JP.js +0 -10
  351. package/languages/ja-JP.mjs +1 -4
  352. package/languages/ko-KR.js +0 -10
  353. package/languages/ko-KR.mjs +1 -4
  354. package/languages/lv-LV.js +0 -10
  355. package/languages/lv-LV.mjs +1 -4
  356. package/languages/nb-NO.js +0 -10
  357. package/languages/nb-NO.mjs +1 -4
  358. package/languages/nl-NL.js +0 -10
  359. package/languages/nl-NL.mjs +1 -4
  360. package/languages/pl-PL.js +0 -10
  361. package/languages/pl-PL.mjs +1 -4
  362. package/languages/pt-BR.js +0 -10
  363. package/languages/pt-BR.mjs +1 -4
  364. package/languages/ru-RU.js +0 -10
  365. package/languages/ru-RU.mjs +1 -4
  366. package/languages/sr-SP.js +0 -10
  367. package/languages/sr-SP.mjs +1 -4
  368. package/languages/zh-CN.js +0 -10
  369. package/languages/zh-CN.mjs +1 -4
  370. package/languages/zh-TW.js +0 -10
  371. package/languages/zh-TW.mjs +1 -4
  372. package/mixins/hooksRefRegisterer.js +4 -18
  373. package/mixins/hooksRefRegisterer.mjs +4 -15
  374. package/mixins/localHooks.js +7 -17
  375. package/mixins/localHooks.mjs +7 -14
  376. package/package.json +1 -1
  377. package/pluginHooks.d.ts +3 -4
  378. package/pluginHooks.js +288 -110
  379. package/pluginHooks.mjs +287 -97
  380. package/plugins/autoColumnSize/autoColumnSize.js +74 -172
  381. package/plugins/autoColumnSize/autoColumnSize.mjs +74 -137
  382. package/plugins/autoColumnSize/index.js +0 -2
  383. package/plugins/autoRowSize/autoRowSize.js +73 -153
  384. package/plugins/autoRowSize/autoRowSize.mjs +73 -124
  385. package/plugins/autoRowSize/index.js +0 -2
  386. package/plugins/autofill/autofill.js +46 -163
  387. package/plugins/autofill/autofill.mjs +46 -131
  388. package/plugins/autofill/index.js +0 -2
  389. package/plugins/autofill/utils.js +4 -26
  390. package/plugins/autofill/utils.mjs +4 -18
  391. package/plugins/base/base.js +21 -92
  392. package/plugins/base/base.mjs +21 -63
  393. package/plugins/base/index.js +0 -2
  394. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +19 -52
  395. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.mjs +19 -33
  396. package/plugins/bindRowsWithHeaders/index.js +0 -2
  397. package/plugins/bindRowsWithHeaders/maps/looseBindsMap.js +5 -41
  398. package/plugins/bindRowsWithHeaders/maps/looseBindsMap.mjs +5 -29
  399. package/plugins/bindRowsWithHeaders/maps/strictBindsMap.js +6 -53
  400. package/plugins/bindRowsWithHeaders/maps/strictBindsMap.mjs +6 -37
  401. package/plugins/collapsibleColumns/collapsibleColumns.js +96 -188
  402. package/plugins/collapsibleColumns/collapsibleColumns.mjs +97 -158
  403. package/plugins/collapsibleColumns/index.js +0 -2
  404. package/plugins/columnSorting/columnSorting.js +50 -188
  405. package/plugins/columnSorting/columnSorting.mjs +50 -143
  406. package/plugins/columnSorting/columnStatesManager.js +15 -71
  407. package/plugins/columnSorting/columnStatesManager.mjs +15 -48
  408. package/plugins/columnSorting/domHelpers.js +2 -18
  409. package/plugins/columnSorting/domHelpers.mjs +2 -7
  410. package/plugins/columnSorting/index.js +0 -2
  411. package/plugins/columnSorting/rootComparator.js +5 -24
  412. package/plugins/columnSorting/rootComparator.mjs +12 -21
  413. package/plugins/columnSorting/sortFunction/checkbox.js +8 -16
  414. package/plugins/columnSorting/sortFunction/checkbox.mjs +16 -21
  415. package/plugins/columnSorting/sortFunction/date.js +2 -19
  416. package/plugins/columnSorting/sortFunction/date.mjs +10 -23
  417. package/plugins/columnSorting/sortFunction/default.js +2 -17
  418. package/plugins/columnSorting/sortFunction/default.mjs +10 -23
  419. package/plugins/columnSorting/sortFunction/numeric.js +2 -11
  420. package/plugins/columnSorting/sortFunction/numeric.mjs +10 -17
  421. package/plugins/columnSorting/sortService/engine.js +3 -13
  422. package/plugins/columnSorting/sortService/engine.mjs +3 -5
  423. package/plugins/columnSorting/sortService/index.js +0 -5
  424. package/plugins/columnSorting/sortService/registry.js +6 -18
  425. package/plugins/columnSorting/sortService/registry.mjs +6 -10
  426. package/plugins/columnSorting/utils.js +9 -34
  427. package/plugins/columnSorting/utils.mjs +9 -15
  428. package/plugins/columnSummary/columnSummary.js +66 -126
  429. package/plugins/columnSummary/columnSummary.mjs +66 -101
  430. package/plugins/columnSummary/endpoints.js +21 -98
  431. package/plugins/columnSummary/endpoints.mjs +26 -99
  432. package/plugins/columnSummary/index.js +0 -2
  433. package/plugins/columnSummary/utils.js +13 -0
  434. package/plugins/columnSummary/utils.mjs +9 -0
  435. package/plugins/comments/commentEditor.js +16 -28
  436. package/plugins/comments/commentEditor.mjs +21 -32
  437. package/plugins/comments/comments.js +92 -175
  438. package/plugins/comments/comments.mjs +92 -149
  439. package/plugins/comments/displaySwitch.js +6 -23
  440. package/plugins/comments/displaySwitch.mjs +6 -18
  441. package/plugins/comments/index.js +0 -2
  442. package/plugins/contextMenu/commandExecutor.js +9 -40
  443. package/plugins/contextMenu/commandExecutor.mjs +14 -41
  444. package/plugins/contextMenu/contextMenu.js +26 -105
  445. package/plugins/contextMenu/contextMenu.mjs +26 -75
  446. package/plugins/contextMenu/cursor.js +6 -20
  447. package/plugins/contextMenu/cursor.mjs +11 -24
  448. package/plugins/contextMenu/index.js +0 -2
  449. package/plugins/contextMenu/itemsFactory.js +14 -43
  450. package/plugins/contextMenu/itemsFactory.mjs +19 -44
  451. package/plugins/contextMenu/menu.js +61 -177
  452. package/plugins/contextMenu/menu.mjs +61 -149
  453. package/plugins/contextMenu/predefinedItems/alignment.js +1 -55
  454. package/plugins/contextMenu/predefinedItems/alignment.mjs +1 -37
  455. package/plugins/contextMenu/predefinedItems/clearColumn.js +1 -20
  456. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +1 -4
  457. package/plugins/contextMenu/predefinedItems/columnLeft.js +6 -43
  458. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +6 -26
  459. package/plugins/contextMenu/predefinedItems/columnRight.js +4 -42
  460. package/plugins/contextMenu/predefinedItems/columnRight.mjs +4 -25
  461. package/plugins/contextMenu/predefinedItems/noItems.js +1 -4
  462. package/plugins/contextMenu/predefinedItems/noItems.mjs +1 -1
  463. package/plugins/contextMenu/predefinedItems/readOnly.js +1 -25
  464. package/plugins/contextMenu/predefinedItems/readOnly.mjs +1 -8
  465. package/plugins/contextMenu/predefinedItems/redo.js +1 -16
  466. package/plugins/contextMenu/predefinedItems/redo.mjs +1 -1
  467. package/plugins/contextMenu/predefinedItems/removeColumn.js +3 -38
  468. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +3 -18
  469. package/plugins/contextMenu/predefinedItems/removeRow.js +3 -37
  470. package/plugins/contextMenu/predefinedItems/removeRow.mjs +3 -17
  471. package/plugins/contextMenu/predefinedItems/rowAbove.js +6 -35
  472. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +6 -19
  473. package/plugins/contextMenu/predefinedItems/rowBelow.js +4 -42
  474. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +4 -25
  475. package/plugins/contextMenu/predefinedItems/separator.js +1 -2
  476. package/plugins/contextMenu/predefinedItems/separator.mjs +1 -1
  477. package/plugins/contextMenu/predefinedItems/undo.js +1 -16
  478. package/plugins/contextMenu/predefinedItems/undo.mjs +1 -1
  479. package/plugins/contextMenu/predefinedItems.js +2 -48
  480. package/plugins/contextMenu/predefinedItems.mjs +2 -7
  481. package/plugins/contextMenu/utils.js +17 -57
  482. package/plugins/contextMenu/utils.mjs +21 -39
  483. package/plugins/copyPaste/clipboardData.js +1 -10
  484. package/plugins/copyPaste/clipboardData.mjs +1 -9
  485. package/plugins/copyPaste/contextMenuItem/copy.js +2 -17
  486. package/plugins/copyPaste/contextMenuItem/copy.mjs +6 -9
  487. package/plugins/copyPaste/contextMenuItem/cut.js +2 -17
  488. package/plugins/copyPaste/contextMenuItem/cut.mjs +6 -9
  489. package/plugins/copyPaste/copyPaste.js +53 -185
  490. package/plugins/copyPaste/copyPaste.mjs +53 -144
  491. package/plugins/copyPaste/focusableElement.js +12 -56
  492. package/plugins/copyPaste/focusableElement.mjs +15 -49
  493. package/plugins/copyPaste/index.js +0 -2
  494. package/plugins/copyPaste/pasteEvent.js +1 -10
  495. package/plugins/copyPaste/pasteEvent.mjs +3 -10
  496. package/plugins/customBorders/contextMenuItem/bottom.js +0 -17
  497. package/plugins/customBorders/contextMenuItem/bottom.mjs +4 -8
  498. package/plugins/customBorders/contextMenuItem/index.js +0 -11
  499. package/plugins/customBorders/contextMenuItem/left.js +0 -17
  500. package/plugins/customBorders/contextMenuItem/left.mjs +4 -8
  501. package/plugins/customBorders/contextMenuItem/noBorders.js +0 -15
  502. package/plugins/customBorders/contextMenuItem/noBorders.mjs +4 -6
  503. package/plugins/customBorders/contextMenuItem/right.js +0 -17
  504. package/plugins/customBorders/contextMenuItem/right.mjs +4 -8
  505. package/plugins/customBorders/contextMenuItem/top.js +0 -17
  506. package/plugins/customBorders/contextMenuItem/top.mjs +4 -8
  507. package/plugins/customBorders/customBorders.js +52 -181
  508. package/plugins/customBorders/customBorders.mjs +52 -147
  509. package/plugins/customBorders/index.js +0 -2
  510. package/plugins/customBorders/utils.js +13 -52
  511. package/plugins/customBorders/utils.mjs +20 -39
  512. package/plugins/dragToScroll/dragToScroll.js +17 -74
  513. package/plugins/dragToScroll/dragToScroll.mjs +17 -55
  514. package/plugins/dragToScroll/index.js +0 -2
  515. package/plugins/dropdownMenu/dropdownMenu.js +47 -126
  516. package/plugins/dropdownMenu/dropdownMenu.mjs +47 -95
  517. package/plugins/dropdownMenu/index.js +0 -2
  518. package/plugins/exportFile/dataProvider.js +24 -69
  519. package/plugins/exportFile/dataProvider.mjs +26 -60
  520. package/plugins/exportFile/exportFile.js +48 -58
  521. package/plugins/exportFile/exportFile.mjs +48 -36
  522. package/plugins/exportFile/index.js +0 -2
  523. package/plugins/exportFile/typeFactory.js +1 -11
  524. package/plugins/exportFile/typeFactory.mjs +1 -4
  525. package/plugins/exportFile/types/_base.js +2 -16
  526. package/plugins/exportFile/types/_base.mjs +4 -16
  527. package/plugins/exportFile/types/csv.js +2 -50
  528. package/plugins/exportFile/types/csv.mjs +2 -29
  529. package/plugins/filters/component/_base.js +12 -32
  530. package/plugins/filters/component/_base.mjs +15 -30
  531. package/plugins/filters/component/actionBar.js +6 -55
  532. package/plugins/filters/component/actionBar.mjs +9 -38
  533. package/plugins/filters/component/condition.js +25 -122
  534. package/plugins/filters/component/condition.mjs +24 -88
  535. package/plugins/filters/component/operators.js +10 -68
  536. package/plugins/filters/component/operators.mjs +10 -45
  537. package/plugins/filters/component/value.js +25 -99
  538. package/plugins/filters/component/value.mjs +28 -72
  539. package/plugins/filters/condition/beginsWith.js +2 -32
  540. package/plugins/filters/condition/beginsWith.mjs +2 -10
  541. package/plugins/filters/condition/between.js +3 -37
  542. package/plugins/filters/condition/between.mjs +3 -15
  543. package/plugins/filters/condition/byValue.js +3 -27
  544. package/plugins/filters/condition/byValue.mjs +3 -12
  545. package/plugins/filters/condition/contains.js +2 -32
  546. package/plugins/filters/condition/contains.mjs +2 -10
  547. package/plugins/filters/condition/date/after.js +2 -34
  548. package/plugins/filters/condition/date/after.mjs +2 -12
  549. package/plugins/filters/condition/date/before.js +2 -34
  550. package/plugins/filters/condition/date/before.mjs +2 -12
  551. package/plugins/filters/condition/date/today.js +1 -22
  552. package/plugins/filters/condition/date/today.mjs +1 -3
  553. package/plugins/filters/condition/date/tomorrow.js +1 -22
  554. package/plugins/filters/condition/date/tomorrow.mjs +1 -3
  555. package/plugins/filters/condition/date/yesterday.js +1 -22
  556. package/plugins/filters/condition/date/yesterday.mjs +1 -3
  557. package/plugins/filters/condition/empty.js +1 -19
  558. package/plugins/filters/condition/empty.mjs +1 -1
  559. package/plugins/filters/condition/endsWith.js +2 -32
  560. package/plugins/filters/condition/endsWith.mjs +2 -10
  561. package/plugins/filters/condition/equal.js +2 -31
  562. package/plugins/filters/condition/equal.mjs +2 -10
  563. package/plugins/filters/condition/false.js +1 -5
  564. package/plugins/filters/condition/false.mjs +1 -1
  565. package/plugins/filters/condition/greaterThan.js +2 -32
  566. package/plugins/filters/condition/greaterThan.mjs +2 -12
  567. package/plugins/filters/condition/greaterThanOrEqual.js +2 -32
  568. package/plugins/filters/condition/greaterThanOrEqual.mjs +2 -12
  569. package/plugins/filters/condition/lessThan.js +2 -32
  570. package/plugins/filters/condition/lessThan.mjs +2 -12
  571. package/plugins/filters/condition/lessThanOrEqual.js +2 -32
  572. package/plugins/filters/condition/lessThanOrEqual.mjs +2 -12
  573. package/plugins/filters/condition/none.js +1 -18
  574. package/plugins/filters/condition/none.mjs +1 -1
  575. package/plugins/filters/condition/notBetween.js +1 -19
  576. package/plugins/filters/condition/notBetween.mjs +1 -1
  577. package/plugins/filters/condition/notContains.js +1 -19
  578. package/plugins/filters/condition/notContains.mjs +1 -1
  579. package/plugins/filters/condition/notEmpty.js +1 -19
  580. package/plugins/filters/condition/notEmpty.mjs +1 -1
  581. package/plugins/filters/condition/notEqual.js +1 -19
  582. package/plugins/filters/condition/notEqual.mjs +1 -1
  583. package/plugins/filters/condition/true.js +1 -5
  584. package/plugins/filters/condition/true.mjs +1 -1
  585. package/plugins/filters/conditionCollection.js +21 -80
  586. package/plugins/filters/conditionCollection.mjs +21 -57
  587. package/plugins/filters/conditionRegisterer.js +5 -14
  588. package/plugins/filters/conditionRegisterer.mjs +5 -9
  589. package/plugins/filters/conditionUpdateObserver.js +17 -57
  590. package/plugins/filters/conditionUpdateObserver.mjs +25 -53
  591. package/plugins/filters/constants.js +1 -66
  592. package/plugins/filters/constants.mjs +1 -8
  593. package/plugins/filters/dataFilter.js +4 -21
  594. package/plugins/filters/dataFilter.mjs +7 -23
  595. package/plugins/filters/filters.d.ts +1 -1
  596. package/plugins/filters/filters.js +147 -272
  597. package/plugins/filters/filters.mjs +148 -228
  598. package/plugins/filters/index.js +0 -2
  599. package/plugins/filters/logicalOperationRegisterer.js +3 -9
  600. package/plugins/filters/logicalOperationRegisterer.mjs +3 -4
  601. package/plugins/filters/logicalOperations/conjunction.js +2 -19
  602. package/plugins/filters/logicalOperations/conjunction.mjs +2 -2
  603. package/plugins/filters/logicalOperations/disjunction.js +2 -19
  604. package/plugins/filters/logicalOperations/disjunction.mjs +2 -2
  605. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.js +2 -21
  606. package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.mjs +2 -3
  607. package/plugins/filters/ui/_base.js +12 -55
  608. package/plugins/filters/ui/_base.mjs +12 -35
  609. package/plugins/filters/ui/input.js +7 -52
  610. package/plugins/filters/ui/input.mjs +7 -34
  611. package/plugins/filters/ui/link.js +3 -43
  612. package/plugins/filters/ui/link.mjs +3 -25
  613. package/plugins/filters/ui/multipleSelect.js +26 -120
  614. package/plugins/filters/ui/multipleSelect.mjs +20 -76
  615. package/plugins/filters/ui/radioInput.js +6 -47
  616. package/plugins/filters/ui/radioInput.mjs +6 -30
  617. package/plugins/filters/ui/select.js +14 -76
  618. package/plugins/filters/ui/select.mjs +14 -52
  619. package/plugins/filters/utils.js +6 -39
  620. package/plugins/filters/utils.mjs +6 -23
  621. package/plugins/formulas/engine/register.js +24 -74
  622. package/plugins/formulas/engine/register.mjs +29 -51
  623. package/plugins/formulas/engine/settings.js +4 -24
  624. package/plugins/formulas/engine/settings.mjs +4 -12
  625. package/plugins/formulas/formulas.js +103 -295
  626. package/plugins/formulas/formulas.mjs +104 -248
  627. package/plugins/formulas/index.js +0 -2
  628. package/plugins/formulas/utils.js +1 -3
  629. package/plugins/formulas/utils.mjs +1 -1
  630. package/plugins/hiddenColumns/contextMenuItem/hideColumn.js +4 -38
  631. package/plugins/hiddenColumns/contextMenuItem/hideColumn.mjs +8 -25
  632. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +17 -45
  633. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +21 -29
  634. package/plugins/hiddenColumns/hiddenColumns.js +72 -153
  635. package/plugins/hiddenColumns/hiddenColumns.mjs +72 -110
  636. package/plugins/hiddenColumns/index.js +0 -2
  637. package/plugins/hiddenRows/contextMenuItem/hideRow.js +4 -38
  638. package/plugins/hiddenRows/contextMenuItem/hideRow.mjs +8 -25
  639. package/plugins/hiddenRows/contextMenuItem/showRow.js +17 -45
  640. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +21 -29
  641. package/plugins/hiddenRows/hiddenRows.js +70 -152
  642. package/plugins/hiddenRows/hiddenRows.mjs +70 -109
  643. package/plugins/hiddenRows/index.js +0 -2
  644. package/plugins/index.js +0 -71
  645. package/plugins/index.mjs +3 -5
  646. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js +1 -28
  647. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.mjs +5 -17
  648. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js +1 -28
  649. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.mjs +5 -17
  650. package/plugins/manualColumnFreeze/index.js +0 -2
  651. package/plugins/manualColumnFreeze/manualColumnFreeze.js +21 -78
  652. package/plugins/manualColumnFreeze/manualColumnFreeze.mjs +21 -54
  653. package/plugins/manualColumnMove/index.js +0 -2
  654. package/plugins/manualColumnMove/manualColumnMove.js +45 -134
  655. package/plugins/manualColumnMove/manualColumnMove.mjs +45 -106
  656. package/plugins/manualColumnMove/ui/_base.js +12 -30
  657. package/plugins/manualColumnMove/ui/_base.mjs +12 -27
  658. package/plugins/manualColumnMove/ui/backlight.js +1 -37
  659. package/plugins/manualColumnMove/ui/backlight.mjs +1 -22
  660. package/plugins/manualColumnMove/ui/guideline.js +1 -37
  661. package/plugins/manualColumnMove/ui/guideline.mjs +1 -22
  662. package/plugins/manualColumnResize/index.js +0 -2
  663. package/plugins/manualColumnResize/manualColumnResize.js +44 -143
  664. package/plugins/manualColumnResize/manualColumnResize.mjs +43 -118
  665. package/plugins/manualRowMove/index.js +0 -2
  666. package/plugins/manualRowMove/manualRowMove.js +45 -137
  667. package/plugins/manualRowMove/manualRowMove.mjs +45 -109
  668. package/plugins/manualRowMove/ui/_base.js +12 -27
  669. package/plugins/manualRowMove/ui/_base.mjs +12 -26
  670. package/plugins/manualRowMove/ui/backlight.js +1 -37
  671. package/plugins/manualRowMove/ui/backlight.mjs +1 -22
  672. package/plugins/manualRowMove/ui/guideline.js +1 -37
  673. package/plugins/manualRowMove/ui/guideline.mjs +1 -22
  674. package/plugins/manualRowResize/index.js +0 -2
  675. package/plugins/manualRowResize/manualRowResize.js +42 -138
  676. package/plugins/manualRowResize/manualRowResize.mjs +41 -112
  677. package/plugins/mergeCells/calculations/autofill.js +39 -130
  678. package/plugins/mergeCells/calculations/autofill.mjs +44 -122
  679. package/plugins/mergeCells/calculations/selection.js +9 -40
  680. package/plugins/mergeCells/calculations/selection.mjs +9 -37
  681. package/plugins/mergeCells/cellCoords.js +30 -51
  682. package/plugins/mergeCells/cellCoords.mjs +35 -54
  683. package/plugins/mergeCells/cellsCollection.js +13 -84
  684. package/plugins/mergeCells/cellsCollection.mjs +18 -69
  685. package/plugins/mergeCells/contextMenuItem/toggleMerge.js +0 -22
  686. package/plugins/mergeCells/contextMenuItem/toggleMerge.mjs +4 -11
  687. package/plugins/mergeCells/index.js +0 -2
  688. package/plugins/mergeCells/mergeCells.js +130 -333
  689. package/plugins/mergeCells/mergeCells.mjs +130 -292
  690. package/plugins/mergeCells/utils.js +0 -3
  691. package/plugins/mergeCells/utils.mjs +0 -1
  692. package/plugins/multiColumnSorting/domHelpers.js +3 -15
  693. package/plugins/multiColumnSorting/domHelpers.mjs +3 -7
  694. package/plugins/multiColumnSorting/index.js +0 -2
  695. package/plugins/multiColumnSorting/multiColumnSorting.js +14 -66
  696. package/plugins/multiColumnSorting/multiColumnSorting.mjs +14 -44
  697. package/plugins/multiColumnSorting/rootComparator.js +2 -26
  698. package/plugins/multiColumnSorting/rootComparator.mjs +9 -23
  699. package/plugins/multiColumnSorting/utils.js +0 -7
  700. package/plugins/multiColumnSorting/utils.mjs +3 -8
  701. package/plugins/multipleSelectionHandles/index.js +0 -2
  702. package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +6 -109
  703. package/plugins/multipleSelectionHandles/multipleSelectionHandles.mjs +6 -87
  704. package/plugins/nestedHeaders/index.js +0 -2
  705. package/plugins/nestedHeaders/nestedHeaders.js +79 -200
  706. package/plugins/nestedHeaders/nestedHeaders.mjs +80 -173
  707. package/plugins/nestedHeaders/stateManager/headersTree.js +16 -93
  708. package/plugins/nestedHeaders/stateManager/headersTree.mjs +16 -73
  709. package/plugins/nestedHeaders/stateManager/index.js +24 -107
  710. package/plugins/nestedHeaders/stateManager/index.mjs +51 -115
  711. package/plugins/nestedHeaders/stateManager/matrixGenerator.js +7 -25
  712. package/plugins/nestedHeaders/stateManager/matrixGenerator.mjs +38 -51
  713. package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.js +12 -27
  714. package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.mjs +29 -35
  715. package/plugins/nestedHeaders/stateManager/nodeModifiers/expand.js +10 -25
  716. package/plugins/nestedHeaders/stateManager/nodeModifiers/expand.mjs +26 -32
  717. package/plugins/nestedHeaders/stateManager/nodeModifiers/hideColumn.js +3 -19
  718. package/plugins/nestedHeaders/stateManager/nodeModifiers/hideColumn.mjs +9 -20
  719. package/plugins/nestedHeaders/stateManager/nodeModifiers/index.js +2 -12
  720. package/plugins/nestedHeaders/stateManager/nodeModifiers/index.mjs +2 -5
  721. package/plugins/nestedHeaders/stateManager/nodeModifiers/showColumn.js +3 -22
  722. package/plugins/nestedHeaders/stateManager/nodeModifiers/showColumn.mjs +9 -21
  723. package/plugins/nestedHeaders/stateManager/nodeModifiers/utils/tree.js +3 -10
  724. package/plugins/nestedHeaders/stateManager/nodeModifiers/utils/tree.mjs +3 -7
  725. package/plugins/nestedHeaders/stateManager/settingsNormalizer.js +5 -36
  726. package/plugins/nestedHeaders/stateManager/settingsNormalizer.mjs +44 -61
  727. package/plugins/nestedHeaders/stateManager/sourceSettings.js +16 -78
  728. package/plugins/nestedHeaders/stateManager/sourceSettings.mjs +21 -68
  729. package/plugins/nestedHeaders/stateManager/utils.js +19 -22
  730. package/plugins/nestedHeaders/stateManager/utils.mjs +19 -20
  731. package/plugins/nestedHeaders/utils/ghostTable.js +9 -37
  732. package/plugins/nestedHeaders/utils/ghostTable.mjs +16 -43
  733. package/plugins/nestedRows/data/dataManager.js +40 -161
  734. package/plugins/nestedRows/data/dataManager.mjs +44 -148
  735. package/plugins/nestedRows/index.js +0 -2
  736. package/plugins/nestedRows/nestedRows.js +41 -119
  737. package/plugins/nestedRows/nestedRows.mjs +41 -86
  738. package/plugins/nestedRows/ui/_base.js +1 -9
  739. package/plugins/nestedRows/ui/_base.mjs +1 -8
  740. package/plugins/nestedRows/ui/collapsing.js +28 -134
  741. package/plugins/nestedRows/ui/collapsing.mjs +34 -118
  742. package/plugins/nestedRows/ui/contextMenu.js +2 -53
  743. package/plugins/nestedRows/ui/contextMenu.mjs +2 -32
  744. package/plugins/nestedRows/ui/headers.js +5 -50
  745. package/plugins/nestedRows/ui/headers.mjs +11 -41
  746. package/plugins/nestedRows/utils/rowMoveController.js +28 -78
  747. package/plugins/nestedRows/utils/rowMoveController.mjs +33 -66
  748. package/plugins/persistentState/index.js +0 -2
  749. package/plugins/persistentState/persistentState.js +10 -58
  750. package/plugins/persistentState/persistentState.mjs +10 -37
  751. package/plugins/persistentState/storage.js +9 -25
  752. package/plugins/persistentState/storage.mjs +12 -26
  753. package/plugins/registry.js +7 -51
  754. package/plugins/registry.mjs +8 -34
  755. package/plugins/search/index.js +0 -2
  756. package/plugins/search/search.js +16 -98
  757. package/plugins/search/search.mjs +16 -68
  758. package/plugins/touchScroll/index.js +0 -2
  759. package/plugins/touchScroll/touchScroll.js +15 -76
  760. package/plugins/touchScroll/touchScroll.mjs +15 -58
  761. package/plugins/trimRows/index.js +0 -2
  762. package/plugins/trimRows/trimRows.js +62 -88
  763. package/plugins/trimRows/trimRows.mjs +62 -65
  764. package/plugins/undoRedo/index.js +0 -14
  765. package/plugins/undoRedo/undoRedo.js +48 -218
  766. package/plugins/undoRedo/undoRedo.mjs +48 -188
  767. package/registry.js +0 -11
  768. package/registry.mjs +2 -4
  769. package/renderers/autocompleteRenderer/autocompleteRenderer.js +5 -14
  770. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +5 -6
  771. package/renderers/autocompleteRenderer/index.js +0 -2
  772. package/renderers/baseRenderer/baseRenderer.js +2 -11
  773. package/renderers/baseRenderer/baseRenderer.mjs +2 -9
  774. package/renderers/baseRenderer/index.js +0 -2
  775. package/renderers/checkboxRenderer/checkboxRenderer.js +22 -103
  776. package/renderers/checkboxRenderer/checkboxRenderer.mjs +22 -81
  777. package/renderers/checkboxRenderer/index.js +0 -2
  778. package/renderers/htmlRenderer/htmlRenderer.js +1 -7
  779. package/renderers/htmlRenderer/htmlRenderer.mjs +1 -1
  780. package/renderers/htmlRenderer/index.js +0 -2
  781. package/renderers/index.js +0 -19
  782. package/renderers/index.mjs +3 -5
  783. package/renderers/numericRenderer/index.js +0 -2
  784. package/renderers/numericRenderer/numericRenderer.js +1 -23
  785. package/renderers/numericRenderer/numericRenderer.mjs +1 -10
  786. package/renderers/passwordRenderer/index.js +0 -2
  787. package/renderers/passwordRenderer/passwordRenderer.js +1 -8
  788. package/renderers/passwordRenderer/passwordRenderer.mjs +1 -1
  789. package/renderers/registry.js +7 -16
  790. package/renderers/registry.mjs +7 -14
  791. package/renderers/textRenderer/index.js +0 -2
  792. package/renderers/textRenderer/textRenderer.js +2 -14
  793. package/renderers/textRenderer/textRenderer.mjs +2 -6
  794. package/renderers/timeRenderer/index.js +0 -2
  795. package/renderers/timeRenderer/timeRenderer.js +1 -6
  796. package/renderers/timeRenderer/timeRenderer.mjs +1 -1
  797. package/selection/highlight/highlight.js +17 -73
  798. package/selection/highlight/highlight.mjs +31 -64
  799. package/selection/highlight/types/activeHeader.js +1 -21
  800. package/selection/highlight/types/activeHeader.mjs +6 -16
  801. package/selection/highlight/types/area.js +2 -22
  802. package/selection/highlight/types/area.mjs +10 -20
  803. package/selection/highlight/types/cell.js +1 -21
  804. package/selection/highlight/types/cell.mjs +9 -19
  805. package/selection/highlight/types/customSelection.js +2 -22
  806. package/selection/highlight/types/customSelection.mjs +11 -21
  807. package/selection/highlight/types/fill.js +2 -17
  808. package/selection/highlight/types/fill.mjs +9 -14
  809. package/selection/highlight/types/header.js +3 -23
  810. package/selection/highlight/types/header.mjs +13 -23
  811. package/selection/highlight/types/index.js +3 -24
  812. package/selection/highlight/types/index.mjs +3 -10
  813. package/selection/highlight/visualSelection.js +24 -74
  814. package/selection/highlight/visualSelection.mjs +24 -62
  815. package/selection/index.js +0 -14
  816. package/selection/mouseEventHandler.js +19 -30
  817. package/selection/mouseEventHandler.mjs +32 -36
  818. package/selection/range.js +11 -31
  819. package/selection/range.mjs +11 -22
  820. package/selection/selection.js +62 -157
  821. package/selection/selection.mjs +65 -132
  822. package/selection/transformation.js +10 -40
  823. package/selection/transformation.mjs +18 -45
  824. package/selection/utils.js +22 -70
  825. package/selection/utils.mjs +22 -47
  826. package/shortcuts/context.js +23 -78
  827. package/shortcuts/context.mjs +23 -55
  828. package/shortcuts/index.js +0 -2
  829. package/shortcuts/keyObserver.js +4 -17
  830. package/shortcuts/keyObserver.mjs +4 -12
  831. package/shortcuts/manager.js +16 -36
  832. package/shortcuts/manager.mjs +16 -33
  833. package/shortcuts/recorder.js +20 -47
  834. package/shortcuts/recorder.mjs +20 -39
  835. package/shortcuts/utils.js +5 -24
  836. package/shortcuts/utils.mjs +5 -8
  837. package/tableView.js +100 -270
  838. package/tableView.mjs +100 -248
  839. package/translations/changesObservable/observable.js +5 -54
  840. package/translations/changesObservable/observable.mjs +12 -51
  841. package/translations/changesObservable/observer.js +4 -32
  842. package/translations/changesObservable/observer.mjs +9 -29
  843. package/translations/changesObservable/utils.js +1 -5
  844. package/translations/changesObservable/utils.mjs +1 -4
  845. package/translations/index.js +0 -11
  846. package/translations/indexMapper.js +70 -158
  847. package/translations/indexMapper.mjs +70 -125
  848. package/translations/mapCollections/aggregatedCollection.js +9 -51
  849. package/translations/mapCollections/aggregatedCollection.mjs +12 -41
  850. package/translations/mapCollections/index.js +0 -7
  851. package/translations/mapCollections/mapCollection.js +10 -33
  852. package/translations/mapCollections/mapCollection.mjs +10 -22
  853. package/translations/maps/hidingMap.js +2 -35
  854. package/translations/maps/hidingMap.mjs +7 -28
  855. package/translations/maps/index.js +1 -24
  856. package/translations/maps/index.mjs +1 -3
  857. package/translations/maps/indexMap.js +12 -34
  858. package/translations/maps/indexMap.mjs +16 -32
  859. package/translations/maps/indexesSequence.js +3 -41
  860. package/translations/maps/indexesSequence.mjs +9 -32
  861. package/translations/maps/linkedPhysicalIndexToValueMap.js +9 -78
  862. package/translations/maps/linkedPhysicalIndexToValueMap.mjs +16 -59
  863. package/translations/maps/physicalIndexToValueMap.js +2 -39
  864. package/translations/maps/physicalIndexToValueMap.mjs +8 -31
  865. package/translations/maps/trimmingMap.js +2 -35
  866. package/translations/maps/trimmingMap.mjs +7 -28
  867. package/translations/maps/utils/actionsOnIndexes.js +1 -7
  868. package/translations/maps/utils/actionsOnIndexes.mjs +9 -12
  869. package/translations/maps/utils/index.js +0 -13
  870. package/translations/maps/utils/index.mjs +0 -3
  871. package/translations/maps/utils/indexesSequence.js +1 -24
  872. package/translations/maps/utils/indexesSequence.mjs +10 -19
  873. package/translations/maps/utils/physicallyIndexed.js +1 -27
  874. package/translations/maps/utils/physicallyIndexed.mjs +11 -21
  875. package/utils/dataStructures/linkedList.js +15 -56
  876. package/utils/dataStructures/linkedList.mjs +15 -54
  877. package/utils/dataStructures/priorityMap.js +8 -46
  878. package/utils/dataStructures/priorityMap.mjs +8 -29
  879. package/utils/dataStructures/queue.js +6 -17
  880. package/utils/dataStructures/queue.mjs +6 -16
  881. package/utils/dataStructures/stack.js +6 -17
  882. package/utils/dataStructures/stack.mjs +6 -16
  883. package/utils/dataStructures/tree.js +11 -75
  884. package/utils/dataStructures/tree.mjs +11 -54
  885. package/utils/dataStructures/uniqueMap.js +17 -56
  886. package/utils/dataStructures/uniqueMap.mjs +17 -42
  887. package/utils/dataStructures/uniqueSet.js +5 -32
  888. package/utils/dataStructures/uniqueSet.mjs +5 -19
  889. package/utils/ghostTable.js +33 -104
  890. package/utils/ghostTable.mjs +35 -92
  891. package/utils/interval.js +10 -37
  892. package/utils/interval.mjs +7 -29
  893. package/utils/parseTable.js +11 -92
  894. package/utils/parseTable.mjs +11 -62
  895. package/utils/rootInstance.js +3 -14
  896. package/utils/rootInstance.mjs +3 -3
  897. package/utils/samplesGenerator.js +15 -51
  898. package/utils/samplesGenerator.mjs +17 -44
  899. package/utils/staticRegister.js +6 -33
  900. package/utils/staticRegister.mjs +6 -19
  901. package/validators/autocompleteValidator/autocompleteValidator.js +2 -10
  902. package/validators/autocompleteValidator/autocompleteValidator.mjs +2 -8
  903. package/validators/autocompleteValidator/index.js +0 -2
  904. package/validators/dateValidator/dateValidator.js +2 -21
  905. package/validators/dateValidator/dateValidator.mjs +2 -11
  906. package/validators/dateValidator/index.js +0 -2
  907. package/validators/index.js +0 -11
  908. package/validators/index.mjs +3 -5
  909. package/validators/numericValidator/index.js +0 -2
  910. package/validators/numericValidator/numericValidator.js +1 -7
  911. package/validators/numericValidator/numericValidator.mjs +1 -3
  912. package/validators/registry.js +7 -16
  913. package/validators/registry.mjs +7 -14
  914. package/validators/timeValidator/index.js +0 -2
  915. package/validators/timeValidator/timeValidator.js +6 -18
  916. package/validators/timeValidator/timeValidator.mjs +8 -13
  917. package/utils/sortingAlgorithms/mergeSort.js +0 -120
  918. package/utils/sortingAlgorithms/mergeSort.mjs +0 -110
package/core.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,18 +1537,18 @@ 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
- * Populate cells at position with 2D input array (e.g. `[[1, 2], [3, 4]]`). Use `endRow`, `endCol` when you
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.
1736
1549
  *
1550
+ * The `populateFromArray()` method can't change [`readOnly`](@/api/options.md#readonly) cells.
1551
+ *
1737
1552
  * Optional `method` argument has the same effect as pasteMode option (see {@link Options#pasteMode}).
1738
1553
  *
1739
1554
  * @memberof Core#
@@ -1750,8 +1565,6 @@ function Core(rootElement, userSettings) {
1750
1565
  * Useful **only** when the type of handled cells is `numeric`.
1751
1566
  * @returns {object|undefined} Ending td in pasted area (only if any cell was changed).
1752
1567
  */
1753
-
1754
-
1755
1568
  this.populateFromArray = function (row, column, input, endRow, endCol, source, method, direction, deltas) {
1756
1569
  if (!(_typeof(input) === 'object' && _typeof(input[0]) === 'object')) {
1757
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
@@ -1760,6 +1573,7 @@ function Core(rootElement, userSettings) {
1760
1573
  var c = typeof endRow === 'number' ? instance._createCellCoords(endRow, endCol) : null;
1761
1574
  return grid.populateFromArray(instance._createCellCoords(row, column), input, c, source, method, direction, deltas);
1762
1575
  };
1576
+
1763
1577
  /**
1764
1578
  * Adds/removes data from the column. This method works the same as Array.splice for arrays.
1765
1579
  *
@@ -1771,17 +1585,14 @@ function Core(rootElement, userSettings) {
1771
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.
1772
1586
  * @returns {Array} Returns removed portion of columns.
1773
1587
  */
1774
-
1775
-
1776
1588
  this.spliceCol = function (column, index, amount) {
1777
1589
  var _datamap;
1778
-
1779
1590
  for (var _len = arguments.length, elements = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
1780
1591
  elements[_key - 3] = arguments[_key];
1781
1592
  }
1782
-
1783
1593
  return (_datamap = datamap).spliceCol.apply(_datamap, [column, index, amount].concat(elements));
1784
1594
  };
1595
+
1785
1596
  /**
1786
1597
  * Adds/removes data from the row. This method works the same as Array.splice for arrays.
1787
1598
  *
@@ -1793,17 +1604,14 @@ function Core(rootElement, userSettings) {
1793
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.
1794
1605
  * @returns {Array} Returns removed portion of rows.
1795
1606
  */
1796
-
1797
-
1798
1607
  this.spliceRow = function (row, index, amount) {
1799
1608
  var _datamap2;
1800
-
1801
1609
  for (var _len2 = arguments.length, elements = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {
1802
1610
  elements[_key2 - 3] = arguments[_key2];
1803
1611
  }
1804
-
1805
1612
  return (_datamap2 = datamap).spliceRow.apply(_datamap2, [row, index, amount].concat(elements));
1806
1613
  };
1614
+
1807
1615
  /**
1808
1616
  * Returns indexes of the currently selected cells as an array of arrays `[[startRow, startCol, endRow, endCol],...]`.
1809
1617
  *
@@ -1817,18 +1625,17 @@ function Core(rootElement, userSettings) {
1817
1625
  * @function getSelected
1818
1626
  * @returns {Array[]|undefined} An array of arrays of the selection's coordinates.
1819
1627
  */
1820
-
1821
-
1822
1628
  this.getSelected = function () {
1823
1629
  // https://github.com/handsontable/handsontable/issues/44 //cjl
1824
1630
  if (selection.isSelected()) {
1825
1631
  return (0, _array.arrayMap)(selection.getSelectedRange(), function (_ref12) {
1826
1632
  var from = _ref12.from,
1827
- to = _ref12.to;
1633
+ to = _ref12.to;
1828
1634
  return [from.row, from.col, to.row, to.col];
1829
1635
  });
1830
1636
  }
1831
1637
  };
1638
+
1832
1639
  /**
1833
1640
  * Returns the last coordinates applied to the table as a an array `[startRow, startCol, endRow, endCol]`.
1834
1641
  *
@@ -1837,18 +1644,15 @@ function Core(rootElement, userSettings) {
1837
1644
  * @function getSelectedLast
1838
1645
  * @returns {Array|undefined} An array of the selection's coordinates.
1839
1646
  */
1840
-
1841
-
1842
1647
  this.getSelectedLast = function () {
1843
1648
  var selected = this.getSelected();
1844
1649
  var result;
1845
-
1846
1650
  if (selected && selected.length > 0) {
1847
1651
  result = selected[selected.length - 1];
1848
1652
  }
1849
-
1850
1653
  return result;
1851
1654
  };
1655
+
1852
1656
  /**
1853
1657
  * Returns the current selection as an array of CellRange objects.
1854
1658
  *
@@ -1860,14 +1664,13 @@ function Core(rootElement, userSettings) {
1860
1664
  * @function getSelectedRange
1861
1665
  * @returns {CellRange[]|undefined} Selected range object or undefined if there is no selection.
1862
1666
  */
1863
-
1864
-
1865
1667
  this.getSelectedRange = function () {
1866
1668
  // https://github.com/handsontable/handsontable/issues/44 //cjl
1867
1669
  if (selection.isSelected()) {
1868
1670
  return Array.from(selection.getSelectedRange());
1869
1671
  }
1870
1672
  };
1673
+
1871
1674
  /**
1872
1675
  * Returns the last coordinates applied to the table as a CellRange object.
1873
1676
  *
@@ -1876,18 +1679,15 @@ function Core(rootElement, userSettings) {
1876
1679
  * @since 0.36.0
1877
1680
  * @returns {CellRange|undefined} Selected range object or undefined` if there is no selection.
1878
1681
  */
1879
-
1880
-
1881
1682
  this.getSelectedRangeLast = function () {
1882
1683
  var selectedRange = this.getSelectedRange();
1883
1684
  var result;
1884
-
1885
1685
  if (selectedRange && selectedRange.length > 0) {
1886
1686
  result = selectedRange[selectedRange.length - 1];
1887
1687
  }
1888
-
1889
1688
  return result;
1890
1689
  };
1690
+
1891
1691
  /**
1892
1692
  * Erases content from cells that have been selected in the table.
1893
1693
  *
@@ -1896,15 +1696,11 @@ function Core(rootElement, userSettings) {
1896
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.
1897
1697
  * @since 0.36.0
1898
1698
  */
1899
-
1900
-
1901
1699
  this.emptySelectedCells = function (source) {
1902
1700
  var _this2 = this;
1903
-
1904
1701
  if (!selection.isSelected() || this.countRows() === 0 || this.countCols() === 0) {
1905
1702
  return;
1906
1703
  }
1907
-
1908
1704
  var changes = [];
1909
1705
  (0, _array.arrayEach)(selection.getSelectedRange(), function (cellRange) {
1910
1706
  var topStart = cellRange.getTopStartCorner();
@@ -1917,11 +1713,11 @@ function Core(rootElement, userSettings) {
1917
1713
  });
1918
1714
  });
1919
1715
  });
1920
-
1921
1716
  if (changes.length > 0) {
1922
1717
  this.setDataAtCell(changes, source);
1923
1718
  }
1924
1719
  };
1720
+
1925
1721
  /**
1926
1722
  * Checks if the table rendering process was suspended. See explanation in {@link Core#suspendRender}.
1927
1723
  *
@@ -1930,11 +1726,10 @@ function Core(rootElement, userSettings) {
1930
1726
  * @since 8.3.0
1931
1727
  * @returns {boolean}
1932
1728
  */
1933
-
1934
-
1935
1729
  this.isRenderSuspended = function () {
1936
1730
  return this.renderSuspendedCounter > 0;
1937
1731
  };
1732
+
1938
1733
  /**
1939
1734
  * Suspends the rendering process. It's helpful to wrap the table render
1940
1735
  * cycles triggered by API calls or UI actions (or both) and call the "render"
@@ -1949,14 +1744,17 @@ function Core(rootElement, userSettings) {
1949
1744
  * The method is intended to be used by advanced users. Suspending the rendering
1950
1745
  * process could cause visual glitches when wrongly implemented.
1951
1746
  *
1747
+ * Every [`suspendRender()`](@/api/core.md#suspendrender) call needs to correspond with one [`resumeRender()`](@/api/core.md#resumerender) call.
1748
+ * For example, if you call [`suspendRender()`](@/api/core.md#suspendrender) 5 times, you need to call [`resumeRender()`](@/api/core.md#resumerender) 5 times as well.
1749
+ *
1952
1750
  * @memberof Core#
1953
1751
  * @function suspendRender
1954
1752
  * @since 8.3.0
1955
1753
  * @example
1956
1754
  * ```js
1957
1755
  * hot.suspendRender();
1958
- * hot.alter('insert_row', 5, 45);
1959
- * hot.alter('insert_col', 10, 40);
1756
+ * hot.alter('insert_row_above', 5, 45);
1757
+ * hot.alter('insert_col_start', 10, 40);
1960
1758
  * hot.setDataAtCell(1, 1, 'John');
1961
1759
  * hot.setDataAtCell(2, 2, 'Mark');
1962
1760
  * hot.setDataAtCell(3, 3, 'Ann');
@@ -1966,11 +1764,10 @@ function Core(rootElement, userSettings) {
1966
1764
  * hot.resumeRender(); // It re-renders the table internally
1967
1765
  * ```
1968
1766
  */
1969
-
1970
-
1971
1767
  this.suspendRender = function () {
1972
1768
  this.renderSuspendedCounter += 1;
1973
1769
  };
1770
+
1974
1771
  /**
1975
1772
  * Resumes the rendering process. In combination with the {@link Core#suspendRender}
1976
1773
  * method it allows aggregating the table render cycles triggered by API calls or UI
@@ -1981,14 +1778,17 @@ function Core(rootElement, userSettings) {
1981
1778
  * The method is intended to be used by advanced users. Suspending the rendering
1982
1779
  * process could cause visual glitches when wrongly implemented.
1983
1780
  *
1781
+ * Every [`suspendRender()`](@/api/core.md#suspendrender) call needs to correspond with one [`resumeRender()`](@/api/core.md#resumerender) call.
1782
+ * For example, if you call [`suspendRender()`](@/api/core.md#suspendrender) 5 times, you need to call [`resumeRender()`](@/api/core.md#resumerender) 5 times as well.
1783
+ *
1984
1784
  * @memberof Core#
1985
1785
  * @function resumeRender
1986
1786
  * @since 8.3.0
1987
1787
  * @example
1988
1788
  * ```js
1989
1789
  * hot.suspendRender();
1990
- * hot.alter('insert_row', 5, 45);
1991
- * hot.alter('insert_col', 10, 40);
1790
+ * hot.alter('insert_row_above', 5, 45);
1791
+ * hot.alter('insert_col_start', 10, 40);
1992
1792
  * hot.setDataAtCell(1, 1, 'John');
1993
1793
  * hot.setDataAtCell(2, 2, 'Mark');
1994
1794
  * hot.setDataAtCell(3, 3, 'Ann');
@@ -1998,12 +1798,9 @@ function Core(rootElement, userSettings) {
1998
1798
  * hot.resumeRender(); // It re-renders the table internally
1999
1799
  * ```
2000
1800
  */
2001
-
2002
-
2003
1801
  this.resumeRender = function () {
2004
1802
  var nextValue = this.renderSuspendedCounter - 1;
2005
1803
  this.renderSuspendedCounter = Math.max(nextValue, 0);
2006
-
2007
1804
  if (!this.isRenderSuspended() && nextValue === this.renderSuspendedCounter) {
2008
1805
  if (this.renderCall) {
2009
1806
  this.render();
@@ -2012,6 +1809,7 @@ function Core(rootElement, userSettings) {
2012
1809
  }
2013
1810
  }
2014
1811
  };
1812
+
2015
1813
  /**
2016
1814
  * Rerender the table. Calling this method starts the process of recalculating, redrawing and applying the changes
2017
1815
  * to the DOM. While rendering the table all cell renderers are recalled.
@@ -2022,8 +1820,6 @@ function Core(rootElement, userSettings) {
2022
1820
  * @memberof Core#
2023
1821
  * @function render
2024
1822
  */
2025
-
2026
-
2027
1823
  this.render = function () {
2028
1824
  if (this.view) {
2029
1825
  this.renderCall = true;
@@ -2031,13 +1827,12 @@ function Core(rootElement, userSettings) {
2031
1827
 
2032
1828
  if (!this.isRenderSuspended()) {
2033
1829
  editorManager.lockEditor();
2034
-
2035
1830
  this._refreshBorders(null);
2036
-
2037
1831
  editorManager.unlockEditor();
2038
1832
  }
2039
1833
  }
2040
1834
  };
1835
+
2041
1836
  /**
2042
1837
  * The method aggregates multi-line API calls into a callback and postpones the
2043
1838
  * table rendering process. After the execution of the operations, the table is
@@ -2052,8 +1847,8 @@ function Core(rootElement, userSettings) {
2052
1847
  * @example
2053
1848
  * ```js
2054
1849
  * hot.batchRender(() => {
2055
- * hot.alter('insert_row', 5, 45);
2056
- * hot.alter('insert_col', 10, 40);
1850
+ * hot.alter('insert_row_above', 5, 45);
1851
+ * hot.alter('insert_col_start', 10, 40);
2057
1852
  * hot.setDataAtCell(1, 1, 'John');
2058
1853
  * hot.setDataAtCell(2, 2, 'Mark');
2059
1854
  * hot.setDataAtCell(3, 3, 'Ann');
@@ -2064,14 +1859,13 @@ function Core(rootElement, userSettings) {
2064
1859
  * });
2065
1860
  * ```
2066
1861
  */
2067
-
2068
-
2069
1862
  this.batchRender = function (wrappedOperations) {
2070
1863
  this.suspendRender();
2071
1864
  var result = wrappedOperations();
2072
1865
  this.resumeRender();
2073
1866
  return result;
2074
1867
  };
1868
+
2075
1869
  /**
2076
1870
  * Checks if the table indexes recalculation process was suspended. See explanation
2077
1871
  * in {@link Core#suspendExecution}.
@@ -2081,11 +1875,10 @@ function Core(rootElement, userSettings) {
2081
1875
  * @since 8.3.0
2082
1876
  * @returns {boolean}
2083
1877
  */
2084
-
2085
-
2086
1878
  this.isExecutionSuspended = function () {
2087
1879
  return this.executionSuspendedCounter > 0;
2088
1880
  };
1881
+
2089
1882
  /**
2090
1883
  * Suspends the execution process. It's helpful to wrap the table logic changes
2091
1884
  * such as index changes into one call after which the cache is updated. As a result,
@@ -2108,13 +1901,12 @@ function Core(rootElement, userSettings) {
2108
1901
  * hot.resumeExecution(); // It updates the cache internally
2109
1902
  * ```
2110
1903
  */
2111
-
2112
-
2113
1904
  this.suspendExecution = function () {
2114
1905
  this.executionSuspendedCounter += 1;
2115
1906
  this.columnIndexMapper.suspendOperations();
2116
1907
  this.rowIndexMapper.suspendOperations();
2117
1908
  };
1909
+
2118
1910
  /**
2119
1911
  * Resumes the execution process. In combination with the {@link Core#suspendExecution}
2120
1912
  * method it allows aggregating the table logic changes after which the cache is
@@ -2141,18 +1933,16 @@ function Core(rootElement, userSettings) {
2141
1933
  * hot.resumeExecution(); // It updates the cache internally
2142
1934
  * ```
2143
1935
  */
2144
-
2145
-
2146
1936
  this.resumeExecution = function () {
2147
1937
  var forceFlushChanges = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
2148
1938
  var nextValue = this.executionSuspendedCounter - 1;
2149
1939
  this.executionSuspendedCounter = Math.max(nextValue, 0);
2150
-
2151
1940
  if (!this.isExecutionSuspended() && nextValue === this.executionSuspendedCounter || forceFlushChanges) {
2152
1941
  this.columnIndexMapper.resumeOperations();
2153
1942
  this.rowIndexMapper.resumeOperations();
2154
1943
  }
2155
1944
  };
1945
+
2156
1946
  /**
2157
1947
  * The method aggregates multi-line API calls into a callback and postpones the
2158
1948
  * table execution process. After the execution of the operations, the internal table
@@ -2179,8 +1969,6 @@ function Core(rootElement, userSettings) {
2179
1969
  * });
2180
1970
  * ```
2181
1971
  */
2182
-
2183
-
2184
1972
  this.batchExecution = function (wrappedOperations) {
2185
1973
  var forceFlushChanges = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2186
1974
  this.suspendExecution();
@@ -2188,6 +1976,7 @@ function Core(rootElement, userSettings) {
2188
1976
  this.resumeExecution(forceFlushChanges);
2189
1977
  return result;
2190
1978
  };
1979
+
2191
1980
  /**
2192
1981
  * It batches the rendering process and index recalculations. The method aggregates
2193
1982
  * multi-line API calls into a callback and postpones the table rendering process
@@ -2204,8 +1993,8 @@ function Core(rootElement, userSettings) {
2204
1993
  * @example
2205
1994
  * ```js
2206
1995
  * hot.batch(() => {
2207
- * hot.alter('insert_row', 5, 45);
2208
- * hot.alter('insert_col', 10, 40);
1996
+ * hot.alter('insert_row_above', 5, 45);
1997
+ * hot.alter('insert_col_start', 10, 40);
2209
1998
  * hot.setDataAtCell(1, 1, 'x');
2210
1999
  * hot.setDataAtCell(2, 2, 'c');
2211
2000
  * hot.setDataAtCell(3, 3, 'v');
@@ -2222,8 +2011,6 @@ function Core(rootElement, userSettings) {
2222
2011
  * });
2223
2012
  * ```
2224
2013
  */
2225
-
2226
-
2227
2014
  this.batch = function (wrappedOperations) {
2228
2015
  this.suspendRender();
2229
2016
  this.suspendExecution();
@@ -2232,6 +2019,7 @@ function Core(rootElement, userSettings) {
2232
2019
  this.resumeRender();
2233
2020
  return result;
2234
2021
  };
2022
+
2235
2023
  /**
2236
2024
  * Updates dimensions of the table. The method compares previous dimensions with the current ones and updates accordingly.
2237
2025
  *
@@ -2240,21 +2028,16 @@ function Core(rootElement, userSettings) {
2240
2028
  * @fires Hooks#beforeRefreshDimensions
2241
2029
  * @fires Hooks#afterRefreshDimensions
2242
2030
  */
2243
-
2244
-
2245
2031
  this.refreshDimensions = function () {
2246
2032
  if (!instance.view) {
2247
2033
  return;
2248
2034
  }
2249
-
2250
2035
  var _instance$view$getLas = instance.view.getLastSize(),
2251
- lastWidth = _instance$view$getLas.width,
2252
- lastHeight = _instance$view$getLas.height;
2253
-
2036
+ lastWidth = _instance$view$getLas.width,
2037
+ lastHeight = _instance$view$getLas.height;
2254
2038
  var _instance$rootElement = instance.rootElement.getBoundingClientRect(),
2255
- width = _instance$rootElement.width,
2256
- height = _instance$rootElement.height;
2257
-
2039
+ width = _instance$rootElement.width,
2040
+ height = _instance$rootElement.height;
2258
2041
  var isSizeChanged = width !== lastWidth || height !== lastHeight;
2259
2042
  var isResizeBlocked = instance.runHooks('beforeRefreshDimensions', {
2260
2043
  width: lastWidth,
@@ -2263,16 +2046,13 @@ function Core(rootElement, userSettings) {
2263
2046
  width: width,
2264
2047
  height: height
2265
2048
  }, isSizeChanged) === false;
2266
-
2267
2049
  if (isResizeBlocked) {
2268
2050
  return;
2269
2051
  }
2270
-
2271
2052
  if (isSizeChanged || instance.view._wt.wtOverlays.scrollableElement === instance.rootWindow) {
2272
2053
  instance.view.setLastSize(width, height);
2273
2054
  instance.render();
2274
2055
  }
2275
-
2276
2056
  instance.runHooks('afterRefreshDimensions', {
2277
2057
  width: lastWidth,
2278
2058
  height: lastHeight
@@ -2281,6 +2061,7 @@ function Core(rootElement, userSettings) {
2281
2061
  height: height
2282
2062
  }, isSizeChanged);
2283
2063
  };
2064
+
2284
2065
  /**
2285
2066
  * The `updateData()` method replaces Handsontable's [`data`](@/api/options.md#data) with a new dataset.
2286
2067
  *
@@ -2304,11 +2085,8 @@ function Core(rootElement, userSettings) {
2304
2085
  * @fires Hooks#afterUpdateData
2305
2086
  * @fires Hooks#afterChange
2306
2087
  */
2307
-
2308
-
2309
2088
  this.updateData = function (data, source) {
2310
2089
  var _this3 = this;
2311
-
2312
2090
  (0, _dataMap.replaceData)(data, function (newDataMap) {
2313
2091
  datamap = newDataMap;
2314
2092
  }, function (newDataMap) {
@@ -2325,6 +2103,7 @@ function Core(rootElement, userSettings) {
2325
2103
  firstRun: firstRun
2326
2104
  });
2327
2105
  };
2106
+
2328
2107
  /**
2329
2108
  * The `loadData()` method replaces Handsontable's [`data`](@/api/options.md#data) with a new dataset.
2330
2109
  *
@@ -2347,8 +2126,6 @@ function Core(rootElement, userSettings) {
2347
2126
  * @fires Hooks#afterLoadData
2348
2127
  * @fires Hooks#afterChange
2349
2128
  */
2350
-
2351
-
2352
2129
  this.loadData = function (data, source) {
2353
2130
  (0, _dataMap.replaceData)(data, function (newDataMap) {
2354
2131
  datamap = newDataMap;
@@ -2356,7 +2133,6 @@ function Core(rootElement, userSettings) {
2356
2133
  metaManager.clearCellsCache();
2357
2134
  instance.initIndexMappers();
2358
2135
  grid.adjustRowsAndCols();
2359
-
2360
2136
  if (firstRun) {
2361
2137
  firstRun = [null, 'loadData'];
2362
2138
  }
@@ -2369,57 +2145,58 @@ function Core(rootElement, userSettings) {
2369
2145
  firstRun: firstRun
2370
2146
  });
2371
2147
  };
2148
+
2372
2149
  /**
2373
2150
  * Gets the initial column count, calculated based on the `columns` setting.
2374
2151
  *
2375
2152
  * @private
2376
2153
  * @returns {number} The calculated number of columns.
2377
2154
  */
2378
-
2379
-
2380
2155
  this.getInitialColumnCount = function () {
2381
2156
  var columnsSettings = tableMeta.columns;
2382
- var finalNrOfColumns = 0; // We will check number of columns when the `columns` property was defined as an array. Columns option may
2383
- // narrow down or expand displayed dataset in that case.
2157
+ var finalNrOfColumns = 0;
2384
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.
2385
2161
  if (Array.isArray(columnsSettings)) {
2386
2162
  finalNrOfColumns = columnsSettings.length;
2387
2163
  } else if ((0, _function.isFunction)(columnsSettings)) {
2388
2164
  if (instance.dataType === 'array') {
2389
2165
  var nrOfSourceColumns = this.countSourceCols();
2390
-
2391
2166
  for (var columnIndex = 0; columnIndex < nrOfSourceColumns; columnIndex += 1) {
2392
2167
  if (columnsSettings(columnIndex)) {
2393
2168
  finalNrOfColumns += 1;
2394
2169
  }
2395
- } // Extended dataset by the `columns` property? Moved code right from the refactored `countCols` method.
2170
+ }
2396
2171
 
2172
+ // Extended dataset by the `columns` property? Moved code right from the refactored `countCols` method.
2397
2173
  } else if (instance.dataType === 'object' || instance.dataType === 'function') {
2398
2174
  finalNrOfColumns = datamap.colToPropCache.length;
2399
- } // In some cases we need to check columns length from the schema, i.e. `data` may be empty.
2175
+ }
2400
2176
 
2177
+ // In some cases we need to check columns length from the schema, i.e. `data` may be empty.
2401
2178
  } else if ((0, _mixed.isDefined)(tableMeta.dataSchema)) {
2402
- var schema = datamap.getSchema(); // Schema may be defined as an array of objects. Each object will define column.
2179
+ var schema = datamap.getSchema();
2403
2180
 
2181
+ // Schema may be defined as an array of objects. Each object will define column.
2404
2182
  finalNrOfColumns = Array.isArray(schema) ? schema.length : (0, _object.deepObjectSize)(schema);
2405
2183
  } else {
2406
2184
  // We init index mappers by length of source data to provide indexes also for skipped indexes.
2407
2185
  finalNrOfColumns = this.countSourceCols();
2408
2186
  }
2409
-
2410
2187
  return finalNrOfColumns;
2411
2188
  };
2189
+
2412
2190
  /**
2413
2191
  * Init index mapper which manage indexes assigned to the data.
2414
2192
  *
2415
2193
  * @private
2416
2194
  */
2417
-
2418
-
2419
2195
  this.initIndexMappers = function () {
2420
2196
  this.columnIndexMapper.initToLength(this.getInitialColumnCount());
2421
2197
  this.rowIndexMapper.initToLength(this.countSourceRows());
2422
2198
  };
2199
+
2423
2200
  /**
2424
2201
  * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method,
2425
2202
  * unless some modifications have been applied (i.e. Sequence of rows/columns was changed, some row/column was skipped).
@@ -2444,15 +2221,13 @@ function Core(rootElement, userSettings) {
2444
2221
  * hot.getData(2, 1, 3, 3);
2445
2222
  * ```
2446
2223
  */
2447
-
2448
-
2449
2224
  this.getData = function (row, column, row2, column2) {
2450
2225
  if ((0, _mixed.isUndefined)(row)) {
2451
2226
  return datamap.getAll();
2452
2227
  }
2453
-
2454
2228
  return datamap.getRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2), datamap.DESTINATION_RENDERER);
2455
2229
  };
2230
+
2456
2231
  /**
2457
2232
  * Returns a string value of the selected range. Each column is separated by tab, each row is separated by a new
2458
2233
  * line character.
@@ -2465,11 +2240,10 @@ function Core(rootElement, userSettings) {
2465
2240
  * @param {number} endCol To visual column index.
2466
2241
  * @returns {string}
2467
2242
  */
2468
-
2469
-
2470
2243
  this.getCopyableText = function (startRow, startCol, endRow, endCol) {
2471
2244
  return datamap.getCopyableText(instance._createCellCoords(startRow, startCol), instance._createCellCoords(endRow, endCol));
2472
2245
  };
2246
+
2473
2247
  /**
2474
2248
  * Returns the data's copyable value at specified `row` and `column` index.
2475
2249
  *
@@ -2479,11 +2253,10 @@ function Core(rootElement, userSettings) {
2479
2253
  * @param {number} column Visual column index.
2480
2254
  * @returns {string}
2481
2255
  */
2482
-
2483
-
2484
2256
  this.getCopyableData = function (row, column) {
2485
2257
  return datamap.getCopyable(row, datamap.colToProp(column));
2486
2258
  };
2259
+
2487
2260
  /**
2488
2261
  * Returns schema provided by constructor settings. If it doesn't exist then it returns the schema based on the data
2489
2262
  * structure in the first row.
@@ -2492,11 +2265,10 @@ function Core(rootElement, userSettings) {
2492
2265
  * @function getSchema
2493
2266
  * @returns {object} Schema object.
2494
2267
  */
2495
-
2496
-
2497
2268
  this.getSchema = function () {
2498
2269
  return datamap.getSchema();
2499
2270
  };
2271
+
2500
2272
  /**
2501
2273
  * Use it if you need to change configuration after initialization. The `settings` argument is an object containing the changed
2502
2274
  * settings, declared the same way as in the initial settings object.
@@ -2525,37 +2297,32 @@ function Core(rootElement, userSettings) {
2525
2297
  * @fires Hooks#afterCellMetaReset
2526
2298
  * @fires Hooks#afterUpdateSettings
2527
2299
  */
2528
-
2529
-
2530
2300
  this.updateSettings = function (settings) {
2531
2301
  var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2532
2302
  var dataUpdateFunction = (firstRun ? instance.loadData : instance.updateData).bind(this);
2533
2303
  var columnsAsFunc = false;
2534
2304
  var i;
2535
2305
  var j;
2536
-
2537
2306
  if ((0, _mixed.isDefined)(settings.rows)) {
2538
2307
  throw new Error('The "rows" setting is no longer supported. Do you mean startRows, minRows or maxRows?');
2539
2308
  }
2540
-
2541
2309
  if ((0, _mixed.isDefined)(settings.cols)) {
2542
2310
  throw new Error('The "cols" setting is no longer supported. Do you mean startCols, minCols or maxCols?');
2543
2311
  }
2544
-
2545
2312
  if ((0, _mixed.isDefined)(settings.ganttChart)) {
2546
2313
  throw new Error('Since 8.0.0 the "ganttChart" setting is no longer supported.');
2547
- } // eslint-disable-next-line no-restricted-syntax
2548
-
2314
+ }
2549
2315
 
2316
+ // eslint-disable-next-line no-restricted-syntax
2550
2317
  for (i in settings) {
2551
- if (i === 'data') {// Do nothing. loadData will be triggered later
2318
+ if (i === 'data') {
2319
+ // Do nothing. loadData will be triggered later
2552
2320
  } else if (i === 'language') {
2553
2321
  setLanguage(settings.language);
2554
2322
  } else if (i === 'className') {
2555
2323
  setClassName('className', settings.className);
2556
2324
  } else if (i === 'tableClassName' && instance.table) {
2557
2325
  setClassName('tableClassName', settings.tableClassName);
2558
-
2559
2326
  instance.view._wt.wtOverlays.syncOverlayTableClassNames();
2560
2327
  } else if (_pluginHooks.default.getSingleton().isRegistered(i) || _pluginHooks.default.getSingleton().isDeprecated(i)) {
2561
2328
  if ((0, _function.isFunction)(settings[i]) || Array.isArray(settings[i])) {
@@ -2566,76 +2333,65 @@ function Core(rootElement, userSettings) {
2566
2333
  // Update settings
2567
2334
  globalMeta[i] = settings[i];
2568
2335
  }
2569
- } // Load data or create data map
2570
-
2336
+ }
2571
2337
 
2338
+ // Load data or create data map
2572
2339
  if (settings.data === void 0 && tableMeta.data === void 0) {
2573
2340
  dataUpdateFunction(null, 'updateSettings'); // data source created just now
2574
2341
  } else if (settings.data !== void 0) {
2575
2342
  dataUpdateFunction(settings.data, 'updateSettings'); // data source given as option
2576
2343
  } else if (settings.columns !== void 0) {
2577
- datamap.createMap(); // The `column` property has changed - dataset may be expanded or narrowed down. The `loadData` do the same.
2344
+ datamap.createMap();
2578
2345
 
2346
+ // The `column` property has changed - dataset may be expanded or narrowed down. The `loadData` do the same.
2579
2347
  instance.initIndexMappers();
2580
2348
  }
2581
-
2582
2349
  var clen = instance.countCols();
2583
- var columnSetting = tableMeta.columns; // Init columns constructors configuration
2350
+ var columnSetting = tableMeta.columns;
2584
2351
 
2352
+ // Init columns constructors configuration
2585
2353
  if (columnSetting && (0, _function.isFunction)(columnSetting)) {
2586
2354
  columnsAsFunc = true;
2587
- } // Clear cell meta cache
2588
-
2355
+ }
2589
2356
 
2357
+ // Clear cell meta cache
2590
2358
  if (settings.cell !== void 0 || settings.cells !== void 0 || settings.columns !== void 0) {
2591
2359
  metaManager.clearCache();
2592
2360
  }
2593
-
2594
2361
  if (clen > 0) {
2595
2362
  for (i = 0, j = 0; i < clen; i++) {
2596
2363
  // Use settings provided by user
2597
2364
  if (columnSetting) {
2598
2365
  var column = columnsAsFunc ? columnSetting(i) : columnSetting[j];
2599
-
2600
2366
  if (column) {
2601
2367
  metaManager.updateColumnMeta(j, column);
2602
2368
  }
2603
2369
  }
2604
-
2605
2370
  j += 1;
2606
2371
  }
2607
2372
  }
2608
-
2609
2373
  if ((0, _mixed.isDefined)(settings.cell)) {
2610
2374
  (0, _object.objectEach)(settings.cell, function (cell) {
2611
2375
  instance.setCellMetaObject(cell.row, cell.col, cell);
2612
2376
  });
2613
2377
  }
2614
-
2615
2378
  instance.runHooks('afterCellMetaReset');
2616
2379
  var currentHeight = instance.rootElement.style.height;
2617
-
2618
2380
  if (currentHeight !== '') {
2619
2381
  currentHeight = parseInt(instance.rootElement.style.height, 10);
2620
2382
  }
2621
-
2622
2383
  var height = settings.height;
2623
-
2624
2384
  if ((0, _function.isFunction)(height)) {
2625
2385
  height = height();
2626
2386
  }
2627
-
2628
2387
  if (init) {
2629
2388
  var initialStyle = instance.rootElement.getAttribute('style');
2630
-
2631
2389
  if (initialStyle) {
2632
2390
  instance.rootElement.setAttribute('data-initialstyle', instance.rootElement.getAttribute('style'));
2633
2391
  }
2634
2392
  }
2635
-
2636
2393
  if (height === null) {
2637
2394
  var _initialStyle = instance.rootElement.getAttribute('data-initialstyle');
2638
-
2639
2395
  if (_initialStyle && (_initialStyle.indexOf('height') > -1 || _initialStyle.indexOf('overflow') > -1)) {
2640
2396
  instance.rootElement.setAttribute('style', _initialStyle);
2641
2397
  } else {
@@ -2646,45 +2402,33 @@ function Core(rootElement, userSettings) {
2646
2402
  instance.rootElement.style.height = isNaN(height) ? "".concat(height) : "".concat(height, "px");
2647
2403
  instance.rootElement.style.overflow = 'hidden';
2648
2404
  }
2649
-
2650
2405
  if (typeof settings.width !== 'undefined') {
2651
2406
  var width = settings.width;
2652
-
2653
2407
  if ((0, _function.isFunction)(width)) {
2654
2408
  width = width();
2655
2409
  }
2656
-
2657
2410
  instance.rootElement.style.width = isNaN(width) ? "".concat(width) : "".concat(width, "px");
2658
2411
  }
2659
-
2660
2412
  if (!init) {
2661
2413
  if (instance.view) {
2662
2414
  instance.view._wt.wtViewport.resetHasOversizedColumnHeadersMarked();
2663
-
2664
2415
  instance.view._wt.exportSettingsAsClassNames();
2665
2416
  }
2666
-
2667
2417
  instance.runHooks('afterUpdateSettings', settings);
2668
2418
  }
2669
-
2670
2419
  grid.adjustRowsAndCols();
2671
-
2672
2420
  if (instance.view && !firstRun) {
2673
2421
  instance.forceFullRender = true; // used when data was changed
2674
-
2675
2422
  editorManager.lockEditor();
2676
-
2677
2423
  instance._refreshBorders(null);
2678
-
2679
2424
  instance.view._wt.wtOverlays.adjustElementsSize();
2680
-
2681
2425
  editorManager.unlockEditor();
2682
2426
  }
2683
-
2684
2427
  if (!init && instance.view && (currentHeight === '' || height === '' || height === void 0) && currentHeight !== height) {
2685
2428
  instance.view._wt.wtOverlays.updateMainScrollableElements();
2686
2429
  }
2687
2430
  };
2431
+
2688
2432
  /**
2689
2433
  * Get value from the selected cell.
2690
2434
  *
@@ -2692,11 +2436,8 @@ function Core(rootElement, userSettings) {
2692
2436
  * @function getValue
2693
2437
  * @returns {*} Value of selected cell.
2694
2438
  */
2695
-
2696
-
2697
2439
  this.getValue = function () {
2698
2440
  var sel = instance.getSelectedLast();
2699
-
2700
2441
  if (tableMeta.getValue) {
2701
2442
  if ((0, _function.isFunction)(tableMeta.getValue)) {
2702
2443
  return tableMeta.getValue.call(instance);
@@ -2707,6 +2448,7 @@ function Core(rootElement, userSettings) {
2707
2448
  return instance.getDataAtCell(sel[0], sel[1]);
2708
2449
  }
2709
2450
  };
2451
+
2710
2452
  /**
2711
2453
  * Returns the object settings.
2712
2454
  *
@@ -2714,58 +2456,94 @@ function Core(rootElement, userSettings) {
2714
2456
  * @function getSettings
2715
2457
  * @returns {TableMeta} Object containing the current table settings.
2716
2458
  */
2717
-
2718
-
2719
2459
  this.getSettings = function () {
2720
2460
  return tableMeta;
2721
2461
  };
2462
+
2722
2463
  /**
2723
2464
  * Clears the data from the table (the table settings remain intact).
2724
2465
  *
2725
2466
  * @memberof Core#
2726
2467
  * @function clear
2727
2468
  */
2728
-
2729
-
2730
2469
  this.clear = function () {
2731
2470
  this.selectAll();
2732
2471
  this.emptySelectedCells();
2733
2472
  };
2473
+
2734
2474
  /**
2735
- * Allows altering the table structure by either inserting/removing rows or columns.
2736
- * 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).
2737
2500
  *
2738
2501
  * @memberof Core#
2739
2502
  * @function alter
2740
- * @param {string} action Possible alter operations:
2741
- * <ul>
2742
- * <li> `'insert_row'` </li>
2743
- * <li> `'insert_col'` </li>
2744
- * <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>
2745
2510
  * <li> `'remove_col'` </li>
2746
- * </ul>.
2747
- * @param {number|number[]} index Visual index of the row/column before which the new row/column will be
2748
- * inserted/removed or an array of arrays in format `[[index, amount],...]`.
2749
- * @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`).
2750
2517
  * @param {string} [source] Source indicator.
2751
- * @param {boolean} [keepEmptyRows] Flag for preventing deletion of empty rows.
2518
+ * @param {boolean} [keepEmptyRows] If set to `true`: prevents removing empty rows.
2752
2519
  * @example
2753
2520
  * ```js
2754
- * // Insert new row above the row at given visual index.
2755
- * hot.alter('insert_row', 10);
2756
- * // Insert 3 new columns before 10th column.
2757
- * hot.alter('insert_col', 10, 3);
2758
- * // 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)
2759
2536
  * hot.alter('remove_row', 10, 2);
2760
- * // 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)
2761
2540
  * hot.alter('remove_row', [[1, 3], [5, 2]]);
2762
2541
  * ```
2763
2542
  */
2764
-
2765
-
2766
2543
  this.alter = function (action, index, amount, source, keepEmptyRows) {
2767
2544
  grid.alter(action, index, amount, source, keepEmptyRows);
2768
2545
  };
2546
+
2769
2547
  /**
2770
2548
  * Returns a TD element for the given `row` and `column` arguments, if it is rendered on screen.
2771
2549
  * Returns `null` if the TD is not rendered on screen (probably because that part of the table is not visible).
@@ -2778,36 +2556,29 @@ function Core(rootElement, userSettings) {
2778
2556
  * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.
2779
2557
  * @returns {HTMLTableCellElement|null} The cell's TD element.
2780
2558
  */
2781
-
2782
-
2783
2559
  this.getCell = function (row, column) {
2784
2560
  var topmost = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2785
2561
  var renderableColumnIndex = column; // Handling also column headers.
2786
-
2787
2562
  var renderableRowIndex = row; // Handling also row headers.
2788
2563
 
2789
2564
  if (column >= 0) {
2790
2565
  if (this.columnIndexMapper.isHidden(this.toPhysicalColumn(column))) {
2791
2566
  return null;
2792
2567
  }
2793
-
2794
2568
  renderableColumnIndex = this.columnIndexMapper.getRenderableFromVisualIndex(column);
2795
2569
  }
2796
-
2797
2570
  if (row >= 0) {
2798
2571
  if (this.rowIndexMapper.isHidden(this.toPhysicalRow(row))) {
2799
2572
  return null;
2800
2573
  }
2801
-
2802
2574
  renderableRowIndex = this.rowIndexMapper.getRenderableFromVisualIndex(row);
2803
2575
  }
2804
-
2805
2576
  if (renderableRowIndex === null || renderableColumnIndex === null) {
2806
2577
  return null;
2807
2578
  }
2808
-
2809
2579
  return instance.view.getCellAtCoords(instance._createCellCoords(renderableRowIndex, renderableColumnIndex), topmost);
2810
2580
  };
2581
+
2811
2582
  /**
2812
2583
  * Returns the coordinates of the cell, provided as a HTML table cell element.
2813
2584
  *
@@ -2821,30 +2592,24 @@ function Core(rootElement, userSettings) {
2821
2592
  * // it returns CellCoords object instance with props row: 1 and col: 1.
2822
2593
  * ```
2823
2594
  */
2824
-
2825
-
2826
2595
  this.getCoords = function (element) {
2827
2596
  var renderableCoords = this.view._wt.wtTable.getCoords(element);
2828
-
2829
2597
  if (renderableCoords === null) {
2830
2598
  return null;
2831
2599
  }
2832
-
2833
2600
  var renderableRow = renderableCoords.row,
2834
- renderableColumn = renderableCoords.col;
2601
+ renderableColumn = renderableCoords.col;
2835
2602
  var visualRow = renderableRow;
2836
2603
  var visualColumn = renderableColumn;
2837
-
2838
2604
  if (renderableRow >= 0) {
2839
2605
  visualRow = this.rowIndexMapper.getVisualFromRenderableIndex(renderableRow);
2840
2606
  }
2841
-
2842
2607
  if (renderableColumn >= 0) {
2843
2608
  visualColumn = this.columnIndexMapper.getVisualFromRenderableIndex(renderableColumn);
2844
2609
  }
2845
-
2846
2610
  return instance._createCellCoords(visualRow, visualColumn);
2847
2611
  };
2612
+
2848
2613
  /**
2849
2614
  * Returns the property name that corresponds with the given column index.
2850
2615
  * If the data source is an array of arrays, it returns the columns index.
@@ -2854,11 +2619,10 @@ function Core(rootElement, userSettings) {
2854
2619
  * @param {number} column Visual column index.
2855
2620
  * @returns {string|number} Column property or physical column index.
2856
2621
  */
2857
-
2858
-
2859
2622
  this.colToProp = function (column) {
2860
2623
  return datamap.colToProp(column);
2861
2624
  };
2625
+
2862
2626
  /**
2863
2627
  * Returns column index that corresponds with the given property.
2864
2628
  *
@@ -2867,11 +2631,10 @@ function Core(rootElement, userSettings) {
2867
2631
  * @param {string|number} prop Property name or physical column index.
2868
2632
  * @returns {number} Visual column index.
2869
2633
  */
2870
-
2871
-
2872
2634
  this.propToCol = function (prop) {
2873
2635
  return datamap.propToCol(prop);
2874
2636
  };
2637
+
2875
2638
  /**
2876
2639
  * Translate physical row index into visual.
2877
2640
  *
@@ -2883,11 +2646,10 @@ function Core(rootElement, userSettings) {
2883
2646
  * @param {number} row Physical row index.
2884
2647
  * @returns {number} Returns visual row index.
2885
2648
  */
2886
-
2887
-
2888
2649
  this.toVisualRow = function (row) {
2889
2650
  return _this.rowIndexMapper.getVisualFromPhysicalIndex(row);
2890
2651
  };
2652
+
2891
2653
  /**
2892
2654
  * Translate physical column index into visual.
2893
2655
  *
@@ -2899,11 +2661,10 @@ function Core(rootElement, userSettings) {
2899
2661
  * @param {number} column Physical column index.
2900
2662
  * @returns {number} Returns visual column index.
2901
2663
  */
2902
-
2903
-
2904
2664
  this.toVisualColumn = function (column) {
2905
2665
  return _this.columnIndexMapper.getVisualFromPhysicalIndex(column);
2906
2666
  };
2667
+
2907
2668
  /**
2908
2669
  * Translate visual row index into physical.
2909
2670
  *
@@ -2915,11 +2676,10 @@ function Core(rootElement, userSettings) {
2915
2676
  * @param {number} row Visual row index.
2916
2677
  * @returns {number} Returns physical row index.
2917
2678
  */
2918
-
2919
-
2920
2679
  this.toPhysicalRow = function (row) {
2921
2680
  return _this.rowIndexMapper.getPhysicalFromVisualIndex(row);
2922
2681
  };
2682
+
2923
2683
  /**
2924
2684
  * Translate visual column index into physical.
2925
2685
  *
@@ -2931,11 +2691,10 @@ function Core(rootElement, userSettings) {
2931
2691
  * @param {number} column Visual column index.
2932
2692
  * @returns {number} Returns physical column index.
2933
2693
  */
2934
-
2935
-
2936
2694
  this.toPhysicalColumn = function (column) {
2937
2695
  return _this.columnIndexMapper.getPhysicalFromVisualIndex(column);
2938
2696
  };
2697
+
2939
2698
  /**
2940
2699
  * @description
2941
2700
  * Returns the cell value at `row`, `column`.
@@ -2948,11 +2707,10 @@ function Core(rootElement, userSettings) {
2948
2707
  * @param {number} column Visual column index.
2949
2708
  * @returns {*} Data at cell.
2950
2709
  */
2951
-
2952
-
2953
2710
  this.getDataAtCell = function (row, column) {
2954
2711
  return datamap.get(row, datamap.colToProp(column));
2955
2712
  };
2713
+
2956
2714
  /**
2957
2715
  * Returns value at visual `row` and `prop` indexes.
2958
2716
  *
@@ -2964,11 +2722,10 @@ function Core(rootElement, userSettings) {
2964
2722
  * @param {string} prop Property name.
2965
2723
  * @returns {*} Cell value.
2966
2724
  */
2967
-
2968
-
2969
2725
  this.getDataAtRowProp = function (row, prop) {
2970
2726
  return datamap.get(row, prop);
2971
2727
  };
2728
+
2972
2729
  /**
2973
2730
  * @description
2974
2731
  * Returns array of column values from the data source.
@@ -2980,13 +2737,11 @@ function Core(rootElement, userSettings) {
2980
2737
  * @param {number} column Visual column index.
2981
2738
  * @returns {Array} Array of cell values.
2982
2739
  */
2983
-
2984
-
2985
2740
  this.getDataAtCol = function (column) {
2986
2741
  var _ref13;
2987
-
2988
2742
  return (_ref13 = []).concat.apply(_ref13, _toConsumableArray(datamap.getRange(instance._createCellCoords(0, column), instance._createCellCoords(tableMeta.data.length - 1, column), datamap.DESTINATION_RENDERER)));
2989
2743
  };
2744
+
2990
2745
  /**
2991
2746
  * Given the object property name (e.g. `'first.name'` or `'0'`), returns an array of column's values from the table data.
2992
2747
  * You can also provide a column index as the first argument.
@@ -2997,14 +2752,12 @@ function Core(rootElement, userSettings) {
2997
2752
  * @returns {Array} Array of cell values.
2998
2753
  */
2999
2754
  // TODO: Getting data from `datamap` should work on visual indexes.
3000
-
3001
-
3002
2755
  this.getDataAtProp = function (prop) {
3003
2756
  var _ref14;
3004
-
3005
2757
  var range = datamap.getRange(instance._createCellCoords(0, datamap.propToCol(prop)), instance._createCellCoords(tableMeta.data.length - 1, datamap.propToCol(prop)), datamap.DESTINATION_RENDERER);
3006
2758
  return (_ref14 = []).concat.apply(_ref14, _toConsumableArray(range));
3007
2759
  };
2760
+
3008
2761
  /**
3009
2762
  * Returns a clone of the source data object.
3010
2763
  * Optionally you can provide a cell range by using the `row`, `column`, `row2`, `column2` arguments, to get only a
@@ -3021,19 +2774,16 @@ function Core(rootElement, userSettings) {
3021
2774
  * @param {number} [column2] To physical column index (or visual index, if data type is an array of objects).
3022
2775
  * @returns {Array[]|object[]} The table data.
3023
2776
  */
3024
-
3025
-
3026
2777
  this.getSourceData = function (row, column, row2, column2) {
3027
2778
  var data;
3028
-
3029
2779
  if (row === void 0) {
3030
2780
  data = dataSource.getData();
3031
2781
  } else {
3032
2782
  data = dataSource.getByRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2));
3033
2783
  }
3034
-
3035
2784
  return data;
3036
2785
  };
2786
+
3037
2787
  /**
3038
2788
  * Returns the source data object as an arrays of arrays format even when source data was provided in another format.
3039
2789
  * Optionally you can provide a cell range by using the `row`, `column`, `row2`, `column2` arguments, to get only a
@@ -3050,19 +2800,16 @@ function Core(rootElement, userSettings) {
3050
2800
  * @param {number} [column2] To physical column index (or visual index, if data type is an array of objects).
3051
2801
  * @returns {Array} An array of arrays.
3052
2802
  */
3053
-
3054
-
3055
2803
  this.getSourceDataArray = function (row, column, row2, column2) {
3056
2804
  var data;
3057
-
3058
2805
  if (row === void 0) {
3059
2806
  data = dataSource.getData(true);
3060
2807
  } else {
3061
2808
  data = dataSource.getByRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2), true);
3062
2809
  }
3063
-
3064
2810
  return data;
3065
2811
  };
2812
+
3066
2813
  /**
3067
2814
  * Returns an array of column values from the data source.
3068
2815
  *
@@ -3072,13 +2819,11 @@ function Core(rootElement, userSettings) {
3072
2819
  * @returns {Array} Array of the column's cell values.
3073
2820
  */
3074
2821
  // TODO: Getting data from `sourceData` should work always on physical indexes.
3075
-
3076
-
3077
2822
  this.getSourceDataAtCol = function (column) {
3078
2823
  return dataSource.getAtColumn(column);
3079
2824
  };
3080
- /* eslint-disable jsdoc/require-param */
3081
2825
 
2826
+ /* eslint-disable jsdoc/require-param */
3082
2827
  /**
3083
2828
  * Set the provided value in the source data set at the provided coordinates.
3084
2829
  *
@@ -3089,47 +2834,39 @@ function Core(rootElement, userSettings) {
3089
2834
  * @param {*} value The value to be set at the provided coordinates.
3090
2835
  * @param {string} [source] Source of the change as a string.
3091
2836
  */
3092
-
3093
2837
  /* eslint-enable jsdoc/require-param */
3094
-
3095
-
3096
2838
  this.setSourceDataAtCell = function (row, column, value, source) {
3097
2839
  var input = setDataInputToArray(row, column, value);
3098
2840
  var isThereAnySetSourceListener = this.hasHook('afterSetSourceDataAtCell');
3099
2841
  var changesForHook = [];
3100
-
3101
2842
  if (isThereAnySetSourceListener) {
3102
2843
  (0, _array.arrayEach)(input, function (_ref15) {
3103
2844
  var _ref16 = _slicedToArray(_ref15, 3),
3104
- changeRow = _ref16[0],
3105
- changeProp = _ref16[1],
3106
- changeValue = _ref16[2];
3107
-
3108
- 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.
3109
2850
  changeValue]);
3110
2851
  });
3111
2852
  }
3112
-
3113
2853
  (0, _array.arrayEach)(input, function (_ref17) {
3114
2854
  var _ref18 = _slicedToArray(_ref17, 3),
3115
- changeRow = _ref18[0],
3116
- changeProp = _ref18[1],
3117
- changeValue = _ref18[2];
3118
-
2855
+ changeRow = _ref18[0],
2856
+ changeProp = _ref18[1],
2857
+ changeValue = _ref18[2];
3119
2858
  dataSource.setAtCell(changeRow, changeProp, changeValue);
3120
2859
  });
3121
-
3122
2860
  if (isThereAnySetSourceListener) {
3123
2861
  this.runHooks('afterSetSourceDataAtCell', changesForHook, source);
3124
2862
  }
3125
-
3126
2863
  this.render();
3127
2864
  var activeEditor = instance.getActiveEditor();
3128
-
3129
2865
  if (activeEditor && (0, _mixed.isDefined)(activeEditor.refreshValue)) {
3130
2866
  activeEditor.refreshValue();
3131
2867
  }
3132
2868
  };
2869
+
3133
2870
  /**
3134
2871
  * Returns a single row of the data (array or object, depending on what data format you use).
3135
2872
  *
@@ -3141,11 +2878,10 @@ function Core(rootElement, userSettings) {
3141
2878
  * @param {number} row Physical row index.
3142
2879
  * @returns {Array|object} Single row of data.
3143
2880
  */
3144
-
3145
-
3146
2881
  this.getSourceDataAtRow = function (row) {
3147
2882
  return dataSource.getAtRow(row);
3148
2883
  };
2884
+
3149
2885
  /**
3150
2886
  * Returns a single value from the data source.
3151
2887
  *
@@ -3156,11 +2892,10 @@ function Core(rootElement, userSettings) {
3156
2892
  * @returns {*} Cell data.
3157
2893
  */
3158
2894
  // TODO: Getting data from `sourceData` should work always on physical indexes.
3159
-
3160
-
3161
2895
  this.getSourceDataAtCell = function (row, column) {
3162
2896
  return dataSource.getAtCell(row, column);
3163
2897
  };
2898
+
3164
2899
  /**
3165
2900
  * @description
3166
2901
  * Returns a single row of the data.
@@ -3172,12 +2907,11 @@ function Core(rootElement, userSettings) {
3172
2907
  * @param {number} row Visual row index.
3173
2908
  * @returns {Array} Array of row's cell data.
3174
2909
  */
3175
-
3176
-
3177
2910
  this.getDataAtRow = function (row) {
3178
2911
  var data = datamap.getRange(instance._createCellCoords(row, 0), instance._createCellCoords(row, this.countCols() - 1), datamap.DESTINATION_RENDERER);
3179
2912
  return data[0] || [];
3180
2913
  };
2914
+
3181
2915
  /**
3182
2916
  * @description
3183
2917
  * Returns a data type defined in the Handsontable settings under the `type` key ({@link Options#type}).
@@ -3193,41 +2927,32 @@ function Core(rootElement, userSettings) {
3193
2927
  * @param {number} columnTo To visual column index.
3194
2928
  * @returns {string} Cell type (e.q: `'mixed'`, `'text'`, `'numeric'`, `'autocomplete'`).
3195
2929
  */
3196
-
3197
-
3198
2930
  this.getDataType = function (rowFrom, columnFrom, rowTo, columnTo) {
3199
2931
  var _this4 = this;
3200
-
3201
2932
  var coords = rowFrom === void 0 ? [0, 0, this.countRows(), this.countCols()] : [rowFrom, columnFrom, rowTo, columnTo];
3202
2933
  var rowStart = coords[0],
3203
- columnStart = coords[1];
2934
+ columnStart = coords[1];
3204
2935
  var rowEnd = coords[2],
3205
- columnEnd = coords[3];
2936
+ columnEnd = coords[3];
3206
2937
  var previousType = null;
3207
2938
  var currentType = null;
3208
-
3209
2939
  if (rowEnd === void 0) {
3210
2940
  rowEnd = rowStart;
3211
2941
  }
3212
-
3213
2942
  if (columnEnd === void 0) {
3214
2943
  columnEnd = columnStart;
3215
2944
  }
3216
-
3217
2945
  var type = 'mixed';
3218
2946
  (0, _number.rangeEach)(Math.max(Math.min(rowStart, rowEnd), 0), Math.max(rowStart, rowEnd), function (row) {
3219
2947
  var isTypeEqual = true;
3220
2948
  (0, _number.rangeEach)(Math.max(Math.min(columnStart, columnEnd), 0), Math.max(columnStart, columnEnd), function (column) {
3221
2949
  var cellType = _this4.getCellMeta(row, column);
3222
-
3223
2950
  currentType = cellType.type;
3224
-
3225
2951
  if (previousType) {
3226
2952
  isTypeEqual = previousType === currentType;
3227
2953
  } else {
3228
2954
  previousType = currentType;
3229
2955
  }
3230
-
3231
2956
  return isTypeEqual;
3232
2957
  });
3233
2958
  type = isTypeEqual ? currentType : 'mixed';
@@ -3235,6 +2960,7 @@ function Core(rootElement, userSettings) {
3235
2960
  });
3236
2961
  return type;
3237
2962
  };
2963
+
3238
2964
  /**
3239
2965
  * Remove a property defined by the `key` argument from the cell meta object for the provided `row` and `column` coordinates.
3240
2966
  *
@@ -3246,22 +2972,19 @@ function Core(rootElement, userSettings) {
3246
2972
  * @fires Hooks#beforeRemoveCellMeta
3247
2973
  * @fires Hooks#afterRemoveCellMeta
3248
2974
  */
3249
-
3250
-
3251
2975
  this.removeCellMeta = function (row, column, key) {
3252
2976
  var _ref19 = [this.toPhysicalRow(row), this.toPhysicalColumn(column)],
3253
- physicalRow = _ref19[0],
3254
- physicalColumn = _ref19[1];
2977
+ physicalRow = _ref19[0],
2978
+ physicalColumn = _ref19[1];
3255
2979
  var cachedValue = metaManager.getCellMetaKeyValue(physicalRow, physicalColumn, key);
3256
2980
  var hookResult = instance.runHooks('beforeRemoveCellMeta', row, column, key, cachedValue);
3257
-
3258
2981
  if (hookResult !== false) {
3259
2982
  metaManager.removeCellMeta(physicalRow, physicalColumn, key);
3260
2983
  instance.runHooks('afterRemoveCellMeta', row, column, key, cachedValue);
3261
2984
  }
3262
-
3263
2985
  cachedValue = null;
3264
2986
  };
2987
+
3265
2988
  /**
3266
2989
  * Removes or adds one or more rows of the cell meta objects to the cell meta collections.
3267
2990
  *
@@ -3272,25 +2995,18 @@ function Core(rootElement, userSettings) {
3272
2995
  * @param {number} [deleteAmount=0] The number of items to be removed. If set to 0, no cell meta objects will be removed.
3273
2996
  * @param {...object} [cellMetaRows] The new cell meta row objects to be added to the cell meta collection.
3274
2997
  */
3275
-
3276
-
3277
2998
  this.spliceCellsMeta = function (visualIndex) {
3278
2999
  var _this5 = this;
3279
-
3280
3000
  var deleteAmount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
3281
-
3282
3001
  for (var _len3 = arguments.length, cellMetaRows = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
3283
3002
  cellMetaRows[_key3 - 2] = arguments[_key3];
3284
3003
  }
3285
-
3286
3004
  if (cellMetaRows.length > 0 && !Array.isArray(cellMetaRows[0])) {
3287
3005
  throw new Error('The 3rd argument (cellMetaRows) has to be passed as an array of cell meta objects array.');
3288
3006
  }
3289
-
3290
3007
  if (deleteAmount > 0) {
3291
3008
  metaManager.removeRow(this.toPhysicalRow(visualIndex), deleteAmount);
3292
3009
  }
3293
-
3294
3010
  if (cellMetaRows.length > 0) {
3295
3011
  (0, _array.arrayEach)(cellMetaRows.reverse(), function (cellMetaRow) {
3296
3012
  metaManager.createRow(_this5.toPhysicalRow(visualIndex));
@@ -3299,9 +3015,9 @@ function Core(rootElement, userSettings) {
3299
3015
  });
3300
3016
  });
3301
3017
  }
3302
-
3303
3018
  instance.render();
3304
3019
  };
3020
+
3305
3021
  /**
3306
3022
  * Set cell meta data object defined by `prop` to the corresponding params `row` and `column`.
3307
3023
  *
@@ -3311,17 +3027,15 @@ function Core(rootElement, userSettings) {
3311
3027
  * @param {number} column Visual column index.
3312
3028
  * @param {object} prop Meta object.
3313
3029
  */
3314
-
3315
-
3316
3030
  this.setCellMetaObject = function (row, column, prop) {
3317
3031
  var _this6 = this;
3318
-
3319
3032
  if (_typeof(prop) === 'object') {
3320
3033
  (0, _object.objectEach)(prop, function (value, key) {
3321
3034
  _this6.setCellMeta(row, column, key, value);
3322
3035
  });
3323
3036
  }
3324
3037
  };
3038
+
3325
3039
  /**
3326
3040
  * Sets a property defined by the `key` property to the meta object of a cell corresponding to params `row` and `column`.
3327
3041
  *
@@ -3334,29 +3048,23 @@ function Core(rootElement, userSettings) {
3334
3048
  * @fires Hooks#beforeSetCellMeta
3335
3049
  * @fires Hooks#afterSetCellMeta
3336
3050
  */
3337
-
3338
-
3339
3051
  this.setCellMeta = function (row, column, key, value) {
3340
3052
  var allowSetCellMeta = instance.runHooks('beforeSetCellMeta', row, column, key, value);
3341
-
3342
3053
  if (allowSetCellMeta === false) {
3343
3054
  return;
3344
3055
  }
3345
-
3346
3056
  var physicalRow = row;
3347
3057
  var physicalColumn = column;
3348
-
3349
3058
  if (row < this.countRows()) {
3350
3059
  physicalRow = this.toPhysicalRow(row);
3351
3060
  }
3352
-
3353
3061
  if (column < this.countCols()) {
3354
3062
  physicalColumn = this.toPhysicalColumn(column);
3355
3063
  }
3356
-
3357
3064
  metaManager.setCellMeta(physicalRow, physicalColumn, key, value);
3358
3065
  instance.runHooks('afterSetCellMeta', row, column, key, value);
3359
3066
  };
3067
+
3360
3068
  /**
3361
3069
  * Get all the cells meta settings at least once generated in the table (in order of cell initialization).
3362
3070
  *
@@ -3364,11 +3072,10 @@ function Core(rootElement, userSettings) {
3364
3072
  * @function getCellsMeta
3365
3073
  * @returns {Array} Returns an array of ColumnSettings object instances.
3366
3074
  */
3367
-
3368
-
3369
3075
  this.getCellsMeta = function () {
3370
3076
  return metaManager.getCellsMeta();
3371
3077
  };
3078
+
3372
3079
  /**
3373
3080
  * Returns the cell properties object for the given `row` and `column` coordinates.
3374
3081
  *
@@ -3380,25 +3087,21 @@ function Core(rootElement, userSettings) {
3380
3087
  * @fires Hooks#beforeGetCellMeta
3381
3088
  * @fires Hooks#afterGetCellMeta
3382
3089
  */
3383
-
3384
-
3385
3090
  this.getCellMeta = function (row, column) {
3386
3091
  var physicalRow = this.toPhysicalRow(row);
3387
3092
  var physicalColumn = this.toPhysicalColumn(column);
3388
-
3389
3093
  if (physicalRow === null) {
3390
3094
  physicalRow = row;
3391
3095
  }
3392
-
3393
3096
  if (physicalColumn === null) {
3394
3097
  physicalColumn = column;
3395
3098
  }
3396
-
3397
3099
  return metaManager.getCellMeta(physicalRow, physicalColumn, {
3398
3100
  visualRow: row,
3399
3101
  visualColumn: column
3400
3102
  });
3401
3103
  };
3104
+
3402
3105
  /**
3403
3106
  * Returns an array of cell meta objects for specified physical row index.
3404
3107
  *
@@ -3407,11 +3110,10 @@ function Core(rootElement, userSettings) {
3407
3110
  * @param {number} row Physical row index.
3408
3111
  * @returns {Array}
3409
3112
  */
3410
-
3411
-
3412
3113
  this.getCellMetaAtRow = function (row) {
3413
3114
  return metaManager.getCellsMetaAtRow(row);
3414
3115
  };
3116
+
3415
3117
  /**
3416
3118
  * Checks if the data format and config allows user to modify the column structure.
3417
3119
  *
@@ -3419,13 +3121,11 @@ function Core(rootElement, userSettings) {
3419
3121
  * @function isColumnModificationAllowed
3420
3122
  * @returns {boolean}
3421
3123
  */
3422
-
3423
-
3424
3124
  this.isColumnModificationAllowed = function () {
3425
3125
  return !(instance.dataType === 'object' || tableMeta.columns);
3426
3126
  };
3427
-
3428
3127
  var rendererLookup = (0, _data.cellMethodLookupFactory)('renderer');
3128
+
3429
3129
  /**
3430
3130
  * Returns the cell renderer function by given `row` and `column` arguments.
3431
3131
  *
@@ -3442,10 +3142,10 @@ function Core(rootElement, userSettings) {
3442
3142
  * hot.getCellRenderer(hot.getCellMeta(1, 1));
3443
3143
  * ```
3444
3144
  */
3445
-
3446
3145
  this.getCellRenderer = function (row, column) {
3447
3146
  return (0, _registry2.getRenderer)(rendererLookup.call(this, row, column));
3448
3147
  };
3148
+
3449
3149
  /**
3450
3150
  * Returns the cell editor class by the provided `row` and `column` arguments.
3451
3151
  *
@@ -3462,10 +3162,9 @@ function Core(rootElement, userSettings) {
3462
3162
  * hot.getCellEditor(hot.getCellMeta(1, 1));
3463
3163
  * ```
3464
3164
  */
3465
-
3466
-
3467
3165
  this.getCellEditor = (0, _data.cellMethodLookupFactory)('editor');
3468
3166
  var validatorLookup = (0, _data.cellMethodLookupFactory)('validator');
3167
+
3469
3168
  /**
3470
3169
  * Returns the cell validator by `row` and `column`.
3471
3170
  *
@@ -3482,16 +3181,14 @@ function Core(rootElement, userSettings) {
3482
3181
  * hot.getCellValidator(hot.getCellMeta(1, 1));
3483
3182
  * ```
3484
3183
  */
3485
-
3486
3184
  this.getCellValidator = function (row, column) {
3487
3185
  var validator = validatorLookup.call(this, row, column);
3488
-
3489
3186
  if (typeof validator === 'string') {
3490
3187
  validator = (0, _registry3.getValidator)(validator);
3491
3188
  }
3492
-
3493
3189
  return validator;
3494
3190
  };
3191
+
3495
3192
  /**
3496
3193
  * Validates all cells using their validator functions and calls callback when finished.
3497
3194
  *
@@ -3510,11 +3207,10 @@ function Core(rootElement, userSettings) {
3510
3207
  * })
3511
3208
  * ```
3512
3209
  */
3513
-
3514
-
3515
3210
  this.validateCells = function (callback) {
3516
3211
  this._validateCells(callback);
3517
3212
  };
3213
+
3518
3214
  /**
3519
3215
  * Validates rows using their validator functions and calls callback when finished.
3520
3216
  *
@@ -3534,15 +3230,13 @@ function Core(rootElement, userSettings) {
3534
3230
  * })
3535
3231
  * ```
3536
3232
  */
3537
-
3538
-
3539
3233
  this.validateRows = function (rows, callback) {
3540
3234
  if (!Array.isArray(rows)) {
3541
3235
  throw new Error('validateRows parameter `rows` must be an array');
3542
3236
  }
3543
-
3544
3237
  this._validateCells(callback, rows);
3545
3238
  };
3239
+
3546
3240
  /**
3547
3241
  * Validates columns using their validator functions and calls callback when finished.
3548
3242
  *
@@ -3562,15 +3256,13 @@ function Core(rootElement, userSettings) {
3562
3256
  * })
3563
3257
  * ```
3564
3258
  */
3565
-
3566
-
3567
3259
  this.validateColumns = function (columns, callback) {
3568
3260
  if (!Array.isArray(columns)) {
3569
3261
  throw new Error('validateColumns parameter `columns` must be an array');
3570
3262
  }
3571
-
3572
3263
  this._validateCells(callback, undefined, columns);
3573
3264
  };
3265
+
3574
3266
  /**
3575
3267
  * Validates all cells using their validator functions and calls callback when finished.
3576
3268
  *
@@ -3585,51 +3277,40 @@ function Core(rootElement, userSettings) {
3585
3277
  * @param {Array} [rows] An array of validation target visual row indexes.
3586
3278
  * @param {Array} [columns] An array of validation target visual column indexes.
3587
3279
  */
3588
-
3589
-
3590
3280
  this._validateCells = function (callback, rows, columns) {
3591
3281
  var waitingForValidator = new ValidatorsQueue();
3592
-
3593
3282
  if (callback) {
3594
3283
  waitingForValidator.onQueueEmpty = callback;
3595
3284
  }
3596
-
3597
3285
  var i = instance.countRows() - 1;
3598
-
3599
3286
  while (i >= 0) {
3600
3287
  if (rows !== undefined && rows.indexOf(i) === -1) {
3601
3288
  i -= 1;
3602
3289
  continue;
3603
3290
  }
3604
-
3605
3291
  var j = instance.countCols() - 1;
3606
-
3607
3292
  while (j >= 0) {
3608
3293
  if (columns !== undefined && columns.indexOf(j) === -1) {
3609
3294
  j -= 1;
3610
3295
  continue;
3611
3296
  }
3612
-
3613
3297
  waitingForValidator.addValidatorToQueue();
3614
3298
  instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), function (result) {
3615
3299
  if (typeof result !== 'boolean') {
3616
3300
  throw new Error('Validation error: result is not boolean');
3617
3301
  }
3618
-
3619
3302
  if (result === false) {
3620
3303
  waitingForValidator.valid = false;
3621
3304
  }
3622
-
3623
3305
  waitingForValidator.removeValidatorFormQueue();
3624
3306
  }, 'validateCells');
3625
3307
  j -= 1;
3626
3308
  }
3627
-
3628
3309
  i -= 1;
3629
3310
  }
3630
-
3631
3311
  waitingForValidator.checkIfQueueIsEmpty();
3632
3312
  };
3313
+
3633
3314
  /**
3634
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.
3635
3316
  *
@@ -3639,16 +3320,12 @@ function Core(rootElement, userSettings) {
3639
3320
  * @fires Hooks#modifyRowHeader
3640
3321
  * @returns {Array|string|number} Array of header values / single header value.
3641
3322
  */
3642
-
3643
-
3644
3323
  this.getRowHeader = function (row) {
3645
3324
  var rowHeader = tableMeta.rowHeaders;
3646
3325
  var physicalRow = row;
3647
-
3648
3326
  if (physicalRow !== void 0) {
3649
3327
  physicalRow = instance.runHooks('modifyRowHeader', physicalRow);
3650
3328
  }
3651
-
3652
3329
  if (physicalRow === void 0) {
3653
3330
  rowHeader = [];
3654
3331
  (0, _number.rangeEach)(instance.countRows() - 1, function (i) {
@@ -3661,9 +3338,9 @@ function Core(rootElement, userSettings) {
3661
3338
  } else if (rowHeader && typeof rowHeader !== 'string' && typeof rowHeader !== 'number') {
3662
3339
  rowHeader = physicalRow + 1;
3663
3340
  }
3664
-
3665
3341
  return rowHeader;
3666
3342
  };
3343
+
3667
3344
  /**
3668
3345
  * Returns information about if this table is configured to display row headers.
3669
3346
  *
@@ -3671,11 +3348,10 @@ function Core(rootElement, userSettings) {
3671
3348
  * @function hasRowHeaders
3672
3349
  * @returns {boolean} `true` if the instance has the row headers enabled, `false` otherwise.
3673
3350
  */
3674
-
3675
-
3676
3351
  this.hasRowHeaders = function () {
3677
3352
  return !!tableMeta.rowHeaders;
3678
3353
  };
3354
+
3679
3355
  /**
3680
3356
  * Returns information about if this table is configured to display column headers.
3681
3357
  *
@@ -3683,22 +3359,19 @@ function Core(rootElement, userSettings) {
3683
3359
  * @function hasColHeaders
3684
3360
  * @returns {boolean} `true` if the instance has the column headers enabled, `false` otherwise.
3685
3361
  */
3686
-
3687
-
3688
3362
  this.hasColHeaders = function () {
3689
3363
  if (tableMeta.colHeaders !== void 0 && tableMeta.colHeaders !== null) {
3690
3364
  // Polymer has empty value = null
3691
3365
  return !!tableMeta.colHeaders;
3692
3366
  }
3693
-
3694
3367
  for (var i = 0, ilen = instance.countCols(); i < ilen; i++) {
3695
3368
  if (instance.getColHeader(i)) {
3696
3369
  return true;
3697
3370
  }
3698
3371
  }
3699
-
3700
3372
  return false;
3701
3373
  };
3374
+
3702
3375
  /**
3703
3376
  * Returns an array of column headers (in string format, if they are enabled). If param `column` is given, it
3704
3377
  * returns the header at the given column.
@@ -3709,39 +3382,30 @@ function Core(rootElement, userSettings) {
3709
3382
  * @fires Hooks#modifyColHeader
3710
3383
  * @returns {Array|string|number} The column header(s).
3711
3384
  */
3712
-
3713
-
3714
3385
  this.getColHeader = function (column) {
3715
3386
  var columnIndex = instance.runHooks('modifyColHeader', column);
3716
3387
  var result = tableMeta.colHeaders;
3717
-
3718
3388
  if (columnIndex === void 0) {
3719
3389
  var out = [];
3720
3390
  var ilen = instance.countCols();
3721
-
3722
3391
  for (var i = 0; i < ilen; i++) {
3723
3392
  out.push(instance.getColHeader(i));
3724
3393
  }
3725
-
3726
3394
  result = out;
3727
3395
  } else {
3728
3396
  var translateVisualIndexToColumns = function translateVisualIndexToColumns(visualColumnIndex) {
3729
3397
  var arr = [];
3730
3398
  var columnsLen = instance.countCols();
3731
3399
  var index = 0;
3732
-
3733
3400
  for (; index < columnsLen; index++) {
3734
3401
  if ((0, _function.isFunction)(tableMeta.columns) && tableMeta.columns(index)) {
3735
3402
  arr.push(index);
3736
3403
  }
3737
3404
  }
3738
-
3739
3405
  return arr[visualColumnIndex];
3740
3406
  };
3741
-
3742
3407
  var physicalColumn = instance.toPhysicalColumn(columnIndex);
3743
3408
  var prop = translateVisualIndexToColumns(physicalColumn);
3744
-
3745
3409
  if (tableMeta.colHeaders === false) {
3746
3410
  result = null;
3747
3411
  } else if (tableMeta.columns && (0, _function.isFunction)(tableMeta.columns) && tableMeta.columns(prop) && tableMeta.columns(prop).title) {
@@ -3759,6 +3423,7 @@ function Core(rootElement, userSettings) {
3759
3423
 
3760
3424
  return result;
3761
3425
  };
3426
+
3762
3427
  /**
3763
3428
  * Return column width from settings (no guessing). Private use intended.
3764
3429
  *
@@ -3768,42 +3433,36 @@ function Core(rootElement, userSettings) {
3768
3433
  * @param {number} col Visual col index.
3769
3434
  * @returns {number}
3770
3435
  */
3771
-
3772
-
3773
3436
  this._getColWidthFromSettings = function (col) {
3774
- var width; // We currently don't support cell meta objects for headers (negative values)
3437
+ var width;
3775
3438
 
3439
+ // We currently don't support cell meta objects for headers (negative values)
3776
3440
  if (col >= 0) {
3777
3441
  var cellProperties = instance.getCellMeta(0, col);
3778
3442
  width = cellProperties.width;
3779
3443
  }
3780
-
3781
3444
  if (width === void 0 || width === tableMeta.width) {
3782
3445
  width = tableMeta.colWidths;
3783
3446
  }
3784
-
3785
3447
  if (width !== void 0 && width !== null) {
3786
3448
  switch (_typeof(width)) {
3787
3449
  case 'object':
3788
3450
  // array
3789
3451
  width = width[col];
3790
3452
  break;
3791
-
3792
3453
  case 'function':
3793
3454
  width = width(col);
3794
3455
  break;
3795
-
3796
3456
  default:
3797
3457
  break;
3798
3458
  }
3799
-
3800
3459
  if (typeof width === 'string') {
3801
3460
  width = parseInt(width, 10);
3802
3461
  }
3803
3462
  }
3804
-
3805
3463
  return width;
3806
3464
  };
3465
+
3807
3466
  /**
3808
3467
  * Returns the width of the requested column.
3809
3468
  *
@@ -3813,19 +3472,15 @@ function Core(rootElement, userSettings) {
3813
3472
  * @returns {number} Column width.
3814
3473
  * @fires Hooks#modifyColWidth
3815
3474
  */
3816
-
3817
-
3818
3475
  this.getColWidth = function (column) {
3819
3476
  var width = instance._getColWidthFromSettings(column);
3820
-
3821
3477
  width = instance.runHooks('modifyColWidth', width, column);
3822
-
3823
3478
  if (width === void 0) {
3824
3479
  width = _src.ViewportColumnsCalculator.DEFAULT_WIDTH;
3825
3480
  }
3826
-
3827
3481
  return width;
3828
3482
  };
3483
+
3829
3484
  /**
3830
3485
  * Return row height from settings (no guessing). Private use intended.
3831
3486
  *
@@ -3835,8 +3490,6 @@ function Core(rootElement, userSettings) {
3835
3490
  * @param {number} row Visual row index.
3836
3491
  * @returns {number}
3837
3492
  */
3838
-
3839
-
3840
3493
  this._getRowHeightFromSettings = function (row) {
3841
3494
  // let cellProperties = instance.getCellMeta(row, 0);
3842
3495
  // let height = cellProperties.height;
@@ -3845,29 +3498,25 @@ function Core(rootElement, userSettings) {
3845
3498
  // height = cellProperties.rowHeights;
3846
3499
  // }
3847
3500
  var height = tableMeta.rowHeights;
3848
-
3849
3501
  if (height !== void 0 && height !== null) {
3850
3502
  switch (_typeof(height)) {
3851
3503
  case 'object':
3852
3504
  // array
3853
3505
  height = height[row];
3854
3506
  break;
3855
-
3856
3507
  case 'function':
3857
3508
  height = height(row);
3858
3509
  break;
3859
-
3860
3510
  default:
3861
3511
  break;
3862
3512
  }
3863
-
3864
3513
  if (typeof height === 'string') {
3865
3514
  height = parseInt(height, 10);
3866
3515
  }
3867
3516
  }
3868
-
3869
3517
  return height;
3870
3518
  };
3519
+
3871
3520
  /**
3872
3521
  * Returns the row height.
3873
3522
  *
@@ -3879,14 +3528,12 @@ function Core(rootElement, userSettings) {
3879
3528
  * @returns {number} The given row's height.
3880
3529
  * @fires Hooks#modifyRowHeight
3881
3530
  */
3882
-
3883
-
3884
3531
  this.getRowHeight = function (row) {
3885
3532
  var height = instance._getRowHeightFromSettings(row);
3886
-
3887
3533
  height = instance.runHooks('modifyRowHeight', height, row);
3888
3534
  return height;
3889
3535
  };
3536
+
3890
3537
  /**
3891
3538
  * Returns the total number of rows in the data source.
3892
3539
  *
@@ -3894,11 +3541,10 @@ function Core(rootElement, userSettings) {
3894
3541
  * @function countSourceRows
3895
3542
  * @returns {number} Total number of rows.
3896
3543
  */
3897
-
3898
-
3899
3544
  this.countSourceRows = function () {
3900
3545
  return dataSource.countRows();
3901
3546
  };
3547
+
3902
3548
  /**
3903
3549
  * Returns the total number of columns in the data source.
3904
3550
  *
@@ -3906,11 +3552,10 @@ function Core(rootElement, userSettings) {
3906
3552
  * @function countSourceCols
3907
3553
  * @returns {number} Total number of columns.
3908
3554
  */
3909
-
3910
-
3911
3555
  this.countSourceCols = function () {
3912
3556
  return dataSource.countFirstRowKeys();
3913
3557
  };
3558
+
3914
3559
  /**
3915
3560
  * Returns the total number of visual rows in the table.
3916
3561
  *
@@ -3918,11 +3563,10 @@ function Core(rootElement, userSettings) {
3918
3563
  * @function countRows
3919
3564
  * @returns {number} Total number of rows.
3920
3565
  */
3921
-
3922
-
3923
3566
  this.countRows = function () {
3924
3567
  return datamap.getLength();
3925
3568
  };
3569
+
3926
3570
  /**
3927
3571
  * Returns the total number of visible columns in the table.
3928
3572
  *
@@ -3930,13 +3574,12 @@ function Core(rootElement, userSettings) {
3930
3574
  * @function countCols
3931
3575
  * @returns {number} Total number of columns.
3932
3576
  */
3933
-
3934
-
3935
3577
  this.countCols = function () {
3936
3578
  var maxCols = tableMeta.maxCols;
3937
3579
  var dataLen = this.columnIndexMapper.getNotTrimmedIndexesLength();
3938
3580
  return Math.min(maxCols, dataLen);
3939
3581
  };
3582
+
3940
3583
  /**
3941
3584
  * Returns the number of rendered rows including rows that are partially or fully rendered
3942
3585
  * outside the table viewport.
@@ -3945,11 +3588,10 @@ function Core(rootElement, userSettings) {
3945
3588
  * @function countRenderedRows
3946
3589
  * @returns {number} Returns -1 if table is not visible.
3947
3590
  */
3948
-
3949
-
3950
3591
  this.countRenderedRows = function () {
3951
3592
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getRenderedRowsCount() : -1;
3952
3593
  };
3594
+
3953
3595
  /**
3954
3596
  * Returns the number of rendered rows that are only visible in the table viewport.
3955
3597
  * The rows that are partially visible are not counted.
@@ -3958,11 +3600,10 @@ function Core(rootElement, userSettings) {
3958
3600
  * @function countVisibleRows
3959
3601
  * @returns {number} Number of visible rows or -1.
3960
3602
  */
3961
-
3962
-
3963
3603
  this.countVisibleRows = function () {
3964
3604
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getVisibleRowsCount() : -1;
3965
3605
  };
3606
+
3966
3607
  /**
3967
3608
  * Returns the number of rendered rows including columns that are partially or fully rendered
3968
3609
  * outside the table viewport.
@@ -3971,11 +3612,10 @@ function Core(rootElement, userSettings) {
3971
3612
  * @function countRenderedCols
3972
3613
  * @returns {number} Returns -1 if table is not visible.
3973
3614
  */
3974
-
3975
-
3976
3615
  this.countRenderedCols = function () {
3977
3616
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getRenderedColumnsCount() : -1;
3978
3617
  };
3618
+
3979
3619
  /**
3980
3620
  * Returns the number of rendered columns that are only visible in the table viewport.
3981
3621
  * The columns that are partially visible are not counted.
@@ -3984,11 +3624,10 @@ function Core(rootElement, userSettings) {
3984
3624
  * @function countVisibleCols
3985
3625
  * @returns {number} Number of visible columns or -1.
3986
3626
  */
3987
-
3988
-
3989
3627
  this.countVisibleCols = function () {
3990
3628
  return instance.view._wt.drawn ? instance.view._wt.wtTable.getVisibleColumnsCount() : -1;
3991
3629
  };
3630
+
3992
3631
  /**
3993
3632
  * Returns the number of empty rows. If the optional ending parameter is `true`, returns the
3994
3633
  * number of empty rows at the bottom of the table.
@@ -3998,8 +3637,6 @@ function Core(rootElement, userSettings) {
3998
3637
  * @param {boolean} [ending=false] If `true`, will only count empty rows at the end of the data source.
3999
3638
  * @returns {number} Count empty rows.
4000
3639
  */
4001
-
4002
-
4003
3640
  this.countEmptyRows = function () {
4004
3641
  var ending = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4005
3642
  var emptyRows = 0;
@@ -4012,6 +3649,7 @@ function Core(rootElement, userSettings) {
4012
3649
  });
4013
3650
  return emptyRows;
4014
3651
  };
3652
+
4015
3653
  /**
4016
3654
  * Returns the number of empty columns. If the optional ending parameter is `true`, returns the number of empty
4017
3655
  * columns at right hand edge of the table.
@@ -4021,15 +3659,8 @@ function Core(rootElement, userSettings) {
4021
3659
  * @param {boolean} [ending=false] If `true`, will only count empty columns at the end of the data source row.
4022
3660
  * @returns {number} Count empty cols.
4023
3661
  */
4024
-
4025
-
4026
3662
  this.countEmptyCols = function () {
4027
3663
  var ending = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4028
-
4029
- if (instance.countRows() < 1) {
4030
- return 0;
4031
- }
4032
-
4033
3664
  var emptyColumns = 0;
4034
3665
  (0, _number.rangeEachReverse)(instance.countCols() - 1, function (visualIndex) {
4035
3666
  if (instance.isEmptyCol(visualIndex)) {
@@ -4040,6 +3671,7 @@ function Core(rootElement, userSettings) {
4040
3671
  });
4041
3672
  return emptyColumns;
4042
3673
  };
3674
+
4043
3675
  /**
4044
3676
  * Check if all cells in the row declared by the `row` argument are empty.
4045
3677
  *
@@ -4048,11 +3680,10 @@ function Core(rootElement, userSettings) {
4048
3680
  * @param {number} row Visual row index.
4049
3681
  * @returns {boolean} `true` if the row at the given `row` is empty, `false` otherwise.
4050
3682
  */
4051
-
4052
-
4053
3683
  this.isEmptyRow = function (row) {
4054
3684
  return tableMeta.isEmptyRow.call(instance, row);
4055
3685
  };
3686
+
4056
3687
  /**
4057
3688
  * Check if all cells in the the column declared by the `column` argument are empty.
4058
3689
  *
@@ -4061,11 +3692,10 @@ function Core(rootElement, userSettings) {
4061
3692
  * @param {number} column Column index.
4062
3693
  * @returns {boolean} `true` if the column at the given `col` is empty, `false` otherwise.
4063
3694
  */
4064
-
4065
-
4066
3695
  this.isEmptyCol = function (column) {
4067
3696
  return tableMeta.isEmptyCol.call(instance, column);
4068
3697
  };
3698
+
4069
3699
  /**
4070
3700
  * Select cell specified by `row` and `column` values or a range of cells finishing at `endRow`, `endCol`. If the table
4071
3701
  * was configured to support data column properties that properties can be used to making a selection.
@@ -4097,18 +3727,15 @@ function Core(rootElement, userSettings) {
4097
3727
  * @param {boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.
4098
3728
  * @returns {boolean} `true` if selection was successful, `false` otherwise.
4099
3729
  */
4100
-
4101
-
4102
3730
  this.selectCell = function (row, column, endRow, endColumn) {
4103
3731
  var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
4104
3732
  var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
4105
-
4106
3733
  if ((0, _mixed.isUndefined)(row) || (0, _mixed.isUndefined)(column)) {
4107
3734
  return false;
4108
3735
  }
4109
-
4110
3736
  return this.selectCells([[row, column, endRow, endColumn]], scrollToCell, changeListener);
4111
3737
  };
3738
+
4112
3739
  /**
4113
3740
  * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells
4114
3741
  * finishing at `endRow`, `endColumn`. The method supports two input formats which are the same as that
@@ -4142,26 +3769,21 @@ function Core(rootElement, userSettings) {
4142
3769
  * @param {boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.
4143
3770
  * @returns {boolean} `true` if selection was successful, `false` otherwise.
4144
3771
  */
4145
-
4146
-
4147
3772
  this.selectCells = function () {
4148
3773
  var coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [[]];
4149
3774
  var scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
4150
3775
  var changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
4151
-
4152
3776
  if (scrollToCell === false) {
4153
3777
  preventScrollingToCell = true;
4154
3778
  }
4155
-
4156
3779
  var wasSelected = selection.selectCells(coords);
4157
-
4158
3780
  if (wasSelected && changeListener) {
4159
3781
  instance.listen();
4160
3782
  }
4161
-
4162
3783
  preventScrollingToCell = false;
4163
3784
  return wasSelected;
4164
3785
  };
3786
+
4165
3787
  /**
4166
3788
  * Select column specified by `startColumn` visual index, column property or a range of columns finishing at `endColumn`.
4167
3789
  *
@@ -4185,12 +3807,11 @@ function Core(rootElement, userSettings) {
4185
3807
  * is not defined the column defined by `startColumn` will be selected.
4186
3808
  * @returns {boolean} `true` if selection was successful, `false` otherwise.
4187
3809
  */
4188
-
4189
-
4190
3810
  this.selectColumns = function (startColumn) {
4191
3811
  var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;
4192
3812
  return selection.selectColumns(startColumn, endColumn);
4193
3813
  };
3814
+
4194
3815
  /**
4195
3816
  * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.
4196
3817
  *
@@ -4210,23 +3831,21 @@ function Core(rootElement, userSettings) {
4210
3831
  * is not defined the row defined by `startRow` will be selected.
4211
3832
  * @returns {boolean} `true` if selection was successful, `false` otherwise.
4212
3833
  */
4213
-
4214
-
4215
3834
  this.selectRows = function (startRow) {
4216
3835
  var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;
4217
3836
  return selection.selectRows(startRow, endRow);
4218
3837
  };
3838
+
4219
3839
  /**
4220
3840
  * Deselects the current cell selection on the table.
4221
3841
  *
4222
3842
  * @memberof Core#
4223
3843
  * @function deselectCell
4224
3844
  */
4225
-
4226
-
4227
3845
  this.deselectCell = function () {
4228
3846
  selection.deselect();
4229
3847
  };
3848
+
4230
3849
  /**
4231
3850
  * Select the whole table. The previous selection will be overwritten.
4232
3851
  *
@@ -4236,8 +3855,6 @@ function Core(rootElement, userSettings) {
4236
3855
  * @param {boolean} [includeHeaders=true] `true` If the selection should include the row, column and corner headers,
4237
3856
  * `false` otherwise.
4238
3857
  */
4239
-
4240
-
4241
3858
  this.selectAll = function () {
4242
3859
  var includeHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
4243
3860
  var includeRowHeaders = includeHeaders && this.hasRowHeaders();
@@ -4246,11 +3863,11 @@ function Core(rootElement, userSettings) {
4246
3863
  selection.selectAll(includeRowHeaders, includeColumnHeaders);
4247
3864
  preventScrollingToCell = false;
4248
3865
  };
4249
-
4250
3866
  var getIndexToScroll = function getIndexToScroll(indexMapper, visualIndex) {
4251
3867
  // Looking for a visual index on the right and then (when not found) on the left.
4252
3868
  return indexMapper.getNearestNotHiddenIndex(visualIndex, 1, true);
4253
3869
  };
3870
+
4254
3871
  /**
4255
3872
  * Scroll viewport to coordinates specified by the `row` and `column` arguments.
4256
3873
  *
@@ -4268,8 +3885,6 @@ function Core(rootElement, userSettings) {
4268
3885
  * may be rendered when they are in the viewport (we don't consider hidden indexes as they aren't rendered).
4269
3886
  * @returns {boolean} `true` if scroll was successful, `false` otherwise.
4270
3887
  */
4271
-
4272
-
4273
3888
  this.scrollViewportTo = function (row, column) {
4274
3889
  var snapToBottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
4275
3890
  var snapToRight = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
@@ -4278,40 +3893,31 @@ function Core(rootElement, userSettings) {
4278
3893
  var snapToLeft = !snapToRight;
4279
3894
  var renderableRow = row;
4280
3895
  var renderableColumn = column;
4281
-
4282
3896
  if (considerHiddenIndexes) {
4283
3897
  var _isRowInteger = Number.isInteger(row);
4284
-
4285
3898
  var _isColumnInteger = Number.isInteger(column);
4286
-
4287
3899
  var visualRowToScroll = _isRowInteger ? getIndexToScroll(this.rowIndexMapper, row) : void 0;
4288
3900
  var visualColumnToScroll = _isColumnInteger ? getIndexToScroll(this.columnIndexMapper, column) : void 0;
4289
-
4290
3901
  if (visualRowToScroll === null || visualColumnToScroll === null) {
4291
3902
  return false;
4292
3903
  }
4293
-
4294
3904
  renderableRow = _isRowInteger ? instance.rowIndexMapper.getRenderableFromVisualIndex(visualRowToScroll) : void 0;
4295
3905
  renderableColumn = _isColumnInteger ? instance.columnIndexMapper.getRenderableFromVisualIndex(visualColumnToScroll) : void 0;
4296
3906
  }
4297
-
4298
3907
  var isRowInteger = Number.isInteger(renderableRow);
4299
3908
  var isColumnInteger = Number.isInteger(renderableColumn);
4300
-
4301
3909
  if (isRowInteger && isColumnInteger) {
4302
3910
  return instance.view.scrollViewport(instance._createCellCoords(renderableRow, renderableColumn), snapToTop, snapToRight, snapToBottom, snapToLeft);
4303
3911
  }
4304
-
4305
3912
  if (isRowInteger && isColumnInteger === false) {
4306
3913
  return instance.view.scrollViewportVertically(renderableRow, snapToTop, snapToBottom);
4307
3914
  }
4308
-
4309
3915
  if (isColumnInteger && isRowInteger === false) {
4310
3916
  return instance.view.scrollViewportHorizontally(renderableColumn, snapToRight, snapToLeft);
4311
3917
  }
4312
-
4313
3918
  return false;
4314
3919
  };
3920
+
4315
3921
  /**
4316
3922
  * Removes the table from the DOM and destroys the instance of the Handsontable.
4317
3923
  *
@@ -4319,58 +3925,45 @@ function Core(rootElement, userSettings) {
4319
3925
  * @function destroy
4320
3926
  * @fires Hooks#afterDestroy
4321
3927
  */
4322
-
4323
-
4324
3928
  this.destroy = function () {
4325
3929
  instance._clearTimeouts();
4326
-
4327
3930
  instance._clearImmediates();
4328
-
4329
3931
  if (instance.view) {
4330
3932
  // in case HT is destroyed before initialization has finished
4331
3933
  instance.view.destroy();
4332
3934
  }
4333
-
4334
3935
  if (dataSource) {
4335
3936
  dataSource.destroy();
4336
3937
  }
4337
-
4338
3938
  dataSource = null;
4339
3939
  this.getShortcutManager().destroy();
4340
3940
  metaManager.clearCache();
4341
-
4342
3941
  if ((0, _rootInstance.isRootInstance)(instance)) {
4343
3942
  var licenseInfo = this.rootDocument.querySelector('#hot-display-license-info');
4344
-
4345
3943
  if (licenseInfo) {
4346
3944
  licenseInfo.parentNode.removeChild(licenseInfo);
4347
3945
  }
4348
3946
  }
4349
-
4350
3947
  (0, _element.empty)(instance.rootElement);
4351
3948
  eventManager.destroy();
4352
-
4353
3949
  if (editorManager) {
4354
3950
  editorManager.destroy();
4355
- } // The plugin's `destroy` method is called as a consequence and it should handle
4356
- // unregistration of plugin's maps. Some unregistered maps reset the cache.
4357
-
3951
+ }
4358
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.
4359
3955
  instance.batchExecution(function () {
4360
3956
  instance.rowIndexMapper.unregisterAll();
4361
3957
  instance.columnIndexMapper.unregisterAll();
4362
3958
  pluginsRegistry.getItems().forEach(function (_ref20) {
4363
3959
  var _ref21 = _slicedToArray(_ref20, 2),
4364
- plugin = _ref21[1];
4365
-
3960
+ plugin = _ref21[1];
4366
3961
  plugin.destroy();
4367
3962
  });
4368
3963
  pluginsRegistry.clear();
4369
3964
  instance.runHooks('afterDestroy');
4370
3965
  }, true);
4371
-
4372
3966
  _pluginHooks.default.getSingleton().destroy(instance);
4373
-
4374
3967
  (0, _object.objectEach)(instance, function (property, key, obj) {
4375
3968
  // replace instance methods with post mortem
4376
3969
  if ((0, _function.isFunction)(property)) {
@@ -4381,13 +3974,13 @@ function Core(rootElement, userSettings) {
4381
3974
  obj[key] = null;
4382
3975
  }
4383
3976
  });
4384
- instance.isDestroyed = true; // replace private properties with null (restores memory)
4385
- // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests
3977
+ instance.isDestroyed = true;
4386
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
4387
3981
  if (datamap) {
4388
3982
  datamap.destroy();
4389
3983
  }
4390
-
4391
3984
  instance.rowIndexMapper = null;
4392
3985
  instance.columnIndexMapper = null;
4393
3986
  datamap = null;
@@ -4396,6 +3989,7 @@ function Core(rootElement, userSettings) {
4396
3989
  editorManager = null;
4397
3990
  instance = null;
4398
3991
  };
3992
+
4399
3993
  /**
4400
3994
  * Replacement for all methods after the Handsontable was destroyed.
4401
3995
  *
@@ -4403,13 +3997,12 @@ function Core(rootElement, userSettings) {
4403
3997
  * @param {string} method The method name.
4404
3998
  * @returns {Function}
4405
3999
  */
4406
-
4407
-
4408
4000
  function postMortem(method) {
4409
4001
  return function () {
4410
4002
  throw new Error("The \"".concat(method, "\" method cannot be called because this Handsontable instance has been destroyed"));
4411
4003
  };
4412
4004
  }
4005
+
4413
4006
  /**
4414
4007
  * Returns the active editor class instance.
4415
4008
  *
@@ -4417,11 +4010,10 @@ function Core(rootElement, userSettings) {
4417
4010
  * @function getActiveEditor
4418
4011
  * @returns {BaseEditor} The active editor instance.
4419
4012
  */
4420
-
4421
-
4422
4013
  this.getActiveEditor = function () {
4423
4014
  return editorManager.getActiveEditor();
4424
4015
  };
4016
+
4425
4017
  /**
4426
4018
  * Returns plugin instance by provided its name.
4427
4019
  *
@@ -4430,17 +4022,16 @@ function Core(rootElement, userSettings) {
4430
4022
  * @param {string} pluginName The plugin name.
4431
4023
  * @returns {BasePlugin|undefined} The plugin instance or undefined if there is no plugin.
4432
4024
  */
4433
-
4434
-
4435
4025
  this.getPlugin = function (pluginName) {
4436
- 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);
4437
4027
 
4028
+ // Workaround for the UndoRedo plugin which, currently doesn't follow the plugin architecture.
4438
4029
  if (unifiedPluginName === 'UndoRedo') {
4439
4030
  return this.undoRedo;
4440
4031
  }
4441
-
4442
4032
  return pluginsRegistry.getItem(unifiedPluginName);
4443
4033
  };
4034
+
4444
4035
  /**
4445
4036
  * Returns name of the passed plugin.
4446
4037
  *
@@ -4449,16 +4040,14 @@ function Core(rootElement, userSettings) {
4449
4040
  * @param {BasePlugin} plugin The plugin instance.
4450
4041
  * @returns {string}
4451
4042
  */
4452
-
4453
-
4454
4043
  this.getPluginName = function (plugin) {
4455
4044
  // Workaround for the UndoRedo plugin which, currently doesn't follow the plugin architecture.
4456
4045
  if (plugin === this.undoRedo) {
4457
4046
  return this.undoRedo.constructor.PLUGIN_KEY;
4458
4047
  }
4459
-
4460
4048
  return pluginsRegistry.getId(plugin);
4461
4049
  };
4050
+
4462
4051
  /**
4463
4052
  * Returns the Handsontable instance.
4464
4053
  *
@@ -4466,11 +4055,10 @@ function Core(rootElement, userSettings) {
4466
4055
  * @function getInstance
4467
4056
  * @returns {Handsontable} The Handsontable instance.
4468
4057
  */
4469
-
4470
-
4471
4058
  this.getInstance = function () {
4472
4059
  return instance;
4473
4060
  };
4061
+
4474
4062
  /**
4475
4063
  * Adds listener to the specified hook name (only for this Handsontable instance).
4476
4064
  *
@@ -4484,11 +4072,10 @@ function Core(rootElement, userSettings) {
4484
4072
  * hot.addHook('beforeInit', myCallback);
4485
4073
  * ```
4486
4074
  */
4487
-
4488
-
4489
4075
  this.addHook = function (key, callback) {
4490
4076
  _pluginHooks.default.getSingleton().add(key, callback, instance);
4491
4077
  };
4078
+
4492
4079
  /**
4493
4080
  * Check if for a specified hook name there are added listeners (only for this Handsontable instance). All available
4494
4081
  * hooks you will find {@link Hooks}.
@@ -4504,11 +4091,10 @@ function Core(rootElement, userSettings) {
4504
4091
  * const hasBeforeInitListeners = hot.hasHook('beforeInit');
4505
4092
  * ```
4506
4093
  */
4507
-
4508
-
4509
4094
  this.hasHook = function (key) {
4510
4095
  return _pluginHooks.default.getSingleton().has(key, instance) || _pluginHooks.default.getSingleton().has(key);
4511
4096
  };
4097
+
4512
4098
  /**
4513
4099
  * Adds listener to specified hook name (only for this Handsontable instance). After the listener is triggered,
4514
4100
  * it will be automatically removed.
@@ -4523,11 +4109,10 @@ function Core(rootElement, userSettings) {
4523
4109
  * hot.addHookOnce('beforeInit', myCallback);
4524
4110
  * ```
4525
4111
  */
4526
-
4527
-
4528
4112
  this.addHookOnce = function (key, callback) {
4529
4113
  _pluginHooks.default.getSingleton().once(key, callback, instance);
4530
4114
  };
4115
+
4531
4116
  /**
4532
4117
  * Removes the hook listener previously registered with {@link Core#addHook}.
4533
4118
  *
@@ -4542,11 +4127,10 @@ function Core(rootElement, userSettings) {
4542
4127
  * hot.removeHook('beforeInit', myCallback);
4543
4128
  * ```
4544
4129
  */
4545
-
4546
-
4547
4130
  this.removeHook = function (key, callback) {
4548
4131
  _pluginHooks.default.getSingleton().remove(key, callback, instance);
4549
4132
  };
4133
+
4550
4134
  /**
4551
4135
  * Run the callbacks for the hook provided in the `key` argument using the parameters given in the other arguments.
4552
4136
  *
@@ -4570,11 +4154,10 @@ function Core(rootElement, userSettings) {
4570
4154
  * hot.runHooks('customAction', 10, 'foo');
4571
4155
  * ```
4572
4156
  */
4573
-
4574
-
4575
4157
  this.runHooks = function (key, p1, p2, p3, p4, p5, p6) {
4576
4158
  return _pluginHooks.default.getSingleton().run(instance, key, p1, p2, p3, p4, p5, p6);
4577
4159
  };
4160
+
4578
4161
  /**
4579
4162
  * Get language phrase for specified dictionary key.
4580
4163
  *
@@ -4585,11 +4168,10 @@ function Core(rootElement, userSettings) {
4585
4168
  * @param {*} extraArguments Arguments which will be handled by formatters.
4586
4169
  * @returns {string}
4587
4170
  */
4588
-
4589
-
4590
4171
  this.getTranslatedPhrase = function (dictionaryKey, extraArguments) {
4591
4172
  return (0, _registry4.getTranslatedPhrase)(tableMeta.language, dictionaryKey, extraArguments);
4592
4173
  };
4174
+
4593
4175
  /**
4594
4176
  * Converts instance into outerHTML of HTMLTableElement.
4595
4177
  *
@@ -4598,11 +4180,10 @@ function Core(rootElement, userSettings) {
4598
4180
  * @since 7.1.0
4599
4181
  * @returns {string}
4600
4182
  */
4601
-
4602
-
4603
4183
  this.toHTML = function () {
4604
4184
  return (0, _parseTable.instanceToHTML)(_this);
4605
4185
  };
4186
+
4606
4187
  /**
4607
4188
  * Converts instance into HTMLTableElement.
4608
4189
  *
@@ -4611,16 +4192,13 @@ function Core(rootElement, userSettings) {
4611
4192
  * @since 7.1.0
4612
4193
  * @returns {HTMLTableElement}
4613
4194
  */
4614
-
4615
-
4616
4195
  this.toTableElement = function () {
4617
4196
  var tempElement = _this.rootDocument.createElement('div');
4618
-
4619
4197
  tempElement.insertAdjacentHTML('afterbegin', (0, _parseTable.instanceToHTML)(_this));
4620
4198
  return tempElement.firstElementChild;
4621
4199
  };
4622
-
4623
4200
  this.timeouts = [];
4201
+
4624
4202
  /**
4625
4203
  * Sets timeout. Purpose of this method is to clear all known timeouts when `destroy` method is called.
4626
4204
  *
@@ -4629,53 +4207,48 @@ function Core(rootElement, userSettings) {
4629
4207
  * @param {number} [delay=0] If first argument is passed as a function this argument set delay of the execution of that function.
4630
4208
  * @private
4631
4209
  */
4632
-
4633
4210
  this._registerTimeout = function (handle) {
4634
4211
  var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
4635
4212
  var handleFunc = handle;
4636
-
4637
4213
  if (typeof handleFunc === 'function') {
4638
4214
  handleFunc = setTimeout(handleFunc, delay);
4639
4215
  }
4640
-
4641
4216
  this.timeouts.push(handleFunc);
4642
4217
  };
4218
+
4643
4219
  /**
4644
4220
  * Clears all known timeouts.
4645
4221
  *
4646
4222
  * @private
4647
4223
  */
4648
-
4649
-
4650
4224
  this._clearTimeouts = function () {
4651
4225
  (0, _array.arrayEach)(this.timeouts, function (handler) {
4652
4226
  clearTimeout(handler);
4653
4227
  });
4654
4228
  };
4655
-
4656
4229
  this.immediates = [];
4230
+
4657
4231
  /**
4658
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.
4659
4233
  *
4660
4234
  * @param {Function} callback Function to be delayed in execution.
4661
4235
  * @private
4662
4236
  */
4663
-
4664
4237
  this._registerImmediate = function (callback) {
4665
4238
  this.immediates.push(setImmediate(callback));
4666
4239
  };
4240
+
4667
4241
  /**
4668
4242
  * Clears all known timeouts.
4669
4243
  *
4670
4244
  * @private
4671
4245
  */
4672
-
4673
-
4674
4246
  this._clearImmediates = function () {
4675
4247
  (0, _array.arrayEach)(this.immediates, function (handler) {
4676
4248
  clearImmediate(handler);
4677
4249
  });
4678
4250
  };
4251
+
4679
4252
  /**
4680
4253
  * Refresh selection borders. This is temporary method relic after selection rewrite.
4681
4254
  *
@@ -4683,18 +4256,16 @@ function Core(rootElement, userSettings) {
4683
4256
  * @param {boolean} [revertOriginal=false] If `true`, the previous value will be restored. Otherwise, the edited value will be saved.
4684
4257
  * @param {boolean} [prepareEditorIfNeeded=true] If `true` the editor under the selected cell will be prepared to open.
4685
4258
  */
4686
-
4687
-
4688
4259
  this._refreshBorders = function () {
4689
4260
  var revertOriginal = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4690
4261
  var prepareEditorIfNeeded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
4691
4262
  editorManager.destroyEditor(revertOriginal);
4692
4263
  instance.view.render();
4693
-
4694
4264
  if (prepareEditorIfNeeded && selection.isSelected()) {
4695
4265
  editorManager.prepareEditor();
4696
4266
  }
4697
4267
  };
4268
+
4698
4269
  /**
4699
4270
  * Check if currently it is RTL direction.
4700
4271
  *
@@ -4703,11 +4274,10 @@ function Core(rootElement, userSettings) {
4703
4274
  * @function isRtl
4704
4275
  * @returns {boolean} True if RTL.
4705
4276
  */
4706
-
4707
-
4708
4277
  this.isRtl = function () {
4709
4278
  return instance.rootWindow.getComputedStyle(instance.rootElement).direction === 'rtl';
4710
4279
  };
4280
+
4711
4281
  /**
4712
4282
  * Check if currently it is LTR direction.
4713
4283
  *
@@ -4716,11 +4286,10 @@ function Core(rootElement, userSettings) {
4716
4286
  * @function isLtr
4717
4287
  * @returns {boolean} True if LTR.
4718
4288
  */
4719
-
4720
-
4721
4289
  this.isLtr = function () {
4722
4290
  return !instance.isRtl();
4723
4291
  };
4292
+
4724
4293
  /**
4725
4294
  * Returns 1 for LTR; -1 for RTL. Useful for calculations.
4726
4295
  *
@@ -4729,12 +4298,9 @@ function Core(rootElement, userSettings) {
4729
4298
  * @function getDirectionFactor
4730
4299
  * @returns {number} Returns 1 for LTR; -1 for RTL.
4731
4300
  */
4732
-
4733
-
4734
4301
  this.getDirectionFactor = function () {
4735
4302
  return instance.isLtr() ? 1 : -1;
4736
4303
  };
4737
-
4738
4304
  var shortcutManager = (0, _shortcuts.createShortcutManager)({
4739
4305
  handleEvent: function handleEvent(event) {
4740
4306
  var isListening = instance.isListening();
@@ -4749,11 +4315,11 @@ function Core(rootElement, userSettings) {
4749
4315
  // Handsontable could be destroyed after performing action (executing a callback).
4750
4316
  return;
4751
4317
  }
4752
-
4753
4318
  instance.runHooks('afterDocumentKeyDown', event);
4754
4319
  },
4755
4320
  ownerWindow: this.rootWindow
4756
4321
  });
4322
+
4757
4323
  /**
4758
4324
  * Returns instance of a manager responsible for handling shortcuts stored in some contexts. It run actions after
4759
4325
  * pressing key combination in active Handsontable instance.
@@ -4763,11 +4329,9 @@ function Core(rootElement, userSettings) {
4763
4329
  * @function getShortcutManager
4764
4330
  * @returns {ShortcutManager} Instance of {@link ShortcutManager}
4765
4331
  */
4766
-
4767
4332
  this.getShortcutManager = function () {
4768
4333
  return shortcutManager;
4769
4334
  };
4770
-
4771
4335
  var gridContext = shortcutManager.addContext('grid');
4772
4336
  var gridConfig = {
4773
4337
  runOnlyIf: function runOnlyIf() {
@@ -4786,24 +4350,21 @@ function Core(rootElement, userSettings) {
4786
4350
  callback: function callback() {
4787
4351
  var selectedRange = instance.getSelectedRange();
4788
4352
  var _selectedRange$highli = selectedRange[selectedRange.length - 1].highlight,
4789
- highlightRow = _selectedRange$highli.row,
4790
- highlightColumn = _selectedRange$highli.col;
4353
+ highlightRow = _selectedRange$highli.row,
4354
+ highlightColumn = _selectedRange$highli.col;
4791
4355
  var valueToPopulate = instance.getDataAtCell(highlightRow, highlightColumn);
4792
4356
  var cellValues = new Map();
4793
-
4794
4357
  for (var i = 0; i < selectedRange.length; i++) {
4795
4358
  selectedRange[i].forAll(function (row, column) {
4796
4359
  if (row >= 0 && column >= 0 && (row !== highlightRow || column !== highlightColumn)) {
4797
4360
  var _instance$getCellMeta = instance.getCellMeta(row, column),
4798
- readOnly = _instance$getCellMeta.readOnly;
4799
-
4361
+ readOnly = _instance$getCellMeta.readOnly;
4800
4362
  if (!readOnly) {
4801
4363
  cellValues.set("".concat(row, "x").concat(column), [row, column, valueToPopulate]);
4802
4364
  }
4803
4365
  }
4804
4366
  });
4805
4367
  }
4806
-
4807
4368
  instance.setDataAtCell(Array.from(cellValues.values()));
4808
4369
  },
4809
4370
  runOnlyIf: function runOnlyIf() {
@@ -4830,9 +4391,8 @@ function Core(rootElement, userSettings) {
4830
4391
  captureCtrl: true,
4831
4392
  callback: function callback() {
4832
4393
  var _instance$getSelected = instance.getSelectedRangeLast(),
4833
- from = _instance$getSelected.from,
4834
- to = _instance$getSelected.to;
4835
-
4394
+ from = _instance$getSelected.from,
4395
+ to = _instance$getSelected.to;
4836
4396
  var row = instance.rowIndexMapper.getNearestNotHiddenIndex(0, 1);
4837
4397
  selection.setRangeStart(from.clone());
4838
4398
  selection.setRangeEnd(instance._createCellCoords(row, to.col));
@@ -4861,9 +4421,8 @@ function Core(rootElement, userSettings) {
4861
4421
  captureCtrl: true,
4862
4422
  callback: function callback() {
4863
4423
  var _instance$getSelected2 = instance.getSelectedRangeLast(),
4864
- from = _instance$getSelected2.from,
4865
- to = _instance$getSelected2.to;
4866
-
4424
+ from = _instance$getSelected2.from,
4425
+ to = _instance$getSelected2.to;
4867
4426
  var row = instance.rowIndexMapper.getNearestNotHiddenIndex(instance.countRows() - 1, -1);
4868
4427
  selection.setRangeStart(from.clone());
4869
4428
  selection.setRangeEnd(instance._createCellCoords(row, to.col));
@@ -4881,11 +4440,8 @@ function Core(rootElement, userSettings) {
4881
4440
  captureCtrl: true,
4882
4441
  callback: function callback() {
4883
4442
  var _instance$columnIndex;
4884
-
4885
4443
  var row = instance.getSelectedRangeLast().highlight.row;
4886
-
4887
4444
  var column = (_instance$columnIndex = instance.columnIndexMapper).getNearestNotHiddenIndex.apply(_instance$columnIndex, _toConsumableArray(instance.isRtl() ? [instance.countCols() - 1, -1] : [0, 1]));
4888
-
4889
4445
  selection.setRangeStart(instance._createCellCoords(row, column));
4890
4446
  }
4891
4447
  }, {
@@ -4898,13 +4454,10 @@ function Core(rootElement, userSettings) {
4898
4454
  captureCtrl: true,
4899
4455
  callback: function callback() {
4900
4456
  var _instance$columnIndex2;
4901
-
4902
4457
  var _instance$getSelected3 = instance.getSelectedRangeLast(),
4903
- from = _instance$getSelected3.from,
4904
- to = _instance$getSelected3.to;
4905
-
4458
+ from = _instance$getSelected3.from,
4459
+ to = _instance$getSelected3.to;
4906
4460
  var column = (_instance$columnIndex2 = instance.columnIndexMapper).getNearestNotHiddenIndex.apply(_instance$columnIndex2, _toConsumableArray(instance.isRtl() ? [instance.countCols() - 1, -1] : [0, 1]));
4907
-
4908
4461
  selection.setRangeStart(from.clone());
4909
4462
  selection.setRangeEnd(instance._createCellCoords(to.row, column));
4910
4463
  },
@@ -4921,11 +4474,8 @@ function Core(rootElement, userSettings) {
4921
4474
  captureCtrl: true,
4922
4475
  callback: function callback() {
4923
4476
  var _instance$columnIndex3;
4924
-
4925
4477
  var row = instance.getSelectedRangeLast().highlight.row;
4926
-
4927
4478
  var column = (_instance$columnIndex3 = instance.columnIndexMapper).getNearestNotHiddenIndex.apply(_instance$columnIndex3, _toConsumableArray(instance.isRtl() ? [0, 1] : [instance.countCols() - 1, -1]));
4928
-
4929
4479
  selection.setRangeStart(instance._createCellCoords(row, column));
4930
4480
  }
4931
4481
  }, {
@@ -4938,13 +4488,10 @@ function Core(rootElement, userSettings) {
4938
4488
  captureCtrl: true,
4939
4489
  callback: function callback() {
4940
4490
  var _instance$columnIndex4;
4941
-
4942
4491
  var _instance$getSelected4 = instance.getSelectedRangeLast(),
4943
- from = _instance$getSelected4.from,
4944
- to = _instance$getSelected4.to;
4945
-
4492
+ from = _instance$getSelected4.from,
4493
+ to = _instance$getSelected4.to;
4946
4494
  var column = (_instance$columnIndex4 = instance.columnIndexMapper).getNearestNotHiddenIndex.apply(_instance$columnIndex4, _toConsumableArray(instance.isRtl() ? [0, 1] : [instance.countCols() - 1, -1]));
4947
-
4948
4495
  selection.setRangeStart(from.clone());
4949
4496
  selection.setRangeEnd(instance._createCellCoords(to.row, column));
4950
4497
  },
@@ -5016,14 +4563,11 @@ function Core(rootElement, userSettings) {
5016
4563
  keys: [['PageUp', 'Shift']],
5017
4564
  callback: function callback() {
5018
4565
  var _instance$getSelected5 = instance.getSelectedRangeLast(),
5019
- to = _instance$getSelected5.to;
5020
-
4566
+ to = _instance$getSelected5.to;
5021
4567
  var nextRowIndexToSelect = Math.max(to.row - instance.countVisibleRows(), 0);
5022
4568
  var row = instance.rowIndexMapper.getNearestNotHiddenIndex(nextRowIndexToSelect, 1);
5023
-
5024
4569
  if (row !== null) {
5025
4570
  var coords = instance._createCellCoords(row, to.col);
5026
-
5027
4571
  var scrollPadding = to.row - instance.view.getFirstFullyVisibleRow();
5028
4572
  var nextVerticalScroll = Math.max(coords.row - scrollPadding, 0);
5029
4573
  selection.setRangeEnd(coords);
@@ -5039,14 +4583,11 @@ function Core(rootElement, userSettings) {
5039
4583
  keys: [['PageDown', 'Shift']],
5040
4584
  callback: function callback() {
5041
4585
  var _instance$getSelected6 = instance.getSelectedRangeLast(),
5042
- to = _instance$getSelected6.to;
5043
-
4586
+ to = _instance$getSelected6.to;
5044
4587
  var nextRowIndexToSelect = Math.min(to.row + instance.countVisibleRows(), instance.countRows() - 1);
5045
4588
  var row = instance.rowIndexMapper.getNearestNotHiddenIndex(nextRowIndexToSelect, -1);
5046
-
5047
4589
  if (row !== null) {
5048
4590
  var coords = instance._createCellCoords(row, to.col);
5049
-
5050
4591
  var scrollPadding = to.row - instance.view.getFirstFullyVisibleRow();
5051
4592
  var nextVerticalScroll = Math.min(coords.row - scrollPadding, instance.countRows() - 1);
5052
4593
  selection.setRangeEnd(coords);
@@ -5070,6 +4611,5 @@ function Core(rootElement, userSettings) {
5070
4611
  var PluginClass = (0, _registry.getPlugin)(pluginName);
5071
4612
  pluginsRegistry.addItem(pluginName, new PluginClass(_this));
5072
4613
  });
5073
-
5074
4614
  _pluginHooks.default.getSingleton().run(instance, 'construct');
5075
4615
  }