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

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

Potentially problematic release.


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

Files changed (414) hide show
  1. package/3rdparty/walkontable/src/cell/coords.d.ts +6 -1
  2. package/3rdparty/walkontable/src/cell/coords.js +50 -11
  3. package/3rdparty/walkontable/src/cell/coords.mjs +50 -11
  4. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  5. package/3rdparty/walkontable/src/cell/range.js +38 -7
  6. package/3rdparty/walkontable/src/cell/range.mjs +38 -7
  7. package/3rdparty/walkontable/src/core/_base.js +9 -3
  8. package/3rdparty/walkontable/src/core/_base.mjs +9 -3
  9. package/3rdparty/walkontable/src/core/clone.js +2 -2
  10. package/3rdparty/walkontable/src/core/clone.mjs +2 -2
  11. package/3rdparty/walkontable/src/core/core.js +3 -2
  12. package/3rdparty/walkontable/src/core/core.mjs +3 -2
  13. package/3rdparty/walkontable/src/event.js +12 -10
  14. package/3rdparty/walkontable/src/event.mjs +12 -10
  15. package/3rdparty/walkontable/src/facade/core.js +2 -2
  16. package/3rdparty/walkontable/src/facade/core.mjs +2 -2
  17. package/3rdparty/walkontable/src/index.js +10 -2
  18. package/3rdparty/walkontable/src/index.mjs +2 -2
  19. package/3rdparty/walkontable/src/overlay/_base.js +13 -2
  20. package/3rdparty/walkontable/src/overlay/_base.mjs +14 -3
  21. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
  22. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
  23. package/3rdparty/walkontable/src/overlay/top.js +2 -6
  24. package/3rdparty/walkontable/src/overlay/top.mjs +2 -6
  25. package/3rdparty/walkontable/src/renderer/cells.js +10 -0
  26. package/3rdparty/walkontable/src/renderer/cells.mjs +11 -1
  27. package/3rdparty/walkontable/src/renderer/columnHeaders.js +10 -0
  28. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +11 -1
  29. package/3rdparty/walkontable/src/renderer/rowHeaders.js +5 -0
  30. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +5 -0
  31. package/3rdparty/walkontable/src/renderer/rows.js +13 -0
  32. package/3rdparty/walkontable/src/renderer/rows.mjs +13 -0
  33. package/3rdparty/walkontable/src/renderer/table.js +9 -0
  34. package/3rdparty/walkontable/src/renderer/table.mjs +9 -0
  35. package/3rdparty/walkontable/src/scroll.js +2 -0
  36. package/3rdparty/walkontable/src/scroll.mjs +2 -0
  37. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +7 -12
  38. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  39. package/3rdparty/walkontable/src/selection/border/constants.js +16 -0
  40. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  41. package/3rdparty/walkontable/src/selection/constants.js +62 -0
  42. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  43. package/3rdparty/walkontable/src/selection/index.js +26 -0
  44. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  45. package/3rdparty/walkontable/src/selection/manager.js +274 -0
  46. package/3rdparty/walkontable/src/selection/manager.mjs +269 -0
  47. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  48. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  49. package/3rdparty/walkontable/src/selection/selection.js +101 -0
  50. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  51. package/3rdparty/walkontable/src/settings.js +13 -4
  52. package/3rdparty/walkontable/src/settings.mjs +13 -4
  53. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
  54. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  55. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
  56. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  57. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
  58. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  59. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
  60. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  61. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
  62. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  63. package/3rdparty/walkontable/src/table.js +19 -78
  64. package/3rdparty/walkontable/src/table.mjs +20 -79
  65. package/base.js +2 -2
  66. package/base.mjs +2 -2
  67. package/cellTypes/dateType/dateType.d.ts +3 -3
  68. package/cellTypes/dateType/dateType.js +2 -2
  69. package/cellTypes/dateType/dateType.mjs +2 -2
  70. package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
  71. package/cellTypes/handsontableType/handsontableType.js +2 -2
  72. package/cellTypes/handsontableType/handsontableType.mjs +2 -2
  73. package/cellTypes/index.d.ts +3 -0
  74. package/cellTypes/index.js +4 -0
  75. package/cellTypes/index.mjs +3 -1
  76. package/cellTypes/selectType/index.d.ts +1 -0
  77. package/cellTypes/selectType/index.js +6 -0
  78. package/cellTypes/selectType/index.mjs +1 -0
  79. package/cellTypes/selectType/selectType.d.ts +14 -0
  80. package/cellTypes/selectType/selectType.js +13 -0
  81. package/cellTypes/selectType/selectType.mjs +8 -0
  82. package/core/focusCatcher/focusDetector.js +63 -0
  83. package/core/focusCatcher/focusDetector.mjs +59 -0
  84. package/core/focusCatcher/index.js +142 -0
  85. package/core/focusCatcher/index.mjs +138 -0
  86. package/core/index.js +9 -0
  87. package/core/index.mjs +1 -0
  88. package/core.d.ts +9 -4
  89. package/core.js +285 -327
  90. package/core.mjs +285 -327
  91. package/dataMap/metaManager/metaSchema.js +65 -0
  92. package/dataMap/metaManager/metaSchema.mjs +65 -0
  93. package/dataMap/metaManager/mods/extendMetaProperties.js +7 -1
  94. package/dataMap/metaManager/mods/extendMetaProperties.mjs +7 -1
  95. package/dataMap/replaceData.js +5 -0
  96. package/dataMap/replaceData.mjs +5 -0
  97. package/dist/handsontable.css +40 -5
  98. package/dist/handsontable.full.css +40 -5
  99. package/dist/handsontable.full.js +11744 -6945
  100. package/dist/handsontable.full.min.css +4 -4
  101. package/dist/handsontable.full.min.js +141 -141
  102. package/dist/handsontable.js +14036 -9237
  103. package/dist/handsontable.min.css +3 -3
  104. package/dist/handsontable.min.js +21 -21
  105. package/dist/languages/all.js +6 -2
  106. package/dist/languages/all.min.js +1 -1
  107. package/dist/languages/en-US.js +3 -1
  108. package/dist/languages/en-US.min.js +1 -1
  109. package/dist/languages/pl-PL.js +3 -1
  110. package/dist/languages/pl-PL.min.js +1 -1
  111. package/editorManager.js +15 -87
  112. package/editorManager.mjs +16 -87
  113. package/editors/autocompleteEditor/autocompleteEditor.js +53 -2
  114. package/editors/autocompleteEditor/autocompleteEditor.mjs +54 -3
  115. package/editors/dateEditor/dateEditor.js +26 -7
  116. package/editors/dateEditor/dateEditor.mjs +27 -8
  117. package/editors/handsontableEditor/handsontableEditor.js +9 -1
  118. package/editors/handsontableEditor/handsontableEditor.mjs +10 -2
  119. package/editors/textEditor/textEditor.js +19 -27
  120. package/editors/textEditor/textEditor.mjs +22 -30
  121. package/focusManager.d.ts +12 -0
  122. package/focusManager.js +265 -0
  123. package/focusManager.mjs +261 -0
  124. package/helpers/a11y.js +79 -0
  125. package/helpers/a11y.mjs +38 -0
  126. package/helpers/dom/element.js +188 -9
  127. package/helpers/dom/element.mjs +182 -9
  128. package/helpers/mixed.js +1 -1
  129. package/helpers/mixed.mjs +1 -1
  130. package/helpers/number.d.ts +1 -0
  131. package/helpers/number.js +18 -0
  132. package/helpers/number.mjs +17 -0
  133. package/i18n/constants.js +7 -1
  134. package/i18n/constants.mjs +4 -1
  135. package/i18n/languages/en-US.js +3 -1
  136. package/i18n/languages/en-US.mjs +3 -1
  137. package/i18n/languages/pl-PL.js +3 -1
  138. package/i18n/languages/pl-PL.mjs +3 -1
  139. package/languages/all.js +6 -2
  140. package/languages/en-US.js +3 -1
  141. package/languages/en-US.mjs +3 -1
  142. package/languages/index.js +6 -2
  143. package/languages/pl-PL.js +3 -1
  144. package/languages/pl-PL.mjs +3 -1
  145. package/package.json +21 -1
  146. package/pluginHooks.d.ts +12 -1
  147. package/pluginHooks.js +152 -1
  148. package/pluginHooks.mjs +152 -1
  149. package/plugins/collapsibleColumns/collapsibleColumns.js +74 -4
  150. package/plugins/collapsibleColumns/collapsibleColumns.mjs +75 -5
  151. package/plugins/columnSorting/columnSorting.js +43 -0
  152. package/plugins/columnSorting/columnSorting.mjs +44 -3
  153. package/plugins/columnSorting/index.js +3 -1
  154. package/plugins/columnSorting/index.mjs +1 -1
  155. package/plugins/comments/commentEditor.js +1 -0
  156. package/plugins/comments/commentEditor.mjs +1 -0
  157. package/plugins/comments/comments.js +252 -189
  158. package/plugins/comments/comments.mjs +251 -190
  159. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  160. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  161. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  162. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  163. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  164. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  165. package/plugins/contextMenu/commandExecutor.js +2 -3
  166. package/plugins/contextMenu/commandExecutor.mjs +2 -3
  167. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  168. package/plugins/contextMenu/contextMenu.js +75 -36
  169. package/plugins/contextMenu/contextMenu.mjs +74 -35
  170. package/plugins/contextMenu/itemsFactory.js +2 -3
  171. package/plugins/contextMenu/itemsFactory.mjs +3 -4
  172. package/plugins/contextMenu/{cursor.mjs → menu/cursor.js} +6 -4
  173. package/plugins/contextMenu/{cursor.js → menu/cursor.mjs} +4 -10
  174. package/plugins/contextMenu/menu/index.js +9 -0
  175. package/plugins/contextMenu/menu/index.mjs +1 -0
  176. package/plugins/contextMenu/{menu.js → menu/menu.js} +96 -308
  177. package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +97 -309
  178. package/plugins/contextMenu/menu/navigator.js +152 -0
  179. package/plugins/contextMenu/menu/navigator.mjs +148 -0
  180. package/plugins/contextMenu/menu/positioner.js +213 -0
  181. package/plugins/contextMenu/menu/positioner.mjs +209 -0
  182. package/plugins/contextMenu/menu/utils.js +177 -0
  183. package/plugins/contextMenu/menu/utils.mjs +163 -0
  184. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  185. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  186. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  187. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  188. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  189. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  190. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  191. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  192. package/plugins/contextMenu/{predefinedItems.js → predefinedItems/index.js} +14 -14
  193. package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
  194. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  195. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  196. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  197. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  198. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  199. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  200. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  201. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  202. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  203. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  204. package/plugins/contextMenu/utils.js +35 -151
  205. package/plugins/contextMenu/utils.mjs +35 -144
  206. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  207. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  208. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  209. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  210. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  211. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  212. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  213. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  214. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  215. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  216. package/plugins/copyPaste/copyPaste.js +127 -78
  217. package/plugins/copyPaste/copyPaste.mjs +128 -79
  218. package/plugins/customBorders/customBorders.js +23 -20
  219. package/plugins/customBorders/customBorders.mjs +24 -21
  220. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  221. package/plugins/dropdownMenu/dropdownMenu.js +97 -38
  222. package/plugins/dropdownMenu/dropdownMenu.mjs +96 -37
  223. package/plugins/filters/constants.mjs +1 -1
  224. package/plugins/filters/filters.js +31 -14
  225. package/plugins/filters/filters.mjs +31 -14
  226. package/plugins/filters/ui/select.js +3 -3
  227. package/plugins/filters/ui/select.mjs +2 -2
  228. package/plugins/hiddenColumns/hiddenColumns.mjs +1 -1
  229. package/plugins/hiddenRows/hiddenRows.mjs +1 -1
  230. package/plugins/manualColumnMove/manualColumnMove.js +3 -1
  231. package/plugins/manualColumnMove/manualColumnMove.mjs +3 -1
  232. package/plugins/mergeCells/mergeCells.js +5 -16
  233. package/plugins/mergeCells/mergeCells.mjs +5 -16
  234. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  235. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  236. package/plugins/nestedHeaders/nestedHeaders.js +240 -10
  237. package/plugins/nestedHeaders/nestedHeaders.mjs +241 -11
  238. package/plugins/nestedHeaders/stateManager/index.js +102 -3
  239. package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
  240. package/plugins/nestedRows/nestedRows.js +41 -0
  241. package/plugins/nestedRows/nestedRows.mjs +41 -0
  242. package/plugins/nestedRows/ui/headers.js +11 -0
  243. package/plugins/nestedRows/ui/headers.mjs +12 -1
  244. package/renderers/autocompleteRenderer/autocompleteRenderer.js +8 -0
  245. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
  246. package/renderers/baseRenderer/baseRenderer.js +17 -0
  247. package/renderers/baseRenderer/baseRenderer.mjs +18 -1
  248. package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
  249. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  250. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  251. package/renderers/dateRenderer/dateRenderer.js +29 -0
  252. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  253. package/renderers/dateRenderer/index.d.ts +1 -0
  254. package/renderers/dateRenderer/index.js +6 -0
  255. package/renderers/dateRenderer/index.mjs +1 -0
  256. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  257. package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
  258. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  259. package/renderers/handsontableRenderer/index.d.ts +1 -0
  260. package/renderers/handsontableRenderer/index.js +6 -0
  261. package/renderers/handsontableRenderer/index.mjs +1 -0
  262. package/renderers/index.d.ts +9 -0
  263. package/renderers/selectRenderer/index.d.ts +1 -0
  264. package/renderers/selectRenderer/index.js +6 -0
  265. package/renderers/selectRenderer/index.mjs +1 -0
  266. package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
  267. package/renderers/selectRenderer/selectRenderer.js +27 -0
  268. package/renderers/selectRenderer/selectRenderer.mjs +22 -0
  269. package/selection/highlight/highlight.js +256 -71
  270. package/selection/highlight/highlight.mjs +250 -71
  271. package/selection/highlight/types/activeHeader.js +10 -8
  272. package/selection/highlight/types/activeHeader.mjs +10 -8
  273. package/selection/highlight/types/area.js +6 -18
  274. package/selection/highlight/types/area.mjs +6 -18
  275. package/selection/highlight/types/areaLayered.js +31 -0
  276. package/selection/highlight/types/areaLayered.mjs +26 -0
  277. package/selection/highlight/types/column.js +27 -0
  278. package/selection/highlight/types/column.mjs +22 -0
  279. package/selection/highlight/types/customSelection.js +7 -9
  280. package/selection/highlight/types/customSelection.mjs +7 -9
  281. package/selection/highlight/types/fill.js +5 -7
  282. package/selection/highlight/types/fill.mjs +5 -7
  283. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  284. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  285. package/selection/highlight/types/header.js +9 -18
  286. package/selection/highlight/types/header.mjs +9 -18
  287. package/selection/highlight/types/row.js +27 -0
  288. package/selection/highlight/types/row.mjs +22 -0
  289. package/selection/highlight/visualSelection.js +31 -27
  290. package/selection/highlight/visualSelection.mjs +31 -27
  291. package/selection/index.js +4 -7
  292. package/selection/index.mjs +2 -3
  293. package/selection/mouseEventHandler.js +7 -1
  294. package/selection/mouseEventHandler.mjs +7 -1
  295. package/selection/range.js +8 -8
  296. package/selection/range.mjs +8 -8
  297. package/selection/selection.js +321 -152
  298. package/selection/selection.mjs +318 -151
  299. package/selection/transformation.js +232 -90
  300. package/selection/transformation.mjs +232 -90
  301. package/selection/utils.js +15 -21
  302. package/selection/utils.mjs +16 -21
  303. package/settings.d.ts +4 -0
  304. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  305. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  306. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  307. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  308. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  309. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  310. package/shortcutContexts/commands/editor/index.js +16 -0
  311. package/shortcutContexts/commands/editor/index.mjs +12 -0
  312. package/shortcutContexts/commands/editor/open.js +27 -0
  313. package/shortcutContexts/commands/editor/open.mjs +23 -0
  314. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  315. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  316. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  317. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  318. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +25 -0
  319. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
  320. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  321. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  322. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  323. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  324. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  325. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  326. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  327. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  328. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  329. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  330. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  331. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  332. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  333. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  334. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  335. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  336. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  337. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  338. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  339. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  340. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  341. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  342. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  343. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  344. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +25 -0
  345. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
  346. package/shortcutContexts/commands/index.js +35 -0
  347. package/shortcutContexts/commands/index.mjs +31 -0
  348. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  349. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  350. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +33 -0
  351. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
  352. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  353. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  354. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  355. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  356. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  357. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  358. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  359. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  360. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  361. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  362. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  363. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  364. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  365. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  366. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  367. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  368. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  369. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  370. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  371. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  372. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  373. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  374. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  375. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  376. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  377. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  378. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  379. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  380. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +33 -0
  381. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
  382. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  383. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  384. package/shortcutContexts/commands/scrollToFocusedCell.js +35 -0
  385. package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
  386. package/shortcutContexts/commands/selectAll.js +12 -0
  387. package/shortcutContexts/commands/selectAll.mjs +8 -0
  388. package/shortcutContexts/constants.js +13 -0
  389. package/shortcutContexts/constants.mjs +8 -0
  390. package/shortcutContexts/editor.js +25 -0
  391. package/shortcutContexts/editor.mjs +21 -0
  392. package/shortcutContexts/grid.js +163 -0
  393. package/shortcutContexts/grid.mjs +159 -0
  394. package/shortcutContexts/index.js +24 -0
  395. package/shortcutContexts/index.mjs +11 -0
  396. package/shortcuts/context.js +20 -2
  397. package/shortcuts/context.mjs +20 -3
  398. package/shortcuts/manager.js +25 -7
  399. package/shortcuts/manager.mjs +26 -7
  400. package/shortcuts/recorder.js +3 -3
  401. package/shortcuts/recorder.mjs +3 -3
  402. package/shortcuts/utils.js +19 -5
  403. package/shortcuts/utils.mjs +18 -4
  404. package/tableView.js +111 -13
  405. package/tableView.mjs +112 -14
  406. package/3rdparty/walkontable/src/selection.js +0 -295
  407. package/3rdparty/walkontable/src/selection.mjs +0 -290
  408. package/plugins/contextMenu/predefinedItems.mjs +0 -68
  409. package/plugins/copyPaste/focusableElement.js +0 -186
  410. package/plugins/copyPaste/focusableElement.mjs +0 -180
  411. package/selection/highlight/constants.js +0 -15
  412. package/selection/highlight/constants.mjs +0 -6
  413. package/selection/highlight/types/index.js +0 -35
  414. package/selection/highlight/types/index.mjs +0 -31
@@ -36,23 +36,30 @@ exports.isChildOf = isChildOf;
36
36
  exports.isDetached = isDetached;
37
37
  exports.isInput = isInput;
38
38
  exports.isOutsideInput = isOutsideInput;
39
+ exports.isThisHotChild = isThisHotChild;
39
40
  exports.isVisible = isVisible;
41
+ exports.makeElementContentEditableAndSelectItsContent = makeElementContentEditableAndSelectItsContent;
40
42
  exports.matchesCSSRules = matchesCSSRules;
41
43
  exports.observeVisibilityChangeOnce = observeVisibilityChangeOnce;
42
44
  exports.offset = offset;
43
45
  exports.outerHeight = outerHeight;
44
46
  exports.outerWidth = outerWidth;
45
47
  exports.overlayContainsElement = overlayContainsElement;
48
+ exports.removeAttribute = removeAttribute;
46
49
  exports.removeClass = removeClass;
50
+ exports.removeContentEditableFromElementAndDeselect = removeContentEditableFromElementAndDeselect;
47
51
  exports.removeEvent = removeEvent;
48
52
  exports.removeTextNodes = removeTextNodes;
49
53
  exports.resetCssTransform = resetCssTransform;
54
+ exports.runWithSelectedContendEditableElement = runWithSelectedContendEditableElement;
50
55
  exports.selectElementIfAllowed = selectElementIfAllowed;
56
+ exports.setAttribute = setAttribute;
51
57
  exports.setCaretPosition = setCaretPosition;
52
58
  exports.setOverlayPosition = setOverlayPosition;
53
59
  require("core-js/modules/es.array.push.js");
54
60
  require("core-js/modules/es.error.cause.js");
55
61
  var _string = require("../string");
62
+ var _a11y = require("../a11y");
56
63
  /**
57
64
  * Get the parent of the specified node in the DOM tree.
58
65
  *
@@ -80,6 +87,18 @@ function getParent(element) {
80
87
  return parent;
81
88
  }
82
89
 
90
+ /**
91
+ * Check if the provided element is a child of the provided Handsontable container.
92
+ *
93
+ * @param {HTMLElement} element Element to be analyzed.
94
+ * @param {HTMLElement} thisHotContainer The Handsontable container.
95
+ * @returns {boolean}
96
+ */
97
+ function isThisHotChild(element, thisHotContainer) {
98
+ const closestHandsontableContainer = element.closest('.handsontable');
99
+ return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
100
+ }
101
+
83
102
  /**
84
103
  * Gets `frameElement` of the specified frame. Returns null if it is a top frame or if script has no access to read property.
85
104
  *
@@ -93,7 +112,7 @@ function getFrameElement(frame) {
93
112
  /**
94
113
  * Gets parent frame of the specified frame. Returns null if it is a top frame or if script has no access to read property.
95
114
  *
96
- * @param {Window} frame Frame from which should be get frameElement in safe way.
115
+ * @param {Window} frame Frame from which should get frameElement in a safe way.
97
116
  * @returns {Window|null}
98
117
  */
99
118
  function getParentWindow(frame) {
@@ -103,7 +122,7 @@ function getParentWindow(frame) {
103
122
  /**
104
123
  * Checks if script has access to read from parent frame of specified frame.
105
124
  *
106
- * @param {Window} frame Frame from which should be get frameElement in safe way.
125
+ * @param {Window} frame Frame from which should get frameElement in a safe way.
107
126
  * @returns {boolean}
108
127
  */
109
128
  function hasAccessToParentWindow(frame) {
@@ -238,7 +257,7 @@ function overlayContainsElement(overlayType, element, root) {
238
257
  }
239
258
 
240
259
  /**
241
- * @param {string} classNames The element "class" attribute string.
260
+ * @param {string[]} classNames The element "class" attribute string.
242
261
  * @returns {string[]}
243
262
  */
244
263
  function filterEmptyClassNames(classNames) {
@@ -248,6 +267,35 @@ function filterEmptyClassNames(classNames) {
248
267
  return classNames.filter(x => !!x);
249
268
  }
250
269
 
270
+ /**
271
+ * Filter out the RegExp entries from an array.
272
+ *
273
+ * @param {(string|RegExp)[]} list Array of either strings, Regexes or a mix of both.
274
+ * @param {boolean} [returnBoth] If `true`, both the array without regexes and an array of regexes will be returned.
275
+ * @returns {string[]|{regexFree: string[], regexes: RegExp[]}}
276
+ */
277
+ function filterRegexes(list, returnBoth) {
278
+ if (!list || !list.length) {
279
+ return returnBoth ? {
280
+ regexFree: [],
281
+ regexes: []
282
+ } : [];
283
+ }
284
+ const regexes = [];
285
+ const regexFree = [];
286
+ regexFree.push(...list.filter(entry => {
287
+ const isRegex = entry instanceof RegExp;
288
+ if (isRegex && returnBoth) {
289
+ regexes.push(entry);
290
+ }
291
+ return !isRegex;
292
+ }));
293
+ return returnBoth ? {
294
+ regexFree,
295
+ regexes
296
+ } : regexFree;
297
+ }
298
+
251
299
  /**
252
300
  * Checks if element has class name.
253
301
  *
@@ -282,16 +330,86 @@ function addClass(element, className) {
282
330
  * Remove class name from an element.
283
331
  *
284
332
  * @param {HTMLElement} element An element to process.
285
- * @param {string|Array} className Class name as string or array of strings.
333
+ * @param {string|Array<string|RegExp>} className Class name as string or array of strings.
286
334
  */
287
335
  function removeClass(element, className) {
288
336
  if (typeof className === 'string') {
289
337
  className = className.split(' ');
338
+ } else if (className instanceof RegExp) {
339
+ className = [className];
290
340
  }
291
- className = filterEmptyClassNames(className);
292
- if (className.length > 0) {
293
- element.classList.remove(...className);
341
+ let {
342
+ regexFree: stringClasses,
343
+ // eslint-disable-next-line prefer-const
344
+ regexes: regexClasses
345
+ } = filterRegexes(className, true);
346
+ stringClasses = filterEmptyClassNames(stringClasses);
347
+ if (stringClasses.length > 0) {
348
+ element.classList.remove(...stringClasses);
349
+ }
350
+ regexClasses.forEach(regexClassName => {
351
+ element.classList.forEach(currentClassName => {
352
+ if (regexClassName.test(currentClassName)) {
353
+ element.classList.remove(currentClassName);
354
+ }
355
+ });
356
+ });
357
+ }
358
+
359
+ /**
360
+ * Set a single attribute or multiple attributes at once.
361
+ *
362
+ * @param {HTMLElement} domElement The HTML element to be modified.
363
+ * @param {Array[]|string} attributes If setting multiple attributes at once, `attributes` holds an array containing the
364
+ * attributes to be added. Each element of the array should be an array in a form of `[attributeName,
365
+ * attributeValue]`. If setting a single attribute, `attributes` holds the name of the attribute.
366
+ * @param {string|number|undefined} [attributeValue] If setting a single attribute, `attributeValue` holds the attribute
367
+ * value.
368
+ */
369
+ function setAttribute(domElement) {
370
+ let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
371
+ let attributeValue = arguments.length > 2 ? arguments[2] : undefined;
372
+ if (!Array.isArray(attributes)) {
373
+ attributes = [[attributes, attributeValue]];
374
+ }
375
+ attributes.forEach(attributeInfo => {
376
+ if (Array.isArray(attributeInfo) && attributeInfo[0] !== '') {
377
+ domElement.setAttribute(...attributeInfo);
378
+ }
379
+ });
380
+ }
381
+
382
+ /**
383
+ * Remove a single attribute or multiple attributes from the provided element at once.
384
+ *
385
+ * @param {HTMLElement} domElement The HTML element to be processed.
386
+ * @param {Array<string|RegExp>|string} attributesToRemove If removing multiple attributes, `attributesToRemove`
387
+ * holds an array of attribute names to be removed from the provided element. If removing a single attribute, it
388
+ * holds the attribute name.
389
+ */
390
+ function removeAttribute(domElement) {
391
+ let attributesToRemove = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
392
+ if (typeof attributesToRemove === 'string') {
393
+ attributesToRemove = attributesToRemove.split(' ');
394
+ } else if (attributesToRemove instanceof RegExp) {
395
+ attributesToRemove = [attributesToRemove];
294
396
  }
397
+ const {
398
+ regexFree: stringAttributes,
399
+ regexes: regexAttributes
400
+ } = filterRegexes(attributesToRemove, true);
401
+ stringAttributes.forEach(attributeNameToRemove => {
402
+ if (attributeNameToRemove !== '') {
403
+ domElement.removeAttribute(attributeNameToRemove);
404
+ }
405
+ });
406
+ regexAttributes.forEach(attributeRegex => {
407
+ domElement.getAttributeNames().forEach(attributeName => {
408
+ if (attributeRegex.test(attributeName)) {
409
+ domElement.removeAttribute(attributeName);
410
+ }
411
+ });
412
+ });
295
413
  }
296
414
 
297
415
  /**
@@ -309,7 +427,7 @@ function removeTextNodes(element) {
309
427
  }
310
428
 
311
429
  /**
312
- * Remove childs function
430
+ * Remove children function
313
431
  * WARNING - this doesn't unload events and data attached by jQuery
314
432
  * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9
315
433
  * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method.
@@ -327,7 +445,7 @@ function empty(element) {
327
445
  const HTML_CHARACTERS = /(<(.*)>|&(.*);)/;
328
446
 
329
447
  /**
330
- * Insert content into element trying avoid innerHTML method.
448
+ * Insert content into element trying to avoid innerHTML method.
331
449
  *
332
450
  * @param {HTMLElement} element An element to write into.
333
451
  * @param {string} content The text to write.
@@ -957,4 +1075,65 @@ function observeVisibilityChangeOnce(elementToBeObserved, callback) {
957
1075
  root: elementToBeObserved.ownerDocument.body
958
1076
  });
959
1077
  visibilityObserver.observe(elementToBeObserved);
1078
+ }
1079
+
1080
+ /**
1081
+ * Add a `contenteditable` attribute, select the contents and optionally add the `invisibleSelection`
1082
+ * class to the provided element.
1083
+ *
1084
+ * @param {HTMLElement} element Element to be processed.
1085
+ * @param {boolean} [invisibleSelection=true] `true` if the class should be added to the element.
1086
+ * @param {boolean} [ariaHidden=true] `true` if the `aria-hidden` attribute should be added to the processed element.
1087
+ */
1088
+ function makeElementContentEditableAndSelectItsContent(element) {
1089
+ let invisibleSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1090
+ let ariaHidden = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1091
+ const ownerDocument = element.ownerDocument;
1092
+ const range = ownerDocument.createRange();
1093
+ const sel = ownerDocument.defaultView.getSelection();
1094
+ setAttribute(element, 'contenteditable', true);
1095
+ if (ariaHidden) {
1096
+ setAttribute(element, ...(0, _a11y.A11Y_HIDDEN)());
1097
+ }
1098
+ if (invisibleSelection) {
1099
+ addClass(element, 'invisibleSelection');
1100
+ }
1101
+ range.selectNodeContents(element);
1102
+ sel.removeAllRanges();
1103
+ sel.addRange(range);
1104
+ }
1105
+
1106
+ /**
1107
+ * Remove the `contenteditable` attribute, deselect the contents and optionally remove the `invisibleSelection`
1108
+ * class from the provided element.
1109
+ *
1110
+ * @param {HTMLElement} selectedElement The element to be deselected.
1111
+ * @param {boolean} [removeInvisibleSelectionClass=true] `true` if the class should be removed from the element.
1112
+ */
1113
+ function removeContentEditableFromElementAndDeselect(selectedElement) {
1114
+ let removeInvisibleSelectionClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1115
+ const sel = selectedElement.ownerDocument.defaultView.getSelection();
1116
+ if (selectedElement.hasAttribute('aria-hidden')) {
1117
+ selectedElement.removeAttribute('aria-hidden');
1118
+ }
1119
+ sel.removeAllRanges();
1120
+ if (removeInvisibleSelectionClass) {
1121
+ removeClass(selectedElement, 'invisibleSelection');
1122
+ }
1123
+ selectedElement.removeAttribute('contenteditable');
1124
+ }
1125
+
1126
+ /**
1127
+ * Run the provided callback while the provided element is selected and modified to have the `contenteditable`
1128
+ * attribute added. Optionally, the selection can be configured to be invisible.
1129
+ *
1130
+ * @param {HTMLElement} element Element to be selected.
1131
+ * @param {Function} callback Callback to be called.
1132
+ * @param {boolean} [invisibleSelection=true] `true` if the selection should be invisible.
1133
+ */
1134
+ function runWithSelectedContendEditableElement(element, callback) {
1135
+ let invisibleSelection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1136
+ makeElementContentEditableAndSelectItsContent(element, invisibleSelection);
1137
+ callback();
1138
+ removeContentEditableFromElementAndDeselect(element, invisibleSelection);
960
1139
  }
@@ -1,6 +1,7 @@
1
1
  import "core-js/modules/es.array.push.js";
2
2
  import "core-js/modules/es.error.cause.js";
3
3
  import { sanitize } from "../string.mjs";
4
+ import { A11Y_HIDDEN } from "../a11y.mjs";
4
5
  /**
5
6
  * Get the parent of the specified node in the DOM tree.
6
7
  *
@@ -28,6 +29,18 @@ export function getParent(element) {
28
29
  return parent;
29
30
  }
30
31
 
32
+ /**
33
+ * Check if the provided element is a child of the provided Handsontable container.
34
+ *
35
+ * @param {HTMLElement} element Element to be analyzed.
36
+ * @param {HTMLElement} thisHotContainer The Handsontable container.
37
+ * @returns {boolean}
38
+ */
39
+ export function isThisHotChild(element, thisHotContainer) {
40
+ const closestHandsontableContainer = element.closest('.handsontable');
41
+ return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
42
+ }
43
+
31
44
  /**
32
45
  * Gets `frameElement` of the specified frame. Returns null if it is a top frame or if script has no access to read property.
33
46
  *
@@ -41,7 +54,7 @@ export function getFrameElement(frame) {
41
54
  /**
42
55
  * Gets parent frame of the specified frame. Returns null if it is a top frame or if script has no access to read property.
43
56
  *
44
- * @param {Window} frame Frame from which should be get frameElement in safe way.
57
+ * @param {Window} frame Frame from which should get frameElement in a safe way.
45
58
  * @returns {Window|null}
46
59
  */
47
60
  export function getParentWindow(frame) {
@@ -51,7 +64,7 @@ export function getParentWindow(frame) {
51
64
  /**
52
65
  * Checks if script has access to read from parent frame of specified frame.
53
66
  *
54
- * @param {Window} frame Frame from which should be get frameElement in safe way.
67
+ * @param {Window} frame Frame from which should get frameElement in a safe way.
55
68
  * @returns {boolean}
56
69
  */
57
70
  export function hasAccessToParentWindow(frame) {
@@ -186,7 +199,7 @@ export function overlayContainsElement(overlayType, element, root) {
186
199
  }
187
200
 
188
201
  /**
189
- * @param {string} classNames The element "class" attribute string.
202
+ * @param {string[]} classNames The element "class" attribute string.
190
203
  * @returns {string[]}
191
204
  */
192
205
  function filterEmptyClassNames(classNames) {
@@ -196,6 +209,35 @@ function filterEmptyClassNames(classNames) {
196
209
  return classNames.filter(x => !!x);
197
210
  }
198
211
 
212
+ /**
213
+ * Filter out the RegExp entries from an array.
214
+ *
215
+ * @param {(string|RegExp)[]} list Array of either strings, Regexes or a mix of both.
216
+ * @param {boolean} [returnBoth] If `true`, both the array without regexes and an array of regexes will be returned.
217
+ * @returns {string[]|{regexFree: string[], regexes: RegExp[]}}
218
+ */
219
+ function filterRegexes(list, returnBoth) {
220
+ if (!list || !list.length) {
221
+ return returnBoth ? {
222
+ regexFree: [],
223
+ regexes: []
224
+ } : [];
225
+ }
226
+ const regexes = [];
227
+ const regexFree = [];
228
+ regexFree.push(...list.filter(entry => {
229
+ const isRegex = entry instanceof RegExp;
230
+ if (isRegex && returnBoth) {
231
+ regexes.push(entry);
232
+ }
233
+ return !isRegex;
234
+ }));
235
+ return returnBoth ? {
236
+ regexFree,
237
+ regexes
238
+ } : regexFree;
239
+ }
240
+
199
241
  /**
200
242
  * Checks if element has class name.
201
243
  *
@@ -230,16 +272,86 @@ export function addClass(element, className) {
230
272
  * Remove class name from an element.
231
273
  *
232
274
  * @param {HTMLElement} element An element to process.
233
- * @param {string|Array} className Class name as string or array of strings.
275
+ * @param {string|Array<string|RegExp>} className Class name as string or array of strings.
234
276
  */
235
277
  export function removeClass(element, className) {
236
278
  if (typeof className === 'string') {
237
279
  className = className.split(' ');
280
+ } else if (className instanceof RegExp) {
281
+ className = [className];
238
282
  }
239
- className = filterEmptyClassNames(className);
240
- if (className.length > 0) {
241
- element.classList.remove(...className);
283
+ let {
284
+ regexFree: stringClasses,
285
+ // eslint-disable-next-line prefer-const
286
+ regexes: regexClasses
287
+ } = filterRegexes(className, true);
288
+ stringClasses = filterEmptyClassNames(stringClasses);
289
+ if (stringClasses.length > 0) {
290
+ element.classList.remove(...stringClasses);
291
+ }
292
+ regexClasses.forEach(regexClassName => {
293
+ element.classList.forEach(currentClassName => {
294
+ if (regexClassName.test(currentClassName)) {
295
+ element.classList.remove(currentClassName);
296
+ }
297
+ });
298
+ });
299
+ }
300
+
301
+ /**
302
+ * Set a single attribute or multiple attributes at once.
303
+ *
304
+ * @param {HTMLElement} domElement The HTML element to be modified.
305
+ * @param {Array[]|string} attributes If setting multiple attributes at once, `attributes` holds an array containing the
306
+ * attributes to be added. Each element of the array should be an array in a form of `[attributeName,
307
+ * attributeValue]`. If setting a single attribute, `attributes` holds the name of the attribute.
308
+ * @param {string|number|undefined} [attributeValue] If setting a single attribute, `attributeValue` holds the attribute
309
+ * value.
310
+ */
311
+ export function setAttribute(domElement) {
312
+ let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
313
+ let attributeValue = arguments.length > 2 ? arguments[2] : undefined;
314
+ if (!Array.isArray(attributes)) {
315
+ attributes = [[attributes, attributeValue]];
316
+ }
317
+ attributes.forEach(attributeInfo => {
318
+ if (Array.isArray(attributeInfo) && attributeInfo[0] !== '') {
319
+ domElement.setAttribute(...attributeInfo);
320
+ }
321
+ });
322
+ }
323
+
324
+ /**
325
+ * Remove a single attribute or multiple attributes from the provided element at once.
326
+ *
327
+ * @param {HTMLElement} domElement The HTML element to be processed.
328
+ * @param {Array<string|RegExp>|string} attributesToRemove If removing multiple attributes, `attributesToRemove`
329
+ * holds an array of attribute names to be removed from the provided element. If removing a single attribute, it
330
+ * holds the attribute name.
331
+ */
332
+ export function removeAttribute(domElement) {
333
+ let attributesToRemove = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
334
+ if (typeof attributesToRemove === 'string') {
335
+ attributesToRemove = attributesToRemove.split(' ');
336
+ } else if (attributesToRemove instanceof RegExp) {
337
+ attributesToRemove = [attributesToRemove];
242
338
  }
339
+ const {
340
+ regexFree: stringAttributes,
341
+ regexes: regexAttributes
342
+ } = filterRegexes(attributesToRemove, true);
343
+ stringAttributes.forEach(attributeNameToRemove => {
344
+ if (attributeNameToRemove !== '') {
345
+ domElement.removeAttribute(attributeNameToRemove);
346
+ }
347
+ });
348
+ regexAttributes.forEach(attributeRegex => {
349
+ domElement.getAttributeNames().forEach(attributeName => {
350
+ if (attributeRegex.test(attributeName)) {
351
+ domElement.removeAttribute(attributeName);
352
+ }
353
+ });
354
+ });
243
355
  }
244
356
 
245
357
  /**
@@ -257,7 +369,7 @@ export function removeTextNodes(element) {
257
369
  }
258
370
 
259
371
  /**
260
- * Remove childs function
372
+ * Remove children function
261
373
  * WARNING - this doesn't unload events and data attached by jQuery
262
374
  * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9
263
375
  * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method.
@@ -275,7 +387,7 @@ export function empty(element) {
275
387
  export const HTML_CHARACTERS = /(<(.*)>|&(.*);)/;
276
388
 
277
389
  /**
278
- * Insert content into element trying avoid innerHTML method.
390
+ * Insert content into element trying to avoid innerHTML method.
279
391
  *
280
392
  * @param {HTMLElement} element An element to write into.
281
393
  * @param {string} content The text to write.
@@ -904,4 +1016,65 @@ export function observeVisibilityChangeOnce(elementToBeObserved, callback) {
904
1016
  root: elementToBeObserved.ownerDocument.body
905
1017
  });
906
1018
  visibilityObserver.observe(elementToBeObserved);
1019
+ }
1020
+
1021
+ /**
1022
+ * Add a `contenteditable` attribute, select the contents and optionally add the `invisibleSelection`
1023
+ * class to the provided element.
1024
+ *
1025
+ * @param {HTMLElement} element Element to be processed.
1026
+ * @param {boolean} [invisibleSelection=true] `true` if the class should be added to the element.
1027
+ * @param {boolean} [ariaHidden=true] `true` if the `aria-hidden` attribute should be added to the processed element.
1028
+ */
1029
+ export function makeElementContentEditableAndSelectItsContent(element) {
1030
+ let invisibleSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1031
+ let ariaHidden = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1032
+ const ownerDocument = element.ownerDocument;
1033
+ const range = ownerDocument.createRange();
1034
+ const sel = ownerDocument.defaultView.getSelection();
1035
+ setAttribute(element, 'contenteditable', true);
1036
+ if (ariaHidden) {
1037
+ setAttribute(element, ...A11Y_HIDDEN());
1038
+ }
1039
+ if (invisibleSelection) {
1040
+ addClass(element, 'invisibleSelection');
1041
+ }
1042
+ range.selectNodeContents(element);
1043
+ sel.removeAllRanges();
1044
+ sel.addRange(range);
1045
+ }
1046
+
1047
+ /**
1048
+ * Remove the `contenteditable` attribute, deselect the contents and optionally remove the `invisibleSelection`
1049
+ * class from the provided element.
1050
+ *
1051
+ * @param {HTMLElement} selectedElement The element to be deselected.
1052
+ * @param {boolean} [removeInvisibleSelectionClass=true] `true` if the class should be removed from the element.
1053
+ */
1054
+ export function removeContentEditableFromElementAndDeselect(selectedElement) {
1055
+ let removeInvisibleSelectionClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1056
+ const sel = selectedElement.ownerDocument.defaultView.getSelection();
1057
+ if (selectedElement.hasAttribute('aria-hidden')) {
1058
+ selectedElement.removeAttribute('aria-hidden');
1059
+ }
1060
+ sel.removeAllRanges();
1061
+ if (removeInvisibleSelectionClass) {
1062
+ removeClass(selectedElement, 'invisibleSelection');
1063
+ }
1064
+ selectedElement.removeAttribute('contenteditable');
1065
+ }
1066
+
1067
+ /**
1068
+ * Run the provided callback while the provided element is selected and modified to have the `contenteditable`
1069
+ * attribute added. Optionally, the selection can be configured to be invisible.
1070
+ *
1071
+ * @param {HTMLElement} element Element to be selected.
1072
+ * @param {Function} callback Callback to be called.
1073
+ * @param {boolean} [invisibleSelection=true] `true` if the selection should be invisible.
1074
+ */
1075
+ export function runWithSelectedContendEditableElement(element, callback) {
1076
+ let invisibleSelection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1077
+ makeElementContentEditableAndSelectItsContent(element, invisibleSelection);
1078
+ callback();
1079
+ removeContentEditableFromElementAndDeselect(element, invisibleSelection);
907
1080
  }
package/helpers/mixed.js CHANGED
@@ -134,7 +134,7 @@ const domMessages = {
134
134
  function _injectProductInfo(key, element) {
135
135
  const hasValidType = !isEmpty(key);
136
136
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
137
- const hotVersion = "0.0.0-next-010265d-20231005";
137
+ const hotVersion = "0.0.0-next-9379dd1-20231020";
138
138
  let keyValidityDate;
139
139
  let consoleMessageState = 'invalid';
140
140
  let domMessageState = 'invalid';
package/helpers/mixed.mjs CHANGED
@@ -124,7 +124,7 @@ const domMessages = {
124
124
  export function _injectProductInfo(key, element) {
125
125
  const hasValidType = !isEmpty(key);
126
126
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
127
- const hotVersion = "0.0.0-next-010265d-20231005";
127
+ const hotVersion = "0.0.0-next-9379dd1-20231020";
128
128
  let keyValidityDate;
129
129
  let consoleMessageState = 'invalid';
130
130
  let domMessageState = 'invalid';
@@ -3,3 +3,4 @@ export function isNumericLike(value: any): boolean;
3
3
  export function rangeEach(rangeFrom: number, rangeTo: number, iteratee: (index: number) => void): void;
4
4
  export function rangeEachReverse(rangeFrom: number, rangeTo: number, iteratee: (index: number) => void): void;
5
5
  export function valueAccordingPercent(value: number, percent: string | number): number;
6
+ export function clamp(value: number, minValue: number, maxValue: number): number;
package/helpers/number.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  exports.__esModule = true;
4
+ exports.clamp = clamp;
4
5
  exports.isNumeric = isNumeric;
5
6
  exports.isNumericLike = isNumericLike;
6
7
  exports.rangeEach = rangeEach;
@@ -111,4 +112,21 @@ function valueAccordingPercent(value, percent) {
111
112
  percent = parseInt(percent.toString().replace('%', ''), 10);
112
113
  percent = isNaN(percent) ? 0 : percent;
113
114
  return parseInt(value * percent / 100, 10);
115
+ }
116
+
117
+ /**
118
+ * Clamps the value between min and max.
119
+ *
120
+ * @param {number} value The base number value.
121
+ * @param {number} minValue The max number value.
122
+ * @param {number} maxValue The min number value.
123
+ * @returns {number}
124
+ */
125
+ function clamp(value, minValue, maxValue) {
126
+ if (Math.min(value, minValue) === value) {
127
+ return minValue;
128
+ } else if (Math.max(value, maxValue) === value) {
129
+ return maxValue;
130
+ }
131
+ return value;
114
132
  }
@@ -103,4 +103,21 @@ export function valueAccordingPercent(value, percent) {
103
103
  percent = parseInt(percent.toString().replace('%', ''), 10);
104
104
  percent = isNaN(percent) ? 0 : percent;
105
105
  return parseInt(value * percent / 100, 10);
106
+ }
107
+
108
+ /**
109
+ * Clamps the value between min and max.
110
+ *
111
+ * @param {number} value The base number value.
112
+ * @param {number} minValue The max number value.
113
+ * @param {number} maxValue The min number value.
114
+ * @returns {number}
115
+ */
116
+ export function clamp(value, minValue, maxValue) {
117
+ if (Math.min(value, minValue) === value) {
118
+ return minValue;
119
+ } else if (Math.max(value, maxValue) === value) {
120
+ return maxValue;
121
+ }
122
+ return value;
106
123
  }
package/i18n/constants.js CHANGED
@@ -165,4 +165,10 @@ exports.FILTERS_BUTTONS_PLACEHOLDER_SEARCH = FILTERS_BUTTONS_PLACEHOLDER_SEARCH;
165
165
  const FILTERS_BUTTONS_PLACEHOLDER_VALUE = `${FILTERS_NAMESPACE}buttons.placeholder.value`;
166
166
  exports.FILTERS_BUTTONS_PLACEHOLDER_VALUE = FILTERS_BUTTONS_PLACEHOLDER_VALUE;
167
167
  const FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = `${FILTERS_NAMESPACE}buttons.placeholder.secondValue`;
168
- exports.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE;
168
+ exports.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE;
169
+ const CHECKBOX_RENDERER_NAMESPACE = 'CheckboxRenderer:';
170
+ exports.CHECKBOX_RENDERER_NAMESPACE = CHECKBOX_RENDERER_NAMESPACE;
171
+ const CHECKBOX_CHECKED = `${CHECKBOX_RENDERER_NAMESPACE}checked`;
172
+ exports.CHECKBOX_CHECKED = CHECKBOX_CHECKED;
173
+ const CHECKBOX_UNCHECKED = `${CHECKBOX_RENDERER_NAMESPACE}unchecked`;
174
+ exports.CHECKBOX_UNCHECKED = CHECKBOX_UNCHECKED;
@@ -83,4 +83,7 @@ export const FILTERS_BUTTONS_OK = `${FILTERS_NAMESPACE}buttons.ok`;
83
83
  export const FILTERS_BUTTONS_CANCEL = `${FILTERS_NAMESPACE}buttons.cancel`;
84
84
  export const FILTERS_BUTTONS_PLACEHOLDER_SEARCH = `${FILTERS_NAMESPACE}buttons.placeholder.search`;
85
85
  export const FILTERS_BUTTONS_PLACEHOLDER_VALUE = `${FILTERS_NAMESPACE}buttons.placeholder.value`;
86
- export const FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = `${FILTERS_NAMESPACE}buttons.placeholder.secondValue`;
86
+ export const FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = `${FILTERS_NAMESPACE}buttons.placeholder.secondValue`;
87
+ export const CHECKBOX_RENDERER_NAMESPACE = 'CheckboxRenderer:';
88
+ export const CHECKBOX_CHECKED = `${CHECKBOX_RENDERER_NAMESPACE}checked`;
89
+ export const CHECKBOX_UNCHECKED = `${CHECKBOX_RENDERER_NAMESPACE}unchecked`;
@@ -89,7 +89,9 @@ const dictionary = {
89
89
  [C.FILTERS_BUTTONS_CANCEL]: 'Cancel',
90
90
  [C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH]: 'Search',
91
91
  [C.FILTERS_BUTTONS_PLACEHOLDER_VALUE]: 'Value',
92
- [C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE]: 'Second value'
92
+ [C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE]: 'Second value',
93
+ [C.CHECKBOX_CHECKED]: 'Checked',
94
+ [C.CHECKBOX_UNCHECKED]: 'Unchecked'
93
95
  };
94
96
  var _default = dictionary;
95
97
  exports.default = _default;
@@ -83,6 +83,8 @@ const dictionary = {
83
83
  [C.FILTERS_BUTTONS_CANCEL]: 'Cancel',
84
84
  [C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH]: 'Search',
85
85
  [C.FILTERS_BUTTONS_PLACEHOLDER_VALUE]: 'Value',
86
- [C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE]: 'Second value'
86
+ [C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE]: 'Second value',
87
+ [C.CHECKBOX_CHECKED]: 'Checked',
88
+ [C.CHECKBOX_UNCHECKED]: 'Unchecked'
87
89
  };
88
90
  export default dictionary;
@@ -89,7 +89,9 @@ const dictionary = {
89
89
  [C.FILTERS_BUTTONS_CANCEL]: 'Anuluj',
90
90
  [C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH]: 'Szukaj',
91
91
  [C.FILTERS_BUTTONS_PLACEHOLDER_VALUE]: 'Wartość',
92
- [C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE]: 'Druga wartość'
92
+ [C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE]: 'Druga wartość',
93
+ [C.CHECKBOX_CHECKED]: 'Zaznaczony',
94
+ [C.CHECKBOX_UNCHECKED]: 'Odznaczony'
93
95
  };
94
96
  var _default = dictionary;
95
97
  exports.default = _default;