@watermarkinsights/ripple 5.11.0-7 → 5.11.0-9

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 (350) hide show
  1. package/dist/cjs/{chartFunctions-7314b414.js → chartFunctions-b47a5431.js} +3 -3
  2. package/dist/cjs/{functions-5ac8a62f.js → functions-e24249e6.js} +7 -104
  3. package/dist/{esm/app-globals-100a3ed5.js → cjs/global-cfead82d.js} +2 -7
  4. package/dist/cjs/index-e86c28b6.js +2649 -0
  5. package/dist/cjs/{intl-07aaf53c.js → intl-a70cf8c2.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-pss_3.cjs.entry.js +10 -13
  24. package/dist/cjs/wm-modal_3.cjs.entry.js +10 -13
  25. package/dist/cjs/wm-navigation_3.cjs.entry.js +10 -13
  26. package/dist/cjs/wm-navigator.cjs.entry.js +3 -4
  27. package/dist/cjs/wm-nested-select.cjs.entry.js +7 -8
  28. package/dist/cjs/wm-optgroup.cjs.entry.js +4 -5
  29. package/dist/cjs/wm-option_2.cjs.entry.js +8 -10
  30. package/dist/cjs/wm-pagination.cjs.entry.js +4 -5
  31. package/dist/cjs/wm-progress-indicator_3.cjs.entry.js +7 -9
  32. package/dist/cjs/wm-search.cjs.entry.js +6 -7
  33. package/dist/cjs/wm-snackbar.cjs.entry.js +7 -8
  34. package/dist/cjs/wm-tab-item_3.cjs.entry.js +8 -11
  35. package/dist/cjs/wm-tag-input.cjs.entry.js +7 -8
  36. package/dist/cjs/wm-tag-option.cjs.entry.js +2 -2
  37. package/dist/cjs/wm-textarea.cjs.entry.js +5 -6
  38. package/dist/cjs/wm-timepicker.cjs.entry.js +5 -6
  39. package/dist/cjs/wm-toggletip.cjs.entry.js +38 -35
  40. package/dist/cjs/wm-uploader.cjs.entry.js +6 -7
  41. package/dist/cjs/wm-wrapper.cjs.entry.js +1 -1
  42. package/dist/collection/collection-manifest.json +2 -2
  43. package/dist/collection/components/charts/chartFunctions.js +1 -1
  44. package/dist/collection/components/charts/chartFunctions.spec.js +16 -0
  45. package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.e2e.js +81 -0
  46. package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.js +2 -2
  47. package/dist/collection/components/charts/screenshots.e2e.js +96 -0
  48. package/dist/collection/components/charts/wm-chart/wm-chart.e2e.js +213 -0
  49. package/dist/collection/components/charts/wm-chart/wm-chart.js +1 -1
  50. package/dist/collection/components/charts/wm-chart/wm-chart.spec.js +37 -0
  51. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.e2e.js +176 -0
  52. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.js +9 -9
  53. package/dist/collection/components/charts/wm-line-chart/wm-line-chart.spec.js +163 -0
  54. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-indicator.js +1 -1
  55. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.e2e.js +69 -0
  56. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.js +1 -1
  57. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.spec.js +79 -0
  58. package/dist/collection/components/datepickers/priv-calendar/priv-calendar.js +2 -2
  59. package/dist/collection/components/datepickers/priv-calendar/priv-calendar.spec.js +89 -0
  60. package/dist/collection/components/datepickers/wm-date-range.e2e.js +443 -0
  61. package/dist/collection/components/datepickers/wm-date-range.js +13 -17
  62. package/dist/collection/components/datepickers/wm-date-range.spec.js +22 -0
  63. package/dist/collection/components/datepickers/wm-datepicker.e2e.js +382 -0
  64. package/dist/collection/components/datepickers/wm-datepicker.js +13 -17
  65. package/dist/collection/components/datepickers/wm-datepicker.spec.js +21 -0
  66. package/dist/collection/components/selects/priv-option-list/priv-option-list.js +5 -7
  67. package/dist/collection/components/selects/wm-nested-select/wm-nested-select.js +3 -3
  68. package/dist/collection/components/selects/wm-optgroup/wm-optgroup.js +1 -1
  69. package/dist/collection/components/selects/wm-option/wm-option.e2e.js +22 -0
  70. package/dist/collection/components/selects/wm-option/wm-option.js +1 -1
  71. package/dist/collection/components/selects/wm-option/wm-option.spec.js +63 -0
  72. package/dist/collection/components/selects/wm-select/wm-select.e2e.js +521 -0
  73. package/dist/collection/components/selects/wm-select/wm-select.js +2 -2
  74. package/dist/collection/components/selects/wm-select/wm-select.spec.js +271 -0
  75. package/dist/collection/components/wm-action-menu/wm-action-menu.e2e.js +200 -0
  76. package/dist/collection/components/wm-action-menu/wm-action-menu.js +1 -1
  77. package/dist/collection/components/wm-action-menu/wm-action-menu.spec.js +48 -0
  78. package/dist/collection/components/wm-button/wm-button.e2e.js +55 -0
  79. package/dist/collection/components/wm-button/wm-button.js +1 -1
  80. package/dist/collection/components/wm-button/wm-button.spec.js +74 -0
  81. package/dist/collection/components/wm-file/wm-file.js +1 -1
  82. package/dist/collection/components/wm-file/wm-file.spec.js +194 -0
  83. package/dist/collection/components/wm-file-list/wm-file-list.js +1 -1
  84. package/dist/collection/components/wm-file-list/wm-file-list.spec.js +69 -0
  85. package/dist/collection/components/wm-input/wm-input.e2e.js +32 -0
  86. package/dist/collection/components/wm-input/wm-input.js +1 -1
  87. package/dist/collection/components/wm-input/wm-input.spec.js +173 -0
  88. package/dist/collection/components/wm-menuitem/wm-menuitem.e2e.js +23 -0
  89. package/dist/collection/components/wm-menuitem/wm-menuitem.js +1 -1
  90. package/dist/collection/components/wm-menuitem/wm-menuitem.spec.js +54 -0
  91. package/dist/collection/components/wm-modal/wm-modal-footer.js +1 -1
  92. package/dist/collection/components/wm-modal/wm-modal-footer.spec.js +11 -0
  93. package/dist/collection/components/wm-modal/wm-modal-header.js +1 -1
  94. package/dist/collection/components/wm-modal/wm-modal-header.spec.js +8 -0
  95. package/dist/collection/components/wm-modal/wm-modal.e2e.js +104 -0
  96. package/dist/collection/components/wm-modal/wm-modal.js +2 -2
  97. package/dist/collection/components/wm-modal/wm-modal.spec.js +30 -0
  98. package/dist/collection/components/wm-modal-pss/wm-modal-pss-footer.js +1 -1
  99. package/dist/collection/components/wm-modal-pss/wm-modal-pss-header.js +1 -1
  100. package/dist/collection/components/wm-modal-pss/wm-modal-pss.js +2 -2
  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.css +3 -0
  117. package/dist/collection/components/wm-snackbar/wm-snackbar.e2e.js +112 -0
  118. package/dist/collection/components/wm-snackbar/wm-snackbar.js +2 -2
  119. package/dist/collection/components/wm-snackbar/wm-snackbar.spec.js +9 -0
  120. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +1 -1
  121. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js +1 -1
  122. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +1 -1
  123. package/dist/collection/components/wm-tabs/wm-tabs.e2e.js +91 -0
  124. package/dist/collection/components/wm-tabs/wm-tabs.spec.js +12 -0
  125. package/dist/collection/components/wm-tag-input/wm-tag-input.e2e.js +204 -0
  126. package/dist/collection/components/wm-tag-input/wm-tag-input.js +3 -3
  127. package/dist/collection/components/wm-tag-input/wm-tag-input.spec.js +195 -0
  128. package/dist/collection/components/wm-textarea/wm-textarea.e2e.js +41 -0
  129. package/dist/collection/components/wm-textarea/wm-textarea.js +1 -1
  130. package/dist/collection/components/wm-textarea/wm-textarea.spec.js +79 -0
  131. package/dist/collection/components/wm-timepicker/wm-timepicker.e2e.js +163 -0
  132. package/dist/collection/components/wm-timepicker/wm-timepicker.js +8 -11
  133. package/dist/collection/components/wm-timepicker/wm-timepicker.spec.js +147 -0
  134. package/dist/collection/components/wm-toggletip/wm-toggletip.css +34 -105
  135. package/dist/collection/components/wm-toggletip/wm-toggletip.e2e.js +69 -0
  136. package/dist/collection/components/wm-toggletip/wm-toggletip.js +41 -32
  137. package/dist/collection/components/wm-toggletip/wm-toggletip.spec.js +21 -0
  138. package/dist/collection/components/wm-uploader/wm-uploader.e2e.js +70 -0
  139. package/dist/collection/components/wm-uploader/wm-uploader.js +2 -2
  140. package/dist/collection/components/wm-uploader/wm-uploader.spec.js +234 -0
  141. package/dist/collection/global/functions.spec.js +126 -0
  142. package/dist/collection/lang/lang.spec.js +20 -0
  143. package/dist/esm/{chartFunctions-c273c613.js → chartFunctions-d2ecde7f.js} +3 -3
  144. package/dist/esm/{functions-f39e6177.js → functions-8800c690.js} +8 -105
  145. package/dist/{cjs/app-globals-b3f03eaa.js → esm/global-0b62026b.js} +1 -10
  146. package/dist/esm/index-558b5a82.js +2618 -0
  147. package/dist/esm/{intl-a0ebf99e.js → intl-cf443c87.js} +1 -1
  148. package/dist/esm/loader.js +5 -6
  149. package/dist/esm/priv-calendar.entry.js +5 -6
  150. package/dist/esm/priv-chart-popover.entry.js +5 -6
  151. package/dist/esm/priv-navigator-button.entry.js +3 -4
  152. package/dist/esm/priv-navigator-item.entry.js +3 -4
  153. package/dist/esm/priv-option-list.entry.js +4 -5
  154. package/dist/esm/ripple.js +13 -14
  155. package/dist/esm/wm-action-menu_2.entry.js +6 -8
  156. package/dist/esm/wm-button.entry.js +4 -5
  157. package/dist/esm/wm-chart-slice.entry.js +1 -1
  158. package/dist/esm/wm-chart.entry.js +6 -7
  159. package/dist/esm/wm-date-range.entry.js +8 -9
  160. package/dist/esm/wm-datepicker.entry.js +8 -9
  161. package/dist/esm/wm-file-list.entry.js +3 -4
  162. package/dist/esm/wm-file.entry.js +4 -5
  163. package/dist/esm/wm-input.entry.js +5 -6
  164. package/dist/esm/wm-line-chart.entry.js +14 -15
  165. package/dist/esm/wm-modal-pss_3.entry.js +10 -13
  166. package/dist/esm/wm-modal_3.entry.js +10 -13
  167. package/dist/esm/wm-navigation_3.entry.js +10 -13
  168. package/dist/esm/wm-navigator.entry.js +3 -4
  169. package/dist/esm/wm-nested-select.entry.js +7 -8
  170. package/dist/esm/wm-optgroup.entry.js +4 -5
  171. package/dist/esm/wm-option_2.entry.js +8 -10
  172. package/dist/esm/wm-pagination.entry.js +4 -5
  173. package/dist/esm/wm-progress-indicator_3.entry.js +7 -9
  174. package/dist/esm/wm-search.entry.js +6 -7
  175. package/dist/esm/wm-snackbar.entry.js +7 -8
  176. package/dist/esm/wm-tab-item_3.entry.js +8 -11
  177. package/dist/esm/wm-tag-input.entry.js +7 -8
  178. package/dist/esm/wm-tag-option.entry.js +2 -2
  179. package/dist/esm/wm-textarea.entry.js +5 -6
  180. package/dist/esm/wm-timepicker.entry.js +5 -6
  181. package/dist/esm/wm-toggletip.entry.js +38 -35
  182. package/dist/esm/wm-uploader.entry.js +6 -7
  183. package/dist/esm/wm-wrapper.entry.js +1 -1
  184. package/dist/esm-es5/{chartFunctions-c273c613.js → chartFunctions-d2ecde7f.js} +1 -1
  185. package/dist/esm-es5/functions-8800c690.js +1 -0
  186. package/dist/esm-es5/global-0b62026b.js +1 -0
  187. package/dist/esm-es5/index-558b5a82.js +1 -0
  188. package/dist/esm-es5/{intl-a0ebf99e.js → intl-cf443c87.js} +1 -1
  189. package/dist/esm-es5/loader.js +1 -1
  190. package/dist/esm-es5/priv-calendar.entry.js +1 -1
  191. package/dist/esm-es5/priv-chart-popover.entry.js +1 -1
  192. package/dist/esm-es5/priv-navigator-button.entry.js +1 -1
  193. package/dist/esm-es5/priv-navigator-item.entry.js +1 -1
  194. package/dist/esm-es5/priv-option-list.entry.js +1 -1
  195. package/dist/esm-es5/ripple.js +1 -1
  196. package/dist/esm-es5/wm-action-menu_2.entry.js +1 -1
  197. package/dist/esm-es5/wm-button.entry.js +1 -1
  198. package/dist/esm-es5/wm-chart-slice.entry.js +1 -1
  199. package/dist/esm-es5/wm-chart.entry.js +1 -1
  200. package/dist/esm-es5/wm-date-range.entry.js +1 -1
  201. package/dist/esm-es5/wm-datepicker.entry.js +1 -1
  202. package/dist/esm-es5/wm-file-list.entry.js +1 -1
  203. package/dist/esm-es5/wm-file.entry.js +1 -1
  204. package/dist/esm-es5/wm-input.entry.js +1 -1
  205. package/dist/esm-es5/wm-line-chart.entry.js +1 -1
  206. package/dist/esm-es5/wm-modal-pss_3.entry.js +1 -1
  207. package/dist/esm-es5/wm-modal_3.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-bda9a663.system.entry.js → p-0ba2e506.system.entry.js} +1 -1
  231. package/dist/ripple/{p-0f09ccc6.system.entry.js → p-0e36d5b8.system.entry.js} +1 -1
  232. package/dist/ripple/p-159c4e96.entry.js +1 -0
  233. package/dist/ripple/{p-658f146a.system.entry.js → p-1a4b6b02.system.entry.js} +1 -1
  234. package/dist/ripple/{p-165b5d3d.system.entry.js → p-1a71d867.system.entry.js} +1 -1
  235. package/dist/ripple/p-1b6e0f20.system.js +1 -0
  236. package/dist/ripple/p-1c486c10.entry.js +1 -0
  237. package/dist/ripple/p-1fce9f27.entry.js +1 -0
  238. package/dist/ripple/{p-47f6c939.system.entry.js → p-21b87733.system.entry.js} +1 -1
  239. package/dist/ripple/{p-9287d70b.system.entry.js → p-2b21c6f5.system.entry.js} +1 -1
  240. package/dist/ripple/p-32507c13.system.entry.js +1 -0
  241. package/dist/ripple/{p-823d7b4e.system.entry.js → p-32bf3f5b.system.entry.js} +1 -1
  242. package/dist/ripple/{p-bb25b9af.system.js → p-3322823d.system.js} +1 -1
  243. package/dist/ripple/{p-96505312.js → p-366920dc.js} +1 -1
  244. package/dist/ripple/p-39e26322.entry.js +1 -0
  245. package/dist/ripple/p-417ee34d.entry.js +1 -0
  246. package/dist/ripple/p-44f426ad.entry.js +1 -0
  247. package/dist/ripple/{p-c34c9cbb.system.entry.js → p-4743176d.system.entry.js} +1 -1
  248. package/dist/ripple/{p-13b1d775.entry.js → p-48e09589.entry.js} +1 -1
  249. package/dist/ripple/p-4de728e1.entry.js +1 -0
  250. package/dist/ripple/p-4ff87702.system.entry.js +1 -0
  251. package/dist/ripple/{p-79a6b32f.system.entry.js → p-5415aaf9.system.entry.js} +1 -1
  252. package/dist/ripple/{p-362b19a2.entry.js → p-544925c2.entry.js} +1 -1
  253. package/dist/ripple/{p-2c8f0e96.system.entry.js → p-55d837e7.system.entry.js} +1 -1
  254. package/dist/ripple/{p-83d1c1fb.entry.js → p-55e9e0cb.entry.js} +1 -1
  255. package/dist/ripple/p-568c595f.js +2 -0
  256. package/dist/ripple/{p-bee47080.system.entry.js → p-58668e84.system.entry.js} +1 -1
  257. package/dist/ripple/p-5e9c9f0d.entry.js +1 -0
  258. package/dist/ripple/{p-39dd3870.system.entry.js → p-608f69c1.system.entry.js} +1 -1
  259. package/dist/ripple/p-64b1e73b.entry.js +1 -0
  260. package/dist/ripple/{p-043901ab.system.entry.js → p-65d26233.system.entry.js} +1 -1
  261. package/dist/ripple/{p-5c25870c.entry.js → p-68e04222.entry.js} +1 -1
  262. package/dist/ripple/{p-9513be67.system.entry.js → p-6b014a04.system.entry.js} +1 -1
  263. package/dist/ripple/{p-a40296fc.system.entry.js → p-704be1e8.system.entry.js} +1 -1
  264. package/dist/ripple/{p-9708c995.js → p-710c6115.js} +1 -1
  265. package/dist/ripple/{p-42596f25.entry.js → p-7478303e.entry.js} +1 -1
  266. package/dist/ripple/p-74b56394.entry.js +1 -0
  267. package/dist/ripple/p-79043436.entry.js +1 -0
  268. package/dist/ripple/p-797d65b7.entry.js +1 -0
  269. package/dist/ripple/{p-a3f9e2f6.system.entry.js → p-7cf5993c.system.entry.js} +1 -1
  270. package/dist/ripple/{p-d0736520.system.entry.js → p-878fd4af.system.entry.js} +1 -1
  271. package/dist/ripple/{p-cd0cc88d.entry.js → p-88ebddd7.entry.js} +1 -1
  272. package/dist/ripple/p-8d72d140.entry.js +1 -0
  273. package/dist/ripple/{p-8918aa06.system.entry.js → p-915289ac.system.entry.js} +1 -1
  274. package/dist/ripple/p-94495341.entry.js +1 -0
  275. package/dist/ripple/p-94717864.entry.js +1 -0
  276. package/dist/ripple/{p-0ed1e17e.entry.js → p-9d461de5.entry.js} +1 -1
  277. package/dist/ripple/{p-1bbd7c10.entry.js → p-9dd401f8.entry.js} +1 -1
  278. package/dist/ripple/p-9eaa0acb.system.entry.js +1 -0
  279. package/dist/ripple/{p-3376581a.system.entry.js → p-a04ef164.system.entry.js} +1 -1
  280. package/dist/ripple/{p-1bef5a45.system.entry.js → p-a1fa6df5.system.entry.js} +1 -1
  281. package/dist/ripple/p-a69425b0.entry.js +1 -0
  282. package/dist/ripple/{p-165ce5ff.system.entry.js → p-a9a22fe9.system.entry.js} +1 -1
  283. package/dist/ripple/p-ab8d78cc.system.js +2 -0
  284. package/dist/ripple/p-adc254e6.entry.js +1 -0
  285. package/dist/ripple/p-b02048a9.entry.js +1 -0
  286. package/dist/ripple/{p-f2a3d851.entry.js → p-b52742ca.system.entry.js} +1 -1
  287. package/dist/ripple/{p-76d248e6.entry.js → p-b976c84b.entry.js} +1 -1
  288. package/dist/ripple/{p-a65e54ed.system.entry.js → p-ba6705f0.system.entry.js} +1 -1
  289. package/dist/ripple/p-bab9379d.js +1 -0
  290. package/dist/ripple/p-bc52ce59.entry.js +1 -0
  291. package/dist/ripple/{p-9dcf2403.system.entry.js → p-bfc1065f.system.entry.js} +1 -1
  292. package/dist/ripple/p-c699a3a7.system.js +1 -0
  293. package/dist/ripple/{p-72e05203.system.entry.js → p-c7e30eb0.system.entry.js} +1 -1
  294. package/dist/ripple/{p-35c7696e.entry.js → p-ce44ba70.entry.js} +1 -1
  295. package/dist/ripple/{p-c1c41694.system.entry.js → p-d57e8196.entry.js} +1 -1
  296. package/dist/ripple/p-d585c49a.entry.js +1 -0
  297. package/dist/ripple/{p-4410cab5.system.entry.js → p-d6e58820.system.entry.js} +1 -1
  298. package/dist/ripple/p-dc77d98a.entry.js +1 -0
  299. package/dist/ripple/p-dd01bd48.entry.js +1 -0
  300. package/dist/ripple/{p-d85c6d0d.system.entry.js → p-ddcbb694.system.entry.js} +1 -1
  301. package/dist/ripple/{p-35218430.system.entry.js → p-de272ae7.system.entry.js} +1 -1
  302. package/dist/ripple/{p-cca7a151.system.entry.js → p-e2c6052b.system.entry.js} +1 -1
  303. package/dist/ripple/{p-4c1efa04.system.js → p-e71ee9f4.system.js} +1 -1
  304. package/dist/ripple/{p-5c62e26d.entry.js → p-e9b8a6a9.entry.js} +1 -1
  305. package/dist/ripple/p-eca78c2b.js +1 -0
  306. package/dist/ripple/p-edd87140.system.js +1 -0
  307. package/dist/ripple/{p-ead461fe.system.entry.js → p-f6eff655.system.entry.js} +1 -1
  308. package/dist/ripple/{p-22dda578.system.entry.js → p-f779ec68.system.entry.js} +1 -1
  309. package/dist/ripple/ripple.esm.js +1 -1
  310. package/dist/ripple/ripple.js +1 -1
  311. package/dist/types/components/wm-toggletip/wm-toggletip.d.ts +3 -1
  312. package/dist/types/stencil-public-runtime.d.ts +10 -3
  313. package/package.json +1 -1
  314. package/dist/cjs/index-788526f5.js +0 -1859
  315. package/dist/esm/index-130e07bb.js +0 -1828
  316. package/dist/esm-es5/app-globals-100a3ed5.js +0 -1
  317. package/dist/esm-es5/functions-f39e6177.js +0 -1
  318. package/dist/esm-es5/index-130e07bb.js +0 -1
  319. package/dist/ripple/p-05fbc327.entry.js +0 -1
  320. package/dist/ripple/p-105e5721.system.entry.js +0 -1
  321. package/dist/ripple/p-152b20ae.entry.js +0 -1
  322. package/dist/ripple/p-2a30d411.system.entry.js +0 -1
  323. package/dist/ripple/p-3744869a.js +0 -1
  324. package/dist/ripple/p-3ceed568.entry.js +0 -1
  325. package/dist/ripple/p-3dcdc247.entry.js +0 -1
  326. package/dist/ripple/p-3f486eed.system.js +0 -1
  327. package/dist/ripple/p-410373fc.entry.js +0 -1
  328. package/dist/ripple/p-4b8cb0a4.entry.js +0 -1
  329. package/dist/ripple/p-5107cac1.entry.js +0 -1
  330. package/dist/ripple/p-5d8386b4.system.entry.js +0 -1
  331. package/dist/ripple/p-60895838.entry.js +0 -1
  332. package/dist/ripple/p-76f9acec.entry.js +0 -1
  333. package/dist/ripple/p-86a5178d.entry.js +0 -1
  334. package/dist/ripple/p-89a2db02.js +0 -1
  335. package/dist/ripple/p-8d4f674f.entry.js +0 -1
  336. package/dist/ripple/p-95dc8d71.entry.js +0 -1
  337. package/dist/ripple/p-aa5947de.entry.js +0 -1
  338. package/dist/ripple/p-ac6b2cfe.entry.js +0 -1
  339. package/dist/ripple/p-b1265a17.system.js +0 -1
  340. package/dist/ripple/p-b4e7d63f.entry.js +0 -1
  341. package/dist/ripple/p-c5c31818.entry.js +0 -1
  342. package/dist/ripple/p-cef8a45b.system.js +0 -2
  343. package/dist/ripple/p-d528f5e4.entry.js +0 -1
  344. package/dist/ripple/p-d9da0502.js +0 -2
  345. package/dist/ripple/p-da15c18e.entry.js +0 -1
  346. package/dist/ripple/p-da424bdb.entry.js +0 -1
  347. package/dist/ripple/p-f39b556d.entry.js +0 -1
  348. package/dist/ripple/p-f98f9a32.entry.js +0 -1
  349. package/dist/ripple/p-f9a71cf6.entry.js +0 -1
  350. package/dist/ripple/p-ffeaea05.system.js +0 -1
@@ -0,0 +1,69 @@
1
+ import { newE2EPage } from "@stencil/core/testing";
2
+ import { AxePuppeteer } from "@axe-core/puppeteer";
3
+ describe("wm-toggletip", () => {
4
+ let page;
5
+ beforeEach(async () => {
6
+ page = await newE2EPage();
7
+ });
8
+ it("passes Axe checks", async () => {
9
+ await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
10
+ <wm-toggletip label='More information' tooltip='Further explanation'>Click me</wm-toggletip>
11
+ </main></body></html>`);
12
+ const results = await new AxePuppeteer(page).analyze();
13
+ expect(results.violations.length).toBe(0);
14
+ });
15
+ it("delegates focus", async () => {
16
+ await page.setContent("<wm-toggletip label='label' tooltip='Text'></wm-toggletip>");
17
+ const component = await page.find("wm-toggletip");
18
+ component.focus();
19
+ await page.waitForChanges();
20
+ let activeElNodeName = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.nodeName);
21
+ expect(activeElNodeName).toBe("BUTTON");
22
+ });
23
+ // Enter or click opens tooltip, no change in focus
24
+ // Tab, escape close tooltip
25
+ it("opens and closes properly", async () => {
26
+ await page.setContent(`<wm-toggletip label='More information' tooltip='Further explanation'></wm-toggletip>`);
27
+ const toggletip = await page.find("wm-toggletip >>> .toggletip");
28
+ await page.keyboard.press("Tab");
29
+ await page.waitForChanges();
30
+ await page.keyboard.press("Enter");
31
+ await page.waitForChanges();
32
+ expect(toggletip).not.toHaveClass("hidden");
33
+ // check focus remains on button
34
+ const activeElNodeName = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.nodeName);
35
+ expect(activeElNodeName).toEqual("BUTTON");
36
+ await page.keyboard.press("Escape");
37
+ await page.waitForChanges();
38
+ expect(toggletip).toHaveClass("hidden");
39
+ await page.click("wm-toggletip");
40
+ await page.waitForChanges();
41
+ expect(toggletip).not.toHaveClass("hidden");
42
+ await page.keyboard.press("Tab");
43
+ await page.waitForChanges();
44
+ expect(toggletip).toHaveClass("hidden");
45
+ await page.keyboard.press("Enter");
46
+ await page.waitForChanges();
47
+ await page.mouse.click(-10, -10);
48
+ await page.waitForChanges();
49
+ expect(toggletip).toHaveClass("hidden");
50
+ });
51
+ // test to make sure liveregion is updated properly
52
+ it("updates liveregion", async () => {
53
+ await page.setContent(`<wm-toggletip label='More information' tooltip='Further explanation'></wm-toggletip>`);
54
+ await page.keyboard.press("Tab");
55
+ await page.waitForChanges();
56
+ await page.keyboard.press("Enter");
57
+ await page.waitForChanges();
58
+ const liveRegion = await page.find("wm-toggletip >>> .live-region");
59
+ expect(liveRegion.textContent).toBe("Further explanation");
60
+ });
61
+ it("renders a tooltip", async () => {
62
+ await page.setContent(`<html lang='en'><head><title>Page</title></head><body><div id="tooltip-container"><div id="wm-tooltip" popover="manual" class="wm-tooltip" aria-hidden="true"></div></div><main><h1>Title</h1>
63
+ <wm-toggletip label='More information' tooltip='Further explanation'>Click me</wm-toggletip>
64
+ </main></body></html>`);
65
+ await page.click("wm-toggletip");
66
+ const tooltip = await page.find("#wm-tooltip");
67
+ expect(tooltip.textContent).toEqual("More information");
68
+ });
69
+ });
@@ -10,9 +10,7 @@ export class Toggletip {
10
10
  this.tooltip = undefined;
11
11
  this.tooltipPosition = "bottom-right";
12
12
  this.targetSize = "small";
13
- }
14
- get isOpen() {
15
- return this.toggletipEl.matches(":popover-open");
13
+ this.isOpen = false;
16
14
  }
17
15
  componentWillLoad() {
18
16
  const validTooltipPlacement = [
@@ -41,50 +39,40 @@ export class Toggletip {
41
39
  ev.preventDefault();
42
40
  if (this.isOpen) {
43
41
  ev.stopPropagation(); // prevent closing modal if within one
44
- this.toggletipEl.hidePopover();
42
+ this.close();
45
43
  }
46
44
  break;
47
45
  case "Tab":
48
46
  if (this.isOpen) {
49
- this.toggletipEl.hidePopover();
47
+ this.close();
50
48
  }
51
49
  }
52
50
  }
53
51
  handleClick(ev) {
54
52
  if (this.isOpen) {
55
- if (ev.target === this.el || this.el.contains(ev.target)) {
53
+ const isElOrChild = ev.composedPath().includes(this.el);
54
+ if (isElOrChild) {
56
55
  // Re-announce if clicking any part of the component while open
57
56
  this.announceToggletip();
58
57
  }
58
+ else {
59
+ this.close();
60
+ }
59
61
  }
60
62
  }
61
63
  open() {
62
64
  hideTooltip();
63
- requestAnimationFrame(() => {
64
- // toggletip position
65
- // Vertical
66
- if (this.tooltipPosition.includes("bottom") && shouldOpenUp(this.el, this.toggletipEl.clientHeight)) {
67
- this.tooltipPosition = this.tooltipPosition.replace("bottom", "top");
68
- }
69
- else if (this.tooltipPosition.includes("top") && shouldOpenDown(this.el, this.toggletipEl.clientHeight)) {
70
- this.tooltipPosition = this.tooltipPosition.replace("top", "bottom");
71
- }
72
- // Horizontal
73
- if (this.tooltipPosition.includes("left") && shouldShiftRight(this.el, this.toggletipEl.clientWidth)) {
74
- this.tooltipPosition = this.tooltipPosition.replace("left", "right");
75
- }
76
- else if (this.tooltipPosition.includes("right") && shouldShiftLeft(this.el, this.toggletipEl.clientWidth)) {
77
- this.tooltipPosition = this.tooltipPosition.replace("right", "left");
78
- }
79
- requestAnimationFrame(() => {
80
- this.toggletipEl.classList.remove("hidden");
81
- });
82
- });
65
+ this.setToggletipPosition(this.tooltipPosition, this.el, this.toggletipEl.clientHeight, this.toggletipEl.clientWidth);
66
+ this.isOpen = true;
83
67
  this.announceToggletip();
84
68
  }
69
+ close() {
70
+ this.isOpen = false;
71
+ hideTooltip();
72
+ }
85
73
  handleBlur() {
86
74
  hideTooltip();
87
- // clear live region on blur to prevent old announcement text from being picked up by screen readers
75
+ // clear liveregion on blur to prevent old announcement text from being picked up by screen readers
88
76
  this.liveRegionEl.innerHTML = "";
89
77
  }
90
78
  announceToggletip() {
@@ -93,10 +81,26 @@ export class Toggletip {
93
81
  this.liveRegionEl.innerHTML = this.tooltip;
94
82
  }, 10);
95
83
  }
84
+ setToggletipPosition(pos, el, toggletipHeight, toggletipWidth) {
85
+ // Vertical
86
+ if (pos.includes("bottom") && shouldOpenUp(el, toggletipHeight)) {
87
+ pos = pos.replace("bottom", "top");
88
+ }
89
+ else if (pos.includes("top") && shouldOpenDown(el, toggletipHeight)) {
90
+ pos = pos.replace("top", "bottom");
91
+ }
92
+ // Horizontal
93
+ if (pos.includes("left") && shouldShiftRight(el, toggletipWidth)) {
94
+ pos = pos.replace("left", "right");
95
+ }
96
+ else if (pos.includes("right") && shouldShiftLeft(el, toggletipWidth)) {
97
+ pos = pos.replace("right", "left");
98
+ }
99
+ }
96
100
  render() {
97
- return (h(Host, { key: '32543d13ba5bb35fa974fe8f65194260888e8f82', class: `size-${this.targetSize}` }, h("button", { key: 'ec07b4bd3e2c12b4011f551386a7dd677a18d6ec', class: "button", type: "button", "aria-label": this.label, popoverTarget: "toggletip", popoverTargetAction: "toggle", onClick: () => this.open(),
98
- // In order to position the tooltip identically to the toggletip, its presence is determined by these four events
99
- onMouseEnter: () => showTooltip(this.tooltipPosition, this.el, this.tooltipMessage), onMouseLeave: () => hideTooltip(), onFocus: () => showTooltip(this.tooltipPosition, this.el, this.tooltipMessage), onBlur: () => this.handleBlur() }, h("div", { key: 'c5adc72bc9993bd38675ca3640d9cd899031a50d', class: "svg-icon svg-info" })), h("div", { key: '64fbe0df0fdfb1b84904a3b679b964811c6f36f6', popover: "", ref: (el) => (this.toggletipEl = el), class: `toggletip ${this.tooltipPosition} ${this.targetSize} hidden`, id: "toggletip" }, this.tooltip), h("div", { key: '2e75edec08f5f05fa2016c3da53f6beaa3edb8d9', ref: (el) => (this.liveRegionEl = el), class: "live-region sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true" })));
101
+ return (h(Host, { class: `size-${this.targetSize}` }, h("button", { class: "button", type: "button", "aria-label": this.label, onClick: () => this.open(),
102
+ // In order to position the tooltip identically to the toggletip, it's presence is determined by these four events
103
+ onMouseEnter: () => showTooltip(this.tooltipPosition, this.el, this.tooltipMessage), onMouseLeave: () => hideTooltip(), onFocus: () => showTooltip(this.tooltipPosition, this.el, this.tooltipMessage), onBlur: () => this.handleBlur() }, h("div", { class: "svg-icon svg-info" })), h("div", { ref: (el) => (this.toggletipEl = el), class: `toggletip ${this.isOpen ? "" : "hidden"} ${this.tooltipPosition}` }, this.tooltip), h("div", { ref: (el) => (this.liveRegionEl = el), class: "live-region sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true" })));
100
104
  }
101
105
  static get is() { return "wm-toggletip"; }
102
106
  static get encapsulation() { return "shadow"; }
@@ -132,7 +136,7 @@ export class Toggletip {
132
136
  },
133
137
  "tooltip": {
134
138
  "type": "string",
135
- "mutable": false,
139
+ "mutable": true,
136
140
  "complexType": {
137
141
  "original": "string",
138
142
  "resolved": "string",
@@ -168,7 +172,7 @@ export class Toggletip {
168
172
  "text": ""
169
173
  },
170
174
  "attribute": "tooltip-position",
171
- "reflect": false,
175
+ "reflect": true,
172
176
  "defaultValue": "\"bottom-right\""
173
177
  },
174
178
  "targetSize": {
@@ -191,6 +195,11 @@ export class Toggletip {
191
195
  }
192
196
  };
193
197
  }
198
+ static get states() {
199
+ return {
200
+ "isOpen": {}
201
+ };
202
+ }
194
203
  static get elementRef() { return "el"; }
195
204
  static get listeners() {
196
205
  return [{
@@ -0,0 +1,21 @@
1
+ import { newSpecPage } from "@stencil/core/testing";
2
+ import { Toggletip } from "./wm-toggletip";
3
+ describe("toggletip", () => {
4
+ let page;
5
+ beforeEach(async () => {
6
+ page = await newSpecPage({
7
+ components: [Toggletip],
8
+ html: `<wm-toggletip label="More information" tooltip="Further explanation"></wm-toggletip>`,
9
+ });
10
+ });
11
+ it("builds", async () => {
12
+ expect(page.root).toMatchSnapshot();
13
+ });
14
+ it("has proper aria roles & attributes", async () => {
15
+ const liveRegion = page.root.shadowRoot.querySelector(".live-region");
16
+ const button = page.root.shadowRoot.querySelector("button");
17
+ expect(liveRegion).toEqualAttribute("role", "status");
18
+ expect(button).toEqualAttribute("type", "button");
19
+ expect(button).toEqualAttribute("aria-label", "More information");
20
+ });
21
+ });
@@ -0,0 +1,70 @@
1
+ import { newE2EPage } from "@stencil/core/testing";
2
+ import { AxePuppeteer } from "@axe-core/puppeteer";
3
+ describe("wm-uploader", () => {
4
+ let page, input, label;
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-uploader button-text="Upload new document">
9
+ <wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="2020-01-28T22:29:10.397Z"></wm-file>
10
+ <wm-file id="file2" name="Second file" type="jpeg" last-updated="2019-02-14T12:21:05.397Z"></wm-file>
11
+ </wm-uploader>
12
+ </main></body></html>`);
13
+ input = await page.find("wm-uploader >>> input[type='file']");
14
+ label = await page.find("wm-uploader >>> label");
15
+ await page.waitForChanges();
16
+ });
17
+ it("passes Axe checks", async () => {
18
+ const results = await new AxePuppeteer(page).analyze();
19
+ expect(results.violations.length).toBe(0);
20
+ });
21
+ it("renders the component", async () => {
22
+ expect(input).not.toBeNull();
23
+ expect(label).not.toBeNull();
24
+ });
25
+ it("focuses previous file when deleting with the keyboard", async () => {
26
+ page = await newE2EPage();
27
+ await page.setContent(`<html lang='en'><head><title>Page</title></head><body><main><h1>Title</h1>
28
+ <wm-uploader button-text="Upload new document">
29
+ <wm-file id="file1" name="First file" type="pdf" file-actions="preview delete"></wm-file>
30
+ <wm-file id="file2" name="Second file" type="pdf" file-actions="delete"></wm-file>
31
+ </wm-uploader>
32
+ </main></body></html>`);
33
+ await page.waitForChanges();
34
+ let fileEls = await page.findAll("wm-file");
35
+ let secondFileEl = fileEls[1];
36
+ // inital check of file count
37
+ expect(fileEls.length).toBe(2);
38
+ // user must be tabbing for these changes to occur
39
+ await page.keyboard.press("Tab");
40
+ await page.keyboard.press("Tab");
41
+ await page.keyboard.press("Tab");
42
+ await page.keyboard.press("Tab");
43
+ await page.keyboard.press("Enter");
44
+ await page.waitForChanges();
45
+ // check focused element is last file, delete button
46
+ let activeElId = await page.evaluate(() => document.activeElement.id);
47
+ expect(activeElId).toBe("file2");
48
+ let activeElButtonType = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.classList[0]);
49
+ expect(activeElButtonType).toBe("delete-button");
50
+ let mockFileDeleteEvent = new CustomEvent("wmFileDelete");
51
+ //@ts-ignore
52
+ mockFileDeleteEvent.target = secondFileEl;
53
+ secondFileEl.dispatchEvent(mockFileDeleteEvent);
54
+ await page.evaluate(() => { var _a; return (_a = document.getElementById("file2")) === null || _a === void 0 ? void 0 : _a.remove(); });
55
+ await page.waitForChanges();
56
+ // confirm file has been removed
57
+ fileEls = await page.findAll("wm-file");
58
+ expect(fileEls.length).toBe(1);
59
+ // check focused element is last file, delete button
60
+ activeElId = await page.evaluate(() => document.activeElement.id);
61
+ expect(activeElId).toBe("file1");
62
+ activeElButtonType = await page.evaluate(() => document.activeElement.shadowRoot.activeElement.classList[0]);
63
+ expect(activeElButtonType).toBe("delete-button");
64
+ });
65
+ // it("disables the button dynamically", async () => {
66
+ // disabled when maxed out
67
+ // disabled while a file is uploading
68
+ // not disabled after upload
69
+ // });
70
+ });
@@ -300,9 +300,9 @@ export class Uploader {
300
300
  return (h("div", { class: `drop-area -${this.dropArea}`, ref: (el) => (this.dropAreaEl = el), onDragEnter: (ev) => this.handleDragEnter(ev), onDragOver: (ev) => this.handleDragOver(ev), onDragLeave: (ev) => this.handleDragLeave(ev), onDrop: (ev) => this.handleDrop(ev) }, this.dropArea == "page" && (h("div", { ref: (el) => (this.dropOverlayEl = el), class: "drop-overlay", popover: "manual" }, h("span", { class: "upload-arrow" }), h("span", null, "Drop to Upload")))));
301
301
  }
302
302
  render() {
303
- return (h(Host, { key: '05fa03d63ba14665a196bece2c82eabb4882ba82', class: `-${this.dropArea}` }, this.uploaderType == "drop" && this.renderDropArea(), this.label && this.renderLabel(), this.renderHeader(), this.renderListContainer(), h("div", { key: 'fd2c2779cc8f5e8aab480fdb68ac0e482905785d', ref: (el) => (this.assertiveLiveRegionEl = el), class: "live-region sr-only", "aria-live": "assertive" // since it's directly linked to the action the user took, it should be read in priority. With polite, some messages get dismissed in favor of the page title
303
+ return (h(Host, { class: `-${this.dropArea}` }, this.uploaderType == "drop" && this.renderDropArea(), this.label && this.renderLabel(), this.renderHeader(), this.renderListContainer(), h("div", { ref: (el) => (this.assertiveLiveRegionEl = el), class: "live-region sr-only", "aria-live": "assertive" // since it's directly linked to the action the user took, it should be read in priority. With polite, some messages get dismissed in favor of the page title
304
304
  ,
305
- "aria-atomic": "true" }), h("div", { key: '2a5c1d00d2a98bd40fa9ac8dbc248209cca470ba', ref: (el) => (this.politeLiveRegionEl = el), class: "live-region sr-only", "aria-live": "polite", "aria-atomic": "true" })));
305
+ "aria-atomic": "true" }), h("div", { ref: (el) => (this.politeLiveRegionEl = el), class: "live-region sr-only", "aria-live": "polite", "aria-atomic": "true" })));
306
306
  }
307
307
  static get is() { return "wm-uploader"; }
308
308
  static get encapsulation() { return "shadow"; }
@@ -0,0 +1,234 @@
1
+ jest.mock("../../global/services/http-service");
2
+ import { newSpecPage } from "@stencil/core/testing";
3
+ import { Uploader } from "./wm-uploader";
4
+ import { File } from "../wm-file/wm-file";
5
+ // mock ResizeObserver
6
+ global.ResizeObserver = jest.fn().mockImplementation(() => ({
7
+ observe: jest.fn(),
8
+ unobserve: jest.fn(),
9
+ disconnect: jest.fn(),
10
+ }));
11
+ // mock MutationObserver
12
+ global.MutationObserver = jest.fn().mockImplementation(() => ({
13
+ observe: jest.fn(),
14
+ unobserve: jest.fn(),
15
+ disconnect: jest.fn(),
16
+ }));
17
+ describe("wm-uploader", () => {
18
+ let html, page;
19
+ beforeEach(async () => {
20
+ html = `<wm-uploader
21
+ id="uploader1"
22
+ button-text="Upload new document"
23
+ max-size="200 MB"
24
+ max-files="5"
25
+ >
26
+ <wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
27
+ <wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
28
+ </wm-uploader>`;
29
+ page = await newSpecPage({ components: [Uploader, File], html });
30
+ await page.waitForChanges();
31
+ });
32
+ afterEach(() => {
33
+ html = undefined;
34
+ page = undefined;
35
+ });
36
+ it("has necessary aria properties", async () => {
37
+ let inputEl = page.root.shadowRoot.querySelector("input");
38
+ expect(inputEl).toEqualAttribute("aria-describedby", "file-count max-size accepted-types");
39
+ html = `<wm-uploader
40
+ id="uploader1"
41
+ button-text="Upload new document"
42
+ label="example label"
43
+ required-field="true"
44
+ ></wm-uploader>`;
45
+ page = await newSpecPage({ components: [Uploader, File], html });
46
+ await page.waitForChanges();
47
+ inputEl = page.root.shadowRoot.querySelector("input");
48
+ expect(inputEl).toEqualAttribute("aria-label", "example label, Upload new document");
49
+ expect(inputEl).toEqualAttribute("aria-required", "true");
50
+ html = `<wm-uploader
51
+ id="uploader1"
52
+ button-text="Upload new document"
53
+ required-field="true"
54
+ ></wm-uploader>`;
55
+ page = await newSpecPage({ components: [Uploader, File], html });
56
+ await page.waitForChanges();
57
+ inputEl = page.root.shadowRoot.querySelector("input");
58
+ expect(inputEl).toEqualAttribute("aria-label", "Upload new document");
59
+ html = `<wm-uploader
60
+ id="uploader1"
61
+ button-text="Upload new document"
62
+ label="Upload new document"
63
+ required-field="true"
64
+ ></wm-uploader>`;
65
+ page = await newSpecPage({ components: [Uploader, File], html });
66
+ await page.waitForChanges();
67
+ inputEl = page.root.shadowRoot.querySelector("input");
68
+ expect(inputEl).toEqualAttribute("aria-label", "Upload new document");
69
+ });
70
+ it("renders button text based on button-text prop", () => {
71
+ const labelEl = page.root.shadowRoot.querySelector("label");
72
+ expect(labelEl.textContent).toBe("Upload new document");
73
+ });
74
+ it("uploads files", async () => {
75
+ const input = page.root.shadowRoot.querySelector("input");
76
+ // fake files which the components uploadFiles() function will process
77
+ // @ts-ignore
78
+ input.files = {
79
+ length: 2,
80
+ 0: {
81
+ lastModified: 1562163068000,
82
+ lastModifiedDate: new Date(1562163068000),
83
+ name: "third_file.pdf",
84
+ size: 104857600,
85
+ type: "application/pdf",
86
+ webkitRelativePath: "",
87
+ },
88
+ 1: {
89
+ lastModified: 1562062469000,
90
+ lastModifiedDate: new Date(1562062469000),
91
+ name: "fourth file.jpg",
92
+ size: 123456,
93
+ type: "image/jpeg",
94
+ webkitRelativePath: "",
95
+ },
96
+ };
97
+ // triggering the change event will run validations and emit event wmUploaderFilesSelected
98
+ const ev = new Event("change");
99
+ let validFiles = [];
100
+ page.root.addEventListener("wmUploaderFilesSelected", (ev) => (validFiles = ev.detail));
101
+ input.dispatchEvent(ev);
102
+ await page.waitForChanges();
103
+ expect(validFiles[0].name).toBe("third_file.pdf");
104
+ expect(validFiles[1].size).toBe(123456);
105
+ });
106
+ it("disables button when upload is in progress", async () => {
107
+ html = `<wm-uploader id="uploader1">
108
+ <wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB" progress="30"></wm-file>
109
+ <wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
110
+ </wm-uploader>`;
111
+ page = await newSpecPage({ components: [Uploader, File], html });
112
+ await page.waitForChanges();
113
+ const labelEl = page.root.shadowRoot.querySelector("label");
114
+ expect(labelEl).toHaveClass("disabled");
115
+ });
116
+ it("renders max-files text, if set", async () => {
117
+ let html, page;
118
+ html = `<wm-uploader
119
+ id="uploader1"
120
+ button-text="Upload new document"
121
+ ></wm-uploader>`;
122
+ page = await newSpecPage({ components: [Uploader, File], html });
123
+ await page.waitForChanges();
124
+ let fileCountEl = page.root.shadowRoot.querySelector("#file-count");
125
+ expect(fileCountEl).toBeFalsy();
126
+ html = `<wm-uploader
127
+ id="uploader1"
128
+ max-files="3"
129
+ >
130
+ <wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
131
+ <wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
132
+ </wm-uploader>`;
133
+ page = await newSpecPage({ components: [Uploader, File], html });
134
+ await page.waitForChanges();
135
+ fileCountEl = page.root.shadowRoot.querySelector("#file-count");
136
+ expect(fileCountEl).toBeTruthy();
137
+ expect(fileCountEl.textContent).toBe("2 of 3 Files");
138
+ });
139
+ it("renders max-size text, if set", async () => {
140
+ let html, page;
141
+ html = `<wm-uploader
142
+ id="uploader1"
143
+ button-text="Upload new document"
144
+ ></wm-uploader>`;
145
+ page = await newSpecPage({ components: [Uploader, File], html });
146
+ await page.waitForChanges();
147
+ let maxSizeEl = page.root.shadowRoot.querySelector("#max-size");
148
+ expect(maxSizeEl).toBeFalsy();
149
+ html = `<wm-uploader
150
+ id="uploader1"
151
+ max-size="25 MB"
152
+ button-text="Upload new document"
153
+ ></wm-uploader>`;
154
+ page = await newSpecPage({ components: [Uploader, File], html });
155
+ await page.waitForChanges();
156
+ maxSizeEl = page.root.shadowRoot.querySelector("#max-size");
157
+ expect(maxSizeEl).toBeTruthy();
158
+ expect(maxSizeEl.textContent).toBe("Maximum file size 25 MB");
159
+ });
160
+ it("announces error when max-files has been reached and button clicked", async () => {
161
+ html = `<wm-uploader
162
+ id="uploader1"
163
+ max-files="2"
164
+ >
165
+ <wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
166
+ <wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
167
+ </wm-uploader>`;
168
+ page = await newSpecPage({ components: [Uploader, File], html });
169
+ await page.waitForChanges();
170
+ const input = page.root.shadowRoot.querySelector("input");
171
+ input.click();
172
+ await page.waitForChanges();
173
+ const liveRegion = page.root.shadowRoot.querySelector(".live-region").textContent;
174
+ expect(liveRegion).toBe("The maximum number of files has been reached");
175
+ });
176
+ it("singularizes the accepted file types message", async () => {
177
+ let message = page.root.shadowRoot.querySelector("#accepted-types").textContent;
178
+ expect(message).toBe("Accepted file types: .pdf, .txt, .log, .xml, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .gif, .jpg, .jpeg, .png, .csv");
179
+ html = `<wm-uploader
180
+ id="uploader1"
181
+ file-types="jpeg"
182
+ button-text="Upload new document"
183
+ files='[{"id": "file1", "name": "File retrieved from server", "type": "pdf", "lastUpdated": "1/28/2020"},{"id": "file2", "name": "Second file", "type": "jpeg", "lastUpdated": "2/14/2019"}]'
184
+ ></wm-uploader>`;
185
+ page = await newSpecPage({ components: [Uploader, File], html });
186
+ await page.waitForChanges();
187
+ message = page.root.shadowRoot.querySelector("#accepted-types").textContent;
188
+ expect(message).toBe("Accepted file type: .jpeg");
189
+ });
190
+ it("provides wm-files with the proper show-info", async () => {
191
+ // defaults to time
192
+ let infoEl = await page.root.querySelector("wm-file").shadowRoot.querySelector(".file-info");
193
+ expect(infoEl.textContent).toBe("1/28/2020");
194
+ // size
195
+ html = `<wm-uploader
196
+ id="uploader1"
197
+ button-text="Upload new document"
198
+ show-info="size"
199
+ >
200
+ <wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
201
+ <wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
202
+ </wm-uploader>`;
203
+ page = await newSpecPage({ components: [Uploader, File], html });
204
+ await page.waitForChanges();
205
+ infoEl = await page.root.querySelector("wm-file").shadowRoot.querySelector(".file-info");
206
+ expect(infoEl.textContent).toBe("28 KB");
207
+ // time
208
+ html = `<wm-uploader
209
+ id="uploader1"
210
+ button-text="Upload new document"
211
+ show-info="time"
212
+ >
213
+ <wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
214
+ <wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
215
+ </wm-uploader>`;
216
+ page = await newSpecPage({ components: [Uploader, File], html });
217
+ await page.waitForChanges();
218
+ infoEl = await page.root.querySelector("wm-file").shadowRoot.querySelector(".file-info");
219
+ expect(infoEl.textContent).toBe("1/28/2020");
220
+ // none
221
+ html = `<wm-uploader
222
+ id="uploader1"
223
+ button-text="Upload new document"
224
+ show-info="none"
225
+ >
226
+ <wm-file id="file1" name="File retrieved from server" type="pdf" last-updated="1/28/2020" size="28 KB"></wm-file>
227
+ <wm-file id="file2" name="Second file" type="jpeg" last-updated="2/14/2019" size="3 MB""></wm-file>
228
+ </wm-uploader>`;
229
+ page = await newSpecPage({ components: [Uploader, File], html });
230
+ await page.waitForChanges();
231
+ infoEl = await page.root.querySelector("wm-file").shadowRoot.querySelector(".file-info");
232
+ expect(infoEl).toBe(null);
233
+ });
234
+ });