handsontable 0.0.0-next-b0a4ea2-20231024 → 0.0.0-next-9059914-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/{selection/border/border.js → border.js} +12 -7
  2. package/3rdparty/walkontable/src/{selection/border/border.mjs → border.mjs} +12 -7
  3. package/3rdparty/walkontable/src/cell/coords.d.ts +1 -6
  4. package/3rdparty/walkontable/src/cell/coords.js +11 -50
  5. package/3rdparty/walkontable/src/cell/coords.mjs +11 -50
  6. package/3rdparty/walkontable/src/cell/range.d.ts +2 -9
  7. package/3rdparty/walkontable/src/cell/range.js +7 -38
  8. package/3rdparty/walkontable/src/cell/range.mjs +7 -38
  9. package/3rdparty/walkontable/src/core/_base.js +3 -9
  10. package/3rdparty/walkontable/src/core/_base.mjs +3 -9
  11. package/3rdparty/walkontable/src/core/clone.js +2 -2
  12. package/3rdparty/walkontable/src/core/clone.mjs +2 -2
  13. package/3rdparty/walkontable/src/core/core.js +2 -3
  14. package/3rdparty/walkontable/src/core/core.mjs +2 -3
  15. package/3rdparty/walkontable/src/event.js +10 -12
  16. package/3rdparty/walkontable/src/event.mjs +10 -12
  17. package/3rdparty/walkontable/src/facade/core.js +2 -2
  18. package/3rdparty/walkontable/src/facade/core.mjs +2 -2
  19. package/3rdparty/walkontable/src/index.js +2 -10
  20. package/3rdparty/walkontable/src/index.mjs +2 -2
  21. package/3rdparty/walkontable/src/overlay/_base.js +2 -13
  22. package/3rdparty/walkontable/src/overlay/_base.mjs +3 -14
  23. package/3rdparty/walkontable/src/overlay/inlineStart.js +6 -2
  24. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +6 -2
  25. package/3rdparty/walkontable/src/overlay/top.js +6 -2
  26. package/3rdparty/walkontable/src/overlay/top.mjs +6 -2
  27. package/3rdparty/walkontable/src/renderer/cells.js +0 -10
  28. package/3rdparty/walkontable/src/renderer/cells.mjs +1 -11
  29. package/3rdparty/walkontable/src/renderer/columnHeaders.js +0 -10
  30. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +1 -11
  31. package/3rdparty/walkontable/src/renderer/rowHeaders.js +0 -5
  32. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +0 -5
  33. package/3rdparty/walkontable/src/renderer/rows.js +0 -13
  34. package/3rdparty/walkontable/src/renderer/rows.mjs +0 -13
  35. package/3rdparty/walkontable/src/renderer/table.js +0 -9
  36. package/3rdparty/walkontable/src/renderer/table.mjs +0 -9
  37. package/3rdparty/walkontable/src/scroll.js +0 -2
  38. package/3rdparty/walkontable/src/scroll.mjs +0 -2
  39. package/3rdparty/walkontable/src/selection.js +295 -0
  40. package/3rdparty/walkontable/src/selection.mjs +290 -0
  41. package/3rdparty/walkontable/src/settings.js +4 -13
  42. package/3rdparty/walkontable/src/settings.mjs +4 -13
  43. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +0 -9
  44. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +0 -9
  45. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +0 -9
  46. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +0 -9
  47. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +0 -9
  48. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +0 -9
  49. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +0 -9
  50. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +0 -9
  51. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +0 -9
  52. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +0 -9
  53. package/3rdparty/walkontable/src/table.js +78 -19
  54. package/3rdparty/walkontable/src/table.mjs +79 -20
  55. package/base.js +2 -2
  56. package/base.mjs +2 -2
  57. package/cellTypes/dateType/dateType.d.ts +3 -3
  58. package/cellTypes/dateType/dateType.js +2 -2
  59. package/cellTypes/dateType/dateType.mjs +2 -2
  60. package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
  61. package/cellTypes/handsontableType/handsontableType.js +2 -2
  62. package/cellTypes/handsontableType/handsontableType.mjs +2 -2
  63. package/cellTypes/index.d.ts +0 -3
  64. package/cellTypes/index.js +0 -4
  65. package/cellTypes/index.mjs +1 -3
  66. package/core.d.ts +4 -9
  67. package/core.js +327 -285
  68. package/core.mjs +327 -285
  69. package/dataMap/metaManager/metaSchema.js +0 -65
  70. package/dataMap/metaManager/metaSchema.mjs +0 -65
  71. package/dataMap/metaManager/mods/extendMetaProperties.js +1 -7
  72. package/dataMap/metaManager/mods/extendMetaProperties.mjs +1 -7
  73. package/dataMap/replaceData.js +0 -5
  74. package/dataMap/replaceData.mjs +0 -5
  75. package/dist/handsontable.css +15 -51
  76. package/dist/handsontable.full.css +15 -51
  77. package/dist/handsontable.full.js +8668 -14188
  78. package/dist/handsontable.full.min.css +7 -7
  79. package/dist/handsontable.full.min.js +136 -136
  80. package/dist/handsontable.js +22829 -28349
  81. package/dist/handsontable.min.css +6 -6
  82. package/dist/handsontable.min.js +24 -24
  83. package/dist/languages/all.js +2 -6
  84. package/dist/languages/all.min.js +1 -1
  85. package/dist/languages/en-US.js +1 -3
  86. package/dist/languages/en-US.min.js +1 -1
  87. package/dist/languages/pl-PL.js +1 -3
  88. package/dist/languages/pl-PL.min.js +1 -1
  89. package/editorManager.js +87 -15
  90. package/editorManager.mjs +87 -16
  91. package/editors/autocompleteEditor/autocompleteEditor.js +2 -53
  92. package/editors/autocompleteEditor/autocompleteEditor.mjs +3 -54
  93. package/editors/dateEditor/dateEditor.js +7 -26
  94. package/editors/dateEditor/dateEditor.mjs +8 -27
  95. package/editors/handsontableEditor/handsontableEditor.js +1 -9
  96. package/editors/handsontableEditor/handsontableEditor.mjs +2 -10
  97. package/editors/textEditor/textEditor.js +27 -19
  98. package/editors/textEditor/textEditor.mjs +30 -22
  99. package/helpers/dom/element.js +9 -188
  100. package/helpers/dom/element.mjs +9 -182
  101. package/helpers/mixed.js +1 -1
  102. package/helpers/mixed.mjs +1 -1
  103. package/helpers/number.d.ts +0 -1
  104. package/helpers/number.js +0 -18
  105. package/helpers/number.mjs +0 -17
  106. package/i18n/constants.js +1 -7
  107. package/i18n/constants.mjs +1 -4
  108. package/i18n/languages/en-US.js +1 -3
  109. package/i18n/languages/en-US.mjs +1 -3
  110. package/i18n/languages/pl-PL.js +1 -3
  111. package/i18n/languages/pl-PL.mjs +1 -3
  112. package/languages/all.js +2 -6
  113. package/languages/en-US.js +1 -3
  114. package/languages/en-US.mjs +1 -3
  115. package/languages/index.js +2 -6
  116. package/languages/pl-PL.js +1 -3
  117. package/languages/pl-PL.mjs +1 -3
  118. package/package.json +99 -116
  119. package/pluginHooks.d.ts +1 -12
  120. package/pluginHooks.js +1 -152
  121. package/pluginHooks.mjs +1 -152
  122. package/plugins/collapsibleColumns/collapsibleColumns.js +4 -74
  123. package/plugins/collapsibleColumns/collapsibleColumns.mjs +5 -75
  124. package/plugins/columnSorting/columnSorting.js +0 -43
  125. package/plugins/columnSorting/columnSorting.mjs +3 -44
  126. package/plugins/columnSorting/index.js +1 -3
  127. package/plugins/columnSorting/index.mjs +1 -1
  128. package/plugins/comments/commentEditor.js +0 -1
  129. package/plugins/comments/commentEditor.mjs +0 -1
  130. package/plugins/comments/comments.js +189 -252
  131. package/plugins/comments/comments.mjs +190 -251
  132. package/plugins/contextMenu/commandExecutor.js +3 -2
  133. package/plugins/contextMenu/commandExecutor.mjs +3 -2
  134. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  135. package/plugins/contextMenu/contextMenu.js +36 -75
  136. package/plugins/contextMenu/contextMenu.mjs +35 -74
  137. package/plugins/contextMenu/{menu/cursor.mjs → cursor.js} +10 -4
  138. package/plugins/contextMenu/{menu/cursor.js → cursor.mjs} +4 -6
  139. package/plugins/contextMenu/itemsFactory.js +3 -2
  140. package/plugins/contextMenu/itemsFactory.mjs +4 -3
  141. package/plugins/contextMenu/{menu/menu.js → menu.js} +421 -145
  142. package/plugins/contextMenu/{menu/menu.mjs → menu.mjs} +422 -146
  143. package/plugins/contextMenu/predefinedItems/alignment.js +0 -7
  144. package/plugins/contextMenu/predefinedItems/alignment.mjs +0 -7
  145. package/plugins/contextMenu/predefinedItems/clearColumn.js +3 -5
  146. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +3 -5
  147. package/plugins/contextMenu/predefinedItems/columnLeft.js +3 -5
  148. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +3 -5
  149. package/plugins/contextMenu/predefinedItems/columnRight.js +3 -5
  150. package/plugins/contextMenu/predefinedItems/columnRight.mjs +3 -5
  151. package/plugins/contextMenu/predefinedItems/readOnly.js +0 -7
  152. package/plugins/contextMenu/predefinedItems/readOnly.mjs +0 -7
  153. package/plugins/contextMenu/predefinedItems/removeColumn.js +5 -7
  154. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +3 -5
  155. package/plugins/contextMenu/predefinedItems/removeRow.js +5 -7
  156. package/plugins/contextMenu/predefinedItems/removeRow.mjs +3 -5
  157. package/plugins/contextMenu/predefinedItems/rowAbove.js +3 -5
  158. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +3 -5
  159. package/plugins/contextMenu/predefinedItems/rowBelow.js +3 -5
  160. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +3 -5
  161. package/plugins/contextMenu/{predefinedItems/index.js → predefinedItems.js} +14 -14
  162. package/plugins/contextMenu/predefinedItems.mjs +68 -0
  163. package/plugins/contextMenu/utils.js +151 -35
  164. package/plugins/contextMenu/utils.mjs +144 -35
  165. package/plugins/copyPaste/contextMenuItem/copy.js +0 -7
  166. package/plugins/copyPaste/contextMenuItem/copy.mjs +0 -7
  167. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +1 -9
  168. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +1 -9
  169. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +1 -9
  170. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +1 -9
  171. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +1 -9
  172. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +1 -9
  173. package/plugins/copyPaste/contextMenuItem/cut.js +0 -7
  174. package/plugins/copyPaste/contextMenuItem/cut.mjs +0 -7
  175. package/plugins/copyPaste/copyPaste.js +78 -127
  176. package/plugins/copyPaste/copyPaste.mjs +79 -128
  177. package/plugins/copyPaste/focusableElement.js +186 -0
  178. package/plugins/copyPaste/focusableElement.mjs +180 -0
  179. package/plugins/customBorders/customBorders.js +20 -23
  180. package/plugins/customBorders/customBorders.mjs +21 -24
  181. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  182. package/plugins/dropdownMenu/dropdownMenu.js +40 -127
  183. package/plugins/dropdownMenu/dropdownMenu.mjs +39 -126
  184. package/plugins/filters/component/_base.js +8 -23
  185. package/plugins/filters/component/_base.mjs +8 -23
  186. package/plugins/filters/component/actionBar.js +27 -29
  187. package/plugins/filters/component/actionBar.mjs +23 -26
  188. package/plugins/filters/component/condition.js +59 -46
  189. package/plugins/filters/component/condition.mjs +52 -40
  190. package/plugins/filters/component/operators.js +22 -21
  191. package/plugins/filters/component/operators.mjs +18 -18
  192. package/plugins/filters/component/value.js +26 -35
  193. package/plugins/filters/component/value.mjs +22 -32
  194. package/plugins/filters/constants.mjs +1 -1
  195. package/plugins/filters/filters.js +62 -106
  196. package/plugins/filters/filters.mjs +55 -99
  197. package/plugins/filters/ui/_base.js +13 -35
  198. package/plugins/filters/ui/_base.mjs +13 -35
  199. package/plugins/filters/ui/input.js +32 -43
  200. package/plugins/filters/ui/input.mjs +30 -42
  201. package/plugins/filters/ui/link.js +12 -44
  202. package/plugins/filters/ui/link.mjs +11 -44
  203. package/plugins/filters/ui/multipleSelect.js +129 -234
  204. package/plugins/filters/ui/multipleSelect.mjs +127 -232
  205. package/plugins/filters/ui/radioInput.js +18 -42
  206. package/plugins/filters/ui/radioInput.mjs +17 -42
  207. package/plugins/filters/ui/select.js +75 -144
  208. package/plugins/filters/ui/select.mjs +72 -142
  209. package/plugins/hiddenColumns/hiddenColumns.mjs +1 -1
  210. package/plugins/hiddenRows/hiddenRows.mjs +1 -1
  211. package/plugins/manualColumnMove/manualColumnMove.js +1 -3
  212. package/plugins/manualColumnMove/manualColumnMove.mjs +1 -3
  213. package/plugins/mergeCells/mergeCells.js +16 -5
  214. package/plugins/mergeCells/mergeCells.mjs +16 -5
  215. package/plugins/multiColumnSorting/multiColumnSorting.js +2 -37
  216. package/plugins/multiColumnSorting/multiColumnSorting.mjs +2 -37
  217. package/plugins/nestedHeaders/nestedHeaders.js +10 -240
  218. package/plugins/nestedHeaders/nestedHeaders.mjs +11 -241
  219. package/plugins/nestedHeaders/stateManager/index.js +3 -102
  220. package/plugins/nestedHeaders/stateManager/index.mjs +3 -102
  221. package/plugins/nestedRows/nestedRows.js +0 -41
  222. package/plugins/nestedRows/nestedRows.mjs +0 -41
  223. package/plugins/nestedRows/ui/headers.js +0 -11
  224. package/plugins/nestedRows/ui/headers.mjs +1 -12
  225. package/renderers/autocompleteRenderer/autocompleteRenderer.js +0 -8
  226. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +0 -8
  227. package/renderers/baseRenderer/baseRenderer.js +0 -17
  228. package/renderers/baseRenderer/baseRenderer.mjs +1 -18
  229. package/renderers/checkboxRenderer/checkboxRenderer.js +4 -9
  230. package/renderers/checkboxRenderer/checkboxRenderer.mjs +4 -9
  231. package/renderers/index.d.ts +0 -9
  232. package/selection/highlight/constants.js +15 -0
  233. package/selection/highlight/constants.mjs +6 -0
  234. package/selection/highlight/highlight.js +71 -256
  235. package/selection/highlight/highlight.mjs +71 -250
  236. package/selection/highlight/types/activeHeader.js +8 -10
  237. package/selection/highlight/types/activeHeader.mjs +8 -10
  238. package/selection/highlight/types/area.js +18 -6
  239. package/selection/highlight/types/area.mjs +18 -6
  240. package/selection/highlight/types/{focus.js → cell.js} +7 -5
  241. package/selection/highlight/types/{focus.mjs → cell.mjs} +7 -5
  242. package/selection/highlight/types/customSelection.js +9 -7
  243. package/selection/highlight/types/customSelection.mjs +9 -7
  244. package/selection/highlight/types/fill.js +7 -5
  245. package/selection/highlight/types/fill.mjs +7 -5
  246. package/selection/highlight/types/header.js +18 -9
  247. package/selection/highlight/types/header.mjs +18 -9
  248. package/selection/highlight/types/index.js +35 -0
  249. package/selection/highlight/types/index.mjs +31 -0
  250. package/selection/highlight/visualSelection.js +27 -31
  251. package/selection/highlight/visualSelection.mjs +27 -31
  252. package/selection/index.js +7 -4
  253. package/selection/index.mjs +3 -2
  254. package/selection/mouseEventHandler.js +1 -7
  255. package/selection/mouseEventHandler.mjs +1 -7
  256. package/selection/range.js +8 -8
  257. package/selection/range.mjs +8 -8
  258. package/selection/selection.js +152 -321
  259. package/selection/selection.mjs +151 -318
  260. package/selection/transformation.js +90 -232
  261. package/selection/transformation.mjs +90 -232
  262. package/selection/utils.js +21 -15
  263. package/selection/utils.mjs +21 -16
  264. package/settings.d.ts +0 -4
  265. package/shortcuts/context.js +4 -23
  266. package/shortcuts/context.mjs +5 -23
  267. package/shortcuts/manager.js +7 -25
  268. package/shortcuts/manager.mjs +7 -26
  269. package/shortcuts/recorder.js +3 -3
  270. package/shortcuts/recorder.mjs +3 -3
  271. package/shortcuts/utils.js +5 -19
  272. package/shortcuts/utils.mjs +4 -18
  273. package/tableView.js +13 -111
  274. package/tableView.mjs +14 -112
  275. package/3rdparty/walkontable/src/selection/border/constants.js +0 -16
  276. package/3rdparty/walkontable/src/selection/border/constants.mjs +0 -12
  277. package/3rdparty/walkontable/src/selection/constants.js +0 -62
  278. package/3rdparty/walkontable/src/selection/constants.mjs +0 -51
  279. package/3rdparty/walkontable/src/selection/index.js +0 -26
  280. package/3rdparty/walkontable/src/selection/index.mjs +0 -5
  281. package/3rdparty/walkontable/src/selection/manager.js +0 -274
  282. package/3rdparty/walkontable/src/selection/manager.mjs +0 -269
  283. package/3rdparty/walkontable/src/selection/scanner.js +0 -270
  284. package/3rdparty/walkontable/src/selection/scanner.mjs +0 -267
  285. package/3rdparty/walkontable/src/selection/selection.js +0 -101
  286. package/3rdparty/walkontable/src/selection/selection.mjs +0 -96
  287. package/cellTypes/selectType/index.d.ts +0 -1
  288. package/cellTypes/selectType/index.js +0 -6
  289. package/cellTypes/selectType/index.mjs +0 -1
  290. package/cellTypes/selectType/selectType.d.ts +0 -14
  291. package/cellTypes/selectType/selectType.js +0 -13
  292. package/cellTypes/selectType/selectType.mjs +0 -8
  293. package/core/focusCatcher/focusDetector.js +0 -63
  294. package/core/focusCatcher/focusDetector.mjs +0 -59
  295. package/core/focusCatcher/index.js +0 -142
  296. package/core/focusCatcher/index.mjs +0 -138
  297. package/core/index.js +0 -9
  298. package/core/index.mjs +0 -1
  299. package/focusManager.d.ts +0 -12
  300. package/focusManager.js +0 -265
  301. package/focusManager.mjs +0 -261
  302. package/helpers/a11y.js +0 -79
  303. package/helpers/a11y.mjs +0 -38
  304. package/plugins/comments/contextMenuItem/addEditComment.js +0 -41
  305. package/plugins/comments/contextMenuItem/addEditComment.mjs +0 -35
  306. package/plugins/comments/contextMenuItem/readOnlyComment.js +0 -49
  307. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +0 -43
  308. package/plugins/comments/contextMenuItem/removeComment.js +0 -38
  309. package/plugins/comments/contextMenuItem/removeComment.mjs +0 -32
  310. package/plugins/contextMenu/menu/defaultShortcutsList.js +0 -88
  311. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +0 -84
  312. package/plugins/contextMenu/menu/index.js +0 -9
  313. package/plugins/contextMenu/menu/index.mjs +0 -1
  314. package/plugins/contextMenu/menu/menuItemRenderer.js +0 -58
  315. package/plugins/contextMenu/menu/menuItemRenderer.mjs +0 -54
  316. package/plugins/contextMenu/menu/navigator.js +0 -27
  317. package/plugins/contextMenu/menu/navigator.mjs +0 -23
  318. package/plugins/contextMenu/menu/positioner.js +0 -213
  319. package/plugins/contextMenu/menu/positioner.mjs +0 -209
  320. package/plugins/contextMenu/menu/shortcuts.js +0 -114
  321. package/plugins/contextMenu/menu/shortcuts.mjs +0 -110
  322. package/plugins/contextMenu/menu/utils.js +0 -177
  323. package/plugins/contextMenu/menu/utils.mjs +0 -163
  324. package/plugins/contextMenu/predefinedItems/index.mjs +0 -68
  325. package/plugins/filters/menu/focusController.js +0 -123
  326. package/plugins/filters/menu/focusController.mjs +0 -119
  327. package/plugins/filters/menu/focusNavigator.js +0 -30
  328. package/plugins/filters/menu/focusNavigator.mjs +0 -26
  329. package/renderers/dateRenderer/dateRenderer.d.ts +0 -5
  330. package/renderers/dateRenderer/dateRenderer.js +0 -29
  331. package/renderers/dateRenderer/dateRenderer.mjs +0 -24
  332. package/renderers/dateRenderer/index.d.ts +0 -1
  333. package/renderers/dateRenderer/index.js +0 -6
  334. package/renderers/dateRenderer/index.mjs +0 -1
  335. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +0 -5
  336. package/renderers/handsontableRenderer/handsontableRenderer.js +0 -29
  337. package/renderers/handsontableRenderer/handsontableRenderer.mjs +0 -24
  338. package/renderers/handsontableRenderer/index.d.ts +0 -1
  339. package/renderers/handsontableRenderer/index.js +0 -6
  340. package/renderers/handsontableRenderer/index.mjs +0 -1
  341. package/renderers/selectRenderer/index.d.ts +0 -1
  342. package/renderers/selectRenderer/index.js +0 -6
  343. package/renderers/selectRenderer/index.mjs +0 -1
  344. package/renderers/selectRenderer/selectRenderer.d.ts +0 -5
  345. package/renderers/selectRenderer/selectRenderer.js +0 -27
  346. package/renderers/selectRenderer/selectRenderer.mjs +0 -22
  347. package/selection/highlight/types/areaLayered.js +0 -31
  348. package/selection/highlight/types/areaLayered.mjs +0 -26
  349. package/selection/highlight/types/column.js +0 -27
  350. package/selection/highlight/types/column.mjs +0 -22
  351. package/selection/highlight/types/row.js +0 -27
  352. package/selection/highlight/types/row.mjs +0 -22
  353. package/shortcutContexts/commands/editor/closeAndSave.js +0 -12
  354. package/shortcutContexts/commands/editor/closeAndSave.mjs +0 -8
  355. package/shortcutContexts/commands/editor/closeWithoutSaving.js +0 -12
  356. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +0 -8
  357. package/shortcutContexts/commands/editor/fastOpen.js +0 -16
  358. package/shortcutContexts/commands/editor/fastOpen.mjs +0 -12
  359. package/shortcutContexts/commands/editor/index.js +0 -16
  360. package/shortcutContexts/commands/editor/index.mjs +0 -12
  361. package/shortcutContexts/commands/editor/open.js +0 -27
  362. package/shortcutContexts/commands/editor/open.mjs +0 -23
  363. package/shortcutContexts/commands/emptySelectedCells.js +0 -11
  364. package/shortcutContexts/commands/emptySelectedCells.mjs +0 -7
  365. package/shortcutContexts/commands/extendCellsSelection/down.js +0 -15
  366. package/shortcutContexts/commands/extendCellsSelection/down.mjs +0 -11
  367. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +0 -25
  368. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +0 -21
  369. package/shortcutContexts/commands/extendCellsSelection/index.js +0 -26
  370. package/shortcutContexts/commands/extendCellsSelection/index.mjs +0 -22
  371. package/shortcutContexts/commands/extendCellsSelection/left.js +0 -15
  372. package/shortcutContexts/commands/extendCellsSelection/left.mjs +0 -11
  373. package/shortcutContexts/commands/extendCellsSelection/right.js +0 -15
  374. package/shortcutContexts/commands/extendCellsSelection/right.mjs +0 -11
  375. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +0 -19
  376. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +0 -15
  377. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +0 -29
  378. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +0 -25
  379. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +0 -19
  380. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +0 -15
  381. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +0 -19
  382. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +0 -15
  383. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +0 -29
  384. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +0 -25
  385. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +0 -29
  386. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +0 -25
  387. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +0 -29
  388. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +0 -25
  389. package/shortcutContexts/commands/extendCellsSelection/toRows.js +0 -19
  390. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +0 -15
  391. package/shortcutContexts/commands/extendCellsSelection/up.js +0 -15
  392. package/shortcutContexts/commands/extendCellsSelection/up.mjs +0 -11
  393. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +0 -25
  394. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +0 -21
  395. package/shortcutContexts/commands/index.js +0 -35
  396. package/shortcutContexts/commands/index.mjs +0 -31
  397. package/shortcutContexts/commands/moveCellSelection/down.js +0 -13
  398. package/shortcutContexts/commands/moveCellSelection/down.mjs +0 -9
  399. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +0 -33
  400. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +0 -29
  401. package/shortcutContexts/commands/moveCellSelection/index.js +0 -28
  402. package/shortcutContexts/commands/moveCellSelection/index.mjs +0 -24
  403. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +0 -12
  404. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +0 -8
  405. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +0 -12
  406. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +0 -8
  407. package/shortcutContexts/commands/moveCellSelection/left.js +0 -10
  408. package/shortcutContexts/commands/moveCellSelection/left.mjs +0 -6
  409. package/shortcutContexts/commands/moveCellSelection/right.js +0 -10
  410. package/shortcutContexts/commands/moveCellSelection/right.mjs +0 -6
  411. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +0 -17
  412. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +0 -13
  413. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +0 -18
  414. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +0 -14
  415. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +0 -14
  416. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +0 -10
  417. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +0 -17
  418. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +0 -13
  419. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +0 -19
  420. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +0 -15
  421. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +0 -21
  422. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +0 -17
  423. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +0 -17
  424. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +0 -13
  425. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +0 -19
  426. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +0 -15
  427. package/shortcutContexts/commands/moveCellSelection/up.js +0 -13
  428. package/shortcutContexts/commands/moveCellSelection/up.mjs +0 -9
  429. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +0 -33
  430. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +0 -29
  431. package/shortcutContexts/commands/populateSelectedCellsData.js +0 -29
  432. package/shortcutContexts/commands/populateSelectedCellsData.mjs +0 -25
  433. package/shortcutContexts/commands/scrollToFocusedCell.js +0 -35
  434. package/shortcutContexts/commands/scrollToFocusedCell.mjs +0 -31
  435. package/shortcutContexts/commands/selectAll.js +0 -12
  436. package/shortcutContexts/commands/selectAll.mjs +0 -8
  437. package/shortcutContexts/constants.js +0 -13
  438. package/shortcutContexts/constants.mjs +0 -8
  439. package/shortcutContexts/editor.js +0 -25
  440. package/shortcutContexts/editor.mjs +0 -21
  441. package/shortcutContexts/grid.js +0 -163
  442. package/shortcutContexts/grid.mjs +0 -159
  443. package/shortcutContexts/index.js +0 -24
  444. package/shortcutContexts/index.mjs +0 -11
  445. package/utils/paginator.js +0 -151
  446. package/utils/paginator.mjs +0 -147
@@ -1,29 +1,20 @@
1
1
  import "core-js/modules/es.array.push.js";
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";
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";
26
15
  const MIN_WIDTH = 215;
16
+ const SHORTCUTS_CONTEXT = 'menu';
17
+ const SHORTCUTS_GROUP = SHORTCUTS_CONTEXT;
27
18
 
28
19
  /**
29
20
  * @typedef MenuOptions
@@ -40,33 +31,12 @@ const MIN_WIDTH = 215;
40
31
  * @private
41
32
  * @class Menu
42
33
  */
43
- var _navigator = /*#__PURE__*/new WeakMap();
44
- var _shortcutsCtrl = /*#__PURE__*/new WeakMap();
45
- export class Menu {
34
+ class Menu {
46
35
  /**
47
36
  * @param {Core} hotInstance Handsontable instance.
48
37
  * @param {MenuOptions} [options] Menu options.
49
38
  */
50
39
  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
- });
70
40
  this.hot = hotInstance;
71
41
  this.options = options || {
72
42
  parent: null,
@@ -79,21 +49,20 @@ export class Menu {
79
49
  };
80
50
  this.eventManager = new EventManager(this);
81
51
  this.container = this.createContainer(this.options.name);
82
- this.positioner = new Positioner(this.options.keepInViewport);
83
52
  this.hotMenu = null;
84
53
  this.hotSubMenus = {};
85
54
  this.parentMenu = this.options.parent || null;
86
55
  this.menuItems = null;
87
56
  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;
88
65
  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
- }
97
66
  }
98
67
 
99
68
  /**
@@ -119,24 +88,6 @@ export class Menu {
119
88
  this.menuItems = menuItems;
120
89
  }
121
90
 
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
-
140
91
  /**
141
92
  * Returns currently selected menu item. Returns `null` if no item was selected.
142
93
  *
@@ -155,6 +106,17 @@ export class Menu {
155
106
  return Array.isArray(this.hotMenu.getSelectedLast());
156
107
  }
157
108
 
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
+
158
120
  /**
159
121
  * Check if menu is using as sub-menu.
160
122
  *
@@ -171,6 +133,7 @@ export class Menu {
171
133
  * @fires Hooks#afterContextMenuShow
172
134
  */
173
135
  open() {
136
+ var _this = this;
174
137
  this.runLocalHooks('beforeOpen');
175
138
  this.container.removeAttribute('style');
176
139
  this.container.style.display = 'block';
@@ -205,21 +168,16 @@ export class Menu {
205
168
  readOnly: true,
206
169
  editor: false,
207
170
  copyPaste: false,
208
- hiddenRows: true,
209
171
  maxCols: 1,
210
172
  columns: [{
211
173
  data: 'name',
212
- renderer: createMenuItemRenderer(this.hot)
174
+ renderer: (hot, TD, row, col, prop, value) => this.menuItemRenderer(hot, TD, row, col, prop, value)
213
175
  }],
214
176
  renderAllRows: true,
215
177
  fragmentSelection: false,
216
178
  outsideClickDeselects: false,
217
179
  disableVisualSelection: 'area',
218
180
  layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr',
219
- ariaTags: false,
220
- beforeOnCellMouseOver: (event, coords) => {
221
- _classPrivateFieldGet(this, _navigator).setCurrentPage(coords.row);
222
- },
223
181
  afterOnCellMouseOver: (event, coords) => {
224
182
  if (this.isAllSubMenusClosed()) {
225
183
  delayedOpenSubMenu(coords.row);
@@ -237,13 +195,6 @@ export class Menu {
237
195
  this.close(true);
238
196
  }
239
197
  },
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
- },
247
198
  beforeOnCellMouseUp: event => {
248
199
  if (this.hasSelectedItem()) {
249
200
  shouldAutoCloseMenu = !this.isCommandPassive(this.getSelectedItem());
@@ -261,7 +212,7 @@ export class Menu {
261
212
  // event hides the tapped element, the click event grabs the element below. As a result, the filter
262
213
  // by condition menu is closed and immediately open on tapping the "None" item.
263
214
  if (isMobileBrowser() || isIpadOS()) {
264
- this.hot._registerTimeout(() => this.close(true), 325);
215
+ setTimeout(() => this.close(true), 325);
265
216
  } else {
266
217
  this.close(true);
267
218
  }
@@ -277,17 +228,120 @@ export class Menu {
277
228
  };
278
229
  this.origOutsideClickDeselects = this.hot.getSettings().outsideClickDeselects;
279
230
  this.hot.getSettings().outsideClickDeselects = false;
280
- this.hotMenu = new this.hot.constructor(this.container, settings);
231
+ this.hotMenu = new Core(this.container, settings);
281
232
  this.hotMenu.addHook('afterInit', () => this.onAfterInit());
233
+ this.hotMenu.addHook('afterSelection', function () {
234
+ return _this.onAfterSelection(...arguments);
235
+ });
282
236
  this.hotMenu.init();
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);
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');
291
345
  }
292
346
 
293
347
  /**
@@ -300,24 +354,17 @@ export class Menu {
300
354
  if (!this.isOpened()) {
301
355
  return;
302
356
  }
303
- if (closeParent && this.isSubMenu()) {
357
+ if (closeParent && this.parentMenu) {
304
358
  this.parentMenu.close();
305
359
  } else {
306
- _classPrivateFieldGet(this, _navigator).clear();
307
360
  this.closeAllSubMenus();
308
361
  this.container.style.display = 'none';
362
+ this.releaseMainTableCallbacks();
309
363
  this.hotMenu.destroy();
310
364
  this.hotMenu = null;
311
365
  this.hot.getSettings().outsideClickDeselects = this.origOutsideClickDeselects;
312
366
  this.runLocalHooks('afterClose');
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
- }
367
+ if (this.parentMenu) {
321
368
  this.parentMenu.hotMenu.listen();
322
369
  }
323
370
  }
@@ -350,11 +397,6 @@ export class Menu {
350
397
  subMenu.open();
351
398
  subMenu.setPosition(cell.getBoundingClientRect());
352
399
  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
- }
358
400
  return subMenu;
359
401
  }
360
402
 
@@ -369,12 +411,6 @@ export class Menu {
369
411
  if (menus) {
370
412
  menus.destroy();
371
413
  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
- }
378
414
  }
379
415
  }
380
416
 
@@ -394,19 +430,6 @@ export class Menu {
394
430
  return Object.keys(this.hotSubMenus).length === 0;
395
431
  }
396
432
 
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
-
410
433
  /**
411
434
  * Destroy instance.
412
435
  */
@@ -466,30 +489,252 @@ export class Menu {
466
489
  * @returns {boolean}
467
490
  */
468
491
  isCommandPassive(commandDescriptor) {
469
- return commandDescriptor.isCommand === false || isItemSeparator(commandDescriptor) || isItemDisabled(commandDescriptor, this.hot) || isItemSubMenu(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;
470
500
  }
471
501
 
472
502
  /**
473
- * Set offset menu position for specified area (`above`, `below`, `left` or `right`).
503
+ * Set menu position based on dom event or based on literal object.
474
504
  *
475
- * @param {string} area Specified area name (`above`, `below`, `left` or `right`).
476
- * @param {number} offset Offset value.
505
+ * @param {Event|object} coords Event or literal Object with coordinates.
477
506
  */
478
- setOffset(area) {
479
- let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
480
- this.positioner.setOffset(area, offset);
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
+ }
481
526
  }
482
527
 
483
528
  /**
484
- * Set menu position based on dom event or based on literal object.
529
+ * Set menu horizontal position for RTL mode.
485
530
  *
486
- * @param {Event|object} coords Event or literal Object with coordinates.
531
+ * @param {Cursor} cursor `Cursor` object.
487
532
  */
488
- setPosition(coords) {
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.
582
+ *
583
+ * @param {Cursor} cursor `Cursor` object.
584
+ */
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`;
598
+ }
599
+
600
+ /**
601
+ * Set menu position on the left of cursor object.
602
+ *
603
+ * @param {Cursor} cursor `Cursor` object.
604
+ */
605
+ setPositionOnLeftOfCursor(cursor) {
606
+ let left = this.offset.left + cursor.left - this.container.offsetWidth;
489
607
  if (this.isSubMenu()) {
490
- this.positioner.setParentElement(this.parentMenu.container);
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
+ }
491
737
  }
492
- this.positioner.setElement(this.container).updatePosition(coords);
493
738
  }
494
739
 
495
740
  /**
@@ -528,6 +773,26 @@ export class Menu {
528
773
  return container;
529
774
  }
530
775
 
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
+
531
796
  /**
532
797
  * On after init listener.
533
798
  *
@@ -547,10 +812,20 @@ export class Menu {
547
812
  holderStyle.width = `${currentHiderWidth + 3}px`;
548
813
  holderStyle.height = `${realHeight + 3}px`;
549
814
  hiderStyle.height = holderStyle.height;
815
+ }
550
816
 
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)]);
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;
554
829
  }
555
830
  }
556
831
 
@@ -590,4 +865,5 @@ export class Menu {
590
865
  }
591
866
  }
592
867
  }
593
- mixin(Menu, localHooks);
868
+ mixin(Menu, localHooks);
869
+ export default Menu;