handsontable 0.0.0-next-010265d-20231005 → 0.0.0-next-9379dd1-20231020

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of handsontable might be problematic. Click here for more details.

Files changed (414) hide show
  1. package/3rdparty/walkontable/src/cell/coords.d.ts +6 -1
  2. package/3rdparty/walkontable/src/cell/coords.js +50 -11
  3. package/3rdparty/walkontable/src/cell/coords.mjs +50 -11
  4. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  5. package/3rdparty/walkontable/src/cell/range.js +38 -7
  6. package/3rdparty/walkontable/src/cell/range.mjs +38 -7
  7. package/3rdparty/walkontable/src/core/_base.js +9 -3
  8. package/3rdparty/walkontable/src/core/_base.mjs +9 -3
  9. package/3rdparty/walkontable/src/core/clone.js +2 -2
  10. package/3rdparty/walkontable/src/core/clone.mjs +2 -2
  11. package/3rdparty/walkontable/src/core/core.js +3 -2
  12. package/3rdparty/walkontable/src/core/core.mjs +3 -2
  13. package/3rdparty/walkontable/src/event.js +12 -10
  14. package/3rdparty/walkontable/src/event.mjs +12 -10
  15. package/3rdparty/walkontable/src/facade/core.js +2 -2
  16. package/3rdparty/walkontable/src/facade/core.mjs +2 -2
  17. package/3rdparty/walkontable/src/index.js +10 -2
  18. package/3rdparty/walkontable/src/index.mjs +2 -2
  19. package/3rdparty/walkontable/src/overlay/_base.js +13 -2
  20. package/3rdparty/walkontable/src/overlay/_base.mjs +14 -3
  21. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
  22. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
  23. package/3rdparty/walkontable/src/overlay/top.js +2 -6
  24. package/3rdparty/walkontable/src/overlay/top.mjs +2 -6
  25. package/3rdparty/walkontable/src/renderer/cells.js +10 -0
  26. package/3rdparty/walkontable/src/renderer/cells.mjs +11 -1
  27. package/3rdparty/walkontable/src/renderer/columnHeaders.js +10 -0
  28. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +11 -1
  29. package/3rdparty/walkontable/src/renderer/rowHeaders.js +5 -0
  30. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +5 -0
  31. package/3rdparty/walkontable/src/renderer/rows.js +13 -0
  32. package/3rdparty/walkontable/src/renderer/rows.mjs +13 -0
  33. package/3rdparty/walkontable/src/renderer/table.js +9 -0
  34. package/3rdparty/walkontable/src/renderer/table.mjs +9 -0
  35. package/3rdparty/walkontable/src/scroll.js +2 -0
  36. package/3rdparty/walkontable/src/scroll.mjs +2 -0
  37. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +7 -12
  38. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  39. package/3rdparty/walkontable/src/selection/border/constants.js +16 -0
  40. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  41. package/3rdparty/walkontable/src/selection/constants.js +62 -0
  42. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  43. package/3rdparty/walkontable/src/selection/index.js +26 -0
  44. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  45. package/3rdparty/walkontable/src/selection/manager.js +274 -0
  46. package/3rdparty/walkontable/src/selection/manager.mjs +269 -0
  47. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  48. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  49. package/3rdparty/walkontable/src/selection/selection.js +101 -0
  50. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  51. package/3rdparty/walkontable/src/settings.js +13 -4
  52. package/3rdparty/walkontable/src/settings.mjs +13 -4
  53. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
  54. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  55. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
  56. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  57. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
  58. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  59. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
  60. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  61. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
  62. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  63. package/3rdparty/walkontable/src/table.js +19 -78
  64. package/3rdparty/walkontable/src/table.mjs +20 -79
  65. package/base.js +2 -2
  66. package/base.mjs +2 -2
  67. package/cellTypes/dateType/dateType.d.ts +3 -3
  68. package/cellTypes/dateType/dateType.js +2 -2
  69. package/cellTypes/dateType/dateType.mjs +2 -2
  70. package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
  71. package/cellTypes/handsontableType/handsontableType.js +2 -2
  72. package/cellTypes/handsontableType/handsontableType.mjs +2 -2
  73. package/cellTypes/index.d.ts +3 -0
  74. package/cellTypes/index.js +4 -0
  75. package/cellTypes/index.mjs +3 -1
  76. package/cellTypes/selectType/index.d.ts +1 -0
  77. package/cellTypes/selectType/index.js +6 -0
  78. package/cellTypes/selectType/index.mjs +1 -0
  79. package/cellTypes/selectType/selectType.d.ts +14 -0
  80. package/cellTypes/selectType/selectType.js +13 -0
  81. package/cellTypes/selectType/selectType.mjs +8 -0
  82. package/core/focusCatcher/focusDetector.js +63 -0
  83. package/core/focusCatcher/focusDetector.mjs +59 -0
  84. package/core/focusCatcher/index.js +142 -0
  85. package/core/focusCatcher/index.mjs +138 -0
  86. package/core/index.js +9 -0
  87. package/core/index.mjs +1 -0
  88. package/core.d.ts +9 -4
  89. package/core.js +285 -327
  90. package/core.mjs +285 -327
  91. package/dataMap/metaManager/metaSchema.js +65 -0
  92. package/dataMap/metaManager/metaSchema.mjs +65 -0
  93. package/dataMap/metaManager/mods/extendMetaProperties.js +7 -1
  94. package/dataMap/metaManager/mods/extendMetaProperties.mjs +7 -1
  95. package/dataMap/replaceData.js +5 -0
  96. package/dataMap/replaceData.mjs +5 -0
  97. package/dist/handsontable.css +40 -5
  98. package/dist/handsontable.full.css +40 -5
  99. package/dist/handsontable.full.js +11744 -6945
  100. package/dist/handsontable.full.min.css +4 -4
  101. package/dist/handsontable.full.min.js +141 -141
  102. package/dist/handsontable.js +14036 -9237
  103. package/dist/handsontable.min.css +3 -3
  104. package/dist/handsontable.min.js +21 -21
  105. package/dist/languages/all.js +6 -2
  106. package/dist/languages/all.min.js +1 -1
  107. package/dist/languages/en-US.js +3 -1
  108. package/dist/languages/en-US.min.js +1 -1
  109. package/dist/languages/pl-PL.js +3 -1
  110. package/dist/languages/pl-PL.min.js +1 -1
  111. package/editorManager.js +15 -87
  112. package/editorManager.mjs +16 -87
  113. package/editors/autocompleteEditor/autocompleteEditor.js +53 -2
  114. package/editors/autocompleteEditor/autocompleteEditor.mjs +54 -3
  115. package/editors/dateEditor/dateEditor.js +26 -7
  116. package/editors/dateEditor/dateEditor.mjs +27 -8
  117. package/editors/handsontableEditor/handsontableEditor.js +9 -1
  118. package/editors/handsontableEditor/handsontableEditor.mjs +10 -2
  119. package/editors/textEditor/textEditor.js +19 -27
  120. package/editors/textEditor/textEditor.mjs +22 -30
  121. package/focusManager.d.ts +12 -0
  122. package/focusManager.js +265 -0
  123. package/focusManager.mjs +261 -0
  124. package/helpers/a11y.js +79 -0
  125. package/helpers/a11y.mjs +38 -0
  126. package/helpers/dom/element.js +188 -9
  127. package/helpers/dom/element.mjs +182 -9
  128. package/helpers/mixed.js +1 -1
  129. package/helpers/mixed.mjs +1 -1
  130. package/helpers/number.d.ts +1 -0
  131. package/helpers/number.js +18 -0
  132. package/helpers/number.mjs +17 -0
  133. package/i18n/constants.js +7 -1
  134. package/i18n/constants.mjs +4 -1
  135. package/i18n/languages/en-US.js +3 -1
  136. package/i18n/languages/en-US.mjs +3 -1
  137. package/i18n/languages/pl-PL.js +3 -1
  138. package/i18n/languages/pl-PL.mjs +3 -1
  139. package/languages/all.js +6 -2
  140. package/languages/en-US.js +3 -1
  141. package/languages/en-US.mjs +3 -1
  142. package/languages/index.js +6 -2
  143. package/languages/pl-PL.js +3 -1
  144. package/languages/pl-PL.mjs +3 -1
  145. package/package.json +21 -1
  146. package/pluginHooks.d.ts +12 -1
  147. package/pluginHooks.js +152 -1
  148. package/pluginHooks.mjs +152 -1
  149. package/plugins/collapsibleColumns/collapsibleColumns.js +74 -4
  150. package/plugins/collapsibleColumns/collapsibleColumns.mjs +75 -5
  151. package/plugins/columnSorting/columnSorting.js +43 -0
  152. package/plugins/columnSorting/columnSorting.mjs +44 -3
  153. package/plugins/columnSorting/index.js +3 -1
  154. package/plugins/columnSorting/index.mjs +1 -1
  155. package/plugins/comments/commentEditor.js +1 -0
  156. package/plugins/comments/commentEditor.mjs +1 -0
  157. package/plugins/comments/comments.js +252 -189
  158. package/plugins/comments/comments.mjs +251 -190
  159. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  160. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  161. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  162. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  163. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  164. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  165. package/plugins/contextMenu/commandExecutor.js +2 -3
  166. package/plugins/contextMenu/commandExecutor.mjs +2 -3
  167. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  168. package/plugins/contextMenu/contextMenu.js +75 -36
  169. package/plugins/contextMenu/contextMenu.mjs +74 -35
  170. package/plugins/contextMenu/itemsFactory.js +2 -3
  171. package/plugins/contextMenu/itemsFactory.mjs +3 -4
  172. package/plugins/contextMenu/{cursor.mjs → menu/cursor.js} +6 -4
  173. package/plugins/contextMenu/{cursor.js → menu/cursor.mjs} +4 -10
  174. package/plugins/contextMenu/menu/index.js +9 -0
  175. package/plugins/contextMenu/menu/index.mjs +1 -0
  176. package/plugins/contextMenu/{menu.js → menu/menu.js} +96 -308
  177. package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +97 -309
  178. package/plugins/contextMenu/menu/navigator.js +152 -0
  179. package/plugins/contextMenu/menu/navigator.mjs +148 -0
  180. package/plugins/contextMenu/menu/positioner.js +213 -0
  181. package/plugins/contextMenu/menu/positioner.mjs +209 -0
  182. package/plugins/contextMenu/menu/utils.js +177 -0
  183. package/plugins/contextMenu/menu/utils.mjs +163 -0
  184. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  185. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  186. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  187. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  188. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  189. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  190. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  191. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  192. package/plugins/contextMenu/{predefinedItems.js → predefinedItems/index.js} +14 -14
  193. package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
  194. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  195. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  196. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  197. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  198. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  199. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  200. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  201. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  202. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  203. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  204. package/plugins/contextMenu/utils.js +35 -151
  205. package/plugins/contextMenu/utils.mjs +35 -144
  206. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  207. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  208. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  209. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  210. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  211. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  212. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  213. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  214. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  215. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  216. package/plugins/copyPaste/copyPaste.js +127 -78
  217. package/plugins/copyPaste/copyPaste.mjs +128 -79
  218. package/plugins/customBorders/customBorders.js +23 -20
  219. package/plugins/customBorders/customBorders.mjs +24 -21
  220. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  221. package/plugins/dropdownMenu/dropdownMenu.js +97 -38
  222. package/plugins/dropdownMenu/dropdownMenu.mjs +96 -37
  223. package/plugins/filters/constants.mjs +1 -1
  224. package/plugins/filters/filters.js +31 -14
  225. package/plugins/filters/filters.mjs +31 -14
  226. package/plugins/filters/ui/select.js +3 -3
  227. package/plugins/filters/ui/select.mjs +2 -2
  228. package/plugins/hiddenColumns/hiddenColumns.mjs +1 -1
  229. package/plugins/hiddenRows/hiddenRows.mjs +1 -1
  230. package/plugins/manualColumnMove/manualColumnMove.js +3 -1
  231. package/plugins/manualColumnMove/manualColumnMove.mjs +3 -1
  232. package/plugins/mergeCells/mergeCells.js +5 -16
  233. package/plugins/mergeCells/mergeCells.mjs +5 -16
  234. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  235. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  236. package/plugins/nestedHeaders/nestedHeaders.js +240 -10
  237. package/plugins/nestedHeaders/nestedHeaders.mjs +241 -11
  238. package/plugins/nestedHeaders/stateManager/index.js +102 -3
  239. package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
  240. package/plugins/nestedRows/nestedRows.js +41 -0
  241. package/plugins/nestedRows/nestedRows.mjs +41 -0
  242. package/plugins/nestedRows/ui/headers.js +11 -0
  243. package/plugins/nestedRows/ui/headers.mjs +12 -1
  244. package/renderers/autocompleteRenderer/autocompleteRenderer.js +8 -0
  245. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
  246. package/renderers/baseRenderer/baseRenderer.js +17 -0
  247. package/renderers/baseRenderer/baseRenderer.mjs +18 -1
  248. package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
  249. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  250. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  251. package/renderers/dateRenderer/dateRenderer.js +29 -0
  252. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  253. package/renderers/dateRenderer/index.d.ts +1 -0
  254. package/renderers/dateRenderer/index.js +6 -0
  255. package/renderers/dateRenderer/index.mjs +1 -0
  256. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  257. package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
  258. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  259. package/renderers/handsontableRenderer/index.d.ts +1 -0
  260. package/renderers/handsontableRenderer/index.js +6 -0
  261. package/renderers/handsontableRenderer/index.mjs +1 -0
  262. package/renderers/index.d.ts +9 -0
  263. package/renderers/selectRenderer/index.d.ts +1 -0
  264. package/renderers/selectRenderer/index.js +6 -0
  265. package/renderers/selectRenderer/index.mjs +1 -0
  266. package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
  267. package/renderers/selectRenderer/selectRenderer.js +27 -0
  268. package/renderers/selectRenderer/selectRenderer.mjs +22 -0
  269. package/selection/highlight/highlight.js +256 -71
  270. package/selection/highlight/highlight.mjs +250 -71
  271. package/selection/highlight/types/activeHeader.js +10 -8
  272. package/selection/highlight/types/activeHeader.mjs +10 -8
  273. package/selection/highlight/types/area.js +6 -18
  274. package/selection/highlight/types/area.mjs +6 -18
  275. package/selection/highlight/types/areaLayered.js +31 -0
  276. package/selection/highlight/types/areaLayered.mjs +26 -0
  277. package/selection/highlight/types/column.js +27 -0
  278. package/selection/highlight/types/column.mjs +22 -0
  279. package/selection/highlight/types/customSelection.js +7 -9
  280. package/selection/highlight/types/customSelection.mjs +7 -9
  281. package/selection/highlight/types/fill.js +5 -7
  282. package/selection/highlight/types/fill.mjs +5 -7
  283. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  284. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  285. package/selection/highlight/types/header.js +9 -18
  286. package/selection/highlight/types/header.mjs +9 -18
  287. package/selection/highlight/types/row.js +27 -0
  288. package/selection/highlight/types/row.mjs +22 -0
  289. package/selection/highlight/visualSelection.js +31 -27
  290. package/selection/highlight/visualSelection.mjs +31 -27
  291. package/selection/index.js +4 -7
  292. package/selection/index.mjs +2 -3
  293. package/selection/mouseEventHandler.js +7 -1
  294. package/selection/mouseEventHandler.mjs +7 -1
  295. package/selection/range.js +8 -8
  296. package/selection/range.mjs +8 -8
  297. package/selection/selection.js +321 -152
  298. package/selection/selection.mjs +318 -151
  299. package/selection/transformation.js +232 -90
  300. package/selection/transformation.mjs +232 -90
  301. package/selection/utils.js +15 -21
  302. package/selection/utils.mjs +16 -21
  303. package/settings.d.ts +4 -0
  304. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  305. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  306. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  307. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  308. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  309. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  310. package/shortcutContexts/commands/editor/index.js +16 -0
  311. package/shortcutContexts/commands/editor/index.mjs +12 -0
  312. package/shortcutContexts/commands/editor/open.js +27 -0
  313. package/shortcutContexts/commands/editor/open.mjs +23 -0
  314. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  315. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  316. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  317. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  318. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +25 -0
  319. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
  320. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  321. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  322. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  323. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  324. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  325. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  326. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  327. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  328. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  329. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  330. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  331. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  332. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  333. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  334. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  335. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  336. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  337. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  338. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  339. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  340. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  341. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  342. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  343. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  344. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +25 -0
  345. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
  346. package/shortcutContexts/commands/index.js +35 -0
  347. package/shortcutContexts/commands/index.mjs +31 -0
  348. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  349. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  350. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +33 -0
  351. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
  352. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  353. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  354. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  355. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  356. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  357. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  358. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  359. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  360. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  361. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  362. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  363. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  364. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  365. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  366. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  367. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  368. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  369. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  370. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  371. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  372. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  373. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  374. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  375. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  376. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  377. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  378. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  379. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  380. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +33 -0
  381. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
  382. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  383. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  384. package/shortcutContexts/commands/scrollToFocusedCell.js +35 -0
  385. package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
  386. package/shortcutContexts/commands/selectAll.js +12 -0
  387. package/shortcutContexts/commands/selectAll.mjs +8 -0
  388. package/shortcutContexts/constants.js +13 -0
  389. package/shortcutContexts/constants.mjs +8 -0
  390. package/shortcutContexts/editor.js +25 -0
  391. package/shortcutContexts/editor.mjs +21 -0
  392. package/shortcutContexts/grid.js +163 -0
  393. package/shortcutContexts/grid.mjs +159 -0
  394. package/shortcutContexts/index.js +24 -0
  395. package/shortcutContexts/index.mjs +11 -0
  396. package/shortcuts/context.js +20 -2
  397. package/shortcuts/context.mjs +20 -3
  398. package/shortcuts/manager.js +25 -7
  399. package/shortcuts/manager.mjs +26 -7
  400. package/shortcuts/recorder.js +3 -3
  401. package/shortcuts/recorder.mjs +3 -3
  402. package/shortcuts/utils.js +19 -5
  403. package/shortcuts/utils.mjs +18 -4
  404. package/tableView.js +111 -13
  405. package/tableView.mjs +112 -14
  406. package/3rdparty/walkontable/src/selection.js +0 -295
  407. package/3rdparty/walkontable/src/selection.mjs +0 -290
  408. package/plugins/contextMenu/predefinedItems.mjs +0 -68
  409. package/plugins/copyPaste/focusableElement.js +0 -186
  410. package/plugins/copyPaste/focusableElement.mjs +0 -180
  411. package/selection/highlight/constants.js +0 -15
  412. package/selection/highlight/constants.mjs +0 -6
  413. package/selection/highlight/types/index.js +0 -35
  414. package/selection/highlight/types/index.mjs +0 -31
@@ -1,17 +1,18 @@
1
1
  import "core-js/modules/es.array.push.js";
2
- import Cursor from "./cursor.mjs";
3
- import { SEPARATOR, NO_ITEMS, predefinedItems } from "./predefinedItems.mjs";
4
- import { filterSeparators, hasSubMenu, isDisabled, isItemHidden, isSeparator, isSelectionDisabled, normalizeSelection } from "./utils.mjs";
5
- import Core from "../../core.mjs";
6
- import EventManager from "../../eventManager.mjs";
7
- import { arrayEach, arrayFilter, arrayReduce } from "../../helpers/array.mjs";
8
- import { isWindowsOS, isMobileBrowser, isIpadOS } from "../../helpers/browser.mjs";
9
- import { addClass, empty, fastInnerHTML, isChildOf, isInput, removeClass, getParentWindow, hasClass } from "../../helpers/dom/element.mjs";
10
- import { isRightClick } from "../../helpers/dom/event.mjs";
11
- import { debounce, isFunction } from "../../helpers/function.mjs";
12
- import { isUndefined, isDefined } from "../../helpers/mixed.mjs";
13
- import { mixin, hasOwnProperty } from "../../helpers/object.mjs";
14
- import localHooks from "../../mixins/localHooks.mjs";
2
+ import { Positioner } from "./positioner.mjs";
3
+ import { Navigator } from "./navigator.mjs";
4
+ import { SEPARATOR, NO_ITEMS, predefinedItems } from "./../predefinedItems/index.mjs";
5
+ import { filterSeparators, hasSubMenu, isItemHidden, normalizeSelection, isItemSubMenu, isItemDisabled, isItemSelectionDisabled, isItemSeparator } from "./utils.mjs";
6
+ import EventManager from "../../../eventManager.mjs";
7
+ import { arrayEach, arrayFilter, arrayReduce } from "../../../helpers/array.mjs";
8
+ import { isWindowsOS, isMobileBrowser, isIpadOS } from "../../../helpers/browser.mjs";
9
+ import { addClass, empty, fastInnerHTML, isChildOf, isInput, removeClass, getParentWindow, hasClass, setAttribute } from "../../../helpers/dom/element.mjs";
10
+ import { isRightClick } from "../../../helpers/dom/event.mjs";
11
+ import { debounce, isFunction } from "../../../helpers/function.mjs";
12
+ import { isUndefined, isDefined } from "../../../helpers/mixed.mjs";
13
+ import { mixin } from "../../../helpers/object.mjs";
14
+ import localHooks from "../../../mixins/localHooks.mjs";
15
+ import { A11Y_DISABLED, A11Y_EXPANDED, A11Y_LABEL, A11Y_MENU, A11Y_MENU_ITEM } from "../../../helpers/a11y.mjs";
15
16
  const MIN_WIDTH = 215;
16
17
  const SHORTCUTS_CONTEXT = 'menu';
17
18
  const SHORTCUTS_GROUP = SHORTCUTS_CONTEXT;
@@ -31,7 +32,7 @@ const SHORTCUTS_GROUP = SHORTCUTS_CONTEXT;
31
32
  * @private
32
33
  * @class Menu
33
34
  */
34
- class Menu {
35
+ export class Menu {
35
36
  /**
36
37
  * @param {Core} hotInstance Handsontable instance.
37
38
  * @param {MenuOptions} [options] Menu options.
@@ -49,18 +50,13 @@ class Menu {
49
50
  };
50
51
  this.eventManager = new EventManager(this);
51
52
  this.container = this.createContainer(this.options.name);
53
+ this.positioner = new Positioner(this.options.keepInViewport);
54
+ this.navigator = new Navigator();
52
55
  this.hotMenu = null;
53
56
  this.hotSubMenus = {};
54
57
  this.parentMenu = this.options.parent || null;
55
58
  this.menuItems = null;
56
59
  this.origOutsideClickDeselects = null;
57
- this.keyEvent = false;
58
- this.offset = {
59
- above: 0,
60
- below: 0,
61
- left: 0,
62
- right: 0
63
- };
64
60
  this._afterScrollCallback = null;
65
61
  this.registerEvents();
66
62
  }
@@ -106,17 +102,6 @@ class Menu {
106
102
  return Array.isArray(this.hotMenu.getSelectedLast());
107
103
  }
108
104
 
109
- /**
110
- * Set offset menu position for specified area (`above`, `below`, `left` or `right`).
111
- *
112
- * @param {string} area Specified area name (`above`, `below`, `left` or `right`).
113
- * @param {number} offset Offset value.
114
- */
115
- setOffset(area) {
116
- let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
117
- this.offset[area] = offset;
118
- }
119
-
120
105
  /**
121
106
  * Check if menu is using as sub-menu.
122
107
  *
@@ -133,7 +118,6 @@ class Menu {
133
118
  * @fires Hooks#afterContextMenuShow
134
119
  */
135
120
  open() {
136
- var _this = this;
137
121
  this.runLocalHooks('beforeOpen');
138
122
  this.container.removeAttribute('style');
139
123
  this.container.style.display = 'block';
@@ -178,6 +162,7 @@ class Menu {
178
162
  outsideClickDeselects: false,
179
163
  disableVisualSelection: 'area',
180
164
  layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr',
165
+ ariaTags: false,
181
166
  afterOnCellMouseOver: (event, coords) => {
182
167
  if (this.isAllSubMenusClosed()) {
183
168
  delayedOpenSubMenu(coords.row);
@@ -195,6 +180,12 @@ class Menu {
195
180
  this.close(true);
196
181
  }
197
182
  },
183
+ afterSelection: (row, column, row2, column2, preventScrolling) => {
184
+ // do not scroll the viewport when mouse clicks on partially visible menu item
185
+ if (this.hotMenu.view.isMouseDown()) {
186
+ preventScrolling.value = true;
187
+ }
188
+ },
198
189
  beforeOnCellMouseUp: event => {
199
190
  if (this.hasSelectedItem()) {
200
191
  shouldAutoCloseMenu = !this.isCommandPassive(this.getSelectedItem());
@@ -212,7 +203,7 @@ class Menu {
212
203
  // event hides the tapped element, the click event grabs the element below. As a result, the filter
213
204
  // by condition menu is closed and immediately open on tapping the "None" item.
214
205
  if (isMobileBrowser() || isIpadOS()) {
215
- setTimeout(() => this.close(true), 325);
206
+ this.hot._registerTimeout(() => this.close(true), 325);
216
207
  } else {
217
208
  this.close(true);
218
209
  }
@@ -228,13 +219,11 @@ class Menu {
228
219
  };
229
220
  this.origOutsideClickDeselects = this.hot.getSettings().outsideClickDeselects;
230
221
  this.hot.getSettings().outsideClickDeselects = false;
231
- this.hotMenu = new Core(this.container, settings);
222
+ this.hotMenu = new this.hot.constructor(this.container, settings);
232
223
  this.hotMenu.addHook('afterInit', () => this.onAfterInit());
233
- this.hotMenu.addHook('afterSelection', function () {
234
- return _this.onAfterSelection(...arguments);
235
- });
236
224
  this.hotMenu.init();
237
225
  this.hotMenu.listen();
226
+ this.navigator.setMenu(this.hotMenu);
238
227
  const shortcutManager = this.hotMenu.getShortcutManager();
239
228
  const menuContext = shortcutManager.addContext(SHORTCUTS_GROUP);
240
229
  const config = {
@@ -242,105 +231,84 @@ class Menu {
242
231
  };
243
232
  const menuContextConfig = {
244
233
  ...config,
245
- runOnlyIf: event => isInput(event.target) === false || this.container.contains(event.target) === false
234
+ runOnlyIf: event => !isInput(event.target) || !this.container.contains(event.target)
246
235
  };
247
236
 
248
237
  // Default shortcuts for Handsontable should not be handled. Changing context will help with that.
249
238
  shortcutManager.setActiveContextName('menu');
250
239
  menuContext.addShortcuts([{
240
+ keys: [['Tab'], ['Shift', 'Tab'], ['Control/Meta', 'A']],
241
+ forwardToContext: this.hot.getShortcutManager().getContext('grid'),
242
+ callback: () => this.close(true)
243
+ }, {
251
244
  keys: [['Escape']],
252
- callback: () => {
253
- this.keyEvent = true;
254
- this.close();
255
- this.keyEvent = false;
256
- }
245
+ callback: () => this.close(true)
257
246
  }, {
258
247
  keys: [['ArrowDown']],
259
- callback: () => {
260
- const selection = this.hotMenu.getSelectedLast();
261
- this.keyEvent = true;
262
- if (selection) {
263
- this.selectNextCell(selection[0], selection[1]);
264
- } else {
265
- this.selectFirstCell();
266
- }
267
- this.keyEvent = false;
268
- }
248
+ callback: () => this.navigator.selectNext()
269
249
  }, {
270
250
  keys: [['ArrowUp']],
271
- callback: () => {
272
- const selection = this.hotMenu.getSelectedLast();
273
- this.keyEvent = true;
274
- if (selection) {
275
- this.selectPrevCell(selection[0], selection[1]);
276
- } else {
277
- this.selectLastCell();
278
- }
279
- this.keyEvent = false;
280
- }
251
+ callback: () => this.navigator.selectPrev()
281
252
  }, {
282
253
  keys: [['ArrowRight']],
283
254
  callback: () => {
284
255
  const selection = this.hotMenu.getSelectedLast();
285
- this.keyEvent = true;
286
256
  if (selection) {
287
- const menu = this.openSubMenu(selection[0]);
288
- if (menu) {
289
- menu.selectFirstCell();
257
+ const subMenu = this.openSubMenu(selection[0]);
258
+ if (subMenu) {
259
+ subMenu.navigator.selectFirst();
290
260
  }
291
261
  }
292
- this.keyEvent = false;
293
262
  }
294
263
  }, {
295
264
  keys: [['ArrowLeft']],
296
265
  callback: () => {
297
266
  const selection = this.hotMenu.getSelectedLast();
298
- this.keyEvent = true;
299
267
  if (selection && this.isSubMenu()) {
300
268
  this.close();
301
- if (this.parentMenu) {
269
+ if (this.isSubMenu()) {
302
270
  this.parentMenu.hotMenu.listen();
303
271
  }
304
272
  }
305
- this.keyEvent = false;
306
273
  }
307
274
  }, {
308
- keys: [['Enter']],
275
+ keys: [['Control/Meta', 'ArrowUp'], ['Home']],
276
+ callback: () => this.navigator.selectFirst()
277
+ }, {
278
+ keys: [['Control/Meta', 'ArrowDown'], ['End']],
279
+ callback: () => this.navigator.selectLast()
280
+ }, {
281
+ keys: [['Enter'], ['Space']],
309
282
  callback: event => {
310
283
  const selection = this.hotMenu.getSelectedLast();
311
- this.keyEvent = true;
312
- if (!this.hotMenu.getSourceDataAtRow(selection[0]).submenu) {
284
+ if (this.hotMenu.getSourceDataAtRow(selection[0]).submenu) {
285
+ this.openSubMenu(selection[0]).navigator.selectFirst();
286
+ } else {
313
287
  this.executeCommand(event);
314
288
  this.close(true);
315
289
  }
316
- this.keyEvent = false;
317
290
  }
318
291
  }, {
319
292
  keys: [['PageUp']],
320
293
  callback: () => {
321
294
  const selection = this.hotMenu.getSelectedLast();
322
- this.keyEvent = true;
323
295
  if (selection) {
324
296
  this.hotMenu.selection.transformStart(-this.hotMenu.countVisibleRows(), 0);
325
297
  } else {
326
- this.selectFirstCell();
298
+ this.navigator.selectFirst();
327
299
  }
328
- this.keyEvent = false;
329
300
  }
330
301
  }, {
331
302
  keys: [['PageDown']],
332
303
  callback: () => {
333
304
  const selection = this.hotMenu.getSelectedLast();
334
- this.keyEvent = true;
335
305
  if (selection) {
336
306
  this.hotMenu.selection.transformStart(this.hotMenu.countVisibleRows(), 0);
337
307
  } else {
338
- this.selectLastCell();
308
+ this.navigator.selectLast();
339
309
  }
340
- this.keyEvent = false;
341
310
  }
342
311
  }], menuContextConfig);
343
- this.blockMainTableCallbacks();
344
312
  this.runLocalHooks('afterOpen');
345
313
  }
346
314
 
@@ -354,17 +322,24 @@ class Menu {
354
322
  if (!this.isOpened()) {
355
323
  return;
356
324
  }
357
- if (closeParent && this.parentMenu) {
325
+ if (closeParent && this.isSubMenu()) {
358
326
  this.parentMenu.close();
359
327
  } else {
328
+ this.navigator.clear();
360
329
  this.closeAllSubMenus();
361
330
  this.container.style.display = 'none';
362
- this.releaseMainTableCallbacks();
363
331
  this.hotMenu.destroy();
364
332
  this.hotMenu = null;
365
333
  this.hot.getSettings().outsideClickDeselects = this.origOutsideClickDeselects;
366
334
  this.runLocalHooks('afterClose');
367
- if (this.parentMenu) {
335
+ if (this.isSubMenu()) {
336
+ if (this.hot.getSettings().ariaTags) {
337
+ const selection = this.parentMenu.hotMenu.getSelectedLast();
338
+ if (selection) {
339
+ const cell = this.parentMenu.hotMenu.getCell(selection[0], 0);
340
+ setAttribute(cell, [A11Y_EXPANDED(false)]);
341
+ }
342
+ }
368
343
  this.parentMenu.hotMenu.listen();
369
344
  }
370
345
  }
@@ -397,6 +372,11 @@ class Menu {
397
372
  subMenu.open();
398
373
  subMenu.setPosition(cell.getBoundingClientRect());
399
374
  this.hotSubMenus[dataItem.key] = subMenu;
375
+
376
+ // Update the accessibility tags on the cell being the base for the submenu.
377
+ if (this.hot.getSettings().ariaTags) {
378
+ setAttribute(cell, [A11Y_EXPANDED(true)]);
379
+ }
400
380
  return subMenu;
401
381
  }
402
382
 
@@ -411,6 +391,12 @@ class Menu {
411
391
  if (menus) {
412
392
  menus.destroy();
413
393
  delete this.hotSubMenus[dataItem.key];
394
+ const cell = this.hotMenu.getCell(row, 0);
395
+
396
+ // Update the accessibility tags on the cell being the base for the submenu.
397
+ if (this.hot.getSettings().ariaTags) {
398
+ setAttribute(cell, [A11Y_EXPANDED(false)]);
399
+ }
414
400
  }
415
401
  }
416
402
 
@@ -489,196 +475,30 @@ class Menu {
489
475
  * @returns {boolean}
490
476
  */
491
477
  isCommandPassive(commandDescriptor) {
492
- const {
493
- isCommand,
494
- name: commandName,
495
- disabled,
496
- submenu
497
- } = commandDescriptor;
498
- const isItemDisabled = disabled === true || typeof disabled === 'function' && disabled.call(this.hot) === true;
499
- return isCommand === false || commandName === SEPARATOR || isItemDisabled === true || submenu;
500
- }
501
-
502
- /**
503
- * Set menu position based on dom event or based on literal object.
504
- *
505
- * @param {Event|object} coords Event or literal Object with coordinates.
506
- */
507
- setPosition(coords) {
508
- const cursor = new Cursor(coords, this.container.ownerDocument.defaultView);
509
- if (this.options.keepInViewport) {
510
- if (cursor.fitsBelow(this.container)) {
511
- this.setPositionBelowCursor(cursor);
512
- } else if (cursor.fitsAbove(this.container)) {
513
- this.setPositionAboveCursor(cursor);
514
- } else {
515
- this.setPositionBelowCursor(cursor);
516
- }
517
- if (this.hot.isLtr()) {
518
- this.setHorizontalPositionForLtr(cursor);
519
- } else {
520
- this.setHorizontalPositionForRtl(cursor);
521
- }
522
- } else {
523
- this.setPositionBelowCursor(cursor);
524
- this.setPositionOnRightOfCursor(cursor);
525
- }
526
- }
527
-
528
- /**
529
- * Set menu horizontal position for RTL mode.
530
- *
531
- * @param {Cursor} cursor `Cursor` object.
532
- */
533
- setHorizontalPositionForRtl(cursor) {
534
- if (cursor.fitsOnLeft(this.container)) {
535
- this.setPositionOnLeftOfCursor(cursor);
536
- } else {
537
- this.setPositionOnRightOfCursor(cursor);
538
- }
539
- }
540
-
541
- /**
542
- * Set menu horizontal position for LTR mode.
543
- *
544
- * @param {Cursor} cursor `Cursor` object.
545
- */
546
- setHorizontalPositionForLtr(cursor) {
547
- if (cursor.fitsOnRight(this.container)) {
548
- this.setPositionOnRightOfCursor(cursor);
549
- } else {
550
- this.setPositionOnLeftOfCursor(cursor);
551
- }
552
- }
553
-
554
- /**
555
- * Set menu position above cursor object.
556
- *
557
- * @param {Cursor} cursor `Cursor` object.
558
- */
559
- setPositionAboveCursor(cursor) {
560
- let top = this.offset.above + cursor.top - this.container.offsetHeight;
561
- if (this.isSubMenu()) {
562
- top = cursor.top + cursor.cellHeight - this.container.offsetHeight + 3;
563
- }
564
- this.container.style.top = `${top}px`;
565
- }
566
-
567
- /**
568
- * Set menu position below cursor object.
569
- *
570
- * @param {Cursor} cursor `Cursor` object.
571
- */
572
- setPositionBelowCursor(cursor) {
573
- let top = this.offset.below + cursor.top + 1;
574
- if (this.isSubMenu()) {
575
- top = cursor.top - 1;
576
- }
577
- this.container.style.top = `${top}px`;
478
+ return commandDescriptor.isCommand === false || isItemSeparator(commandDescriptor) || isItemDisabled(commandDescriptor, this.hot) || isItemSubMenu(commandDescriptor);
578
479
  }
579
480
 
580
481
  /**
581
- * Set menu position on the right of cursor object.
482
+ * Set offset menu position for specified area (`above`, `below`, `left` or `right`).
582
483
  *
583
- * @param {Cursor} cursor `Cursor` object.
484
+ * @param {string} area Specified area name (`above`, `below`, `left` or `right`).
485
+ * @param {number} offset Offset value.
584
486
  */
585
- setPositionOnRightOfCursor(cursor) {
586
- let left = cursor.left;
587
- if (this.isSubMenu()) {
588
- const {
589
- right: parentMenuRight
590
- } = this.parentMenu.container.getBoundingClientRect();
591
-
592
- // move the sub menu by the width of the parent's border (usually by 1-2 pixels)
593
- left += cursor.cellWidth + parentMenuRight - (cursor.left + cursor.cellWidth);
594
- } else {
595
- left += this.offset.right;
596
- }
597
- this.container.style.left = `${left}px`;
487
+ setOffset(area) {
488
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
489
+ this.positioner.setOffset(area, offset);
598
490
  }
599
491
 
600
492
  /**
601
- * Set menu position on the left of cursor object.
493
+ * Set menu position based on dom event or based on literal object.
602
494
  *
603
- * @param {Cursor} cursor `Cursor` object.
495
+ * @param {Event|object} coords Event or literal Object with coordinates.
604
496
  */
605
- setPositionOnLeftOfCursor(cursor) {
606
- let left = this.offset.left + cursor.left - this.container.offsetWidth;
497
+ setPosition(coords) {
607
498
  if (this.isSubMenu()) {
608
- const {
609
- left: parentMenuLeft
610
- } = this.parentMenu.container.getBoundingClientRect();
611
-
612
- // move the sub menu by the width of the parent's border (usually by 1-2 pixels)
613
- left -= cursor.left - parentMenuLeft;
614
- }
615
- this.container.style.left = `${left}px`;
616
- }
617
-
618
- /**
619
- * Select first cell in opened menu.
620
- */
621
- selectFirstCell() {
622
- const cell = this.hotMenu.getCell(0, 0);
623
- if (isSeparator(cell) || isDisabled(cell) || isSelectionDisabled(cell)) {
624
- this.selectNextCell(0, 0);
625
- } else {
626
- this.hotMenu.selectCell(0, 0);
627
- }
628
- }
629
-
630
- /**
631
- * Select last cell in opened menu.
632
- */
633
- selectLastCell() {
634
- const lastRow = this.hotMenu.countRows() - 1;
635
- const cell = this.hotMenu.getCell(lastRow, 0);
636
- if (isSeparator(cell) || isDisabled(cell) || isSelectionDisabled(cell)) {
637
- this.selectPrevCell(lastRow, 0);
638
- } else {
639
- // disable default "scroll-to-cell" option and instead of that...
640
- this.hotMenu.selectCell(lastRow, 0, undefined, undefined, false);
641
- // ...scroll to the cell with "snap to the bottom" option
642
- this.hotMenu.scrollViewportTo(lastRow, 0, true, false);
643
- }
644
- }
645
-
646
- /**
647
- * Select next cell in opened menu.
648
- *
649
- * @param {number} row Row index.
650
- * @param {number} col Column index.
651
- */
652
- selectNextCell(row, col) {
653
- const nextRow = row + 1;
654
- const cell = nextRow < this.hotMenu.countRows() ? this.hotMenu.getCell(nextRow, col) : null;
655
- if (!cell) {
656
- return;
657
- }
658
- if (isSeparator(cell) || isDisabled(cell) || isSelectionDisabled(cell)) {
659
- this.selectNextCell(nextRow, col);
660
- } else {
661
- this.hotMenu.selectCell(nextRow, col);
662
- }
663
- }
664
-
665
- /**
666
- * Select previous cell in opened menu.
667
- *
668
- * @param {number} row Row index.
669
- * @param {number} col Column index.
670
- */
671
- selectPrevCell(row, col) {
672
- const prevRow = row - 1;
673
- const cell = prevRow >= 0 ? this.hotMenu.getCell(prevRow, col) : null;
674
- if (!cell) {
675
- return;
676
- }
677
- if (isSeparator(cell) || isDisabled(cell) || isSelectionDisabled(cell)) {
678
- this.selectPrevCell(prevRow, col);
679
- } else {
680
- this.hotMenu.selectCell(prevRow, col);
499
+ this.positioner.setParentElement(this.parentMenu.container);
681
500
  }
501
+ this.positioner.setElement(this.container).updatePosition(coords);
682
502
  }
683
503
 
684
504
  /**
@@ -695,18 +515,17 @@ class Menu {
695
515
  menuItemRenderer(hot, TD, row, col, prop, value) {
696
516
  const item = hot.getSourceDataAtRow(row);
697
517
  const wrapper = this.hot.rootDocument.createElement('div');
698
- const isSubMenu = itemToTest => hasOwnProperty(itemToTest, 'submenu');
699
- const itemIsSeparator = itemToTest => new RegExp(SEPARATOR, 'i').test(itemToTest.name);
700
- const itemIsDisabled = itemToTest => itemToTest.disabled === true || typeof itemToTest.disabled === 'function' && itemToTest.disabled.call(this.hot) === true;
701
- const itemIsSelectionDisabled = itemToTest => itemToTest.disableSelection;
702
518
  let itemValue = value;
703
519
  if (typeof itemValue === 'function') {
704
520
  itemValue = itemValue.call(this.hot);
705
521
  }
706
522
  empty(TD);
707
523
  addClass(wrapper, 'htItemWrapper');
524
+ if (this.hot.getSettings().ariaTags) {
525
+ setAttribute(TD, [A11Y_MENU_ITEM(), A11Y_LABEL(itemValue), ...(isItemDisabled(item, this.hot) ? [A11Y_DISABLED()] : []), ...(isItemSubMenu(item) ? [A11Y_EXPANDED(false)] : [])]);
526
+ }
708
527
  TD.appendChild(wrapper);
709
- if (itemIsSeparator(item)) {
528
+ if (isItemSeparator(item)) {
710
529
  addClass(TD, 'htSeparator');
711
530
  } else if (typeof item.renderer === 'function') {
712
531
  addClass(TD, 'htCustomMenuRenderer');
@@ -714,22 +533,22 @@ class Menu {
714
533
  } else {
715
534
  fastInnerHTML(wrapper, itemValue);
716
535
  }
717
- if (itemIsDisabled(item)) {
536
+ if (isItemDisabled(item, this.hot)) {
718
537
  addClass(TD, 'htDisabled');
719
538
  this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
720
- } else if (itemIsSelectionDisabled(item)) {
539
+ } else if (isItemSelectionDisabled(item)) {
721
540
  addClass(TD, 'htSelectionDisabled');
722
541
  this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
723
- } else if (isSubMenu(item)) {
542
+ } else if (isItemSubMenu(item)) {
724
543
  addClass(TD, 'htSubmenu');
725
- if (itemIsSelectionDisabled(item)) {
544
+ if (isItemSelectionDisabled(item)) {
726
545
  this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
727
546
  } else {
728
547
  this.eventManager.addEventListener(TD, 'mouseenter', () => hot.selectCell(row, col, void 0, void 0, false, false));
729
548
  }
730
549
  } else {
731
550
  removeClass(TD, ['htSubmenu', 'htDisabled']);
732
- if (itemIsSelectionDisabled(item)) {
551
+ if (isItemSelectionDisabled(item)) {
733
552
  this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
734
553
  } else {
735
554
  this.eventManager.addEventListener(TD, 'mouseenter', () => hot.selectCell(row, col, void 0, void 0, false, false));
@@ -773,26 +592,6 @@ class Menu {
773
592
  return container;
774
593
  }
775
594
 
776
- /**
777
- * @private
778
- */
779
- blockMainTableCallbacks() {
780
- this._afterScrollCallback = function () {};
781
- this.hot.addHook('afterScrollVertically', this._afterScrollCallback);
782
- this.hot.addHook('afterScrollHorizontally', this._afterScrollCallback);
783
- }
784
-
785
- /**
786
- * @private
787
- */
788
- releaseMainTableCallbacks() {
789
- if (this._afterScrollCallback) {
790
- this.hot.removeHook('afterScrollVertically', this._afterScrollCallback);
791
- this.hot.removeHook('afterScrollHorizontally', this._afterScrollCallback);
792
- this._afterScrollCallback = null;
793
- }
794
- }
795
-
796
595
  /**
797
596
  * On after init listener.
798
597
  *
@@ -812,20 +611,10 @@ class Menu {
812
611
  holderStyle.width = `${currentHiderWidth + 3}px`;
813
612
  holderStyle.height = `${realHeight + 3}px`;
814
613
  hiderStyle.height = holderStyle.height;
815
- }
816
614
 
817
- /**
818
- * On after selection listener.
819
- *
820
- * @param {number} r Selection start row index.
821
- * @param {number} c Selection start column index.
822
- * @param {number} r2 Selection end row index.
823
- * @param {number} c2 Selection end column index.
824
- * @param {object} preventScrolling Object with `value` property where its value change will be observed.
825
- */
826
- onAfterSelection(r, c, r2, c2, preventScrolling) {
827
- if (this.keyEvent === false) {
828
- preventScrolling.value = true;
615
+ // Replace the default accessibility tags with the context menu's
616
+ if (this.hot.getSettings().ariaTags) {
617
+ setAttribute(this.hotMenu.rootElement, [A11Y_MENU()]);
829
618
  }
830
619
  }
831
620
 
@@ -865,5 +654,4 @@ class Menu {
865
654
  }
866
655
  }
867
656
  }
868
- mixin(Menu, localHooks);
869
- export default Menu;
657
+ mixin(Menu, localHooks);