handsontable 0.0.0-next-85c3085-20230713 → 0.0.0-next-08765b9-20230714

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 (295) 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 +7 -7
  14. package/3rdparty/walkontable/src/event.mjs +7 -7
  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 +1 -1
  20. package/3rdparty/walkontable/src/overlay/_base.mjs +1 -1
  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/{border.js → selection/border/border.js} +7 -12
  26. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  27. package/3rdparty/walkontable/src/selection/border/constants.js +16 -0
  28. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  29. package/3rdparty/walkontable/src/selection/constants.js +62 -0
  30. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  31. package/3rdparty/walkontable/src/selection/index.js +26 -0
  32. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  33. package/3rdparty/walkontable/src/selection/manager.js +259 -0
  34. package/3rdparty/walkontable/src/selection/manager.mjs +254 -0
  35. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  36. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  37. package/3rdparty/walkontable/src/selection/selection.js +101 -0
  38. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  39. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
  40. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  41. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
  42. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  43. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
  44. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  45. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
  46. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  47. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
  48. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  49. package/3rdparty/walkontable/src/table.js +6 -78
  50. package/3rdparty/walkontable/src/table.mjs +7 -79
  51. package/base.js +2 -2
  52. package/base.mjs +2 -2
  53. package/core/focusCatcher/focusDetector.js +58 -0
  54. package/core/focusCatcher/focusDetector.mjs +54 -0
  55. package/core/focusCatcher/index.js +142 -0
  56. package/core/focusCatcher/index.mjs +138 -0
  57. package/core/index.js +9 -0
  58. package/core/index.mjs +1 -0
  59. package/core.d.ts +6 -3
  60. package/core.js +173 -290
  61. package/core.mjs +173 -290
  62. package/dataMap/metaManager/metaSchema.js +41 -0
  63. package/dataMap/metaManager/metaSchema.mjs +41 -0
  64. package/dist/handsontable.css +19 -3
  65. package/dist/handsontable.full.css +19 -3
  66. package/dist/handsontable.full.js +8668 -5366
  67. package/dist/handsontable.full.min.css +3 -3
  68. package/dist/handsontable.full.min.js +25 -25
  69. package/dist/handsontable.js +10976 -7674
  70. package/dist/handsontable.min.css +3 -3
  71. package/dist/handsontable.min.js +19 -19
  72. package/editorManager.js +11 -75
  73. package/editorManager.mjs +11 -74
  74. package/editors/textEditor/textEditor.js +3 -11
  75. package/editors/textEditor/textEditor.mjs +4 -12
  76. package/helpers/mixed.js +1 -1
  77. package/helpers/mixed.mjs +1 -1
  78. package/helpers/number.d.ts +1 -0
  79. package/helpers/number.js +18 -0
  80. package/helpers/number.mjs +17 -0
  81. package/package.json +1 -1
  82. package/pluginHooks.d.ts +7 -1
  83. package/pluginHooks.js +106 -1
  84. package/pluginHooks.mjs +106 -1
  85. package/plugins/collapsibleColumns/collapsibleColumns.js +58 -4
  86. package/plugins/collapsibleColumns/collapsibleColumns.mjs +58 -4
  87. package/plugins/columnSorting/columnSorting.js +38 -0
  88. package/plugins/columnSorting/columnSorting.mjs +38 -2
  89. package/plugins/columnSorting/index.js +3 -1
  90. package/plugins/columnSorting/index.mjs +1 -1
  91. package/plugins/comments/commentEditor.js +1 -0
  92. package/plugins/comments/commentEditor.mjs +1 -0
  93. package/plugins/comments/comments.js +251 -189
  94. package/plugins/comments/comments.mjs +250 -190
  95. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  96. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  97. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  98. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  99. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  100. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  101. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  102. package/plugins/contextMenu/contextMenu.js +72 -30
  103. package/plugins/contextMenu/contextMenu.mjs +73 -31
  104. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  105. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  106. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  107. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  108. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  109. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  110. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  111. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  112. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  113. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  114. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  115. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  116. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  117. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  118. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  119. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  120. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  121. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  122. package/plugins/contextMenu/utils.js +28 -16
  123. package/plugins/contextMenu/utils.mjs +27 -15
  124. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  125. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  126. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  127. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  128. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  129. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  130. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  131. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  132. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  133. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  134. package/plugins/copyPaste/copyPaste.js +6 -2
  135. package/plugins/copyPaste/copyPaste.mjs +6 -2
  136. package/plugins/customBorders/customBorders.js +23 -20
  137. package/plugins/customBorders/customBorders.mjs +24 -21
  138. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  139. package/plugins/dropdownMenu/dropdownMenu.js +89 -32
  140. package/plugins/dropdownMenu/dropdownMenu.mjs +89 -32
  141. package/plugins/filters/filters.js +31 -14
  142. package/plugins/filters/filters.mjs +30 -13
  143. package/plugins/mergeCells/mergeCells.js +5 -16
  144. package/plugins/mergeCells/mergeCells.mjs +5 -16
  145. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  146. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  147. package/plugins/nestedHeaders/nestedHeaders.js +121 -8
  148. package/plugins/nestedHeaders/nestedHeaders.mjs +121 -8
  149. package/plugins/nestedHeaders/stateManager/index.js +37 -0
  150. package/plugins/nestedHeaders/stateManager/index.mjs +37 -0
  151. package/plugins/nestedRows/nestedRows.js +41 -0
  152. package/plugins/nestedRows/nestedRows.mjs +41 -0
  153. package/renderers/checkboxRenderer/checkboxRenderer.js +2 -2
  154. package/renderers/checkboxRenderer/checkboxRenderer.mjs +1 -1
  155. package/selection/highlight/highlight.js +256 -71
  156. package/selection/highlight/highlight.mjs +250 -71
  157. package/selection/highlight/types/activeHeader.js +10 -8
  158. package/selection/highlight/types/activeHeader.mjs +10 -8
  159. package/selection/highlight/types/area.js +6 -18
  160. package/selection/highlight/types/area.mjs +6 -18
  161. package/selection/highlight/types/areaLayered.js +31 -0
  162. package/selection/highlight/types/areaLayered.mjs +26 -0
  163. package/selection/highlight/types/column.js +27 -0
  164. package/selection/highlight/types/column.mjs +22 -0
  165. package/selection/highlight/types/customSelection.js +7 -9
  166. package/selection/highlight/types/customSelection.mjs +7 -9
  167. package/selection/highlight/types/fill.js +5 -7
  168. package/selection/highlight/types/fill.mjs +5 -7
  169. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  170. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  171. package/selection/highlight/types/header.js +9 -18
  172. package/selection/highlight/types/header.mjs +9 -18
  173. package/selection/highlight/types/row.js +27 -0
  174. package/selection/highlight/types/row.mjs +22 -0
  175. package/selection/highlight/visualSelection.js +31 -27
  176. package/selection/highlight/visualSelection.mjs +31 -27
  177. package/selection/index.js +4 -7
  178. package/selection/index.mjs +2 -3
  179. package/selection/mouseEventHandler.js +1 -1
  180. package/selection/mouseEventHandler.mjs +1 -1
  181. package/selection/range.js +8 -8
  182. package/selection/range.mjs +8 -8
  183. package/selection/selection.js +290 -154
  184. package/selection/selection.mjs +287 -153
  185. package/selection/transformation.js +232 -90
  186. package/selection/transformation.mjs +232 -90
  187. package/selection/utils.js +15 -21
  188. package/selection/utils.mjs +16 -21
  189. package/settings.d.ts +2 -0
  190. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  191. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  192. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  193. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  194. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  195. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  196. package/shortcutContexts/commands/editor/index.js +16 -0
  197. package/shortcutContexts/commands/editor/index.mjs +12 -0
  198. package/shortcutContexts/commands/editor/open.js +27 -0
  199. package/shortcutContexts/commands/editor/open.mjs +23 -0
  200. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  201. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  202. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  203. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  204. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +21 -0
  205. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +17 -0
  206. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  207. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  208. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  209. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  210. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  211. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  212. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  213. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  214. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  215. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  216. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  217. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  218. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  219. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  220. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  221. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  222. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  223. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  224. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  225. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  226. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  227. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  228. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  229. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  230. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +21 -0
  231. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +17 -0
  232. package/shortcutContexts/commands/index.js +35 -0
  233. package/shortcutContexts/commands/index.mjs +31 -0
  234. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  235. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  236. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +31 -0
  237. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +27 -0
  238. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  239. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  240. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  241. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  242. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  243. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  244. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  245. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  246. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  247. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  248. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  249. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  250. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  251. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  252. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  253. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  254. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  255. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  256. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  257. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  258. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  259. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  260. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  261. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  262. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  263. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  264. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  265. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  266. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +31 -0
  267. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +27 -0
  268. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  269. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  270. package/shortcutContexts/commands/scrollToFocusedCell.js +36 -0
  271. package/shortcutContexts/commands/scrollToFocusedCell.mjs +32 -0
  272. package/shortcutContexts/commands/selectAll.js +10 -0
  273. package/shortcutContexts/commands/selectAll.mjs +6 -0
  274. package/shortcutContexts/constants.js +13 -0
  275. package/shortcutContexts/constants.mjs +8 -0
  276. package/shortcutContexts/editor.js +25 -0
  277. package/shortcutContexts/editor.mjs +21 -0
  278. package/shortcutContexts/grid.js +163 -0
  279. package/shortcutContexts/grid.mjs +159 -0
  280. package/shortcutContexts/index.js +24 -0
  281. package/shortcutContexts/index.mjs +11 -0
  282. package/shortcuts/manager.js +2 -0
  283. package/shortcuts/manager.mjs +2 -0
  284. package/shortcuts/recorder.js +2 -2
  285. package/shortcuts/recorder.mjs +2 -2
  286. package/shortcuts/utils.js +19 -5
  287. package/shortcuts/utils.mjs +18 -4
  288. package/tableView.js +67 -13
  289. package/tableView.mjs +67 -13
  290. package/3rdparty/walkontable/src/selection.js +0 -295
  291. package/3rdparty/walkontable/src/selection.mjs +0 -290
  292. package/selection/highlight/constants.js +0 -15
  293. package/selection/highlight/constants.mjs +0 -6
  294. package/selection/highlight/types/index.js +0 -35
  295. package/selection/highlight/types/index.mjs +0 -31
@@ -431,6 +431,10 @@ class CopyPaste extends _base.BasePlugin {
431
431
  if (!selectionRange) {
432
432
  return;
433
433
  }
434
+ if (selectionRange.isSingleHeader()) {
435
+ this.copyableRanges = [];
436
+ return;
437
+ }
434
438
  _classPrivateFieldGet(this, _copyableRangesFactory).setSelectedRange(selectionRange);
435
439
  const groupedRanges = new Map([['headers', null], ['cells', null]]);
436
440
  if (_classPrivateFieldGet(this, _copyMode) === 'column-headers-only') {
@@ -627,7 +631,7 @@ class CopyPaste extends _base.BasePlugin {
627
631
  * @private
628
632
  */
629
633
  onPaste(event) {
630
- if (!this.hot.isListening() || this.isEditorOpened()) {
634
+ if (!this.hot.isListening() || this.isEditorOpened() || !this.hot.getSelected()) {
631
635
  return;
632
636
  }
633
637
  if (event && event.preventDefault) {
@@ -652,7 +656,7 @@ class CopyPaste extends _base.BasePlugin {
652
656
  if (typeof pastedData === 'string') {
653
657
  pastedData = (0, _SheetClip.parse)(pastedData);
654
658
  }
655
- if (pastedData && pastedData.length === 0) {
659
+ if (pastedData === void 0 || pastedData && pastedData.length === 0) {
656
660
  return;
657
661
  }
658
662
  if (this.hot.runHooks('beforePaste', pastedData, this.copyableRanges) === false) {
@@ -425,6 +425,10 @@ export class CopyPaste extends BasePlugin {
425
425
  if (!selectionRange) {
426
426
  return;
427
427
  }
428
+ if (selectionRange.isSingleHeader()) {
429
+ this.copyableRanges = [];
430
+ return;
431
+ }
428
432
  _classPrivateFieldGet(this, _copyableRangesFactory).setSelectedRange(selectionRange);
429
433
  const groupedRanges = new Map([['headers', null], ['cells', null]]);
430
434
  if (_classPrivateFieldGet(this, _copyMode) === 'column-headers-only') {
@@ -621,7 +625,7 @@ export class CopyPaste extends BasePlugin {
621
625
  * @private
622
626
  */
623
627
  onPaste(event) {
624
- if (!this.hot.isListening() || this.isEditorOpened()) {
628
+ if (!this.hot.isListening() || this.isEditorOpened() || !this.hot.getSelected()) {
625
629
  return;
626
630
  }
627
631
  if (event && event.preventDefault) {
@@ -646,7 +650,7 @@ export class CopyPaste extends BasePlugin {
646
650
  if (typeof pastedData === 'string') {
647
651
  pastedData = parse(pastedData);
648
652
  }
649
- if (pastedData && pastedData.length === 0) {
653
+ if (pastedData === void 0 || pastedData && pastedData.length === 0) {
650
654
  return;
651
655
  }
652
656
  if (this.hot.runHooks('beforePaste', pastedData, this.copyableRanges) === false) {
@@ -167,14 +167,11 @@ class CustomBorders extends _base.BasePlugin {
167
167
  const selectionType = (0, _selection.detectSelectionType)(selectionRanges);
168
168
  const selectionSchemaNormalizer = (0, _selection.normalizeSelectionFactory)(selectionType);
169
169
  (0, _array.arrayEach)(selectionRanges, selection => {
170
- const [rowStart, columnStart, rowEnd, columnEnd] = selectionSchemaNormalizer(selection);
171
- for (let row = rowStart; row <= rowEnd; row += 1) {
172
- for (let col = columnStart; col <= columnEnd; col += 1) {
173
- (0, _array.arrayEach)(borderKeys, borderKey => {
174
- this.prepareBorderFromCustomAdded(row, col, normBorder, (0, _utils.toInlinePropName)(borderKey));
175
- });
176
- }
177
- }
170
+ selectionSchemaNormalizer(selection).forAll((row, col) => {
171
+ (0, _array.arrayEach)(borderKeys, borderKey => {
172
+ this.prepareBorderFromCustomAdded(row, col, normBorder, (0, _utils.toInlinePropName)(borderKey));
173
+ });
174
+ });
178
175
  });
179
176
 
180
177
  /*
@@ -214,16 +211,13 @@ class CustomBorders extends _base.BasePlugin {
214
211
  const selectionSchemaNormalizer = (0, _selection.normalizeSelectionFactory)(selectionType);
215
212
  const selectedBorders = [];
216
213
  (0, _array.arrayEach)(selectionRanges, selection => {
217
- const [rowStart, columnStart, rowEnd, columnEnd] = selectionSchemaNormalizer(selection);
218
- for (let row = rowStart; row <= rowEnd; row += 1) {
219
- for (let col = columnStart; col <= columnEnd; col += 1) {
220
- (0, _array.arrayEach)(this.savedBorders, border => {
221
- if (border.row === row && border.col === col) {
222
- selectedBorders.push((0, _utils.denormalizeBorder)(border));
223
- }
224
- });
225
- }
226
- }
214
+ selectionSchemaNormalizer(selection).forAll((row, col) => {
215
+ (0, _array.arrayEach)(this.savedBorders, border => {
216
+ if (border.row === row && border.col === col) {
217
+ selectedBorders.push((0, _utils.denormalizeBorder)(border));
218
+ }
219
+ });
220
+ });
227
221
  });
228
222
  return selectedBorders;
229
223
  }
@@ -614,7 +608,8 @@ class CustomBorders extends _base.BasePlugin {
614
608
  let check = false;
615
609
  (0, _array.arrayEach)(this.hot.selection.highlight.customSelections, customSelection => {
616
610
  if (border.id === customSelection.settings.id) {
617
- (0, _object.objectEach)(customSelection.instanceBorders, borderObject => {
611
+ const borders = this.hot.view._wt.selectionManager.getBorderInstances(customSelection);
612
+ (0, _array.arrayEach)(borders, borderObject => {
618
613
  borderObject.toggleHiddenClass(place, remove); // TODO this also bad?
619
614
  });
620
615
 
@@ -648,7 +643,8 @@ class CustomBorders extends _base.BasePlugin {
648
643
  customSelection.visualCellRange = cellRange;
649
644
  customSelection.commit();
650
645
  if (place) {
651
- (0, _object.objectEach)(customSelection.instanceBorders, borderObject => {
646
+ const borders = this.hot.view._wt.selectionManager.getBorderInstances(customSelection);
647
+ (0, _array.arrayEach)(borders, borderObject => {
652
648
  borderObject.changeBorderStyle(place, border);
653
649
  });
654
650
  }
@@ -716,6 +712,13 @@ class CustomBorders extends _base.BasePlugin {
716
712
  return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);
717
713
  },
718
714
  disabled() {
715
+ const range = this.getSelectedRangeLast();
716
+ if (!range) {
717
+ return true;
718
+ }
719
+ if (range.isSingleHeader()) {
720
+ return true;
721
+ }
719
722
  return this.selection.isSelectedByCorner();
720
723
  },
721
724
  submenu: {
@@ -4,7 +4,7 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
4
4
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
5
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
6
6
  import { BasePlugin } from "../base/index.mjs";
7
- import { hasOwnProperty, objectEach, deepClone } from "../../helpers/object.mjs";
7
+ import { hasOwnProperty, deepClone } from "../../helpers/object.mjs";
8
8
  import { rangeEach } from "../../helpers/number.mjs";
9
9
  import { arrayEach, arrayReduce, arrayMap } from "../../helpers/array.mjs";
10
10
  import * as C from "../../i18n/constants.mjs";
@@ -160,14 +160,11 @@ export class CustomBorders extends BasePlugin {
160
160
  const selectionType = detectSelectionType(selectionRanges);
161
161
  const selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);
162
162
  arrayEach(selectionRanges, selection => {
163
- const [rowStart, columnStart, rowEnd, columnEnd] = selectionSchemaNormalizer(selection);
164
- for (let row = rowStart; row <= rowEnd; row += 1) {
165
- for (let col = columnStart; col <= columnEnd; col += 1) {
166
- arrayEach(borderKeys, borderKey => {
167
- this.prepareBorderFromCustomAdded(row, col, normBorder, toInlinePropName(borderKey));
168
- });
169
- }
170
- }
163
+ selectionSchemaNormalizer(selection).forAll((row, col) => {
164
+ arrayEach(borderKeys, borderKey => {
165
+ this.prepareBorderFromCustomAdded(row, col, normBorder, toInlinePropName(borderKey));
166
+ });
167
+ });
171
168
  });
172
169
 
173
170
  /*
@@ -207,16 +204,13 @@ export class CustomBorders extends BasePlugin {
207
204
  const selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);
208
205
  const selectedBorders = [];
209
206
  arrayEach(selectionRanges, selection => {
210
- const [rowStart, columnStart, rowEnd, columnEnd] = selectionSchemaNormalizer(selection);
211
- for (let row = rowStart; row <= rowEnd; row += 1) {
212
- for (let col = columnStart; col <= columnEnd; col += 1) {
213
- arrayEach(this.savedBorders, border => {
214
- if (border.row === row && border.col === col) {
215
- selectedBorders.push(denormalizeBorder(border));
216
- }
217
- });
218
- }
219
- }
207
+ selectionSchemaNormalizer(selection).forAll((row, col) => {
208
+ arrayEach(this.savedBorders, border => {
209
+ if (border.row === row && border.col === col) {
210
+ selectedBorders.push(denormalizeBorder(border));
211
+ }
212
+ });
213
+ });
220
214
  });
221
215
  return selectedBorders;
222
216
  }
@@ -607,7 +601,8 @@ export class CustomBorders extends BasePlugin {
607
601
  let check = false;
608
602
  arrayEach(this.hot.selection.highlight.customSelections, customSelection => {
609
603
  if (border.id === customSelection.settings.id) {
610
- objectEach(customSelection.instanceBorders, borderObject => {
604
+ const borders = this.hot.view._wt.selectionManager.getBorderInstances(customSelection);
605
+ arrayEach(borders, borderObject => {
611
606
  borderObject.toggleHiddenClass(place, remove); // TODO this also bad?
612
607
  });
613
608
 
@@ -641,7 +636,8 @@ export class CustomBorders extends BasePlugin {
641
636
  customSelection.visualCellRange = cellRange;
642
637
  customSelection.commit();
643
638
  if (place) {
644
- objectEach(customSelection.instanceBorders, borderObject => {
639
+ const borders = this.hot.view._wt.selectionManager.getBorderInstances(customSelection);
640
+ arrayEach(borders, borderObject => {
645
641
  borderObject.changeBorderStyle(place, border);
646
642
  });
647
643
  }
@@ -709,6 +705,13 @@ export class CustomBorders extends BasePlugin {
709
705
  return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);
710
706
  },
711
707
  disabled() {
708
+ const range = this.getSelectedRangeLast();
709
+ if (!range) {
710
+ return true;
711
+ }
712
+ if (range.isSingleHeader()) {
713
+ return true;
714
+ }
712
715
  return this.selection.isSelectedByCorner();
713
716
  },
714
717
  submenu: {
@@ -18,7 +18,7 @@ export class DropdownMenu extends BasePlugin {
18
18
 
19
19
  constructor(hotInstance: Core);
20
20
  isEnabled(): boolean;
21
- open(event: Event): void;
21
+ open(position: { left: number, top: number } | Event, offset?: { above?: number, below?: number, left?: number, right?: number }): void;
22
22
  close(): void;
23
23
  executeCommand(commandName: string, ...params: any): void;
24
24
  }
@@ -3,7 +3,9 @@
3
3
  exports.__esModule = true;
4
4
  var _base = require("../base");
5
5
  var _array = require("../../helpers/array");
6
+ var _object = require("../../helpers/object");
6
7
  var _commandExecutor = _interopRequireDefault(require("../contextMenu/commandExecutor"));
8
+ var _utils = require("../contextMenu/utils");
7
9
  var _eventManager = _interopRequireDefault(require("../../eventManager"));
8
10
  var _element = require("../../helpers/dom/element");
9
11
  var _itemsFactory = _interopRequireDefault(require("../contextMenu/itemsFactory"));
@@ -21,6 +23,7 @@ exports.PLUGIN_KEY = PLUGIN_KEY;
21
23
  const PLUGIN_PRIORITY = 230;
22
24
  exports.PLUGIN_PRIORITY = PLUGIN_PRIORITY;
23
25
  const BUTTON_CLASS_NAME = 'changeType';
26
+ const SHORTCUTS_GROUP = PLUGIN_KEY;
24
27
 
25
28
  /* eslint-disable jsdoc/require-description-complete-sentence */
26
29
  /**
@@ -157,6 +160,7 @@ class DropdownMenu extends _base.BasePlugin {
157
160
  if (typeof settings.callback === 'function') {
158
161
  this.commandExecutor.setCommonCallback(settings.callback);
159
162
  }
163
+ this.registerShortcuts();
160
164
  super.enablePlugin();
161
165
  this.callOnPluginsReady(() => {
162
166
  this.hot.runHooks('afterDropdownMenuDefaultOptions', predefinedItems);
@@ -207,9 +211,68 @@ class DropdownMenu extends _base.BasePlugin {
207
211
  if (this.menu) {
208
212
  this.menu.destroy();
209
213
  }
214
+ this.unregisterShortcuts();
210
215
  super.disablePlugin();
211
216
  }
212
217
 
218
+ /**
219
+ * Register shortcuts responsible for toggling dropdown menu.
220
+ *
221
+ * @private
222
+ */
223
+ registerShortcuts() {
224
+ const context = this.hot.getShortcutManager().getContext('grid');
225
+ const callback = () => {
226
+ const {
227
+ highlight
228
+ } = this.hot.getSelectedRangeLast();
229
+ if ((highlight.isHeader() && highlight.row === -1 || highlight.isCell()) && highlight.col >= 0) {
230
+ this.hot.selectColumns(highlight.col, highlight.col, -1);
231
+ const {
232
+ from
233
+ } = this.hot.getSelectedRangeLast();
234
+ const offset = (0, _utils.getDocumentOffsetByElement)(this.menu.container, this.hot.rootDocument);
235
+ const target = this.hot.getCell(-1, from.col, true);
236
+ const rect = target.getBoundingClientRect();
237
+ this.open({
238
+ left: rect.left + offset.left,
239
+ top: rect.top + target.offsetHeight + offset.top
240
+ }, {
241
+ left: rect.width
242
+ });
243
+ this.hot._registerTimeout(() => {
244
+ this.menu.selectFirstCell();
245
+ });
246
+ }
247
+ };
248
+ context.addShortcuts([{
249
+ keys: [['Shift', 'Alt', 'ArrowDown'], ['Shift', 'Enter']],
250
+ callback,
251
+ runOnlyIf: () => {
252
+ var _this$hot$getSelected;
253
+ return ((_this$hot$getSelected = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected === void 0 ? void 0 : _this$hot$getSelected.highlight.isHeader()) && !this.menu.isOpened();
254
+ },
255
+ group: SHORTCUTS_GROUP
256
+ }, {
257
+ keys: [['Shift', 'Alt', 'ArrowDown']],
258
+ callback,
259
+ runOnlyIf: () => {
260
+ var _this$hot$getSelected2;
261
+ return ((_this$hot$getSelected2 = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected2 === void 0 ? void 0 : _this$hot$getSelected2.highlight.isCell()) && !this.menu.isOpened();
262
+ },
263
+ group: SHORTCUTS_GROUP
264
+ }]);
265
+ }
266
+
267
+ /**
268
+ * Unregister shortcuts responsible for toggling dropdown menu.
269
+ *
270
+ * @private
271
+ */
272
+ unregisterShortcuts() {
273
+ this.hot.getShortcutManager().getContext('grid').removeShortcutsByGroup(SHORTCUTS_GROUP);
274
+ }
275
+
213
276
  /**
214
277
  * Registers the DOM listeners.
215
278
  *
@@ -222,23 +285,30 @@ class DropdownMenu extends _base.BasePlugin {
222
285
  /**
223
286
  * Opens menu and re-position it based on the passed coordinates.
224
287
  *
225
- * @param {object|Event} position An object with `pageX` and `pageY` properties which contains values relative to
226
- * the top left of the fully rendered content area in the browser or with `clientX`
227
- * and `clientY` properties which contains values relative to the upper left edge
228
- * of the content area (the viewport) of the browser window. This object is structurally
229
- * compatible with native mouse event so it can be used either.
288
+ * @param {{ top: number, left: number }|Event} position An object with `top` and `left` properties
289
+ * which contains coordinates relative to the browsers viewport (without included scroll offsets).
290
+ * Or if the native event is passed the menu will be positioned based on the `pageX` and `pageY`
291
+ * coordinates.
292
+ * @param {{ above: number, below: number, left: number, right: number }} offset An object allows applying
293
+ * the offset to the menu position.
230
294
  * @fires Hooks#beforeDropdownMenuShow
231
295
  * @fires Hooks#afterDropdownMenuShow
232
296
  */
233
-
234
297
  open(position) {
235
- if (!this.menu) {
298
+ var _this$menu;
299
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
300
+ above: 0,
301
+ below: 0,
302
+ left: 0,
303
+ right: 0
304
+ };
305
+ if ((_this$menu = this.menu) !== null && _this$menu !== void 0 && _this$menu.isOpened()) {
236
306
  return;
237
307
  }
238
308
  this.menu.open();
239
- if (position.width) {
240
- this.menu.setOffset('left', position.width);
241
- }
309
+ (0, _object.objectEach)(offset, (value, key) => {
310
+ this.menu.setOffset(key, value);
311
+ });
242
312
  this.menu.setPosition(position);
243
313
  }
244
314
 
@@ -246,10 +316,8 @@ class DropdownMenu extends _base.BasePlugin {
246
316
  * Closes dropdown menu.
247
317
  */
248
318
  close() {
249
- if (!this.menu) {
250
- return;
251
- }
252
- this.menu.close();
319
+ var _this$menu2;
320
+ (_this$menu2 = this.menu) === null || _this$menu2 === void 0 ? void 0 : _this$menu2.close();
253
321
  }
254
322
 
255
323
  /**
@@ -314,26 +382,14 @@ class DropdownMenu extends _base.BasePlugin {
314
382
  */
315
383
  onTableClick(event) {
316
384
  event.stopPropagation();
317
- if ((0, _element.hasClass)(event.target, BUTTON_CLASS_NAME) && !this.menu.isOpened()) {
318
- let offsetTop = 0;
319
- let offsetLeft = 0;
320
- if (this.hot.rootDocument !== this.menu.container.ownerDocument) {
321
- const {
322
- frameElement
323
- } = this.hot.rootWindow;
324
- const {
325
- top,
326
- left
327
- } = frameElement.getBoundingClientRect();
328
- offsetTop = top;
329
- offsetLeft = left;
330
- }
385
+ if ((0, _element.hasClass)(event.target, BUTTON_CLASS_NAME)) {
386
+ const offset = (0, _utils.getDocumentOffsetByElement)(this.menu.container, this.hot.rootDocument);
331
387
  const rect = event.target.getBoundingClientRect();
332
388
  this.open({
333
- left: rect.left + offsetLeft,
334
- top: rect.top + event.target.offsetHeight + 3 + offsetTop,
335
- width: rect.width,
336
- height: rect.height
389
+ left: rect.left + offset.left,
390
+ top: rect.top + event.target.offsetHeight + 3 + offset.top
391
+ }, {
392
+ left: rect.width
337
393
  });
338
394
  }
339
395
  }
@@ -372,6 +428,7 @@ class DropdownMenu extends _base.BasePlugin {
372
428
  const button = this.hot.rootDocument.createElement('button');
373
429
  button.className = BUTTON_CLASS_NAME;
374
430
  button.type = 'button';
431
+ button.tabIndex = -1;
375
432
 
376
433
  // prevent page reload on button click
377
434
  button.onclick = function () {
@@ -1,6 +1,8 @@
1
1
  import { BasePlugin } from "../base/index.mjs";
2
2
  import { arrayEach } from "../../helpers/array.mjs";
3
+ import { objectEach } from "../../helpers/object.mjs";
3
4
  import CommandExecutor from "../contextMenu/commandExecutor.mjs";
5
+ import { getDocumentOffsetByElement } from "../contextMenu/utils.mjs";
4
6
  import EventManager from "../../eventManager.mjs";
5
7
  import { hasClass } from "../../helpers/dom/element.mjs";
6
8
  import ItemsFactory from "../contextMenu/itemsFactory.mjs";
@@ -15,6 +17,7 @@ Hooks.getSingleton().register('afterDropdownMenuExecute');
15
17
  export const PLUGIN_KEY = 'dropdownMenu';
16
18
  export const PLUGIN_PRIORITY = 230;
17
19
  const BUTTON_CLASS_NAME = 'changeType';
20
+ const SHORTCUTS_GROUP = PLUGIN_KEY;
18
21
 
19
22
  /* eslint-disable jsdoc/require-description-complete-sentence */
20
23
  /**
@@ -151,6 +154,7 @@ export class DropdownMenu extends BasePlugin {
151
154
  if (typeof settings.callback === 'function') {
152
155
  this.commandExecutor.setCommonCallback(settings.callback);
153
156
  }
157
+ this.registerShortcuts();
154
158
  super.enablePlugin();
155
159
  this.callOnPluginsReady(() => {
156
160
  this.hot.runHooks('afterDropdownMenuDefaultOptions', predefinedItems);
@@ -201,9 +205,68 @@ export class DropdownMenu extends BasePlugin {
201
205
  if (this.menu) {
202
206
  this.menu.destroy();
203
207
  }
208
+ this.unregisterShortcuts();
204
209
  super.disablePlugin();
205
210
  }
206
211
 
212
+ /**
213
+ * Register shortcuts responsible for toggling dropdown menu.
214
+ *
215
+ * @private
216
+ */
217
+ registerShortcuts() {
218
+ const context = this.hot.getShortcutManager().getContext('grid');
219
+ const callback = () => {
220
+ const {
221
+ highlight
222
+ } = this.hot.getSelectedRangeLast();
223
+ if ((highlight.isHeader() && highlight.row === -1 || highlight.isCell()) && highlight.col >= 0) {
224
+ this.hot.selectColumns(highlight.col, highlight.col, -1);
225
+ const {
226
+ from
227
+ } = this.hot.getSelectedRangeLast();
228
+ const offset = getDocumentOffsetByElement(this.menu.container, this.hot.rootDocument);
229
+ const target = this.hot.getCell(-1, from.col, true);
230
+ const rect = target.getBoundingClientRect();
231
+ this.open({
232
+ left: rect.left + offset.left,
233
+ top: rect.top + target.offsetHeight + offset.top
234
+ }, {
235
+ left: rect.width
236
+ });
237
+ this.hot._registerTimeout(() => {
238
+ this.menu.selectFirstCell();
239
+ });
240
+ }
241
+ };
242
+ context.addShortcuts([{
243
+ keys: [['Shift', 'Alt', 'ArrowDown'], ['Shift', 'Enter']],
244
+ callback,
245
+ runOnlyIf: () => {
246
+ var _this$hot$getSelected;
247
+ return ((_this$hot$getSelected = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected === void 0 ? void 0 : _this$hot$getSelected.highlight.isHeader()) && !this.menu.isOpened();
248
+ },
249
+ group: SHORTCUTS_GROUP
250
+ }, {
251
+ keys: [['Shift', 'Alt', 'ArrowDown']],
252
+ callback,
253
+ runOnlyIf: () => {
254
+ var _this$hot$getSelected2;
255
+ return ((_this$hot$getSelected2 = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected2 === void 0 ? void 0 : _this$hot$getSelected2.highlight.isCell()) && !this.menu.isOpened();
256
+ },
257
+ group: SHORTCUTS_GROUP
258
+ }]);
259
+ }
260
+
261
+ /**
262
+ * Unregister shortcuts responsible for toggling dropdown menu.
263
+ *
264
+ * @private
265
+ */
266
+ unregisterShortcuts() {
267
+ this.hot.getShortcutManager().getContext('grid').removeShortcutsByGroup(SHORTCUTS_GROUP);
268
+ }
269
+
207
270
  /**
208
271
  * Registers the DOM listeners.
209
272
  *
@@ -216,23 +279,30 @@ export class DropdownMenu extends BasePlugin {
216
279
  /**
217
280
  * Opens menu and re-position it based on the passed coordinates.
218
281
  *
219
- * @param {object|Event} position An object with `pageX` and `pageY` properties which contains values relative to
220
- * the top left of the fully rendered content area in the browser or with `clientX`
221
- * and `clientY` properties which contains values relative to the upper left edge
222
- * of the content area (the viewport) of the browser window. This object is structurally
223
- * compatible with native mouse event so it can be used either.
282
+ * @param {{ top: number, left: number }|Event} position An object with `top` and `left` properties
283
+ * which contains coordinates relative to the browsers viewport (without included scroll offsets).
284
+ * Or if the native event is passed the menu will be positioned based on the `pageX` and `pageY`
285
+ * coordinates.
286
+ * @param {{ above: number, below: number, left: number, right: number }} offset An object allows applying
287
+ * the offset to the menu position.
224
288
  * @fires Hooks#beforeDropdownMenuShow
225
289
  * @fires Hooks#afterDropdownMenuShow
226
290
  */
227
-
228
291
  open(position) {
229
- if (!this.menu) {
292
+ var _this$menu;
293
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
294
+ above: 0,
295
+ below: 0,
296
+ left: 0,
297
+ right: 0
298
+ };
299
+ if ((_this$menu = this.menu) !== null && _this$menu !== void 0 && _this$menu.isOpened()) {
230
300
  return;
231
301
  }
232
302
  this.menu.open();
233
- if (position.width) {
234
- this.menu.setOffset('left', position.width);
235
- }
303
+ objectEach(offset, (value, key) => {
304
+ this.menu.setOffset(key, value);
305
+ });
236
306
  this.menu.setPosition(position);
237
307
  }
238
308
 
@@ -240,10 +310,8 @@ export class DropdownMenu extends BasePlugin {
240
310
  * Closes dropdown menu.
241
311
  */
242
312
  close() {
243
- if (!this.menu) {
244
- return;
245
- }
246
- this.menu.close();
313
+ var _this$menu2;
314
+ (_this$menu2 = this.menu) === null || _this$menu2 === void 0 ? void 0 : _this$menu2.close();
247
315
  }
248
316
 
249
317
  /**
@@ -308,26 +376,14 @@ export class DropdownMenu extends BasePlugin {
308
376
  */
309
377
  onTableClick(event) {
310
378
  event.stopPropagation();
311
- if (hasClass(event.target, BUTTON_CLASS_NAME) && !this.menu.isOpened()) {
312
- let offsetTop = 0;
313
- let offsetLeft = 0;
314
- if (this.hot.rootDocument !== this.menu.container.ownerDocument) {
315
- const {
316
- frameElement
317
- } = this.hot.rootWindow;
318
- const {
319
- top,
320
- left
321
- } = frameElement.getBoundingClientRect();
322
- offsetTop = top;
323
- offsetLeft = left;
324
- }
379
+ if (hasClass(event.target, BUTTON_CLASS_NAME)) {
380
+ const offset = getDocumentOffsetByElement(this.menu.container, this.hot.rootDocument);
325
381
  const rect = event.target.getBoundingClientRect();
326
382
  this.open({
327
- left: rect.left + offsetLeft,
328
- top: rect.top + event.target.offsetHeight + 3 + offsetTop,
329
- width: rect.width,
330
- height: rect.height
383
+ left: rect.left + offset.left,
384
+ top: rect.top + event.target.offsetHeight + 3 + offset.top
385
+ }, {
386
+ left: rect.width
331
387
  });
332
388
  }
333
389
  }
@@ -366,6 +422,7 @@ export class DropdownMenu extends BasePlugin {
366
422
  const button = this.hot.rootDocument.createElement('button');
367
423
  button.className = BUTTON_CLASS_NAME;
368
424
  button.type = 'button';
425
+ button.tabIndex = -1;
369
426
 
370
427
  // prevent page reload on button click
371
428
  button.onclick = function () {