@watermarkinsights/ripple 3.24.0 → 3.24.1

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 (554) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/{chartFunctions-5309f8ed.js → chartFunctions-da36e4cb.js} +591 -586
  3. package/dist/cjs/chartFunctions-da36e4cb.js.map +1 -0
  4. package/dist/cjs/{functions-6d2a5824.js → functions-9ddaeb33.js} +468 -468
  5. package/dist/cjs/{functions-6d2a5824.js.map → functions-9ddaeb33.js.map} +1 -1
  6. package/dist/cjs/{global-d20d5267.js → global-a563c2d1.js} +63 -63
  7. package/dist/cjs/global-a563c2d1.js.map +1 -0
  8. package/dist/cjs/{http-service-9e8c4dd5.js → http-service-494d81de.js} +50 -50
  9. package/dist/cjs/http-service-494d81de.js.map +1 -0
  10. package/dist/cjs/{interfaces-30a74c1f.js → interfaces-a3338581.js} +30 -30
  11. package/dist/cjs/interfaces-a3338581.js.map +1 -0
  12. package/dist/cjs/loader.cjs.js +1 -1
  13. package/dist/cjs/priv-chart-popover.cjs.entry.js +91 -91
  14. package/dist/cjs/priv-chart-popover.cjs.entry.js.map +1 -1
  15. package/dist/cjs/priv-datepicker.cjs.entry.js +657 -657
  16. package/dist/cjs/priv-datepicker.cjs.entry.js.map +1 -1
  17. package/dist/cjs/priv-navigator-button.cjs.entry.js +19 -19
  18. package/dist/cjs/priv-navigator-button.cjs.entry.js.map +1 -1
  19. package/dist/cjs/priv-navigator-item.cjs.entry.js +23 -23
  20. package/dist/cjs/priv-navigator-item.cjs.entry.js.map +1 -1
  21. package/dist/cjs/ripple.cjs.js +1 -1
  22. package/dist/cjs/wm-action-menu_2.cjs.entry.js +334 -334
  23. package/dist/cjs/wm-action-menu_2.cjs.entry.js.map +1 -1
  24. package/dist/cjs/wm-button.cjs.entry.js +260 -260
  25. package/dist/cjs/wm-button.cjs.entry.js.map +1 -1
  26. package/dist/cjs/wm-chart-slice.cjs.entry.js +18 -18
  27. package/dist/cjs/wm-chart-slice.cjs.entry.js.map +1 -1
  28. package/dist/cjs/wm-chart.cjs.entry.js +179 -179
  29. package/dist/cjs/wm-chart.cjs.entry.js.map +1 -1
  30. package/dist/cjs/wm-datepicker.cjs.entry.js +263 -263
  31. package/dist/cjs/wm-datepicker.cjs.entry.js.map +1 -1
  32. package/dist/cjs/wm-file-list.cjs.entry.js +35 -35
  33. package/dist/cjs/wm-file-list.cjs.entry.js.map +1 -1
  34. package/dist/cjs/wm-file.cjs.entry.js +201 -201
  35. package/dist/cjs/wm-file.cjs.entry.js.map +1 -1
  36. package/dist/cjs/wm-input.cjs.entry.js +139 -139
  37. package/dist/cjs/wm-input.cjs.entry.js.map +1 -1
  38. package/dist/cjs/wm-modal-footer.cjs.entry.js +33 -33
  39. package/dist/cjs/wm-modal-footer.cjs.entry.js.map +1 -1
  40. package/dist/cjs/wm-modal-header.cjs.entry.js +36 -36
  41. package/dist/cjs/wm-modal-header.cjs.entry.js.map +1 -1
  42. package/dist/cjs/wm-modal.cjs.entry.js +152 -152
  43. package/dist/cjs/wm-modal.cjs.entry.js.map +1 -1
  44. package/dist/cjs/wm-navigation_3.cjs.entry.js +234 -234
  45. package/dist/cjs/wm-navigation_3.cjs.entry.js.map +1 -1
  46. package/dist/cjs/wm-navigator.cjs.entry.js +264 -264
  47. package/dist/cjs/wm-navigator.cjs.entry.js.map +1 -1
  48. package/dist/cjs/wm-network-uploader.cjs.entry.js +467 -467
  49. package/dist/cjs/wm-network-uploader.cjs.entry.js.map +1 -1
  50. package/dist/cjs/wm-option_2.cjs.entry.js +771 -771
  51. package/dist/cjs/wm-option_2.cjs.entry.js.map +1 -1
  52. package/dist/cjs/wm-pagination.cjs.entry.js +179 -179
  53. package/dist/cjs/wm-pagination.cjs.entry.js.map +1 -1
  54. package/dist/cjs/wm-progress-indicator_3.cjs.entry.js +155 -155
  55. package/dist/cjs/wm-progress-indicator_3.cjs.entry.js.map +1 -1
  56. package/dist/cjs/wm-search.cjs.entry.js +191 -191
  57. package/dist/cjs/wm-search.cjs.entry.js.map +1 -1
  58. package/dist/cjs/wm-snackbar.cjs.entry.js +169 -169
  59. package/dist/cjs/wm-snackbar.cjs.entry.js.map +1 -1
  60. package/dist/cjs/wm-tab-item_3.cjs.entry.js +264 -264
  61. package/dist/cjs/wm-tab-item_3.cjs.entry.js.map +1 -1
  62. package/dist/cjs/wm-tag-input-row.cjs.entry.js +14 -14
  63. package/dist/cjs/wm-tag-input-row.cjs.entry.js.map +1 -1
  64. package/dist/cjs/wm-tag-input.cjs.entry.js +908 -908
  65. package/dist/cjs/wm-tag-input.cjs.entry.js.map +1 -1
  66. package/dist/cjs/wm-timepicker.cjs.entry.js +385 -385
  67. package/dist/cjs/wm-timepicker.cjs.entry.js.map +1 -1
  68. package/dist/cjs/wm-toggletip.cjs.entry.js +130 -130
  69. package/dist/cjs/wm-toggletip.cjs.entry.js.map +1 -1
  70. package/dist/cjs/wm-uploader.cjs.entry.js +510 -510
  71. package/dist/cjs/wm-uploader.cjs.entry.js.map +1 -1
  72. package/dist/cjs/wm-wrapper.cjs.entry.js +12 -12
  73. package/dist/cjs/wm-wrapper.cjs.entry.js.map +1 -1
  74. package/dist/collection/components/charts/chartFunctions.js +557 -552
  75. package/dist/collection/components/charts/chartFunctions.js.map +1 -1
  76. package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.js +268 -268
  77. package/dist/collection/components/charts/priv-chart-popover/priv-chart-popover.js.map +1 -1
  78. package/dist/collection/components/charts/wm-chart/wm-chart-slice.js +126 -126
  79. package/dist/collection/components/charts/wm-chart/wm-chart-slice.js.map +1 -1
  80. package/dist/collection/components/charts/wm-chart/wm-chart.js +447 -447
  81. package/dist/collection/components/charts/wm-chart/wm-chart.js.map +1 -1
  82. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-indicator.js +208 -208
  83. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-indicator.js.map +1 -1
  84. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.js +144 -144
  85. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-monitor.js.map +1 -1
  86. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-slice.js +122 -122
  87. package/dist/collection/components/charts/wm-progress-monitor/wm-progress-slice.js.map +1 -1
  88. package/dist/collection/components/wm-action-menu/wm-action-menu.js +473 -473
  89. package/dist/collection/components/wm-action-menu/wm-action-menu.js.map +1 -1
  90. package/dist/collection/components/wm-button/wm-button.js +576 -576
  91. package/dist/collection/components/wm-button/wm-button.js.map +1 -1
  92. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.js +984 -984
  93. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.js.map +1 -1
  94. package/dist/collection/components/wm-datepicker/wm-datepicker.js +492 -492
  95. package/dist/collection/components/wm-datepicker/wm-datepicker.js.map +1 -1
  96. package/dist/collection/components/wm-file/wm-file.js +334 -334
  97. package/dist/collection/components/wm-file/wm-file.js.map +1 -1
  98. package/dist/collection/components/wm-file-list/wm-file-list.js +153 -153
  99. package/dist/collection/components/wm-file-list/wm-file-list.js.map +1 -1
  100. package/dist/collection/components/wm-input/wm-input.js +444 -444
  101. package/dist/collection/components/wm-input/wm-input.js.map +1 -1
  102. package/dist/collection/components/wm-menuitem/wm-menuitem.js +455 -455
  103. package/dist/collection/components/wm-menuitem/wm-menuitem.js.map +1 -1
  104. package/dist/collection/components/wm-modal/wm-modal-footer.js +139 -139
  105. package/dist/collection/components/wm-modal/wm-modal-footer.js.map +1 -1
  106. package/dist/collection/components/wm-modal/wm-modal-header.js +88 -88
  107. package/dist/collection/components/wm-modal/wm-modal-header.js.map +1 -1
  108. package/dist/collection/components/wm-modal/wm-modal.js +463 -463
  109. package/dist/collection/components/wm-modal/wm-modal.js.map +1 -1
  110. package/dist/collection/components/wm-navigation/wm-navigation-hamburger.js +177 -177
  111. package/dist/collection/components/wm-navigation/wm-navigation-hamburger.js.map +1 -1
  112. package/dist/collection/components/wm-navigation/wm-navigation-item.js +131 -131
  113. package/dist/collection/components/wm-navigation/wm-navigation-item.js.map +1 -1
  114. package/dist/collection/components/wm-navigation/wm-navigation.js +227 -227
  115. package/dist/collection/components/wm-navigation/wm-navigation.js.map +1 -1
  116. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.js +107 -107
  117. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.js.map +1 -1
  118. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.js +124 -124
  119. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.js.map +1 -1
  120. package/dist/collection/components/wm-navigator/wm-navigator.js +468 -468
  121. package/dist/collection/components/wm-navigator/wm-navigator.js.map +1 -1
  122. package/dist/collection/components/wm-option/wm-option.js +436 -436
  123. package/dist/collection/components/wm-option/wm-option.js.map +1 -1
  124. package/dist/collection/components/wm-pagination/wm-pagination.js +371 -371
  125. package/dist/collection/components/wm-pagination/wm-pagination.js.map +1 -1
  126. package/dist/collection/components/wm-search/wm-search.js +447 -447
  127. package/dist/collection/components/wm-search/wm-search.js.map +1 -1
  128. package/dist/collection/components/wm-select/wm-select.js +1058 -1058
  129. package/dist/collection/components/wm-select/wm-select.js.map +1 -1
  130. package/dist/collection/components/wm-snackbar/wm-snackbar.js +297 -297
  131. package/dist/collection/components/wm-snackbar/wm-snackbar.js.map +1 -1
  132. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +212 -212
  133. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js.map +1 -1
  134. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js +328 -328
  135. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js.map +1 -1
  136. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +109 -109
  137. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js.map +1 -1
  138. package/dist/collection/components/wm-tag-input/wm-tag-input-row/wm-tag-input-row.js +123 -123
  139. package/dist/collection/components/wm-tag-input/wm-tag-input-row/wm-tag-input-row.js.map +1 -1
  140. package/dist/collection/components/wm-tag-input/wm-tag-input.js +1209 -1209
  141. package/dist/collection/components/wm-tag-input/wm-tag-input.js.map +1 -1
  142. package/dist/collection/components/wm-timepicker/wm-timepicker.js +606 -606
  143. package/dist/collection/components/wm-timepicker/wm-timepicker.js.map +1 -1
  144. package/dist/collection/components/wm-toggletip/wm-toggletip.js +254 -254
  145. package/dist/collection/components/wm-toggletip/wm-toggletip.js.map +1 -1
  146. package/dist/collection/components/wm-uploader/wm-network-uploader/wm-network-uploader.js +775 -775
  147. package/dist/collection/components/wm-uploader/wm-network-uploader/wm-network-uploader.js.map +1 -1
  148. package/dist/collection/components/wm-uploader/wm-uploader.js +1034 -1034
  149. package/dist/collection/components/wm-uploader/wm-uploader.js.map +1 -1
  150. package/dist/collection/components/wm-wrapper/wm-wrapper.js +29 -29
  151. package/dist/collection/components/wm-wrapper/wm-wrapper.js.map +1 -1
  152. package/dist/collection/dev/scripts.js +20 -20
  153. package/dist/collection/global/__mocks__/functions.js +7 -7
  154. package/dist/collection/global/__mocks__/functions.js.map +1 -1
  155. package/dist/collection/global/functions.js +511 -511
  156. package/dist/collection/global/functions.js.map +1 -1
  157. package/dist/collection/global/global.js +70 -70
  158. package/dist/collection/global/global.js.map +1 -1
  159. package/dist/collection/global/interfaces.js +50 -50
  160. package/dist/collection/global/interfaces.js.map +1 -1
  161. package/dist/collection/global/services/__mocks__/http-service.js +131 -131
  162. package/dist/collection/global/services/__mocks__/http-service.js.map +1 -1
  163. package/dist/collection/global/services/http-service.js +51 -51
  164. package/dist/collection/global/services/http-service.js.map +1 -1
  165. package/dist/collection/lang/lang.js +6 -6
  166. package/dist/collection/lang/lang.js.map +1 -1
  167. package/dist/collection/lang/missing.js +43 -43
  168. package/dist/collection/lang/piglatin.js +93 -93
  169. package/dist/esm/{chartFunctions-e22110b8.js → chartFunctions-b0a9e440.js} +591 -586
  170. package/dist/esm/chartFunctions-b0a9e440.js.map +1 -0
  171. package/dist/esm/{functions-c58046f2.js → functions-1c41e984.js} +468 -468
  172. package/dist/esm/{functions-c58046f2.js.map → functions-1c41e984.js.map} +1 -1
  173. package/dist/esm/{global-fee3549b.js → global-65156bcf.js} +63 -63
  174. package/dist/esm/global-65156bcf.js.map +1 -0
  175. package/dist/esm/{http-service-5d037e16.js → http-service-3dc3b3e7.js} +50 -50
  176. package/dist/esm/http-service-3dc3b3e7.js.map +1 -0
  177. package/dist/esm/{interfaces-61c6305b.js → interfaces-2b97fab2.js} +30 -30
  178. package/dist/esm/interfaces-2b97fab2.js.map +1 -0
  179. package/dist/esm/loader.js +1 -1
  180. package/dist/esm/polyfills/core-js.js +0 -0
  181. package/dist/esm/polyfills/dom.js +0 -0
  182. package/dist/esm/polyfills/es5-html-element.js +0 -0
  183. package/dist/esm/polyfills/index.js +0 -0
  184. package/dist/esm/polyfills/system.js +0 -0
  185. package/dist/esm/priv-chart-popover.entry.js +91 -91
  186. package/dist/esm/priv-chart-popover.entry.js.map +1 -1
  187. package/dist/esm/priv-datepicker.entry.js +657 -657
  188. package/dist/esm/priv-datepicker.entry.js.map +1 -1
  189. package/dist/esm/priv-navigator-button.entry.js +19 -19
  190. package/dist/esm/priv-navigator-button.entry.js.map +1 -1
  191. package/dist/esm/priv-navigator-item.entry.js +23 -23
  192. package/dist/esm/priv-navigator-item.entry.js.map +1 -1
  193. package/dist/esm/ripple.js +1 -1
  194. package/dist/esm/wm-action-menu_2.entry.js +334 -334
  195. package/dist/esm/wm-action-menu_2.entry.js.map +1 -1
  196. package/dist/esm/wm-button.entry.js +260 -260
  197. package/dist/esm/wm-button.entry.js.map +1 -1
  198. package/dist/esm/wm-chart-slice.entry.js +18 -18
  199. package/dist/esm/wm-chart-slice.entry.js.map +1 -1
  200. package/dist/esm/wm-chart.entry.js +179 -179
  201. package/dist/esm/wm-chart.entry.js.map +1 -1
  202. package/dist/esm/wm-datepicker.entry.js +263 -263
  203. package/dist/esm/wm-datepicker.entry.js.map +1 -1
  204. package/dist/esm/wm-file-list.entry.js +35 -35
  205. package/dist/esm/wm-file-list.entry.js.map +1 -1
  206. package/dist/esm/wm-file.entry.js +201 -201
  207. package/dist/esm/wm-file.entry.js.map +1 -1
  208. package/dist/esm/wm-input.entry.js +139 -139
  209. package/dist/esm/wm-input.entry.js.map +1 -1
  210. package/dist/esm/wm-modal-footer.entry.js +33 -33
  211. package/dist/esm/wm-modal-footer.entry.js.map +1 -1
  212. package/dist/esm/wm-modal-header.entry.js +36 -36
  213. package/dist/esm/wm-modal-header.entry.js.map +1 -1
  214. package/dist/esm/wm-modal.entry.js +152 -152
  215. package/dist/esm/wm-modal.entry.js.map +1 -1
  216. package/dist/esm/wm-navigation_3.entry.js +234 -234
  217. package/dist/esm/wm-navigation_3.entry.js.map +1 -1
  218. package/dist/esm/wm-navigator.entry.js +264 -264
  219. package/dist/esm/wm-navigator.entry.js.map +1 -1
  220. package/dist/esm/wm-network-uploader.entry.js +467 -467
  221. package/dist/esm/wm-network-uploader.entry.js.map +1 -1
  222. package/dist/esm/wm-option_2.entry.js +771 -771
  223. package/dist/esm/wm-option_2.entry.js.map +1 -1
  224. package/dist/esm/wm-pagination.entry.js +179 -179
  225. package/dist/esm/wm-pagination.entry.js.map +1 -1
  226. package/dist/esm/wm-progress-indicator_3.entry.js +155 -155
  227. package/dist/esm/wm-progress-indicator_3.entry.js.map +1 -1
  228. package/dist/esm/wm-search.entry.js +191 -191
  229. package/dist/esm/wm-search.entry.js.map +1 -1
  230. package/dist/esm/wm-snackbar.entry.js +169 -169
  231. package/dist/esm/wm-snackbar.entry.js.map +1 -1
  232. package/dist/esm/wm-tab-item_3.entry.js +264 -264
  233. package/dist/esm/wm-tab-item_3.entry.js.map +1 -1
  234. package/dist/esm/wm-tag-input-row.entry.js +14 -14
  235. package/dist/esm/wm-tag-input-row.entry.js.map +1 -1
  236. package/dist/esm/wm-tag-input.entry.js +908 -908
  237. package/dist/esm/wm-tag-input.entry.js.map +1 -1
  238. package/dist/esm/wm-timepicker.entry.js +385 -385
  239. package/dist/esm/wm-timepicker.entry.js.map +1 -1
  240. package/dist/esm/wm-toggletip.entry.js +130 -130
  241. package/dist/esm/wm-toggletip.entry.js.map +1 -1
  242. package/dist/esm/wm-uploader.entry.js +510 -510
  243. package/dist/esm/wm-uploader.entry.js.map +1 -1
  244. package/dist/esm/wm-wrapper.entry.js +12 -12
  245. package/dist/esm/wm-wrapper.entry.js.map +1 -1
  246. package/dist/esm-es5/{chartFunctions-e22110b8.js → chartFunctions-b0a9e440.js} +2 -2
  247. package/dist/esm-es5/chartFunctions-b0a9e440.js.map +1 -0
  248. package/dist/esm-es5/{functions-c58046f2.js → functions-1c41e984.js} +1 -1
  249. package/dist/esm-es5/{functions-c58046f2.js.map → functions-1c41e984.js.map} +1 -1
  250. package/dist/esm-es5/{global-fee3549b.js → global-65156bcf.js} +2 -2
  251. package/dist/esm-es5/global-65156bcf.js.map +1 -0
  252. package/dist/esm-es5/{http-service-5d037e16.js → http-service-3dc3b3e7.js} +1 -1
  253. package/dist/esm-es5/http-service-3dc3b3e7.js.map +1 -0
  254. package/dist/esm-es5/{interfaces-61c6305b.js → interfaces-2b97fab2.js} +1 -1
  255. package/dist/esm-es5/interfaces-2b97fab2.js.map +1 -0
  256. package/dist/esm-es5/loader.js +1 -1
  257. package/dist/esm-es5/priv-chart-popover.entry.js +1 -1
  258. package/dist/esm-es5/priv-chart-popover.entry.js.map +1 -1
  259. package/dist/esm-es5/priv-datepicker.entry.js +1 -1
  260. package/dist/esm-es5/priv-datepicker.entry.js.map +1 -1
  261. package/dist/esm-es5/priv-navigator-button.entry.js.map +1 -1
  262. package/dist/esm-es5/priv-navigator-item.entry.js.map +1 -1
  263. package/dist/esm-es5/ripple.js +1 -1
  264. package/dist/esm-es5/wm-action-menu_2.entry.js +1 -1
  265. package/dist/esm-es5/wm-action-menu_2.entry.js.map +1 -1
  266. package/dist/esm-es5/wm-button.entry.js +1 -1
  267. package/dist/esm-es5/wm-button.entry.js.map +1 -1
  268. package/dist/esm-es5/wm-chart-slice.entry.js.map +1 -1
  269. package/dist/esm-es5/wm-chart.entry.js +1 -1
  270. package/dist/esm-es5/wm-chart.entry.js.map +1 -1
  271. package/dist/esm-es5/wm-datepicker.entry.js +1 -1
  272. package/dist/esm-es5/wm-datepicker.entry.js.map +1 -1
  273. package/dist/esm-es5/wm-file-list.entry.js.map +1 -1
  274. package/dist/esm-es5/wm-file.entry.js +1 -1
  275. package/dist/esm-es5/wm-file.entry.js.map +1 -1
  276. package/dist/esm-es5/wm-input.entry.js +1 -1
  277. package/dist/esm-es5/wm-input.entry.js.map +1 -1
  278. package/dist/esm-es5/wm-modal-footer.entry.js.map +1 -1
  279. package/dist/esm-es5/wm-modal-header.entry.js +1 -1
  280. package/dist/esm-es5/wm-modal-header.entry.js.map +1 -1
  281. package/dist/esm-es5/wm-modal.entry.js +1 -1
  282. package/dist/esm-es5/wm-modal.entry.js.map +1 -1
  283. package/dist/esm-es5/wm-navigation_3.entry.js +1 -1
  284. package/dist/esm-es5/wm-navigation_3.entry.js.map +1 -1
  285. package/dist/esm-es5/wm-navigator.entry.js +1 -1
  286. package/dist/esm-es5/wm-navigator.entry.js.map +1 -1
  287. package/dist/esm-es5/wm-network-uploader.entry.js +1 -1
  288. package/dist/esm-es5/wm-network-uploader.entry.js.map +1 -1
  289. package/dist/esm-es5/wm-option_2.entry.js +1 -1
  290. package/dist/esm-es5/wm-option_2.entry.js.map +1 -1
  291. package/dist/esm-es5/wm-pagination.entry.js +1 -1
  292. package/dist/esm-es5/wm-pagination.entry.js.map +1 -1
  293. package/dist/esm-es5/wm-progress-indicator_3.entry.js +1 -1
  294. package/dist/esm-es5/wm-progress-indicator_3.entry.js.map +1 -1
  295. package/dist/esm-es5/wm-search.entry.js +1 -1
  296. package/dist/esm-es5/wm-search.entry.js.map +1 -1
  297. package/dist/esm-es5/wm-snackbar.entry.js +1 -1
  298. package/dist/esm-es5/wm-snackbar.entry.js.map +1 -1
  299. package/dist/esm-es5/wm-tab-item_3.entry.js +1 -1
  300. package/dist/esm-es5/wm-tab-item_3.entry.js.map +1 -1
  301. package/dist/esm-es5/wm-tag-input-row.entry.js.map +1 -1
  302. package/dist/esm-es5/wm-tag-input.entry.js +1 -1
  303. package/dist/esm-es5/wm-tag-input.entry.js.map +1 -1
  304. package/dist/esm-es5/wm-timepicker.entry.js +1 -1
  305. package/dist/esm-es5/wm-timepicker.entry.js.map +1 -1
  306. package/dist/esm-es5/wm-toggletip.entry.js +1 -1
  307. package/dist/esm-es5/wm-toggletip.entry.js.map +1 -1
  308. package/dist/esm-es5/wm-uploader.entry.js +1 -1
  309. package/dist/esm-es5/wm-uploader.entry.js.map +1 -1
  310. package/dist/esm-es5/wm-wrapper.entry.js.map +1 -1
  311. package/dist/ripple/{p-8e6bd600.system.entry.js → p-010b2cac.system.entry.js} +2 -2
  312. package/dist/ripple/p-010b2cac.system.entry.js.map +1 -0
  313. package/dist/ripple/{p-b22ba3a2.system.js → p-08950379.system.js} +2 -2
  314. package/dist/ripple/{p-c25abcc5.system.js → p-0b21e936.system.js} +2 -2
  315. package/dist/ripple/p-0b21e936.system.js.map +1 -0
  316. package/dist/ripple/p-0d7bccf7.entry.js.map +1 -1
  317. package/dist/ripple/{p-98a9eb8c.entry.js → p-136460c0.entry.js} +2 -2
  318. package/dist/ripple/p-136460c0.entry.js.map +1 -0
  319. package/dist/ripple/{p-695286e7.entry.js → p-1da75922.entry.js} +2 -2
  320. package/dist/ripple/p-1da75922.entry.js.map +1 -0
  321. package/dist/ripple/{p-0a23f0fa.entry.js → p-22d9c36e.entry.js} +2 -2
  322. package/dist/ripple/p-22d9c36e.entry.js.map +1 -0
  323. package/dist/ripple/p-24a4cb11.system.entry.js.map +1 -1
  324. package/dist/ripple/{p-c5a50724.entry.js → p-24f7d6eb.entry.js} +2 -2
  325. package/dist/ripple/p-24f7d6eb.entry.js.map +1 -0
  326. package/dist/ripple/{p-4c383e9e.system.entry.js → p-27d3e1ab.system.entry.js} +2 -2
  327. package/dist/ripple/p-27d3e1ab.system.entry.js.map +1 -0
  328. package/dist/ripple/p-2c2a7092.system.entry.js.map +1 -1
  329. package/dist/ripple/{p-fe63519a.system.entry.js → p-2f4b4e3a.system.entry.js} +2 -2
  330. package/dist/ripple/p-2f4b4e3a.system.entry.js.map +1 -0
  331. package/dist/ripple/{p-e8fd25c8.js → p-3303b568.js} +2 -2
  332. package/dist/ripple/p-3303b568.js.map +1 -0
  333. package/dist/ripple/p-33558ec4.system.entry.js.map +1 -1
  334. package/dist/ripple/{p-1a2d8112.system.entry.js → p-337f2c82.system.entry.js} +2 -2
  335. package/dist/ripple/p-337f2c82.system.entry.js.map +1 -0
  336. package/dist/ripple/{p-bfc8d2bb.entry.js → p-34567f7e.entry.js} +2 -2
  337. package/dist/ripple/p-34567f7e.entry.js.map +1 -0
  338. package/dist/ripple/{p-67373e6f.system.entry.js → p-3655a421.system.entry.js} +2 -2
  339. package/dist/ripple/p-3655a421.system.entry.js.map +1 -0
  340. package/dist/ripple/p-3759b7af.system.entry.js.map +1 -1
  341. package/dist/ripple/{p-0b31c210.entry.js → p-40cc5375.entry.js} +2 -2
  342. package/dist/ripple/p-40cc5375.entry.js.map +1 -0
  343. package/dist/ripple/{p-76830e28.entry.js → p-4370bb17.entry.js} +2 -2
  344. package/dist/ripple/p-4370bb17.entry.js.map +1 -0
  345. package/dist/ripple/p-4391166c.entry.js.map +1 -1
  346. package/dist/ripple/{p-888bec42.js → p-43f1298b.js} +1 -1
  347. package/dist/ripple/p-43f1298b.js.map +1 -0
  348. package/dist/ripple/{p-18e58141.system.entry.js → p-48c8619f.system.entry.js} +2 -2
  349. package/dist/ripple/p-48c8619f.system.entry.js.map +1 -0
  350. package/dist/ripple/p-4a014591.entry.js.map +1 -1
  351. package/dist/ripple/{p-ccd0d43b.system.entry.js → p-4acc9e8d.system.entry.js} +2 -2
  352. package/dist/ripple/p-4acc9e8d.system.entry.js.map +1 -0
  353. package/dist/ripple/{p-a3b9c87d.system.entry.js → p-52655351.system.entry.js} +2 -2
  354. package/dist/ripple/p-52655351.system.entry.js.map +1 -0
  355. package/dist/ripple/{p-2a9fa9b5.entry.js → p-54df11c8.entry.js} +2 -2
  356. package/dist/ripple/p-54df11c8.entry.js.map +1 -0
  357. package/dist/ripple/p-59654f8e.entry.js.map +1 -1
  358. package/dist/ripple/{p-535e33d7.entry.js → p-5bf24119.entry.js} +2 -2
  359. package/dist/ripple/p-5bf24119.entry.js.map +1 -0
  360. package/dist/ripple/{p-e746fe88.system.entry.js → p-60e941cc.system.entry.js} +2 -2
  361. package/dist/ripple/p-60e941cc.system.entry.js.map +1 -0
  362. package/dist/ripple/{p-f38332ed.system.entry.js → p-684f2c1e.system.entry.js} +2 -2
  363. package/dist/ripple/p-684f2c1e.system.entry.js.map +1 -0
  364. package/dist/ripple/{p-e61d2c52.entry.js → p-75c9cad6.entry.js} +2 -2
  365. package/dist/ripple/p-75c9cad6.entry.js.map +1 -0
  366. package/dist/ripple/{p-e252738e.entry.js → p-78a7278d.entry.js} +2 -2
  367. package/dist/ripple/p-78a7278d.entry.js.map +1 -0
  368. package/dist/ripple/{p-45e7b944.entry.js → p-81c698e2.entry.js} +2 -2
  369. package/dist/ripple/p-81c698e2.entry.js.map +1 -0
  370. package/dist/ripple/{p-87da5d8e.entry.js → p-82323561.entry.js} +2 -2
  371. package/dist/ripple/p-82323561.entry.js.map +1 -0
  372. package/dist/ripple/{p-2b577e99.entry.js → p-873a5f0f.entry.js} +2 -2
  373. package/dist/ripple/p-873a5f0f.entry.js.map +1 -0
  374. package/dist/ripple/p-8c51e9f8.system.entry.js.map +1 -1
  375. package/dist/ripple/{p-be954fba.system.entry.js → p-8e11777d.system.entry.js} +2 -2
  376. package/dist/ripple/p-8e11777d.system.entry.js.map +1 -0
  377. package/dist/ripple/{p-63166c83.system.entry.js → p-90d67afa.system.entry.js} +2 -2
  378. package/dist/ripple/p-90d67afa.system.entry.js.map +1 -0
  379. package/dist/ripple/p-976b2789.system.entry.js.map +1 -1
  380. package/dist/ripple/{p-3e9da0fb.system.entry.js → p-97f0722e.system.entry.js} +2 -2
  381. package/dist/ripple/p-97f0722e.system.entry.js.map +1 -0
  382. package/dist/ripple/p-9b9eb944.entry.js.map +1 -1
  383. package/dist/ripple/{p-4a45a473.entry.js → p-9c9cf5e7.entry.js} +2 -2
  384. package/dist/ripple/p-9c9cf5e7.entry.js.map +1 -0
  385. package/dist/ripple/{p-313b6073.system.js → p-9d02957d.system.js} +1 -1
  386. package/dist/ripple/p-9d02957d.system.js.map +1 -0
  387. package/dist/ripple/{p-7b85f5a8.entry.js → p-a1c4d1d2.entry.js} +2 -2
  388. package/dist/ripple/p-a1c4d1d2.entry.js.map +1 -0
  389. package/dist/ripple/{p-9727c8f5.entry.js → p-a6cd8eb1.entry.js} +2 -2
  390. package/dist/ripple/p-a6cd8eb1.entry.js.map +1 -0
  391. package/dist/ripple/{p-dfeb2a0f.system.entry.js → p-ab792e0d.system.entry.js} +2 -2
  392. package/dist/ripple/p-ab792e0d.system.entry.js.map +1 -0
  393. package/dist/ripple/{p-5e2be836.entry.js → p-ab996399.entry.js} +2 -2
  394. package/dist/ripple/p-ab996399.entry.js.map +1 -0
  395. package/dist/ripple/{p-85b47217.system.entry.js → p-ac27d425.system.entry.js} +2 -2
  396. package/dist/ripple/p-ac27d425.system.entry.js.map +1 -0
  397. package/dist/ripple/{p-4091aa36.system.js → p-b8783b39.system.js} +2 -2
  398. package/dist/ripple/p-b8783b39.system.js.map +1 -0
  399. package/dist/ripple/{p-525fbd6b.system.entry.js → p-be2aab24.system.entry.js} +2 -2
  400. package/dist/ripple/p-be2aab24.system.entry.js.map +1 -0
  401. package/dist/ripple/p-bf569af0.entry.js.map +1 -1
  402. package/dist/ripple/{p-d6478e67.system.entry.js → p-c63b63ee.system.entry.js} +2 -2
  403. package/dist/ripple/p-c63b63ee.system.entry.js.map +1 -0
  404. package/dist/ripple/{p-90f42d65.system.entry.js → p-ce0002d4.system.entry.js} +2 -2
  405. package/dist/ripple/p-ce0002d4.system.entry.js.map +1 -0
  406. package/dist/ripple/{p-54f29e18.entry.js → p-d23db6e2.entry.js} +2 -2
  407. package/dist/ripple/p-d23db6e2.entry.js.map +1 -0
  408. package/dist/ripple/p-d939cb54.entry.js.map +1 -1
  409. package/dist/ripple/p-dbfd1640.system.entry.js.map +1 -1
  410. package/dist/ripple/{p-bc883afc.entry.js → p-e29c4789.entry.js} +2 -2
  411. package/dist/ripple/p-e29c4789.entry.js.map +1 -0
  412. package/dist/ripple/{p-0cd88c74.entry.js → p-e6b9766e.entry.js} +2 -2
  413. package/dist/ripple/p-e6b9766e.entry.js.map +1 -0
  414. package/dist/ripple/{p-2abe8404.system.entry.js → p-e8dab7c0.system.entry.js} +2 -2
  415. package/dist/ripple/p-e8dab7c0.system.entry.js.map +1 -0
  416. package/dist/ripple/{p-dcd38073.system.entry.js → p-eb64d16a.system.entry.js} +2 -2
  417. package/dist/ripple/p-eb64d16a.system.entry.js.map +1 -0
  418. package/dist/ripple/{p-a31a30ac.system.entry.js → p-eccbad16.system.entry.js} +2 -2
  419. package/dist/ripple/p-eccbad16.system.entry.js.map +1 -0
  420. package/dist/ripple/{p-054e206a.entry.js → p-edae6ef2.entry.js} +2 -2
  421. package/dist/ripple/p-edae6ef2.entry.js.map +1 -0
  422. package/dist/ripple/{p-9fd3badc.js → p-edfba0e1.js} +1 -1
  423. package/dist/ripple/{p-9fd3badc.js.map → p-edfba0e1.js.map} +1 -1
  424. package/dist/ripple/{p-d0c3d25a.entry.js → p-efc36352.entry.js} +2 -2
  425. package/dist/ripple/p-efc36352.entry.js.map +1 -0
  426. package/dist/ripple/{p-e782194d.system.js → p-f08e6a5a.system.js} +1 -1
  427. package/dist/ripple/{p-e782194d.system.js.map → p-f08e6a5a.system.js.map} +1 -1
  428. package/dist/ripple/{p-29cd07d5.system.entry.js → p-f09541fc.system.entry.js} +2 -2
  429. package/dist/ripple/p-f09541fc.system.entry.js.map +1 -0
  430. package/dist/ripple/{p-4aa0ee75.system.entry.js → p-f4487f66.system.entry.js} +2 -2
  431. package/dist/ripple/p-f4487f66.system.entry.js.map +1 -0
  432. package/dist/ripple/{p-08b7ec08.system.js → p-f5df5903.system.js} +1 -1
  433. package/dist/ripple/p-f5df5903.system.js.map +1 -0
  434. package/dist/ripple/{p-23e54ad4.js → p-f8d1e5a0.js} +2 -2
  435. package/dist/ripple/p-f8d1e5a0.js.map +1 -0
  436. package/dist/ripple/{p-a6d6eae7.js → p-fd8070fb.js} +1 -1
  437. package/dist/ripple/p-fd8070fb.js.map +1 -0
  438. package/dist/ripple/ripple.esm.js +1 -1
  439. package/dist/ripple/ripple.js +1 -1
  440. package/dist/types/components/charts/chartFunctions.d.ts +37 -37
  441. package/dist/types/components/charts/priv-chart-popover/priv-chart-popover.d.ts +27 -27
  442. package/dist/types/components/charts/wm-chart/wm-chart-slice.d.ts +11 -11
  443. package/dist/types/components/charts/wm-chart/wm-chart.d.ts +47 -47
  444. package/dist/types/components/charts/wm-progress-monitor/wm-progress-indicator.d.ts +29 -29
  445. package/dist/types/components/charts/wm-progress-monitor/wm-progress-monitor.d.ts +20 -20
  446. package/dist/types/components/charts/wm-progress-monitor/wm-progress-slice.d.ts +10 -10
  447. package/dist/types/components/wm-action-menu/wm-action-menu.d.ts +49 -49
  448. package/dist/types/components/wm-button/wm-button.d.ts +49 -49
  449. package/dist/types/components/wm-datepicker/priv-datepicker/priv-datepicker.d.ts +80 -80
  450. package/dist/types/components/wm-datepicker/wm-datepicker.d.ts +42 -42
  451. package/dist/types/components/wm-file/wm-file.d.ts +42 -42
  452. package/dist/types/components/wm-file-list/wm-file-list.d.ts +16 -16
  453. package/dist/types/components/wm-input/wm-input.d.ts +46 -46
  454. package/dist/types/components/wm-menuitem/wm-menuitem.d.ts +34 -34
  455. package/dist/types/components/wm-modal/wm-modal-footer.d.ts +14 -14
  456. package/dist/types/components/wm-modal/wm-modal-header.d.ts +11 -11
  457. package/dist/types/components/wm-modal/wm-modal.d.ts +40 -40
  458. package/dist/types/components/wm-navigation/wm-navigation-hamburger.d.ts +21 -21
  459. package/dist/types/components/wm-navigation/wm-navigation-item.d.ts +13 -13
  460. package/dist/types/components/wm-navigation/wm-navigation.d.ts +28 -28
  461. package/dist/types/components/wm-navigator/priv-navigator-button/priv-navigator-button.d.ts +10 -10
  462. package/dist/types/components/wm-navigator/priv-navigator-item/priv-navigator-item.d.ts +13 -13
  463. package/dist/types/components/wm-navigator/wm-navigator.d.ts +61 -61
  464. package/dist/types/components/wm-option/wm-option.d.ts +34 -34
  465. package/dist/types/components/wm-pagination/wm-pagination.d.ts +32 -32
  466. package/dist/types/components/wm-search/wm-search.d.ts +77 -77
  467. package/dist/types/components/wm-select/wm-select.d.ts +102 -102
  468. package/dist/types/components/wm-snackbar/wm-snackbar.d.ts +35 -35
  469. package/dist/types/components/wm-tabs/wm-tab-item/wm-tab-item.d.ts +37 -37
  470. package/dist/types/components/wm-tabs/wm-tab-list/wm-tab-list.d.ts +52 -52
  471. package/dist/types/components/wm-tabs/wm-tab-panel/wm-tab-panel.d.ts +20 -20
  472. package/dist/types/components/wm-tag-input/wm-tag-input-row/wm-tag-input-row.d.ts +11 -11
  473. package/dist/types/components/wm-tag-input/wm-tag-input.d.ts +127 -127
  474. package/dist/types/components/wm-timepicker/wm-timepicker.d.ts +62 -62
  475. package/dist/types/components/wm-toggletip/wm-toggletip.d.ts +28 -28
  476. package/dist/types/components/wm-uploader/wm-network-uploader/wm-network-uploader.d.ts +85 -85
  477. package/dist/types/components/wm-uploader/wm-uploader.d.ts +104 -104
  478. package/dist/types/components/wm-wrapper/wm-wrapper.d.ts +7 -7
  479. package/dist/types/components.d.ts +27 -27
  480. package/dist/types/global/__mocks__/functions.d.ts +6 -6
  481. package/dist/types/global/functions.d.ts +47 -47
  482. package/dist/types/global/global.d.ts +1 -1
  483. package/dist/types/global/interfaces.d.ts +74 -74
  484. package/dist/types/global/services/__mocks__/http-service.d.ts +6 -6
  485. package/dist/types/global/services/http-service.d.ts +4 -4
  486. package/dist/types/lang/lang.d.ts +5 -5
  487. package/package.json +46 -46
  488. package/dist/cjs/chartFunctions-5309f8ed.js.map +0 -1
  489. package/dist/cjs/global-d20d5267.js.map +0 -1
  490. package/dist/cjs/http-service-9e8c4dd5.js.map +0 -1
  491. package/dist/cjs/interfaces-30a74c1f.js.map +0 -1
  492. package/dist/esm/chartFunctions-e22110b8.js.map +0 -1
  493. package/dist/esm/global-fee3549b.js.map +0 -1
  494. package/dist/esm/http-service-5d037e16.js.map +0 -1
  495. package/dist/esm/interfaces-61c6305b.js.map +0 -1
  496. package/dist/esm-es5/chartFunctions-e22110b8.js.map +0 -1
  497. package/dist/esm-es5/global-fee3549b.js.map +0 -1
  498. package/dist/esm-es5/http-service-5d037e16.js.map +0 -1
  499. package/dist/esm-es5/interfaces-61c6305b.js.map +0 -1
  500. package/dist/ripple/p-054e206a.entry.js.map +0 -1
  501. package/dist/ripple/p-08b7ec08.system.js.map +0 -1
  502. package/dist/ripple/p-0a23f0fa.entry.js.map +0 -1
  503. package/dist/ripple/p-0b31c210.entry.js.map +0 -1
  504. package/dist/ripple/p-0cd88c74.entry.js.map +0 -1
  505. package/dist/ripple/p-18e58141.system.entry.js.map +0 -1
  506. package/dist/ripple/p-1a2d8112.system.entry.js.map +0 -1
  507. package/dist/ripple/p-23e54ad4.js.map +0 -1
  508. package/dist/ripple/p-29cd07d5.system.entry.js.map +0 -1
  509. package/dist/ripple/p-2a9fa9b5.entry.js.map +0 -1
  510. package/dist/ripple/p-2abe8404.system.entry.js.map +0 -1
  511. package/dist/ripple/p-2b577e99.entry.js.map +0 -1
  512. package/dist/ripple/p-313b6073.system.js.map +0 -1
  513. package/dist/ripple/p-3e9da0fb.system.entry.js.map +0 -1
  514. package/dist/ripple/p-4091aa36.system.js.map +0 -1
  515. package/dist/ripple/p-45e7b944.entry.js.map +0 -1
  516. package/dist/ripple/p-4a45a473.entry.js.map +0 -1
  517. package/dist/ripple/p-4aa0ee75.system.entry.js.map +0 -1
  518. package/dist/ripple/p-4c383e9e.system.entry.js.map +0 -1
  519. package/dist/ripple/p-525fbd6b.system.entry.js.map +0 -1
  520. package/dist/ripple/p-535e33d7.entry.js.map +0 -1
  521. package/dist/ripple/p-54f29e18.entry.js.map +0 -1
  522. package/dist/ripple/p-5e2be836.entry.js.map +0 -1
  523. package/dist/ripple/p-63166c83.system.entry.js.map +0 -1
  524. package/dist/ripple/p-67373e6f.system.entry.js.map +0 -1
  525. package/dist/ripple/p-695286e7.entry.js.map +0 -1
  526. package/dist/ripple/p-76830e28.entry.js.map +0 -1
  527. package/dist/ripple/p-7b85f5a8.entry.js.map +0 -1
  528. package/dist/ripple/p-85b47217.system.entry.js.map +0 -1
  529. package/dist/ripple/p-87da5d8e.entry.js.map +0 -1
  530. package/dist/ripple/p-888bec42.js.map +0 -1
  531. package/dist/ripple/p-8e6bd600.system.entry.js.map +0 -1
  532. package/dist/ripple/p-90f42d65.system.entry.js.map +0 -1
  533. package/dist/ripple/p-9727c8f5.entry.js.map +0 -1
  534. package/dist/ripple/p-98a9eb8c.entry.js.map +0 -1
  535. package/dist/ripple/p-a31a30ac.system.entry.js.map +0 -1
  536. package/dist/ripple/p-a3b9c87d.system.entry.js.map +0 -1
  537. package/dist/ripple/p-a6d6eae7.js.map +0 -1
  538. package/dist/ripple/p-bc883afc.entry.js.map +0 -1
  539. package/dist/ripple/p-be954fba.system.entry.js.map +0 -1
  540. package/dist/ripple/p-bfc8d2bb.entry.js.map +0 -1
  541. package/dist/ripple/p-c25abcc5.system.js.map +0 -1
  542. package/dist/ripple/p-c5a50724.entry.js.map +0 -1
  543. package/dist/ripple/p-ccd0d43b.system.entry.js.map +0 -1
  544. package/dist/ripple/p-d0c3d25a.entry.js.map +0 -1
  545. package/dist/ripple/p-d6478e67.system.entry.js.map +0 -1
  546. package/dist/ripple/p-dcd38073.system.entry.js.map +0 -1
  547. package/dist/ripple/p-dfeb2a0f.system.entry.js.map +0 -1
  548. package/dist/ripple/p-e252738e.entry.js.map +0 -1
  549. package/dist/ripple/p-e61d2c52.entry.js.map +0 -1
  550. package/dist/ripple/p-e746fe88.system.entry.js.map +0 -1
  551. package/dist/ripple/p-e8fd25c8.js.map +0 -1
  552. package/dist/ripple/p-f38332ed.system.entry.js.map +0 -1
  553. package/dist/ripple/p-fe63519a.system.entry.js.map +0 -1
  554. /package/dist/ripple/{p-b22ba3a2.system.js.map → p-08950379.system.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"names":["privDatepickerCss","PrivDatepicker","this","popupClicked","buttonClicked","prevClicked","nextClicked","openUp","calendar_months","intl","formatMessage","id","defaultMessage","description","weekdays","renderCalendarDate","date","index","monthOfDate","removeZeroes","String","dayOfDate","isThisMonth","monthInFocus","dateId","isToday","isDateToday","h","role","parentId","class","onClick","ev","handleTriggeredDate","target","onKeyDown","trapFocusEnd","onBlur","stopPropagation","Date","getUTCFullYear","getUTCMonth","getUTCDate","selectedMonth","selectedYear","selectedDay","handleKey","key","preventDefault","includes","click","isExpanded","closePopup","backOneMonth","forwardOneMonth","unfocusCell","dayInFocus","forceUpdate","el","getMonthDays","yearInFocus","view","newMonth","getPreviousMonth","month","year","unfocusMonth","monthNumInFocus","getNextMonth","numDaysToSubtract","openPopup","document","activeElement","shadowRoot","classList","contains","focusCell","changeoverDate","activeEl","tagName","focusMonth","toggleTabbingOn","validKeys","isTabbing","toggleTabbingOff","blurHandler","popupBlurred","emit","relatedTarget","handleBlurOnWindow","componentDidUpdate","handleSelectedDate","prevButton","focus","nextButton","componentDidLoad","setDateValuesForView","zeroPad","value","length","prototype","padStart","targetLength","padString","repeat","slice","toString","today","todayDateArray","getFullYear","getMonth","getDate","reduce","result","val","togglePopup","returnFocus","popupEl","remove","window","setTimeout","style","visibility","changeView","buttonEl","panelPosition","requestAnimationFrame","add","months30","leapYear","getMonthFirstDay","getDay","prevMonth","prevMonthYear","nextMonth","nextMonthYear","getCalendarDates","monthDays","monthFirstDay","daysFromPrevMonth","daysFromNextMonth","prevMonthDays","prevMonthDates","Array","fill","map","_","day","thisMonthDates","nextMonthDates","totalDays","updateLiveRegion","cellTriggered","selectedDate","removeAttribute","getCellById","setAttribute","querySelector","cellToUnfocus","tabIndex","maxDays","cellToFocus","monthToUnfocus","monthToFocus","trapFocusLeft","shiftKey","focusCellInView","trapFocusRight","toggleBusyAttribute","state","text","liveRegion","innerHTML","host","getElementById","labelHeight","clientHeight","shouldOpenUp","hasRoomRight","left","right","newView","renderMonths","tabindex","render","dates","disabled","bind","ref","title","i"],"sources":["./src/components/wm-datepicker/priv-datepicker/priv-datepicker.scss?tag=priv-datepicker","./src/components/wm-datepicker/priv-datepicker/priv-datepicker.tsx"],"sourcesContent":[".toggle {\n all: unset;\n cursor: pointer;\n padding: rem-calc(0px 6px);\n height: rem-calc(38);\n border: none;\n -moz-border-top-right-radius: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px;\n -moz-border-bottom-right-radius: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px;\n\n // reset styles inherited from Planning in browsers without shadow DOM\n -moz-border-top-left-radius: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-bottom-left-radius: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0;\n @include box-shadow(none);\n background-color: $button-default-background;\n\n &:disabled {\n pointer-events: none;\n @include box-shadow(none);\n background-color: rgba(74, 74, 74, 0.05);\n .calendar::after {\n color: #7b7b7b;\n }\n }\n\n &:hover {\n @include box-shadow(none);\n background: mix(black, $button-default-background, 10%);\n\n .calendar::after {\n color: $button-default-text;\n }\n }\n\n [dir=\"RTL\"] & {\n right: auto;\n left: 0;\n }\n\n span::after {\n @include mdi-icon;\n content: \"\\f0ed\";\n font-size: rem-calc(24);\n color: $button-default-text;\n padding: 0;\n line-height: rem-calc(40);\n }\n\n &:focus {\n outline: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n}\n\n.user-is-tabbing {\n .toggle:focus {\n @include focus-style;\n }\n}\n\n.popup {\n visibility: hidden;\n font-family: inherit;\n @include border-radius(3px);\n @include box-shadow(0px 4px 15px 0px rgba(0, 0, 0, 0.2));\n width: rem-calc(336);\n z-index: 10;\n //relative to inner wrapper in wm-datepicker, which contains the input and priv-datepicker\n position: absolute;\n left: 0;\n top: 40px;\n min-height: rem-calc(337);\n transition: transform 0.25s ease;\n transform-origin: center top;\n transform: scale(1, 0);\n background-color: $light-background;\n\n &.open {\n // display: block;\n transform: scale(1, 1);\n }\n\n &.expand-upwards {\n top: auto;\n bottom: rem-calc(38);\n transform-origin: center bottom;\n }\n\n .calendar-header {\n @include displayFlex();\n @include justifyContent(space-between);\n position: relative;\n padding: rem-calc(15 4);\n\n .title-box {\n height: rem-calc(42);\n @include border-radius(3px);\n border: 1px solid;\n font-weight: 500;\n font-size: rem-calc(14);\n background: transparent;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: rem-calc(0 6 0 12);\n border-color: $button-default-text;\n color: $button-default-text;\n\n &:after {\n @include mdi-icon;\n content: \"\\f140\";\n padding-left: rem-calc(12);\n }\n\n &.year:after {\n content: \"\\f143\";\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n .arw-btn {\n cursor: pointer;\n @include border-radius(50%);\n width: rem-calc(44);\n height: rem-calc(44);\n border: none;\n color: $button-default-text;\n background: transparent;\n padding: 0;\n @include box-shadow(none);\n line-height: rem-calc(44);\n\n .mdi {\n @include mdi-icon;\n font-size: rem-calc(24);\n font-weight: normal;\n line-height: rem-calc(44);\n\n &:hover {\n background-color: #efeef1;\n }\n }\n\n &:focus {\n outline: none;\n }\n\n &:active {\n @include scale($xVal: 0.9, $yVal: 0.9);\n background-color: #d7d6d9;\n }\n }\n }\n\n .day-view {\n min-width: 100%;\n\n .date-grid {\n width: 100%;\n text-align: center;\n border-collapse: collapse;\n margin-bottom: rem-calc(7);\n color: #757575;\n\n .date-row:first-child {\n .date-cell {\n margin-top: rem-calc(2);\n }\n }\n\n .date-header {\n background-color: rgb(238, 237, 244);\n }\n\n .header-cell {\n height: rem-calc(33);\n line-height: rem-calc(33);\n width: rem-calc(44);\n margin: 0 calc((14.28% - 44px) / 2);\n padding: 0;\n display: inline-block;\n font-size: rem-calc(13);\n font-weight: bold;\n color: #4a4a4a;\n border: none;\n }\n\n .date-cell {\n cursor: pointer;\n display: inline-block;\n padding: 0;\n @include border-radius(50%);\n height: rem-calc(44);\n width: rem-calc(44);\n margin: 0 calc((14.28% - 44px) / 2);\n font-size: rem-calc(14);\n font-weight: 500;\n line-height: rem-calc(44);\n\n &:focus {\n outline: none;\n }\n\n &:hover {\n background-color: #efeef1;\n }\n\n &:active {\n background-color: $button-primary-background;\n color: #ffffff;\n }\n\n &.current-month {\n color: #4a4a4a;\n\n &[aria-selected=\"true\"] {\n background-color: $button-primary-background;\n color: #ffffff;\n }\n }\n }\n }\n }\n\n .month-view {\n .months {\n border-top: 2px solid;\n border-top-color: #eeedf4;\n @include displayFlex();\n flex-wrap: wrap;\n }\n\n .month-row {\n @include displayFlex();\n @include justifyContent(space-between);\n width: 100%;\n border-bottom: 2px solid;\n border-bottom-color: #eeedf4;\n }\n\n .month {\n cursor: pointer;\n text-align: center;\n width: 100%;\n height: rem-calc(64);\n line-height: rem-calc(64);\n font-weight: 500;\n color: $button-default-text;\n\n &:not(:last-child) {\n border-right: 2px solid;\n border-right-color: #eeedf4;\n }\n\n &:focus {\n outline: none;\n }\n\n &:hover {\n background-color: #efeef1;\n }\n\n &:active,\n &.selected {\n background-color: #575195;\n color: #ffffff;\n }\n }\n }\n\n &.user-is-tabbing {\n button:focus,\n .title-box:focus,\n .date-cell:focus,\n .month:focus {\n @include focus-style;\n border: none;\n z-index: 11;\n }\n }\n}\n\n.sr-only {\n @include srOnly;\n}\n","import { h, Component, Prop, Element, Event, EventEmitter, Listen, State } from \"@stencil/core\";\nimport { forceUpdate } from \"@stencil/core\";\nimport { intl, hasRoomRight, shouldOpenUp } from \"../../../global/functions\";\n\n@Component({\n tag: \"priv-datepicker\",\n styleUrl: \"priv-datepicker.scss\",\n})\nexport class PrivDatepicker {\n @Element() el!: HTMLPrivDatepickerElement;\n\n @Prop() disabled: boolean = false;\n @Prop({ mutable: true, reflect: true }) isExpanded: boolean = false;\n @Prop({ mutable: true, reflect: true }) view: string = \"day\";\n @Prop({ mutable: true, reflect: true }) date: Date = new Date();\n @Prop({ mutable: true }) selectedYear: number = this.date.getUTCFullYear();\n @Prop({ mutable: true }) selectedMonth: number = this.date.getUTCMonth() + 1;\n @Prop({ mutable: true }) selectedDay: number = this.date.getUTCDate();\n @Prop({ mutable: true }) monthInFocus: number = this.selectedMonth;\n @Prop({ mutable: true }) yearInFocus: number = this.selectedYear;\n @Prop({ mutable: true }) dayInFocus: number = this.selectedDay;\n @State() monthNumInFocus: number = this.selectedMonth;\n @Prop({ mutable: true, reflect: true }) parentId: string = \"\";\n\n @State() isTabbing: boolean = false;\n\n selectedDate!: HTMLTableCellElement;\n\n @Event() cellTriggered!: EventEmitter<HTMLElement>;\n @Event() toggleButtonClicked!: EventEmitter<HTMLButtonElement>;\n @Event() popupClosed!: EventEmitter;\n @Event() popupBlurred!: EventEmitter<{ relatedTarget: EventTarget | null }>;\n\n private popupEl?: HTMLElement;\n private buttonEl!: HTMLButtonElement;\n private popupClicked: boolean = true;\n private buttonClicked: boolean = true;\n private prevButton!: HTMLButtonElement;\n private nextButton!: HTMLButtonElement;\n private prevClicked: boolean = true;\n private nextClicked: boolean = true;\n private openUp: boolean = false;\n\n private calendar_months: Array<string> = [\n intl.formatMessage({\n id: \"date.january\",\n defaultMessage: \"January\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.february\",\n defaultMessage: \"February\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.march\",\n defaultMessage: \"March\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.april\",\n defaultMessage: \"April\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.may\",\n defaultMessage: \"May\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.june\",\n defaultMessage: \"June\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.july\",\n defaultMessage: \"July\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.august\",\n defaultMessage: \"August\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.september\",\n defaultMessage: \"September\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.october\",\n defaultMessage: \"October\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.november\",\n defaultMessage: \"November\",\n description: \"Month of the year\",\n }),\n intl.formatMessage({\n id: \"date.december\",\n defaultMessage: \"December\",\n description: \"Month of the year\",\n }),\n ];\n\n private weekdays: Array<string> = [\n intl.formatMessage({ id: \"date.sunday\", defaultMessage: \"Sunday\" }),\n intl.formatMessage({ id: \"date.monday\", defaultMessage: \"Monday\" }),\n intl.formatMessage({ id: \"date.tuesday\", defaultMessage: \"Tuesday\" }),\n intl.formatMessage({ id: \"date.wednesday\", defaultMessage: \"Wednesday\" }),\n intl.formatMessage({ id: \"date.thursday\", defaultMessage: \"Thursday\" }),\n intl.formatMessage({ id: \"date.friday\", defaultMessage: \"Friday\" }),\n intl.formatMessage({ id: \"date.saturday\", defaultMessage: \"Saturday\" }),\n ];\n\n @Listen(\"keydown\")\n handleKey(ev: KeyboardEvent): void {\n this.prevClicked = false;\n this.nextClicked = false;\n\n switch (ev.key) {\n case \"Enter\":\n ev.preventDefault();\n //Clunky exception for blur validation. Remove when blur reworked.\n !(ev.target as HTMLElement).id.includes(\"popup-title\") && (ev.target as HTMLElement)!.click();\n break;\n\n case \"Escape\":\n ev.preventDefault();\n if (this.isExpanded) {\n ev.stopPropagation(); // prevents closing of parent modal\n this.closePopup(true);\n }\n break;\n\n case \"PageUp\":\n ev.preventDefault();\n this.backOneMonth();\n break;\n\n case \"PageDown\":\n ev.preventDefault();\n this.forwardOneMonth();\n break;\n\n case \"Home\":\n ev.preventDefault();\n this.unfocusCell();\n this.dayInFocus = 1;\n forceUpdate(this.el);\n break;\n\n case \"End\":\n ev.preventDefault();\n this.unfocusCell();\n this.dayInFocus = this.getMonthDays(this.monthInFocus, this.yearInFocus);\n forceUpdate(this.el);\n break;\n\n case \"ArrowLeft\":\n ev.preventDefault();\n if (this.view === \"day\") {\n this.unfocusCell();\n if (this.dayInFocus === 1) {\n const newMonth = this.getPreviousMonth(this.monthInFocus, this.yearInFocus);\n this.monthInFocus = newMonth.month;\n this.yearInFocus = newMonth.year;\n this.dayInFocus = this.getMonthDays(this.monthInFocus, this.yearInFocus);\n } else {\n this.dayInFocus -= 1;\n }\n } else {\n this.unfocusMonth();\n if (this.monthNumInFocus === 0) {\n this.monthNumInFocus = 11;\n } else {\n this.monthNumInFocus -= 1;\n }\n }\n break;\n\n case \"ArrowRight\":\n ev.preventDefault();\n if (this.view === \"day\") {\n this.unfocusCell();\n if (this.dayInFocus === this.getMonthDays(this.monthInFocus, this.yearInFocus)) {\n const newMonth = this.getNextMonth(this.monthInFocus, this.yearInFocus);\n this.monthInFocus = newMonth.month;\n this.yearInFocus = newMonth.year;\n this.dayInFocus = 1;\n } else {\n this.dayInFocus += 1;\n }\n } else {\n this.unfocusMonth();\n if (this.monthNumInFocus === 11) {\n this.monthNumInFocus = 0;\n } else {\n this.monthNumInFocus += 1;\n }\n }\n break;\n\n case \"ArrowUp\":\n ev.preventDefault();\n if (this.view === \"day\") {\n this.unfocusCell();\n if (this.dayInFocus < 8) {\n const newMonth = this.getPreviousMonth(this.monthInFocus, this.yearInFocus);\n this.monthInFocus = newMonth.month;\n this.yearInFocus = newMonth.year;\n const numDaysToSubtract = 7 - this.dayInFocus;\n this.dayInFocus = this.getMonthDays(this.monthInFocus, this.yearInFocus) - numDaysToSubtract;\n } else {\n this.dayInFocus -= 7;\n }\n } else {\n this.unfocusMonth();\n if (this.monthNumInFocus < 3) {\n this.monthNumInFocus += 9;\n } else {\n this.monthNumInFocus -= 3;\n }\n }\n break;\n\n case \"ArrowDown\":\n ev.preventDefault();\n if (!this.isExpanded) {\n this.openPopup();\n } else {\n if (this.view === \"day\") {\n //If the down arrow is pressed from the month button or the arrow buttons, focus should shift to the current cell in focus\n if (!(document.activeElement!.shadowRoot! || document).activeElement!.classList.contains(\"date-cell\")) {\n this.focusCell();\n break;\n }\n\n this.unfocusCell();\n const changeoverDate = this.getMonthDays(this.monthInFocus, this.yearInFocus) - 7;\n if (this.dayInFocus > changeoverDate) {\n const newMonth = this.getNextMonth(this.monthInFocus, this.yearInFocus);\n this.monthInFocus = newMonth.month;\n this.yearInFocus = newMonth.year;\n this.dayInFocus = this.dayInFocus - changeoverDate;\n } else {\n this.dayInFocus += 7;\n }\n } else {\n //If the down arrow is pressed from the arrow buttons or the title box, focus should shift to the current month in focus\n const activeEl = (document.activeElement!.shadowRoot! || document).activeElement!;\n if (activeEl.tagName === \"BUTTON\" || activeEl.id.includes(\"popup-title-year\")) {\n this.focusMonth();\n break;\n }\n\n this.unfocusMonth();\n if (this.monthNumInFocus > 8) {\n this.monthNumInFocus -= 9;\n } else {\n this.monthNumInFocus += 3;\n }\n }\n }\n break;\n }\n }\n\n @Listen(\"keydown\")\n toggleTabbingOn(ev: KeyboardEvent) {\n const validKeys = [\"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Enter\"];\n if (validKeys.includes(ev.key)) {\n this.isTabbing = true;\n }\n }\n\n //Using mousedown prevents this from running when the keydown listener emits \".click()\" for when enter is pressed.\n @Listen(\"mousedown\", { target: \"window\" })\n toggleTabbingOff() {\n this.isTabbing = false;\n }\n\n @Listen(\"click\", { target: \"document\" })\n blurHandler(ev: PointerEvent): void {\n if (!this.popupClicked && !this.buttonClicked && this.isExpanded) {\n this.closePopup();\n // in this case, the PointerEvent target is identical to the blur events relatedTarget, and is passed on as such\n this.popupBlurred.emit({ relatedTarget: ev.target });\n }\n this.popupClicked = false;\n this.buttonClicked = false;\n }\n\n @Listen(\"blur\", { target: \"window\" })\n handleBlurOnWindow(ev: FocusEvent) {\n // for cases where the user clicks or uses a shortcut to leave the document\n if (this.isExpanded) {\n this.closePopup();\n this.popupBlurred.emit({ relatedTarget: ev.target });\n }\n }\n\n componentDidUpdate() {\n this.handleSelectedDate();\n if (this.isExpanded) {\n this.prevClicked\n ? this.prevButton.focus()\n : this.nextClicked\n ? this.nextButton.focus()\n : this.view === \"day\"\n ? this.focusCell()\n : this.focusMonth();\n }\n }\n\n componentDidLoad() {\n this.handleSelectedDate();\n this.setDateValuesForView();\n }\n\n zeroPad(value: number | string, length: number) {\n if (!String.prototype.padStart) {\n String.prototype.padStart = function padStart(targetLength, padString) {\n targetLength = targetLength - this.length;\n if (targetLength > padString!.length) {\n padString += padString!.repeat(targetLength / padString!.length);\n }\n return padString!.slice(0, targetLength) + String(this);\n };\n }\n return `${value.toString()}`.padStart(length, \"0\");\n }\n\n removeZeroes(date: string): number {\n return +date < 10 ? +date.slice(1) : +date;\n }\n\n isDateToday(date: Array<string>): boolean {\n const today = new Date();\n const todayDateArray = [\n today.getFullYear().toString(),\n (today.getMonth() + 1).toString(),\n today.getDate().toString(),\n ];\n //Compare today's date to date and return true if they match\n return todayDateArray.reduce(\n (result: boolean, val: string, index: number) => result && this.removeZeroes(date[index]).toString() === val,\n true\n );\n }\n\n togglePopup() {\n this.isExpanded ? this.closePopup() : this.openPopup();\n this.buttonClicked = true;\n }\n\n closePopup(returnFocus: boolean = false) {\n this.isExpanded = false;\n this.popupEl!.classList.remove(\"open\");\n window.setTimeout(() => {\n //not using display none in order to get measurements of the popup while hidden\n this.popupEl!.style.visibility = \"hidden\";\n }, 250);\n //Reset values so that menu reopens to day view with selected date in focus\n if (this.view === \"day\") {\n this.unfocusCell();\n }\n this.monthInFocus = this.selectedMonth;\n this.yearInFocus = this.selectedYear;\n this.dayInFocus = this.selectedDay;\n this.changeView(\"day\");\n if (returnFocus) {\n this.buttonEl.focus();\n }\n }\n\n openPopup() {\n this.panelPosition();\n this.setDateValuesForView();\n this.prevClicked = false;\n this.nextClicked = false;\n this.popupEl!.style.visibility = \"visible\";\n window.requestAnimationFrame(() => {\n this.popupEl!.classList.add(\"open\");\n });\n this.isExpanded = true;\n this.focusCell();\n }\n\n getMonthDays(month: number, year: number) {\n const months30 = [4, 6, 9, 11];\n const leapYear = year % 4 === 0;\n\n return month === 2 ? (leapYear ? 29 : 28) : months30.includes(month) ? 30 : 31;\n }\n\n // 1 => Sunday, 7 => Saturday\n getMonthFirstDay(month: number, year: number) {\n return +new Date(year, month - 1, 1, 12, 0, 0).getDay() + 1;\n }\n\n getPreviousMonth(month: number, year: number) {\n const prevMonth = month > 1 ? month - 1 : 12;\n const prevMonthYear = month > 1 ? year : year - 1;\n\n return { month: prevMonth, year: prevMonthYear };\n }\n\n getNextMonth(month: number, year: number) {\n const nextMonth = month < 12 ? month + 1 : 1;\n const nextMonthYear = month < 12 ? year : year + 1;\n\n return { month: nextMonth, year: nextMonthYear };\n }\n\n getCalendarDates(month: number, year: number) {\n // Get number of days in the month and the month's first day\n const monthDays = this.getMonthDays(month, year);\n const monthFirstDay = this.getMonthFirstDay(month, year);\n\n // Get number of days to be displayed from previous and next months\n // These ensure a total of 42 days (6 weeks) displayed on the calendar\n const daysFromPrevMonth = monthFirstDay - 1;\n let daysFromNextMonth = 42 - (daysFromPrevMonth + monthDays);\n daysFromNextMonth = daysFromNextMonth > 6 ? daysFromNextMonth - 7 : daysFromNextMonth;\n\n // Get the previous and next months and years\n const { month: prevMonth, year: prevMonthYear } = this.getPreviousMonth(month, year);\n const { month: nextMonth, year: nextMonthYear } = this.getNextMonth(month, year);\n\n // Get number of days in previous month\n const prevMonthDays = this.getMonthDays(prevMonth, prevMonthYear);\n\n // Builds dates to be displayed from previous month. The initialized array is \"filled\" with an arbitrary number because IE and Edge won't map over an array with empty values.\n const prevMonthDates = [...new Array(daysFromPrevMonth).fill(\"1\")].map((_, index) => {\n const day = index + 1 + (prevMonthDays - daysFromPrevMonth);\n return [prevMonthYear.toString(), this.zeroPad(prevMonth, 2), this.zeroPad(day, 2)];\n });\n\n // Builds dates to be displayed from current month. The initialized array is \"filled\" with an arbitrary number because IE and Edge won't map over an array with empty values.\n const thisMonthDates = [...new Array(monthDays).fill(\"1\")].map((_, index) => {\n const day = index + 1;\n return [year.toString(), this.zeroPad(month, 2), this.zeroPad(day, 2)];\n });\n\n // Builds dates to be displayed from next month. The initialized array is \"filled\" with an arbitrary number because IE and Edge won't map over an array with empty values.\n const nextMonthDates = [...new Array(daysFromNextMonth).fill(\"1\")].map((_, index) => {\n const day = index + 1;\n return [nextMonthYear.toString(), this.zeroPad(nextMonth, 2), this.zeroPad(day, 2)];\n });\n\n // Combines all dates from previous, current and next months\n return [...prevMonthDates, ...thisMonthDates, ...nextMonthDates];\n }\n\n forwardOneMonth() {\n this.unfocusCell();\n const newMonth = this.getNextMonth(this.monthInFocus, this.yearInFocus);\n this.monthInFocus = newMonth.month;\n this.yearInFocus = newMonth.year;\n const totalDays = this.getMonthDays(this.monthInFocus, this.yearInFocus);\n if (this.dayInFocus > this.getMonthDays(this.monthInFocus, this.yearInFocus)) {\n this.dayInFocus = totalDays;\n }\n this.updateLiveRegion(`Displaying ${this.calendar_months[this.monthInFocus - 1]}, ${this.yearInFocus}`);\n }\n\n backOneMonth() {\n this.unfocusCell();\n const newMonth = this.getPreviousMonth(this.monthInFocus, this.yearInFocus);\n this.monthInFocus = newMonth.month;\n this.yearInFocus = newMonth.year;\n const totalDays = this.getMonthDays(this.monthInFocus, this.yearInFocus);\n if (this.dayInFocus > this.getMonthDays(this.monthInFocus, this.yearInFocus)) {\n this.dayInFocus = totalDays;\n }\n this.updateLiveRegion(`Viewing ${this.calendar_months[this.monthInFocus - 1]}, ${this.yearInFocus}`);\n }\n\n handleTriggeredDate(el: HTMLTableDataCellElement) {\n this.cellTriggered.emit(el as HTMLTableDataCellElement);\n // change of input value will trigger the function updating selectedDate\n this.closePopup(true);\n }\n\n handleSelectedDate() {\n //Remove old selection status\n if (this.selectedDate) {\n this.selectedDate.removeAttribute(\"aria-selected\");\n }\n //Update selected date to new date inputted/selected\n this.selectedDate = this.getCellById(this.selectedYear, this.selectedMonth, this.selectedDay);\n\n if (this.selectedDate) {\n this.selectedDate.setAttribute(\"aria-selected\", \"true\");\n }\n }\n\n getCellById(year: number, month: number, day: number) {\n const id = year + this.zeroPad(month, 2) + this.zeroPad(day, 2);\n return this.el.querySelector(`#cell-${id}-${this.parentId}`) as HTMLTableCellElement;\n }\n\n unfocusCell() {\n const cellToUnfocus = this.getCellById(this.yearInFocus, this.monthInFocus, this.dayInFocus);\n cellToUnfocus.tabIndex = -1;\n }\n\n focusCell() {\n //These two lines of code prevent an error from happening when the day in focus does not exist in a new month selected, e.g., May 31 is in focus, then the user selects \"November\". It will return focus in the date view to the last day of the month so that focus doesn't fly out of the popup.\n const maxDays = this.getMonthDays(this.monthInFocus, this.yearInFocus);\n this.dayInFocus = this.dayInFocus > maxDays ? maxDays : this.dayInFocus;\n\n const cellToFocus = this.getCellById(this.yearInFocus, this.monthInFocus, this.dayInFocus);\n if (cellToFocus) {\n cellToFocus.tabIndex = 0;\n cellToFocus.focus();\n }\n }\n\n unfocusMonth() {\n const monthToUnfocus = this.el.querySelector(`#month-${this.monthNumInFocus}-${this.parentId}`) as HTMLDivElement;\n monthToUnfocus.tabIndex = -1;\n }\n\n focusMonth() {\n const monthToFocus = this.el.querySelector(`#month-${this.monthNumInFocus}-${this.parentId}`) as HTMLDivElement;\n monthToFocus.tabIndex = 0;\n monthToFocus.focus();\n }\n\n trapFocusLeft(ev: KeyboardEvent) {\n if (ev.shiftKey && ev.key === \"Tab\") {\n ev.preventDefault();\n this.focusCellInView();\n }\n }\n\n trapFocusEnd(ev: KeyboardEvent) {\n if (!ev.shiftKey && ev.key === \"Tab\") {\n ev.preventDefault();\n this.prevButton.focus();\n }\n }\n\n trapFocusRight(ev: KeyboardEvent) {\n if (!ev.shiftKey && ev.key === \"Tab\") {\n ev.preventDefault();\n this.focusCellInView();\n }\n }\n\n focusCellInView() {\n if (this.view === \"day\") {\n this.focusCell();\n } else {\n this.focusMonth();\n }\n }\n\n toggleBusyAttribute(state: string) {\n (this.el.querySelector(\"#wm-container\") as HTMLElement).setAttribute(\"aria-busy\", state);\n }\n\n setDateValuesForView() {\n this.selectedYear = this.date.getUTCFullYear();\n this.selectedMonth = this.date.getUTCMonth() + 1;\n this.selectedDay = this.date.getUTCDate();\n this.monthInFocus = this.selectedMonth;\n this.yearInFocus = this.selectedYear;\n this.dayInFocus = this.selectedDay;\n this.monthNumInFocus = this.selectedMonth - 1;\n }\n\n updateLiveRegion(text: string) {\n let liveRegion = this.el.querySelector(\"#live-region\") as HTMLElement;\n liveRegion.innerHTML = text;\n }\n\n panelPosition() {\n // getting a ref to the input el (in datepicker.tsx)\n let host = document.getElementById(this.parentId) as HTMLWmDatepickerElement;\n\n const labelHeight = host.shadowRoot!.querySelector(\".label-wrapper\")!.clientHeight;\n\n this.openUp = shouldOpenUp(host, this.popupEl!, labelHeight);\n\n if (hasRoomRight(host, 336)) {\n this.popupEl!.style.left = \"0\";\n this.popupEl!.style.right = \"auto\";\n } else {\n this.popupEl!.style.right = \"0\";\n this.popupEl!.style.left = \"auto\";\n }\n }\n\n changeView(newView: string) {\n this.view = newView;\n //Ensure month view always opens to the month last visited in date view\n this.monthNumInFocus = this.monthInFocus - 1;\n }\n\n renderCalendarDate = (date: Array<string>, index: number) => {\n let monthOfDate = this.removeZeroes(String(date[1]));\n let dayOfDate = this.removeZeroes(String(date[2]));\n let isThisMonth = monthOfDate === this.monthInFocus ? \"current-month\" : \"\";\n const dateId = date[0] + date[1] + date[2];\n const isToday = this.isDateToday(date);\n\n return (\n <div\n role=\"gridcell\"\n id={`cell-${dateId}-${this.parentId}`}\n class={`date-cell ${isThisMonth}`}\n aria-selected={false}\n aria-label={`${\n isToday\n ? `${intl.formatMessage({\n id: \"date.today\",\n defaultMessage: \"today\",\n description: \"calendar button\",\n })}, `\n : \"\"\n }${this.weekdays[index]}, ${this.calendar_months[monthOfDate - 1]} ${dayOfDate}, ${date[0]}`}\n onClick={(ev) => {\n this.handleTriggeredDate(ev.target as HTMLTableDataCellElement);\n }}\n onKeyDown={(ev: KeyboardEvent) => this.trapFocusEnd(ev)}\n data-month={date[1]}\n data-year={date[0]}\n onBlur={(ev: FocusEvent) => ev.stopPropagation()}\n >\n {dayOfDate}\n </div>\n );\n };\n\n renderMonths(month: string, index: number) {\n return (\n <div\n id={`month-${index}-${this.parentId}`}\n class={`month ${this.selectedMonth - 1 === index ? \"selected\" : \"\"}`}\n role=\"gridcell\"\n tabindex={index + 1 === this.monthInFocus ? 0 : -1}\n onKeyDown={(ev: KeyboardEvent) => this.trapFocusEnd(ev)}\n onBlur={(ev: FocusEvent) => ev.stopPropagation()}\n onClick={() => {\n this.monthInFocus = index + 1;\n this.changeView(\"day\");\n }}\n >\n {month}\n </div>\n );\n }\n\n render() {\n const dates = this.getCalendarDates(this.monthInFocus, this.yearInFocus);\n\n return (\n <div class=\"container\" id=\"wm-container\">\n <button\n disabled={this.disabled}\n onClick={this.togglePopup.bind(this)}\n aria-describedby={`date-input-${this.parentId}`}\n ref={(el) => (this.buttonEl = el as HTMLButtonElement)}\n aria-expanded={`${this.isExpanded}`}\n class=\"toggle\"\n id={`toggle-${this.parentId}`}\n >\n <span\n class=\"calendar\"\n title={intl.formatMessage({\n id: \"date.calendarView\",\n defaultMessage: \"Calendar View\",\n description: \"Calendar button\",\n })}\n />\n </button>\n <div\n class={`popup ${this.view}-view ${this.openUp ? \"expand-upwards\" : \"\"} ${\n this.isTabbing ? \"user-is-tabbing\" : \"\"\n }`}\n id={`popup-${this.parentId}`}\n ref={(el) => (this.popupEl = el as HTMLElement)}\n onClick={() => (this.popupClicked = true)}\n role=\"application\"\n aria-describedby=\"application\"\n >\n {this.view === \"day\" ? (\n <div class=\"day-view\">\n <div class=\"calendar-header\">\n <button\n onClick={() => {\n this.prevClicked = true;\n this.popupClicked = true;\n this.backOneMonth();\n }}\n onKeyDown={(ev: KeyboardEvent) => this.trapFocusLeft(ev)}\n ref={(el) => (this.prevButton = el as HTMLButtonElement)}\n class=\"arw-btn\"\n aria-label={intl.formatMessage({\n id: \"date.selectPreviousMonth\",\n defaultMessage: \"Select previous month\",\n description: \"Calendar button\",\n })}\n >\n <span class=\"mdi\">&#xf141;</span>\n </button>\n <div\n id={`popup-title-month-${this.parentId}`}\n class=\"title-box\"\n tabindex={0}\n role=\"button\"\n onKeyDown={(ev: KeyboardEvent) => {\n if (ev.key === \"Enter\" || ev.key === \" \") {\n ev.preventDefault();\n this.changeView(\"month\");\n }\n }}\n onClick={this.changeView.bind(this, \"month\")}\n aria-label={`${intl.formatMessage({\n id: \"date.currentMonth\",\n defaultMessage: \"current month\",\n description: \"Calendar button\",\n })}: ${this.calendar_months[this.monthInFocus - 1]}\n ${this.yearInFocus}.`}\n aria-describedby=\"month-title\"\n >\n <span class=\"title\" aria-hidden=\"true\">\n {this.calendar_months[this.monthInFocus - 1]} {this.yearInFocus}\n </span>\n </div>\n <button\n onClick={() => {\n this.nextClicked = true;\n this.popupClicked = true;\n this.forwardOneMonth();\n }}\n onKeyDown={(ev: KeyboardEvent) => this.trapFocusRight(ev)}\n aria-label={intl.formatMessage({\n id: \"date.selectNextMonth\",\n defaultMessage: \"Select next month\",\n description: \"Calendar button\",\n })}\n ref={(el) => (this.nextButton = el as HTMLButtonElement)}\n class=\"arw-btn\"\n >\n <span class=\"mdi\">&#xf142;</span>\n </button>\n </div>\n <div aria-labelledby={`popup-title-month-${this.parentId}`} role=\"grid\" class=\"date-grid\">\n <div role=\"rowgroup\" class=\"date-header\">\n <div role=\"row\" class=\"header-row\">\n <div role=\"columnheader\" class=\"header-cell\">\n <span>\n {intl.formatMessage({\n id: \"date.su\",\n defaultMessage: \"Su\",\n description: \"Abbreviated day of the week\",\n })}\n </span>\n </div>\n <div role=\"columnheader\" class=\"header-cell\">\n <span>\n {intl.formatMessage({\n id: \"date.mo\",\n defaultMessage: \"Mo\",\n description: \"Abbreviated day of the week\",\n })}\n </span>\n </div>\n <div role=\"columnheader\" class=\"header-cell\">\n <span>\n {intl.formatMessage({\n id: \"date.tu\",\n defaultMessage: \"Tu\",\n description: \"Abbreviated day of the week\",\n })}\n </span>\n </div>\n <div role=\"columnheader\" class=\"header-cell\">\n <span>\n {intl.formatMessage({\n id: \"date.we\",\n defaultMessage: \"We\",\n description: \"Abbreviated day of the week\",\n })}\n </span>\n </div>\n <div role=\"columnheader\" class=\"header-cell\">\n <span>\n {intl.formatMessage({\n id: \"date.th\",\n defaultMessage: \"Th\",\n description: \"Abbreviated day of the week\",\n })}\n </span>\n </div>\n <div role=\"columnheader\" class=\"header-cell\">\n <span>\n {intl.formatMessage({\n id: \"date.fr\",\n defaultMessage: \"Fr\",\n description: \"Abbreviated day of the week\",\n })}\n </span>\n </div>\n <div role=\"columnheader\" class=\"header-cell\">\n <span>\n {intl.formatMessage({\n id: \"date.sa\",\n defaultMessage: \"Sa\",\n description: \"Abbreviated day of the week\",\n })}\n </span>\n </div>\n </div>\n </div>\n <div role=\"rowgroup\">\n <div role=\"row\" class=\"date-row\">\n {dates.slice(0, 7).map((date, i) => this.renderCalendarDate(date, i))}\n </div>\n <div role=\"row\">{dates.slice(7, 14).map((date, i) => this.renderCalendarDate(date, i))}</div>\n <div role=\"row\">{dates.slice(14, 21).map((date, i) => this.renderCalendarDate(date, i))}</div>\n <div role=\"row\">{dates.slice(21, 28).map((date, i) => this.renderCalendarDate(date, i))}</div>\n <div role=\"row\">{dates.slice(28, 35).map((date, i) => this.renderCalendarDate(date, i))}</div>\n {dates.length > 35 ? (\n <div role=\"row\">{dates.slice(35).map((date, i) => this.renderCalendarDate(date, i))}</div>\n ) : (\n \"\"\n )}\n </div>\n </div>\n </div>\n ) : (\n <div class=\"month-view\">\n <div class=\"calendar-header\">\n <button\n onClick={() => {\n this.prevClicked = true;\n this.popupClicked = true;\n this.yearInFocus -= 1;\n this.updateLiveRegion(`${this.yearInFocus} selected.`);\n }}\n onKeyDown={(ev: KeyboardEvent) => this.trapFocusLeft(ev)}\n aria-label={intl.formatMessage({\n id: \"date.selectPreviousYear\",\n defaultMessage: \"Select previous year\",\n description: \"Calendar button\",\n })}\n ref={(el) => (this.prevButton = el as HTMLButtonElement)}\n class=\"arw-btn\"\n >\n <span class=\"mdi\">&#xf141;</span>\n </button>\n <div\n id={`popup-title-year-${this.parentId}`}\n tabindex={0}\n class=\"title-box year\"\n role=\"button\"\n onClick={this.changeView.bind(this, \"day\")}\n onKeyDown={(ev: KeyboardEvent) => {\n if (ev.key === \"Enter\" || ev.key === \" \") {\n ev.preventDefault();\n this.changeView(\"day\");\n }\n }}\n aria-labelledby=\"year-title\"\n >\n <span class=\"title\">{this.yearInFocus}</span>\n </div>\n <button\n onClick={() => {\n this.nextClicked = true;\n this.popupClicked = true;\n this.yearInFocus += 1;\n this.updateLiveRegion(`${this.yearInFocus} selected.`);\n }}\n aria-label={intl.formatMessage({\n id: \"date.selectNextYear\",\n defaultMessage: \"Select next year\",\n description: \"Calendar button\",\n })}\n onKeyDown={(ev: KeyboardEvent) => this.trapFocusRight(ev)}\n ref={(el) => (this.nextButton = el as HTMLButtonElement)}\n class=\"arw-btn\"\n >\n <span class=\"mdi\">&#xf142;</span>\n </button>\n </div>\n <div aria-labelledby={`popup-title-year-${this.parentId}`} role=\"grid\" class=\"months\">\n <div role=\"row\" class=\"month-row\">\n {this.calendar_months\n .slice(0, 3)\n .map((month: string, index: number) => this.renderMonths(month, index))}\n </div>\n <div role=\"row\" class=\"month-row\">\n {this.calendar_months\n .slice(3, 6)\n .map((month: string, index: number) => this.renderMonths(month, index + 3))}\n </div>\n <div role=\"row\" class=\"month-row\">\n {this.calendar_months\n .slice(6, 9)\n .map((month: string, index: number) => this.renderMonths(month, index + 6))}\n </div>\n <div role=\"row\" class=\"month-row\">\n {this.calendar_months\n .slice(9)\n .map((month: string, index: number) => this.renderMonths(month, index + 9))}\n </div>\n </div>\n </div>\n )}\n </div>\n {this.isExpanded && <div id=\"live-region\" aria-live=\"polite\" aria-relevant=\"text\" class=\"sr-only\" />}\n <div id=\"month-title\" class=\"sr-only\">\n {intl.formatMessage({\n id: \"date.selectMonth\",\n defaultMessage: \"Activate to select a month.\",\n description: \"Calendar button\",\n })}\n </div>\n <div id=\"year-title\" class=\"sr-only\">\n {intl.formatMessage({\n id: \"date.selectYear\",\n defaultMessage: \"Activate to select a year.\",\n description: \"Calendar button\",\n })}\n </div>\n <div id=\"application\" class=\"sr-only\">\n {intl.formatMessage({\n id: \"date.instructions\",\n defaultMessage:\n \"Use arrows to select a date in the table. Tab left or right to buttons for selecting previous month, next month, or the month selection table.\",\n })}\n </div>\n </div>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmNavigatorCss","Navigator","exports","this","retrievedInfo","loadFromUserinfo","parsedProducts","openRight","class_1","prototype","componentWillLoad","userName","console","error","parseData","_a","sent","setFocusIndex","getRequest","then","response","_this","email","currentProductId","current_product_id","productKeysToCamelCase","products","logoutUrl","logout_url","connectionName","connection_name","catch","errStatus","getWmMode","el","JSON","parse","sort","a","b","name","map","product","keys","Object","newProduct","forEach","key","snakeCaseToCamelCase","length","currentProduct","getProduct","itemIndexToFocus","indexOf","toggleTabbingOn","isTabbing","toggleTabbingOff","handleKeys","ev","preventDefault","closeMenu","isOpen","getNewIndexToFocus","navigatorItems","openMenu","handleKeydown","detail","item","navItem","click","oldIndex","focusItem","unfocusItem","handleClick","isElOrChild","target","contains","handleButtonClick","wrapperEl","wrapperWidth","clientWidth","spaceLeft","getBoundingClientRect","left","spaceRight","document","documentElement","right","buttonFocusHandler","newSelection","tabIndex","focused","window","requestAnimationFrame","focus","index","oldSelection","hostButton","shadowRoot","querySelector","button","renderUserInfo","h","class","id","intl","formatMessage","defaultMessage","setAltText","renderHeading","description","renderList","role","concat","renderProductOptions","renderLogoutOption","icon","isSelected","clickRedirect","iconUrl","setProductOnClick","selected","onClick","src","alt","productId","authType","location","href","linkUrl","connName_1","samlLinkUrl","setLogoutOnclick","wmNavigatorLogout","emit","defineProperty","Array","from","querySelectorAll","find","render","Host","expanded","altText","ref"],"sources":["src/components/wm-navigator/wm-navigator.scss?tag=wm-navigator&encapsulation=shadow","src/components/wm-navigator/wm-navigator.tsx"],"sourcesContent":[":host,\nwm-navigator {\n min-width: 0;\n position: relative;\n display: inline-block;\n\n .wrapper {\n overflow: auto;\n font-size: rem-calc(18);\n min-width: rem-calc(210);\n width: auto;\n max-height: 80vh;\n text-align: left;\n position: absolute;\n z-index: 50;\n top: 100%;\n right: 20px;\n left: auto;\n background: #fff;\n letter-spacing: normal;\n @include box-shadow(0 4px 15px 0 rgba(0, 0, 0, 0.2));\n @include transition(transform 0.25s ease);\n @include transformOrigin(center top);\n @include scale($xVal: 1, $yVal: 1);\n\n .user {\n background: $background;\n padding: rem-calc(10 20);\n font-size: rem-calc(14);\n\n p {\n margin: 0;\n }\n p:first-child {\n font-weight: 700;\n text-transform: capitalize;\n }\n }\n\n h2 {\n background: #2e1b46;\n color: #fff;\n font-weight: 700;\n margin: 0;\n padding: rem-calc(10 20);\n font-size: rem-calc(14);\n }\n\n [role=\"listbox\"] {\n list-style: none;\n margin: 0;\n padding-left: 0;\n }\n\n &.hide {\n @include scale($xVal: 1, $yVal: 0);\n }\n\n &.right {\n right: auto;\n left: 20px;\n }\n }\n\n img {\n transform: scale(0.8);\n transform-origin: left center;\n display: block;\n }\n\n .logout {\n text-align: center;\n text-transform: capitalize;\n }\n}\n\npriv-navigator-item:focus {\n outline: none;\n}\n","import { Component, Element, h, Host, Prop, State, Listen, EventEmitter, Event, Watch } from \"@stencil/core\";\nimport { getWmMode, Product, NavigatorPayload } from \"../../global/interfaces\";\nimport { intl, snakeCaseToCamelCase, getNewIndexToFocus } from \"../../global/functions\";\nimport { getRequest } from \"../../global/services/http-service\";\n\n@Component({\n tag: \"wm-navigator\",\n styleUrl: \"wm-navigator.scss\",\n shadow: { delegatesFocus: true },\n})\nexport class Navigator {\n @Element() el!: any;\n private wrapperEl?: HTMLDivElement;\n\n // Component can receive user info and products as props (this is how it worked before)\n @Prop() userName?: string;\n @Prop() email?: string;\n @Prop() authType: number = 1; // 1: none or off, 2: username-password or username_password_sso, 3: saml or saml_sso\n @Prop() connectionName?: string;\n @Prop() logoutUrl?: string;\n @Prop() products?: string | []; // products as JSON string, parsed on load\n\n // The new way is to retrieve user info from an endpoint\n // dev needs to opt-in by setting loadFromUserinfo to true\n @Prop() loadFromUserinfo: boolean = false;\n // comp can check whether the info was successfully retrieved with:\n private retrievedInfo: boolean = !this.loadFromUserinfo; // when in endpoint mode, only render after get request completed\n\n // used either way to store the products\n parsedProducts: Array<Product> = [];\n\n /**\n * Event emitted from child wm-navigator-button updates the state, which is then passed down as a prop by wm-navigator.\n */\n @State() isOpen: boolean = false;\n private openRight: boolean = false; // whether the menu should open on the right side\n\n @State() isTabbing: boolean = false;\n\n /**\n * Value is set to the index of the current product on load.\n * Keyboard navigation updates the state to keep track of focus in the dropdown.\n * State resets to the index of the current product when the dropdown closes.\n */\n @State() itemIndexToFocus: number = 0;\n\n @Event() wmNavigatorLogout!: EventEmitter;\n\n private currentProductId!: string;\n\n async componentWillLoad() {\n if (!this.userName) {\n console.error(\"wm-navigator: user-name is a required property.\");\n }\n\n await this.parseData();\n this.setFocusIndex();\n }\n\n // async because we need the http request to complete before proceeding\n @Watch(\"products\")\n async parseData() {\n if (!!this.loadFromUserinfo) {\n await getRequest(\"/platform/navigator/userinfo\")\n .then((response: NavigatorPayload) => {\n this.email = response.email;\n this.currentProductId = response.current_product_id;\n this.parsedProducts = this.productKeysToCamelCase(response.products);\n this.logoutUrl = this.logoutUrl ? this.logoutUrl : response.logout_url;\n this.connectionName = this.connectionName ? this.connectionName : response.connection_name;\n if (!!this.email && !!this.currentProductId) {\n this.retrievedInfo = true;\n }\n })\n .catch((errStatus) => {\n console.error(errStatus);\n });\n } else {\n this.currentProductId = getWmMode(this.el);\n if (!!this.products) {\n if (typeof this.products === \"string\") {\n this.parsedProducts = JSON.parse(this.products);\n } else {\n this.parsedProducts = this.products;\n }\n this.parsedProducts = this.productKeysToCamelCase(this.parsedProducts);\n }\n }\n // products is initialized as empty array in case nothing is passed\n this.parsedProducts.sort((a, b) => (a.name < b.name ? -1 : 1));\n }\n\n productKeysToCamelCase(products: object[]): Product[] {\n products = products.map((product: any) => {\n const keys = Object.keys(product);\n let newProduct: { [key: string]: string } = {};\n keys.forEach((key) => {\n newProduct[snakeCaseToCamelCase(key)] = product[key];\n });\n return newProduct;\n });\n return products as Product[];\n }\n\n /**\n * Sets index to focus on open to the selected product. This index resets it when the menu closes.\n */\n setFocusIndex() {\n if (this.parsedProducts.length > 1) {\n const currentProduct = this.getProduct(this.currentProductId);\n\n if (currentProduct) {\n this.itemIndexToFocus = this.parsedProducts.indexOf(currentProduct);\n }\n }\n }\n\n @Listen(\"wmUserIsTabbing\", { target: \"window\" })\n toggleTabbingOn() {\n this.isTabbing = true;\n }\n\n @Listen(\"wmUserIsNotTabbing\", { target: \"window\" })\n toggleTabbingOff() {\n this.isTabbing = false;\n }\n\n @Listen(\"keydown\")\n handleKeys(ev: KeyboardEvent) {\n switch (ev.key) {\n case \"Escape\":\n ev.preventDefault();\n this.closeMenu();\n break;\n case \"ArrowDown\":\n case \"ArrowUp\":\n ev.preventDefault();\n if (!this.isOpen) {\n this.itemIndexToFocus = getNewIndexToFocus(this.itemIndexToFocus, ev.key, this.navigatorItems.length);\n this.openMenu();\n }\n break;\n }\n }\n\n @Listen(\"keydownOnNavItem\")\n handleKeydown(ev: CustomEvent) {\n const key = ev.detail.key;\n const item = ev.detail.navItem;\n switch (key) {\n case \"Tab\":\n this.closeMenu();\n break;\n case \"Enter\":\n case \" \":\n item.click();\n break;\n case \"ArrowDown\":\n case \"ArrowUp\":\n const oldIndex = this.itemIndexToFocus;\n this.itemIndexToFocus = getNewIndexToFocus(this.itemIndexToFocus, key, this.navigatorItems.length);\n this.focusItem();\n this.unfocusItem(oldIndex);\n break;\n }\n }\n\n @Listen(\"click\", { target: \"document\" })\n handleClick(ev: MouseEvent) {\n const isElOrChild = ev.target === this.el || this.el.contains(ev.target as Node);\n\n if (!isElOrChild && this.isOpen) {\n this.closeMenu();\n }\n }\n\n @Listen(\"buttonActivated\")\n handleButtonClick() {\n this.isOpen ? this.closeMenu() : this.openMenu();\n }\n\n openMenu() {\n if (this.wrapperEl) {\n const wrapperWidth = this.wrapperEl.clientWidth;\n const spaceLeft = this.el.getBoundingClientRect().left;\n const spaceRight = document.documentElement.clientWidth - this.el.getBoundingClientRect().right;\n this.openRight = wrapperWidth > spaceLeft && spaceRight > spaceLeft;\n }\n this.isOpen = true;\n this.focusItem();\n }\n\n closeMenu() {\n this.isOpen = false;\n this.buttonFocusHandler();\n this.unfocusItem(this.itemIndexToFocus);\n this.setFocusIndex();\n }\n\n focusItem() {\n const newSelection = this.navigatorItems[this.itemIndexToFocus];\n newSelection.tabIndex = 0;\n newSelection.focused = true;\n window.requestAnimationFrame(() => newSelection.focus());\n }\n\n unfocusItem(index: number) {\n const oldSelection = this.navigatorItems[index];\n oldSelection.tabIndex = -1;\n oldSelection.focused = false;\n }\n\n buttonFocusHandler() {\n const hostButton = this.el.shadowRoot.querySelector(\"priv-navigator-button\");\n const button = hostButton.shadowRoot.querySelector(\"button\");\n window.requestAnimationFrame(() => button.focus());\n }\n\n /**\n * HELPERS FOR RENDER\n */\n renderUserInfo() {\n return (\n <div\n class=\"user\"\n id=\"wm-nav-user\"\n aria-label={intl.formatMessage(\n {\n id: \"navigator.userinfoLabel\",\n defaultMessage: \"for {name}, email {email}\",\n },\n { name: this.userName, email: this.email }\n )}\n >\n <p>{this.userName}</p>\n <p>{this.email}</p>\n </div>\n );\n }\n\n setAltText(): string {\n if (this.parsedProducts.length > 1) {\n return intl.formatMessage({\n id: \"navigator.userinfoAndProductNavigator\",\n defaultMessage: \"User information and product navigator\",\n });\n } else {\n return intl.formatMessage({\n id: \"navigator.userinfo\",\n defaultMessage: \"User information\",\n });\n }\n }\n\n renderHeading() {\n return (\n <h2>\n {intl.formatMessage({\n id: \"navigator.watermarkApps\",\n defaultMessage: \"Watermark Apps\",\n description: \"Applications made by Watermark Insights\",\n })}\n </h2>\n );\n }\n\n renderList() {\n return (\n <ul\n role=\"listbox\"\n aria-label={`${intl.formatMessage({\n id: \"navigator.WatermarkAppNavigation\",\n defaultMessage: \"Watermark App Navigation\",\n description: \"list of applications by Watermark Insights\",\n })}`}\n aria-describedby=\"wm-nav-user\"\n >\n {this.parsedProducts.length > 1 && this.renderProductOptions()}\n {this.renderLogoutOption()}\n </ul>\n );\n }\n\n renderProductOptions(): Array<HTMLPrivNavigatorItemElement> {\n return this.parsedProducts.map((product: Product) => {\n let name: string | undefined, icon: string | undefined, isSelected: boolean, clickRedirect: any;\n\n name = product.name;\n icon = (product as Product).iconUrl;\n\n clickRedirect = this.setProductOnClick(product.id);\n\n if (!!name && !!icon) {\n isSelected = this.currentProductId === product.id;\n\n return (\n <priv-navigator-item\n selected={isSelected}\n id={product.id}\n onClick={clickRedirect}\n role=\"option\"\n aria-label={name}\n >\n <img src={icon} alt={name} />\n </priv-navigator-item>\n );\n }\n });\n }\n\n setProductOnClick(productId: string) {\n const product = this.getProduct(productId);\n\n if (this.currentProductId === productId) {\n return () => {};\n } else if (product) {\n if (!!this.loadFromUserinfo || this.authType === 2) {\n return () => (window.location.href = (product as Product).linkUrl);\n } else if (this.authType === 3) {\n // products passed as prop, saml\n const connName = this.connectionName ? `/?connection_name=${this.connectionName}` : \"\";\n return () => (window.location.href = (product as Product).samlLinkUrl + connName);\n }\n }\n }\n\n renderLogoutOption() {\n return (\n <priv-navigator-item\n class=\"logout\"\n selected={!(this.parsedProducts.length > 1)}\n id=\"nav-logout\"\n onClick={this.setLogoutOnclick()}\n role=\"option\"\n >\n <span class=\"logout\">\n {intl.formatMessage({\n id: \"navigator.logout\",\n defaultMessage: \"Log Out\",\n })}\n </span>\n </priv-navigator-item>\n );\n }\n\n setLogoutOnclick() {\n // The logout item will always emit a custom event on click so that the dev can run any business logic specific to the app on logout (e.g., clearing local storage).\n // It will only redirect if the dev has set the logoutUrl. If some sort of custom redirect is needed, the logoutUrl should not be set.\n return () => {\n this.wmNavigatorLogout.emit();\n if (this.logoutUrl) {\n window.location.href = this.logoutUrl;\n }\n };\n }\n\n private get navigatorItems(): Array<HTMLPrivNavigatorItemElement> {\n return Array.from(this.el.shadowRoot.querySelectorAll(\"priv-navigator-item\"));\n }\n\n private getProduct(id: string): Product | undefined {\n return this.parsedProducts.find((product) => product.id === id);\n }\n\n render() {\n return this.retrievedInfo ? (\n <Host class={this.isTabbing ? \"user-is-tabbing\" : \"\"}>\n <priv-navigator-button expanded={this.isOpen} altText={this.setAltText()} isTabbing={this.isTabbing} />\n <div\n class={`wrapper ${this.isOpen ? \"\" : \"hide\"} ${this.openRight ? \"right\" : \"\"}`}\n ref={(el) => (this.wrapperEl = el as HTMLDivElement)}\n >\n {this.renderUserInfo()}\n {this.parsedProducts.length > 1 && this.renderHeading()}\n {this.renderList()}\n </div>\n </Host>\n ) : (\n \"\"\n );\n }\n}\n"],"mappings":"0wDAAA,IAAMA,EAAiB,69D,ICUVC,EAASC,EAAA,0B,6EAgBZC,KAAAC,eAA0BD,KAAKE,iBAGvCF,KAAAG,eAAiC,GAMzBH,KAAAI,UAAqB,M,2DAlBF,E,qGAOS,M,YAUT,M,eAGG,M,sBAOM,C,CAM9BC,EAAAC,UAAAC,kBAAN,W,4GACE,IAAKP,KAAKQ,SAAU,CAClBC,QAAQC,MAAM,kD,CAGhB,SAAMV,KAAKW,a,OAAXC,EAAAC,OACAb,KAAKc,gB,kBAKDT,EAAAC,UAAAK,UAAN,W,6HACQX,KAAKE,iBAAP,YACF,SAAMa,EAAW,gCACdC,MAAK,SAACC,GACLC,EAAKC,MAAQF,EAASE,MACtBD,EAAKE,iBAAmBH,EAASI,mBACjCH,EAAKf,eAAiBe,EAAKI,uBAAuBL,EAASM,UAC3DL,EAAKM,UAAYN,EAAKM,UAAYN,EAAKM,UAAYP,EAASQ,WAC5DP,EAAKQ,eAAiBR,EAAKQ,eAAiBR,EAAKQ,eAAiBT,EAASU,gBAC3E,KAAMT,EAAKC,SAAWD,EAAKE,iBAAkB,CAC3CF,EAAKjB,cAAgB,I,KAGxB2B,OAAM,SAACC,GACNpB,QAAQC,MAAMmB,E,YAZlBjB,EAAAC,O,mBAeAb,KAAKoB,iBAAmBU,EAAU9B,KAAK+B,IACvC,KAAM/B,KAAKuB,SAAU,CACnB,UAAWvB,KAAKuB,WAAa,SAAU,CACrCvB,KAAKG,eAAiB6B,KAAKC,MAAMjC,KAAKuB,S,KACjC,CACLvB,KAAKG,eAAiBH,KAAKuB,Q,CAE7BvB,KAAKG,eAAiBH,KAAKsB,uBAAuBtB,KAAKG,e,kBAI3DH,KAAKG,eAAe+B,MAAK,SAACC,EAAGC,GAAC,OAAMD,EAAEE,KAAOD,EAAEC,MAAQ,EAAI,CAA7B,I,kBAGhChC,EAAAC,UAAAgB,uBAAA,SAAuBC,GACrBA,EAAWA,EAASe,KAAI,SAACC,GACvB,IAAMC,EAAOC,OAAOD,KAAKD,GACzB,IAAIG,EAAwC,GAC5CF,EAAKG,SAAQ,SAACC,GACZF,EAAWG,EAAqBD,IAAQL,EAAQK,E,IAElD,OAAOF,C,IAET,OAAOnB,C,EAMTlB,EAAAC,UAAAQ,cAAA,WACE,GAAId,KAAKG,eAAe2C,OAAS,EAAG,CAClC,IAAMC,EAAiB/C,KAAKgD,WAAWhD,KAAKoB,kBAE5C,GAAI2B,EAAgB,CAClB/C,KAAKiD,iBAAmBjD,KAAKG,eAAe+C,QAAQH,E,IAM1D1C,EAAAC,UAAA6C,gBAAA,WACEnD,KAAKoD,UAAY,I,EAInB/C,EAAAC,UAAA+C,iBAAA,WACErD,KAAKoD,UAAY,K,EAInB/C,EAAAC,UAAAgD,WAAA,SAAWC,GACT,OAAQA,EAAGX,KACT,IAAK,SACHW,EAAGC,iBACHxD,KAAKyD,YACL,MACF,IAAK,YACL,IAAK,UACHF,EAAGC,iBACH,IAAKxD,KAAK0D,OAAQ,CAChB1D,KAAKiD,iBAAmBU,EAAmB3D,KAAKiD,iBAAkBM,EAAGX,IAAK5C,KAAK4D,eAAed,QAC9F9C,KAAK6D,U,CAEP,M,EAKNxD,EAAAC,UAAAwD,cAAA,SAAcP,GACZ,IAAMX,EAAMW,EAAGQ,OAAOnB,IACtB,IAAMoB,EAAOT,EAAGQ,OAAOE,QACvB,OAAQrB,GACN,IAAK,MACH5C,KAAKyD,YACL,MACF,IAAK,QACL,IAAK,IACHO,EAAKE,QACL,MACF,IAAK,YACL,IAAK,UACH,IAAMC,EAAWnE,KAAKiD,iBACtBjD,KAAKiD,iBAAmBU,EAAmB3D,KAAKiD,iBAAkBL,EAAK5C,KAAK4D,eAAed,QAC3F9C,KAAKoE,YACLpE,KAAKqE,YAAYF,GACjB,M,EAKN9D,EAAAC,UAAAgE,YAAA,SAAYf,GACV,IAAMgB,EAAchB,EAAGiB,SAAWxE,KAAK+B,IAAM/B,KAAK+B,GAAG0C,SAASlB,EAAGiB,QAEjE,IAAKD,GAAevE,KAAK0D,OAAQ,CAC/B1D,KAAKyD,W,GAKTpD,EAAAC,UAAAoE,kBAAA,WACE1E,KAAK0D,OAAS1D,KAAKyD,YAAczD,KAAK6D,U,EAGxCxD,EAAAC,UAAAuD,SAAA,WACE,GAAI7D,KAAK2E,UAAW,CAClB,IAAMC,EAAe5E,KAAK2E,UAAUE,YACpC,IAAMC,EAAY9E,KAAK+B,GAAGgD,wBAAwBC,KAClD,IAAMC,EAAaC,SAASC,gBAAgBN,YAAc7E,KAAK+B,GAAGgD,wBAAwBK,MAC1FpF,KAAKI,UAAYwE,EAAeE,GAAaG,EAAaH,C,CAE5D9E,KAAK0D,OAAS,KACd1D,KAAKoE,W,EAGP/D,EAAAC,UAAAmD,UAAA,WACEzD,KAAK0D,OAAS,MACd1D,KAAKqF,qBACLrF,KAAKqE,YAAYrE,KAAKiD,kBACtBjD,KAAKc,e,EAGPT,EAAAC,UAAA8D,UAAA,WACE,IAAMkB,EAAetF,KAAK4D,eAAe5D,KAAKiD,kBAC9CqC,EAAaC,SAAW,EACxBD,EAAaE,QAAU,KACvBC,OAAOC,uBAAsB,WAAM,OAAAJ,EAAaK,OAAb,G,EAGrCtF,EAAAC,UAAA+D,YAAA,SAAYuB,GACV,IAAMC,EAAe7F,KAAK4D,eAAegC,GACzCC,EAAaN,UAAY,EACzBM,EAAaL,QAAU,K,EAGzBnF,EAAAC,UAAA+E,mBAAA,WACE,IAAMS,EAAa9F,KAAK+B,GAAGgE,WAAWC,cAAc,yBACpD,IAAMC,EAASH,EAAWC,WAAWC,cAAc,UACnDP,OAAOC,uBAAsB,WAAM,OAAAO,EAAON,OAAP,G,EAMrCtF,EAAAC,UAAA4F,eAAA,WACE,OACEC,EAAA,OACEC,MAAM,OACNC,GAAG,cAAa,aACJC,EAAKC,cACf,CACEF,GAAI,0BACJG,eAAgB,6BAElB,CAAEnE,KAAMrC,KAAKQ,SAAUW,MAAOnB,KAAKmB,SAGrCgF,EAAA,SAAInG,KAAKQ,UACT2F,EAAA,SAAInG,KAAKmB,O,EAKfd,EAAAC,UAAAmG,WAAA,WACE,GAAIzG,KAAKG,eAAe2C,OAAS,EAAG,CAClC,OAAOwD,EAAKC,cAAc,CACxBF,GAAI,wCACJG,eAAgB,0C,KAEb,CACL,OAAOF,EAAKC,cAAc,CACxBF,GAAI,qBACJG,eAAgB,oB,GAKtBnG,EAAAC,UAAAoG,cAAA,WACE,OACEP,EAAA,UACGG,EAAKC,cAAc,CAClBF,GAAI,0BACJG,eAAgB,iBAChBG,YAAa,4C,EAMrBtG,EAAAC,UAAAsG,WAAA,WACE,OACET,EAAA,MACEU,KAAK,UAAS,aACF,GAAAC,OAAGR,EAAKC,cAAc,CAChCF,GAAI,mCACJG,eAAgB,2BAChBG,YAAa,gDACX,mBACa,eAEhB3G,KAAKG,eAAe2C,OAAS,GAAK9C,KAAK+G,uBACvC/G,KAAKgH,qB,EAKZ3G,EAAAC,UAAAyG,qBAAA,eAAA7F,EAAAlB,KACE,OAAOA,KAAKG,eAAemC,KAAI,SAACC,GAC9B,IAAIF,EAA0B4E,EAA0BC,EAAqBC,EAE7E9E,EAAOE,EAAQF,KACf4E,EAAQ1E,EAAoB6E,QAE5BD,EAAgBjG,EAAKmG,kBAAkB9E,EAAQ8D,IAE/C,KAAMhE,KAAU4E,EAAM,CACpBC,EAAahG,EAAKE,mBAAqBmB,EAAQ8D,GAE/C,OACEF,EAAA,uBACEmB,SAAUJ,EACVb,GAAI9D,EAAQ8D,GACZkB,QAASJ,EACTN,KAAK,SAAQ,aACDxE,GAEZ8D,EAAA,OAAKqB,IAAKP,EAAMQ,IAAKpF,I,MAO/BhC,EAAAC,UAAA+G,kBAAA,SAAkBK,GAChB,IAAMnF,EAAUvC,KAAKgD,WAAW0E,GAEhC,GAAI1H,KAAKoB,mBAAqBsG,EAAW,CACvC,OAAO,Y,MACF,GAAInF,EAAS,CAClB,KAAMvC,KAAKE,kBAAoBF,KAAK2H,WAAa,EAAG,CAClD,OAAO,kBAAOlC,OAAOmC,SAASC,KAAQtF,EAAoBuF,OAAnD,C,MACF,GAAI9H,KAAK2H,WAAa,EAAG,CAE9B,IAAMI,EAAW/H,KAAK0B,eAAiB,qBAAAoF,OAAqB9G,KAAK0B,gBAAmB,GACpF,OAAO,kBAAO+D,OAAOmC,SAASC,KAAQtF,EAAoByF,YAAcD,CAAjE,C,IAKb1H,EAAAC,UAAA0G,mBAAA,WACE,OACEb,EAAA,uBACEC,MAAM,SACNkB,WAAYtH,KAAKG,eAAe2C,OAAS,GACzCuD,GAAG,aACHkB,QAASvH,KAAKiI,mBACdpB,KAAK,UAELV,EAAA,QAAMC,MAAM,UACTE,EAAKC,cAAc,CAClBF,GAAI,mBACJG,eAAgB,a,EAO1BnG,EAAAC,UAAA2H,iBAAA,eAAA/G,EAAAlB,KAGE,OAAO,WACLkB,EAAKgH,kBAAkBC,OACvB,GAAIjH,EAAKM,UAAW,CAClBiE,OAAOmC,SAASC,KAAO3G,EAAKM,S,IAKlCiB,OAAA2F,eAAY/H,EAAAC,UAAA,iBAAc,C,IAA1B,WACE,OAAO+H,MAAMC,KAAKtI,KAAK+B,GAAGgE,WAAWwC,iBAAiB,uB,uCAGhDlI,EAAAC,UAAA0C,WAAA,SAAWqD,GACjB,OAAOrG,KAAKG,eAAeqI,MAAK,SAACjG,GAAY,OAAAA,EAAQ8D,KAAOA,CAAf,G,EAG/ChG,EAAAC,UAAAmI,OAAA,eAAAvH,EAAAlB,KACE,OAAOA,KAAKC,cACVkG,EAACuC,EAAI,CAACtC,MAAOpG,KAAKoD,UAAY,kBAAoB,IAChD+C,EAAA,yBAAuBwC,SAAU3I,KAAK0D,OAAQkF,QAAS5I,KAAKyG,aAAcrD,UAAWpD,KAAKoD,YAC1F+C,EAAA,OACEC,MAAO,WAAAU,OAAW9G,KAAK0D,OAAS,GAAK,OAAM,KAAAoD,OAAI9G,KAAKI,UAAY,QAAU,IAC1EyI,IAAK,SAAC9G,GAAE,OAAMb,EAAKyD,UAAY5C,CAAvB,GAEP/B,KAAKkG,iBACLlG,KAAKG,eAAe2C,OAAS,GAAK9C,KAAK0G,gBACvC1G,KAAK4G,eAEH,E,0VA9WS,I"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmUploaderCss","Uploader","this","inputId","generateId","uploadButtonEl","el","shadowRoot","querySelector","tempUploaderType","type","uploaderType","effectiveMaxSize","defaultMaxSize","maxSizeLimit","maxSize","Math","min","fileLimitReached","maxFiles","fileList","length","displayedErrorMessage","errorMessage","internalErrorMessage","fileLimitExceededMessage","intl","formatMessage","id","defaultMessage","description","fileLimitReachedMessage","fileCountMessage","x","y","maxSizeMessage","acceptedFileTypesMessage","validTypes","fileTypes","split","join","amount","toggleTabbingOn","isTabbing","toggleTabbingOff","handleUploadProgress","ev","map","i","detail","progress","forceUpdate","numFilesInProgress","srProgress","total","setInterval","aggregate","reduce","avg","item","announce","percentage","floor","handleFileErrorCleared","filename","name","errorList","filter","error","focus","handleFileDeleted","clearErrors","wmUploaderDeleteFile","emit","wmFileDelete","wmDeleteFile","handleFilePreviewed","wmUploaderPreviewFile","wmFilePreview","handleFileDownloaded","wmUploaderDownloadFile","wmFileDownload","wmDownloadFile","parseFiles","files","list","JSON","parse","forEach","size","match","convertedSize","convertBytes","toFixed","unit","Error","focusAfterRemoval","newFiles","oldFiles","newFileIds","file","oldFileIds","removedFileId","includes","indexOf","fileIdPrecedingRemoved","fileElPrecedingRemoved","focusedElementsButtons","querySelectorAll","lastButtonInFile","parseRejectedFiles","rejectedFiles","uploadNotifications","newNum","oldNum","setTimeout","notif","finishedMessage","clearInterval","filesUploadingMessage","num","handleErrorMessageChange","isValidSize","bytes","unitOrder","unitIndex","result","parseInt","isDuplicate","hasDuplicateUploadingFile","filesToUpload","some","fileToUpload","hasDuplicateUploadedFile","f","isEmpty","isDisabled","isItemUploading","hasOwnProperty","message","liveRegion","textContent","announcement","handleFiles","Array","from","target","hasValidType","push","wmUploaderFilesSelected","wmFilesSelected","value","componentWillLoad","buttonText","console","warn","emptyStateText","componentDidLoad","document","body","classList","contains","uploadButtonOnClick","preventDefault","srMsg","renderUploadSvg","h","class","width","height","viewBox","transform","fill","d","renderIcon","rotate","icon","String","fromCodePoint","renderInfo","info","renderNotif","renderError","renderUploadButton","classes","accessibleLabel","label","requiredField","multiple","onClick","onChange","htmlFor","renderEmptyState","renderErrorList","srMessage","acc","err","formatTimestamp","timestamp","uploadDate","Date","day","getDate","month","getMonth","year","getFullYear","time","toLocaleTimeString","hour","minute","formattedDate","renderInProgressFileList","stringify","showInfo","renderUploadedFileList","lastUpdated","renderFiles","sortBy","sort","a","b","localeCompare","legacyRenderHeader","renderHeader","renderRequirements","renderFooter","numFiles","renderWithItems","hasNewlyUploadedFiles","renderLabel","render","Host","ref"],"sources":["./src/components/wm-uploader/wm-uploader.scss?tag=wm-uploader&encapsulation=shadow","./src/components/wm-uploader/wm-uploader.tsx"],"sourcesContent":[":host,\nwm-uploader {\n display: block;\n position: relative;\n max-width: 1140px;\n\n &[dir=\"RTL\"] {\n .mdi {\n margin-left: rem-calc(5);\n margin-right: 0;\n }\n }\n @extend %wm-button;\n\n input:focus + .wm-button.user-is-tabbing {\n -webkit-box-shadow: 0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e !important;\n -moz-box-shadow: 0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e !important;\n box-shadow: 0 2px 2px 0 rgba(244, 243, 246, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 0 4px 3px #61279e !important;\n }\n}\n\n:host *,\nwm-uploader * {\n box-sizing: border-box;\n}\n\n.wm-button.disabled {\n // override the %wm-button rule\n // we want a pointer event when disabled,\n // to trigger a SR message\n pointer-events: initial !important;\n}\n\n@include label;\n#label {\n margin-bottom: rem-calc(8);\n}\n\n.header {\n .info-wrapper {\n align-items: center;\n .info {\n font-size: rem-calc(14);\n margin-left: 1rem;\n }\n }\n\n .accepted-types {\n font-size: rem-calc(14);\n }\n\n .requirements {\n font-size: rem-calc(14);\n margin-left: rem-calc(16);\n }\n}\n\n.footer {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n padding: rem-calc(15 30);\n\n .notif-wrapper {\n align-items: flex-end;\n }\n\n .filecount-wrapper {\n display: flex;\n align-items: center;\n .filecount {\n font-size: 0.875rem;\n margin-right: 1rem;\n }\n }\n}\n\n.notif-wrapper {\n position: relative;\n display: flex;\n flex-direction: row;\n margin-bottom: rem-calc(12);\n\n .requirements {\n display: flex;\n flex-direction: column;\n }\n}\n\n.notif,\n#error {\n padding-top: rem-calc(4);\n font-size: 0.875rem;\n font-style: italic;\n\n &#error {\n color: $error-color;\n }\n}\n\n.info-wrapper {\n position: relative; // for .info\n display: flex;\n}\n\n.list-container {\n overflow-y: unset;\n\n &.checkmark-spacer {\n margin-right: rem-calc(44);\n }\n\n &:has(.error-list, .inprogress-list, .file-list) {\n margin-top: rem-calc(40);\n }\n\n ul {\n padding: 0;\n width: 100%;\n margin: 0;\n\n wm-file {\n margin-bottom: rem-calc(8);\n }\n }\n}\n\n.sr-only {\n @include srOnly;\n}\n\n/// FOR DEPRECATED TYPES ///////////////////////////////////////\n.empty-block {\n margin: 5rem auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n\n .upload-file {\n margin-bottom: rem-calc(30);\n }\n\n .empty-message {\n font-size: 0.875rem;\n &.large {\n font-size: 1.5rem;\n }\n margin-bottom: rem-calc(7);\n }\n\n .info-wrapper {\n justify-content: center;\n width: 100%; // for .notif\n\n .wm-button {\n // Removing the width inherit here to prevent a 100% width\n // from the info-wrapper. Future proofing a day when\n // we might want a long notif to wrap.\n width: auto;\n }\n }\n}\n\n.header {\n &.type1,\n &.type2 {\n margin-bottom: 1rem;\n }\n .slot-wrapper {\n display: flex;\n justify-content: flex-start;\n align-items: flex-start;\n }\n}\n\n.notif-wrapper {\n &.type1,\n &.type2 {\n flex-direction: column;\n margin-bottom: rem-calc(16);\n }\n}\n\n.list-container {\n &.type1,\n &.type2 {\n overflow-y: auto;\n ul {\n margin: revert;\n }\n .file-list li,\n .inprogress-list li {\n // margin-bottom also on the last element, otherwise tooltip on dl and delete btns triggers a scrollbar\n margin-bottom: rem-calc(26);\n }\n .error-list li {\n margin-bottom: rem-calc(20);\n }\n }\n\n &.type1 {\n padding: rem-calc(0 30);\n height: rem-calc(260);\n }\n}\n","import { Component, Element, Event, EventEmitter, h, Host, Prop, State, Listen, Watch } from \"@stencil/core\";\nimport { forceUpdate } from \"@stencil/core\";\nimport { generateId, hasValidType, intl } from \"../../global/functions\";\nimport { UploadedFile } from \"../../global/interfaces\";\ninterface ErrorFile {\n name: string;\n message: string;\n}\n\n@Component({\n tag: \"wm-uploader\",\n styleUrl: \"wm-uploader.scss\",\n shadow: { delegatesFocus: true },\n})\nexport class Uploader {\n @Element() el!: HTMLWmUploaderElement;\n private liveRegion!: HTMLDivElement;\n get uploadButtonEl(): HTMLElement {\n return this.el.shadowRoot!.querySelector(`#${this.inputId}`) as HTMLElement;\n }\n\n @Prop({ mutable: true }) uploaderType?: \"1\" | \"2\"; // only mutable for the deprecation transition\n @Prop() type?: \"1\" | \"2\"; // DEPRECATED in favor of uploaderType\n get tempUploaderType() {\n // replace instances of this.tempUploaderType with this.uploaderType once type is fully phased out\n return this.type || this.uploaderType;\n }\n @Prop() label?: string;\n @Prop() buttonText!: string;\n @Prop() info?: string;\n @Prop() emptyStateText!: string;\n @Prop() icon!: string;\n @Prop() fileTypes: string = \"pdf txt log xml doc docx xls xlsx ppt pptx gif jpg jpeg png csv\";\n @Prop() maxSize?: number | null; // in Mb\n @Prop() maxFiles?: number;\n @Prop() sortBy: \"name\" | \"date\" = \"date\"; // name is descending (a -> z), date is ascending (earlier -> later)\n @Prop() showInfo: \"time\" | \"size\" | \"none\" = \"time\";\n @Prop() errorMessage?: string;\n @Prop() requiredField?: boolean;\n\n @Prop() files?: string; // String representation of an array of files (the files retrieved from the server)\n @State() fileList: UploadedFile[] = []; // the string above transformed into the actual array\n @Prop({ mutable: true }) filesToUpload: File[] = []; // input.files that passed validation\n\n @State() isTabbing: boolean = false;\n\n @Prop() rejectedFiles?: string; // String representation of an array of errors to add to errorList, allows devs to display server-side errors\n @State() errorList: ErrorFile[] = []; // for errors on a particular file\n @State() notif?: string | null; // for upload notifications\n @State() internalErrorMessage?: string;\n @State() announcement: string = \"\";\n @State() numFilesInProgress?: number | null; // null when not uploading != 0 (when all files are done uploading) != undefined (original state)\n @State() isCondensed: boolean = false;\n private srProgress?: any; // setInterval for SR to announce the aggregate progress percentage when things take a long time. stored here so it can be stopped when upload is finished.\n private inputId = generateId();\n\n @Event() wmUploaderFilesSelected!: EventEmitter;\n @Event() wmFilesSelected!: EventEmitter; // deprecated in favor of wmUploaderFilesSelected\n @Event() wmUploaderDeleteFile!: EventEmitter;\n @Event() wmDeleteFile!: EventEmitter; // deprecated in favor of wmUploaderDeleteFile\n @Event() wmUploaderDownloadFile!: EventEmitter;\n @Event() wmDownloadFile!: EventEmitter; // deprecated in favor of wmUploaderDownloadFile\n @Event() wmUploaderPreviewFile!: EventEmitter;\n\n @Event() wmFileDelete!: EventEmitter<string>;\n @Event() wmFileDownload!: EventEmitter<string>;\n @Event() wmFilePreview!: EventEmitter<string>;\n\n get effectiveMaxSize() {\n const defaultMaxSize = 100;\n // maxsize cannot be set to over 100Mb\n const maxSizeLimit = 100;\n\n return this.maxSize ? Math.min(this.maxSize, maxSizeLimit) : defaultMaxSize;\n }\n\n get fileLimitReached() {\n return this.maxFiles && this.fileList.length >= this.maxFiles;\n }\n\n get displayedErrorMessage(): string {\n return this.errorMessage || this.internalErrorMessage || \"\";\n }\n\n get fileLimitExceededMessage() {\n return intl.formatMessage({\n id: \"uploader.fileUploadLimitExceeded\",\n defaultMessage: \"Upload unsuccessful because file selection would exceed the maximum number of files\",\n description: \"Message displayed when trying to upload too many files\",\n });\n }\n\n get fileLimitReachedMessage() {\n return intl.formatMessage({\n id: \"uploader.fileUploadLimitReached\",\n defaultMessage: \"The maximum number of files has been reached\",\n description: \"Message displayed when trying to upload additional files, but the limit has been reached\",\n });\n }\n\n get fileCountMessage() {\n return intl.formatMessage(\n {\n id: \"uploader.fileCount\",\n defaultMessage: \"{x} of {y} Files\",\n description: \"A count of the number of files currently uploaded\",\n },\n { x: this.fileList.length, y: this.maxFiles }\n );\n }\n\n get maxSizeMessage() {\n return intl.formatMessage(\n {\n id: \"uploader.maxSize\",\n defaultMessage: \"Maximum file size {maxSize}MB\",\n description: \"An indicator of the maximum file size the uploader allows\",\n },\n {\n maxSize: this.effectiveMaxSize,\n }\n );\n }\n\n get acceptedFileTypesMessage() {\n const validTypes = \".\" + this.fileTypes.split(\" \").join(\", .\");\n return intl.formatMessage(\n {\n id: \"uploader.acceptedFileTypes\",\n defaultMessage: \"Accepted file {amount, plural, =1 {type} other {types}}: {fileTypes}\",\n },\n {\n fileTypes: validTypes,\n amount: this.fileTypes.split(\" \").length,\n }\n );\n }\n\n @Listen(\"wmUserIsTabbing\", { target: \"window\" })\n toggleTabbingOn() {\n this.isTabbing = true;\n }\n\n @Listen(\"wmUserIsNotTabbing\", { target: \"window\" })\n toggleTabbingOff() {\n this.isTabbing = false;\n }\n\n @Listen(\"wmUploadProgress\")\n handleUploadProgress(ev: CustomEvent) {\n this.fileList.map((i) => {\n if (i.id === ev.detail.id) {\n i.progress = ev.detail.progress;\n forceUpdate(this.el);\n }\n });\n\n if (ev.detail.progress === 100) {\n // inProgressList is not a perfect reflection of how many files are uploading\n // because even after progress reached 100% the item should remain in the array\n // (should only be removed once it appears in fileList)\n this.numFilesInProgress! -= 1;\n }\n\n // aggregate the percentages for SR to announce progress\n if (!this.srProgress && this.numFilesInProgress) {\n const total = this.numFilesInProgress; // if we don't reassign this number changes when a file is done and the percentage becomes wrong\n this.srProgress = setInterval(() => {\n const aggregate = this.fileList.reduce((avg, item) => (item.progress ? avg + item.progress : avg), 0);\n this.announce(\n intl.formatMessage(\n {\n id: \"uploader.uploadProgress\",\n defaultMessage: \"Upload progress: {percentage}%\",\n },\n { percentage: Math.floor(aggregate / total) }\n )\n );\n }, 5000);\n }\n }\n\n @Listen(\"wmFileClearErrorClicked\")\n handleFileErrorCleared(ev: CustomEvent) {\n const filename = ev.detail.name;\n this.errorList = this.errorList.filter((error) => error.name != filename);\n this.uploadButtonEl.focus();\n }\n\n @Listen(\"wmIntFileDeleted\")\n handleFileDeleted(ev: CustomEvent) {\n this.clearErrors();\n forceUpdate(this.el); // for the button to stop being disabled if num files become < max-files\n this.wmUploaderDeleteFile.emit(ev.detail);\n this.wmFileDelete.emit(ev.detail);\n this.wmDeleteFile.emit(ev.detail); // deprecated\n }\n\n @Listen(\"wmIntFilePreviewed\")\n handleFilePreviewed(ev: CustomEvent) {\n this.clearErrors();\n this.wmUploaderPreviewFile.emit(ev.detail);\n this.wmFilePreview.emit(ev.detail);\n }\n\n @Listen(\"wmIntFileDownloaded\")\n handleFileDownloaded(ev: CustomEvent) {\n this.clearErrors();\n this.wmUploaderDownloadFile.emit(ev.detail);\n this.wmFileDownload.emit(ev.detail);\n this.wmDownloadFile.emit(ev.detail); // deprecated\n }\n\n @Watch(\"files\")\n parseFiles() {\n if (!!this.files) {\n if (typeof this.files === \"string\") {\n let list = JSON.parse(this.files);\n if (typeof list === \"object\") {\n // if size is in byte format, convert to display format\n list.forEach((item: any) => {\n if (item.size && (typeof item.size === \"number\" || item.size.match(/^[0-9]+$/))) {\n const convertedSize = this.convertBytes(item.size);\n item.size = `${convertedSize.size.toFixed(0)} ${convertedSize.unit}`;\n }\n });\n this.fileList = list;\n } else {\n throw new Error(\"could not parse string passed to files attribute\");\n }\n } else {\n throw new Error(\"Attribute 'files' should be a string\");\n }\n }\n }\n\n @Watch(\"fileList\")\n focusAfterRemoval(newFiles: UploadedFile[], oldFiles: UploadedFile[]) {\n if (this.isTabbing && newFiles.length < oldFiles.length) {\n const newFileIds = newFiles.map((file: UploadedFile) => file.id);\n const oldFileIds = oldFiles.map((file: UploadedFile) => file.id);\n // even in the case that multiple files have been removed at once, work off of the first in that group\n const removedFileId = oldFileIds.filter((id: string) => !newFileIds.includes(id))[0];\n\n if (oldFileIds.indexOf(removedFileId) > 0) {\n const fileIdPrecedingRemoved = oldFileIds[oldFileIds.indexOf(removedFileId) - 1];\n const fileElPrecedingRemoved = this.el.shadowRoot!.querySelector(\"#file-\" + fileIdPrecedingRemoved);\n const focusedElementsButtons = fileElPrecedingRemoved?.shadowRoot!.querySelectorAll(\"wm-button\");\n\n if (focusedElementsButtons && focusedElementsButtons.length > 0) {\n const lastButtonInFile = focusedElementsButtons[focusedElementsButtons.length - 1];\n lastButtonInFile.focus();\n } else {\n // if preceding file has no file action buttons, rerun function with adjusted params\n // by removing the fileElPrecedingRemoved from the newFiles list, it is now considered the removedFile and looks to focus it's preceding file\n // if it continues to cannot find an appropriate preceding file and becomes the first file in the list, it focuses the upload button\n this.focusAfterRemoval(\n newFiles.filter((file: UploadedFile) => file.id !== fileIdPrecedingRemoved),\n oldFiles\n );\n }\n } else {\n this.uploadButtonEl.focus();\n }\n }\n }\n\n @Watch(\"rejectedFiles\")\n parseRejectedFiles() {\n if (!!this.rejectedFiles) {\n if (typeof this.files === \"string\") {\n const list = JSON.parse(this.rejectedFiles);\n if (typeof list === \"object\") {\n this.errorList = list;\n } else {\n throw new Error(\"could not parse string passed to errors attribute\");\n }\n } else {\n throw new Error(\"Attribute 'rejected-files' should be a string\");\n }\n }\n }\n\n @Watch(\"numFilesInProgress\")\n uploadNotifications(newNum: number, oldNum: number) {\n if (oldNum > 0 && newNum === 0) {\n setTimeout(() => {\n this.notif = \"\";\n this.internalErrorMessage = \"\";\n }, 20 * 1000);\n const finishedMessage = intl.formatMessage({\n id: \"uploader.finishedUploading\",\n defaultMessage: \"Finished uploading\",\n });\n this.notif = finishedMessage;\n this.announce(finishedMessage);\n this.numFilesInProgress = null;\n clearInterval(this.srProgress);\n forceUpdate(this.el);\n } else if (newNum > 0 && newNum != oldNum) {\n const filesUploadingMessage = intl.formatMessage(\n {\n id: \"uploader.filesUploading\",\n defaultMessage: \"{num, plural, one {1 file uploading} other {# files uploading}}\",\n },\n { num: newNum }\n );\n this.notif = filesUploadingMessage;\n this.announce(filesUploadingMessage);\n forceUpdate(this.el);\n }\n }\n\n @Watch(\"errorMessage\")\n handleErrorMessageChange() {\n if (this.errorMessage) {\n this.announce(this.errorMessage);\n }\n }\n\n isValidSize(size: number) {\n return this.convertBytes(size, \"MB\").size <= this.effectiveMaxSize;\n }\n\n convertBytes(bytes: number, unit?: \"KB\" | \"MB\" | \"GB\" | \"TB\") {\n // https://stackoverflow.com/questions/2365100/converting-bytes-to-megabytes\n const unitOrder = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let unitIndex = 0;\n let result = typeof bytes === \"number\" ? bytes : parseInt(bytes);\n\n if (unit) {\n // convert until result matches desired unit\n while (unitOrder.indexOf(unit) > unitIndex) {\n result /= 1024;\n unitIndex++;\n }\n } else {\n // convert until result is appropriate unit (value is under 1000)\n while (result > 1000) {\n result /= 1024;\n unitIndex++;\n }\n }\n return { size: result, unit: unitOrder[unitIndex] };\n }\n\n isDuplicate(name: string) {\n const hasDuplicateUploadingFile = this.filesToUpload.some((fileToUpload: File) => fileToUpload.name === name);\n const hasDuplicateUploadedFile = this.fileList.some((f) => {\n const filename: string = f.type ? f.name + \".\" + f.type : f.name;\n return filename === name;\n });\n\n return hasDuplicateUploadingFile || hasDuplicateUploadedFile;\n }\n\n isEmpty() {\n return !this.fileList.length && !this.errorList.length;\n }\n\n get isDisabled() {\n // disable if is the uploader is maxed out or if something is uploading\n return this.fileLimitReached || this.numFilesInProgress! > 0;\n }\n\n isItemUploading(item: UploadedFile) {\n return item.hasOwnProperty(\"progress\") && item.progress! < 100;\n }\n\n announce(message: string) {\n if (this.liveRegion.textContent === message) {\n message += \"\\u00A0\";\n }\n this.announcement = message;\n }\n\n clearErrors() {\n this.errorList = [];\n this.notif = \"\";\n this.internalErrorMessage = \"\";\n }\n\n handleFiles(ev: Event) {\n this.filesToUpload = [];\n const validTypes = this.fileTypes.split(\" \").join(\", \");\n const files = Array.from((ev.target! as HTMLInputElement).files!);\n\n if (!!this.maxFiles && this.fileList.length + files.length > this.maxFiles) {\n this.internalErrorMessage = this.fileLimitExceededMessage;\n this.announce(this.fileLimitExceededMessage);\n } else {\n files &&\n files.map((file) => {\n if (!hasValidType(file, this.fileTypes)) {\n const error = {\n name: file.name,\n message: intl.formatMessage(\n {\n id: \"uploader.invalidFileType\",\n defaultMessage: \"The file type is invalid. Accepted types: {validTypes}\",\n },\n { validTypes }\n ),\n };\n this.errorList.push(error);\n } else if (file.size === 0) {\n const error = {\n name: file.name,\n message: intl.formatMessage({\n id: \"uploader.zeroFileSize\",\n defaultMessage: \"The file must be more than 0 bytes\",\n description: \"Error message when user attempts to upload a file of no size\",\n }),\n };\n this.errorList.push(error);\n } else if (!this.isValidSize(file.size)) {\n const error = {\n name: file.name,\n message: intl.formatMessage(\n {\n id: \"uploader.fileTooLarge\",\n defaultMessage: \"The selected file is too large. Maximum file size is {size}Mb\",\n },\n { size: this.effectiveMaxSize }\n ),\n };\n this.errorList.push(error);\n } else if (this.isDuplicate(file.name)) {\n const error = {\n name: file.name,\n message: intl.formatMessage({\n id: \"uploader.duplicateName\",\n defaultMessage: \"A file with this name already exists.\",\n }),\n };\n this.errorList.push(error);\n } else {\n this.filesToUpload.push(file);\n }\n });\n\n if (this.filesToUpload.length > 0) {\n this.numFilesInProgress = this.filesToUpload.length;\n this.wmUploaderFilesSelected.emit(this.filesToUpload);\n this.wmFilesSelected.emit(this.filesToUpload); // deprecated\n }\n }\n (ev.target! as HTMLInputElement).value = \"\"; // reset to ensure that onChange is triggered when the same file is selected a second time\n }\n\n componentWillLoad() {\n if (!this.buttonText) {\n throw new Error(\"wm-uploader: button-text is a required prop\");\n }\n\n if (this.type) {\n console.warn(\"wm-uploader: type has been deprecated as of v3.1.0. Please use uploader-type instead.\");\n }\n\n if (this.tempUploaderType === \"1\" && !this.emptyStateText) {\n throw new Error(\"wm-uploader: empty-state-text is a required prop\");\n }\n\n this.parseFiles();\n this.clearErrors();\n this.parseRejectedFiles();\n }\n\n componentDidLoad() {\n if (document.body.classList.contains(\"wmcl-user-is-tabbing\")) {\n this.toggleTabbingOn();\n }\n }\n\n uploadButtonOnClick(ev: Event) {\n if (this.isDisabled) {\n // this is a temporary fix.\n // we need the disabled button to be programmatically focusable\n // to allow return focus after closing the browser file panel\n // since it's focusable the button should respond when activated\n // it looks disabled, and announces the reason why the action cannot\n // be taken when activated.\n ev.preventDefault();\n\n if (this.numFilesInProgress! > 0) {\n const srMsg = intl.formatMessage({\n id: \"uploader.waitToUpload\",\n defaultMessage: \"Please wait for current upload to complete before uploading new files.\",\n description: \"Message for screen reader users\",\n });\n this.announce(srMsg);\n } else if (this.fileLimitReached) {\n this.internalErrorMessage = this.fileLimitReachedMessage;\n this.announce(this.fileLimitReachedMessage);\n }\n } else {\n this.clearErrors();\n }\n }\n\n renderUploadSvg() {\n return (\n <svg class=\"upload-file\" width=\"91\" height=\"84\" viewBox=\"0 0 91 84\">\n <path\n transform=\"rotate(-180.000000) translate(-452, -255.5)\"\n fill=\"#eae8ec\"\n d=\"M361,249.681818 L361,197.318182 C361,194.118182 365.555061,191.5 371.122358,191.5 L391.316463,191.5 L391.286495,200.562515 L369.871211,200.600292 L369.885404,200.622146 L369.886423,246.655947 L443.657038,246.840767 L443.657038,200.622146 L421.683537,200.622146 L421.683537,191.5 L441.978865,191.5 C447.546162,191.5 452,194.118182 452,197.318182 L452,249.681818 C452,252.881818 447.546162,255.5 441.978865,255.5 L371.122358,255.5 C365.504449,255.5 361,252.881818 361,249.681818 Z M391.5,207 L406,221 L420.5,207 L409.625,207 L409.625,172 L402.375,172 L402.375,207 L391.5,207 Z\"\n ></path>\n </svg>\n );\n }\n\n renderIcon() {\n // mdi attachment icon (paper clip) is horizontal but we want it vertical\n const rotate = this.icon && this.icon === \"f066\";\n return (\n this.icon && (\n <span class={`mdi ${rotate ? \"rotate\" : \"\"}`}>{String.fromCodePoint(parseInt(`0x${this.icon}`))}</span>\n )\n );\n }\n\n renderInfo() {\n return this.info && this.tempUploaderType === \"2\" ? <span class=\"info\">{this.info}</span> : \"\";\n }\n\n renderNotif() {\n return <div class=\"notif\">{this.notif}</div>;\n }\n\n renderError() {\n return <div id=\"error\">{this.displayedErrorMessage}</div>;\n }\n\n renderUploadButton(classes: string) {\n let accessibleLabel = `${this.label && this.label !== this.buttonText ? `${this.label}, ` : \"\"}${this.buttonText}`;\n\n return (\n <div class=\"info-wrapper\">\n <input\n name={this.inputId}\n id={this.inputId}\n class=\"sr-only\"\n aria-label={accessibleLabel}\n aria-required={this.requiredField ? \"true\" : null}\n aria-describedby={`${this.displayedErrorMessage ? \"error \" : \"\"}file-count max-size accepted-types`}\n type=\"file\"\n multiple\n onClick={(ev) => this.uploadButtonOnClick(ev)}\n onChange={(ev) => this.handleFiles(ev)}\n />\n <label htmlFor={this.inputId} class={`wm-button ${classes}${this.isTabbing ? \" user-is-tabbing\" : \"\"}`}>\n {this.renderIcon()}\n {this.buttonText}\n </label>\n {this.renderInfo()}\n </div>\n );\n }\n\n renderEmptyState() {\n return (\n <div class=\"empty-block\">\n {this.renderUploadSvg()}\n <div class={`empty-message`}>{this.emptyStateText}</div>\n {this.renderUploadButton(\"-primary empty-button\")}\n {this.notif && this.renderNotif()}\n {this.displayedErrorMessage && this.renderError()}\n </div>\n );\n }\n\n renderErrorList() {\n let srMessage = this.errorList.reduce(function (acc, err) {\n return acc + `${err.name}: ${err.message} `;\n }, \"\");\n this.announce(srMessage);\n\n return (\n <ul class=\"error-list\">\n {this.errorList.map((err) => (\n <wm-file file={`{\"name\": \"${err.name}\"}`} error-message={err.message}></wm-file>\n ))}\n </ul>\n );\n }\n\n formatTimestamp(timestamp: string): string {\n const uploadDate = new Date(Date.parse(timestamp));\n const day = uploadDate.getDate();\n const month = uploadDate.getMonth() + 1;\n const year = uploadDate.getFullYear();\n const time = uploadDate.toLocaleTimeString(\"en-us\", { hour: \"numeric\", minute: \"2-digit\" });\n const formattedDate = `${month}/${day}/${year} ${time}`;\n\n return formattedDate;\n }\n\n renderInProgressFileList() {\n return (\n <ul class=\"inprogress-list\">\n {this.fileList\n .filter((item) => this.isItemUploading(item))\n .map((item) => (\n <wm-file file={JSON.stringify(item)} show-info={this.showInfo}></wm-file>\n ))}\n </ul>\n );\n }\n\n renderUploadedFileList() {\n return (\n <ul class=\"file-list\">\n {this.fileList\n .filter((item) => !this.isItemUploading(item))\n .map((item) => {\n item.lastUpdated = this.formatTimestamp(item.lastUpdated);\n return <wm-file id={`file-${item.id}`} file={JSON.stringify(item)} show-info={this.showInfo}></wm-file>;\n })}\n </ul>\n );\n }\n\n renderFiles() {\n // if we switch to accepting display format for the wm-uploader's file lastUpdateds, sorting by date will become impossible\n this.sortBy === \"name\"\n ? this.fileList.sort((a, b) => a.name.localeCompare(b.name))\n : this.fileList.sort((a, b) => Date.parse(a.lastUpdated) - Date.parse(b.lastUpdated));\n return (\n <div>\n {this.renderInProgressFileList()}\n {this.renderUploadedFileList()}\n </div>\n );\n }\n\n legacyRenderHeader() {\n return (\n <div class={`header ${this.tempUploaderType ? `type${this.tempUploaderType}` : \"\"}`}>\n <div class=\"slot-wrapper\">\n <slot />\n <div class={`notif-wrapper ${this.tempUploaderType ? `type${this.tempUploaderType}` : \"\"}`}>\n {this.renderUploadButton(`-secondary ${this.isDisabled ? \"disabled\" : \"\"}`)}\n {this.notif && this.renderNotif()}\n {this.displayedErrorMessage && this.renderError()}\n </div>\n </div>\n </div>\n );\n }\n\n renderHeader() {\n return (\n <div class={`header ${this.tempUploaderType ? `type${this.tempUploaderType}` : \"\"}`}>\n <div class={`notif-wrapper ${this.tempUploaderType ? `type${this.tempUploaderType}` : \"\"}`}>\n {this.renderUploadButton(`-secondary ${this.isDisabled ? \"disabled\" : \"\"}`)}\n {this.renderRequirements()}\n </div>\n <div id=\"accepted-types\" class=\"accepted-types\">\n {this.acceptedFileTypesMessage}\n </div>\n {this.notif && this.renderNotif()}\n {this.displayedErrorMessage && this.renderError()}\n </div>\n );\n }\n\n renderRequirements() {\n return (\n <div class=\"requirements\">\n {this.maxFiles && <span id=\"file-count\">{this.fileCountMessage}</span>}\n {this.maxSize && <span id=\"max-size\">{this.maxSizeMessage}</span>}\n </div>\n );\n }\n\n renderFooter() {\n return (\n <div class=\"footer\">\n <div class={`notif-wrapper ${this.tempUploaderType ? `type${this.tempUploaderType}` : \"\"}`}>\n <div class=\"filecount-wrapper\">\n <div class=\"filecount\">\n {intl.formatMessage(\n {\n id: \"uploader.filesAdded\",\n defaultMessage: \"{numFiles, plural, one {1 file added} other {# files added}}\",\n },\n { numFiles: this.fileList.length }\n )}\n </div>\n {this.renderUploadButton(`-primary ${this.isDisabled ? \"disabled\" : \"\"}`)}\n </div>\n {this.notif && this.renderNotif()}\n {this.displayedErrorMessage && this.renderError()}\n </div>\n </div>\n );\n }\n\n renderWithItems() {\n // it's possible progress is passed in as a string, so we need to check for \"100\" as well\n const hasNewlyUploadedFiles =\n this.fileList.filter((file) => file.progress === (typeof file.progress === \"number\" ? 100 : \"100\")).length > 0;\n return (\n <div>\n {!this.tempUploaderType && this.renderHeader()}\n {this.tempUploaderType === \"2\" && this.legacyRenderHeader()}\n <div\n class={`list-container type${this.tempUploaderType} ${\n !this.tempUploaderType && hasNewlyUploadedFiles ? \"checkmark-spacer\" : \"\"\n }`}\n >\n {this.errorList.length > 0 && this.renderErrorList()}\n {this.fileList.length > 0 && this.renderFiles()}\n </div>\n {this.tempUploaderType === \"1\" && this.renderFooter()}\n </div>\n );\n }\n\n renderLabel() {\n return (\n <div class={`wrapper ${this.displayedErrorMessage ? \"invalid\" : \"\"}`}>\n <div id=\"label\" class={`label`}>\n {this.label}\n {this.requiredField && (\n <span class=\"required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n </div>\n );\n }\n\n render() {\n return (\n <Host>\n {this.label && this.renderLabel()}\n {this.isEmpty() && this.tempUploaderType === \"1\" ? this.renderEmptyState() : this.renderWithItems()}\n <div\n ref={(el) => (this.liveRegion = el as HTMLDivElement)}\n class=\"live-region sr-only\"\n 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\n aria-atomic=\"true\"\n >\n {this.announcement}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmTimepickerCss","Timepicker","exports","this","twelveHrValid","twentyFourHrValid","uid","timeFormat","times","openUp","buttonAriaLabel","intl","formatMessage","id","defaultMessage","description","class_1","prototype","toggleTabbingOn","isTabbing","toggleTabbingOff","handleKey","ev","key","preventDefault","isExpanded","open","moveDown","selectedOption","moveUp","handleOptionClick","textContent","stopPropagation","close","focusOption","optionsList","setDropdownPosition","length","updateErrorState","displayedErrorMessage","errorMessage","componentWillLoad","label","console","error","el","generateId","generateTimes","componentDidLoad","optionsEl","classList","add","Array","from","querySelectorAll","value","processInput","isValidTime","input","test","startTime","i","h_1","Math","floor","hour","toString","padStart","m","min","concat","findNearestTimeInterval","time","formattedTime","formatToStorage","minutes","parseInt","slice","roundedMinutes","round","roundedHour","replace","handleListSelection","_this","option","filter","o","formatToDisplay","setValue","previousValue","inputEl","wmTimepickerNewValidValue","emit","wmTimepickerOnChange","isValid","newErrorMessage","determineErrorMessage","message","requiredError","requiredFieldMessage","invalidError","requiredField","splitTime","exec","hours","amPm","undefined","toUpperCase","includes","_a","itemToSelect","shouldOpenUp","remove","window","requestAnimationFrame","returnFocus","setTimeout","buttonEl","focus","item","forEach","tabIndex","position","prevItem","previousElementSibling","scrollTop","getBoundingClientRect","top","nextItem","nextElementSibling","bottom","offsetHeight","findIndex","x","clientHeight","prevEl","nextEl","handleInput","handleInputBlur","shouldPreventValidation","preventValidation","isRelatedTarget","tpWrapper","renderOptions","map","index","h","role","onClick","render","Host","invalid","onBlur","class","labelPosition","ref","t","htmlFor","onInput","disabled","placeholder","autocomplete","onFocus","onMouseDown","tabindex"],"sources":["src/components/wm-timepicker/wm-timepicker.scss?tag=wm-timepicker&encapsulation=shadow","src/components/wm-timepicker/wm-timepicker.tsx"],"sourcesContent":[":host,\nwm-timepicker {\n font-family: inherit;\n\n * {\n box-sizing: border-box;\n }\n\n .sr-only {\n @include srOnly;\n }\n\n @include label;\n\n .wrapper {\n .inner-wrapper {\n @include displayFlex();\n align-items: center;\n height: rem-calc(40);\n border: 1px solid $input-border-color;\n @include border-radius(3px);\n max-width: 236px; /* input is 200px or smaller, button is 36px */\n justify-content: space-between;\n position: relative;\n\n input {\n -moz-border-top-left-radius: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-bottom-left-radius: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px;\n border: none;\n font-size: rem-calc(14);\n padding: rem-calc(10 15 8);\n min-width: 0;\n height: 100%;\n flex: 1;\n margin: 0;\n font-family: inherit;\n\n &:disabled {\n background-color: $input-disabled-bg;\n color: $input-disabled-color;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n button {\n all: unset;\n cursor: pointer;\n padding: rem-calc(0px 6px);\n height: rem-calc(38);\n background-color: $button-default-background;\n border: none;\n -moz-border-top-right-radius: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px;\n -moz-border-bottom-right-radius: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px;\n\n // reset styles inherited from Planning in browsers without shadow DOM\n -moz-border-top-left-radius: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-bottom-left-radius: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0;\n @include box-shadow(none);\n\n .clock::after {\n @include mdi-icon;\n content: \"\\f150\";\n color: $button-default-text;\n font-size: rem-calc(24);\n padding: 0;\n line-height: rem-calc(40);\n }\n\n &:hover {\n background: mix(black, $button-default-background, 10%);\n @include box-shadow(none);\n }\n\n &:disabled {\n background-color: rgba(74, 74, 74, 0.05);\n pointer-events: none;\n @include box-shadow(none);\n .clock::after {\n color: #7b7b7b;\n }\n }\n\n [dir=\"RTL\"] & {\n right: auto;\n left: 0;\n }\n\n &:focus {\n outline: none;\n }\n\n &.user-is-tabbing:focus {\n @include focus-style;\n }\n\n &::-moz-focus-inner {\n border: 0;\n }\n }\n\n .options {\n margin: 0;\n padding: 0;\n -webkit-overflow-scrolling: touch;\n overflow: auto;\n // value can be passed in to the component and overwrite the following\n max-height: rem-calc(305);\n @include box-shadow(0 4px 15px 0 rgba(0, 0, 0, 0.2));\n @include transition(transform 0.25s ease);\n @include scale($xVal: 1, $yVal: 0);\n @include transformOrigin(center top);\n @include border-radius(3px);\n position: absolute;\n top: 2.5rem;\n right: 0;\n background: #fff;\n z-index: 100;\n width: 100%;\n font-size: rem-calc(14);\n\n &.upwards {\n top: unset;\n bottom: 2.5rem;\n @include transformOrigin(center bottom);\n }\n\n &.hidden {\n visibility: hidden;\n }\n\n [role=\"option\"] {\n display: block;\n cursor: pointer;\n position: relative;\n padding: rem-calc(20);\n background: #fff;\n font-family: inherit;\n list-style: none;\n color: $body-text-color;\n\n &:hover {\n background: $background;\n outline: none;\n }\n\n &:focus {\n outline: none;\n background: $background;\n }\n\n &:not(:last-child) {\n border-bottom: 2px solid rgba(#2e1b46, 0.05);\n }\n }\n }\n\n .options.open {\n @include scale($xVal: 1, $yVal: 1);\n }\n }\n\n &.invalid {\n .inner-wrapper {\n @include invalid;\n }\n\n .error {\n color: $firetruck;\n margin-top: 4px;\n margin-bottom: 4px;\n display: block;\n top: 100%;\n left: 0;\n font-style: italic;\n }\n }\n\n &:focus,\n &.focus {\n .inner-wrapper {\n @include field-focus;\n }\n }\n }\n}\n","import { h, Component, Host, Element, Prop, Watch, State, Listen, Event, EventEmitter } from \"@stencil/core\";\nimport { intl, generateId, shouldOpenUp, isRelatedTarget } from \"../../global/functions\";\n\n@Component({\n tag: \"wm-timepicker\",\n styleUrl: \"wm-timepicker.scss\",\n shadow: { delegatesFocus: true },\n})\nexport class Timepicker {\n @Element() el!: HTMLWmTimepickerElement;\n private inputEl!: HTMLInputElement;\n private optionsEl!: HTMLUListElement;\n private tpWrapper!: HTMLDivElement;\n private buttonEl!: HTMLButtonElement;\n private optionsList!: HTMLLIElement[];\n\n @Prop() disabled: boolean = false;\n @Prop({ reflect: true, mutable: true }) value: string = \"\";\n @Prop() errorMessage?: string | null;\n @Prop() label: string = \"\";\n @Prop() labelPosition: \"top\" | \"left\" | \"none\" = \"top\";\n @Prop() requiredField: boolean = false;\n @Prop() requiredFieldMessage?: string;\n @Prop() preventValidation?: string; // id or series of ids, validation will not occur when clicking an element with this id\n @State() selectedOption!: HTMLLIElement;\n @State() isExpanded: boolean = false;\n @State() isTabbing: boolean = false;\n @Event() wmTimepickerNewValidValue!: EventEmitter<{ value: string }>;\n @Event() wmTimepickerOnChange!: EventEmitter<{\n // deprecated in favor of wmTimepickerNewValidValue and standard input event\n value: string;\n isValid: boolean;\n }>;\n private twelveHrValid = /^(0?[0-9]|1[0-2])\\s*:?\\s*([0-5][0-9])?\\s?(a|p|am|pm)?$/i;\n private twentyFourHrValid = /^(0?[0-9]|1[0-9]|2[0-4])\\s*:?\\s*([0-5][0-9])?$/;\n private uid: string = \"\";\n private timeFormat: string = \"hh:mm\";\n private times: string[] = [];\n private openUp: boolean = false;\n private buttonAriaLabel: string = intl.formatMessage({\n id: \"time.selectTime\",\n defaultMessage: \"Select time\",\n description: \"Button text for screen readers.\",\n });\n @State() displayedErrorMessage?: string | null;\n\n @Listen(\"wmUserIsTabbing\", { target: \"window\" })\n toggleTabbingOn() {\n this.isTabbing = true;\n }\n\n @Listen(\"wmUserIsNotTabbing\", { target: \"window\" })\n toggleTabbingOff() {\n this.isTabbing = false;\n }\n\n @Listen(\"keydown\")\n handleKey(ev: KeyboardEvent): void {\n switch (ev.key) {\n case \"ArrowDown\":\n ev.preventDefault();\n if (this.isExpanded === false) {\n this.open(\"next\");\n } else {\n this.moveDown(this.selectedOption);\n }\n break;\n case \"ArrowUp\":\n ev.preventDefault();\n if (this.isExpanded === false) {\n this.open(\"previous\");\n } else {\n this.moveUp(this.selectedOption);\n }\n break;\n case \"Enter\":\n case \" \":\n if (this.isExpanded) {\n ev.preventDefault();\n this.handleOptionClick(this.selectedOption.textContent!);\n }\n break;\n case \"Escape\":\n ev.preventDefault();\n if (this.isExpanded) {\n ev.stopPropagation(); // for instance if select is in a modal, esc should close the select but not the modal\n this.close();\n }\n break;\n case \"Tab\":\n if (this.isExpanded) {\n this.close(false);\n }\n break;\n case \"Home\":\n ev.preventDefault();\n if (this.isExpanded) {\n this.focusOption(this.optionsList[0]);\n this.setDropdownPosition(\"first\");\n }\n break;\n case \"End\":\n ev.preventDefault();\n if (this.isExpanded) {\n this.focusOption(this.optionsList[this.optionsList.length - 1]);\n this.setDropdownPosition(\"last\");\n }\n break;\n }\n }\n\n @Watch(\"errorMessage\")\n updateErrorState() {\n this.displayedErrorMessage = this.errorMessage;\n }\n\n componentWillLoad() {\n if (this.label === \"\") {\n console.error(\n \"You must include a label prop for the timepicker (for accessibility reasons), even if the label position is none.\"\n );\n }\n\n this.uid = this.el.id ? this.el.id : generateId();\n this.updateErrorState();\n this.timeFormat = intl.formatMessage({\n id: \"time.timeFormat\",\n defaultMessage: \"hh:mm\",\n });\n\n this.times = this.generateTimes();\n }\n\n componentDidLoad() {\n this.optionsEl.classList.add(\"hidden\");\n this.optionsList = Array.from(this.optionsEl.querySelectorAll(\"li\"));\n\n if (this.value) {\n this.processInput();\n }\n }\n\n isValidTime(input: string) {\n return this.twelveHrValid.test(input) || this.twentyFourHrValid.test(input);\n }\n\n generateTimes() {\n let times = [];\n let startTime = 0;\n\n for (let i = 0; startTime < 24 * 60; i++) {\n const h = Math.floor(startTime / 60);\n const hour = h.toString().padStart(2, \"0\");\n const m = (startTime % 60).toString();\n const min = m.padStart(2, \"0\");\n times[i] = `${hour}:${min}`;\n startTime = startTime + 15;\n }\n\n return times;\n }\n\n findNearestTimeInterval(time: string) {\n let formattedTime = this.formatToStorage(time);\n const minutes = parseInt(formattedTime.slice(3, 5));\n\n // first find the closest 15 min increment\n if (minutes % 15 !== 0) {\n const hour = parseInt(formattedTime.slice(0, 2));\n let roundedMinutes = (Math.round(minutes / 15) * 15).toString().padStart(2, \"0\");\n if (roundedMinutes === \"60\") {\n roundedMinutes = \"00\";\n let roundedHour = hour + 1;\n if (roundedHour === 24) {\n roundedHour = 0;\n }\n formattedTime = formattedTime.replace(\n `${hour.toString().padStart(2, \"0\")}:`,\n `${roundedHour.toString().padStart(2, \"0\")}:`\n );\n }\n if (parseInt(roundedMinutes) < 8) {\n roundedMinutes = \"00\";\n }\n time = formattedTime.replace(`:${minutes.toString().padStart(2, \"0\")}`, `:${roundedMinutes}`);\n }\n\n return time;\n }\n\n handleListSelection(time: string) {\n time = this.findNearestTimeInterval(time);\n\n const option = this.optionsList.filter((o) => o.textContent == this.formatToDisplay(time))[0];\n option && this.focusOption(option);\n }\n\n setValue(time: string) {\n const previousValue = this.value;\n this.inputEl.value = this.formatToDisplay(time);\n this.value = this.formatToStorage(time);\n // update the selection in the list\n // so it opens on the closest item\n this.handleListSelection(time);\n\n if (previousValue !== this.value) {\n this.wmTimepickerNewValidValue.emit({ value: this.value });\n }\n // deprecated in favor of wmTimepickerNewValidValue and input\n this.wmTimepickerOnChange.emit({\n value: this.value,\n isValid: !!this.displayedErrorMessage,\n });\n }\n\n processInput() {\n if (this.isValidTime(this.value)) {\n this.setValue(this.value);\n }\n const newErrorMessage = this.determineErrorMessage();\n this.displayedErrorMessage = newErrorMessage;\n }\n\n determineErrorMessage(): string | undefined | null {\n let message: string | undefined | null = this.errorMessage;\n const requiredError =\n this.requiredFieldMessage ||\n intl.formatMessage({\n id: \"time.requiredError\",\n defaultMessage: \"A time is required.\",\n });\n const invalidError = intl.formatMessage({\n id: \"time.invalidTime\",\n defaultMessage: \"Please enter a valid time.\",\n });\n const isValid = this.isValidTime(this.value);\n\n if (isValid && !this.errorMessage) {\n message = null;\n } else if (!isValid && !this.errorMessage) {\n if (this.requiredField && !this.value) {\n message = requiredError;\n } else if (this.value) {\n message = invalidError;\n } else {\n message = null;\n }\n }\n\n return message;\n }\n\n splitTime(time: string): [number, string, string?] {\n const splitTime = this.twelveHrValid.exec(time) || this.twentyFourHrValid.exec(time);\n let hours = parseInt(splitTime![1]);\n let minutes = splitTime![2] || \"00\";\n let amPm = splitTime ? splitTime[3] : undefined;\n\n // handles edge case uncaught by regex '0pm'\n if (hours === 0 && amPm?.toUpperCase().includes(\"P\")) {\n // if user types '0pm' we change it to midnight\n amPm = \"AM\";\n }\n return [hours, minutes, amPm];\n }\n\n formatToDisplay(time: string) {\n let [hours, minutes, amPm] = this.splitTime(time);\n // at the moment the component only displays in 12hr AM/PM\n if (hours === 12 && !amPm) {\n amPm = \"PM\";\n }\n if (hours === 0 || hours === 24) {\n hours = 12;\n }\n if (hours > 12) {\n hours -= 12;\n amPm = \"PM\";\n }\n if (amPm && amPm.toUpperCase().includes(\"P\")) {\n amPm = \"PM\";\n } else {\n amPm = \"AM\";\n }\n\n return `${hours.toString().padStart(2, \"0\")}:${minutes} ${amPm}`;\n }\n\n formatToStorage(time: string) {\n let [hours, minutes, amPm] = this.splitTime(time);\n if (hours === 24) {\n hours = 0;\n }\n if (hours === 12 && amPm && amPm.toUpperCase().includes(\"A\")) {\n hours -= 12;\n }\n if (amPm && amPm.toUpperCase().includes(\"P\") && hours !== 12) {\n hours += 12;\n }\n return `${hours.toString().padStart(2, \"0\")}:${minutes}`;\n }\n\n open(itemToSelect?: \"next\" | \"previous\") {\n this.openUp = shouldOpenUp(this.el, this.optionsEl);\n this.isExpanded = true;\n this.optionsEl.classList.remove(\"hidden\");\n\n if (this.errorMessage || !this.value) {\n this.handleListSelection(\"09:00\");\n }\n this.setDropdownPosition(\"center\", this.selectedOption);\n this.focusOption(this.selectedOption);\n\n window.requestAnimationFrame(() => {\n if (itemToSelect === \"next\") {\n this.moveDown(this.selectedOption);\n } else if (itemToSelect === \"previous\") {\n this.moveUp(this.selectedOption);\n }\n });\n }\n\n close(returnFocus: boolean = true) {\n this.isExpanded = false;\n\n window.setTimeout(() => {\n this.optionsEl.classList.add(\"hidden\");\n // Returns focus to button after popup closes (no need if user is tabbing)\n // Delay is necessary for screenreader to get new expanded state before focus\n // window.requestAnimationFrame is probably enough, but since we are already using setTimeout it may as well be here\n // also UX wise, it makes sense for the button to only be focused after the animation is complete\n if (returnFocus) {\n this.buttonEl.focus();\n }\n }, 150);\n }\n\n focusOption(item: HTMLLIElement): void {\n this.optionsList.forEach((option) => {\n option.tabIndex = -1;\n });\n\n item.tabIndex = 0;\n this.selectedOption = item;\n item.focus();\n }\n\n setDropdownPosition(position: string, item?: HTMLLIElement) {\n switch (position) {\n case \"top\":\n const prevItem = item?.previousElementSibling as HTMLLIElement;\n this.optionsEl.scrollTop =\n prevItem.getBoundingClientRect().top - this.optionsEl.getBoundingClientRect().top + this.optionsEl.scrollTop;\n break;\n case \"bottom\":\n const nextItem = item?.nextElementSibling as HTMLLIElement;\n this.optionsEl.scrollTop =\n nextItem.getBoundingClientRect().bottom -\n this.optionsEl.getBoundingClientRect().top +\n this.optionsEl.scrollTop -\n this.optionsEl.offsetHeight;\n break;\n case \"center\":\n this.optionsEl.scrollTop =\n (this.optionsList.findIndex((x) => x.textContent === item?.textContent) - 2) * item!.offsetHeight;\n break;\n case \"first\":\n this.optionsEl.scrollTop = 0;\n break;\n case \"last\":\n this.optionsEl.scrollTop = this.optionsList[0].clientHeight * this.optionsList.length;\n break;\n }\n }\n\n moveUp(el: HTMLLIElement) {\n const prevEl = el.previousElementSibling as HTMLLIElement;\n if (prevEl) {\n // scroll option to top of dropdown if partially obscured / out of view\n if (prevEl.getBoundingClientRect().top < this.optionsEl.getBoundingClientRect().top) {\n this.setDropdownPosition(\"top\", el);\n }\n this.focusOption(prevEl);\n } else {\n this.focusOption(this.optionsList[this.optionsList.length - 1]);\n this.setDropdownPosition(\"last\");\n }\n }\n\n moveDown(el: HTMLLIElement) {\n const nextEl = el.nextElementSibling as HTMLLIElement;\n if (nextEl) {\n // scroll option to bottom of dropdown if partially obscured / out of view\n if (nextEl.getBoundingClientRect().bottom > this.optionsEl.getBoundingClientRect().bottom) {\n this.setDropdownPosition(\"bottom\", el);\n }\n this.focusOption(nextEl);\n } else {\n this.focusOption(this.optionsList[0]);\n this.setDropdownPosition(\"first\");\n }\n }\n\n handleOptionClick(time: string) {\n this.close();\n this.setValue(time);\n this.processInput();\n }\n\n handleInput() {\n this.value = this.inputEl.value;\n if (this.isValidTime(this.value)) {\n this.handleListSelection(this.findNearestTimeInterval(this.value));\n this.setDropdownPosition(\"center\", this.selectedOption);\n }\n }\n\n handleInputBlur(ev: FocusEvent) {\n // do not validate if clicking to an element that should prevent validation (e.g. close button on modal)\n const shouldPreventValidation = this.preventValidation && isRelatedTarget(ev, this.preventValidation);\n if (!shouldPreventValidation) {\n this.processInput();\n }\n this.tpWrapper.classList.remove(\"focus\");\n }\n\n renderOptions() {\n return this.times.map((time, index) => (\n <li id={`option${index + 1}`} role=\"option\" onClick={() => this.handleOptionClick(time)}>\n {this.formatToDisplay(time)}\n </li>\n ));\n }\n\n render() {\n return (\n <Host id={this.uid} invalid={!!this.displayedErrorMessage ? \"true\" : null} onBlur={() => this.close(false)}>\n <div\n class={`wrapper label-${this.labelPosition} ${!!this.displayedErrorMessage ? \"invalid\" : \"\"}`}\n ref={(t) => (this.tpWrapper = t as HTMLDivElement)}\n >\n <div class=\"label-wrapper\">\n {this.labelPosition !== \"none\" && (\n <label id={`label-${this.uid}`} class=\"label\" htmlFor={`time-input-${this.uid}`}>\n {this.label}\n {this.requiredField && (\n <span class=\"required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n </div>\n <div>\n <div class=\"inner-wrapper\">\n <input\n id={`time-input-${this.uid}`}\n aria-label={this.label}\n aria-describedby={`error-${this.uid}`}\n ref={(el) => (this.inputEl = el as HTMLInputElement)}\n onBlur={(ev) => this.handleInputBlur(ev)}\n onInput={() => this.handleInput()}\n disabled={this.disabled}\n aria-required={this.requiredField ? \"true\" : null}\n placeholder={this.timeFormat}\n autocomplete=\"off\"\n onFocus={() => this.tpWrapper.classList.add(\"focus\")}\n />\n <button\n id={`btn-${this.uid}`}\n class={this.isTabbing ? \"user-is-tabbing\" : \"\"}\n ref={(el) => (this.buttonEl = el as HTMLButtonElement)}\n disabled={this.disabled}\n aria-controls={`list-${this.uid}`}\n aria-expanded={this.isExpanded ? \"true\" : \"false\"}\n aria-label={this.buttonAriaLabel}\n aria-describedby={`time-input-${this.uid}`}\n onClick={() => (this.isExpanded ? this.close() : this.open())}\n // This addresses an issue in Safari, where clicking buttons does not focus them\n // if the button does not receive focus when clicked, Timepicker incorrectly emits a blur event\n onMouseDown={(ev) => {\n ev.preventDefault();\n this.buttonEl.focus();\n }}\n >\n <span class=\"clock\" />\n </button>\n <ul\n class={`options ${this.isExpanded ? \"open\" : \"\"} ${this.openUp ? \"upwards\" : \"\"}`}\n id={`list-${this.uid}`}\n role=\"listbox\"\n aria-labelledby={`label-${this.uid}`}\n aria-describedby={this.isExpanded ? \"collapsed\" : null} //For screenreader, to announce state when expanded\n tabindex={-1}\n ref={(el) => (this.optionsEl = el as HTMLUListElement)}\n >\n {this.renderOptions()}\n </ul>\n </div>\n <div id={`error-${this.uid}`} class=\"error\" aria-live=\"assertive\" aria-atomic=\"true\">\n {this.displayedErrorMessage}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmSnackbarCss","Snackbar","exports","this","parsedNotifications","isTabbing","timers","newNotification","newWindowMessage","intl","formatMessage","id","defaultMessage","class_1","prototype","updateSnacks","newValue","_this","parsedData","JSON","parse","length","prevNotificationsLength","i","toString","message","link","newWindow","__spreadArray","newTimer","window","setTimeout","snackExpired","storeElToFocusOnDismiss","componentWillLoad","uid","el","generateId","componentDidUpdate","focusLinkAndDisableTimer","checkForTabbing","ev","key","toggleTabbingOn","handleMouse","toggleTabbingOff","latestNotification","shadowRoot","querySelector","concat","focus","stopTimer","snackbarEl","classList","add","remove","triggeringButton","document","activeElement","focusOnDismiss","snackDismissed","notification","endSnack","wmSnackbarSnackFinished","emit","userFinishedSnack","snackLinkClicked","wmSnackbarActionTriggered","userTriggeredAction","forEach","notif","index","clearTimeout","filter","timer","ind","renderSnackbars","map","h","class","tabindex","onFocus","onClick","onKeyDown","renderLiveRegion","srAnnouncement","region","innerHTML","wrapper","createElement","appendChild","render","snackbars","wrappingClass","ref"],"sources":["src/components/wm-snackbar/wm-snackbar.scss?tag=wm-snackbar&encapsulation=shadow","src/components/wm-snackbar/wm-snackbar.tsx"],"sourcesContent":[":host,\nwm-snackbar {\n * {\n box-sizing: border-box;\n margin: unset; //Edge\n }\n\n .wm-snackbars {\n position: fixed;\n bottom: rem-calc(0);\n left: rem-calc(20);\n right: rem-calc(20);\n padding: rem-calc(4 10 30);\n z-index: 2001;\n max-width: rem-calc(568);\n max-height: rem-calc(280);\n -webkit-overflow-scrolling: touch;\n overflow: auto;\n\n &.empty {\n @include transition(all 0.25s 0ms cubic-bezier(0.4, 0, 1, 1));\n padding-top: 0;\n padding-bottom: 0;\n }\n\n .wm-snack-wrapper {\n width: 100%;\n height: 100%;\n\n &:not(:last-child) {\n margin-bottom: rem-calc(20);\n }\n\n .wm-snackbar {\n @include shadow8;\n @include displayFlex;\n @include alignItems(center);\n @include transition(all 0.25s 0ms cubic-bezier(0.4, 0, 1, 1));\n font-size: rem-calc(14);\n color: #fff;\n padding: rem-calc(15 30);\n background: #4a4a4a;\n opacity: 0;\n left: 0;\n position: relative;\n font-family: inherit;\n\n .link {\n letter-spacing: 0;\n text-transform: none;\n font-size: rem-calc(14);\n border: none;\n background: transparent;\n padding-left: 0;\n padding-right: 0;\n height: auto;\n border-radius: 0;\n line-height: 1;\n color: $snackbar-link-color;\n margin: rem-calc(0 50 0 10);\n text-decoration: none;\n font-weight: 600;\n cursor: pointer;\n\n &.new-window::after {\n @include mdi-icon;\n display: inline;\n content: \"\\f137\";\n margin-left: rem-calc(4);\n }\n\n &:hover {\n text-decoration: underline;\n }\n\n &:focus {\n outline: none;\n border: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n outline: none;\n }\n }\n\n &:not(:last-child) {\n margin-bottom: rem-calc(20);\n }\n\n &.active:not(button) {\n opacity: 1;\n }\n\n .wm-snackbarmsg {\n @include displayFlex;\n @include justifyContent(space-between);\n @include alignItems(center);\n // font-size: rem-calc(14);\n width: 100%;\n position: relative;\n padding: 0;\n\n .msgtext {\n width: 100%;\n }\n\n .closesnack {\n @include box-shadow(none);\n @include border-radius(50%);\n background-color: #3b3b3b;\n color: #ffffff;\n cursor: pointer;\n border: none;\n font-size: rem-calc(16);\n padding: 0;\n height: auto;\n line-height: 1;\n min-width: rem-calc(44);\n min-height: rem-calc(44);\n text-align: center;\n letter-spacing: normal;\n\n @media screen and (min-width: rem-calc(768)) {\n min-width: rem-calc(30);\n min-height: rem-calc(30);\n }\n\n &:before {\n @include mdi-icon;\n content: \"\\f156\";\n }\n\n &:hover {\n background-color: #fff;\n color: $snackbar-color;\n }\n\n &:focus {\n outline: none;\n }\n\n &::-moz-focus-inner {\n border: 0;\n outline: none;\n }\n\n &:active {\n @include scale($xVal: 0.9, $yVal: 0.9);\n }\n\n > .tooltip {\n position: absolute;\n opacity: 0;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n font-size: rem-calc(14);\n text-transform: none;\n font-weight: normal;\n background: black;\n color: #fff;\n padding: 0;\n line-height: normal;\n z-index: 30;\n }\n\n &:hover > .tooltip,\n &.user-is-tabbing:focus > .tooltip {\n clip: auto;\n width: auto;\n height: auto;\n opacity: 1;\n transition: opacity 500ms 500ms;\n padding: rem-calc(6);\n top: rem-calc(44);\n left: rem-calc(44);\n white-space: nowrap;\n transform: translateX(-50%);\n @media screen and (min-width: rem-calc(768)) {\n top: rem-calc(33);\n left: auto;\n }\n }\n }\n }\n\n .sr-only {\n @include srOnly;\n top: 0;\n left: 0;\n }\n }\n }\n }\n .sr-only {\n @include srOnly;\n top: 0;\n left: 0;\n }\n}\n.user-is-tabbing .wm-snack-wrapper .wm-snackbar .wm-snackbarmsg .closesnack:focus:not(:active) {\n @extend %focus-on-dark;\n\n > .tooltip {\n clip: auto;\n width: auto;\n height: auto;\n opacity: 1;\n transition: opacity 500ms 500ms;\n padding: rem-calc(6);\n top: rem-calc(44);\n left: rem-calc(44);\n white-space: nowrap;\n transform: translateX(-50%);\n @media screen and (min-width: rem-calc(768)) {\n top: rem-calc(33);\n left: auto;\n }\n }\n}\n\n.user-is-tabbing .wm-snack-wrapper .wm-snackbar .wm-snackbarmsg .link:focus:not(:active) {\n outline: none;\n background: linear-gradient(90deg, $snackbar-link-color 66%, transparent 0) repeat-x;\n background-size: rem-calc(6px 3px);\n background-position: 0 1em;\n border-radius: 0;\n line-height: normal;\n}\n","import { h, Component, Element, Prop, Event, EventEmitter, Watch, Listen } from \"@stencil/core\";\nimport { generateId, intl } from \"../../global/functions\";\nimport { Notification } from \"../../global/interfaces\";\n@Component({\n tag: \"wm-snackbar\",\n styleUrl: \"wm-snackbar.scss\",\n shadow: true,\n})\nexport class Snackbar {\n @Element() el!: HTMLElement;\n //Prop receives notifications as JSON string, which is later parsed into an array of objects.\n @Prop({ mutable: true, reflect: true }) notifications: string = \"[]\";\n\n private parsedNotifications: Array<Notification> = []; //Holds the parsed array\n private uid!: string;\n private focusOnDismiss!: HTMLElement;\n private isTabbing: boolean = false; //For screenreader purposes, to ensure link receives focus even after screenreader interprets \"enter\" as a \"click\"\n private timers: Array<number> = [];\n private newNotification: boolean = false;\n private snackbarEl!: HTMLDivElement;\n private newWindowMessage = intl.formatMessage({\n id: \"global.newWindowLink\",\n defaultMessage: \"Opens in a new window.\",\n });\n\n @Event() wmSnackbarSnackFinished!: EventEmitter<Object>;\n @Event() userFinishedSnack!: EventEmitter<Object>; // deprecated in favor of wmSnackbarSnackFinished\n @Event() wmSnackbarActionTriggered!: EventEmitter<Object>;\n @Event() userTriggeredAction!: EventEmitter<Object>; // deprecated in favor of wmSnackbarActionTriggered\n\n @Watch(\"notifications\")\n updateSnacks(newValue: string) {\n const parsedData = JSON.parse(newValue);\n const length = parsedData.length;\n const prevNotificationsLength = this.parsedNotifications.length;\n this.parsedNotifications = [];\n\n //Parse notifications received as props and store a reference to them\n for (let i = 0; i < length; i++) {\n let newNotification: any = {\n id: parsedData[i].id.toString(),\n message: parsedData[i].message.toString(),\n link: parsedData[i].link.toString(),\n newWindow: !!parsedData[i].newWindow,\n };\n this.parsedNotifications = [...this.parsedNotifications, newNotification];\n }\n\n //If a new notification was added, set a timer and store a reference to the current active element so that if focus must move to the notification, it can return the user where they were once they dismiss the notification.\n if (prevNotificationsLength < this.parsedNotifications.length) {\n const newTimer = window.setTimeout(() => this.snackExpired(), 20000);\n this.timers = [newTimer, ...this.timers];\n this.storeElToFocusOnDismiss();\n this.newNotification = true;\n } else {\n this.newNotification = false;\n }\n }\n\n componentWillLoad() {\n this.uid = this.el.id ? this.el.id : generateId();\n }\n\n //A change in the notificaiton prop will trigger the update function. The update's only role is to determine how focus should be managed when a notification is added.\n componentDidUpdate() {\n //If the user is tabbing and there's a new notification, focus the link and disable timer.\n this.isTabbing && this.newNotification && this.focusLinkAndDisableTimer();\n this.newNotification = false;\n }\n\n @Listen(\"keydown\", { target: \"document\" })\n checkForTabbing(ev: KeyboardEvent) {\n if (ev.key === \"Tab\") {\n this.toggleTabbingOn();\n }\n }\n\n //Workaround for screenreader's triggering click event on \"enter\".\n @Listen(\"mouseover\", { target: \"document\" })\n handleMouse() {\n this.toggleTabbingOff();\n }\n\n focusLinkAndDisableTimer() {\n //If the new notification has a link, focus the link and clear the timeout. This is for accessibility purposes, for keyboard/screenreader users.\n const latestNotification = this.parsedNotifications[0];\n\n if (latestNotification.link) {\n let link = this.el.shadowRoot!.querySelector(`#action-${latestNotification.id}`) as HTMLAnchorElement;\n link.focus();\n this.stopTimer(latestNotification);\n }\n }\n\n toggleTabbingOn() {\n this.isTabbing = true;\n this.snackbarEl && this.snackbarEl.classList.add(\"user-is-tabbing\");\n }\n\n toggleTabbingOff() {\n this.isTabbing = false;\n this.snackbarEl && this.snackbarEl.classList.remove(\"user-is-tabbing\");\n }\n\n storeElToFocusOnDismiss() {\n let triggeringButton = document.activeElement! as HTMLElement;\n while (triggeringButton && triggeringButton.shadowRoot) {\n triggeringButton = triggeringButton.shadowRoot.activeElement as HTMLButtonElement;\n }\n this.focusOnDismiss = triggeringButton;\n }\n\n snackDismissed(notification: Notification) {\n this.endSnack(notification);\n //Focus should only be returned if it was moved in the first place, i.e., there was a link and the user was tabbing. Otherwise, for a mouse user, the user's focus would jump back to the triggering element.\n notification.link && this.isTabbing && this.focusOnDismiss.focus();\n }\n\n //Remove snack from notification list once timer runs out\n snackExpired() {\n const notification = this.parsedNotifications[this.parsedNotifications.length - 1];\n this.endSnack(notification);\n }\n\n endSnack(notification: Notification) {\n //App listens for userFinishedSnack event and deletes the emitted notification.\n this.stopTimer(notification);\n this.wmSnackbarSnackFinished.emit({\n id: notification.id,\n message: notification.message,\n link: notification.link,\n newWindow: notification.newWindow,\n });\n // deprecated\n this.userFinishedSnack.emit({\n id: notification.id,\n message: notification.message,\n link: notification.link,\n });\n }\n\n snackLinkClicked(notification: Notification) {\n //App listens for userTriggeredAction event, deletes emitted notification, and takes over focus.\n this.stopTimer(notification);\n this.wmSnackbarActionTriggered.emit({\n id: notification.id,\n message: notification.message,\n link: notification.link,\n newWindow: notification.newWindow,\n });\n // deprecated\n this.userTriggeredAction.emit({\n id: notification.id,\n message: notification.message,\n link: notification.link,\n });\n }\n\n //Delete the timer corresponding to the dismissed notification\n stopTimer(notification: Notification) {\n this.parsedNotifications.forEach((notif, index) => {\n if (notif.id === notification.id) {\n clearTimeout(this.timers[index]);\n this.timers = this.timers.filter((timer, ind) => {\n if (ind !== index) {\n return timer;\n }\n });\n }\n });\n }\n\n renderSnackbars() {\n return this.parsedNotifications.map((notification) => (\n <div class=\"wm-snack-wrapper\">\n <div id={`snack-${this.uid}`} class=\"wm-snackbar active neutral\">\n <div\n class=\"sr-only\"\n tabindex={notification.link ? 0 : -1}\n onFocus={() => notification.link && this.snackDismissed(notification)}\n />\n\n <div class=\"wm-snackbarmsg\">\n <div class=\"msgtext\">\n <span>{notification.message}</span>\n {notification.link && (\n <a\n id={`action-${notification.id}`}\n class={`link ${notification.newWindow ? \"new-window\" : \"\"}`}\n aria-label={`Click to ${notification.link}...${\n notification.newWindow ? \" \" + this.newWindowMessage : \"\"\n }`}\n tabindex={0}\n onClick={() => {\n this.snackLinkClicked(notification);\n }}\n onKeyDown={(ev: KeyboardEvent) => ev.key === \"Enter\" && this.snackLinkClicked(notification)}\n >\n <span aria-hidden=\"true\">{notification.link}</span>\n </a>\n )}\n </div>\n <button\n id={`close-button-${notification.id}`}\n aria-label=\"Close this notification\"\n class=\"closesnack\"\n tabindex={notification.link ? 0 : -1}\n onClick={() => this.snackDismissed(notification)}\n >\n <span class=\"tooltip\" aria-hidden=\"true\">\n Close\n </span>\n </button>\n </div>\n <div\n class=\"sr-only\"\n tabindex={notification.link ? 0 : -1}\n onFocus={() => notification.link && this.snackDismissed(notification)}\n />\n </div>\n </div>\n ));\n }\n\n renderLiveRegion() {\n const latestNotification = this.parsedNotifications[0];\n const link = this.isTabbing ? \"\" : latestNotification.link;\n const srAnnouncement = `${latestNotification.message} ${link}`;\n\n const region = this.el.shadowRoot!.querySelector(`#wm-live-region-${this.uid}`) as HTMLElement;\n\n if (region) {\n region.innerHTML = \"\";\n const wrapper = document.createElement(\"span\");\n wrapper.innerHTML = srAnnouncement;\n region.appendChild(wrapper);\n }\n }\n\n render() {\n this.newNotification && this.renderLiveRegion();\n const snackbars = this.renderSnackbars();\n const wrappingClass = this.parsedNotifications.length === 0 ? \"empty\" : \"\";\n\n return (\n <div ref={(el) => (this.snackbarEl = el as HTMLDivElement)} class={`wm-snackbars ${wrappingClass}`}>\n <div class=\"sr-only\" aria-live=\"polite\" aria-atomic=\"false\" id={`wm-live-region-${this.uid}`}></div>\n {snackbars}\n </div>\n );\n }\n}\n"],"mappings":"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"}