handsontable 16.0.1 → 16.1.0-next-abd8f2e-20250904

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 (489) hide show
  1. package/3rdparty/walkontable/src/overlays.js +12 -2
  2. package/3rdparty/walkontable/src/overlays.mjs +12 -2
  3. package/3rdparty/walkontable/src/viewport.js +2 -6
  4. package/3rdparty/walkontable/src/viewport.mjs +2 -6
  5. package/CHANGELOG.md +37 -0
  6. package/base.js +2 -2
  7. package/base.mjs +2 -2
  8. package/cellTypes/autocompleteType/accessors/index.js +7 -0
  9. package/cellTypes/autocompleteType/accessors/index.mjs +2 -0
  10. package/cellTypes/autocompleteType/accessors/valueGetter.js +14 -0
  11. package/cellTypes/autocompleteType/accessors/valueGetter.mjs +10 -0
  12. package/cellTypes/autocompleteType/accessors/valueSetter.js +25 -0
  13. package/cellTypes/autocompleteType/accessors/valueSetter.mjs +21 -0
  14. package/cellTypes/autocompleteType/autocompleteType.js +4 -1
  15. package/cellTypes/autocompleteType/autocompleteType.mjs +4 -1
  16. package/cellTypes/checkboxType/accessors/index.js +5 -0
  17. package/cellTypes/checkboxType/accessors/index.mjs +1 -0
  18. package/cellTypes/checkboxType/accessors/valueSetter.js +26 -0
  19. package/cellTypes/checkboxType/accessors/valueSetter.mjs +22 -0
  20. package/cellTypes/checkboxType/checkboxType.js +3 -1
  21. package/cellTypes/checkboxType/checkboxType.mjs +3 -1
  22. package/cellTypes/dropdownType/accessors/index.js +7 -0
  23. package/cellTypes/dropdownType/accessors/index.mjs +2 -0
  24. package/cellTypes/dropdownType/accessors/valueGetter.js +14 -0
  25. package/cellTypes/dropdownType/accessors/valueGetter.mjs +10 -0
  26. package/cellTypes/dropdownType/accessors/valueSetter.js +17 -0
  27. package/cellTypes/dropdownType/accessors/valueSetter.mjs +13 -0
  28. package/cellTypes/dropdownType/dropdownType.js +4 -1
  29. package/cellTypes/dropdownType/dropdownType.mjs +4 -1
  30. package/cellTypes/numericType/accessors/index.js +5 -0
  31. package/cellTypes/numericType/accessors/index.mjs +1 -0
  32. package/cellTypes/numericType/accessors/valueSetter.js +19 -0
  33. package/cellTypes/numericType/accessors/valueSetter.mjs +15 -0
  34. package/cellTypes/numericType/numericType.js +3 -1
  35. package/cellTypes/numericType/numericType.mjs +3 -1
  36. package/core/focusCatcher/index.js +37 -112
  37. package/core/focusCatcher/index.mjs +35 -110
  38. package/core/focusCatcher/utils.js +31 -0
  39. package/core/focusCatcher/utils.mjs +27 -0
  40. package/core/hooks/constants.js +242 -0
  41. package/core/hooks/constants.mjs +242 -0
  42. package/core/hooks/index.d.ts +22 -0
  43. package/core/viewportScroll/scrollStrategies/focusScroll.js +5 -1
  44. package/core/viewportScroll/scrollStrategies/focusScroll.mjs +5 -1
  45. package/core/viewportScroll/utils.js +1 -1
  46. package/core/viewportScroll/utils.mjs +1 -1
  47. package/core.d.ts +4 -0
  48. package/core.js +237 -139
  49. package/core.mjs +240 -142
  50. package/dataMap/dataMap.js +13 -3
  51. package/dataMap/dataMap.mjs +14 -4
  52. package/dataMap/dataSource.js +16 -0
  53. package/dataMap/dataSource.mjs +16 -0
  54. package/dataMap/metaManager/lazyFactoryMap.js +4 -3
  55. package/dataMap/metaManager/lazyFactoryMap.mjs +2 -1
  56. package/dataMap/metaManager/metaLayers/cellMeta.js +3 -2
  57. package/dataMap/metaManager/metaLayers/cellMeta.mjs +3 -2
  58. package/dataMap/metaManager/metaSchema.js +289 -4
  59. package/dataMap/metaManager/metaSchema.mjs +289 -4
  60. package/dataMap/metaManager/utils.js +0 -11
  61. package/dataMap/metaManager/utils.mjs +0 -10
  62. package/dataMap/replaceData.js +1 -0
  63. package/dataMap/replaceData.mjs +1 -0
  64. package/dist/handsontable.css +281 -4
  65. package/dist/handsontable.full.css +281 -4
  66. package/dist/handsontable.full.js +7844 -2990
  67. package/dist/handsontable.full.min.css +4 -5
  68. package/dist/handsontable.full.min.js +167 -165
  69. package/dist/handsontable.js +9639 -4806
  70. package/dist/handsontable.min.css +4 -4
  71. package/dist/handsontable.min.js +52 -50
  72. package/dist/languages/all.js +231 -21
  73. package/dist/languages/all.min.js +1 -1
  74. package/dist/languages/ar-AR.js +11 -1
  75. package/dist/languages/ar-AR.min.js +1 -1
  76. package/dist/languages/cs-CZ.js +11 -1
  77. package/dist/languages/cs-CZ.min.js +1 -1
  78. package/dist/languages/de-CH.js +11 -1
  79. package/dist/languages/de-CH.min.js +1 -1
  80. package/dist/languages/de-DE.js +11 -1
  81. package/dist/languages/de-DE.min.js +1 -1
  82. package/dist/languages/en-US.js +11 -1
  83. package/dist/languages/en-US.min.js +1 -1
  84. package/dist/languages/es-MX.js +11 -1
  85. package/dist/languages/es-MX.min.js +1 -1
  86. package/dist/languages/fa-IR.js +11 -1
  87. package/dist/languages/fa-IR.min.js +1 -1
  88. package/dist/languages/fr-FR.js +11 -1
  89. package/dist/languages/fr-FR.min.js +1 -1
  90. package/dist/languages/hr-HR.js +11 -1
  91. package/dist/languages/hr-HR.min.js +1 -1
  92. package/dist/languages/it-IT.js +11 -1
  93. package/dist/languages/it-IT.min.js +1 -1
  94. package/dist/languages/ja-JP.js +11 -1
  95. package/dist/languages/ja-JP.min.js +1 -1
  96. package/dist/languages/ko-KR.js +11 -1
  97. package/dist/languages/ko-KR.min.js +1 -1
  98. package/dist/languages/lv-LV.js +11 -1
  99. package/dist/languages/lv-LV.min.js +1 -1
  100. package/dist/languages/nb-NO.js +11 -1
  101. package/dist/languages/nb-NO.min.js +1 -1
  102. package/dist/languages/nl-NL.js +11 -1
  103. package/dist/languages/nl-NL.min.js +1 -1
  104. package/dist/languages/pl-PL.js +11 -1
  105. package/dist/languages/pl-PL.min.js +1 -1
  106. package/dist/languages/pt-BR.js +11 -1
  107. package/dist/languages/pt-BR.min.js +1 -1
  108. package/dist/languages/ru-RU.js +11 -1
  109. package/dist/languages/ru-RU.min.js +1 -1
  110. package/dist/languages/sr-SP.js +11 -1
  111. package/dist/languages/sr-SP.min.js +1 -1
  112. package/dist/languages/zh-CN.js +11 -1
  113. package/dist/languages/zh-CN.min.js +1 -1
  114. package/dist/languages/zh-TW.js +11 -1
  115. package/dist/languages/zh-TW.min.js +1 -1
  116. package/editorManager.js +4 -4
  117. package/editorManager.mjs +4 -4
  118. package/editors/autocompleteEditor/autocompleteEditor.js +50 -112
  119. package/editors/autocompleteEditor/autocompleteEditor.mjs +51 -113
  120. package/editors/baseEditor/baseEditor.js +10 -6
  121. package/editors/baseEditor/baseEditor.mjs +10 -6
  122. package/editors/handsontableEditor/handsontableEditor.js +9 -9
  123. package/editors/handsontableEditor/handsontableEditor.mjs +9 -9
  124. package/editors/textEditor/textEditor.js +0 -7
  125. package/editors/textEditor/textEditor.mjs +0 -7
  126. package/focusManager.js +2 -2
  127. package/focusManager.mjs +2 -2
  128. package/helpers/a11y.js +15 -2
  129. package/helpers/a11y.mjs +10 -2
  130. package/helpers/console.js +12 -0
  131. package/helpers/console.mjs +11 -0
  132. package/helpers/dom/element.js +4 -4
  133. package/helpers/dom/element.mjs +4 -4
  134. package/helpers/mixed.js +65 -2
  135. package/helpers/mixed.mjs +63 -2
  136. package/helpers/number.js +28 -0
  137. package/helpers/number.mjs +26 -0
  138. package/helpers/object.js +35 -0
  139. package/helpers/object.mjs +34 -0
  140. package/helpers/string.js +19 -0
  141. package/helpers/string.mjs +18 -0
  142. package/helpers/templateLiteralTag.js +57 -1
  143. package/helpers/templateLiteralTag.mjs +56 -1
  144. package/i18n/constants.js +13 -1
  145. package/i18n/constants.mjs +13 -1
  146. package/i18n/languages/ar-AR.js +11 -1
  147. package/i18n/languages/ar-AR.mjs +11 -1
  148. package/i18n/languages/cs-CZ.js +11 -1
  149. package/i18n/languages/cs-CZ.mjs +11 -1
  150. package/i18n/languages/de-CH.js +11 -1
  151. package/i18n/languages/de-CH.mjs +11 -1
  152. package/i18n/languages/de-DE.js +11 -1
  153. package/i18n/languages/de-DE.mjs +11 -1
  154. package/i18n/languages/en-US.js +11 -1
  155. package/i18n/languages/en-US.mjs +11 -1
  156. package/i18n/languages/es-MX.js +11 -1
  157. package/i18n/languages/es-MX.mjs +11 -1
  158. package/i18n/languages/fa-IR.js +11 -1
  159. package/i18n/languages/fa-IR.mjs +11 -1
  160. package/i18n/languages/fr-FR.js +11 -1
  161. package/i18n/languages/fr-FR.mjs +11 -1
  162. package/i18n/languages/hr-HR.js +11 -1
  163. package/i18n/languages/hr-HR.mjs +11 -1
  164. package/i18n/languages/it-IT.js +11 -1
  165. package/i18n/languages/it-IT.mjs +11 -1
  166. package/i18n/languages/ja-JP.js +11 -1
  167. package/i18n/languages/ja-JP.mjs +11 -1
  168. package/i18n/languages/ko-KR.js +11 -1
  169. package/i18n/languages/ko-KR.mjs +11 -1
  170. package/i18n/languages/lv-LV.js +11 -1
  171. package/i18n/languages/lv-LV.mjs +11 -1
  172. package/i18n/languages/nb-NO.js +11 -1
  173. package/i18n/languages/nb-NO.mjs +11 -1
  174. package/i18n/languages/nl-NL.js +11 -1
  175. package/i18n/languages/nl-NL.mjs +11 -1
  176. package/i18n/languages/pl-PL.js +11 -1
  177. package/i18n/languages/pl-PL.mjs +11 -1
  178. package/i18n/languages/pt-BR.js +11 -1
  179. package/i18n/languages/pt-BR.mjs +11 -1
  180. package/i18n/languages/ru-RU.js +11 -1
  181. package/i18n/languages/ru-RU.mjs +11 -1
  182. package/i18n/languages/sr-SP.js +11 -1
  183. package/i18n/languages/sr-SP.mjs +11 -1
  184. package/i18n/languages/zh-CN.js +11 -1
  185. package/i18n/languages/zh-CN.mjs +11 -1
  186. package/i18n/languages/zh-TW.js +11 -1
  187. package/i18n/languages/zh-TW.mjs +11 -1
  188. package/i18n/phraseFormatters/index.js +3 -1
  189. package/i18n/phraseFormatters/index.mjs +3 -1
  190. package/i18n/registry.js +5 -6
  191. package/i18n/registry.mjs +5 -6
  192. package/index.d.ts +27 -0
  193. package/languages/all.js +231 -21
  194. package/languages/ar-AR.js +11 -1
  195. package/languages/ar-AR.mjs +11 -1
  196. package/languages/cs-CZ.js +11 -1
  197. package/languages/cs-CZ.mjs +11 -1
  198. package/languages/de-CH.js +11 -1
  199. package/languages/de-CH.mjs +11 -1
  200. package/languages/de-DE.js +11 -1
  201. package/languages/de-DE.mjs +11 -1
  202. package/languages/en-US.js +11 -1
  203. package/languages/en-US.mjs +11 -1
  204. package/languages/es-MX.js +11 -1
  205. package/languages/es-MX.mjs +11 -1
  206. package/languages/fa-IR.js +11 -1
  207. package/languages/fa-IR.mjs +11 -1
  208. package/languages/fr-FR.js +11 -1
  209. package/languages/fr-FR.mjs +11 -1
  210. package/languages/hr-HR.js +11 -1
  211. package/languages/hr-HR.mjs +11 -1
  212. package/languages/index.js +231 -21
  213. package/languages/it-IT.js +11 -1
  214. package/languages/it-IT.mjs +11 -1
  215. package/languages/ja-JP.js +11 -1
  216. package/languages/ja-JP.mjs +11 -1
  217. package/languages/ko-KR.js +11 -1
  218. package/languages/ko-KR.mjs +11 -1
  219. package/languages/lv-LV.js +11 -1
  220. package/languages/lv-LV.mjs +11 -1
  221. package/languages/nb-NO.js +11 -1
  222. package/languages/nb-NO.mjs +11 -1
  223. package/languages/nl-NL.js +11 -1
  224. package/languages/nl-NL.mjs +11 -1
  225. package/languages/pl-PL.js +11 -1
  226. package/languages/pl-PL.mjs +11 -1
  227. package/languages/pt-BR.js +11 -1
  228. package/languages/pt-BR.mjs +11 -1
  229. package/languages/ru-RU.js +11 -1
  230. package/languages/ru-RU.mjs +11 -1
  231. package/languages/sr-SP.js +11 -1
  232. package/languages/sr-SP.mjs +11 -1
  233. package/languages/zh-CN.js +11 -1
  234. package/languages/zh-CN.mjs +11 -1
  235. package/languages/zh-TW.js +11 -1
  236. package/languages/zh-TW.mjs +11 -1
  237. package/mixins/localHooks.js +16 -0
  238. package/mixins/localHooks.mjs +16 -0
  239. package/package.json +19 -1
  240. package/plugins/autoRowSize/autoRowSize.js +43 -6
  241. package/plugins/autoRowSize/autoRowSize.mjs +43 -6
  242. package/plugins/autofill/autofill.js +50 -3
  243. package/plugins/autofill/autofill.mjs +50 -3
  244. package/plugins/base/base.js +86 -15
  245. package/plugins/base/base.mjs +87 -16
  246. package/plugins/collapsibleColumns/collapsibleColumns.js +4 -4
  247. package/plugins/collapsibleColumns/collapsibleColumns.mjs +4 -4
  248. package/plugins/columnSorting/columnSorting.js +3 -3
  249. package/plugins/columnSorting/columnSorting.mjs +3 -3
  250. package/plugins/comments/comments.js +52 -22
  251. package/plugins/comments/comments.mjs +52 -22
  252. package/plugins/comments/contextMenuItem/addEditComment.js +3 -3
  253. package/plugins/comments/contextMenuItem/addEditComment.mjs +3 -3
  254. package/plugins/comments/contextMenuItem/readOnlyComment.js +2 -2
  255. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +2 -2
  256. package/plugins/comments/contextMenuItem/removeComment.js +2 -2
  257. package/plugins/comments/contextMenuItem/removeComment.mjs +2 -2
  258. package/plugins/contextMenu/contextMenu.js +4 -5
  259. package/plugins/contextMenu/contextMenu.mjs +4 -5
  260. package/plugins/contextMenu/menu/cursor.js +1 -1
  261. package/plugins/contextMenu/menu/cursor.mjs +1 -1
  262. package/plugins/contextMenu/menu/defaultShortcutsList.js +5 -5
  263. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +5 -5
  264. package/plugins/contextMenu/menu/menu.js +3 -3
  265. package/plugins/contextMenu/menu/menu.mjs +3 -3
  266. package/plugins/contextMenu/menu/positioner.js +1 -1
  267. package/plugins/contextMenu/menu/positioner.mjs +1 -1
  268. package/plugins/contextMenu/predefinedItems/alignment.js +1 -1
  269. package/plugins/contextMenu/predefinedItems/alignment.mjs +1 -1
  270. package/plugins/contextMenu/predefinedItems/clearColumn.js +1 -1
  271. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +1 -1
  272. package/plugins/contextMenu/predefinedItems/columnLeft.js +3 -3
  273. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +3 -3
  274. package/plugins/contextMenu/predefinedItems/columnRight.js +3 -3
  275. package/plugins/contextMenu/predefinedItems/columnRight.mjs +3 -3
  276. package/plugins/contextMenu/predefinedItems/readOnly.js +1 -1
  277. package/plugins/contextMenu/predefinedItems/readOnly.mjs +1 -1
  278. package/plugins/contextMenu/predefinedItems/removeColumn.js +1 -1
  279. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +1 -1
  280. package/plugins/contextMenu/predefinedItems/removeRow.js +1 -1
  281. package/plugins/contextMenu/predefinedItems/removeRow.mjs +1 -1
  282. package/plugins/contextMenu/predefinedItems/rowAbove.js +3 -3
  283. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +3 -3
  284. package/plugins/contextMenu/predefinedItems/rowBelow.js +3 -3
  285. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +3 -3
  286. package/plugins/copyPaste/contextMenuItem/copy.js +1 -1
  287. package/plugins/copyPaste/contextMenuItem/copy.mjs +1 -1
  288. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +3 -3
  289. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +3 -3
  290. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +3 -3
  291. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +3 -3
  292. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +3 -3
  293. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +3 -3
  294. package/plugins/copyPaste/contextMenuItem/cut.js +1 -1
  295. package/plugins/copyPaste/contextMenuItem/cut.mjs +1 -1
  296. package/plugins/copyPaste/copyPaste.js +75 -40
  297. package/plugins/copyPaste/copyPaste.mjs +76 -41
  298. package/plugins/customBorders/customBorders.js +1 -1
  299. package/plugins/customBorders/customBorders.mjs +1 -1
  300. package/plugins/dialog/dialog.d.ts +23 -0
  301. package/plugins/dialog/dialog.js +489 -0
  302. package/plugins/dialog/dialog.mjs +485 -0
  303. package/plugins/dialog/index.d.ts +1 -0
  304. package/plugins/dialog/index.js +7 -0
  305. package/plugins/dialog/index.mjs +1 -0
  306. package/plugins/dialog/ui.js +264 -0
  307. package/plugins/dialog/ui.mjs +259 -0
  308. package/plugins/dropdownMenu/dropdownMenu.js +5 -4
  309. package/plugins/dropdownMenu/dropdownMenu.mjs +5 -4
  310. package/plugins/filters/filters.js +2 -2
  311. package/plugins/filters/filters.mjs +2 -2
  312. package/plugins/hiddenColumns/contextMenuItem/hideColumn.js +3 -3
  313. package/plugins/hiddenColumns/contextMenuItem/hideColumn.mjs +3 -3
  314. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +4 -4
  315. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +4 -4
  316. package/plugins/hiddenRows/contextMenuItem/hideRow.js +3 -3
  317. package/plugins/hiddenRows/contextMenuItem/hideRow.mjs +3 -3
  318. package/plugins/hiddenRows/contextMenuItem/showRow.js +4 -4
  319. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +4 -4
  320. package/plugins/index.d.ts +9 -0
  321. package/plugins/index.js +9 -0
  322. package/plugins/index.mjs +7 -1
  323. package/plugins/loading/content.js +36 -0
  324. package/plugins/loading/content.mjs +31 -0
  325. package/plugins/loading/index.d.ts +1 -0
  326. package/plugins/loading/index.js +7 -0
  327. package/plugins/loading/index.mjs +1 -0
  328. package/plugins/loading/loading.d.ts +19 -0
  329. package/plugins/loading/loading.js +292 -0
  330. package/plugins/loading/loading.mjs +287 -0
  331. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js +1 -1
  332. package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.mjs +1 -1
  333. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js +1 -1
  334. package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.mjs +1 -1
  335. package/plugins/manualColumnMove/manualColumnMove.js +3 -3
  336. package/plugins/manualColumnMove/manualColumnMove.mjs +3 -3
  337. package/plugins/manualColumnResize/manualColumnResize.js +3 -3
  338. package/plugins/manualColumnResize/manualColumnResize.mjs +3 -3
  339. package/plugins/manualRowMove/manualRowMove.js +4 -4
  340. package/plugins/manualRowMove/manualRowMove.mjs +4 -4
  341. package/plugins/manualRowResize/manualRowResize.js +5 -2
  342. package/plugins/manualRowResize/manualRowResize.mjs +5 -2
  343. package/plugins/mergeCells/contextMenuItem/toggleMerge.js +15 -15
  344. package/plugins/mergeCells/contextMenuItem/toggleMerge.mjs +15 -15
  345. package/plugins/mergeCells/focusOrder.js +75 -39
  346. package/plugins/mergeCells/focusOrder.mjs +75 -39
  347. package/plugins/mergeCells/mergeCells.js +26 -19
  348. package/plugins/mergeCells/mergeCells.mjs +26 -19
  349. package/plugins/mergeCells/renderer.js +14 -8
  350. package/plugins/mergeCells/renderer.mjs +14 -8
  351. package/plugins/multiColumnSorting/multiColumnSorting.js +3 -3
  352. package/plugins/multiColumnSorting/multiColumnSorting.mjs +3 -3
  353. package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +3 -3
  354. package/plugins/multipleSelectionHandles/multipleSelectionHandles.mjs +3 -3
  355. package/plugins/nestedHeaders/nestedHeaders.js +47 -41
  356. package/plugins/nestedHeaders/nestedHeaders.mjs +47 -41
  357. package/plugins/nestedRows/nestedRows.js +3 -3
  358. package/plugins/nestedRows/nestedRows.mjs +3 -3
  359. package/plugins/nestedRows/ui/collapsing.js +1 -2
  360. package/plugins/nestedRows/ui/collapsing.mjs +1 -2
  361. package/plugins/nestedRows/ui/contextMenu.js +4 -4
  362. package/plugins/nestedRows/ui/contextMenu.mjs +4 -4
  363. package/plugins/nestedRows/ui/headers.js +4 -1
  364. package/plugins/nestedRows/ui/headers.mjs +4 -1
  365. package/plugins/pagination/focusController.js +27 -0
  366. package/plugins/pagination/focusController.mjs +23 -0
  367. package/plugins/pagination/index.d.ts +1 -0
  368. package/plugins/pagination/index.js +7 -0
  369. package/plugins/pagination/index.mjs +1 -0
  370. package/plugins/pagination/pagination.d.ts +52 -0
  371. package/plugins/pagination/pagination.js +1034 -0
  372. package/plugins/pagination/pagination.mjs +1030 -0
  373. package/plugins/pagination/strategies/autoPageSize.js +96 -0
  374. package/plugins/pagination/strategies/autoPageSize.mjs +92 -0
  375. package/plugins/pagination/strategies/fixedPageSize.js +88 -0
  376. package/plugins/pagination/strategies/fixedPageSize.mjs +84 -0
  377. package/plugins/pagination/strategies/index.js +22 -0
  378. package/plugins/pagination/strategies/index.mjs +18 -0
  379. package/plugins/pagination/ui.js +449 -0
  380. package/plugins/pagination/ui.mjs +443 -0
  381. package/plugins/pagination/utils.js +28 -0
  382. package/plugins/pagination/utils.mjs +24 -0
  383. package/plugins/stretchColumns/calculator.js +4 -0
  384. package/plugins/stretchColumns/calculator.mjs +4 -0
  385. package/plugins/stretchColumns/stretchColumns.js +1 -1
  386. package/plugins/stretchColumns/stretchColumns.mjs +1 -1
  387. package/plugins/undoRedo/actions/dataChange.js +17 -15
  388. package/plugins/undoRedo/actions/dataChange.mjs +17 -15
  389. package/renderers/checkboxRenderer/checkboxRenderer.js +3 -3
  390. package/renderers/checkboxRenderer/checkboxRenderer.mjs +3 -3
  391. package/selection/range.js +11 -0
  392. package/selection/range.mjs +11 -0
  393. package/selection/selection.js +163 -124
  394. package/selection/selection.mjs +163 -124
  395. package/selection/transformation/_base.js +448 -0
  396. package/selection/transformation/_base.mjs +443 -0
  397. package/selection/transformation/extender.js +55 -0
  398. package/selection/transformation/extender.mjs +51 -0
  399. package/selection/transformation/focus.js +77 -0
  400. package/selection/transformation/focus.mjs +73 -0
  401. package/selection/transformation/index.js +7 -0
  402. package/selection/transformation/index.mjs +2 -0
  403. package/selection/utils.js +2 -1
  404. package/selection/utils.mjs +2 -1
  405. package/settings.d.ts +10 -1
  406. package/shortcutContexts/commands/editor/fastOpen.js +1 -1
  407. package/shortcutContexts/commands/editor/fastOpen.mjs +1 -1
  408. package/shortcutContexts/commands/editor/open.js +10 -4
  409. package/shortcutContexts/commands/editor/open.mjs +10 -4
  410. package/shortcutContexts/commands/extendCellsSelection/down.js +1 -1
  411. package/shortcutContexts/commands/extendCellsSelection/down.mjs +1 -1
  412. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +2 -2
  413. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +2 -2
  414. package/shortcutContexts/commands/extendCellsSelection/left.js +1 -1
  415. package/shortcutContexts/commands/extendCellsSelection/left.mjs +1 -1
  416. package/shortcutContexts/commands/extendCellsSelection/right.js +1 -1
  417. package/shortcutContexts/commands/extendCellsSelection/right.mjs +1 -1
  418. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +1 -1
  419. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +1 -1
  420. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +1 -1
  421. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +1 -1
  422. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +1 -1
  423. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +1 -1
  424. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +1 -1
  425. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +1 -1
  426. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +1 -1
  427. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +1 -1
  428. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +1 -1
  429. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +1 -1
  430. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +1 -1
  431. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +1 -1
  432. package/shortcutContexts/commands/extendCellsSelection/toRows.js +1 -1
  433. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +1 -1
  434. package/shortcutContexts/commands/extendCellsSelection/up.js +1 -1
  435. package/shortcutContexts/commands/extendCellsSelection/up.mjs +1 -1
  436. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +2 -2
  437. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +2 -2
  438. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +2 -2
  439. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +2 -2
  440. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +5 -2
  441. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +5 -2
  442. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +5 -2
  443. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +5 -2
  444. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +1 -1
  445. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +1 -1
  446. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +1 -1
  447. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +1 -1
  448. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +1 -1
  449. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +1 -1
  450. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +1 -1
  451. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +1 -1
  452. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +1 -1
  453. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +1 -1
  454. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +1 -1
  455. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +1 -1
  456. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +2 -2
  457. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +2 -2
  458. package/shortcutContexts/commands/scrollToFocusedCell.js +1 -1
  459. package/shortcutContexts/commands/scrollToFocusedCell.mjs +1 -1
  460. package/shortcutContexts/grid.js +3 -3
  461. package/shortcutContexts/grid.mjs +3 -3
  462. package/shortcuts/context.js +4 -1
  463. package/shortcuts/context.mjs +4 -1
  464. package/shortcuts/manager.js +17 -3
  465. package/shortcuts/manager.mjs +17 -3
  466. package/styles/handsontable.css +288 -22
  467. package/styles/handsontable.min.css +3 -3
  468. package/styles/ht-theme-classic.css +828 -0
  469. package/styles/ht-theme-classic.min.css +30 -0
  470. package/styles/ht-theme-horizon.css +122 -26
  471. package/styles/ht-theme-horizon.min.css +3 -3
  472. package/styles/ht-theme-main.css +124 -28
  473. package/styles/ht-theme-main.min.css +3 -3
  474. package/tableView.js +61 -25
  475. package/tableView.mjs +61 -25
  476. package/utils/a11yAnnouncer.js +70 -0
  477. package/utils/a11yAnnouncer.mjs +64 -0
  478. package/{core/focusCatcher → utils}/focusDetector.js +30 -12
  479. package/{core/focusCatcher → utils}/focusDetector.mjs +30 -12
  480. package/utils/samplesGenerator.js +17 -1
  481. package/utils/samplesGenerator.mjs +17 -1
  482. package/utils/stylesHandler.js +23 -8
  483. package/utils/stylesHandler.mjs +23 -8
  484. package/utils/valueAccessors.js +45 -0
  485. package/utils/valueAccessors.mjs +40 -0
  486. package/validators/autocompleteValidator/autocompleteValidator.js +2 -1
  487. package/validators/autocompleteValidator/autocompleteValidator.mjs +2 -1
  488. package/selection/transformation.js +0 -335
  489. package/selection/transformation.mjs +0 -331
@@ -3,12 +3,16 @@
3
3
  exports.__esModule = true;
4
4
  require("core-js/modules/es.error.cause.js");
5
5
  require("core-js/modules/es.array.push.js");
6
+ require("core-js/modules/es.array.to-sorted.js");
6
7
  require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.every.js");
7
9
  require("core-js/modules/esnext.iterator.filter.js");
8
10
  require("core-js/modules/esnext.iterator.find.js");
11
+ require("core-js/modules/esnext.iterator.map.js");
9
12
  require("core-js/modules/esnext.iterator.reduce.js");
10
13
  var _handsontableEditor = require("../handsontableEditor");
11
14
  var _array = require("../../helpers/array");
15
+ var _object = require("../../helpers/object");
12
16
  var _element = require("../../helpers/dom/element");
13
17
  var _mixed = require("../../helpers/mixed");
14
18
  var _string = require("../../helpers/string");
@@ -70,72 +74,6 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
70
74
  _classPrivateFieldInitSpec(this, _focusDebounced, (0, _function.debounce)(() => {
71
75
  this.focus();
72
76
  }, 100));
73
- /**
74
- * Filters and sorts by relevance.
75
- *
76
- * @param {*} value The selected value.
77
- * @param {string[]} choices The list of available choices.
78
- * @param {boolean} caseSensitive Indicates if it's sorted by case.
79
- * @returns {number[]} Array of indexes in original choices array.
80
- */
81
- _defineProperty(this, "sortByRelevance", function (value, choices, caseSensitive) {
82
- const choicesRelevance = [];
83
- const result = [];
84
- const valueLength = value.length;
85
- let choicesCount = choices.length;
86
- let charsLeft;
87
- let currentItem;
88
- let i;
89
- let valueIndex;
90
- if (valueLength === 0) {
91
- for (i = 0; i < choicesCount; i++) {
92
- result.push(i);
93
- }
94
- return result;
95
- }
96
- for (i = 0; i < choicesCount; i++) {
97
- currentItem = (0, _string.stripTags)((0, _mixed.stringify)(choices[i]));
98
- if (caseSensitive) {
99
- valueIndex = currentItem.indexOf(value);
100
- } else {
101
- const locale = this.cellProperties.locale;
102
- valueIndex = currentItem.toLocaleLowerCase(locale).indexOf(value.toLocaleLowerCase(locale));
103
- }
104
- if (valueIndex !== -1) {
105
- charsLeft = currentItem.length - valueIndex - valueLength;
106
- choicesRelevance.push({
107
- baseIndex: i,
108
- index: valueIndex,
109
- charsLeft,
110
- value: currentItem
111
- });
112
- }
113
- }
114
- choicesRelevance.sort((a, b) => {
115
- if (b.index === -1) {
116
- return -1;
117
- }
118
- if (a.index === -1) {
119
- return 1;
120
- }
121
- if (a.index < b.index) {
122
- return -1;
123
- } else if (b.index < a.index) {
124
- return 1;
125
- } else if (a.index === b.index) {
126
- if (a.charsLeft < b.charsLeft) {
127
- return -1;
128
- } else if (a.charsLeft > b.charsLeft) {
129
- return 1;
130
- }
131
- }
132
- return 0;
133
- });
134
- for (i = 0, choicesCount = choicesRelevance.length; i < choicesCount; i++) {
135
- result.push(choicesRelevance[i].baseIndex);
136
- }
137
- return result;
138
- });
139
77
  }
140
78
  static get EDITOR_TYPE() {
141
79
  return EDITOR_TYPE;
@@ -148,13 +86,14 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
148
86
  getValue() {
149
87
  const selectedValue = this.rawChoices.find(value => {
150
88
  const strippedValue = this.stripValueIfNeeded(value);
151
- return strippedValue === this.TEXTAREA.value;
89
+ return (_assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, strippedValue) ? strippedValue.value : strippedValue) === this.TEXTAREA.value;
152
90
  });
153
91
  if ((0, _mixed.isDefined)(selectedValue)) {
154
92
  return selectedValue;
155
93
  }
156
94
  return this.TEXTAREA.value;
157
95
  }
96
+
158
97
  /**
159
98
  * Creates an editor's elements and adds necessary CSS classnames.
160
99
  */
@@ -182,6 +121,10 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
182
121
  if (this.hot.getSettings().ariaTags) {
183
122
  (0, _element.setAttribute)(this.TEXTAREA, [(0, _a11y.A11Y_EXPANDED)('false'), (0, _a11y.A11Y_CONTROLS)(`${_classPrivateFieldGet(_idPrefix, this)}-listbox-${row}-${col}`)]);
184
123
  }
124
+ this.htOptions = {
125
+ ...this.htOptions,
126
+ valueGetter: cellValue => _assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, cellValue) ? cellValue.value : cellValue
127
+ };
185
128
  }
186
129
 
187
130
  /**
@@ -314,31 +257,32 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
314
257
  const endPos = (0, _element.getSelectionEndPosition)(this.TEXTAREA);
315
258
  const sortByRelevanceSetting = this.cellProperties.sortByRelevance;
316
259
  const filterSetting = this.cellProperties.filter;
317
- let orderByRelevance = null;
260
+ const value = this.stripValueIfNeeded(this.getValue());
261
+ const comparableValue = _assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, value) ? value.value : value;
318
262
  let highlightIndex = null;
319
263
  let choices = choicesList;
320
- if (sortByRelevanceSetting) {
321
- orderByRelevance = this.sortByRelevance(this.stripValueIfNeeded(this.getValue()), choices, this.cellProperties.filteringCaseSensitive);
264
+ if (!sortByRelevanceSetting) {
265
+ choices = choices.toSorted();
322
266
  }
323
- const orderByRelevanceLength = Array.isArray(orderByRelevance) ? orderByRelevance.length : 0;
324
- if (filterSetting === false) {
325
- if (orderByRelevanceLength) {
326
- highlightIndex = orderByRelevance[0];
327
- }
328
- } else {
329
- const sorted = [];
330
- for (let i = 0, choicesCount = choices.length; i < choicesCount; i++) {
331
- if (sortByRelevanceSetting && orderByRelevanceLength <= i) {
267
+ const filteredChoiceIndexes = [];
268
+ const locale = this.cellProperties.locale;
269
+ const filteringCaseSensitive = this.cellProperties.filteringCaseSensitive;
270
+ const valueToMatch = filteringCaseSensitive ? comparableValue : comparableValue.toLocaleLowerCase(locale);
271
+ for (let i = 0; i < choices.length; i++) {
272
+ const currentItem = _assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, choices[i]) ? (0, _string.stripTags)((0, _mixed.stringify)(choices[i].value)) : (0, _string.stripTags)((0, _mixed.stringify)(choices[i]));
273
+ const itemToMatch = filteringCaseSensitive ? currentItem : currentItem.toLocaleLowerCase(locale);
274
+ if (itemToMatch.indexOf(valueToMatch) !== -1) {
275
+ filteredChoiceIndexes.push(i);
276
+ if (filterSetting === false) {
332
277
  break;
333
278
  }
334
- if (orderByRelevanceLength) {
335
- sorted.push(choices[orderByRelevance[i]]);
336
- } else {
337
- sorted.push(choices[i]);
338
- }
339
279
  }
340
- highlightIndex = 0;
341
- choices = sorted;
280
+ }
281
+ if (filterSetting === false) {
282
+ highlightIndex = filteredChoiceIndexes[0];
283
+ } else {
284
+ choices = filteredChoiceIndexes.map(index => choices[index]);
285
+ highlightIndex = choices.indexOf(valueToMatch) > -1 ? choices.indexOf(valueToMatch) : 0;
342
286
  }
343
287
  this.strippedChoices = choices;
344
288
  if (choices.length === 0) {
@@ -398,6 +342,7 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
398
342
  this.setDropdownHeight(tempHeight - lastRowHeight);
399
343
  }
400
344
  }
345
+
401
346
  /**
402
347
  * Updates width and height of the internal Handsontable's instance.
403
348
  *
@@ -497,39 +442,23 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
497
442
  *
498
443
  * @private
499
444
  * @param {string[]} values The value to sanitize.
500
- * @returns {string[]}
445
+ * @returns {Array<string|{key: string, value: string}>}
501
446
  */
502
447
  stripValuesIfNeeded(values) {
503
448
  const {
504
449
  allowHtml
505
450
  } = this.cellProperties;
506
- const stringifiedValues = (0, _array.arrayMap)(values, value => (0, _mixed.stringify)(value));
507
- const strippedValues = (0, _array.arrayMap)(stringifiedValues, value => allowHtml ? value : (0, _string.stripTags)(value));
508
- return strippedValues;
509
- }
510
-
511
- /**
512
- * Captures use of arrow down and up to control their behaviour.
513
- *
514
- * @private
515
- * @param {number} keyCode The keyboard keycode.
516
- * @returns {boolean}
517
- */
518
- allowKeyEventPropagation(keyCode) {
519
- const selectedRange = this.htEditor.getSelectedRangeLast();
520
- const selected = {
521
- row: selectedRange ? selectedRange.from.row : -1
522
- };
523
- let allowed = false;
524
- if (keyCode === _unicode.KEY_CODES.ARROW_DOWN && selected.row > 0 && selected.row < this.htEditor.countRows() - 1) {
525
- allowed = true;
526
- }
527
- if (keyCode === _unicode.KEY_CODES.ARROW_UP && selected.row > -1) {
528
- allowed = true;
451
+ const processValue = value => (0, _mixed.stringify)(allowHtml ? value : (0, _string.stripTags)(value));
452
+ if (values.every(value => _assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, value))) {
453
+ return values.map(value => {
454
+ return {
455
+ key: processValue(value.key),
456
+ value: processValue(value.value)
457
+ };
458
+ });
529
459
  }
530
- return allowed;
460
+ return values.map(value => processValue(value));
531
461
  }
532
-
533
462
  /**
534
463
  * OnBeforeKeyDown callback.
535
464
  *
@@ -566,4 +495,13 @@ function _fixDropdownWidth() {
566
495
  width: this.getTargetEditorWidth() + (0, _element.getScrollbarWidth)(this.hot.rootDocument)
567
496
  });
568
497
  }
498
+ }
499
+ /**
500
+ * Checks if the value is a key/value object.
501
+ *
502
+ * @param {*} value The value to check.
503
+ * @returns {boolean}
504
+ */
505
+ function _isKeyValueObject(value) {
506
+ return (0, _object.isObject)(value) && (0, _mixed.isDefined)(value.key) && (0, _mixed.isDefined)(value.value);
569
507
  }
@@ -1,8 +1,11 @@
1
1
  import "core-js/modules/es.error.cause.js";
2
2
  import "core-js/modules/es.array.push.js";
3
+ import "core-js/modules/es.array.to-sorted.js";
3
4
  import "core-js/modules/esnext.iterator.constructor.js";
5
+ import "core-js/modules/esnext.iterator.every.js";
4
6
  import "core-js/modules/esnext.iterator.filter.js";
5
7
  import "core-js/modules/esnext.iterator.find.js";
8
+ import "core-js/modules/esnext.iterator.map.js";
6
9
  import "core-js/modules/esnext.iterator.reduce.js";
7
10
  function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
8
11
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
@@ -13,7 +16,8 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
13
16
  function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
14
17
  function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
15
18
  import { HandsontableEditor } from "../handsontableEditor/index.mjs";
16
- import { arrayMap, pivot } from "../../helpers/array.mjs";
19
+ import { pivot } from "../../helpers/array.mjs";
20
+ import { isObject } from "../../helpers/object.mjs";
17
21
  import { addClass, getCaretPosition, getFractionalScalingCompensation, getScrollbarWidth, getSelectionEndPosition, outerWidth, setAttribute, setCaretPosition } from "../../helpers/dom/element.mjs";
18
22
  import { isDefined, stringify } from "../../helpers/mixed.mjs";
19
23
  import { stripTags } from "../../helpers/string.mjs";
@@ -67,72 +71,6 @@ export class AutocompleteEditor extends HandsontableEditor {
67
71
  _classPrivateFieldInitSpec(this, _focusDebounced, debounce(() => {
68
72
  this.focus();
69
73
  }, 100));
70
- /**
71
- * Filters and sorts by relevance.
72
- *
73
- * @param {*} value The selected value.
74
- * @param {string[]} choices The list of available choices.
75
- * @param {boolean} caseSensitive Indicates if it's sorted by case.
76
- * @returns {number[]} Array of indexes in original choices array.
77
- */
78
- _defineProperty(this, "sortByRelevance", function (value, choices, caseSensitive) {
79
- const choicesRelevance = [];
80
- const result = [];
81
- const valueLength = value.length;
82
- let choicesCount = choices.length;
83
- let charsLeft;
84
- let currentItem;
85
- let i;
86
- let valueIndex;
87
- if (valueLength === 0) {
88
- for (i = 0; i < choicesCount; i++) {
89
- result.push(i);
90
- }
91
- return result;
92
- }
93
- for (i = 0; i < choicesCount; i++) {
94
- currentItem = stripTags(stringify(choices[i]));
95
- if (caseSensitive) {
96
- valueIndex = currentItem.indexOf(value);
97
- } else {
98
- const locale = this.cellProperties.locale;
99
- valueIndex = currentItem.toLocaleLowerCase(locale).indexOf(value.toLocaleLowerCase(locale));
100
- }
101
- if (valueIndex !== -1) {
102
- charsLeft = currentItem.length - valueIndex - valueLength;
103
- choicesRelevance.push({
104
- baseIndex: i,
105
- index: valueIndex,
106
- charsLeft,
107
- value: currentItem
108
- });
109
- }
110
- }
111
- choicesRelevance.sort((a, b) => {
112
- if (b.index === -1) {
113
- return -1;
114
- }
115
- if (a.index === -1) {
116
- return 1;
117
- }
118
- if (a.index < b.index) {
119
- return -1;
120
- } else if (b.index < a.index) {
121
- return 1;
122
- } else if (a.index === b.index) {
123
- if (a.charsLeft < b.charsLeft) {
124
- return -1;
125
- } else if (a.charsLeft > b.charsLeft) {
126
- return 1;
127
- }
128
- }
129
- return 0;
130
- });
131
- for (i = 0, choicesCount = choicesRelevance.length; i < choicesCount; i++) {
132
- result.push(choicesRelevance[i].baseIndex);
133
- }
134
- return result;
135
- });
136
74
  }
137
75
  static get EDITOR_TYPE() {
138
76
  return EDITOR_TYPE;
@@ -145,13 +83,14 @@ export class AutocompleteEditor extends HandsontableEditor {
145
83
  getValue() {
146
84
  const selectedValue = this.rawChoices.find(value => {
147
85
  const strippedValue = this.stripValueIfNeeded(value);
148
- return strippedValue === this.TEXTAREA.value;
86
+ return (_assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, strippedValue) ? strippedValue.value : strippedValue) === this.TEXTAREA.value;
149
87
  });
150
88
  if (isDefined(selectedValue)) {
151
89
  return selectedValue;
152
90
  }
153
91
  return this.TEXTAREA.value;
154
92
  }
93
+
155
94
  /**
156
95
  * Creates an editor's elements and adds necessary CSS classnames.
157
96
  */
@@ -179,6 +118,10 @@ export class AutocompleteEditor extends HandsontableEditor {
179
118
  if (this.hot.getSettings().ariaTags) {
180
119
  setAttribute(this.TEXTAREA, [A11Y_EXPANDED('false'), A11Y_CONTROLS(`${_classPrivateFieldGet(_idPrefix, this)}-listbox-${row}-${col}`)]);
181
120
  }
121
+ this.htOptions = {
122
+ ...this.htOptions,
123
+ valueGetter: cellValue => _assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, cellValue) ? cellValue.value : cellValue
124
+ };
182
125
  }
183
126
 
184
127
  /**
@@ -311,31 +254,32 @@ export class AutocompleteEditor extends HandsontableEditor {
311
254
  const endPos = getSelectionEndPosition(this.TEXTAREA);
312
255
  const sortByRelevanceSetting = this.cellProperties.sortByRelevance;
313
256
  const filterSetting = this.cellProperties.filter;
314
- let orderByRelevance = null;
257
+ const value = this.stripValueIfNeeded(this.getValue());
258
+ const comparableValue = _assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, value) ? value.value : value;
315
259
  let highlightIndex = null;
316
260
  let choices = choicesList;
317
- if (sortByRelevanceSetting) {
318
- orderByRelevance = this.sortByRelevance(this.stripValueIfNeeded(this.getValue()), choices, this.cellProperties.filteringCaseSensitive);
261
+ if (!sortByRelevanceSetting) {
262
+ choices = choices.toSorted();
319
263
  }
320
- const orderByRelevanceLength = Array.isArray(orderByRelevance) ? orderByRelevance.length : 0;
321
- if (filterSetting === false) {
322
- if (orderByRelevanceLength) {
323
- highlightIndex = orderByRelevance[0];
324
- }
325
- } else {
326
- const sorted = [];
327
- for (let i = 0, choicesCount = choices.length; i < choicesCount; i++) {
328
- if (sortByRelevanceSetting && orderByRelevanceLength <= i) {
264
+ const filteredChoiceIndexes = [];
265
+ const locale = this.cellProperties.locale;
266
+ const filteringCaseSensitive = this.cellProperties.filteringCaseSensitive;
267
+ const valueToMatch = filteringCaseSensitive ? comparableValue : comparableValue.toLocaleLowerCase(locale);
268
+ for (let i = 0; i < choices.length; i++) {
269
+ const currentItem = _assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, choices[i]) ? stripTags(stringify(choices[i].value)) : stripTags(stringify(choices[i]));
270
+ const itemToMatch = filteringCaseSensitive ? currentItem : currentItem.toLocaleLowerCase(locale);
271
+ if (itemToMatch.indexOf(valueToMatch) !== -1) {
272
+ filteredChoiceIndexes.push(i);
273
+ if (filterSetting === false) {
329
274
  break;
330
275
  }
331
- if (orderByRelevanceLength) {
332
- sorted.push(choices[orderByRelevance[i]]);
333
- } else {
334
- sorted.push(choices[i]);
335
- }
336
276
  }
337
- highlightIndex = 0;
338
- choices = sorted;
277
+ }
278
+ if (filterSetting === false) {
279
+ highlightIndex = filteredChoiceIndexes[0];
280
+ } else {
281
+ choices = filteredChoiceIndexes.map(index => choices[index]);
282
+ highlightIndex = choices.indexOf(valueToMatch) > -1 ? choices.indexOf(valueToMatch) : 0;
339
283
  }
340
284
  this.strippedChoices = choices;
341
285
  if (choices.length === 0) {
@@ -395,6 +339,7 @@ export class AutocompleteEditor extends HandsontableEditor {
395
339
  this.setDropdownHeight(tempHeight - lastRowHeight);
396
340
  }
397
341
  }
342
+
398
343
  /**
399
344
  * Updates width and height of the internal Handsontable's instance.
400
345
  *
@@ -494,39 +439,23 @@ export class AutocompleteEditor extends HandsontableEditor {
494
439
  *
495
440
  * @private
496
441
  * @param {string[]} values The value to sanitize.
497
- * @returns {string[]}
442
+ * @returns {Array<string|{key: string, value: string}>}
498
443
  */
499
444
  stripValuesIfNeeded(values) {
500
445
  const {
501
446
  allowHtml
502
447
  } = this.cellProperties;
503
- const stringifiedValues = arrayMap(values, value => stringify(value));
504
- const strippedValues = arrayMap(stringifiedValues, value => allowHtml ? value : stripTags(value));
505
- return strippedValues;
506
- }
507
-
508
- /**
509
- * Captures use of arrow down and up to control their behaviour.
510
- *
511
- * @private
512
- * @param {number} keyCode The keyboard keycode.
513
- * @returns {boolean}
514
- */
515
- allowKeyEventPropagation(keyCode) {
516
- const selectedRange = this.htEditor.getSelectedRangeLast();
517
- const selected = {
518
- row: selectedRange ? selectedRange.from.row : -1
519
- };
520
- let allowed = false;
521
- if (keyCode === KEY_CODES.ARROW_DOWN && selected.row > 0 && selected.row < this.htEditor.countRows() - 1) {
522
- allowed = true;
523
- }
524
- if (keyCode === KEY_CODES.ARROW_UP && selected.row > -1) {
525
- allowed = true;
448
+ const processValue = value => stringify(allowHtml ? value : stripTags(value));
449
+ if (values.every(value => _assertClassBrand(_AutocompleteEditor_brand, this, _isKeyValueObject).call(this, value))) {
450
+ return values.map(value => {
451
+ return {
452
+ key: processValue(value.key),
453
+ value: processValue(value.value)
454
+ };
455
+ });
526
456
  }
527
- return allowed;
457
+ return values.map(value => processValue(value));
528
458
  }
529
-
530
459
  /**
531
460
  * OnBeforeKeyDown callback.
532
461
  *
@@ -562,4 +491,13 @@ function _fixDropdownWidth() {
562
491
  width: this.getTargetEditorWidth() + getScrollbarWidth(this.hot.rootDocument)
563
492
  });
564
493
  }
494
+ }
495
+ /**
496
+ * Checks if the value is a key/value object.
497
+ *
498
+ * @param {*} value The value to check.
499
+ * @returns {boolean}
500
+ */
501
+ function _isKeyValueObject(value) {
502
+ return isObject(value) && isDefined(value.key) && isDefined(value.value);
565
503
  }
@@ -196,11 +196,13 @@ class BaseEditor {
196
196
 
197
197
  // if ctrl+enter and multiple cells selected, behave like Excel (finish editing and apply to all cells)
198
198
  if (ctrlDown) {
199
- const selectedLast = this.hot.getSelectedLast();
200
- visualRowFrom = Math.max(Math.min(selectedLast[0], selectedLast[2]), 0); // Math.max eliminate headers coords.
201
- visualColumnFrom = Math.max(Math.min(selectedLast[1], selectedLast[3]), 0); // Math.max eliminate headers coords.
202
- visualRowTo = Math.max(selectedLast[0], selectedLast[2]);
203
- visualColumnTo = Math.max(selectedLast[1], selectedLast[3]);
199
+ const activeRange = this.hot.getSelectedRangeActive();
200
+ const topStartCorner = activeRange.getTopStartCorner();
201
+ const bottomEndCorner = activeRange.getBottomEndCorner();
202
+ visualRowFrom = topStartCorner.row;
203
+ visualColumnFrom = topStartCorner.col;
204
+ visualRowTo = bottomEndCorner.row;
205
+ visualColumnTo = bottomEndCorner.col;
204
206
  } else {
205
207
  [visualRowFrom, visualColumnFrom, visualRowTo, visualColumnTo] = [this.row, this.col, null, null];
206
208
  }
@@ -234,7 +236,8 @@ class BaseEditor {
234
236
  // Set the editor value only in the full edit mode. In other mode the focusable element has to be empty,
235
237
  // otherwise IME (editor for Asia users) doesn't work.
236
238
  if (this.isInFullEditMode()) {
237
- const stringifiedInitialValue = typeof newInitialValue === 'string' ? newInitialValue : (0, _mixed.stringify)(this.originalValue);
239
+ const originalValue = this.cellProperties.valueGetter ? this.cellProperties.valueGetter(this.originalValue) : this.originalValue;
240
+ const stringifiedInitialValue = typeof newInitialValue === 'string' ? newInitialValue : (0, _mixed.stringify)(originalValue);
238
241
  this.setValue(stringifiedInitialValue);
239
242
  }
240
243
  this.open(event);
@@ -251,6 +254,7 @@ class BaseEditor {
251
254
  this.hot.removeHook('afterScroll', openEditor);
252
255
  openEditor();
253
256
  }
257
+ this.addHook('beforeDialogShow', () => this.cancelChanges());
254
258
  }
255
259
 
256
260
  /**
@@ -192,11 +192,13 @@ export class BaseEditor {
192
192
 
193
193
  // if ctrl+enter and multiple cells selected, behave like Excel (finish editing and apply to all cells)
194
194
  if (ctrlDown) {
195
- const selectedLast = this.hot.getSelectedLast();
196
- visualRowFrom = Math.max(Math.min(selectedLast[0], selectedLast[2]), 0); // Math.max eliminate headers coords.
197
- visualColumnFrom = Math.max(Math.min(selectedLast[1], selectedLast[3]), 0); // Math.max eliminate headers coords.
198
- visualRowTo = Math.max(selectedLast[0], selectedLast[2]);
199
- visualColumnTo = Math.max(selectedLast[1], selectedLast[3]);
195
+ const activeRange = this.hot.getSelectedRangeActive();
196
+ const topStartCorner = activeRange.getTopStartCorner();
197
+ const bottomEndCorner = activeRange.getBottomEndCorner();
198
+ visualRowFrom = topStartCorner.row;
199
+ visualColumnFrom = topStartCorner.col;
200
+ visualRowTo = bottomEndCorner.row;
201
+ visualColumnTo = bottomEndCorner.col;
200
202
  } else {
201
203
  [visualRowFrom, visualColumnFrom, visualRowTo, visualColumnTo] = [this.row, this.col, null, null];
202
204
  }
@@ -230,7 +232,8 @@ export class BaseEditor {
230
232
  // Set the editor value only in the full edit mode. In other mode the focusable element has to be empty,
231
233
  // otherwise IME (editor for Asia users) doesn't work.
232
234
  if (this.isInFullEditMode()) {
233
- const stringifiedInitialValue = typeof newInitialValue === 'string' ? newInitialValue : stringify(this.originalValue);
235
+ const originalValue = this.cellProperties.valueGetter ? this.cellProperties.valueGetter(this.originalValue) : this.originalValue;
236
+ const stringifiedInitialValue = typeof newInitialValue === 'string' ? newInitialValue : stringify(originalValue);
234
237
  this.setValue(stringifiedInitialValue);
235
238
  }
236
239
  this.open(event);
@@ -247,6 +250,7 @@ export class BaseEditor {
247
250
  this.hot.removeHook('afterScroll', openEditor);
248
251
  openEditor();
249
252
  }
253
+ this.addHook('beforeDialogShow', () => this.cancelChanges());
250
254
  }
251
255
 
252
256
  /**
@@ -168,7 +168,7 @@ class HandsontableEditor extends _textEditor.TextEditor {
168
168
  // if focus is still in the HOT editor
169
169
  this.hot.listen(); // return the focus to the parent HOT instance
170
170
  }
171
- if (this.htEditor && this.htEditor.getSelectedLast()) {
171
+ if (this.htEditor && this.htEditor.getSelectedActive()) {
172
172
  const value = this.htEditor.getValue();
173
173
  if (value !== undefined) {
174
174
  // if the value is undefined then it means we don't want to set the value
@@ -387,14 +387,14 @@ class HandsontableEditor extends _textEditor.TextEditor {
387
387
  const innerHOT = this.htEditor;
388
388
  let rowToSelect;
389
389
  let selectedRow;
390
- if (!innerHOT.getSelectedLast() && this.isFlippedVertically) {
390
+ if (!innerHOT.getSelectedActive() && this.isFlippedVertically) {
391
391
  rowToSelect = innerHOT.countRows() - 1;
392
- } else if (innerHOT.getSelectedLast()) {
392
+ } else if (innerHOT.getSelectedActive()) {
393
393
  if (this.isFlippedVertically) {
394
- selectedRow = innerHOT.getSelectedLast()[0];
394
+ selectedRow = innerHOT.getSelectedActive()[0];
395
395
  rowToSelect = Math.max(0, selectedRow - 1);
396
396
  } else {
397
- selectedRow = innerHOT.getSelectedLast()[0];
397
+ selectedRow = innerHOT.getSelectedActive()[0];
398
398
  rowToSelect = selectedRow - 1;
399
399
  }
400
400
  }
@@ -407,14 +407,14 @@ class HandsontableEditor extends _textEditor.TextEditor {
407
407
  const innerHOT = this.htEditor;
408
408
  let rowToSelect;
409
409
  let selectedRow;
410
- if (!innerHOT.getSelectedLast() && !this.isFlippedVertically) {
410
+ if (!innerHOT.getSelectedActive() && !this.isFlippedVertically) {
411
411
  rowToSelect = 0;
412
- } else if (innerHOT.getSelectedLast()) {
412
+ } else if (innerHOT.getSelectedActive()) {
413
413
  if (this.isFlippedVertically) {
414
- rowToSelect = innerHOT.getSelectedLast()[0] + 1;
414
+ rowToSelect = innerHOT.getSelectedActive()[0] + 1;
415
415
  } else if (!this.isFlippedVertically) {
416
416
  const lastRow = innerHOT.countRows() - 1;
417
- selectedRow = innerHOT.getSelectedLast()[0];
417
+ selectedRow = innerHOT.getSelectedActive()[0];
418
418
  rowToSelect = Math.min(lastRow, selectedRow + 1);
419
419
  }
420
420
  }
@@ -165,7 +165,7 @@ export class HandsontableEditor extends TextEditor {
165
165
  // if focus is still in the HOT editor
166
166
  this.hot.listen(); // return the focus to the parent HOT instance
167
167
  }
168
- if (this.htEditor && this.htEditor.getSelectedLast()) {
168
+ if (this.htEditor && this.htEditor.getSelectedActive()) {
169
169
  const value = this.htEditor.getValue();
170
170
  if (value !== undefined) {
171
171
  // if the value is undefined then it means we don't want to set the value
@@ -384,14 +384,14 @@ export class HandsontableEditor extends TextEditor {
384
384
  const innerHOT = this.htEditor;
385
385
  let rowToSelect;
386
386
  let selectedRow;
387
- if (!innerHOT.getSelectedLast() && this.isFlippedVertically) {
387
+ if (!innerHOT.getSelectedActive() && this.isFlippedVertically) {
388
388
  rowToSelect = innerHOT.countRows() - 1;
389
- } else if (innerHOT.getSelectedLast()) {
389
+ } else if (innerHOT.getSelectedActive()) {
390
390
  if (this.isFlippedVertically) {
391
- selectedRow = innerHOT.getSelectedLast()[0];
391
+ selectedRow = innerHOT.getSelectedActive()[0];
392
392
  rowToSelect = Math.max(0, selectedRow - 1);
393
393
  } else {
394
- selectedRow = innerHOT.getSelectedLast()[0];
394
+ selectedRow = innerHOT.getSelectedActive()[0];
395
395
  rowToSelect = selectedRow - 1;
396
396
  }
397
397
  }
@@ -404,14 +404,14 @@ export class HandsontableEditor extends TextEditor {
404
404
  const innerHOT = this.htEditor;
405
405
  let rowToSelect;
406
406
  let selectedRow;
407
- if (!innerHOT.getSelectedLast() && !this.isFlippedVertically) {
407
+ if (!innerHOT.getSelectedActive() && !this.isFlippedVertically) {
408
408
  rowToSelect = 0;
409
- } else if (innerHOT.getSelectedLast()) {
409
+ } else if (innerHOT.getSelectedActive()) {
410
410
  if (this.isFlippedVertically) {
411
- rowToSelect = innerHOT.getSelectedLast()[0] + 1;
411
+ rowToSelect = innerHOT.getSelectedActive()[0] + 1;
412
412
  } else if (!this.isFlippedVertically) {
413
413
  const lastRow = innerHOT.countRows() - 1;
414
- selectedRow = innerHOT.getSelectedLast()[0];
414
+ selectedRow = innerHOT.getSelectedActive()[0];
415
415
  rowToSelect = Math.min(lastRow, selectedRow + 1);
416
416
  }
417
417
  }
@@ -346,13 +346,6 @@ class TextEditor extends _baseEditor.BaseEditor {
346
346
  });
347
347
  }
348
348
 
349
- /**
350
- * Ugly hack for autocompleteEditor.
351
- *
352
- * @private
353
- */
354
- allowKeyEventPropagation() {}
355
-
356
349
  /**
357
350
  * Destroys the internal event manager and clears attached hooks.
358
351
  *