handsontable 0.0.0-next-b66c79f-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 (373) hide show
  1. package/3rdparty/walkontable/src/cell/coords.d.ts +6 -1
  2. package/3rdparty/walkontable/src/cell/coords.js +87 -33
  3. package/3rdparty/walkontable/src/cell/coords.mjs +87 -33
  4. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  5. package/3rdparty/walkontable/src/cell/range.js +92 -46
  6. package/3rdparty/walkontable/src/cell/range.mjs +92 -46
  7. package/3rdparty/walkontable/src/core/_base.js +41 -33
  8. package/3rdparty/walkontable/src/core/_base.mjs +41 -33
  9. package/3rdparty/walkontable/src/core/clone.js +8 -5
  10. package/3rdparty/walkontable/src/core/clone.mjs +8 -5
  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 +9 -8
  14. package/3rdparty/walkontable/src/event.mjs +9 -8
  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 +11 -9
  20. package/3rdparty/walkontable/src/overlay/_base.mjs +11 -9
  21. package/3rdparty/walkontable/src/overlay/bottom.js +10 -8
  22. package/3rdparty/walkontable/src/overlay/bottom.mjs +10 -8
  23. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
  24. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
  25. package/3rdparty/walkontable/src/overlay/top.js +12 -14
  26. package/3rdparty/walkontable/src/overlay/top.mjs +12 -14
  27. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.js +16 -13
  28. package/3rdparty/walkontable/src/overlay/topInlineStartCorner.mjs +16 -13
  29. package/3rdparty/walkontable/src/overlays.js +75 -80
  30. package/3rdparty/walkontable/src/overlays.mjs +75 -80
  31. package/3rdparty/walkontable/src/scroll.js +27 -24
  32. package/3rdparty/walkontable/src/scroll.mjs +27 -24
  33. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +7 -12
  34. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  35. package/3rdparty/walkontable/src/selection/border/constants.js +16 -0
  36. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  37. package/3rdparty/walkontable/src/selection/constants.js +62 -0
  38. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  39. package/3rdparty/walkontable/src/selection/index.js +26 -0
  40. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  41. package/3rdparty/walkontable/src/selection/manager.js +259 -0
  42. package/3rdparty/walkontable/src/selection/manager.mjs +254 -0
  43. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  44. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  45. package/3rdparty/walkontable/src/selection/selection.js +101 -0
  46. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  47. package/3rdparty/walkontable/src/settings.js +18 -17
  48. package/3rdparty/walkontable/src/settings.mjs +18 -17
  49. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
  50. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  51. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
  52. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  53. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
  54. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  55. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
  56. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  57. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
  58. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  59. package/3rdparty/walkontable/src/table.js +48 -115
  60. package/3rdparty/walkontable/src/table.mjs +49 -116
  61. package/base.js +2 -2
  62. package/base.mjs +2 -2
  63. package/core/focusCatcher/focusDetector.js +58 -0
  64. package/core/focusCatcher/focusDetector.mjs +54 -0
  65. package/core/focusCatcher/index.js +142 -0
  66. package/core/focusCatcher/index.mjs +138 -0
  67. package/core/index.js +9 -0
  68. package/core/index.mjs +1 -0
  69. package/core.d.ts +6 -3
  70. package/core.js +181 -298
  71. package/core.mjs +181 -298
  72. package/dataMap/metaManager/metaLayers/cellMeta.js +2 -1
  73. package/dataMap/metaManager/metaLayers/cellMeta.mjs +2 -1
  74. package/dataMap/metaManager/metaLayers/globalMeta.js +1 -1
  75. package/dataMap/metaManager/metaLayers/globalMeta.mjs +1 -1
  76. package/dataMap/metaManager/metaSchema.js +41 -0
  77. package/dataMap/metaManager/metaSchema.mjs +41 -0
  78. package/dataMap/metaManager/mods/dynamicCellMeta.js +3 -2
  79. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +3 -2
  80. package/dataMap/metaManager/utils.js +4 -2
  81. package/dataMap/metaManager/utils.mjs +4 -2
  82. package/dist/handsontable.css +19 -3
  83. package/dist/handsontable.full.css +19 -3
  84. package/dist/handsontable.full.js +10739 -7037
  85. package/dist/handsontable.full.min.css +3 -3
  86. package/dist/handsontable.full.min.js +25 -25
  87. package/dist/handsontable.js +24884 -21182
  88. package/dist/handsontable.min.css +3 -3
  89. package/dist/handsontable.min.js +19 -19
  90. package/editorManager.js +11 -75
  91. package/editorManager.mjs +11 -74
  92. package/editors/autocompleteEditor/autocompleteEditor.js +70 -67
  93. package/editors/autocompleteEditor/autocompleteEditor.mjs +70 -67
  94. package/editors/baseEditor/baseEditor.js +1 -1
  95. package/editors/baseEditor/baseEditor.mjs +1 -1
  96. package/editors/dateEditor/dateEditor.js +2 -1
  97. package/editors/dateEditor/dateEditor.mjs +2 -1
  98. package/editors/textEditor/textEditor.js +3 -11
  99. package/editors/textEditor/textEditor.mjs +4 -12
  100. package/helpers/mixed.js +1 -1
  101. package/helpers/mixed.mjs +1 -1
  102. package/helpers/number.d.ts +1 -0
  103. package/helpers/number.js +18 -0
  104. package/helpers/number.mjs +17 -0
  105. package/helpers/object.js +1 -0
  106. package/helpers/object.mjs +1 -0
  107. package/index.js +5 -5
  108. package/index.mjs +5 -5
  109. package/package.json +1 -1
  110. package/pluginHooks.d.ts +7 -1
  111. package/pluginHooks.js +106 -1
  112. package/pluginHooks.mjs +106 -1
  113. package/plugins/autoColumnSize/autoColumnSize.js +4 -1
  114. package/plugins/autoColumnSize/autoColumnSize.mjs +4 -1
  115. package/plugins/collapsibleColumns/collapsibleColumns.js +110 -40
  116. package/plugins/collapsibleColumns/collapsibleColumns.mjs +110 -40
  117. package/plugins/columnSorting/columnSorting.js +40 -1
  118. package/plugins/columnSorting/columnSorting.mjs +40 -3
  119. package/plugins/columnSorting/columnStatesManager.js +2 -1
  120. package/plugins/columnSorting/columnStatesManager.mjs +2 -1
  121. package/plugins/columnSorting/index.js +3 -1
  122. package/plugins/columnSorting/index.mjs +1 -1
  123. package/plugins/comments/commentEditor.js +1 -0
  124. package/plugins/comments/commentEditor.mjs +1 -0
  125. package/plugins/comments/comments.js +253 -191
  126. package/plugins/comments/comments.mjs +252 -192
  127. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  128. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  129. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  130. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  131. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  132. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  133. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  134. package/plugins/contextMenu/contextMenu.js +72 -30
  135. package/plugins/contextMenu/contextMenu.mjs +73 -31
  136. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  137. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  138. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  139. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  140. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  141. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  142. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  143. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  144. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  145. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  146. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  147. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  148. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  149. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  150. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  151. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  152. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  153. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  154. package/plugins/contextMenu/utils.js +28 -16
  155. package/plugins/contextMenu/utils.mjs +27 -15
  156. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  157. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  158. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  159. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  160. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  161. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  162. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  163. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  164. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  165. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  166. package/plugins/copyPaste/copyPaste.js +12 -6
  167. package/plugins/copyPaste/copyPaste.mjs +12 -6
  168. package/plugins/customBorders/customBorders.js +36 -29
  169. package/plugins/customBorders/customBorders.mjs +37 -30
  170. package/plugins/customBorders/utils.js +3 -3
  171. package/plugins/customBorders/utils.mjs +3 -3
  172. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  173. package/plugins/dropdownMenu/dropdownMenu.js +89 -32
  174. package/plugins/dropdownMenu/dropdownMenu.mjs +89 -32
  175. package/plugins/filters/conditionCollection.js +6 -5
  176. package/plugins/filters/conditionCollection.mjs +6 -5
  177. package/plugins/filters/filters.js +44 -21
  178. package/plugins/filters/filters.mjs +43 -20
  179. package/plugins/formulas/engine/register.js +3 -3
  180. package/plugins/formulas/engine/register.mjs +3 -3
  181. package/plugins/formulas/engine/settings.js +6 -3
  182. package/plugins/formulas/engine/settings.mjs +6 -3
  183. package/plugins/formulas/formulas.js +151 -143
  184. package/plugins/formulas/formulas.mjs +151 -143
  185. package/plugins/formulas/indexSyncer/axisSyncer.js +115 -79
  186. package/plugins/formulas/indexSyncer/axisSyncer.mjs +115 -79
  187. package/plugins/formulas/indexSyncer/index.js +100 -64
  188. package/plugins/formulas/indexSyncer/index.mjs +100 -64
  189. package/plugins/hiddenColumns/contextMenuItem/showColumn.js +2 -2
  190. package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +2 -2
  191. package/plugins/hiddenColumns/hiddenColumns.js +51 -34
  192. package/plugins/hiddenColumns/hiddenColumns.mjs +51 -34
  193. package/plugins/hiddenRows/contextMenuItem/showRow.js +2 -2
  194. package/plugins/hiddenRows/contextMenuItem/showRow.mjs +2 -2
  195. package/plugins/hiddenRows/hiddenRows.js +50 -33
  196. package/plugins/hiddenRows/hiddenRows.mjs +50 -33
  197. package/plugins/manualRowResize/manualRowResize.js +2 -1
  198. package/plugins/manualRowResize/manualRowResize.mjs +2 -1
  199. package/plugins/mergeCells/mergeCells.js +6 -17
  200. package/plugins/mergeCells/mergeCells.mjs +6 -17
  201. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  202. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  203. package/plugins/nestedHeaders/nestedHeaders.js +209 -75
  204. package/plugins/nestedHeaders/nestedHeaders.mjs +208 -74
  205. package/plugins/nestedHeaders/stateManager/headersTree.js +58 -38
  206. package/plugins/nestedHeaders/stateManager/headersTree.mjs +58 -38
  207. package/plugins/nestedHeaders/stateManager/index.js +107 -49
  208. package/plugins/nestedHeaders/stateManager/index.mjs +105 -47
  209. package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.js +1 -1
  210. package/plugins/nestedHeaders/stateManager/nodeModifiers/collapse.mjs +1 -1
  211. package/plugins/nestedHeaders/stateManager/sourceSettings.js +57 -37
  212. package/plugins/nestedHeaders/stateManager/sourceSettings.mjs +57 -37
  213. package/plugins/nestedHeaders/utils/ghostTable.js +39 -35
  214. package/plugins/nestedHeaders/utils/ghostTable.mjs +39 -35
  215. package/plugins/nestedRows/data/dataManager.js +4 -2
  216. package/plugins/nestedRows/data/dataManager.mjs +4 -2
  217. package/plugins/nestedRows/nestedRows.js +41 -0
  218. package/plugins/nestedRows/nestedRows.mjs +41 -0
  219. package/plugins/persistentState/storage.js +1 -0
  220. package/plugins/persistentState/storage.mjs +1 -0
  221. package/plugins/undoRedo/undoRedo.js +2 -1
  222. package/plugins/undoRedo/undoRedo.mjs +2 -1
  223. package/renderers/checkboxRenderer/checkboxRenderer.js +2 -2
  224. package/renderers/checkboxRenderer/checkboxRenderer.mjs +1 -1
  225. package/selection/highlight/highlight.js +256 -71
  226. package/selection/highlight/highlight.mjs +250 -71
  227. package/selection/highlight/types/activeHeader.js +10 -8
  228. package/selection/highlight/types/activeHeader.mjs +10 -8
  229. package/selection/highlight/types/area.js +6 -18
  230. package/selection/highlight/types/area.mjs +6 -18
  231. package/selection/highlight/types/areaLayered.js +31 -0
  232. package/selection/highlight/types/areaLayered.mjs +26 -0
  233. package/selection/highlight/types/column.js +27 -0
  234. package/selection/highlight/types/column.mjs +22 -0
  235. package/selection/highlight/types/customSelection.js +7 -9
  236. package/selection/highlight/types/customSelection.mjs +7 -9
  237. package/selection/highlight/types/fill.js +5 -7
  238. package/selection/highlight/types/fill.mjs +5 -7
  239. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  240. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  241. package/selection/highlight/types/header.js +9 -18
  242. package/selection/highlight/types/header.mjs +9 -18
  243. package/selection/highlight/types/row.js +27 -0
  244. package/selection/highlight/types/row.mjs +22 -0
  245. package/selection/highlight/visualSelection.js +41 -33
  246. package/selection/highlight/visualSelection.mjs +41 -33
  247. package/selection/index.js +4 -7
  248. package/selection/index.mjs +2 -3
  249. package/selection/mouseEventHandler.js +1 -1
  250. package/selection/mouseEventHandler.mjs +1 -1
  251. package/selection/range.js +8 -8
  252. package/selection/range.mjs +8 -8
  253. package/selection/selection.js +290 -154
  254. package/selection/selection.mjs +287 -153
  255. package/selection/transformation.js +232 -90
  256. package/selection/transformation.mjs +232 -90
  257. package/selection/utils.js +15 -21
  258. package/selection/utils.mjs +16 -21
  259. package/settings.d.ts +2 -0
  260. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  261. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  262. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  263. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  264. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  265. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  266. package/shortcutContexts/commands/editor/index.js +16 -0
  267. package/shortcutContexts/commands/editor/index.mjs +12 -0
  268. package/shortcutContexts/commands/editor/open.js +27 -0
  269. package/shortcutContexts/commands/editor/open.mjs +23 -0
  270. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  271. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  272. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  273. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  274. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +21 -0
  275. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +17 -0
  276. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  277. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  278. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  279. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  280. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  281. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  282. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  283. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  284. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  285. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  286. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  287. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  288. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  289. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  290. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  291. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  292. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  293. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  294. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  295. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  296. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  297. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  298. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  299. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  300. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +21 -0
  301. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +17 -0
  302. package/shortcutContexts/commands/index.js +35 -0
  303. package/shortcutContexts/commands/index.mjs +31 -0
  304. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  305. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  306. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +31 -0
  307. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +27 -0
  308. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  309. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  310. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  311. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  312. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  313. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  314. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  315. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  316. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  317. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  318. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  319. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  320. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  321. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  322. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  323. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  324. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  325. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  326. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  327. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  328. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  329. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  330. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  331. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  332. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  333. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  334. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  335. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  336. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +31 -0
  337. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +27 -0
  338. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  339. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  340. package/shortcutContexts/commands/scrollToFocusedCell.js +36 -0
  341. package/shortcutContexts/commands/scrollToFocusedCell.mjs +32 -0
  342. package/shortcutContexts/commands/selectAll.js +10 -0
  343. package/shortcutContexts/commands/selectAll.mjs +6 -0
  344. package/shortcutContexts/constants.js +13 -0
  345. package/shortcutContexts/constants.mjs +8 -0
  346. package/shortcutContexts/editor.js +25 -0
  347. package/shortcutContexts/editor.mjs +21 -0
  348. package/shortcutContexts/grid.js +163 -0
  349. package/shortcutContexts/grid.mjs +159 -0
  350. package/shortcutContexts/index.js +24 -0
  351. package/shortcutContexts/index.mjs +11 -0
  352. package/shortcuts/manager.js +2 -0
  353. package/shortcuts/manager.mjs +2 -0
  354. package/shortcuts/recorder.js +2 -2
  355. package/shortcuts/recorder.mjs +2 -2
  356. package/shortcuts/utils.js +19 -5
  357. package/shortcuts/utils.mjs +18 -4
  358. package/tableView.js +163 -91
  359. package/tableView.mjs +163 -91
  360. package/translations/changesObservable/observable.js +82 -54
  361. package/translations/changesObservable/observable.mjs +82 -54
  362. package/translations/changesObservable/observer.js +24 -11
  363. package/translations/changesObservable/observer.mjs +24 -11
  364. package/translations/maps/linkedPhysicalIndexToValueMap.js +14 -8
  365. package/translations/maps/linkedPhysicalIndexToValueMap.mjs +14 -8
  366. package/utils/dataStructures/tree.js +21 -18
  367. package/utils/dataStructures/tree.mjs +21 -18
  368. package/3rdparty/walkontable/src/selection.js +0 -295
  369. package/3rdparty/walkontable/src/selection.mjs +0 -290
  370. package/selection/highlight/constants.js +0 -15
  371. package/selection/highlight/constants.mjs +0 -6
  372. package/selection/highlight/types/index.js +0 -35
  373. package/selection/highlight/types/index.mjs +0 -31
@@ -259,13 +259,13 @@ class CopyPaste extends _base.BasePlugin {
259
259
  } = this.hot.getSettings();
260
260
  if (typeof settings === 'object') {
261
261
  var _settings$pasteMode, _settings$uiContainer;
262
- this.pasteMode = (_settings$pasteMode = settings.pasteMode) != null ? _settings$pasteMode : this.pasteMode;
262
+ this.pasteMode = (_settings$pasteMode = settings.pasteMode) !== null && _settings$pasteMode !== void 0 ? _settings$pasteMode : this.pasteMode;
263
263
  this.rowsLimit = isNaN(settings.rowsLimit) ? this.rowsLimit : settings.rowsLimit;
264
264
  this.columnsLimit = isNaN(settings.columnsLimit) ? this.columnsLimit : settings.columnsLimit;
265
265
  _classPrivateFieldSet(this, _enableCopyColumnHeaders, !!settings.copyColumnHeaders);
266
266
  _classPrivateFieldSet(this, _enableCopyColumnGroupHeaders, !!settings.copyColumnGroupHeaders);
267
267
  _classPrivateFieldSet(this, _enableCopyColumnHeadersOnly, !!settings.copyColumnHeadersOnly);
268
- this.uiContainer = (_settings$uiContainer = settings.uiContainer) != null ? _settings$uiContainer : this.uiContainer;
268
+ this.uiContainer = (_settings$uiContainer = settings.uiContainer) !== null && _settings$uiContainer !== void 0 ? _settings$uiContainer : this.uiContainer;
269
269
  }
270
270
  this.addHook('afterContextMenuDefaultOptions', options => this.onAfterContextMenuDefaultOptions(options));
271
271
  this.addHook('afterOnCellMouseUp', () => this.onAfterOnCellMouseUp());
@@ -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') {
@@ -476,7 +480,8 @@ class CopyPaste extends _base.BasePlugin {
476
480
  * @private
477
481
  */
478
482
  getOrCreateFocusableElement() {
479
- const editableElement = this.hot.getActiveEditor()?.TEXTAREA;
483
+ var _this$hot$getActiveEd;
484
+ const editableElement = (_this$hot$getActiveEd = this.hot.getActiveEditor()) === null || _this$hot$getActiveEd === void 0 ? void 0 : _this$hot$getActiveEd.TEXTAREA;
480
485
  if (editableElement) {
481
486
  this.focusableElement.setFocusableElement(editableElement);
482
487
  } else {
@@ -491,7 +496,8 @@ class CopyPaste extends _base.BasePlugin {
491
496
  * @returns {boolean}
492
497
  */
493
498
  isEditorOpened() {
494
- return this.hot.getActiveEditor()?.isOpened();
499
+ var _this$hot$getActiveEd2;
500
+ return (_this$hot$getActiveEd2 = this.hot.getActiveEditor()) === null || _this$hot$getActiveEd2 === void 0 ? void 0 : _this$hot$getActiveEd2.isOpened();
495
501
  }
496
502
  /**
497
503
  * Prepares new values to populate them into datasource.
@@ -625,7 +631,7 @@ class CopyPaste extends _base.BasePlugin {
625
631
  * @private
626
632
  */
627
633
  onPaste(event) {
628
- if (!this.hot.isListening() || this.isEditorOpened()) {
634
+ if (!this.hot.isListening() || this.isEditorOpened() || !this.hot.getSelected()) {
629
635
  return;
630
636
  }
631
637
  if (event && event.preventDefault) {
@@ -650,7 +656,7 @@ class CopyPaste extends _base.BasePlugin {
650
656
  if (typeof pastedData === 'string') {
651
657
  pastedData = (0, _SheetClip.parse)(pastedData);
652
658
  }
653
- if (pastedData && pastedData.length === 0) {
659
+ if (pastedData === void 0 || pastedData && pastedData.length === 0) {
654
660
  return;
655
661
  }
656
662
  if (this.hot.runHooks('beforePaste', pastedData, this.copyableRanges) === false) {
@@ -253,13 +253,13 @@ export class CopyPaste extends BasePlugin {
253
253
  } = this.hot.getSettings();
254
254
  if (typeof settings === 'object') {
255
255
  var _settings$pasteMode, _settings$uiContainer;
256
- this.pasteMode = (_settings$pasteMode = settings.pasteMode) != null ? _settings$pasteMode : this.pasteMode;
256
+ this.pasteMode = (_settings$pasteMode = settings.pasteMode) !== null && _settings$pasteMode !== void 0 ? _settings$pasteMode : this.pasteMode;
257
257
  this.rowsLimit = isNaN(settings.rowsLimit) ? this.rowsLimit : settings.rowsLimit;
258
258
  this.columnsLimit = isNaN(settings.columnsLimit) ? this.columnsLimit : settings.columnsLimit;
259
259
  _classPrivateFieldSet(this, _enableCopyColumnHeaders, !!settings.copyColumnHeaders);
260
260
  _classPrivateFieldSet(this, _enableCopyColumnGroupHeaders, !!settings.copyColumnGroupHeaders);
261
261
  _classPrivateFieldSet(this, _enableCopyColumnHeadersOnly, !!settings.copyColumnHeadersOnly);
262
- this.uiContainer = (_settings$uiContainer = settings.uiContainer) != null ? _settings$uiContainer : this.uiContainer;
262
+ this.uiContainer = (_settings$uiContainer = settings.uiContainer) !== null && _settings$uiContainer !== void 0 ? _settings$uiContainer : this.uiContainer;
263
263
  }
264
264
  this.addHook('afterContextMenuDefaultOptions', options => this.onAfterContextMenuDefaultOptions(options));
265
265
  this.addHook('afterOnCellMouseUp', () => this.onAfterOnCellMouseUp());
@@ -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') {
@@ -470,7 +474,8 @@ export class CopyPaste extends BasePlugin {
470
474
  * @private
471
475
  */
472
476
  getOrCreateFocusableElement() {
473
- const editableElement = this.hot.getActiveEditor()?.TEXTAREA;
477
+ var _this$hot$getActiveEd;
478
+ const editableElement = (_this$hot$getActiveEd = this.hot.getActiveEditor()) === null || _this$hot$getActiveEd === void 0 ? void 0 : _this$hot$getActiveEd.TEXTAREA;
474
479
  if (editableElement) {
475
480
  this.focusableElement.setFocusableElement(editableElement);
476
481
  } else {
@@ -485,7 +490,8 @@ export class CopyPaste extends BasePlugin {
485
490
  * @returns {boolean}
486
491
  */
487
492
  isEditorOpened() {
488
- return this.hot.getActiveEditor()?.isOpened();
493
+ var _this$hot$getActiveEd2;
494
+ return (_this$hot$getActiveEd2 = this.hot.getActiveEditor()) === null || _this$hot$getActiveEd2 === void 0 ? void 0 : _this$hot$getActiveEd2.isOpened();
489
495
  }
490
496
  /**
491
497
  * Prepares new values to populate them into datasource.
@@ -619,7 +625,7 @@ export class CopyPaste extends BasePlugin {
619
625
  * @private
620
626
  */
621
627
  onPaste(event) {
622
- if (!this.hot.isListening() || this.isEditorOpened()) {
628
+ if (!this.hot.isListening() || this.isEditorOpened() || !this.hot.getSelected()) {
623
629
  return;
624
630
  }
625
631
  if (event && event.preventDefault) {
@@ -644,7 +650,7 @@ export class CopyPaste extends BasePlugin {
644
650
  if (typeof pastedData === 'string') {
645
651
  pastedData = parse(pastedData);
646
652
  }
647
- if (pastedData && pastedData.length === 0) {
653
+ if (pastedData === void 0 || pastedData && pastedData.length === 0) {
648
654
  return;
649
655
  }
650
656
  if (this.hot.runHooks('beforePaste', pastedData, this.copyableRanges) === false) {
@@ -13,6 +13,9 @@ var _utils = require("./utils");
13
13
  var _selection = require("../../selection");
14
14
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
15
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
16
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
18
+ 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); }
16
19
  const PLUGIN_KEY = 'customBorders';
17
20
  exports.PLUGIN_KEY = PLUGIN_KEY;
18
21
  const PLUGIN_PRIORITY = 90;
@@ -74,21 +77,22 @@ const PLUGIN_PRIORITY = 90;
74
77
  */
75
78
  exports.PLUGIN_PRIORITY = PLUGIN_PRIORITY;
76
79
  class CustomBorders extends _base.BasePlugin {
80
+ constructor() {
81
+ super(...arguments);
82
+ /**
83
+ * Saved borders.
84
+ *
85
+ * @private
86
+ * @type {Array}
87
+ */
88
+ _defineProperty(this, "savedBorders", []);
89
+ }
77
90
  static get PLUGIN_KEY() {
78
91
  return PLUGIN_KEY;
79
92
  }
80
93
  static get PLUGIN_PRIORITY() {
81
94
  return PLUGIN_PRIORITY;
82
95
  }
83
-
84
- /**
85
- * Saved borders.
86
- *
87
- * @private
88
- * @type {Array}
89
- */
90
- savedBorders = [];
91
-
92
96
  /**
93
97
  * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit}
94
98
  * hook and if it returns `true` then the {@link CustomBorders#enablePlugin} method is called.
@@ -163,14 +167,11 @@ class CustomBorders extends _base.BasePlugin {
163
167
  const selectionType = (0, _selection.detectSelectionType)(selectionRanges);
164
168
  const selectionSchemaNormalizer = (0, _selection.normalizeSelectionFactory)(selectionType);
165
169
  (0, _array.arrayEach)(selectionRanges, selection => {
166
- const [rowStart, columnStart, rowEnd, columnEnd] = selectionSchemaNormalizer(selection);
167
- for (let row = rowStart; row <= rowEnd; row += 1) {
168
- for (let col = columnStart; col <= columnEnd; col += 1) {
169
- (0, _array.arrayEach)(borderKeys, borderKey => {
170
- this.prepareBorderFromCustomAdded(row, col, normBorder, (0, _utils.toInlinePropName)(borderKey));
171
- });
172
- }
173
- }
170
+ selectionSchemaNormalizer(selection).forAll((row, col) => {
171
+ (0, _array.arrayEach)(borderKeys, borderKey => {
172
+ this.prepareBorderFromCustomAdded(row, col, normBorder, (0, _utils.toInlinePropName)(borderKey));
173
+ });
174
+ });
174
175
  });
175
176
 
176
177
  /*
@@ -210,16 +211,13 @@ class CustomBorders extends _base.BasePlugin {
210
211
  const selectionSchemaNormalizer = (0, _selection.normalizeSelectionFactory)(selectionType);
211
212
  const selectedBorders = [];
212
213
  (0, _array.arrayEach)(selectionRanges, selection => {
213
- const [rowStart, columnStart, rowEnd, columnEnd] = selectionSchemaNormalizer(selection);
214
- for (let row = rowStart; row <= rowEnd; row += 1) {
215
- for (let col = columnStart; col <= columnEnd; col += 1) {
216
- (0, _array.arrayEach)(this.savedBorders, border => {
217
- if (border.row === row && border.col === col) {
218
- selectedBorders.push((0, _utils.denormalizeBorder)(border));
219
- }
220
- });
221
- }
222
- }
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
+ });
223
221
  });
224
222
  return selectedBorders;
225
223
  }
@@ -610,7 +608,8 @@ class CustomBorders extends _base.BasePlugin {
610
608
  let check = false;
611
609
  (0, _array.arrayEach)(this.hot.selection.highlight.customSelections, customSelection => {
612
610
  if (border.id === customSelection.settings.id) {
613
- (0, _object.objectEach)(customSelection.instanceBorders, borderObject => {
611
+ const borders = this.hot.view._wt.selectionManager.getBorderInstances(customSelection);
612
+ (0, _array.arrayEach)(borders, borderObject => {
614
613
  borderObject.toggleHiddenClass(place, remove); // TODO this also bad?
615
614
  });
616
615
 
@@ -644,7 +643,8 @@ class CustomBorders extends _base.BasePlugin {
644
643
  customSelection.visualCellRange = cellRange;
645
644
  customSelection.commit();
646
645
  if (place) {
647
- (0, _object.objectEach)(customSelection.instanceBorders, borderObject => {
646
+ const borders = this.hot.view._wt.selectionManager.getBorderInstances(customSelection);
647
+ (0, _array.arrayEach)(borders, borderObject => {
648
648
  borderObject.changeBorderStyle(place, border);
649
649
  });
650
650
  }
@@ -712,6 +712,13 @@ class CustomBorders extends _base.BasePlugin {
712
712
  return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);
713
713
  },
714
714
  disabled() {
715
+ const range = this.getSelectedRangeLast();
716
+ if (!range) {
717
+ return true;
718
+ }
719
+ if (range.isSingleHeader()) {
720
+ return true;
721
+ }
715
722
  return this.selection.isSelectedByCorner();
716
723
  },
717
724
  submenu: {
@@ -1,7 +1,10 @@
1
1
  import "core-js/modules/es.array.push.js";
2
2
  import "core-js/modules/es.error.cause.js";
3
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
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); }
3
6
  import { BasePlugin } from "../base/index.mjs";
4
- import { hasOwnProperty, objectEach, deepClone } from "../../helpers/object.mjs";
7
+ import { hasOwnProperty, deepClone } from "../../helpers/object.mjs";
5
8
  import { rangeEach } from "../../helpers/number.mjs";
6
9
  import { arrayEach, arrayReduce, arrayMap } from "../../helpers/array.mjs";
7
10
  import * as C from "../../i18n/constants.mjs";
@@ -67,21 +70,22 @@ export const PLUGIN_PRIORITY = 90;
67
70
  * ```
68
71
  */
69
72
  export class CustomBorders extends BasePlugin {
73
+ constructor() {
74
+ super(...arguments);
75
+ /**
76
+ * Saved borders.
77
+ *
78
+ * @private
79
+ * @type {Array}
80
+ */
81
+ _defineProperty(this, "savedBorders", []);
82
+ }
70
83
  static get PLUGIN_KEY() {
71
84
  return PLUGIN_KEY;
72
85
  }
73
86
  static get PLUGIN_PRIORITY() {
74
87
  return PLUGIN_PRIORITY;
75
88
  }
76
-
77
- /**
78
- * Saved borders.
79
- *
80
- * @private
81
- * @type {Array}
82
- */
83
- savedBorders = [];
84
-
85
89
  /**
86
90
  * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit}
87
91
  * hook and if it returns `true` then the {@link CustomBorders#enablePlugin} method is called.
@@ -156,14 +160,11 @@ export class CustomBorders extends BasePlugin {
156
160
  const selectionType = detectSelectionType(selectionRanges);
157
161
  const selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);
158
162
  arrayEach(selectionRanges, selection => {
159
- const [rowStart, columnStart, rowEnd, columnEnd] = selectionSchemaNormalizer(selection);
160
- for (let row = rowStart; row <= rowEnd; row += 1) {
161
- for (let col = columnStart; col <= columnEnd; col += 1) {
162
- arrayEach(borderKeys, borderKey => {
163
- this.prepareBorderFromCustomAdded(row, col, normBorder, toInlinePropName(borderKey));
164
- });
165
- }
166
- }
163
+ selectionSchemaNormalizer(selection).forAll((row, col) => {
164
+ arrayEach(borderKeys, borderKey => {
165
+ this.prepareBorderFromCustomAdded(row, col, normBorder, toInlinePropName(borderKey));
166
+ });
167
+ });
167
168
  });
168
169
 
169
170
  /*
@@ -203,16 +204,13 @@ export class CustomBorders extends BasePlugin {
203
204
  const selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);
204
205
  const selectedBorders = [];
205
206
  arrayEach(selectionRanges, selection => {
206
- const [rowStart, columnStart, rowEnd, columnEnd] = selectionSchemaNormalizer(selection);
207
- for (let row = rowStart; row <= rowEnd; row += 1) {
208
- for (let col = columnStart; col <= columnEnd; col += 1) {
209
- arrayEach(this.savedBorders, border => {
210
- if (border.row === row && border.col === col) {
211
- selectedBorders.push(denormalizeBorder(border));
212
- }
213
- });
214
- }
215
- }
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
+ });
216
214
  });
217
215
  return selectedBorders;
218
216
  }
@@ -603,7 +601,8 @@ export class CustomBorders extends BasePlugin {
603
601
  let check = false;
604
602
  arrayEach(this.hot.selection.highlight.customSelections, customSelection => {
605
603
  if (border.id === customSelection.settings.id) {
606
- objectEach(customSelection.instanceBorders, borderObject => {
604
+ const borders = this.hot.view._wt.selectionManager.getBorderInstances(customSelection);
605
+ arrayEach(borders, borderObject => {
607
606
  borderObject.toggleHiddenClass(place, remove); // TODO this also bad?
608
607
  });
609
608
 
@@ -637,7 +636,8 @@ export class CustomBorders extends BasePlugin {
637
636
  customSelection.visualCellRange = cellRange;
638
637
  customSelection.commit();
639
638
  if (place) {
640
- objectEach(customSelection.instanceBorders, borderObject => {
639
+ const borders = this.hot.view._wt.selectionManager.getBorderInstances(customSelection);
640
+ arrayEach(borders, borderObject => {
641
641
  borderObject.changeBorderStyle(place, border);
642
642
  });
643
643
  }
@@ -705,6 +705,13 @@ export class CustomBorders extends BasePlugin {
705
705
  return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);
706
706
  },
707
707
  disabled() {
708
+ const range = this.getSelectedRangeLast();
709
+ if (!range) {
710
+ return true;
711
+ }
712
+ if (range.isSingleHeader()) {
713
+ return true;
714
+ }
708
715
  return this.selection.isSelectedByCorner();
709
716
  },
710
717
  submenu: {
@@ -74,11 +74,11 @@ function createDefaultHtBorder() {
74
74
  function normalizeBorder(border) {
75
75
  if ((0, _mixed.isDefined)(border.start) || (0, _mixed.isDefined)(border.left)) {
76
76
  var _border$start;
77
- border.start = (_border$start = border.start) != null ? _border$start : border.left;
77
+ border.start = (_border$start = border.start) !== null && _border$start !== void 0 ? _border$start : border.left;
78
78
  }
79
79
  if ((0, _mixed.isDefined)(border.end) || (0, _mixed.isDefined)(border.right)) {
80
80
  var _border$end;
81
- border.end = (_border$end = border.end) != null ? _border$end : border.right;
81
+ border.end = (_border$end = border.end) !== null && _border$end !== void 0 ? _border$end : border.right;
82
82
  }
83
83
  delete border.left;
84
84
  delete border.right;
@@ -251,5 +251,5 @@ const physicalToInlinePropNames = new Map([['left', 'start'], ['right', 'end']])
251
251
  */
252
252
  function toInlinePropName(propName) {
253
253
  var _physicalToInlineProp;
254
- return (_physicalToInlineProp = physicalToInlinePropNames.get(propName)) != null ? _physicalToInlineProp : propName;
254
+ return (_physicalToInlineProp = physicalToInlinePropNames.get(propName)) !== null && _physicalToInlineProp !== void 0 ? _physicalToInlineProp : propName;
255
255
  }
@@ -58,11 +58,11 @@ export function createDefaultHtBorder() {
58
58
  export function normalizeBorder(border) {
59
59
  if (isDefined(border.start) || isDefined(border.left)) {
60
60
  var _border$start;
61
- border.start = (_border$start = border.start) != null ? _border$start : border.left;
61
+ border.start = (_border$start = border.start) !== null && _border$start !== void 0 ? _border$start : border.left;
62
62
  }
63
63
  if (isDefined(border.end) || isDefined(border.right)) {
64
64
  var _border$end;
65
- border.end = (_border$end = border.end) != null ? _border$end : border.right;
65
+ border.end = (_border$end = border.end) !== null && _border$end !== void 0 ? _border$end : border.right;
66
66
  }
67
67
  delete border.left;
68
68
  delete border.right;
@@ -235,5 +235,5 @@ const physicalToInlinePropNames = new Map([['left', 'start'], ['right', 'end']])
235
235
  */
236
236
  export function toInlinePropName(propName) {
237
237
  var _physicalToInlineProp;
238
- return (_physicalToInlineProp = physicalToInlinePropNames.get(propName)) != null ? _physicalToInlineProp : propName;
238
+ return (_physicalToInlineProp = physicalToInlinePropNames.get(propName)) !== null && _physicalToInlineProp !== void 0 ? _physicalToInlineProp : propName;
239
239
  }
@@ -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 () {