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

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

Potentially problematic release.


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

Files changed (446) hide show
  1. package/3rdparty/walkontable/src/cell/coords.d.ts +6 -1
  2. package/3rdparty/walkontable/src/cell/coords.js +50 -11
  3. package/3rdparty/walkontable/src/cell/coords.mjs +50 -11
  4. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  5. package/3rdparty/walkontable/src/cell/range.js +38 -7
  6. package/3rdparty/walkontable/src/cell/range.mjs +38 -7
  7. package/3rdparty/walkontable/src/core/_base.js +9 -3
  8. package/3rdparty/walkontable/src/core/_base.mjs +9 -3
  9. package/3rdparty/walkontable/src/core/clone.js +2 -2
  10. package/3rdparty/walkontable/src/core/clone.mjs +2 -2
  11. package/3rdparty/walkontable/src/core/core.js +3 -2
  12. package/3rdparty/walkontable/src/core/core.mjs +3 -2
  13. package/3rdparty/walkontable/src/event.js +12 -10
  14. package/3rdparty/walkontable/src/event.mjs +12 -10
  15. package/3rdparty/walkontable/src/facade/core.js +2 -2
  16. package/3rdparty/walkontable/src/facade/core.mjs +2 -2
  17. package/3rdparty/walkontable/src/index.js +10 -2
  18. package/3rdparty/walkontable/src/index.mjs +2 -2
  19. package/3rdparty/walkontable/src/overlay/_base.js +13 -2
  20. package/3rdparty/walkontable/src/overlay/_base.mjs +14 -3
  21. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
  22. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
  23. package/3rdparty/walkontable/src/overlay/top.js +2 -6
  24. package/3rdparty/walkontable/src/overlay/top.mjs +2 -6
  25. package/3rdparty/walkontable/src/renderer/cells.js +10 -0
  26. package/3rdparty/walkontable/src/renderer/cells.mjs +11 -1
  27. package/3rdparty/walkontable/src/renderer/columnHeaders.js +10 -0
  28. package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +11 -1
  29. package/3rdparty/walkontable/src/renderer/rowHeaders.js +5 -0
  30. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +5 -0
  31. package/3rdparty/walkontable/src/renderer/rows.js +13 -0
  32. package/3rdparty/walkontable/src/renderer/rows.mjs +13 -0
  33. package/3rdparty/walkontable/src/renderer/table.js +9 -0
  34. package/3rdparty/walkontable/src/renderer/table.mjs +9 -0
  35. package/3rdparty/walkontable/src/scroll.js +2 -0
  36. package/3rdparty/walkontable/src/scroll.mjs +2 -0
  37. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +7 -12
  38. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  39. package/3rdparty/walkontable/src/selection/border/constants.js +16 -0
  40. package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
  41. package/3rdparty/walkontable/src/selection/constants.js +62 -0
  42. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  43. package/3rdparty/walkontable/src/selection/index.js +26 -0
  44. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  45. package/3rdparty/walkontable/src/selection/manager.js +274 -0
  46. package/3rdparty/walkontable/src/selection/manager.mjs +269 -0
  47. package/3rdparty/walkontable/src/selection/scanner.js +270 -0
  48. package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
  49. package/3rdparty/walkontable/src/selection/selection.js +101 -0
  50. package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
  51. package/3rdparty/walkontable/src/settings.js +13 -4
  52. package/3rdparty/walkontable/src/settings.mjs +13 -4
  53. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
  54. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  55. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
  56. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  57. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
  58. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  59. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
  60. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  61. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
  62. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  63. package/3rdparty/walkontable/src/table.js +19 -78
  64. package/3rdparty/walkontable/src/table.mjs +20 -79
  65. package/base.js +2 -2
  66. package/base.mjs +2 -2
  67. package/cellTypes/dateType/dateType.d.ts +3 -3
  68. package/cellTypes/dateType/dateType.js +2 -2
  69. package/cellTypes/dateType/dateType.mjs +2 -2
  70. package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
  71. package/cellTypes/handsontableType/handsontableType.js +2 -2
  72. package/cellTypes/handsontableType/handsontableType.mjs +2 -2
  73. package/cellTypes/index.d.ts +3 -0
  74. package/cellTypes/index.js +4 -0
  75. package/cellTypes/index.mjs +3 -1
  76. package/cellTypes/selectType/index.d.ts +1 -0
  77. package/cellTypes/selectType/index.js +6 -0
  78. package/cellTypes/selectType/index.mjs +1 -0
  79. package/cellTypes/selectType/selectType.d.ts +14 -0
  80. package/cellTypes/selectType/selectType.js +13 -0
  81. package/cellTypes/selectType/selectType.mjs +8 -0
  82. package/core/focusCatcher/focusDetector.js +63 -0
  83. package/core/focusCatcher/focusDetector.mjs +59 -0
  84. package/core/focusCatcher/index.js +142 -0
  85. package/core/focusCatcher/index.mjs +138 -0
  86. package/core/index.js +9 -0
  87. package/core/index.mjs +1 -0
  88. package/core.d.ts +9 -4
  89. package/core.js +285 -327
  90. package/core.mjs +285 -327
  91. package/dataMap/metaManager/metaSchema.js +65 -0
  92. package/dataMap/metaManager/metaSchema.mjs +65 -0
  93. package/dataMap/metaManager/mods/extendMetaProperties.js +7 -1
  94. package/dataMap/metaManager/mods/extendMetaProperties.mjs +7 -1
  95. package/dataMap/replaceData.js +5 -0
  96. package/dataMap/replaceData.mjs +5 -0
  97. package/dist/handsontable.css +51 -15
  98. package/dist/handsontable.full.css +51 -15
  99. package/dist/handsontable.full.js +13360 -7840
  100. package/dist/handsontable.full.min.css +7 -7
  101. package/dist/handsontable.full.min.js +136 -136
  102. package/dist/handsontable.js +20955 -15435
  103. package/dist/handsontable.min.css +6 -6
  104. package/dist/handsontable.min.js +24 -24
  105. package/dist/languages/all.js +6 -2
  106. package/dist/languages/all.min.js +1 -1
  107. package/dist/languages/en-US.js +3 -1
  108. package/dist/languages/en-US.min.js +1 -1
  109. package/dist/languages/pl-PL.js +3 -1
  110. package/dist/languages/pl-PL.min.js +1 -1
  111. package/editorManager.js +15 -87
  112. package/editorManager.mjs +16 -87
  113. package/editors/autocompleteEditor/autocompleteEditor.js +53 -2
  114. package/editors/autocompleteEditor/autocompleteEditor.mjs +54 -3
  115. package/editors/dateEditor/dateEditor.js +26 -7
  116. package/editors/dateEditor/dateEditor.mjs +27 -8
  117. package/editors/handsontableEditor/handsontableEditor.js +9 -1
  118. package/editors/handsontableEditor/handsontableEditor.mjs +10 -2
  119. package/editors/textEditor/textEditor.js +19 -27
  120. package/editors/textEditor/textEditor.mjs +22 -30
  121. package/focusManager.d.ts +12 -0
  122. package/focusManager.js +265 -0
  123. package/focusManager.mjs +261 -0
  124. package/helpers/a11y.js +79 -0
  125. package/helpers/a11y.mjs +38 -0
  126. package/helpers/dom/element.js +188 -9
  127. package/helpers/dom/element.mjs +182 -9
  128. package/helpers/mixed.js +1 -1
  129. package/helpers/mixed.mjs +1 -1
  130. package/helpers/number.d.ts +1 -0
  131. package/helpers/number.js +18 -0
  132. package/helpers/number.mjs +17 -0
  133. package/i18n/constants.js +7 -1
  134. package/i18n/constants.mjs +4 -1
  135. package/i18n/languages/en-US.js +3 -1
  136. package/i18n/languages/en-US.mjs +3 -1
  137. package/i18n/languages/pl-PL.js +3 -1
  138. package/i18n/languages/pl-PL.mjs +3 -1
  139. package/languages/all.js +6 -2
  140. package/languages/en-US.js +3 -1
  141. package/languages/en-US.mjs +3 -1
  142. package/languages/index.js +6 -2
  143. package/languages/pl-PL.js +3 -1
  144. package/languages/pl-PL.mjs +3 -1
  145. package/package.json +21 -1
  146. package/pluginHooks.d.ts +12 -1
  147. package/pluginHooks.js +152 -1
  148. package/pluginHooks.mjs +152 -1
  149. package/plugins/collapsibleColumns/collapsibleColumns.js +74 -4
  150. package/plugins/collapsibleColumns/collapsibleColumns.mjs +75 -5
  151. package/plugins/columnSorting/columnSorting.js +43 -0
  152. package/plugins/columnSorting/columnSorting.mjs +44 -3
  153. package/plugins/columnSorting/index.js +3 -1
  154. package/plugins/columnSorting/index.mjs +1 -1
  155. package/plugins/comments/commentEditor.js +1 -0
  156. package/plugins/comments/commentEditor.mjs +1 -0
  157. package/plugins/comments/comments.js +252 -189
  158. package/plugins/comments/comments.mjs +251 -190
  159. package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
  160. package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
  161. package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
  162. package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
  163. package/plugins/comments/contextMenuItem/removeComment.js +38 -0
  164. package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
  165. package/plugins/contextMenu/commandExecutor.js +2 -3
  166. package/plugins/contextMenu/commandExecutor.mjs +2 -3
  167. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  168. package/plugins/contextMenu/contextMenu.js +75 -36
  169. package/plugins/contextMenu/contextMenu.mjs +74 -35
  170. package/plugins/contextMenu/itemsFactory.js +2 -3
  171. package/plugins/contextMenu/itemsFactory.mjs +3 -4
  172. package/plugins/contextMenu/{cursor.mjs → menu/cursor.js} +6 -4
  173. package/plugins/contextMenu/{cursor.js → menu/cursor.mjs} +4 -10
  174. package/plugins/contextMenu/menu/defaultShortcutsList.js +88 -0
  175. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
  176. package/plugins/contextMenu/menu/index.js +9 -0
  177. package/plugins/contextMenu/menu/index.mjs +1 -0
  178. package/plugins/contextMenu/{menu.js → menu/menu.js} +145 -421
  179. package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +146 -422
  180. package/plugins/contextMenu/menu/menuItemRenderer.js +58 -0
  181. package/plugins/contextMenu/menu/menuItemRenderer.mjs +54 -0
  182. package/plugins/contextMenu/menu/navigator.js +27 -0
  183. package/plugins/contextMenu/menu/navigator.mjs +23 -0
  184. package/plugins/contextMenu/menu/positioner.js +213 -0
  185. package/plugins/contextMenu/menu/positioner.mjs +209 -0
  186. package/plugins/contextMenu/menu/shortcuts.js +114 -0
  187. package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
  188. package/plugins/contextMenu/menu/utils.js +177 -0
  189. package/plugins/contextMenu/menu/utils.mjs +163 -0
  190. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  191. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  192. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  193. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  194. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  195. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  196. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  197. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  198. package/plugins/contextMenu/{predefinedItems.js → predefinedItems/index.js} +14 -14
  199. package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
  200. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  201. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  202. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  203. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  204. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  205. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  206. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  207. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  208. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  209. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  210. package/plugins/contextMenu/utils.js +35 -151
  211. package/plugins/contextMenu/utils.mjs +35 -144
  212. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  213. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  214. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  215. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  216. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  217. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  218. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  219. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  220. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  221. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  222. package/plugins/copyPaste/copyPaste.js +127 -78
  223. package/plugins/copyPaste/copyPaste.mjs +128 -79
  224. package/plugins/customBorders/customBorders.js +23 -20
  225. package/plugins/customBorders/customBorders.mjs +24 -21
  226. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  227. package/plugins/dropdownMenu/dropdownMenu.js +127 -40
  228. package/plugins/dropdownMenu/dropdownMenu.mjs +126 -39
  229. package/plugins/filters/component/_base.js +23 -8
  230. package/plugins/filters/component/_base.mjs +23 -8
  231. package/plugins/filters/component/actionBar.js +29 -27
  232. package/plugins/filters/component/actionBar.mjs +26 -23
  233. package/plugins/filters/component/condition.js +46 -59
  234. package/plugins/filters/component/condition.mjs +40 -52
  235. package/plugins/filters/component/operators.js +21 -22
  236. package/plugins/filters/component/operators.mjs +18 -18
  237. package/plugins/filters/component/value.js +35 -26
  238. package/plugins/filters/component/value.mjs +32 -22
  239. package/plugins/filters/constants.mjs +1 -1
  240. package/plugins/filters/filters.js +106 -62
  241. package/plugins/filters/filters.mjs +99 -55
  242. package/plugins/filters/menu/focusController.js +123 -0
  243. package/plugins/filters/menu/focusController.mjs +119 -0
  244. package/plugins/filters/menu/focusNavigator.js +30 -0
  245. package/plugins/filters/menu/focusNavigator.mjs +26 -0
  246. package/plugins/filters/ui/_base.js +35 -13
  247. package/plugins/filters/ui/_base.mjs +35 -13
  248. package/plugins/filters/ui/input.js +43 -32
  249. package/plugins/filters/ui/input.mjs +42 -30
  250. package/plugins/filters/ui/link.js +44 -12
  251. package/plugins/filters/ui/link.mjs +44 -11
  252. package/plugins/filters/ui/multipleSelect.js +234 -129
  253. package/plugins/filters/ui/multipleSelect.mjs +232 -127
  254. package/plugins/filters/ui/radioInput.js +42 -18
  255. package/plugins/filters/ui/radioInput.mjs +42 -17
  256. package/plugins/filters/ui/select.js +144 -75
  257. package/plugins/filters/ui/select.mjs +142 -72
  258. package/plugins/hiddenColumns/hiddenColumns.mjs +1 -1
  259. package/plugins/hiddenRows/hiddenRows.mjs +1 -1
  260. package/plugins/manualColumnMove/manualColumnMove.js +3 -1
  261. package/plugins/manualColumnMove/manualColumnMove.mjs +3 -1
  262. package/plugins/mergeCells/mergeCells.js +5 -16
  263. package/plugins/mergeCells/mergeCells.mjs +5 -16
  264. package/plugins/multiColumnSorting/multiColumnSorting.js +37 -2
  265. package/plugins/multiColumnSorting/multiColumnSorting.mjs +37 -2
  266. package/plugins/nestedHeaders/nestedHeaders.js +240 -10
  267. package/plugins/nestedHeaders/nestedHeaders.mjs +241 -11
  268. package/plugins/nestedHeaders/stateManager/index.js +102 -3
  269. package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
  270. package/plugins/nestedRows/nestedRows.js +41 -0
  271. package/plugins/nestedRows/nestedRows.mjs +41 -0
  272. package/plugins/nestedRows/ui/headers.js +11 -0
  273. package/plugins/nestedRows/ui/headers.mjs +12 -1
  274. package/renderers/autocompleteRenderer/autocompleteRenderer.js +8 -0
  275. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
  276. package/renderers/baseRenderer/baseRenderer.js +17 -0
  277. package/renderers/baseRenderer/baseRenderer.mjs +18 -1
  278. package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
  279. package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
  280. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  281. package/renderers/dateRenderer/dateRenderer.js +29 -0
  282. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  283. package/renderers/dateRenderer/index.d.ts +1 -0
  284. package/renderers/dateRenderer/index.js +6 -0
  285. package/renderers/dateRenderer/index.mjs +1 -0
  286. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  287. package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
  288. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  289. package/renderers/handsontableRenderer/index.d.ts +1 -0
  290. package/renderers/handsontableRenderer/index.js +6 -0
  291. package/renderers/handsontableRenderer/index.mjs +1 -0
  292. package/renderers/index.d.ts +9 -0
  293. package/renderers/selectRenderer/index.d.ts +1 -0
  294. package/renderers/selectRenderer/index.js +6 -0
  295. package/renderers/selectRenderer/index.mjs +1 -0
  296. package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
  297. package/renderers/selectRenderer/selectRenderer.js +27 -0
  298. package/renderers/selectRenderer/selectRenderer.mjs +22 -0
  299. package/selection/highlight/highlight.js +256 -71
  300. package/selection/highlight/highlight.mjs +250 -71
  301. package/selection/highlight/types/activeHeader.js +10 -8
  302. package/selection/highlight/types/activeHeader.mjs +10 -8
  303. package/selection/highlight/types/area.js +6 -18
  304. package/selection/highlight/types/area.mjs +6 -18
  305. package/selection/highlight/types/areaLayered.js +31 -0
  306. package/selection/highlight/types/areaLayered.mjs +26 -0
  307. package/selection/highlight/types/column.js +27 -0
  308. package/selection/highlight/types/column.mjs +22 -0
  309. package/selection/highlight/types/customSelection.js +7 -9
  310. package/selection/highlight/types/customSelection.mjs +7 -9
  311. package/selection/highlight/types/fill.js +5 -7
  312. package/selection/highlight/types/fill.mjs +5 -7
  313. package/selection/highlight/types/{cell.js → focus.js} +5 -7
  314. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  315. package/selection/highlight/types/header.js +9 -18
  316. package/selection/highlight/types/header.mjs +9 -18
  317. package/selection/highlight/types/row.js +27 -0
  318. package/selection/highlight/types/row.mjs +22 -0
  319. package/selection/highlight/visualSelection.js +31 -27
  320. package/selection/highlight/visualSelection.mjs +31 -27
  321. package/selection/index.js +4 -7
  322. package/selection/index.mjs +2 -3
  323. package/selection/mouseEventHandler.js +7 -1
  324. package/selection/mouseEventHandler.mjs +7 -1
  325. package/selection/range.js +8 -8
  326. package/selection/range.mjs +8 -8
  327. package/selection/selection.js +321 -152
  328. package/selection/selection.mjs +318 -151
  329. package/selection/transformation.js +232 -90
  330. package/selection/transformation.mjs +232 -90
  331. package/selection/utils.js +15 -21
  332. package/selection/utils.mjs +16 -21
  333. package/settings.d.ts +4 -0
  334. package/shortcutContexts/commands/editor/closeAndSave.js +12 -0
  335. package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
  336. package/shortcutContexts/commands/editor/closeWithoutSaving.js +12 -0
  337. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  338. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  339. package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
  340. package/shortcutContexts/commands/editor/index.js +16 -0
  341. package/shortcutContexts/commands/editor/index.mjs +12 -0
  342. package/shortcutContexts/commands/editor/open.js +27 -0
  343. package/shortcutContexts/commands/editor/open.mjs +23 -0
  344. package/shortcutContexts/commands/emptySelectedCells.js +11 -0
  345. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  346. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  347. package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
  348. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +25 -0
  349. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
  350. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  351. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  352. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  353. package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
  354. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  355. package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
  356. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  357. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
  358. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +29 -0
  359. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
  360. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +19 -0
  361. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
  362. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +19 -0
  363. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
  364. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +29 -0
  365. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
  366. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +29 -0
  367. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
  368. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +29 -0
  369. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
  370. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  371. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
  372. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  373. package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
  374. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +25 -0
  375. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
  376. package/shortcutContexts/commands/index.js +35 -0
  377. package/shortcutContexts/commands/index.mjs +31 -0
  378. package/shortcutContexts/commands/moveCellSelection/down.js +13 -0
  379. package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
  380. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +33 -0
  381. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
  382. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  383. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  384. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +12 -0
  385. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  386. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +12 -0
  387. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  388. package/shortcutContexts/commands/moveCellSelection/left.js +10 -0
  389. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  390. package/shortcutContexts/commands/moveCellSelection/right.js +10 -0
  391. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  392. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +17 -0
  393. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
  394. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +18 -0
  395. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
  396. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +14 -0
  397. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
  398. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +17 -0
  399. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
  400. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +19 -0
  401. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
  402. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +21 -0
  403. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
  404. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +17 -0
  405. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
  406. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +19 -0
  407. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
  408. package/shortcutContexts/commands/moveCellSelection/up.js +13 -0
  409. package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
  410. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +33 -0
  411. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
  412. package/shortcutContexts/commands/populateSelectedCellsData.js +29 -0
  413. package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
  414. package/shortcutContexts/commands/scrollToFocusedCell.js +35 -0
  415. package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
  416. package/shortcutContexts/commands/selectAll.js +12 -0
  417. package/shortcutContexts/commands/selectAll.mjs +8 -0
  418. package/shortcutContexts/constants.js +13 -0
  419. package/shortcutContexts/constants.mjs +8 -0
  420. package/shortcutContexts/editor.js +25 -0
  421. package/shortcutContexts/editor.mjs +21 -0
  422. package/shortcutContexts/grid.js +163 -0
  423. package/shortcutContexts/grid.mjs +159 -0
  424. package/shortcutContexts/index.js +24 -0
  425. package/shortcutContexts/index.mjs +11 -0
  426. package/shortcuts/context.js +23 -4
  427. package/shortcuts/context.mjs +23 -5
  428. package/shortcuts/manager.js +25 -7
  429. package/shortcuts/manager.mjs +26 -7
  430. package/shortcuts/recorder.js +3 -3
  431. package/shortcuts/recorder.mjs +3 -3
  432. package/shortcuts/utils.js +19 -5
  433. package/shortcuts/utils.mjs +18 -4
  434. package/tableView.js +111 -13
  435. package/tableView.mjs +112 -14
  436. package/utils/paginator.js +151 -0
  437. package/utils/paginator.mjs +147 -0
  438. package/3rdparty/walkontable/src/selection.js +0 -295
  439. package/3rdparty/walkontable/src/selection.mjs +0 -290
  440. package/plugins/contextMenu/predefinedItems.mjs +0 -68
  441. package/plugins/copyPaste/focusableElement.js +0 -186
  442. package/plugins/copyPaste/focusableElement.mjs +0 -180
  443. package/selection/highlight/constants.js +0 -15
  444. package/selection/highlight/constants.mjs +0 -6
  445. package/selection/highlight/types/index.js +0 -35
  446. package/selection/highlight/types/index.mjs +0 -31
package/tableView.mjs CHANGED
@@ -10,12 +10,13 @@ function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) {
10
10
  function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
11
11
  function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
12
12
  function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
13
- import { addClass, clearTextSelection, empty, fastInnerHTML, fastInnerText, getScrollbarWidth, hasClass, isChildOf, isInput, isOutsideInput, isVisible } from "./helpers/dom/element.mjs";
13
+ import { addClass, clearTextSelection, empty, fastInnerHTML, fastInnerText, getScrollbarWidth, hasClass, isChildOf, isInput, isOutsideInput, isVisible, setAttribute } from "./helpers/dom/element.mjs";
14
14
  import EventManager from "./eventManager.mjs";
15
15
  import { isImmediatePropagationStopped, isRightClick, isLeftClick } from "./helpers/dom/event.mjs";
16
16
  import Walkontable from "./3rdparty/walkontable/src/index.mjs";
17
17
  import { handleMouseEvent } from "./selection/mouseEventHandler.mjs";
18
18
  import { isRootInstance } from "./utils/rootInstance.mjs";
19
+ import { A11Y_COLCOUNT, A11Y_MULTISELECTABLE, A11Y_PRESENTATION, A11Y_ROWCOUNT, A11Y_TREEGRID } from "./helpers/a11y.mjs";
19
20
  const privatePool = new WeakMap();
20
21
 
21
22
  /**
@@ -255,6 +256,10 @@ class TableView {
255
256
  if (this.instance.getSettings().tableClassName) {
256
257
  addClass(priv.table, this.instance.getSettings().tableClassName);
257
258
  }
259
+ if (this.settings.ariaTags) {
260
+ setAttribute(priv.table, [A11Y_PRESENTATION()]);
261
+ setAttribute(rootElement, [A11Y_TREEGRID(), A11Y_ROWCOUNT(this.instance.countRows()), A11Y_COLCOUNT(this.instance.countCols()), A11Y_MULTISELECTABLE()]);
262
+ }
258
263
  this.THEAD = rootDocument.createElement('THEAD');
259
264
  priv.table.appendChild(this.THEAD);
260
265
  this.TBODY = rootDocument.createElement('TBODY');
@@ -308,11 +313,14 @@ class TableView {
308
313
  });
309
314
  this.eventManager.addEventListener(documentElement, 'mouseup', event => {
310
315
  if (selection.isInProgress() && isLeftClick(event)) {
311
- // is left mouse button
312
316
  selection.finish();
313
317
  }
314
318
  priv.mouseDown = false;
315
- if (isOutsideInput(rootDocument.activeElement) || !selection.isSelected() && !selection.isSelectedByAnyHeader() && !rootElement.contains(event.target) && !isRightClick(event)) {
319
+ const isOutsideInputElement = isOutsideInput(rootDocument.activeElement);
320
+ if (!isOutsideInputElement) {
321
+ return;
322
+ }
323
+ if (isOutsideInputElement || !selection.isSelected() && !selection.isSelectedByAnyHeader() && !rootElement.contains(event.target) && !isRightClick(event)) {
316
324
  this.instance.unlisten();
317
325
  }
318
326
  });
@@ -546,6 +554,40 @@ class TableView {
546
554
  return this.countNotHiddenRowIndexes(visualFixedRowsBottom, 1);
547
555
  }
548
556
 
557
+ /**
558
+ * The function returns the number of renderable column indexes within the passed range of the visual indexes.
559
+ *
560
+ * @param {number} columnStart The column visual start index.
561
+ * @param {number} columnEnd The column visual end index.
562
+ * @returns {number}
563
+ */
564
+ countRenderableColumnsInRange(columnStart, columnEnd) {
565
+ let count = 0;
566
+ for (let column = columnStart; column <= columnEnd; column++) {
567
+ if (this.instance.columnIndexMapper.getRenderableFromVisualIndex(column) !== null) {
568
+ count += 1;
569
+ }
570
+ }
571
+ return count;
572
+ }
573
+
574
+ /**
575
+ * The function returns the number of renderable row indexes within the passed range of the visual indexes.
576
+ *
577
+ * @param {number} rowStart The row visual start index.
578
+ * @param {number} rowEnd The row visual end index.
579
+ * @returns {number}
580
+ */
581
+ countRenderableRowsInRange(rowStart, rowEnd) {
582
+ let count = 0;
583
+ for (let row = rowStart; row <= rowEnd; row++) {
584
+ if (this.instance.rowIndexMapper.getRenderableFromVisualIndex(row) !== null) {
585
+ count += 1;
586
+ }
587
+ }
588
+ return count;
589
+ }
590
+
549
591
  /**
550
592
  * Checks if at least one cell than belongs to the main table is not covered by the top, left or
551
593
  * bottom overlay.
@@ -566,6 +608,7 @@ class TableView {
566
608
  initializeWalkontable() {
567
609
  const priv = privatePool.get(this);
568
610
  const walkontableConfig = {
611
+ ariaTags: this.settings.ariaTags,
569
612
  rtlMode: this.instance.isRtl(),
570
613
  externalRowCalculator: this.instance.getPlugin('autoRowSize') && this.instance.getPlugin('autoRowSize').isEnabled(),
571
614
  table: priv.table,
@@ -765,20 +808,78 @@ class TableView {
765
808
  },
766
809
  beforeDraw: (force, skipRender) => this.beforeRender(force, skipRender),
767
810
  onDraw: force => this.afterRender(force),
768
- onScrollVertically: () => this.instance.runHooks('afterScrollVertically'),
769
- onScrollHorizontally: () => this.instance.runHooks('afterScrollHorizontally'),
811
+ onBeforeViewportScrollVertically: renderableRow => {
812
+ const rowMapper = this.instance.rowIndexMapper;
813
+ const areColumnHeadersSelected = renderableRow < 0;
814
+ let visualRow = renderableRow;
815
+ if (!areColumnHeadersSelected) {
816
+ visualRow = rowMapper.getVisualFromRenderableIndex(renderableRow);
817
+
818
+ // for an empty data return index as is
819
+ if (visualRow === null) {
820
+ return renderableRow;
821
+ }
822
+ }
823
+ visualRow = this.instance.runHooks('beforeViewportScrollVertically', visualRow);
824
+ this.instance.runHooks('beforeViewportScroll');
825
+ if (!areColumnHeadersSelected) {
826
+ return rowMapper.getRenderableFromVisualIndex(visualRow);
827
+ }
828
+ return visualRow;
829
+ },
830
+ onBeforeViewportScrollHorizontally: renderableColumn => {
831
+ const columnMapper = this.instance.columnIndexMapper;
832
+ const areRowHeadersSelected = renderableColumn < 0;
833
+ let visualColumn = renderableColumn;
834
+ if (!areRowHeadersSelected) {
835
+ visualColumn = columnMapper.getVisualFromRenderableIndex(renderableColumn);
836
+
837
+ // for an empty data return index as is
838
+ if (visualColumn === null) {
839
+ return renderableColumn;
840
+ }
841
+ }
842
+ visualColumn = this.instance.runHooks('beforeViewportScrollHorizontally', visualColumn);
843
+ this.instance.runHooks('beforeViewportScroll');
844
+ if (!areRowHeadersSelected) {
845
+ return columnMapper.getRenderableFromVisualIndex(visualColumn);
846
+ }
847
+ return visualColumn;
848
+ },
849
+ onScrollVertically: () => {
850
+ this.instance.runHooks('afterScrollVertically');
851
+ this.instance.runHooks('afterScroll');
852
+ },
853
+ onScrollHorizontally: () => {
854
+ this.instance.runHooks('afterScrollHorizontally');
855
+ this.instance.runHooks('afterScroll');
856
+ },
770
857
  onBeforeRemoveCellClassNames: () => this.instance.runHooks('beforeRemoveCellClassNames'),
771
858
  onBeforeHighlightingRowHeader: (renderableRow, headerLevel, highlightMeta) => {
772
859
  const rowMapper = this.instance.rowIndexMapper;
773
- const visualRow = rowMapper.getVisualFromRenderableIndex(renderableRow);
860
+ const areColumnHeadersSelected = renderableRow < 0;
861
+ let visualRow = renderableRow;
862
+ if (!areColumnHeadersSelected) {
863
+ visualRow = rowMapper.getVisualFromRenderableIndex(renderableRow);
864
+ }
774
865
  const newVisualRow = this.instance.runHooks('beforeHighlightingRowHeader', visualRow, headerLevel, highlightMeta);
775
- return rowMapper.getRenderableFromVisualIndex(rowMapper.getNearestNotHiddenIndex(newVisualRow, 1));
866
+ if (!areColumnHeadersSelected) {
867
+ return rowMapper.getRenderableFromVisualIndex(rowMapper.getNearestNotHiddenIndex(newVisualRow, 1));
868
+ }
869
+ return newVisualRow;
776
870
  },
777
871
  onBeforeHighlightingColumnHeader: (renderableColumn, headerLevel, highlightMeta) => {
778
872
  const columnMapper = this.instance.columnIndexMapper;
779
- const visualColumn = columnMapper.getVisualFromRenderableIndex(renderableColumn);
873
+ const areRowHeadersSelected = renderableColumn < 0;
874
+ let visualColumn = renderableColumn;
875
+ if (!areRowHeadersSelected) {
876
+ visualColumn = columnMapper.getVisualFromRenderableIndex(renderableColumn);
877
+ }
780
878
  const newVisualColumn = this.instance.runHooks('beforeHighlightingColumnHeader', visualColumn, headerLevel, highlightMeta);
781
- return columnMapper.getRenderableFromVisualIndex(columnMapper.getNearestNotHiddenIndex(newVisualColumn, 1));
879
+ if (!areRowHeadersSelected) {
880
+ return columnMapper.getRenderableFromVisualIndex(columnMapper.getNearestNotHiddenIndex(newVisualColumn, 1));
881
+ }
882
+ return newVisualColumn;
782
883
  },
783
884
  onAfterDrawSelection: (currentRow, currentColumn, layerLevel) => {
784
885
  let cornersOfSelection;
@@ -786,10 +887,7 @@ class TableView {
786
887
  const selectedRange = this.instance.selection.getSelectedRange();
787
888
  const selectionRangeSize = selectedRange.size();
788
889
  if (selectionRangeSize > 0) {
789
- // Selection layers are stored from the "oldest" to the "newest". We should calculate the offset.
790
- // Please look at the `SelectedRange` class and it's method for getting selection's layer for more information.
791
- const selectionOffset = (layerLevel !== null && layerLevel !== void 0 ? layerLevel : 0) + 1 - selectionRangeSize;
792
- const selectionForLayer = selectedRange.peekByIndex(selectionOffset);
890
+ const selectionForLayer = selectedRange.peekByIndex(layerLevel !== null && layerLevel !== void 0 ? layerLevel : 0);
793
891
  cornersOfSelection = [selectionForLayer.from.row, selectionForLayer.from.col, selectionForLayer.to.row, selectionForLayer.to.col];
794
892
  }
795
893
  return this.instance.runHooks('afterDrawSelection', visualRowIndex, visualColumnIndex, cornersOfSelection, layerLevel);
@@ -942,7 +1040,7 @@ class TableView {
942
1040
  */
943
1041
  isSelectedOnlyCell() {
944
1042
  var _this$instance$getSel, _this$instance$getSel2;
945
- return (_this$instance$getSel = (_this$instance$getSel2 = this.instance.getSelectedRangeLast()) === null || _this$instance$getSel2 === void 0 ? void 0 : _this$instance$getSel2.isSingle()) !== null && _this$instance$getSel !== void 0 ? _this$instance$getSel : false;
1043
+ return (_this$instance$getSel = (_this$instance$getSel2 = this.instance.getSelectedRangeLast()) === null || _this$instance$getSel2 === void 0 ? void 0 : _this$instance$getSel2.isSingleCell()) !== null && _this$instance$getSel !== void 0 ? _this$instance$getSel : false;
946
1044
  }
947
1045
 
948
1046
  /**
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.createPaginator = createPaginator;
5
+ var _number = require("../helpers/number");
6
+ /**
7
+ * @typedef Paginator
8
+ * @property {function(number): void} setCurrentPage Sets the current index to the specific page.
9
+ * @property {function(): number} getCurrentPage Gets the current page.
10
+ * @property {function(): number} getSize Gets the total number of pages.
11
+ * @property {function(): void} toFirstItem Move the index to the first page.
12
+ * @property {function(): void} toLastItem Move the index to the last page.
13
+ * @property {function(): void} toNextItem Move the index to the next page.
14
+ * @property {function(): void} toPreviousItem Move the index to the previous page.
15
+ * @property {function(): void} clear Clear the internal state of the paginator.
16
+ */
17
+ /**
18
+ * @param {object} options Paginator options.
19
+ * @param {number} [options.initialPage] Initial index from which paging starts. Also, after clearing the paginator
20
+ * the page is cleared to the initial page.
21
+ * @param {function(): number} [options.size] Sets the max size of the pages.
22
+ * @param {function(number): boolean | void} [options.onItemSelect] Fires the function on each page change.
23
+ * @param {function(): void} [options.onClear] Fires the function after clearing the state.
24
+ * @returns {Paginator}
25
+ */
26
+ function createPaginator(_ref) {
27
+ let {
28
+ initialPage = -1,
29
+ size = () => 0,
30
+ onItemSelect = () => {},
31
+ onClear = () => {}
32
+ } = _ref;
33
+ const visitedPages = new Set();
34
+ let currentIndex = (0, _number.clamp)(initialPage, -1, getSize() - 1);
35
+
36
+ /**
37
+ * Updates the internal state of the paginator.
38
+ *
39
+ * @param {number} newIndex The page index to switch.
40
+ * @param {-1|1} direction The direction of traversing the pages in case when they are disabled.
41
+ * @returns {number} Returns the final index of the page.
42
+ */
43
+ function _updateState(newIndex, direction) {
44
+ const lastIndex = getSize() - 1;
45
+ if (newIndex < 0) {
46
+ newIndex = lastIndex;
47
+ }
48
+ if (newIndex > lastIndex) {
49
+ newIndex = 0;
50
+ }
51
+ if (visitedPages.has(newIndex)) {
52
+ return -1;
53
+ }
54
+ visitedPages.add(newIndex);
55
+ const changeProceed = onItemSelect(newIndex, false);
56
+ if (changeProceed === false) {
57
+ newIndex = _updateState(direction === 1 ? ++newIndex : --newIndex,
58
+ // eslint-disable-line no-plusplus
59
+ direction);
60
+ }
61
+ return newIndex;
62
+ }
63
+
64
+ /**
65
+ * Sets the page index as current one.
66
+ *
67
+ * @param {number} index The index to set.
68
+ */
69
+ function setCurrentPage(index) {
70
+ if (index > -1 && index < getSize() && onItemSelect(index, true) !== false) {
71
+ currentIndex = index;
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Gets the current page.
77
+ *
78
+ * @returns {number}
79
+ */
80
+ function getCurrentPage() {
81
+ return currentIndex;
82
+ }
83
+
84
+ /**
85
+ * Moves the index to the first page.
86
+ */
87
+ function toFirstItem() {
88
+ if (getSize() > 0) {
89
+ visitedPages.clear();
90
+ currentIndex = _updateState(0, 1);
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Moves the index to the last page.
96
+ */
97
+ function toLastItem() {
98
+ if (getSize() > 0) {
99
+ visitedPages.clear();
100
+ currentIndex = _updateState(getSize() - 1, -1);
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Moves the index to the next page.
106
+ */
107
+ function toNextItem() {
108
+ if (getSize() > 0) {
109
+ visitedPages.clear();
110
+ currentIndex = _updateState(++currentIndex, 1); // eslint-disable-line no-plusplus
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Moves the index to the previous page.
116
+ */
117
+ function toPreviousItem() {
118
+ if (getSize() > 0) {
119
+ visitedPages.clear();
120
+ currentIndex = _updateState(--currentIndex, -1); // eslint-disable-line no-plusplus
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Gets the total number of pages.
126
+ *
127
+ * @returns {number}
128
+ */
129
+ function getSize() {
130
+ return Math.max(size(), 0);
131
+ }
132
+
133
+ /**
134
+ * Clears the internal state of the paginator.
135
+ */
136
+ function clear() {
137
+ visitedPages.clear();
138
+ currentIndex = initialPage;
139
+ onClear();
140
+ }
141
+ return {
142
+ setCurrentPage,
143
+ getCurrentPage,
144
+ toFirstItem,
145
+ toLastItem,
146
+ toNextItem,
147
+ toPreviousItem,
148
+ getSize,
149
+ clear
150
+ };
151
+ }
@@ -0,0 +1,147 @@
1
+ import { clamp } from "../helpers/number.mjs";
2
+ /**
3
+ * @typedef Paginator
4
+ * @property {function(number): void} setCurrentPage Sets the current index to the specific page.
5
+ * @property {function(): number} getCurrentPage Gets the current page.
6
+ * @property {function(): number} getSize Gets the total number of pages.
7
+ * @property {function(): void} toFirstItem Move the index to the first page.
8
+ * @property {function(): void} toLastItem Move the index to the last page.
9
+ * @property {function(): void} toNextItem Move the index to the next page.
10
+ * @property {function(): void} toPreviousItem Move the index to the previous page.
11
+ * @property {function(): void} clear Clear the internal state of the paginator.
12
+ */
13
+ /**
14
+ * @param {object} options Paginator options.
15
+ * @param {number} [options.initialPage] Initial index from which paging starts. Also, after clearing the paginator
16
+ * the page is cleared to the initial page.
17
+ * @param {function(): number} [options.size] Sets the max size of the pages.
18
+ * @param {function(number): boolean | void} [options.onItemSelect] Fires the function on each page change.
19
+ * @param {function(): void} [options.onClear] Fires the function after clearing the state.
20
+ * @returns {Paginator}
21
+ */
22
+ export function createPaginator(_ref) {
23
+ let {
24
+ initialPage = -1,
25
+ size = () => 0,
26
+ onItemSelect = () => {},
27
+ onClear = () => {}
28
+ } = _ref;
29
+ const visitedPages = new Set();
30
+ let currentIndex = clamp(initialPage, -1, getSize() - 1);
31
+
32
+ /**
33
+ * Updates the internal state of the paginator.
34
+ *
35
+ * @param {number} newIndex The page index to switch.
36
+ * @param {-1|1} direction The direction of traversing the pages in case when they are disabled.
37
+ * @returns {number} Returns the final index of the page.
38
+ */
39
+ function _updateState(newIndex, direction) {
40
+ const lastIndex = getSize() - 1;
41
+ if (newIndex < 0) {
42
+ newIndex = lastIndex;
43
+ }
44
+ if (newIndex > lastIndex) {
45
+ newIndex = 0;
46
+ }
47
+ if (visitedPages.has(newIndex)) {
48
+ return -1;
49
+ }
50
+ visitedPages.add(newIndex);
51
+ const changeProceed = onItemSelect(newIndex, false);
52
+ if (changeProceed === false) {
53
+ newIndex = _updateState(direction === 1 ? ++newIndex : --newIndex,
54
+ // eslint-disable-line no-plusplus
55
+ direction);
56
+ }
57
+ return newIndex;
58
+ }
59
+
60
+ /**
61
+ * Sets the page index as current one.
62
+ *
63
+ * @param {number} index The index to set.
64
+ */
65
+ function setCurrentPage(index) {
66
+ if (index > -1 && index < getSize() && onItemSelect(index, true) !== false) {
67
+ currentIndex = index;
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Gets the current page.
73
+ *
74
+ * @returns {number}
75
+ */
76
+ function getCurrentPage() {
77
+ return currentIndex;
78
+ }
79
+
80
+ /**
81
+ * Moves the index to the first page.
82
+ */
83
+ function toFirstItem() {
84
+ if (getSize() > 0) {
85
+ visitedPages.clear();
86
+ currentIndex = _updateState(0, 1);
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Moves the index to the last page.
92
+ */
93
+ function toLastItem() {
94
+ if (getSize() > 0) {
95
+ visitedPages.clear();
96
+ currentIndex = _updateState(getSize() - 1, -1);
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Moves the index to the next page.
102
+ */
103
+ function toNextItem() {
104
+ if (getSize() > 0) {
105
+ visitedPages.clear();
106
+ currentIndex = _updateState(++currentIndex, 1); // eslint-disable-line no-plusplus
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Moves the index to the previous page.
112
+ */
113
+ function toPreviousItem() {
114
+ if (getSize() > 0) {
115
+ visitedPages.clear();
116
+ currentIndex = _updateState(--currentIndex, -1); // eslint-disable-line no-plusplus
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Gets the total number of pages.
122
+ *
123
+ * @returns {number}
124
+ */
125
+ function getSize() {
126
+ return Math.max(size(), 0);
127
+ }
128
+
129
+ /**
130
+ * Clears the internal state of the paginator.
131
+ */
132
+ function clear() {
133
+ visitedPages.clear();
134
+ currentIndex = initialPage;
135
+ onClear();
136
+ }
137
+ return {
138
+ setCurrentPage,
139
+ getCurrentPage,
140
+ toFirstItem,
141
+ toLastItem,
142
+ toNextItem,
143
+ toPreviousItem,
144
+ getSize,
145
+ clear
146
+ };
147
+ }