handsontable 0.0.0-next-9059914-20231025 → 0.0.0-next-21d91d0-20231025

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 (446) 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 +51 -15
  98. package/dist/handsontable.full.css +51 -15
  99. package/dist/handsontable.full.js +13360 -7840
  100. package/dist/handsontable.full.min.css +7 -7
  101. package/dist/handsontable.full.min.js +136 -136
  102. package/dist/handsontable.js +20955 -15435
  103. package/dist/handsontable.min.css +6 -6
  104. package/dist/handsontable.min.js +24 -24
  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/defaultShortcutsList.js +88 -0
  175. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
  176. package/plugins/contextMenu/menu/index.js +9 -0
  177. package/plugins/contextMenu/menu/index.mjs +1 -0
  178. package/plugins/contextMenu/{menu.js → menu/menu.js} +145 -421
  179. package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +146 -422
  180. package/plugins/contextMenu/menu/menuItemRenderer.js +58 -0
  181. package/plugins/contextMenu/menu/menuItemRenderer.mjs +54 -0
  182. package/plugins/contextMenu/menu/navigator.js +27 -0
  183. package/plugins/contextMenu/menu/navigator.mjs +23 -0
  184. package/plugins/contextMenu/menu/positioner.js +213 -0
  185. package/plugins/contextMenu/menu/positioner.mjs +209 -0
  186. package/plugins/contextMenu/menu/shortcuts.js +114 -0
  187. package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
  188. package/plugins/contextMenu/menu/utils.js +177 -0
  189. package/plugins/contextMenu/menu/utils.mjs +163 -0
  190. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  191. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  192. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  193. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  194. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  195. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  196. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  197. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  198. package/plugins/contextMenu/{predefinedItems.js → predefinedItems/index.js} +14 -14
  199. package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
  200. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  201. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  202. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  203. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  204. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  205. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  206. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  207. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  208. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  209. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  210. package/plugins/contextMenu/utils.js +35 -151
  211. package/plugins/contextMenu/utils.mjs +35 -144
  212. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  213. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  214. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  215. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  216. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  217. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  218. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  219. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  220. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  221. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  222. package/plugins/copyPaste/copyPaste.js +127 -78
  223. package/plugins/copyPaste/copyPaste.mjs +128 -79
  224. package/plugins/customBorders/customBorders.js +23 -20
  225. package/plugins/customBorders/customBorders.mjs +24 -21
  226. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  227. package/plugins/dropdownMenu/dropdownMenu.js +127 -40
  228. package/plugins/dropdownMenu/dropdownMenu.mjs +126 -39
  229. package/plugins/filters/component/_base.js +23 -8
  230. package/plugins/filters/component/_base.mjs +23 -8
  231. package/plugins/filters/component/actionBar.js +29 -27
  232. package/plugins/filters/component/actionBar.mjs +26 -23
  233. package/plugins/filters/component/condition.js +46 -59
  234. package/plugins/filters/component/condition.mjs +40 -52
  235. package/plugins/filters/component/operators.js +21 -22
  236. package/plugins/filters/component/operators.mjs +18 -18
  237. package/plugins/filters/component/value.js +35 -26
  238. package/plugins/filters/component/value.mjs +32 -22
  239. package/plugins/filters/constants.mjs +1 -1
  240. package/plugins/filters/filters.js +106 -62
  241. package/plugins/filters/filters.mjs +99 -55
  242. package/plugins/filters/menu/focusController.js +123 -0
  243. package/plugins/filters/menu/focusController.mjs +119 -0
  244. package/plugins/filters/menu/focusNavigator.js +30 -0
  245. package/plugins/filters/menu/focusNavigator.mjs +26 -0
  246. package/plugins/filters/ui/_base.js +35 -13
  247. package/plugins/filters/ui/_base.mjs +35 -13
  248. package/plugins/filters/ui/input.js +43 -32
  249. package/plugins/filters/ui/input.mjs +42 -30
  250. package/plugins/filters/ui/link.js +44 -12
  251. package/plugins/filters/ui/link.mjs +44 -11
  252. package/plugins/filters/ui/multipleSelect.js +234 -129
  253. package/plugins/filters/ui/multipleSelect.mjs +232 -127
  254. package/plugins/filters/ui/radioInput.js +42 -18
  255. package/plugins/filters/ui/radioInput.mjs +42 -17
  256. package/plugins/filters/ui/select.js +144 -75
  257. package/plugins/filters/ui/select.mjs +142 -72
  258. package/plugins/hiddenColumns/hiddenColumns.mjs +1 -1
  259. package/plugins/hiddenRows/hiddenRows.mjs +1 -1
  260. package/plugins/manualColumnMove/manualColumnMove.js +3 -1
  261. package/plugins/manualColumnMove/manualColumnMove.mjs +3 -1
  262. package/plugins/mergeCells/mergeCells.js +5 -16
  263. package/plugins/mergeCells/mergeCells.mjs +5 -16
  264. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  265. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  266. package/plugins/nestedHeaders/nestedHeaders.js +240 -10
  267. package/plugins/nestedHeaders/nestedHeaders.mjs +241 -11
  268. package/plugins/nestedHeaders/stateManager/index.js +102 -3
  269. package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
  270. package/plugins/nestedRows/nestedRows.js +41 -0
  271. package/plugins/nestedRows/nestedRows.mjs +41 -0
  272. package/plugins/nestedRows/ui/headers.js +11 -0
  273. package/plugins/nestedRows/ui/headers.mjs +12 -1
  274. package/renderers/autocompleteRenderer/autocompleteRenderer.js +8 -0
  275. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
  276. package/renderers/baseRenderer/baseRenderer.js +17 -0
  277. package/renderers/baseRenderer/baseRenderer.mjs +18 -1
  278. package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
  279. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  280. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  281. package/renderers/dateRenderer/dateRenderer.js +29 -0
  282. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  283. package/renderers/dateRenderer/index.d.ts +1 -0
  284. package/renderers/dateRenderer/index.js +6 -0
  285. package/renderers/dateRenderer/index.mjs +1 -0
  286. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  287. package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
  288. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  289. package/renderers/handsontableRenderer/index.d.ts +1 -0
  290. package/renderers/handsontableRenderer/index.js +6 -0
  291. package/renderers/handsontableRenderer/index.mjs +1 -0
  292. package/renderers/index.d.ts +9 -0
  293. package/renderers/selectRenderer/index.d.ts +1 -0
  294. package/renderers/selectRenderer/index.js +6 -0
  295. package/renderers/selectRenderer/index.mjs +1 -0
  296. package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
  297. package/renderers/selectRenderer/selectRenderer.js +27 -0
  298. package/renderers/selectRenderer/selectRenderer.mjs +22 -0
  299. package/selection/highlight/highlight.js +256 -71
  300. package/selection/highlight/highlight.mjs +250 -71
  301. package/selection/highlight/types/activeHeader.js +10 -8
  302. package/selection/highlight/types/activeHeader.mjs +10 -8
  303. package/selection/highlight/types/area.js +6 -18
  304. package/selection/highlight/types/area.mjs +6 -18
  305. package/selection/highlight/types/areaLayered.js +31 -0
  306. package/selection/highlight/types/areaLayered.mjs +26 -0
  307. package/selection/highlight/types/column.js +27 -0
  308. package/selection/highlight/types/column.mjs +22 -0
  309. package/selection/highlight/types/customSelection.js +7 -9
  310. package/selection/highlight/types/customSelection.mjs +7 -9
  311. package/selection/highlight/types/fill.js +5 -7
  312. package/selection/highlight/types/fill.mjs +5 -7
  313. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  314. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  315. package/selection/highlight/types/header.js +9 -18
  316. package/selection/highlight/types/header.mjs +9 -18
  317. package/selection/highlight/types/row.js +27 -0
  318. package/selection/highlight/types/row.mjs +22 -0
  319. package/selection/highlight/visualSelection.js +31 -27
  320. package/selection/highlight/visualSelection.mjs +31 -27
  321. package/selection/index.js +4 -7
  322. package/selection/index.mjs +2 -3
  323. package/selection/mouseEventHandler.js +7 -1
  324. package/selection/mouseEventHandler.mjs +7 -1
  325. package/selection/range.js +8 -8
  326. package/selection/range.mjs +8 -8
  327. package/selection/selection.js +321 -152
  328. package/selection/selection.mjs +318 -151
  329. package/selection/transformation.js +232 -90
  330. package/selection/transformation.mjs +232 -90
  331. package/selection/utils.js +15 -21
  332. package/selection/utils.mjs +16 -21
  333. package/settings.d.ts +4 -0
  334. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  335. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  336. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  337. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  338. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  339. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  340. package/shortcutContexts/commands/editor/index.js +16 -0
  341. package/shortcutContexts/commands/editor/index.mjs +12 -0
  342. package/shortcutContexts/commands/editor/open.js +27 -0
  343. package/shortcutContexts/commands/editor/open.mjs +23 -0
  344. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  345. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  346. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  347. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  348. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +25 -0
  349. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
  350. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  351. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  352. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  353. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  354. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  355. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  356. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  357. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  358. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  359. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  360. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  361. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  362. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  363. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  364. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  365. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  366. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  367. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  368. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  369. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  370. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  371. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  372. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  373. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  374. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +25 -0
  375. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
  376. package/shortcutContexts/commands/index.js +35 -0
  377. package/shortcutContexts/commands/index.mjs +31 -0
  378. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  379. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  380. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +33 -0
  381. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
  382. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  383. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  384. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  385. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  386. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  387. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  388. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  389. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  390. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  391. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  392. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  393. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  394. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  395. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  396. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  397. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  398. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  399. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  400. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  401. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  402. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  403. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  404. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  405. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  406. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  407. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  408. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  409. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  410. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +33 -0
  411. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
  412. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  413. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  414. package/shortcutContexts/commands/scrollToFocusedCell.js +35 -0
  415. package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
  416. package/shortcutContexts/commands/selectAll.js +12 -0
  417. package/shortcutContexts/commands/selectAll.mjs +8 -0
  418. package/shortcutContexts/constants.js +13 -0
  419. package/shortcutContexts/constants.mjs +8 -0
  420. package/shortcutContexts/editor.js +25 -0
  421. package/shortcutContexts/editor.mjs +21 -0
  422. package/shortcutContexts/grid.js +163 -0
  423. package/shortcutContexts/grid.mjs +159 -0
  424. package/shortcutContexts/index.js +24 -0
  425. package/shortcutContexts/index.mjs +11 -0
  426. package/shortcuts/context.js +23 -4
  427. package/shortcuts/context.mjs +23 -5
  428. package/shortcuts/manager.js +25 -7
  429. package/shortcuts/manager.mjs +26 -7
  430. package/shortcuts/recorder.js +3 -3
  431. package/shortcuts/recorder.mjs +3 -3
  432. package/shortcuts/utils.js +19 -5
  433. package/shortcuts/utils.mjs +18 -4
  434. package/tableView.js +111 -13
  435. package/tableView.mjs +112 -14
  436. package/utils/paginator.js +151 -0
  437. package/utils/paginator.mjs +147 -0
  438. package/3rdparty/walkontable/src/selection.js +0 -295
  439. package/3rdparty/walkontable/src/selection.mjs +0 -290
  440. package/plugins/contextMenu/predefinedItems.mjs +0 -68
  441. package/plugins/copyPaste/focusableElement.js +0 -186
  442. package/plugins/copyPaste/focusableElement.mjs +0 -180
  443. package/selection/highlight/constants.js +0 -15
  444. package/selection/highlight/constants.mjs +0 -6
  445. package/selection/highlight/types/index.js +0 -35
  446. package/selection/highlight/types/index.mjs +0 -31
@@ -1,20 +1,29 @@
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 "core-js/modules/es.error.cause.js";
3
+ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
4
+ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
5
+ function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
6
+ function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
7
+ function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
8
+ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
9
+ function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
10
+ import { Positioner } from "./positioner.mjs";
11
+ import { createMenuNavigator } from "./navigator.mjs";
12
+ import { createKeyboardShortcutsCtrl } from "./shortcuts.mjs";
13
+ import { SEPARATOR, NO_ITEMS, predefinedItems } from "./../predefinedItems/index.mjs";
14
+ import { filterSeparators, hasSubMenu, isItemHidden, normalizeSelection, isItemSubMenu, isItemDisabled, isItemSeparator } from "./utils.mjs";
15
+ import EventManager from "../../../eventManager.mjs";
16
+ import { arrayEach, arrayFilter, arrayReduce } from "../../../helpers/array.mjs";
17
+ import { isWindowsOS, isMobileBrowser, isIpadOS } from "../../../helpers/browser.mjs";
18
+ import { addClass, isChildOf, getParentWindow, hasClass, setAttribute } from "../../../helpers/dom/element.mjs";
19
+ import { isRightClick } from "../../../helpers/dom/event.mjs";
20
+ import { debounce, isFunction } from "../../../helpers/function.mjs";
21
+ import { isUndefined, isDefined } from "../../../helpers/mixed.mjs";
22
+ import { mixin } from "../../../helpers/object.mjs";
23
+ import localHooks from "../../../mixins/localHooks.mjs";
24
+ import { createMenuItemRenderer } from "./menuItemRenderer.mjs";
25
+ import { A11Y_EXPANDED, A11Y_MENU, A11Y_TABINDEX } from "../../../helpers/a11y.mjs";
15
26
  const MIN_WIDTH = 215;
16
- const SHORTCUTS_CONTEXT = 'menu';
17
- const SHORTCUTS_GROUP = SHORTCUTS_CONTEXT;
18
27
 
19
28
  /**
20
29
  * @typedef MenuOptions
@@ -31,12 +40,33 @@ const SHORTCUTS_GROUP = SHORTCUTS_CONTEXT;
31
40
  * @private
32
41
  * @class Menu
33
42
  */
34
- class Menu {
43
+ var _navigator = /*#__PURE__*/new WeakMap();
44
+ var _shortcutsCtrl = /*#__PURE__*/new WeakMap();
45
+ export class Menu {
35
46
  /**
36
47
  * @param {Core} hotInstance Handsontable instance.
37
48
  * @param {MenuOptions} [options] Menu options.
38
49
  */
39
50
  constructor(hotInstance, options) {
51
+ var _this = this;
52
+ /**
53
+ * The controller module that allows modifying the menu item selection positions.
54
+ *
55
+ * @type {Paginator}
56
+ */
57
+ _classPrivateFieldInitSpec(this, _navigator, {
58
+ writable: true,
59
+ value: void 0
60
+ });
61
+ /**
62
+ * The controller module that allows extending the keyboard shortcuts for the menu.
63
+ *
64
+ * @type {KeyboardShortcutsMenuController}
65
+ */
66
+ _classPrivateFieldInitSpec(this, _shortcutsCtrl, {
67
+ writable: true,
68
+ value: void 0
69
+ });
40
70
  this.hot = hotInstance;
41
71
  this.options = options || {
42
72
  parent: null,
@@ -49,20 +79,21 @@ class Menu {
49
79
  };
50
80
  this.eventManager = new EventManager(this);
51
81
  this.container = this.createContainer(this.options.name);
82
+ this.positioner = new Positioner(this.options.keepInViewport);
52
83
  this.hotMenu = null;
53
84
  this.hotSubMenus = {};
54
85
  this.parentMenu = this.options.parent || null;
55
86
  this.menuItems = null;
56
87
  this.origOutsideClickDeselects = null;
57
- this.keyEvent = false;
58
- this.offset = {
59
- above: 0,
60
- below: 0,
61
- left: 0,
62
- right: 0
63
- };
64
- this._afterScrollCallback = null;
65
88
  this.registerEvents();
89
+ if (this.isSubMenu()) {
90
+ this.addLocalHook('afterSelectionChange', function () {
91
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
92
+ args[_key] = arguments[_key];
93
+ }
94
+ return _this.parentMenu.runLocalHooks('afterSelectionChange', ...args);
95
+ });
96
+ }
66
97
  }
67
98
 
68
99
  /**
@@ -88,6 +119,24 @@ class Menu {
88
119
  this.menuItems = menuItems;
89
120
  }
90
121
 
122
+ /**
123
+ * Gets the controller object that allows modifying the the menu item selection.
124
+ *
125
+ * @returns {Paginator | undefined}
126
+ */
127
+ getNavigator() {
128
+ return _classPrivateFieldGet(this, _navigator);
129
+ }
130
+
131
+ /**
132
+ * Gets the controller object that allows extending the keyboard shortcuts of the menu.
133
+ *
134
+ * @returns {KeyboardShortcutsMenuController | undefined}
135
+ */
136
+ getKeyboardShortcutsCtrl() {
137
+ return _classPrivateFieldGet(this, _shortcutsCtrl);
138
+ }
139
+
91
140
  /**
92
141
  * Returns currently selected menu item. Returns `null` if no item was selected.
93
142
  *
@@ -106,17 +155,6 @@ class Menu {
106
155
  return Array.isArray(this.hotMenu.getSelectedLast());
107
156
  }
108
157
 
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
158
  /**
121
159
  * Check if menu is using as sub-menu.
122
160
  *
@@ -133,7 +171,6 @@ class Menu {
133
171
  * @fires Hooks#afterContextMenuShow
134
172
  */
135
173
  open() {
136
- var _this = this;
137
174
  this.runLocalHooks('beforeOpen');
138
175
  this.container.removeAttribute('style');
139
176
  this.container.style.display = 'block';
@@ -168,16 +205,21 @@ class Menu {
168
205
  readOnly: true,
169
206
  editor: false,
170
207
  copyPaste: false,
208
+ hiddenRows: true,
171
209
  maxCols: 1,
172
210
  columns: [{
173
211
  data: 'name',
174
- renderer: (hot, TD, row, col, prop, value) => this.menuItemRenderer(hot, TD, row, col, prop, value)
212
+ renderer: createMenuItemRenderer(this.hot)
175
213
  }],
176
214
  renderAllRows: true,
177
215
  fragmentSelection: false,
178
216
  outsideClickDeselects: false,
179
217
  disableVisualSelection: 'area',
180
218
  layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr',
219
+ ariaTags: false,
220
+ beforeOnCellMouseOver: (event, coords) => {
221
+ _classPrivateFieldGet(this, _navigator).setCurrentPage(coords.row);
222
+ },
181
223
  afterOnCellMouseOver: (event, coords) => {
182
224
  if (this.isAllSubMenusClosed()) {
183
225
  delayedOpenSubMenu(coords.row);
@@ -195,6 +237,13 @@ class Menu {
195
237
  this.close(true);
196
238
  }
197
239
  },
240
+ afterSelection: (row, column, row2, column2, preventScrolling) => {
241
+ // do not scroll the viewport when mouse clicks on partially visible menu item
242
+ if (this.hotMenu.view.isMouseDown()) {
243
+ preventScrolling.value = true;
244
+ }
245
+ this.runLocalHooks('afterSelectionChange', this.getSelectedItem());
246
+ },
198
247
  beforeOnCellMouseUp: event => {
199
248
  if (this.hasSelectedItem()) {
200
249
  shouldAutoCloseMenu = !this.isCommandPassive(this.getSelectedItem());
@@ -212,7 +261,7 @@ class Menu {
212
261
  // event hides the tapped element, the click event grabs the element below. As a result, the filter
213
262
  // by condition menu is closed and immediately open on tapping the "None" item.
214
263
  if (isMobileBrowser() || isIpadOS()) {
215
- setTimeout(() => this.close(true), 325);
264
+ this.hot._registerTimeout(() => this.close(true), 325);
216
265
  } else {
217
266
  this.close(true);
218
267
  }
@@ -228,120 +277,17 @@ class Menu {
228
277
  };
229
278
  this.origOutsideClickDeselects = this.hot.getSettings().outsideClickDeselects;
230
279
  this.hot.getSettings().outsideClickDeselects = false;
231
- this.hotMenu = new Core(this.container, settings);
280
+ this.hotMenu = new this.hot.constructor(this.container, settings);
232
281
  this.hotMenu.addHook('afterInit', () => this.onAfterInit());
233
- this.hotMenu.addHook('afterSelection', function () {
234
- return _this.onAfterSelection(...arguments);
235
- });
236
282
  this.hotMenu.init();
237
- this.hotMenu.listen();
238
- const shortcutManager = this.hotMenu.getShortcutManager();
239
- const menuContext = shortcutManager.addContext(SHORTCUTS_GROUP);
240
- const config = {
241
- group: SHORTCUTS_CONTEXT
242
- };
243
- const menuContextConfig = {
244
- ...config,
245
- runOnlyIf: event => isInput(event.target) === false || this.container.contains(event.target) === false
246
- };
247
-
248
- // Default shortcuts for Handsontable should not be handled. Changing context will help with that.
249
- shortcutManager.setActiveContextName('menu');
250
- menuContext.addShortcuts([{
251
- keys: [['Escape']],
252
- callback: () => {
253
- this.keyEvent = true;
254
- this.close();
255
- this.keyEvent = false;
256
- }
257
- }, {
258
- 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
- }
269
- }, {
270
- 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
- }
281
- }, {
282
- keys: [['ArrowRight']],
283
- callback: () => {
284
- const selection = this.hotMenu.getSelectedLast();
285
- this.keyEvent = true;
286
- if (selection) {
287
- const menu = this.openSubMenu(selection[0]);
288
- if (menu) {
289
- menu.selectFirstCell();
290
- }
291
- }
292
- this.keyEvent = false;
293
- }
294
- }, {
295
- keys: [['ArrowLeft']],
296
- callback: () => {
297
- const selection = this.hotMenu.getSelectedLast();
298
- this.keyEvent = true;
299
- if (selection && this.isSubMenu()) {
300
- this.close();
301
- if (this.parentMenu) {
302
- this.parentMenu.hotMenu.listen();
303
- }
304
- }
305
- this.keyEvent = false;
306
- }
307
- }, {
308
- keys: [['Enter']],
309
- callback: event => {
310
- const selection = this.hotMenu.getSelectedLast();
311
- this.keyEvent = true;
312
- if (!this.hotMenu.getSourceDataAtRow(selection[0]).submenu) {
313
- this.executeCommand(event);
314
- this.close(true);
315
- }
316
- this.keyEvent = false;
317
- }
318
- }, {
319
- keys: [['PageUp']],
320
- callback: () => {
321
- const selection = this.hotMenu.getSelectedLast();
322
- this.keyEvent = true;
323
- if (selection) {
324
- this.hotMenu.selection.transformStart(-this.hotMenu.countVisibleRows(), 0);
325
- } else {
326
- this.selectFirstCell();
327
- }
328
- this.keyEvent = false;
329
- }
330
- }, {
331
- keys: [['PageDown']],
332
- callback: () => {
333
- const selection = this.hotMenu.getSelectedLast();
334
- this.keyEvent = true;
335
- if (selection) {
336
- this.hotMenu.selection.transformStart(this.hotMenu.countVisibleRows(), 0);
337
- } else {
338
- this.selectLastCell();
339
- }
340
- this.keyEvent = false;
341
- }
342
- }], menuContextConfig);
343
- this.blockMainTableCallbacks();
344
- this.runLocalHooks('afterOpen');
283
+ _classPrivateFieldSet(this, _navigator, createMenuNavigator(this.hotMenu));
284
+ _classPrivateFieldSet(this, _shortcutsCtrl, createKeyboardShortcutsCtrl(this));
285
+ _classPrivateFieldGet(this, _shortcutsCtrl).listen();
286
+ this.focus();
287
+ if (this.isSubMenu()) {
288
+ this.addLocalHook('afterOpen', () => this.parentMenu.runLocalHooks('afterSubmenuOpen', this));
289
+ }
290
+ this.runLocalHooks('afterOpen', this);
345
291
  }
346
292
 
347
293
  /**
@@ -354,17 +300,24 @@ class Menu {
354
300
  if (!this.isOpened()) {
355
301
  return;
356
302
  }
357
- if (closeParent && this.parentMenu) {
303
+ if (closeParent && this.isSubMenu()) {
358
304
  this.parentMenu.close();
359
305
  } else {
306
+ _classPrivateFieldGet(this, _navigator).clear();
360
307
  this.closeAllSubMenus();
361
308
  this.container.style.display = 'none';
362
- this.releaseMainTableCallbacks();
363
309
  this.hotMenu.destroy();
364
310
  this.hotMenu = null;
365
311
  this.hot.getSettings().outsideClickDeselects = this.origOutsideClickDeselects;
366
312
  this.runLocalHooks('afterClose');
367
- if (this.parentMenu) {
313
+ if (this.isSubMenu()) {
314
+ if (this.hot.getSettings().ariaTags) {
315
+ const selection = this.parentMenu.hotMenu.getSelectedLast();
316
+ if (selection) {
317
+ const cell = this.parentMenu.hotMenu.getCell(selection[0], 0);
318
+ setAttribute(cell, [A11Y_EXPANDED(false)]);
319
+ }
320
+ }
368
321
  this.parentMenu.hotMenu.listen();
369
322
  }
370
323
  }
@@ -397,6 +350,11 @@ class Menu {
397
350
  subMenu.open();
398
351
  subMenu.setPosition(cell.getBoundingClientRect());
399
352
  this.hotSubMenus[dataItem.key] = subMenu;
353
+
354
+ // Update the accessibility tags on the cell being the base for the submenu.
355
+ if (this.hot.getSettings().ariaTags) {
356
+ setAttribute(cell, [A11Y_EXPANDED(true)]);
357
+ }
400
358
  return subMenu;
401
359
  }
402
360
 
@@ -411,6 +369,12 @@ class Menu {
411
369
  if (menus) {
412
370
  menus.destroy();
413
371
  delete this.hotSubMenus[dataItem.key];
372
+ const cell = this.hotMenu.getCell(row, 0);
373
+
374
+ // Update the accessibility tags on the cell being the base for the submenu.
375
+ if (this.hot.getSettings().ariaTags) {
376
+ setAttribute(cell, [A11Y_EXPANDED(false)]);
377
+ }
414
378
  }
415
379
  }
416
380
 
@@ -430,6 +394,19 @@ class Menu {
430
394
  return Object.keys(this.hotSubMenus).length === 0;
431
395
  }
432
396
 
397
+ /**
398
+ * Focus the menu so all keyboard shortcuts become active.
399
+ */
400
+ focus() {
401
+ if (this.isOpened()) {
402
+ this.hotMenu.rootElement.focus({
403
+ preventScroll: true
404
+ });
405
+ this.getKeyboardShortcutsCtrl().listen();
406
+ this.hotMenu.listen();
407
+ }
408
+ }
409
+
433
410
  /**
434
411
  * Destroy instance.
435
412
  */
@@ -489,252 +466,30 @@ class Menu {
489
466
  * @returns {boolean}
490
467
  */
491
468
  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;
469
+ return commandDescriptor.isCommand === false || isItemSeparator(commandDescriptor) || isItemDisabled(commandDescriptor, this.hot) || isItemSubMenu(commandDescriptor);
500
470
  }
501
471
 
502
472
  /**
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`;
578
- }
579
-
580
- /**
581
- * Set menu position on the right of cursor object.
473
+ * Set offset menu position for specified area (`above`, `below`, `left` or `right`).
582
474
  *
583
- * @param {Cursor} cursor `Cursor` object.
475
+ * @param {string} area Specified area name (`above`, `below`, `left` or `right`).
476
+ * @param {number} offset Offset value.
584
477
  */
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`;
478
+ setOffset(area) {
479
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
480
+ this.positioner.setOffset(area, offset);
598
481
  }
599
482
 
600
483
  /**
601
- * Set menu position on the left of cursor object.
484
+ * Set menu position based on dom event or based on literal object.
602
485
  *
603
- * @param {Cursor} cursor `Cursor` object.
486
+ * @param {Event|object} coords Event or literal Object with coordinates.
604
487
  */
605
- setPositionOnLeftOfCursor(cursor) {
606
- let left = this.offset.left + cursor.left - this.container.offsetWidth;
488
+ setPosition(coords) {
607
489
  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);
681
- }
682
- }
683
-
684
- /**
685
- * Menu item renderer.
686
- *
687
- * @private
688
- * @param {Core} hot The Handsontable instance.
689
- * @param {HTMLCellElement} TD The rendered cell element.
690
- * @param {number} row The visual index.
691
- * @param {number} col The visual index.
692
- * @param {string} prop The column property if used.
693
- * @param {string} value The cell value.
694
- */
695
- menuItemRenderer(hot, TD, row, col, prop, value) {
696
- const item = hot.getSourceDataAtRow(row);
697
- 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
- let itemValue = value;
703
- if (typeof itemValue === 'function') {
704
- itemValue = itemValue.call(this.hot);
705
- }
706
- empty(TD);
707
- addClass(wrapper, 'htItemWrapper');
708
- TD.appendChild(wrapper);
709
- if (itemIsSeparator(item)) {
710
- addClass(TD, 'htSeparator');
711
- } else if (typeof item.renderer === 'function') {
712
- addClass(TD, 'htCustomMenuRenderer');
713
- TD.appendChild(item.renderer(hot, wrapper, row, col, prop, itemValue));
714
- } else {
715
- fastInnerHTML(wrapper, itemValue);
716
- }
717
- if (itemIsDisabled(item)) {
718
- addClass(TD, 'htDisabled');
719
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
720
- } else if (itemIsSelectionDisabled(item)) {
721
- addClass(TD, 'htSelectionDisabled');
722
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
723
- } else if (isSubMenu(item)) {
724
- addClass(TD, 'htSubmenu');
725
- if (itemIsSelectionDisabled(item)) {
726
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
727
- } else {
728
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.selectCell(row, col, void 0, void 0, false, false));
729
- }
730
- } else {
731
- removeClass(TD, ['htSubmenu', 'htDisabled']);
732
- if (itemIsSelectionDisabled(item)) {
733
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
734
- } else {
735
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.selectCell(row, col, void 0, void 0, false, false));
736
- }
490
+ this.positioner.setParentElement(this.parentMenu.container);
737
491
  }
492
+ this.positioner.setElement(this.container).updatePosition(coords);
738
493
  }
739
494
 
740
495
  /**
@@ -773,26 +528,6 @@ class Menu {
773
528
  return container;
774
529
  }
775
530
 
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
531
  /**
797
532
  * On after init listener.
798
533
  *
@@ -812,20 +547,10 @@ class Menu {
812
547
  holderStyle.width = `${currentHiderWidth + 3}px`;
813
548
  holderStyle.height = `${realHeight + 3}px`;
814
549
  hiderStyle.height = holderStyle.height;
815
- }
816
550
 
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;
551
+ // Replace the default accessibility tags with the context menu's
552
+ if (this.hot.getSettings().ariaTags) {
553
+ setAttribute(this.hotMenu.rootElement, [A11Y_MENU(), A11Y_TABINDEX(-1)]);
829
554
  }
830
555
  }
831
556
 
@@ -865,5 +590,4 @@ class Menu {
865
590
  }
866
591
  }
867
592
  }
868
- mixin(Menu, localHooks);
869
- export default Menu;
593
+ mixin(Menu, localHooks);