@watermarkinsights/ripple 5.7.0-6 → 5.7.0-7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/dist/cjs/{chartFunctions-d2a1f4c7.js → chartFunctions-995023b1.js} +3 -3
  2. package/dist/cjs/{functions-5ac8a62f.js → functions-e24249e6.js} +7 -104
  3. package/dist/{esm/app-globals-079cb2f3.js → cjs/global-4e6e41e7.js} +2 -7
  4. package/dist/cjs/index-e86c28b6.js +2653 -0
  5. package/dist/cjs/{intl-57d1cfd1.js → intl-5aeba788.js} +1 -1
  6. package/dist/cjs/loader.cjs.js +4 -5
  7. package/dist/cjs/priv-calendar.cjs.entry.js +5 -6
  8. package/dist/cjs/priv-chart-popover.cjs.entry.js +5 -6
  9. package/dist/cjs/priv-navigator-button.cjs.entry.js +3 -4
  10. package/dist/cjs/priv-navigator-item.cjs.entry.js +3 -4
  11. package/dist/cjs/priv-option-list.cjs.entry.js +4 -5
  12. package/dist/cjs/ripple.cjs.js +12 -13
  13. package/dist/cjs/wm-action-menu_2.cjs.entry.js +6 -8
  14. package/dist/cjs/wm-button.cjs.entry.js +4 -5
  15. package/dist/cjs/wm-chart-slice.cjs.entry.js +1 -1
  16. package/dist/cjs/wm-chart.cjs.entry.js +6 -7
  17. package/dist/cjs/wm-date-range.cjs.entry.js +8 -9
  18. package/dist/cjs/wm-datepicker.cjs.entry.js +8 -9
  19. package/dist/cjs/wm-file-list.cjs.entry.js +3 -4
  20. package/dist/cjs/wm-file.cjs.entry.js +4 -5
  21. package/dist/cjs/wm-input.cjs.entry.js +5 -6
  22. package/dist/cjs/wm-line-chart.cjs.entry.js +14 -15
  23. package/dist/cjs/wm-modal-footer.cjs.entry.js +3 -4
  24. package/dist/cjs/wm-modal-header.cjs.entry.js +5 -6
  25. package/dist/cjs/wm-modal.cjs.entry.js +5 -6
  26. package/dist/cjs/wm-navigation_3.cjs.entry.js +10 -13
  27. package/dist/cjs/wm-navigator.cjs.entry.js +3 -4
  28. package/dist/cjs/wm-nested-select.cjs.entry.js +41 -18
  29. package/dist/cjs/wm-optgroup.cjs.entry.js +4 -5
  30. package/dist/cjs/wm-option_2.cjs.entry.js +9 -11
  31. package/dist/cjs/wm-pagination.cjs.entry.js +4 -5
  32. package/dist/cjs/wm-progress-indicator_3.cjs.entry.js +7 -9
  33. package/dist/cjs/wm-search.cjs.entry.js +6 -7
  34. package/dist/cjs/wm-snackbar.cjs.entry.js +6 -7
  35. package/dist/cjs/wm-tab-item_3.cjs.entry.js +8 -11
  36. package/dist/cjs/wm-tag-input.cjs.entry.js +7 -8
  37. package/dist/cjs/wm-tag-option.cjs.entry.js +2 -2
  38. package/dist/cjs/wm-textarea.cjs.entry.js +5 -6
  39. package/dist/cjs/wm-timepicker.cjs.entry.js +5 -6
  40. package/dist/cjs/wm-toggletip.cjs.entry.js +5 -6
  41. package/dist/cjs/wm-uploader.cjs.entry.js +6 -7
  42. package/dist/cjs/wm-wrapper.cjs.entry.js +1 -1
  43. package/dist/collection/collection-manifest.json +2 -2
  44. package/dist/collection/components/charts/chartFunctions.js +1 -1
  45. package/dist/collection/components/charts/chartFunctions.spec.js +16 -0
  46. package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.e2e.js +81 -0
  47. package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.js +2 -2
  48. package/dist/collection/components/charts/screenshots.e2e.js +96 -0
  49. package/dist/collection/components/charts/wm-chart/wm-chart.e2e.js +213 -0
  50. package/dist/collection/components/charts/wm-chart/wm-chart.js +1 -1
  51. package/dist/collection/components/charts/wm-chart/wm-chart.spec.js +37 -0
  52. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.e2e.js +176 -0
  53. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.js +9 -9
  54. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.spec.js +163 -0
  55. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-indicator.js +1 -1
  56. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.e2e.js +69 -0
  57. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.js +1 -1
  58. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.spec.js +79 -0
  59. package/dist/collection/components/datepickers/priv-calendar/priv-calendar.js +2 -2
  60. package/dist/collection/components/datepickers/priv-calendar/priv-calendar.spec.js +89 -0
  61. package/dist/collection/components/datepickers/wm-date-range.e2e.js +443 -0
  62. package/dist/collection/components/datepickers/wm-date-range.js +13 -17
  63. package/dist/collection/components/datepickers/wm-date-range.spec.js +22 -0
  64. package/dist/collection/components/datepickers/wm-datepicker.e2e.js +382 -0
  65. package/dist/collection/components/datepickers/wm-datepicker.js +13 -17
  66. package/dist/collection/components/datepickers/wm-datepicker.spec.js +21 -0
  67. package/dist/collection/components/selects/priv-option-list/priv-option-list.js +5 -7
  68. package/dist/collection/components/selects/wm-nested-select/wm-nested-select.css +1 -1
  69. package/dist/collection/components/selects/wm-nested-select/wm-nested-select.js +43 -13
  70. package/dist/collection/components/selects/wm-optgroup/wm-optgroup.js +1 -1
  71. package/dist/collection/components/selects/wm-option/wm-option.css +1 -1
  72. package/dist/collection/components/selects/wm-option/wm-option.e2e.js +22 -0
  73. package/dist/collection/components/selects/wm-option/wm-option.js +1 -1
  74. package/dist/collection/components/selects/wm-option/wm-option.spec.js +63 -0
  75. package/dist/collection/components/selects/wm-select/wm-select.e2e.js +521 -0
  76. package/dist/collection/components/selects/wm-select/wm-select.js +2 -2
  77. package/dist/collection/components/selects/wm-select/wm-select.spec.js +271 -0
  78. package/dist/collection/components/wm-action-menu/wm-action-menu.e2e.js +200 -0
  79. package/dist/collection/components/wm-action-menu/wm-action-menu.js +1 -1
  80. package/dist/collection/components/wm-action-menu/wm-action-menu.spec.js +48 -0
  81. package/dist/collection/components/wm-button/wm-button.e2e.js +55 -0
  82. package/dist/collection/components/wm-button/wm-button.js +1 -1
  83. package/dist/collection/components/wm-button/wm-button.spec.js +74 -0
  84. package/dist/collection/components/wm-file/wm-file.js +1 -1
  85. package/dist/collection/components/wm-file/wm-file.spec.js +194 -0
  86. package/dist/collection/components/wm-file-list/wm-file-list.js +1 -1
  87. package/dist/collection/components/wm-file-list/wm-file-list.spec.js +69 -0
  88. package/dist/collection/components/wm-input/wm-input.e2e.js +32 -0
  89. package/dist/collection/components/wm-input/wm-input.js +1 -1
  90. package/dist/collection/components/wm-input/wm-input.spec.js +173 -0
  91. package/dist/collection/components/wm-menuitem/wm-menuitem.e2e.js +23 -0
  92. package/dist/collection/components/wm-menuitem/wm-menuitem.js +1 -1
  93. package/dist/collection/components/wm-menuitem/wm-menuitem.spec.js +54 -0
  94. package/dist/collection/components/wm-modal/wm-modal-footer.js +1 -1
  95. package/dist/collection/components/wm-modal/wm-modal-footer.spec.js +11 -0
  96. package/dist/collection/components/wm-modal/wm-modal-header.js +1 -1
  97. package/dist/collection/components/wm-modal/wm-modal-header.spec.js +8 -0
  98. package/dist/collection/components/wm-modal/wm-modal.e2e.js +104 -0
  99. package/dist/collection/components/wm-modal/wm-modal.js +2 -2
  100. package/dist/collection/components/wm-modal/wm-modal.spec.js +30 -0
  101. package/dist/collection/components/wm-navigation/wm-navigation-hamburger.js +1 -1
  102. package/dist/collection/components/wm-navigation/wm-navigation-item.js +1 -1
  103. package/dist/collection/components/wm-navigation/wm-navigation.e2e.js +102 -0
  104. package/dist/collection/components/wm-navigation/wm-navigation.js +2 -2
  105. package/dist/collection/components/wm-navigation/wm-navigation.spec.js +91 -0
  106. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.e2e.js +50 -0
  107. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.js +1 -1
  108. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.js +1 -1
  109. package/dist/collection/components/wm-navigator/wm-navigator.e2e.js +209 -0
  110. package/dist/collection/components/wm-navigator/wm-navigator.spec.js +177 -0
  111. package/dist/collection/components/wm-pagination/wm-pagination.e2e.js +312 -0
  112. package/dist/collection/components/wm-pagination/wm-pagination.js +1 -1
  113. package/dist/collection/components/wm-search/wm-search.e2e.js +76 -0
  114. package/dist/collection/components/wm-search/wm-search.js +4 -5
  115. package/dist/collection/components/wm-search/wm-search.spec.js +71 -0
  116. package/dist/collection/components/wm-snackbar/wm-snackbar.e2e.js +112 -0
  117. package/dist/collection/components/wm-snackbar/wm-snackbar.js +2 -2
  118. package/dist/collection/components/wm-snackbar/wm-snackbar.spec.js +9 -0
  119. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +1 -1
  120. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js +1 -1
  121. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +1 -1
  122. package/dist/collection/components/wm-tabs/wm-tabs.e2e.js +91 -0
  123. package/dist/collection/components/wm-tabs/wm-tabs.spec.js +12 -0
  124. package/dist/collection/components/wm-tag-input/wm-tag-input.e2e.js +204 -0
  125. package/dist/collection/components/wm-tag-input/wm-tag-input.js +3 -3
  126. package/dist/collection/components/wm-tag-input/wm-tag-input.spec.js +195 -0
  127. package/dist/collection/components/wm-textarea/wm-textarea.e2e.js +41 -0
  128. package/dist/collection/components/wm-textarea/wm-textarea.js +1 -1
  129. package/dist/collection/components/wm-textarea/wm-textarea.spec.js +79 -0
  130. package/dist/collection/components/wm-timepicker/wm-timepicker.e2e.js +163 -0
  131. package/dist/collection/components/wm-timepicker/wm-timepicker.js +8 -11
  132. package/dist/collection/components/wm-timepicker/wm-timepicker.spec.js +147 -0
  133. package/dist/collection/components/wm-toggletip/wm-toggletip.e2e.js +69 -0
  134. package/dist/collection/components/wm-toggletip/wm-toggletip.js +2 -2
  135. package/dist/collection/components/wm-toggletip/wm-toggletip.spec.js +21 -0
  136. package/dist/collection/components/wm-uploader/wm-uploader.e2e.js +70 -0
  137. package/dist/collection/components/wm-uploader/wm-uploader.js +2 -2
  138. package/dist/collection/components/wm-uploader/wm-uploader.spec.js +234 -0
  139. package/dist/collection/global/functions.spec.js +126 -0
  140. package/dist/collection/lang/lang.spec.js +20 -0
  141. package/dist/esm/{chartFunctions-6666ced3.js → chartFunctions-dfcb1edf.js} +3 -3
  142. package/dist/esm/{functions-03966124.js → functions-b791a892.js} +8 -105
  143. package/dist/{cjs/app-globals-b78b1f4d.js → esm/global-099ddc86.js} +1 -10
  144. package/dist/esm/index-558b5a82.js +2622 -0
  145. package/dist/esm/{intl-2fa0087c.js → intl-f2f7ce8b.js} +1 -1
  146. package/dist/esm/loader.js +5 -6
  147. package/dist/esm/priv-calendar.entry.js +5 -6
  148. package/dist/esm/priv-chart-popover.entry.js +5 -6
  149. package/dist/esm/priv-navigator-button.entry.js +3 -4
  150. package/dist/esm/priv-navigator-item.entry.js +3 -4
  151. package/dist/esm/priv-option-list.entry.js +4 -5
  152. package/dist/esm/ripple.js +13 -14
  153. package/dist/esm/wm-action-menu_2.entry.js +6 -8
  154. package/dist/esm/wm-button.entry.js +4 -5
  155. package/dist/esm/wm-chart-slice.entry.js +1 -1
  156. package/dist/esm/wm-chart.entry.js +6 -7
  157. package/dist/esm/wm-date-range.entry.js +8 -9
  158. package/dist/esm/wm-datepicker.entry.js +8 -9
  159. package/dist/esm/wm-file-list.entry.js +3 -4
  160. package/dist/esm/wm-file.entry.js +4 -5
  161. package/dist/esm/wm-input.entry.js +5 -6
  162. package/dist/esm/wm-line-chart.entry.js +14 -15
  163. package/dist/esm/wm-modal-footer.entry.js +3 -4
  164. package/dist/esm/wm-modal-header.entry.js +5 -6
  165. package/dist/esm/wm-modal.entry.js +5 -6
  166. package/dist/esm/wm-navigation_3.entry.js +10 -13
  167. package/dist/esm/wm-navigator.entry.js +3 -4
  168. package/dist/esm/wm-nested-select.entry.js +41 -18
  169. package/dist/esm/wm-optgroup.entry.js +4 -5
  170. package/dist/esm/wm-option_2.entry.js +9 -11
  171. package/dist/esm/wm-pagination.entry.js +4 -5
  172. package/dist/esm/wm-progress-indicator_3.entry.js +7 -9
  173. package/dist/esm/wm-search.entry.js +6 -7
  174. package/dist/esm/wm-snackbar.entry.js +6 -7
  175. package/dist/esm/wm-tab-item_3.entry.js +8 -11
  176. package/dist/esm/wm-tag-input.entry.js +7 -8
  177. package/dist/esm/wm-tag-option.entry.js +2 -2
  178. package/dist/esm/wm-textarea.entry.js +5 -6
  179. package/dist/esm/wm-timepicker.entry.js +5 -6
  180. package/dist/esm/wm-toggletip.entry.js +5 -6
  181. package/dist/esm/wm-uploader.entry.js +6 -7
  182. package/dist/esm/wm-wrapper.entry.js +1 -1
  183. package/dist/esm-es5/{chartFunctions-6666ced3.js → chartFunctions-dfcb1edf.js} +1 -1
  184. package/dist/esm-es5/functions-b791a892.js +1 -0
  185. package/dist/esm-es5/global-099ddc86.js +1 -0
  186. package/dist/esm-es5/index-558b5a82.js +1 -0
  187. package/dist/esm-es5/{intl-2fa0087c.js → intl-f2f7ce8b.js} +1 -1
  188. package/dist/esm-es5/loader.js +1 -1
  189. package/dist/esm-es5/priv-calendar.entry.js +1 -1
  190. package/dist/esm-es5/priv-chart-popover.entry.js +1 -1
  191. package/dist/esm-es5/priv-navigator-button.entry.js +1 -1
  192. package/dist/esm-es5/priv-navigator-item.entry.js +1 -1
  193. package/dist/esm-es5/priv-option-list.entry.js +1 -1
  194. package/dist/esm-es5/ripple.js +1 -1
  195. package/dist/esm-es5/wm-action-menu_2.entry.js +1 -1
  196. package/dist/esm-es5/wm-button.entry.js +1 -1
  197. package/dist/esm-es5/wm-chart-slice.entry.js +1 -1
  198. package/dist/esm-es5/wm-chart.entry.js +1 -1
  199. package/dist/esm-es5/wm-date-range.entry.js +1 -1
  200. package/dist/esm-es5/wm-datepicker.entry.js +1 -1
  201. package/dist/esm-es5/wm-file-list.entry.js +1 -1
  202. package/dist/esm-es5/wm-file.entry.js +1 -1
  203. package/dist/esm-es5/wm-input.entry.js +1 -1
  204. package/dist/esm-es5/wm-line-chart.entry.js +1 -1
  205. package/dist/esm-es5/wm-modal-footer.entry.js +1 -1
  206. package/dist/esm-es5/wm-modal-header.entry.js +1 -1
  207. package/dist/esm-es5/wm-modal.entry.js +1 -1
  208. package/dist/esm-es5/wm-navigation_3.entry.js +1 -1
  209. package/dist/esm-es5/wm-navigator.entry.js +1 -1
  210. package/dist/esm-es5/wm-nested-select.entry.js +1 -1
  211. package/dist/esm-es5/wm-optgroup.entry.js +1 -1
  212. package/dist/esm-es5/wm-option_2.entry.js +1 -1
  213. package/dist/esm-es5/wm-pagination.entry.js +1 -1
  214. package/dist/esm-es5/wm-progress-indicator_3.entry.js +1 -1
  215. package/dist/esm-es5/wm-search.entry.js +1 -1
  216. package/dist/esm-es5/wm-snackbar.entry.js +1 -1
  217. package/dist/esm-es5/wm-tab-item_3.entry.js +1 -1
  218. package/dist/esm-es5/wm-tag-input.entry.js +1 -1
  219. package/dist/esm-es5/wm-tag-option.entry.js +1 -1
  220. package/dist/esm-es5/wm-textarea.entry.js +1 -1
  221. package/dist/esm-es5/wm-timepicker.entry.js +1 -1
  222. package/dist/esm-es5/wm-toggletip.entry.js +1 -1
  223. package/dist/esm-es5/wm-uploader.entry.js +1 -1
  224. package/dist/esm-es5/wm-wrapper.entry.js +1 -1
  225. package/dist/loader/cdn.js +2 -1
  226. package/dist/loader/index.cjs.js +2 -1
  227. package/dist/loader/index.d.ts +0 -3
  228. package/dist/loader/index.es2017.js +2 -1
  229. package/dist/loader/index.js +2 -1
  230. package/dist/ripple/p-021ff5fa.system.entry.js +1 -0
  231. package/dist/ripple/p-0b1c6965.system.entry.js +1 -0
  232. package/dist/ripple/p-1389302e.system.entry.js +1 -0
  233. package/dist/ripple/p-13f51c06.entry.js +1 -0
  234. package/dist/ripple/p-149a22bf.entry.js +1 -0
  235. package/dist/ripple/p-16f65bf4.js +1 -0
  236. package/dist/ripple/p-1c170fb3.entry.js +1 -0
  237. package/dist/ripple/p-1e625a5e.entry.js +1 -0
  238. package/dist/ripple/p-215793a4.entry.js +1 -0
  239. package/dist/ripple/{p-b4e4479b.js → p-21d372ed.js} +1 -1
  240. package/dist/ripple/p-226fe4e0.entry.js +1 -0
  241. package/dist/ripple/{p-bae209b8.system.entry.js → p-22930de9.system.entry.js} +1 -1
  242. package/dist/ripple/p-236af552.entry.js +1 -0
  243. package/dist/ripple/p-294b38ca.system.entry.js +1 -0
  244. package/dist/ripple/p-2e79fa49.entry.js +1 -0
  245. package/dist/ripple/p-2f664fdd.entry.js +1 -0
  246. package/dist/ripple/p-30b905eb.system.entry.js +1 -0
  247. package/dist/ripple/p-311923b2.system.entry.js +1 -0
  248. package/dist/ripple/p-320d06aa.js +1 -0
  249. package/dist/ripple/{p-823d7b4e.system.entry.js → p-32bf3f5b.system.entry.js} +1 -1
  250. package/dist/ripple/p-3568472c.entry.js +1 -0
  251. package/dist/ripple/p-3d50db36.entry.js +1 -0
  252. package/dist/ripple/p-3deaf4d9.system.entry.js +1 -0
  253. package/dist/ripple/{p-e1a3db79.system.entry.js → p-3e415c49.system.entry.js} +1 -1
  254. package/dist/ripple/p-41550baa.entry.js +1 -0
  255. package/dist/ripple/{p-b47aa85a.entry.js → p-45f9ad09.entry.js} +1 -1
  256. package/dist/ripple/{p-13b1d775.entry.js → p-48e09589.entry.js} +1 -1
  257. package/dist/ripple/p-4d956340.system.entry.js +1 -0
  258. package/dist/ripple/p-50388b6f.system.entry.js +1 -0
  259. package/dist/ripple/{p-506a85c0.system.entry.js → p-505eca1c.system.entry.js} +1 -1
  260. package/dist/ripple/{p-fc04e749.entry.js → p-5284791c.entry.js} +1 -1
  261. package/dist/ripple/{p-da3e143d.entry.js → p-5300b15d.entry.js} +1 -1
  262. package/dist/ripple/p-568c595f.js +2 -0
  263. package/dist/ripple/{p-f573e60c.system.entry.js → p-5a9e3108.system.entry.js} +1 -1
  264. package/dist/ripple/{p-043901ab.system.entry.js → p-65d26233.system.entry.js} +1 -1
  265. package/dist/ripple/p-6cc07645.system.entry.js +1 -0
  266. package/dist/ripple/p-6d129ef8.system.entry.js +1 -0
  267. package/dist/ripple/{p-772db278.entry.js → p-72165bd2.entry.js} +1 -1
  268. package/dist/ripple/p-725230dd.system.entry.js +1 -0
  269. package/dist/ripple/p-749597da.system.entry.js +1 -0
  270. package/dist/ripple/p-7c338485.entry.js +1 -0
  271. package/dist/ripple/{p-b8a3612c.system.js → p-81c2df85.system.js} +1 -1
  272. package/dist/ripple/{p-094883e1.system.js → p-828adbf1.system.js} +1 -1
  273. package/dist/ripple/p-83be63f6.entry.js +1 -0
  274. package/dist/ripple/p-84603f1f.system.entry.js +1 -0
  275. package/dist/ripple/p-84ba5b74.entry.js +1 -0
  276. package/dist/ripple/{p-cd0cc88d.entry.js → p-88ebddd7.entry.js} +1 -1
  277. package/dist/ripple/p-902a54c5.entry.js +1 -0
  278. package/dist/ripple/p-a0ecb6d7.system.entry.js +1 -0
  279. package/dist/ripple/{p-68434694.system.entry.js → p-a3c01e10.system.entry.js} +1 -1
  280. package/dist/ripple/p-ab8d78cc.system.js +2 -0
  281. package/dist/ripple/p-ad7c9d21.entry.js +1 -0
  282. package/dist/ripple/p-ade3d9a9.entry.js +1 -0
  283. package/dist/ripple/p-ae82b3d2.system.js +1 -0
  284. package/dist/ripple/p-aea13873.entry.js +1 -0
  285. package/dist/ripple/p-b01f9998.system.entry.js +1 -0
  286. package/dist/ripple/p-b3a2bc1b.system.entry.js +1 -0
  287. package/dist/ripple/p-b9dbf1f4.entry.js +1 -0
  288. package/dist/ripple/{p-dba15615.entry.js → p-c1e3c2fb.entry.js} +1 -1
  289. package/dist/ripple/p-c269536e.system.js +1 -0
  290. package/dist/ripple/{p-4fa245d4.system.entry.js → p-c2e00d4a.system.entry.js} +1 -1
  291. package/dist/ripple/p-c47fab48.entry.js +1 -0
  292. package/dist/ripple/{p-6028695a.system.entry.js → p-c853e185.system.entry.js} +1 -1
  293. package/dist/ripple/p-c885c7f9.entry.js +1 -0
  294. package/dist/ripple/p-c9543950.system.entry.js +1 -0
  295. package/dist/ripple/{p-e2910f91.system.entry.js → p-ca971eac.system.entry.js} +1 -1
  296. package/dist/ripple/p-cad0c5f9.system.entry.js +1 -0
  297. package/dist/ripple/{p-60206085.system.entry.js → p-db9657eb.system.entry.js} +1 -1
  298. package/dist/ripple/p-dcc367a9.system.js +1 -0
  299. package/dist/ripple/p-df157138.entry.js +1 -0
  300. package/dist/ripple/p-e081fdc2.system.entry.js +1 -0
  301. package/dist/ripple/{p-2c70503a.entry.js → p-e687176d.entry.js} +1 -1
  302. package/dist/ripple/p-ed1f6b8d.system.entry.js +1 -0
  303. package/dist/ripple/{p-785fda3d.js → p-eddbcb21.js} +1 -1
  304. package/dist/ripple/p-f2101a0d.entry.js +1 -0
  305. package/dist/ripple/p-f24572f5.entry.js +1 -0
  306. package/dist/ripple/p-f40e1468.system.entry.js +1 -0
  307. package/dist/ripple/p-f4bcee58.system.entry.js +1 -0
  308. package/dist/ripple/p-f90e4094.entry.js +1 -0
  309. package/dist/ripple/{p-664dc79d.system.entry.js → p-fa4f1030.system.entry.js} +1 -1
  310. package/dist/ripple/p-ff1ed90f.entry.js +1 -0
  311. package/dist/ripple/ripple.esm.js +1 -1
  312. package/dist/ripple/ripple.js +1 -1
  313. package/dist/types/components/selects/wm-nested-select/wm-nested-select.d.ts +2 -2
  314. package/dist/types/stencil-public-runtime.d.ts +10 -3
  315. package/package.json +1 -1
  316. package/dist/cjs/index-788526f5.js +0 -1863
  317. package/dist/esm/index-130e07bb.js +0 -1832
  318. package/dist/esm-es5/app-globals-079cb2f3.js +0 -1
  319. package/dist/esm-es5/functions-03966124.js +0 -1
  320. package/dist/esm-es5/index-130e07bb.js +0 -1
  321. package/dist/ripple/p-04c5af17.entry.js +0 -1
  322. package/dist/ripple/p-16eb5075.entry.js +0 -1
  323. package/dist/ripple/p-17825edb.entry.js +0 -1
  324. package/dist/ripple/p-19c85f03.system.entry.js +0 -1
  325. package/dist/ripple/p-2261e8d4.entry.js +0 -1
  326. package/dist/ripple/p-2903ce15.system.entry.js +0 -1
  327. package/dist/ripple/p-2a3d94a9.system.entry.js +0 -1
  328. package/dist/ripple/p-39484b51.system.entry.js +0 -1
  329. package/dist/ripple/p-3e7e6493.system.entry.js +0 -1
  330. package/dist/ripple/p-3eae2cff.system.entry.js +0 -1
  331. package/dist/ripple/p-43598413.js +0 -1
  332. package/dist/ripple/p-43c7c26e.entry.js +0 -1
  333. package/dist/ripple/p-45393c61.system.entry.js +0 -1
  334. package/dist/ripple/p-4d0daa27.system.js +0 -1
  335. package/dist/ripple/p-4f2be0ea.entry.js +0 -1
  336. package/dist/ripple/p-54ee24ab.system.entry.js +0 -1
  337. package/dist/ripple/p-580a6225.system.entry.js +0 -1
  338. package/dist/ripple/p-6b84c512.entry.js +0 -1
  339. package/dist/ripple/p-6e50bb9a.entry.js +0 -1
  340. package/dist/ripple/p-76df7747.system.entry.js +0 -1
  341. package/dist/ripple/p-7c2846e4.system.entry.js +0 -1
  342. package/dist/ripple/p-7f162296.system.entry.js +0 -1
  343. package/dist/ripple/p-7fba9e61.system.entry.js +0 -1
  344. package/dist/ripple/p-81ce5578.entry.js +0 -1
  345. package/dist/ripple/p-877d35f8.system.entry.js +0 -1
  346. package/dist/ripple/p-8933fa3d.system.entry.js +0 -1
  347. package/dist/ripple/p-a6466fd1.entry.js +0 -1
  348. package/dist/ripple/p-aa52069c.entry.js +0 -1
  349. package/dist/ripple/p-ae2b2056.entry.js +0 -1
  350. package/dist/ripple/p-afa807a5.entry.js +0 -1
  351. package/dist/ripple/p-b5276c34.entry.js +0 -1
  352. package/dist/ripple/p-b5e7db7f.system.entry.js +0 -1
  353. package/dist/ripple/p-b8dbae16.entry.js +0 -1
  354. package/dist/ripple/p-ba2fe2c3.system.entry.js +0 -1
  355. package/dist/ripple/p-baca1589.entry.js +0 -1
  356. package/dist/ripple/p-bf033357.entry.js +0 -1
  357. package/dist/ripple/p-c0ccce22.system.entry.js +0 -1
  358. package/dist/ripple/p-c499cfaf.entry.js +0 -1
  359. package/dist/ripple/p-c61b29cd.system.entry.js +0 -1
  360. package/dist/ripple/p-c83bc1e9.entry.js +0 -1
  361. package/dist/ripple/p-cef8a45b.system.js +0 -2
  362. package/dist/ripple/p-d307a2d5.system.entry.js +0 -1
  363. package/dist/ripple/p-d9da0502.js +0 -2
  364. package/dist/ripple/p-db706578.system.js +0 -1
  365. package/dist/ripple/p-dd23c135.entry.js +0 -1
  366. package/dist/ripple/p-ded71900.entry.js +0 -1
  367. package/dist/ripple/p-dfcf2302.system.js +0 -1
  368. package/dist/ripple/p-e27dcd81.system.entry.js +0 -1
  369. package/dist/ripple/p-e5f7fbe7.js +0 -1
  370. package/dist/ripple/p-e6e1cd8b.entry.js +0 -1
  371. package/dist/ripple/p-ed2f0946.entry.js +0 -1
  372. package/dist/ripple/p-f3aa0c90.entry.js +0 -1
  373. package/dist/ripple/p-f6752b25.system.entry.js +0 -1
  374. package/dist/ripple/p-f78d5bc3.entry.js +0 -1
  375. package/dist/ripple/p-faae9ebb.entry.js +0 -1
  376. package/dist/ripple/p-fde96980.system.entry.js +0 -1
  377. package/dist/ripple/p-fe6522b9.entry.js +0 -1
@@ -0,0 +1,382 @@
1
+ import { newE2EPage } from "@stencil/core/testing";
2
+ import { AxePuppeteer } from "@axe-core/puppeteer";
3
+ describe("wm-datepicker", () => {
4
+ let page, component, input, btn, popup, popupTitleDay;
5
+ beforeEach(async () => {
6
+ page = await newE2EPage();
7
+ await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
8
+ <wm-datepicker id="dp" label="label"></wm-datepicker>
9
+ </main></body></html>`);
10
+ component = await page.find("wm-datepicker");
11
+ input = await page.find("wm-datepicker >>> input");
12
+ btn = await page.find("wm-datepicker >>> #toggle");
13
+ popup = await page.find("wm-datepicker >>> #popup");
14
+ popupTitleDay = await page.find("wm-datepicker >>> #popup-title-month");
15
+ // await page.keyboard.press("Tab");
16
+ // await page.waitForChanges();
17
+ });
18
+ it("passes Axe checks", async () => {
19
+ const results = await new AxePuppeteer(page).analyze();
20
+ expect(results.violations.length).toBe(0);
21
+ });
22
+ // TODO
23
+ // see https://dequeuniversity.com/checklists/web/form-validation-feedback
24
+ // for Dynamic Error Detection / Error messages
25
+ // see also role="alert"
26
+ /* INPUT */
27
+ // See datepicker-input.e2e.ts
28
+ /* BUTTON */
29
+ // Opening and closing the date picker
30
+ it("opens at today's date by default", async () => {
31
+ const popup = await page.find("wm-datepicker >>> .popup");
32
+ const today = new Date();
33
+ const year = today.getUTCFullYear();
34
+ const month = (today.getUTCMonth() + 1).toString().padStart(2, "0");
35
+ const day = today.getUTCDate().toString();
36
+ const dateTable = await popup.find("[role='grid']");
37
+ // await page.waitForChanges();
38
+ const selDate = await dateTable.find("[aria-selected='true']");
39
+ expect(selDate).toEqualAttribute("data-year", year);
40
+ expect(selDate).toEqualAttribute("data-month", month);
41
+ expect(selDate.textContent).toBe(day);
42
+ });
43
+ it("opens at the date in the input if there is one", async () => {
44
+ const input = await page.find("wm-datepicker >>> input");
45
+ const popup = await page.find("wm-datepicker >>> .popup");
46
+ await input.type("02/01/2030");
47
+ await component.setProperty("calendarDate", "2030-02-01");
48
+ await page.waitForChanges();
49
+ await page.keyboard.press("Tab");
50
+ await page.keyboard.press("Enter");
51
+ await page.waitForChanges();
52
+ const dateTable = await popup.find("[role='grid']");
53
+ const selDate = await dateTable.find("[aria-selected='true']");
54
+ expect(selDate).toEqualAttribute("data-year", "2030");
55
+ expect(selDate).toEqualAttribute("data-month", "02");
56
+ expect(selDate.textContent).toBe("1");
57
+ });
58
+ it("Closes the popup when user triggers the calendar button", async () => {
59
+ const popup = await page.find("wm-datepicker >>> .popup");
60
+ await page.keyboard.press("Tab"); // in input
61
+ await page.keyboard.press("Tab"); // on btn
62
+ await page.keyboard.press("Enter");
63
+ await page.waitForChanges();
64
+ expect(popup).toHaveClass("open");
65
+ await page.keyboard.press("Escape");
66
+ await page.waitForChanges();
67
+ expect(popup).not.toHaveClass("open");
68
+ });
69
+ /* POPUP */
70
+ it("closes the calendar popup when the user presses ESCAPE", async () => {
71
+ await input.type("02/03/2019");
72
+ await component.setProperty("calendarDate", "2019-02-03");
73
+ await page.waitForChanges();
74
+ await page.keyboard.press("Tab");
75
+ await page.keyboard.press("Enter");
76
+ await page.waitForChanges();
77
+ await page.keyboard.press("Escape");
78
+ await page.waitForChanges();
79
+ expect(popup).not.toHaveClass("open");
80
+ });
81
+ it("shows the next month on PAGE DOWN and shows the previous month on PAGE UP", async () => {
82
+ await input.type("02/03/2019");
83
+ await component.setProperty("calendarDate", "2019-02-03");
84
+ await page.waitForChanges();
85
+ await page.keyboard.press("Tab");
86
+ await page.keyboard.press("Enter");
87
+ await page.waitForChanges();
88
+ await page.keyboard.press("PageDown");
89
+ await page.waitForChanges();
90
+ expect(popupTitleDay.textContent).toBe("March 2019");
91
+ let activeElId = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.id);
92
+ expect(activeElId).toEqual("cell-20190303");
93
+ await page.keyboard.press("PageUp");
94
+ await page.waitForChanges();
95
+ await page.keyboard.press("PageUp");
96
+ await page.waitForChanges();
97
+ await page.keyboard.press("PageUp");
98
+ await page.waitForChanges();
99
+ activeElId = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.id);
100
+ expect(activeElId).toEqual("cell-20181203");
101
+ });
102
+ it("handles HOME and END keys", async () => {
103
+ await input.type("02/15/2020");
104
+ await component.setProperty("calendarDate", "2020-02-15");
105
+ await page.waitForChanges();
106
+ await page.keyboard.press("Tab");
107
+ await page.keyboard.press("Enter");
108
+ await page.waitForChanges();
109
+ await page.keyboard.press("Home");
110
+ await page.waitForChanges();
111
+ const firstDayOfMonth = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.id);
112
+ expect(firstDayOfMonth).toEqual("cell-20200201");
113
+ await page.keyboard.press("End");
114
+ await page.waitForChanges();
115
+ const lastDayOfMonth = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.id);
116
+ expect(lastDayOfMonth).toEqual("cell-20200229"); // 2020 is a leap year
117
+ });
118
+ it("navigates the calendar with keyboard (day view)", async () => {
119
+ // left/right: -1 / +1 in the row
120
+ // up/down
121
+ await input.type("08/15/2024");
122
+ await component.setProperty("calendarDate", "2024-08-15");
123
+ await page.keyboard.press("Tab"); // on the toggle popup btn
124
+ await page.waitForChanges();
125
+ await page.keyboard.press("Enter"); // open popup
126
+ await page.waitForChanges();
127
+ await page.keyboard.press("ArrowLeft");
128
+ await page.waitForChanges();
129
+ let focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
130
+ await page.waitForChanges();
131
+ expect(focusedCell).toEqualAttribute("id", "cell-20240814");
132
+ await page.keyboard.press("ArrowUp");
133
+ await page.waitForChanges();
134
+ focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
135
+ expect(focusedCell).toEqualAttribute("id", "cell-20240807");
136
+ await page.keyboard.press("ArrowRight");
137
+ await page.waitForChanges();
138
+ focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
139
+ expect(focusedCell).toEqualAttribute("id", "cell-20240808");
140
+ await page.keyboard.press("ArrowDown");
141
+ await page.waitForChanges();
142
+ focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
143
+ expect(focusedCell).toEqualAttribute("id", "cell-20240815");
144
+ });
145
+ it("navigates the calendar with keyboard (month view)", async () => {
146
+ await input.type("08/15/2024");
147
+ await component.setProperty("calendarDate", "2024-08-15");
148
+ await page.keyboard.press("Tab"); // on the toggle popup btn
149
+ await page.waitForChanges();
150
+ await page.keyboard.press("Enter"); // open popup
151
+ await page.keyboard.down("Shift");
152
+ await page.waitForChanges();
153
+ await page.keyboard.press("Tab"); // next btn
154
+ await page.waitForChanges();
155
+ await page.keyboard.press("Tab"); // popup-title (month + year)
156
+ await page.waitForChanges();
157
+ await page.keyboard.press("Enter");
158
+ await page.waitForChanges();
159
+ await page.keyboard.up("Shift");
160
+ await page.waitForChanges();
161
+ await page.keyboard.press("ArrowLeft");
162
+ await page.waitForChanges();
163
+ let focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
164
+ await page.waitForChanges();
165
+ expect(focusedCell).toEqualAttribute("id", "month-6"); // month is july (7), 0-indexed
166
+ await page.keyboard.press("ArrowUp");
167
+ await page.waitForChanges();
168
+ focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
169
+ expect(focusedCell).toEqualAttribute("id", "month-3");
170
+ await page.keyboard.press("ArrowRight");
171
+ await page.waitForChanges();
172
+ focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
173
+ expect(focusedCell).toEqualAttribute("id", "month-4");
174
+ await page.keyboard.press("ArrowDown");
175
+ await page.waitForChanges();
176
+ focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
177
+ expect(focusedCell).toEqualAttribute("id", "month-7");
178
+ });
179
+ // it("goes to the year view when the month name is clicked", async () => {
180
+ // // (i.e. allows selection of a month)
181
+ // });
182
+ it("goes to the previous/next month when the arrow button is triggered in day view", async () => {
183
+ await input.type("11/29/1999");
184
+ await component.setProperty("calendarDate", "1999-11-29");
185
+ await page.keyboard.press("Tab"); // on the toggle popup btn
186
+ await page.waitForChanges();
187
+ await page.keyboard.press("Enter"); // open popup
188
+ await page.waitForChanges();
189
+ await page.keyboard.down("Shift");
190
+ await page.waitForChanges();
191
+ await page.keyboard.press("Tab"); // next btn
192
+ await page.waitForChanges();
193
+ await page.keyboard.press("Tab"); // popup-title (month + year)
194
+ await page.waitForChanges();
195
+ await page.keyboard.press("Tab"); // prev btn
196
+ await page.waitForChanges();
197
+ await page.keyboard.up("Shift");
198
+ await page.waitForChanges();
199
+ await page.keyboard.press("Enter"); // press prev btn
200
+ await page.waitForChanges();
201
+ expect(popup).toHaveClasses(["open", "day-view"]);
202
+ expect(popupTitleDay.textContent).toBe("October 1999");
203
+ await page.keyboard.press("Tab"); // popup title btn
204
+ await page.keyboard.press("Tab"); // next btn
205
+ await page.keyboard.press("Enter"); // press next btn
206
+ await page.waitForChanges();
207
+ await page.keyboard.press("Enter"); // press next btn
208
+ await page.waitForChanges();
209
+ expect(popupTitleDay.textContent).toBe("December 1999");
210
+ });
211
+ it("goes to the previous/next year when the arrow button is clicked in month view", async () => {
212
+ await input.type("11/29/1999");
213
+ await component.setProperty("calendarDate", "1999-11-29");
214
+ await page.waitForChanges();
215
+ await page.keyboard.press("Tab"); // on the toggle popup btn
216
+ await page.waitForChanges();
217
+ await page.keyboard.press("Enter"); // open popup
218
+ await page.waitForChanges();
219
+ await page.keyboard.down("Shift");
220
+ await page.keyboard.press("Tab"); // next btn
221
+ await page.waitForChanges();
222
+ await page.keyboard.press("Tab"); // month view btn
223
+ await page.waitForChanges();
224
+ await page.keyboard.up("Shift");
225
+ await page.waitForChanges();
226
+ await page.keyboard.press("Enter"); // press month view btn
227
+ await page.waitForChanges();
228
+ expect(popup).toHaveClasses(["open", "month-view"]);
229
+ const title = await popup.find("#popup-title-year");
230
+ expect(title.textContent).toBe("1999");
231
+ await page.keyboard.down("Shift");
232
+ await page.keyboard.press("Tab"); // next btn
233
+ await page.keyboard.up("Shift");
234
+ await page.keyboard.press("Enter"); // press next btn
235
+ await page.waitForChanges();
236
+ expect(title.textContent).toBe("2000");
237
+ await page.keyboard.down("Shift");
238
+ await page.keyboard.press("Tab"); // year btn
239
+ await page.keyboard.down("Shift");
240
+ await page.keyboard.press("Tab"); // prev btn
241
+ await page.keyboard.up("Shift");
242
+ await page.keyboard.press("Enter"); // press prev btn
243
+ await page.waitForChanges();
244
+ expect(title.textContent).toBe("1999");
245
+ await page.keyboard.press("Enter"); // press prev btn
246
+ await page.waitForChanges();
247
+ await page.keyboard.press("Enter"); // press prev btn
248
+ await page.waitForChanges();
249
+ expect(title.textContent).toBe("1997");
250
+ });
251
+ it("has the aria attributes related to the popup", async () => {
252
+ // NB "If the element with the aria-expanded attribute controls the expansion of another grouping container
253
+ // that is not 'owned by' the element, the author SHOULD reference the container by using the aria-controls attribute."
254
+ // src: https://www.w3.org/TR/wai-aria-1.1/#aria-expanded
255
+ expect(btn).toHaveAttribute("aria-expanded");
256
+ // Not sure is aria-haspopup is necessary. If it is present the popup should have a role
257
+ // if that role is grid (the only role that seems to correspond) then the cells must have
258
+ // a role of gridcell
259
+ // https://www.w3.org/TR/wai-aria/#aria-haspopup
260
+ // expect(btn).toHaveAttribute("aria-haspopup");
261
+ //Removed aria-controls since the popup comes immediately after the aria-expanded controller:
262
+ //https://www.heydonworks.com/article/aria-controls-is-poop
263
+ });
264
+ it("toggles aria-expanded attribute", async () => {
265
+ expect(btn).toEqualAttribute("aria-expanded", "false");
266
+ await page.keyboard.press("Tab");
267
+ await page.keyboard.press("Tab");
268
+ await page.keyboard.press("Enter");
269
+ await page.waitForChanges();
270
+ expect(btn).toEqualAttribute("aria-expanded", "true");
271
+ });
272
+ it("properly fills the-label on table cells", async () => {
273
+ // screen reader should read "Thursday, May 10 2018" on focus
274
+ // screen reader should read "Thursday, May 10 2018, selected" on select
275
+ await input.type("05/10/2018");
276
+ await component.setProperty("calendarDate", "2018-05-10");
277
+ await page.waitForChanges();
278
+ await page.keyboard.press("Tab");
279
+ await page.waitForChanges();
280
+ await page.keyboard.press("Enter");
281
+ await page.waitForChanges();
282
+ const focusedCell = await popup.find("[role='gridcell'][tabindex='0']");
283
+ await page.waitForChanges();
284
+ // day of the week is read by sr bcse it's the table column
285
+ expect(focusedCell).toEqualAttribute("aria-label", "Thursday, May 10, 2018");
286
+ // screen reader should read "Thursday, May 10 2018, selected" on select
287
+ await page.keyboard.press("Enter");
288
+ await page.waitForChanges();
289
+ const selCell = await popup.find("[aria-selected='true']");
290
+ // day of the week is read by sr bcse it's the table column
291
+ expect(selCell).toEqualAttribute("aria-label", "Thursday, May 10, 2018");
292
+ });
293
+ it("aligns dates properly", async () => {
294
+ // -> check that both 01/01/1999 and 12/31/2100 are in the Friday column
295
+ // couldn't figure this one out...
296
+ });
297
+ it("emits event on input blur", async () => {
298
+ page = await newE2EPage();
299
+ await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
300
+ <wm-datepicker id="dp" label="label"></wm-datepicker>
301
+ <div id="indicator">no event heard</div>
302
+ </main></body></html>`);
303
+ component = await page.find("wm-datepicker");
304
+ input = await page.find("wm-datepicker >>> input");
305
+ await page.waitForChanges();
306
+ await page.evaluate(async () => {
307
+ const indicator = document.querySelector("#indicator");
308
+ await document.addEventListener("wmDatepickerInputBlurred", () => (indicator.textContent = "event heard"));
309
+ });
310
+ await page.waitForChanges;
311
+ const indicator = await page.find("#indicator");
312
+ expect(indicator.textContent).toBe("no event heard");
313
+ await input.type("05/10/2018");
314
+ await page.keyboard.press("Tab");
315
+ await page.waitForChanges();
316
+ expect(indicator.textContent).toBe("event heard");
317
+ });
318
+ it("emits event on change", async () => {
319
+ page = await newE2EPage();
320
+ await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
321
+ <wm-datepicker id="dp" label="label"></wm-datepicker>
322
+ <div id="indicator">events heard: 0</div>
323
+ </main></body></html>`);
324
+ component = await page.find("wm-datepicker");
325
+ input = await page.find("wm-datepicker >>> input");
326
+ await page.waitForChanges();
327
+ await page.evaluate(async () => {
328
+ const indicator = document.querySelector("#indicator");
329
+ await document
330
+ .querySelector("wm-datepicker")
331
+ .addEventListener("change", () => (indicator.textContent =
332
+ indicator.textContent.slice(0, -1) + (parseInt(indicator.textContent.slice(-1)) + 1)));
333
+ });
334
+ await page.waitForChanges;
335
+ const indicator = await page.find("#indicator");
336
+ expect(indicator.textContent).toBe("events heard: 0");
337
+ // user types date
338
+ await input.type("05/10/2018");
339
+ await page.keyboard.press("Tab");
340
+ await page.waitForChanges();
341
+ expect(indicator.textContent).toBe("events heard: 1");
342
+ // user selects date from calendar
343
+ await page.keyboard.press("Enter");
344
+ await page.waitForChanges();
345
+ await page.keyboard.press("ArrowRight");
346
+ await page.keyboard.press("Enter");
347
+ await page.waitForChanges();
348
+ expect(indicator.textContent).toBe("events heard: 2");
349
+ });
350
+ it("emits event with date on cell selection", async () => {
351
+ page = await newE2EPage();
352
+ await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
353
+ <wm-datepicker id="dp" value="12/30/1999" label="label"></wm-datepicker>
354
+ <div id="indicator"></div>
355
+ </main></body></html>`);
356
+ component = await page.find("wm-datepicker");
357
+ input = await page.find("wm-datepicker >>> input");
358
+ await page.waitForChanges();
359
+ await page.evaluate(async () => {
360
+ const indicator = document.querySelector("#indicator");
361
+ await document.querySelector("wm-datepicker").addEventListener("wmDatepickerDateSelected", (ev) => (indicator.textContent =
362
+ //@ts-ignore
363
+ `date received: ${ev.detail.date}`));
364
+ });
365
+ await page.waitForChanges;
366
+ const indicator = await page.find("#indicator");
367
+ // user types date
368
+ await page.keyboard.press("Tab");
369
+ await page.keyboard.press("Tab");
370
+ await page.waitForChanges();
371
+ await page.keyboard.press("Enter");
372
+ await page.waitForChanges();
373
+ await page.keyboard.press("Enter");
374
+ await page.waitForChanges();
375
+ expect(indicator.textContent).toBe("date received: 1999-12-30");
376
+ });
377
+ });
378
+ // Sources:
379
+ // https://watermarkinsights.atlassian.net/browse/DNP-3411
380
+ // https://watermarkinsights.atlassian.net/browse/DNP-4318
381
+ // https://axesslab.com/accessible-datepickers/
382
+ // https://www.w3.org/WAI/PF/HTML/wiki/Datepickers
@@ -212,23 +212,23 @@ export class DatePicker {
212
212
  this.liveRegionEl.textContent = message;
213
213
  }
214
214
  render() {
215
- return (h(Host, { key: 'daac54e642a4c00b37dff5167cf0fd3322b98874', "aria-busy": "false", class: `${this.errorMessage ? "invalid" : ""}` }, h("div", { key: '0633196770bcd3965a8fe60ecd1972653ed3e25c', ref: (d) => (this.dpWrapperEl = d), class: `wrapper label-${this.labelPosition} ${this.errorMessage ? "invalid" : ""}` }, h("div", { key: 'ba80e128d0345635d90c4641c508d05eb4d3794e', class: "label-wrapper", ref: (e) => (this.labelWrapperEl = e) }, this.labelPosition !== "none" && (h("label", { key: '4905e937c7e6249537c5ed43f77331883d006794', id: "datepickerLabel", htmlFor: "date-input", class: "label", title: `${this.label} (${this.dateFormat})` }, this.label, this.requiredField && (h("span", { key: '637e35c7f255629aa75cf177822154a1e6e6e7b3', "aria-hidden": "true", class: "required" }, "*"))))), h("div", { key: '8676b6e03022cd8787d0a77a0b3e6c4dd8419b59' }, h("div", { key: 'e9f24478e3beb32f38ef65aff197d7872e1f3d67', class: "single-wrapper input" }, h("input", { key: '4661fedeafd62c45e1aec2aad699faede4d750b6', disabled: this.isDisabled, type: "text", id: "single-date-input", class: "date-input", name: "date", placeholder: this.dateFormat, value: this.value, onFocus: () => this.handleInputFocus(), onInput: (ev) => this.handleInput(ev), onBlur: () => this.handleInputBlur(), onChange: () => this.handleInputChange(), ref: (input) => (this.inputEl = input), "aria-describedby": "error", "aria-label": this.label, "aria-required": this.requiredField ? "true" : null }), h("div", { key: '0a2afc12a5e44bcb8a9deb92c7171945c67289f4', class: "container", id: "wm-container" }, h("button", { key: 'b6b63ef23dee93ff470de4d5a5d2769086bcb808', disabled: this.disabled, onClick: this.togglePopup.bind(this), "aria-label": intl.formatMessage({
215
+ return (h(Host, { "aria-busy": "false", class: `${this.errorMessage ? "invalid" : ""}` }, h("div", { ref: (d) => (this.dpWrapperEl = d), class: `wrapper label-${this.labelPosition} ${this.errorMessage ? "invalid" : ""}` }, h("div", { class: "label-wrapper", ref: (e) => (this.labelWrapperEl = e) }, this.labelPosition !== "none" && (h("label", { id: "datepickerLabel", htmlFor: "date-input", class: "label", title: `${this.label} (${this.dateFormat})` }, this.label, this.requiredField && (h("span", { "aria-hidden": "true", class: "required" }, "*"))))), h("div", null, h("div", { class: "single-wrapper input" }, h("input", { disabled: this.isDisabled, type: "text", id: "single-date-input", class: "date-input", name: "date", placeholder: this.dateFormat, value: this.value, onFocus: () => this.handleInputFocus(), onInput: (ev) => this.handleInput(ev), onBlur: () => this.handleInputBlur(), onChange: () => this.handleInputChange(), ref: (input) => (this.inputEl = input), "aria-describedby": "error", "aria-label": this.label, "aria-required": this.requiredField ? "true" : null }), h("div", { class: "container", id: "wm-container" }, h("button", { disabled: this.disabled, onClick: this.togglePopup.bind(this), "aria-label": intl.formatMessage({
216
216
  id: "date.selectDate",
217
217
  defaultMessage: "Select date",
218
218
  description: "Button text for screen readers.",
219
- }), "aria-describedby": "single-date-input", ref: (el) => (this.toggleEl = el), "aria-expanded": `${this.isExpanded}`, class: "toggle", id: "toggle" }, h("span", { key: 'debb3ae89f32960a7a269b9f6c951f5bb7bfd874', class: "calendar", title: intl.formatMessage({
219
+ }), "aria-describedby": "single-date-input", ref: (el) => (this.toggleEl = el), "aria-expanded": `${this.isExpanded}`, class: "toggle", id: "toggle" }, h("span", { class: "calendar", title: intl.formatMessage({
220
220
  id: "date.calendarView",
221
221
  defaultMessage: "Calendar View",
222
222
  description: "Calendar button",
223
- }) })), h("div", { key: '87ff9723a2960d5725f5f731dcc0d30719a8bb09', class: `popup-wrapper ${this.calEl && this.calEl.view}-view ${this.openUp ? "expand-upwards" : ""}`, id: "popup-wrapper", ref: (el) => (this.popupEl = el), onClick: () => (this.popupClicked = true) }, h("div", { key: '989a9bc4bd537394bfb2fe1ecd83311bb57187d4', tabIndex: 0, onFocus: () => this.calEl.focusLastFocusable() }), h("priv-calendar", { key: '3253b7e256dc7137aae2c4c2a79099e0093ecc65', ref: (el) => (this.calEl = el), startDate: this.calendarDate, focusDate: this.calendarDate, class: "inside" }), h("div", { key: '9cacded01a3163bebd249d6ed4601ca9a6c3dfd0', tabIndex: 0, onFocus: () => this.calEl.focusFirstFocusable() })), h("div", { key: 'fe890d55779f0619bc6c144d1fd47cc2cb26fe04', id: "live-region", "aria-live": "polite", "aria-relevant": "text", class: "sr-only" }), h("div", { key: '71e28a0c1aaa2c1ddce511bfbf0d9cf6794382ab', id: "month-title", class: "sr-only" }, intl.formatMessage({
223
+ }) })), h("div", { class: `popup-wrapper ${this.calEl && this.calEl.view}-view ${this.openUp ? "expand-upwards" : ""}`, id: "popup-wrapper", ref: (el) => (this.popupEl = el), onClick: () => (this.popupClicked = true) }, h("div", { tabIndex: 0, onFocus: () => this.calEl.focusLastFocusable() }), h("priv-calendar", { ref: (el) => (this.calEl = el), startDate: this.calendarDate, focusDate: this.calendarDate, class: "inside" }), h("div", { tabIndex: 0, onFocus: () => this.calEl.focusFirstFocusable() })), h("div", { id: "live-region", "aria-live": "polite", "aria-relevant": "text", class: "sr-only" }), h("div", { id: "month-title", class: "sr-only" }, intl.formatMessage({
224
224
  id: "date.selectMonth",
225
225
  defaultMessage: "Activate to select a month.",
226
226
  description: "Calendar button",
227
- })), h("div", { key: '2df13fae273fd2186e35d50ab58d888b45bf0b40', id: "year-title", class: "sr-only" }, intl.formatMessage({
227
+ })), h("div", { id: "year-title", class: "sr-only" }, intl.formatMessage({
228
228
  id: "date.selectYear",
229
229
  defaultMessage: "Activate to select a year.",
230
230
  description: "Calendar button",
231
- })))), h("div", { key: '71ca47b61c3ffd7e19c273ae3e4c68a7f3ef1afd', id: "error", class: "error" }, this.errorMessage), h("div", { key: '5adc31a91d03cd34d01e48a88617481051905341', ref: (el) => (this.liveRegionEl = el), class: "sr-only", "aria-live": "polite", "aria-atomic": "true" })))));
231
+ })))), h("div", { id: "error", class: "error" }, this.errorMessage), h("div", { ref: (el) => (this.liveRegionEl = el), class: "sr-only", "aria-live": "polite", "aria-atomic": "true" })))));
232
232
  }
233
233
  static get is() { return "wm-datepicker"; }
234
234
  static get encapsulation() { return "shadow"; }
@@ -433,17 +433,14 @@ export class DatePicker {
433
433
  "complexType": {
434
434
  "signature": "(inputFormat: string, outputFormat: string, date?: string) => Promise<string>",
435
435
  "parameters": [{
436
- "name": "inputFormat",
437
- "type": "string",
438
- "docs": ""
436
+ "tags": [],
437
+ "text": ""
439
438
  }, {
440
- "name": "outputFormat",
441
- "type": "string",
442
- "docs": ""
439
+ "tags": [],
440
+ "text": ""
443
441
  }, {
444
- "name": "date",
445
- "type": "string | undefined",
446
- "docs": ""
442
+ "tags": [],
443
+ "text": ""
447
444
  }],
448
445
  "references": {
449
446
  "Promise": {
@@ -462,9 +459,8 @@ export class DatePicker {
462
459
  "complexType": {
463
460
  "signature": "(input?: string) => Promise<boolean>",
464
461
  "parameters": [{
465
- "name": "input",
466
- "type": "string | undefined",
467
- "docs": ""
462
+ "tags": [],
463
+ "text": ""
468
464
  }],
469
465
  "references": {
470
466
  "Promise": {
@@ -0,0 +1,21 @@
1
+ import { newSpecPage } from "@stencil/core/testing";
2
+ import * as globalFunctions from "../../global/functions";
3
+ jest.spyOn(globalFunctions, "generateId").mockReturnValue("random-id");
4
+ import { DatePicker } from "./wm-datepicker";
5
+ describe("wm-datepicker", () => {
6
+ it("builds", async () => {
7
+ const comp = await newSpecPage({
8
+ components: [DatePicker],
9
+ html: '<wm-datepicker label="mock label"></wm-datepicker>',
10
+ });
11
+ expect(comp.root).toMatchSnapshot();
12
+ });
13
+ it("sets input to required", async () => {
14
+ const page = await newSpecPage({
15
+ components: [DatePicker],
16
+ html: `<wm-datepicker label='datepicker' required-field='true'></wm-datepicker>`,
17
+ });
18
+ const input = await page.root.shadowRoot.querySelector("input");
19
+ expect(input).toEqualAttribute("aria-required", "true");
20
+ });
21
+ });
@@ -391,7 +391,7 @@ export class PrivOptionList {
391
391
  });
392
392
  }
393
393
  render() {
394
- return (h("div", { key: '7597806482ea7bf73439a41c22b2dc2d0e3047ff', class: "list-wrapper" }, this.isInNestedSelect && this.renderReturnBtn(), this.search && this.renderSearchField(), this.visibleSelectAllButton && this.renderSelectAllButton(), h("div", { key: '5a74fb5303a7631bf76dc5be9ef637d03f9bc132', id: "list", class: "options-wrapper", tabindex: -1, role: "listbox", "aria-multiselectable": this.multiple ? "true" : null, "aria-labelledby": "label", ref: (el) => (this.listboxEl = el), style: { "--max-height": this.effectiveMaxHeight } }, this.searchTerm && this.filteredOptions.length === 0 && this.renderSearchFailedMessage(), this.multiple && this.renderCloneOptions(), h("slot", { key: 'bcb6e4c35ebd1ee5a9a4295f5eff61072e2dd8a1' })), h("div", { key: 'c1c11fb35beca1207598239727a61939fe996697', id: "optionlist-announcement", "aria-live": "polite", "aria-atomic": "true", class: "sr-only", ref: (el) => (this.liveRegionEl = el) }, this.announcement)));
394
+ return (h("div", { class: "list-wrapper" }, this.isInNestedSelect && this.renderReturnBtn(), this.search && this.renderSearchField(), this.visibleSelectAllButton && this.renderSelectAllButton(), h("div", { id: "list", class: "options-wrapper", tabindex: -1, role: "listbox", "aria-multiselectable": this.multiple ? "true" : null, "aria-labelledby": "label", ref: (el) => (this.listboxEl = el), style: { "--max-height": this.effectiveMaxHeight } }, this.searchTerm && this.filteredOptions.length === 0 && this.renderSearchFailedMessage(), this.multiple && this.renderCloneOptions(), h("slot", null)), h("div", { id: "optionlist-announcement", "aria-live": "polite", "aria-atomic": "true", class: "sr-only", ref: (el) => (this.liveRegionEl = el) }, this.announcement)));
395
395
  }
396
396
  static get is() { return "priv-option-list"; }
397
397
  static get originalStyleUrls() {
@@ -675,9 +675,8 @@ export class PrivOptionList {
675
675
  "complexType": {
676
676
  "signature": "(option: HTMLElement) => Promise<void>",
677
677
  "parameters": [{
678
- "name": "option",
679
- "type": "HTMLElement",
680
- "docs": ""
678
+ "tags": [],
679
+ "text": ""
681
680
  }],
682
681
  "references": {
683
682
  "Promise": {
@@ -700,9 +699,8 @@ export class PrivOptionList {
700
699
  "complexType": {
701
700
  "signature": "(optionToSelect?: \"next\" | \"previous\") => Promise<void>",
702
701
  "parameters": [{
703
- "name": "optionToSelect",
704
- "type": "\"next\" | \"previous\" | undefined",
705
- "docs": ""
702
+ "tags": [],
703
+ "text": ""
706
704
  }],
707
705
  "references": {
708
706
  "Promise": {
@@ -353,7 +353,7 @@
353
353
  padding-right: 0.5rem;
354
354
  font-size: 1.12rem;
355
355
  }
356
- .menu :focus {
356
+ .menu :focus-visible {
357
357
  outline: none;
358
358
  background: var(--wmcolor-interactive-background-focus);
359
359
  }
@@ -123,6 +123,28 @@ export class NestedSelect {
123
123
  closePopupOnEscape() {
124
124
  this.close();
125
125
  }
126
+ handleKeyDown(ev) {
127
+ // when shift tabbing but component is still in focus, close dropdown
128
+ switch (ev.key) {
129
+ case "Tab":
130
+ if (ev.shiftKey) {
131
+ this.close();
132
+ }
133
+ break;
134
+ case "ArrowDown":
135
+ if (this.isExpanded === false) {
136
+ ev.preventDefault();
137
+ this.open();
138
+ }
139
+ break;
140
+ case "ArrowUp":
141
+ if (this.isExpanded === false) {
142
+ ev.preventDefault();
143
+ this.open(true);
144
+ }
145
+ break;
146
+ }
147
+ }
126
148
  close(returnFocus = true) {
127
149
  if (this.isExpanded) {
128
150
  this.isExpanded = false;
@@ -135,7 +157,7 @@ export class NestedSelect {
135
157
  }, 150);
136
158
  }
137
159
  }
138
- open() {
160
+ open(focusLast = false) {
139
161
  if (!this.isDisabled) {
140
162
  this.showClearSelectionButton = this.childOptions.some((o) => o.selected);
141
163
  this.isExpanded = true;
@@ -155,14 +177,16 @@ export class NestedSelect {
155
177
  ? spaceAbove
156
178
  : null;
157
179
  });
158
- window.requestAnimationFrame(() => {
159
- this.focusFirstMenuitem();
160
- });
161
- }
162
- }
163
- focusFirstMenuitem() {
164
- if (this.menuitemEls.length > 0) {
165
- this.menuitemEls[0].focus();
180
+ // scrollIntoView does not work when the container of the element it's called on is not rendered to the page (in our case the dropdown is still closed and has transform: scaleY(0))
181
+ // when opening the dropdown, scrollIntoView must be delayed to a point where the browser recognizes content within it as able to be scrolled to
182
+ // in Safari in particular, the soonest this seems to happen is 20ms. The longest we can wait before any jumping in the open dropdown is noticeable is 60ms
183
+ window.setTimeout(() => {
184
+ if (this.menuitemEls.length > 0) {
185
+ const menuitemToFocus = this.menuitemEls[focusLast ? this.menuitemEls.length - 1 : 0];
186
+ menuitemToFocus.scrollIntoView({ block: "nearest" });
187
+ menuitemToFocus.focus();
188
+ }
189
+ }, 60);
166
190
  }
167
191
  }
168
192
  moveDown(menuitemEl) {
@@ -292,16 +316,16 @@ export class NestedSelect {
292
316
  this.isExpanded ? this.close() : this.open();
293
317
  },
294
318
  };
295
- return (h(Host, { key: 'ed7b96e7d65c756fbbade7dfb2a8ae03da9d3277', onBlur: (ev) => this.handleComponentBlur(ev) }, h("div", { key: 'a2783684ed70b347fd5081b9679cad00c4c73af9', class: `wrapper ${getTextDir()} label-${this.labelPosition} ${this.errorMessage ? "invalid" : ""}` }, h("div", { key: 'dc6f0249ebbcd84df9108fdd2af2e3a7778c2a5a', class: "label-wrapper" }, h("label", { key: '6139f82a9c0a4c9ea569b0d6c74e694ca4924932', class: "label", id: "label", htmlFor: "selectbtn" }, this.label,
319
+ return (h(Host, { onBlur: (ev) => this.handleComponentBlur(ev) }, h("div", { class: `wrapper ${getTextDir()} label-${this.labelPosition} ${this.errorMessage ? "invalid" : ""}` }, h("div", { class: "label-wrapper" }, h("label", { class: "label", id: "label", htmlFor: "selectbtn" }, this.label,
296
320
  // we can't use aria-required or required attributes because it's invalid on the elements we're using (button controlling a listbox)
297
- this.requiredField ? (h("span", { class: "required" }, h("span", { class: "sr-only" }, globalMessages.requiredField), h("span", { "aria-hidden": "true" }, "*"))) : (""))), h("div", { key: '3198a4409abb6d880330ffadd64022835ee94ba6', class: "button-wrapper" }, h("button", Object.assign({ key: '112c79d84e039c8a9044fc86c2d360a3c88acfec' }, buttonProps, { class: `displayedoption ${this.isExpanded ? "expanded" : ""}`, ref: (el) => (this.buttonEl = el), onBlur: (ev) => this.handleButtonBlur(ev), onFocus: () => this.close() }), h("span", { key: 'ab91af492aac319d84cb48dccdb127e5649b658b', class: "overflowcontrol" }, h("span", { key: 'fb0370d92612ee4ae365634e8e7f845ef0d6194a', class: "button-text" }, this.renderButtonText())), this.renderOverflowCount(), h("div", { key: 'e61b2f40ed449bbb679bd4792197eeb34f23d5f9', ref: (el) => (this.measurementAreaEl = el), class: "measurement-area", "aria-hidden": "true" })), h("div", { key: '1490530463cfcdb5d010f722b7f3078e0e036ce0', class: `dropdown ${this.openUp ? "upwards" : ""}`, ref: (el) => (this.dropdownEl = el) }, h("div", { key: '072c737865ad17a47ff9b70f9ee681542b766674', ref: (el) => (this.menuEl = el), class: "menu", style: { "--max-height": this.constrainedMaxHeight } }, this.renderClearSelectionButton(), this.optgroupEls.map((optgroupEl) => {
321
+ this.requiredField ? (h("span", { class: "required" }, h("span", { class: "sr-only" }, globalMessages.requiredField), h("span", { "aria-hidden": "true" }, "*"))) : (""))), h("div", { class: "button-wrapper" }, h("button", Object.assign({}, buttonProps, { class: `displayedoption ${this.isExpanded ? "expanded" : ""}`, ref: (el) => (this.buttonEl = el), onBlur: (ev) => this.handleButtonBlur(ev) }), h("span", { class: "overflowcontrol" }, h("span", { class: "button-text" }, this.renderButtonText())), this.renderOverflowCount(), h("div", { ref: (el) => (this.measurementAreaEl = el), class: "measurement-area", "aria-hidden": "true" })), h("div", { class: `dropdown ${this.openUp ? "upwards" : ""}`, ref: (el) => (this.dropdownEl = el) }, h("div", { ref: (el) => (this.menuEl = el), class: "menu", style: { "--max-height": this.constrainedMaxHeight } }, this.renderClearSelectionButton(), this.optgroupEls.map((optgroupEl) => {
298
322
  return (h("button", { class: `menuitem group-btn ${optgroupEl.disabled ? "disabled" : ""}`, role: "menuitem", "data-label": optgroupEl.label, tabindex: -1, "aria-disabled": optgroupEl.disabled, onClick: () => {
299
323
  if (!optgroupEl.disabled) {
300
324
  optgroupEl.isExpanded = !optgroupEl.isExpanded;
301
325
  forceUpdate(this.el);
302
326
  }
303
327
  }, onKeyDown: (ev) => this.handleMenuitemKeydown(ev) }, h("span", null, optgroupEl.label), this.renderSelectionCount(optgroupEl), optgroupEl.disabled && h("div", { class: "disabled-indication" }, "Disabled")));
304
- })), h("div", { key: '8e57555b287fb08eb92eac959ddd7259d560e33a', ref: (el) => (this.optListWrapperEl = el), class: "option-list-wrapper hidden" }, h("slot", { key: 'c22278aca4bd47298fdffeeb148896180e12da1e' }))), h("div", { key: '3180921d3e8e6a9dc7c7c34b5077e17f3da9ef88', id: "error", class: this.errorMessage ? "error-message" : "" }, this.errorMessage)))));
328
+ })), h("div", { ref: (el) => (this.optListWrapperEl = el), class: "option-list-wrapper hidden" }, h("slot", null))), h("div", { id: "error", class: this.errorMessage ? "error-message" : "" }, this.errorMessage)))));
305
329
  }
306
330
  static get is() { return "wm-nested-select"; }
307
331
  static get encapsulation() { return "shadow"; }
@@ -534,7 +558,7 @@ export class NestedSelect {
534
558
  },
535
559
  "constrainedMaxHeight": {
536
560
  "type": "string",
537
- "mutable": false,
561
+ "mutable": true,
538
562
  "complexType": {
539
563
  "original": "string",
540
564
  "resolved": "string",
@@ -596,6 +620,12 @@ export class NestedSelect {
596
620
  "target": undefined,
597
621
  "capture": false,
598
622
  "passive": false
623
+ }, {
624
+ "name": "keydown",
625
+ "method": "handleKeyDown",
626
+ "target": undefined,
627
+ "capture": false,
628
+ "passive": false
599
629
  }, {
600
630
  "name": "click",
601
631
  "method": "handleClick",