@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":["wmDatepickerCss","DatePicker","this","lastCommittedValue","value","parsableEntry","isoEntry","eightDigitsEntry","dateFormats","US","intl","formatMessage","id","defaultMessage","INT","ISO","handleTabbingOn","dpWrapper","classList","add","handleTabbingOff","remove","handleError","errorMessage","generateError","clearError","processInput","handleInput","ev","target","handleBlur","shouldPreventValidation","preventValidation","isRelatedTarget","focusHandler","handlePopupBlurred","detail","relatedTarget","el","event","CustomEvent","dispatchEvent","getActiveElement","checkForFocusableElInShadow","document","activeElement","handleCellTriggered","dateElement","isoDate","getAttribute","textContent","inputEl","reformatDate","dateFormat","isFirstLoad","leftEmpty","requiredField","test","addSlashes","isValidDate","length","lastValidValue","wmDatepickerNewValidValue","emit","toFormat","date","dateArr","replace","split","padStart","join","input","parts","day","parseInt","month","year","monthLength","requiredDateErr","requiredFieldMessage","validDateErr","toLowerCase","displayError","substring","componentWillLoad","label","console","error","uid","generateId","componentDidLoad","render","h","Host","class","invalid","ref","d","labelPosition","htmlFor","title","disabled","type","name","placeholder","onFocus","bind","onInput","onBlur","Date","parentId"],"sources":["./src/components/wm-datepicker/wm-datepicker.scss?tag=wm-datepicker&encapsulation=shadow","./src/components/wm-datepicker/wm-datepicker.tsx"],"sourcesContent":[":host,\nwm-datepicker {\n font-family: inherit;\n\n * {\n box-sizing: border-box;\n }\n\n @include label;\n\n .wrapper {\n position: relative;\n\n .required {\n color: $datepicker-required-input;\n }\n\n .inner-wrapper {\n @include displayFlex();\n align-items: center;\n height: rem-calc(40);\n border: 1px solid;\n border-color: $datepicker-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 .date-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\n &:disabled {\n background-color: $input-disabled-bg;\n color: $input-disabled-color;\n }\n\n &:focus {\n outline: none;\n }\n }\n }\n\n &.invalid {\n .inner-wrapper {\n @include invalid;\n }\n\n .error {\n margin-top: 4px;\n margin-bottom: 4px;\n display: block;\n top: 100%;\n left: 0;\n font-style: italic;\n font-size: rem-calc(14);\n color: $error-color;\n }\n }\n\n &.focus {\n .inner-wrapper {\n @include field-focus;\n }\n }\n }\n\n .user-is-tabbing {\n .toggle:focus {\n &:not(:active) {\n border: none;\n z-index: 11;\n }\n }\n }\n}\n","import { h, Component, Host, Element, Event, EventEmitter, Prop, Listen, Watch, State } from \"@stencil/core\";\nimport { generateId, checkForFocusableElInShadow, intl, isRelatedTarget } from \"../../global/functions\";\n\n@Component({\n tag: \"wm-datepicker\",\n styleUrl: \"wm-datepicker.scss\",\n shadow: { delegatesFocus: true },\n})\nexport class DatePicker {\n @Element() el!: HTMLWmDatepickerElement;\n private dpWrapper!: HTMLDivElement;\n private inputEl!: HTMLInputElement;\n\n @Prop({ mutable: true }) value?: string = \"\";\n @Prop() disabled: boolean = false;\n @Prop({ mutable: true }) dateFormat: string = \"US\";\n @Prop({ reflect: true }) errorMessage: string = \"\";\n @Prop({ mutable: true }) labelPosition: \"top\" | \"left\" | \"none\" = \"top\";\n @Prop({ mutable: true }) label: string = \"\";\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() displayError: string = \"\";\n @Event() wmDatepickerNewValidValue!: EventEmitter;\n\n // we only want to fire the \"change\" event if the value has actually changed (that's\n // how native elements do it), so we need to keep in state the last committed value.\n private lastCommittedValue?: string = this.value;\n private lastValidValue?: string;\n private uid!: string;\n\n // 1, 2, or 4 digits, separator, 1 or 2 digits, separator, then 1 or 2 or 4 digits\n private parsableEntry = /^(\\d{1}|\\d{2}|\\d{4})[\\-\\.\\/]\\d{1,2}[\\-\\.\\/](\\d{1}|\\d{2}|\\d{4})$/;\n private isoEntry = /^\\d\\d\\d\\d[-]\\d\\d[-]\\d\\d$/;\n private eightDigitsEntry = /^\\d{8}$/;\n\n dateFormats: any = {\n US: intl.formatMessage({\n id: \"date.formatUS\",\n defaultMessage: \"mm/dd/yyyy\",\n }),\n INT: intl.formatMessage({\n id: \"date.formatINT\",\n defaultMessage: \"dd/mm/yyyy\",\n }),\n ISO: intl.formatMessage({\n id: \"date.formatISO\",\n defaultMessage: \"yyyy/mm/dd\",\n }),\n };\n\n @Listen(\"keydown\")\n handleTabbingOn() {\n this.dpWrapper && this.dpWrapper.classList.add(\"user-is-tabbing\");\n }\n\n @Listen(\"click\")\n handleTabbingOff() {\n this.dpWrapper && this.dpWrapper.classList.remove(\"user-is-tabbing\");\n }\n\n @Watch(\"errorMessage\")\n handleError() {\n if (this.errorMessage) {\n this.generateError();\n } else {\n this.clearError();\n this.processInput();\n }\n }\n\n handleInput(ev: Event) {\n // keep component's value in sync with input's value\n // validation only happens on blur and initial load,\n // but component's value should reflect user input at any time\n this.value = (ev.target! as HTMLInputElement).value; // same as this.inputEl.value\n }\n\n // this is input blur, not component blur\n handleBlur(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.dpWrapper.classList.remove(\"focus\");\n }\n\n // this is input focus, not component focus\n focusHandler() {\n this.dpWrapper.classList.add(\"focus\");\n }\n\n @Listen(\"popupBlurred\")\n handlePopupBlurred(ev: CustomEvent) {\n // emit blur event when leaving component from priv-datepicker\n if (ev.detail.relatedTarget !== this.el) {\n const event = new CustomEvent(\"blur\");\n // @ts-ignore\n event.relatedTarget = ev.detail.relatedTarget;\n this.el.dispatchEvent(event);\n }\n }\n\n getActiveElement() {\n return checkForFocusableElInShadow(document.activeElement as HTMLElement);\n }\n\n @Listen(\"cellTriggered\")\n handleCellTriggered(ev: CustomEvent) {\n let dateElement = ev.detail as HTMLTableCellElement;\n let isoDate =\n dateElement.getAttribute(\"data-year\")! +\n \"-\" +\n dateElement.getAttribute(\"data-month\")! +\n \"-\" +\n dateElement.textContent!;\n this.inputEl.value = this.reformatDate(this.dateFormat, isoDate);\n this.processInput();\n\n // Create event to trigger onInput function on host element, to get the updated value\n // Because there are more ways to input than just typing, we are firing this event upon cellTriggered\n const event = new CustomEvent(\"input\");\n this.el.dispatchEvent(event);\n }\n\n processInput(isFirstLoad?: boolean) {\n // The required field error should not display on first load\n const leftEmpty = !isFirstLoad && this.requiredField;\n\n let isoDate = this.inputEl.value;\n\n //If input is 8 digits, add slashes as a courtesy and process anyway\n if (this.eightDigitsEntry.test(this.inputEl.value)) {\n this.inputEl.value = this.addSlashes(this.inputEl.value);\n }\n\n // if we don't have 2 separators we can't reformat so we'll return what was passed in\n if (this.parsableEntry.test(this.inputEl.value)) {\n //ISO format for submission\n isoDate = this.reformatDate(\"ISO\", this.inputEl.value);\n\n //User-specific format for display\n this.inputEl.value = this.reformatDate(this.dateFormat, isoDate);\n\n if (this.isValidDate(isoDate)) {\n //If there's no errorMessage on state, all errors can be cleared. If there IS an error message, it will clear any internal validation errors by overriding them.\n if (this.errorMessage) {\n this.generateError();\n } else {\n this.clearError();\n }\n //Prevents error from appearing if input field is empty\n } else if (this.inputEl.value.length) {\n this.generateError();\n }\n } else if (this.inputEl.value.length || leftEmpty || this.errorMessage) {\n this.generateError();\n } else if (!this.inputEl.value.length && !leftEmpty) {\n this.clearError();\n }\n\n if (isoDate !== this.lastCommittedValue) {\n // value is set to the reformated date or whatever the user passed\n this.value = isoDate;\n const event = new CustomEvent(\"change\");\n this.el.dispatchEvent(event);\n this.lastCommittedValue = this.value;\n }\n\n // event must fire after we set this.value\n // only fire if new valid value is different from the previous one\n if (this.isValidDate(isoDate) && isoDate !== this.lastValidValue) {\n this.wmDatepickerNewValidValue.emit();\n //Update prop passed into calendar to valid date\n this.lastValidValue = isoDate;\n }\n }\n\n // this function reformats date strings to/from the storage format ONLY. US -> INT and vice versa is not supported.\n reformatDate(toFormat: string, date?: string): string {\n if (!date) {\n return \"\";\n } else if (!this.parsableEntry.test(date)) {\n return date;\n } else {\n let dateArr = date.replace(/[\\-\\.]/gi, \"/\").split(\"/\");\n switch (toFormat) {\n case \"US\":\n case this.dateFormats[\"US\"]:\n return dateArr[1].padStart(2, \"0\") + \"/\" + dateArr[2].padStart(2, \"0\") + \"/\" + dateArr[0].padStart(4, \"20\");\n case \"INT\":\n case this.dateFormats[\"INT\"]:\n return dateArr[2].padStart(2, \"0\") + \"/\" + dateArr[1].padStart(2, \"0\") + \"/\" + dateArr[0].padStart(4, \"20\");\n case \"ISO\":\n case this.dateFormats[\"ISO\"]:\n if (this.dateFormat === \"US\" || this.dateFormat === this.dateFormats[\"US\"]) {\n return dateArr[2].padStart(4, \"20\") + \"-\" + dateArr[0].padStart(2, \"0\") + \"-\" + dateArr[1].padStart(2, \"0\");\n } else if (this.dateFormat === \"INT\" || this.dateFormat === this.dateFormats[\"INT\"]) {\n return dateArr[2].padStart(4, \"20\") + \"-\" + dateArr[1].padStart(2, \"0\") + \"-\" + dateArr[0].padStart(2, \"0\");\n } else if (this.dateFormat === \"ISO\" || this.dateFormat === this.dateFormats[\"ISO\"]) {\n return dateArr[0].padStart(4, \"20\") + \"-\" + dateArr[1].padStart(2, \"0\") + \"-\" + dateArr[2].padStart(2, \"0\");\n }\n default:\n return dateArr.join(\"/\");\n }\n }\n }\n\n isValidDate(input?: string) {\n // if it's not ISO it's not valid\n if (!input || !this.isoEntry.test(input)) {\n return false;\n } else {\n // Parse the ISO date parts to integers\n let parts = input.split(\"-\");\n let day = parseInt(parts[2], 10);\n let month = parseInt(parts[1], 10);\n let year = parseInt(parts[0], 10);\n // Check the ranges of month and year\n if (year < 1000 || year > 3000 || month == 0 || month > 12) return false;\n let monthLength = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n // Adjust for leap years\n if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) monthLength[1] = 29;\n // Check the range of the day\n return day > 0 && day <= monthLength[month - 1];\n }\n }\n\n generateError() {\n const requiredDateErr: string =\n this.requiredFieldMessage ||\n intl.formatMessage({\n id: \"date.requiredDateError\",\n defaultMessage: \"A date is required.\",\n });\n const validDateErr = intl.formatMessage(\n {\n id: \"date.invalidDate\",\n defaultMessage:\n \"Please enter a valid date in the format {dateFormat, select, us {mm/dd/yyyy} int {dd/mm/yyyy} other {yyyy/mm/dd}}.\",\n },\n { dateFormat: this.dateFormat.toLowerCase() }\n );\n if (this.errorMessage) {\n this.displayError = this.errorMessage;\n } else if (this.inputEl.value.length) {\n this.displayError = validDateErr;\n } else if (!this.inputEl.value.length && this.requiredField) {\n this.displayError = requiredDateErr;\n }\n }\n\n clearError() {\n this.displayError = \"\";\n }\n\n addSlashes(input: string) {\n if (this.dateFormat === \"ISO\" || this.dateFormat === this.dateFormats[\"ISO\"]) {\n return input.substring(0, 4) + \"/\" + input.substring(4, 6) + \"/\" + input.substring(6);\n } else {\n return input.substring(0, 2) + \"/\" + input.substring(2, 4) + \"/\" + input.substring(4);\n }\n }\n\n componentWillLoad() {\n if (this.label === \"\") {\n console.error(\n \"You must include a label prop for the datepicker input (for accessibility reasons), even if the label position is none.\"\n );\n }\n if (this.errorMessage) {\n this.generateError();\n }\n\n this.uid = this.el.id ? this.el.id : generateId();\n\n if (this.value && this.isValidDate(this.value)) {\n // update value passed into calendar so that it opens on the specified date\n this.lastValidValue = this.value;\n }\n }\n\n componentDidLoad() {\n // convert passed-in starting date from ISO to locale format, update displayed input to proper format\n this.inputEl.value = this.reformatDate(this.dateFormat, this.value);\n this.processInput(true);\n }\n\n render() {\n const dateFormat = intl.formatMessage(\n {\n id: \"date.format\",\n defaultMessage: \"{dateFormat, select, us {mm/dd/yyyy} int {dd/mm/yyyy} other {yyyy/mm/dd}}\",\n },\n { dateFormat: this.dateFormat.toLowerCase() }\n );\n return (\n <Host\n id={this.uid}\n aria-busy=\"false\"\n class={`${this.displayError ? \"invalid\" : \"\"}`}\n invalid={this.displayError ? \"true\" : null}\n >\n <div\n ref={(d) => (this.dpWrapper = d as HTMLDivElement)}\n class={`wrapper label-${this.labelPosition} ${this.displayError ? \"invalid\" : \"\"}`}\n >\n <div class=\"label-wrapper\">\n {this.labelPosition !== \"none\" && (\n <label\n id={`datepickerLabel-${this.uid}`}\n htmlFor={`date-input-${this.uid}`}\n class=\"label\"\n title={`${this.label} (${dateFormat})`}\n >\n {this.label}\n {this.requiredField && (\n <span aria-hidden=\"true\" class=\"required\">\n *\n </span>\n )}\n </label>\n )}\n </div>\n <div>\n <div class=\"inner-wrapper\">\n <input\n disabled={this.disabled}\n type=\"text\"\n id={`date-input-${this.uid}`}\n class=\"date-input\"\n name=\"date\"\n placeholder={dateFormat}\n onFocus={this.focusHandler.bind(this)}\n onInput={(ev) => this.handleInput(ev)}\n onBlur={(ev) => this.handleBlur(ev)}\n ref={(input) => (this.inputEl = input as HTMLInputElement)}\n aria-describedby={`error-${this.uid}`}\n aria-controls={`popup-${this.uid}`}\n aria-label={this.label}\n aria-required={this.requiredField ? \"true\" : null}\n />\n <priv-datepicker\n disabled={this.disabled}\n date={this.lastValidValue ? new Date(this.lastValidValue) : new Date()}\n parentId={this.uid}\n />\n </div>\n <div id={`error-${this.uid}`} class=\"error\" aria-live=\"assertive\" aria-atomic=\"true\">\n {this.displayError}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmActionMenuCss","ActionMenu","this","openUp","keysSoFar","searchIndex","keyClear","horizontalPosition","el","itemsEl","shouldShiftRight","childItems","Array","from","querySelectorAll","internalButtonType","tempActionMenuType","actionMenuType","buttonType","handleClickedItem","close","handleKeyUp","ev","moveUp","target","handleKeyDown","moveDown","detail","handleHomeKey","focusFirstItem","handleEndKey","focusLastItem","handleTabKey","isExpanded","handleEscKey","wmButtonEl","focus","handleKey","key","preventDefault","open","window","requestAnimationFrame","handleMenuitemBlur","toElOrChild","relatedTarget","contains","event","CustomEvent","dispatchEvent","handleButtonBlur","stopPropagation","componentWillLoad","uid","id","generateId","console","warn","componentDidLoad","buttonText","error","tooltip","wmActionMenuLoaded","emit","menuLoaded","index","indexOf","focusItem","length","disabled","shouldOpenUp","classList","remove","returnFocus","forEach","i","focused","setTimeout","add","document","activeElement","tagName","item","map","findAndFocusItem","character","toUpperCase","clearKeysSoFarAfterDelay","nextMatch","findMatchInRange","clearTimeout","bind","list","startIndex","endIndex","n","label","innerText","render","h","Host","onBlur","class","getTextDir","darkMode","undefined","labelForIdenticalButtons","icon","onClick","ref","tooltipPosition","tabindex","role","wmMenuitemCss","Menuitem","descriptionCharLimit","toggleKeyingOn","isKeying","toggleKeyingOff","handleKeydown","modifierKeyUsed","altKey","ctrlKey","metaKey","isSingleCharacter","test","isCharacterEntry","wmKeyUpPressed","wmKeyDownPressed","click","wmEscKeyPressed","wmHomeKeyPressed","wmEndKeyPressed","wmTabKeyPressed","wmLetterPressed","handleClick","wmMenuitemClicked","handleBlur","wmMenuitemBlurred","setOnClick","onclick","onClickFunc","getIconCodeFromName","description","iconEl","innerHTML"],"sources":["./src/components/wm-action-menu/wm-action-menu.scss?tag=wm-action-menu&encapsulation=shadow","./src/components/wm-action-menu/wm-action-menu.tsx","./src/components/wm-menuitem/wm-menuitem.scss?tag=wm-menuitem&encapsulation=shadow","./src/components/wm-menuitem/wm-menuitem.tsx"],"sourcesContent":[":host {\n position: relative;\n display: inline-block;\n width: -moz-fit-content;\n width: fit-content;\n color: #575195;\n font-family: inherit;\n\n .sr-only {\n @include srOnly;\n }\n}\n\n:host(:focus) {\n outline: none;\n}\n\nwm-action-menu:focus {\n outline: none;\n}\n\n.dropdown {\n position: absolute;\n padding: 0;\n margin: rem-calc(4) 0;\n border-radius: 3px 3px 3px 3px;\n min-width: rem-calc(183);\n @include scale($xVal: 1, $yVal: 0);\n @include transition(transform 0.25s ease);\n @include transformOrigin(center top);\n visibility: hidden;\n\n &:focus {\n outline: none;\n }\n\n @include box-shadow(0 3px 14px 3px rgba(5, 3, 3, 0.12), 0 4px 15px 0 rgba(0, 0, 0, 0.2));\n background: #fff;\n z-index: 10;\n text-align: left;\n\n &.open {\n @include scale($xVal: 1, $yVal: 1);\n visibility: visible;\n }\n\n &.open-up {\n bottom: 2.5rem;\n top: auto;\n @include transformOrigin(center bottom);\n }\n\n &.right {\n // anchoring to left corner means it opens on the right side\n left: 0;\n }\n\n &.left {\n right: 0;\n }\n\n white-space: nowrap;\n}\n","import { h, Component, Element, Listen, Prop, State, Event, EventEmitter, Host } from \"@stencil/core\";\nimport { generateId, getTextDir, shouldOpenUp, shouldShiftRight } from \"../../global/functions\";\n\n@Component({\n tag: \"wm-action-menu\",\n styleUrl: \"wm-action-menu.scss\",\n shadow: { delegatesFocus: true },\n})\nexport class ActionMenu {\n @Element() el!: HTMLWmActionMenuElement;\n private wmButtonEl!: HTMLWmButtonElement;\n private itemsEl?: HTMLDivElement;\n private uid!: string;\n private openUp: boolean = false;\n get horizontalPosition(): \"right\" | \"left\" {\n return !!this.el && !!this.itemsEl && shouldShiftRight(this.el, this.itemsEl!) ? \"right\" : \"left\";\n }\n get childItems(): HTMLWmMenuitemElement[] {\n return Array.from(this.el.querySelectorAll(\"wm-menuitem\"));\n }\n get internalButtonType(): string {\n return this.tempActionMenuType === \"icon\" || this.tempActionMenuType === \"text\"\n ? this.tempActionMenuType + \"only\"\n : this.tempActionMenuType;\n }\n\n @State() isExpanded = false;\n @Prop() tooltipPosition?:\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"top-right\"\n | \"top-left\";\n @Prop() actionMenuType: \"icon\" | \"text\" | \"selector\" | \"selector-primary\" | null = null;\n @Prop() buttonType: \"icon\" | \"text\" | \"selector\" | null = null; // deprecated in favor of actionMenuType\n get tempActionMenuType(): \"icon\" | \"text\" | \"selector\" | \"selector-primary\" {\n // uses of this getter should be replaced with this.actionMenuType when buttonType is fully phased out\n // don't forget to reset this.actionMenuTypes's default value to icon\n return this.actionMenuType || this.buttonType || \"icon\";\n }\n @Prop() buttonText?: string;\n @Prop({ reflect: true }) disabled: boolean = false;\n @Prop() tooltip?: string;\n @Prop() labelForIdenticalButtons?: string;\n @Prop() darkMode?: boolean;\n @Event({ composed: true, bubbles: true }) wmActionMenuLoaded!: EventEmitter;\n @Event({ composed: true, bubbles: true }) menuLoaded!: EventEmitter; // deprecated in favor of wmActionMenuLoaded\n\n private keysSoFar: string = \"\";\n private searchIndex: number = 0;\n private keyClear: number | null = null;\n\n @Listen(\"wmMenuitemClicked\")\n handleClickedItem() {\n this.close();\n }\n\n @Listen(\"wmKeyUpPressed\")\n handleKeyUp(ev: CustomEvent) {\n this.moveUp(ev.target as HTMLWmMenuitemElement);\n }\n\n @Listen(\"wmKeyDownPressed\")\n handleKeyDown(ev: CustomEvent) {\n this.moveDown(ev.detail);\n }\n\n @Listen(\"wmHomeKeyPressed\")\n handleHomeKey() {\n this.focusFirstItem();\n }\n\n @Listen(\"wmEndKeyPressed\")\n handleEndKey() {\n this.focusLastItem();\n }\n\n @Listen(\"wmTabKeyPressed\")\n handleTabKey() {\n if (this.isExpanded) {\n this.close();\n }\n }\n\n @Listen(\"wmEscKeyPressed\")\n handleEscKey() {\n this.close();\n this.wmButtonEl.focus();\n }\n\n @Listen(\"keydown\")\n handleKey(ev: KeyboardEvent) {\n switch (ev.key) {\n case \"ArrowDown\":\n if (!this.isExpanded) {\n ev.preventDefault();\n this.open();\n window.requestAnimationFrame(() => this.focusFirstItem());\n }\n break;\n case \"ArrowUp\":\n if (!this.isExpanded) {\n ev.preventDefault();\n this.open();\n window.requestAnimationFrame(() => this.focusLastItem());\n }\n break;\n }\n }\n\n @Listen(\"wmMenuitemBlurred\")\n handleMenuitemBlur(ev: CustomEvent): void {\n const toElOrChild = ev.detail.relatedTarget === this.el || this.el.contains(ev.detail.relatedTarget as Node);\n // if the Menuitem is blurred to something other than the component, emit a blur event with the appropriate relatedTarget\n // keeps our component's blur events accurate, and closes when focusing browser address bar\n if (!toElOrChild) {\n const event = new CustomEvent(\"blur\");\n // @ts-ignore\n event.relatedTarget = ev.detail.relatedTarget;\n this.el.dispatchEvent(event);\n }\n }\n\n handleButtonBlur(ev: FocusEvent) {\n const toElOrChild = ev.relatedTarget === this.el || this.el.contains(ev.relatedTarget as Node);\n if (toElOrChild) {\n // do not emit a blur event when opening the dropdown and focusing the Menuitems\n ev.stopPropagation();\n }\n }\n\n componentWillLoad() {\n this.uid = this.el.id ? this.el.id : generateId();\n\n if (this.buttonType) {\n console.warn(\n \"wm-action-menu: button-type has been deprecated as of v3.1.0. Please use action-menu-type instead.\"\n );\n }\n }\n\n componentDidLoad() {\n if (this.tempActionMenuType !== \"icon\" && !this.buttonText) {\n console.error(\n \"wm-action-menu should have a valid button-text property when action-menu-type is set to 'text' or 'selector'\"\n );\n }\n\n if (this.tempActionMenuType === \"icon\" && !this.tooltip) {\n console.error(\"wm-action-menu should have a valid tooltip when action-menu-type is set to 'icon'\");\n }\n\n this.wmActionMenuLoaded.emit();\n this.menuLoaded.emit(); // deprecated\n }\n\n moveUp(el: HTMLWmMenuitemElement) {\n const index = this.childItems.indexOf(el);\n if (index === 0) {\n this.focusLastItem();\n } else {\n this.focusItem(this.childItems[index - 1]);\n }\n }\n\n moveDown(el: HTMLWmMenuitemElement) {\n const index = this.childItems.indexOf(el);\n if (index === this.childItems.length - 1) {\n this.focusFirstItem();\n } else {\n this.focusItem(this.childItems[index + 1]);\n }\n }\n\n open() {\n if (!this.disabled) {\n this.openUp = shouldOpenUp(this.el, this.itemsEl!);\n // action menu usually is on the right side of the screen,\n // so dropdown opens to the left (is anchored on the right corner)\n // if there is not enough space on the left and enough on the right though,\n // it will open on the right side\n\n this.isExpanded = true;\n this.itemsEl!.classList.remove(\"hidden\");\n window.requestAnimationFrame(() => this.focusFirstItem());\n }\n }\n\n close(returnFocus: boolean = true) {\n this.isExpanded = false;\n this.childItems.forEach((i) => (i.focused = false));\n\n window.setTimeout(() => {\n this.itemsEl!.classList.add(\"hidden\");\n }, 150);\n\n window.setTimeout(() => {\n // if dev omits to assign focus after an action is triggered,\n // the component brings the focus back on the button\n // Focus will only be lost (and go to the body) once the menuitem\n // is not visible anymore, so we need to wait for the transition to\n // finish and the hidden class to be applied.\n // also checking if focus stayed on the menuitem\n if (\n returnFocus &&\n (document.activeElement!.tagName === \"BODY\" || document.activeElement!.tagName === \"WM-MENUITEM\")\n ) {\n this.wmButtonEl.focus();\n }\n }, 250);\n }\n\n focusItem(item: HTMLWmMenuitemElement) {\n this.childItems.map((i: HTMLWmMenuitemElement) => (i.focused = i === item));\n item.focus && item.focus();\n }\n\n focusFirstItem() {\n this.focusItem(this.childItems[0]);\n }\n\n focusLastItem() {\n this.focusItem(this.childItems[this.childItems.length - 1]);\n }\n\n @Listen(\"wmLetterPressed\")\n findAndFocusItem(ev: CustomEvent) {\n const character = ev.detail.toUpperCase();\n this.focusFirstItem();\n if (!this.keysSoFar) {\n for (var i = 0; i < this.childItems.length; i++) {\n if (this.childItems[i] === document.activeElement) {\n this.searchIndex = i;\n }\n }\n }\n\n this.keysSoFar += character;\n this.clearKeysSoFarAfterDelay();\n\n var nextMatch = this.findMatchInRange(this.childItems, this.searchIndex + 1, this.childItems.length);\n if (!nextMatch) {\n nextMatch = this.findMatchInRange(this.childItems, 0, this.searchIndex);\n }\n if (nextMatch) {\n this.focusItem(nextMatch as HTMLWmMenuitemElement);\n }\n }\n\n clearKeysSoFarAfterDelay() {\n if (this.keyClear) {\n window.clearTimeout(this.keyClear);\n this.keyClear = null;\n }\n this.keyClear = window.setTimeout(\n function (this: ActionMenu) {\n this.keysSoFar = \"\";\n this.keyClear = null;\n }.bind(this),\n 500\n );\n }\n\n findMatchInRange(list: HTMLWmMenuitemElement[], startIndex: number, endIndex: number) {\n // Find the first item starting with the keysSoFar substring, searching in\n // the specified range of items\n for (var n = startIndex; n < endIndex; n++) {\n var label = list[n].innerText;\n if (label && label.toUpperCase().indexOf(this.keysSoFar) === 0) {\n return list[n];\n }\n }\n return null;\n }\n\n render() {\n return (\n <Host onBlur={() => this.close(false)}>\n <div class={getTextDir()}>\n <wm-button\n button-type={this.internalButtonType}\n tooltip={this.tooltip}\n custom-background={this.darkMode ? \"dark\" : undefined}\n label-for-identical-buttons={this.labelForIdenticalButtons}\n icon={this.tempActionMenuType === \"icon\" ? \"f1d9\" : \"\"}\n id={`menubtn-${this.uid}`}\n onClick={() => (this.isExpanded ? this.close() : this.open())}\n onBlur={(ev) => this.handleButtonBlur(ev)}\n disabled={this.disabled}\n ref={(el) => (this.wmButtonEl = el as HTMLWmButtonElement)}\n tooltip-position={this.tooltipPosition || this.horizontalPosition}\n aria-haspopup=\"true\"\n aria-expanded={this.isExpanded ? \"true\" : \"false\"}\n aria-controls={`menu-${this.uid}`}\n >\n {this.buttonText}\n </wm-button>\n <div\n class={`dropdown ${this.openUp ? \"open-up\" : \"\"} ${this.horizontalPosition} ${\n this.isExpanded ? \"open\" : \"\"\n } hidden`}\n id={`menu-${this.uid}`}\n tabindex={-1}\n role=\"menu\"\n ref={(el) => (this.itemsEl = el)}\n >\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host,\nwm-menuitem {\n contain: content;\n font-family: inherit;\n\n .wrapper {\n display: block;\n min-width: rem-calc(140);\n cursor: pointer;\n padding: rem-calc(20);\n border-radius: 0px 0px 0px 0px;\n background: #fff;\n font-family: inherit;\n font-weight: 500;\n list-style: none;\n border-bottom: 2px solid rgba(#2e1b46, 0.05);\n color: $button-default-text;\n font-weight: 700;\n\n &:focus,\n &.focus {\n outline: none;\n background: #f4f3f6;\n }\n\n &:hover {\n background: #f4f3f6;\n outline: none;\n }\n\n .description {\n color: $charcoal;\n font-size: rem-calc(14);\n padding-top: rem-calc(8);\n white-space: normal;\n font-weight: 400;\n }\n\n &[aria-disabled=\"true\"] {\n font-style: italic;\n color: #6b6b6b;\n }\n\n &:not(:last-child) {\n border-bottom: 2px solid rgba(#2e1b46, 0.05);\n }\n }\n\n ::slotted {\n font-family: inherit;\n }\n\n .mdi {\n @include mdi-icon;\n display: inline-block;\n margin-right: rem-calc(10);\n pointer-events: none;\n }\n}\n\n:host(:focus),\nwm-menuitem:focus {\n outline: none;\n background: #f4f3f6;\n}\n\n//Set pointer events to none on host and element in shadow dom to disable menuitem\n:host([aria-disabled=\"true\"]),\nwm-menuitem[aria-disabled=\"true\"] {\n pointer-events: none;\n}\n","import { h, Component, Element, Event, EventEmitter, Listen, Prop, State, Host, Watch } from \"@stencil/core\";\nimport { getIconCodeFromName } from \"../../global/interfaces\";\n\n@Component({\n tag: \"wm-menuitem\",\n styleUrl: \"wm-menuitem.scss\",\n shadow: true,\n})\nexport class Menuitem {\n @Element() el!: HTMLWmMenuitemElement;\n private iconEl?: HTMLSpanElement;\n\n @Prop() disabled = false;\n @Prop() focused = false;\n @Prop({ mutable: true }) icon?: string = undefined;\n @Prop() description?: string = undefined;\n\n @Event() wmMenuitemClicked!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmKeyUpPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmKeyDownPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmEscKeyPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmHomeKeyPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmEndKeyPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmPageDownItems!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmPageUpItems!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmTabKeyPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmLetterPressed!: EventEmitter;\n @Event() wmMenuitemBlurred!: EventEmitter<{ relatedTarget: EventTarget | null }>;\n private onClickFunc!: (this: GlobalEventHandlers, ev: MouseEvent) => any;\n private descriptionCharLimit = 100;\n\n @State() isKeying: boolean = false;\n\n @Listen(\"wmUserIsKeying\", { target: \"window\" })\n @Listen(\"wmUserIsTabbing\", { target: \"window\" })\n toggleKeyingOn() {\n this.isKeying = true;\n }\n\n @Listen(\"wmUserIsNotKeying\", { target: \"window\" })\n @Listen(\"wmUserIsNotTabbing\", { target: \"window\" })\n toggleKeyingOff() {\n this.isKeying = false;\n }\n\n @Listen(\"keydown\")\n handleKeydown(ev: KeyboardEvent) {\n const modifierKeyUsed = ev.altKey || ev.ctrlKey || ev.metaKey;\n const isSingleCharacter = /^.$/.test(ev.key);\n const isCharacterEntry = isSingleCharacter && !modifierKeyUsed;\n switch (ev.key) {\n case \"ArrowUp\":\n ev.preventDefault();\n this.wmKeyUpPressed.emit(this.el as HTMLWmMenuitemElement);\n break;\n case \"ArrowDown\":\n ev.preventDefault();\n this.wmKeyDownPressed.emit(this.el as HTMLWmMenuitemElement);\n break;\n case \"Enter\":\n ev.preventDefault();\n if (!this.disabled) {\n this.el.click();\n }\n break;\n case \"Escape\":\n ev.preventDefault();\n ev.stopPropagation(); // prevents closing of parent modal\n this.wmEscKeyPressed.emit();\n break;\n case \"Home\":\n ev.preventDefault();\n this.wmHomeKeyPressed.emit();\n break;\n case \"End\":\n ev.preventDefault();\n this.wmEndKeyPressed.emit();\n break;\n case \"Tab\":\n this.wmTabKeyPressed.emit();\n break;\n default:\n if (isCharacterEntry) {\n ev.preventDefault();\n this.wmLetterPressed.emit(ev.key);\n }\n }\n }\n\n @Listen(\"click\")\n handleClick() {\n if (!this.disabled) {\n this.wmMenuitemClicked.emit();\n }\n }\n\n @Listen(\"blur\")\n handleBlur(ev: FocusEvent) {\n this.wmMenuitemBlurred.emit({ relatedTarget: ev.relatedTarget });\n }\n\n @Watch(\"disabled\")\n setOnClick() {\n if (this.disabled && this.el.onclick) {\n this.onClickFunc = this.el.onclick;\n this.el.onclick = null;\n } else if (!this.disabled && this.onClickFunc) {\n this.el.onclick = this.onClickFunc;\n }\n }\n\n componentWillLoad() {\n if (this.icon) {\n // in case a name was passed instead of a code, convert it to code (for backwards compatibility)\n this.icon = getIconCodeFromName(this.icon);\n }\n\n if (this.description) {\n if (this.description.length > this.descriptionCharLimit) {\n console.error(`wm-menuitem description is above the character limit of ${this.descriptionCharLimit}`);\n }\n if (this.icon) {\n console.error(\"wm-menuitems with descriptions do not support the use of icons\");\n }\n }\n\n this.setOnClick();\n }\n\n componentDidLoad() {\n if (this.icon) {\n this.iconEl!.classList.add(\"mdi\");\n this.iconEl!.innerHTML = `&#x${this.icon};`;\n }\n }\n\n render() {\n return (\n <Host tabindex={-1} role=\"menuitem\" aria-disabled={this.disabled ? \"true\" : null}>\n <div\n class={`wrapper ${this.focused && this.isKeying ? \"focus\" : \"\"}`}\n aria-disabled={this.disabled ? \"true\" : null}\n >\n <span ref={(el) => (this.iconEl = el)} />\n <slot />\n {this.description ? <div class=\"description\">{this.description}</div> : \"\"}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmNetworkUploaderCss","NetworkUploader","this","inputId","generateId","toggleTabbingOn","isTabbing","toggleTabbingOff","handleUploadProgress","ev","inProgressList","map","i","name","detail","file_name","progress","forceUpdate","el","numFilesInProgress","srProgress","total","setInterval","aggregate","reduce","avg","item","liveRegion","innerHTML","intl","formatMessage","id","defaultMessage","percentage","Math","floor","handleFinishedSnack","snackbar","filter","n","setMaxSize","maxSize","uploadNotifications","newNum","oldNum","setTimeout","notif","message","clearInterval","num","emitFileListEvent","wmNetworkUploaderFilesChanged","emit","fileList","formatDate","isoDate","locale","timezone","timestamp","Date","parse","match","Intl","getCanonicalLocales","_a","date","year","getFullYear","month","getMonth","substr","day","getDate","time","toLocaleTimeString","timeZone","hour","minute","isValidSize","size","isDuplicate","find","f","isEmpty","length","errorList","isDisabled","isMax","maxFiles","errMessage","description","purgeProgressList","getExistingFiles","getRequest","getPath","then","reply","sortBy","sort","a","b","localeCompare","catch","errStatus","console","error","clearErrors","handleFiles","files","Array","from","target","validTypes","fileTypes","split","join","file","hasValidType","push","uploadFile","value","requestUploadPath","toString","async","assData","JSON","associatedData","fileInfo","Object","assign","mime_type","type","file_path","path","document_uuid","guid","onProgress","lengthComputable","loaded","event","CustomEvent","dispatchEvent","putRequest","url","postRequest","uploadPath","err","downloadFile","uuid","payload","file_uuid","requestDownloadPath","window","location","deleteFile","fileName","link","deleteRequest","deletePath","componentWillLoad","Error","buttonText","emptyStateText","componentDidLoad","document","body","classList","contains","uploadButtonOnClick","preventDefault","errMsg","Promise","resolve","renderUploadSvg","h","class","width","height","viewBox","transform","fill","d","renderIcon","rotate","icon","String","fromCodePoint","parseInt","renderNotif","renderUploadButton","classes","multiple","onClick","onChange","e","htmlFor","renderWithItems","renderErrorList","renderInProgressList","renderFileList","renderEmptyState","srMessage","acc","style","background","renderFile","updated_at","DateTimeFormat","resolvedOptions","tooltip","render","Host","notifications","stringify","ref"],"sources":["./src/components/wm-uploader/wm-network-uploader/wm-network-uploader.scss?tag=wm-network-uploader&encapsulation=shadow","./src/components/wm-uploader/wm-network-uploader/wm-network-uploader.tsx"],"sourcesContent":[":host,\nwm-network-uploader {\n width: 100%;\n position: relative;\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-network-uploader * {\n box-sizing: border-box;\n}\n\n.sr-only {\n @include srOnly;\n}\n\n.header {\n position: relative;\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n\n .notif-wrapper {\n align-items: flex-end;\n }\n}\n\n.notif-wrapper {\n display: flex;\n align-items: flex-start; // for .notif\n height: -moz-fit-content;\n height: fit-content;\n flex-direction: column; // for.notif\n align-items: center; // for.notif\n .notif {\n font-size: 0.875rem;\n font-style: italic;\n margin-top: rem-calc(4);\n }\n}\n\n@media (max-width: rem-calc(975)) {\n .descr {\n margin-bottom: rem-calc(8);\n }\n .notif-wrapper {\n margin-bottom: rem-calc(16);\n }\n .header {\n .notif-wrapper {\n align-items: flex-start;\n }\n }\n}\n\n.file-info {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n\n + .file-controls {\n flex: none;\n margin-left: rem-calc(16);\n }\n}\n\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: 1.5rem;\n margin-bottom: rem-calc(7);\n }\n\n .notif-wrapper {\n justify-content: center;\n\n .wm-button {\n // Removing the width inherit here to prevent a 100% width\n // from the notif-wrapper. Future proofing a day when\n // we might want a long notif to wrap.\n width: auto;\n }\n }\n}\n\nul {\n list-style: none;\n padding: 0;\n width: 100%;\n li {\n font-size: rem-calc(14);\n .file {\n @include border-radius(3px);\n position: relative; // for progress bar\n height: rem-calc(60);\n padding: rem-calc(8 20);\n background: $background;\n border: 1px solid rgb(107, 107, 107);\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n + .file {\n margin-top: rem-calc(20);\n }\n\n .filename {\n font-weight: 500;\n }\n\n .filedate {\n margin-left: rem-calc(60);\n font-weight: normal;\n font-style: italic;\n }\n\n wm-button + wm-button {\n margin-left: rem-calc(16);\n }\n }\n }\n\n &.file-list .file.--saved,\n &.inprogress-list .file {\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\n .progress {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n height: 8px;\n }\n\n &.error-list li {\n margin-bottom: rem-calc(20);\n color: $error-color;\n .file {\n border: 1px solid $error-color;\n background-color: #f5ebea;\n height: rem-calc(60);\n }\n }\n .error-message {\n padding-top: rem-calc(4);\n font-style: italic;\n }\n}\n","import { Component, Element, h, Host, Prop, State, Listen, Watch, Event, EventEmitter } from \"@stencil/core\";\nimport { forceUpdate } from \"@stencil/core\";\nimport { getRequest, postRequest, putRequest, deleteRequest } from \"../../../global/services/http-service\";\nimport { intl, generateId, hasValidType } from \"../../../global/functions\";\n//\n// Web API File interface => for FileList on input element, sending to AWS\n// Custom FileInfo interface (below) => for our server\nexport interface FileInfo {\n file_name: string;\n file_path?: string;\n mime_type: string;\n updated_at?: string;\n\n uuid?: string; // AWS guid\n document_uuid?: string; // aka file uuid. how is that different from the uuid above?\n // organization_uuid: string; // aka node uuid\n}\n\ninterface FileInProgress extends File {\n progress?: number;\n}\n\ninterface ErrorInfo {\n file_name: string;\n message: string;\n}\n\ninterface AWSData {\n url: string;\n updated_at: string;\n path: string;\n guid: string;\n}\n\ninterface Notification {\n message: string;\n id: string;\n link: string;\n}\n\n@Component({\n tag: \"wm-network-uploader\",\n styleUrl: \"wm-network-uploader.scss\",\n shadow: true,\n})\nexport class NetworkUploader {\n @Element() el!: HTMLWmNetworkUploaderElement;\n private liveRegion?: HTMLDivElement;\n\n @State() isTabbing: boolean = false;\n\n @State() fileList: FileInfo[] = [];\n @State() inProgressList: FileInProgress[] = [];\n @State() errorList: ErrorInfo[] = []; // for errors on a particular file\n @State() notif?: { id: number; message: string } | null; // for global errors, e.g. user tries uploading too many files, and upload notifications\n @State() snackbar: Notification[] = [];\n @State() numFilesInProgress?: number | null; // null when not uploading != 0 (when all files are done uploading) != undefined (original state)\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\n @Prop() getPath!: string;\n @Prop() requestUploadPath!: string;\n @Prop() uploadPath!: string; // used for POST request (create db entry)\n @Prop() requestDownloadPath!: string;\n @Prop() deletePath!: string;\n\n @Prop() associatedData?: string;\n @Prop() buttonText!: 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({ mutable: true }) maxSize: number = 100; // in Mb\n @Prop() maxFiles?: number;\n @Prop() sortBy: \"name\" | \"date\" = \"date\"; // name is descending (a -> z), date is ascending (earlier -> later)\n\n @Event() wmNetworkUploaderFilesChanged!: EventEmitter<Object[]>;\n\n private inputId = generateId();\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.inProgressList.map((i) => {\n if (i.name === ev.detail.file_name) {\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.inProgressList.reduce((avg, item) => (item.progress ? avg + item.progress : avg), 0);\n if (this.liveRegion) {\n this.liveRegion.innerHTML = 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(\"userFinishedSnack\")\n handleFinishedSnack(ev: CustomEvent) {\n this.snackbar = this.snackbar.filter((n) => n.id !== ev.detail.id);\n }\n\n @Watch(\"maxSize\")\n setMaxSize() {\n // Max size can't be set above 100Mb\n this.maxSize = this.maxSize > 100 ? 100 : this.maxSize;\n }\n\n @Watch(\"numFilesInProgress\")\n uploadNotifications(newNum: number, oldNum: number) {\n if (oldNum > 0 && newNum === 0) {\n setTimeout(() => {\n this.notif = null;\n }, 20 * 1000);\n const message = intl.formatMessage({\n id: \"uploader.finishedUploading\",\n defaultMessage: \"Finished uploading\",\n });\n this.notif = { id: 5, message };\n if (this.liveRegion) {\n this.liveRegion.innerHTML = message;\n }\n this.numFilesInProgress = null;\n clearInterval(this.srProgress);\n forceUpdate(this.el);\n } else if (newNum > 0 && newNum != oldNum) {\n const message = 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 = { id: 6, message };\n if (this.liveRegion) {\n this.liveRegion.innerHTML = message;\n }\n forceUpdate(this.el);\n }\n }\n\n @Watch(\"fileList\")\n emitFileListEvent() {\n this.wmNetworkUploaderFilesChanged.emit(this.fileList);\n }\n\n formatDate(isoDate: string, locale: string, timezone: string) {\n const timestamp = Date.parse(isoDate);\n if (locale.match(/^[a-zA-Z]*(-[a-zA-Z0-9]*)*$/g)) {\n // make sure locale is valid, otherwise set default locale\n try {\n //@ts-ignore\n Intl.getCanonicalLocales(locale);\n } catch {\n locale = \"en-us\";\n }\n } else {\n return isoDate;\n }\n\n if (!!timestamp) {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = (\"0\" + (date.getMonth() + 1)).substr(-2);\n const day = (\"0\" + date.getDate()).substr(-2);\n const time = date.toLocaleTimeString([locale, \"en-us\"], {\n timeZone: timezone,\n hour: \"numeric\",\n minute: \"numeric\",\n });\n return `${year}/${month}/${day} ${time}`;\n } else {\n return isoDate;\n }\n }\n\n isValidSize(size: number) {\n // https://stackoverflow.com/questions/2365100/converting-bytes-to-megabytes\n return size / 1024 / 1024 <= this.maxSize;\n }\n\n isDuplicate(name: string) {\n return this.fileList.find((f) => f.file_name === name);\n }\n\n isEmpty() {\n return !this.fileList.length && !this.inProgressList.length && !this.errorList.length;\n }\n\n get isDisabled() {\n const isMax = !!this.maxFiles && this.fileList.length >= this.maxFiles;\n\n if (!this.notif) {\n if (isMax) {\n const errMessage = 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 this.notif = { id: 1, message: errMessage };\n if (this.liveRegion) {\n this.liveRegion.innerHTML = errMessage;\n }\n } else {\n this.notif = null;\n }\n } else if (this.notif.id === 1) {\n // to make sure SR don't repeat the error, don't reset it if it already is showing\n // just dismiss it if isMax is not true anymore\n if (!isMax) {\n this.notif = null;\n }\n // finally do nothing if error 2 is showing (special case when user selects too many files)\n }\n // disable if is the uploader is maxed out or if something is uploading\n return isMax || this.numFilesInProgress! > 0;\n }\n\n purgeProgressList(item: FileInfo) {\n // If a file is retrieved from the server because it was just uploaded\n // it should be removed from inProgressList\n this.inProgressList = this.inProgressList.filter((i) => i.progress !== 100 && i.name !== item.file_name);\n }\n\n getExistingFiles() {\n getRequest(this.getPath)\n .then((reply: FileInfo[]) => {\n reply.map((item) => this.purgeProgressList(item));\n if (this.sortBy === \"name\") {\n reply.sort((a, b) => a.file_name.localeCompare(b.file_name));\n }\n this.fileList = reply;\n })\n .catch((errStatus) => {\n console.error(errStatus);\n });\n }\n\n clearErrors() {\n this.errorList = [];\n this.notif = null;\n }\n\n handleFiles(ev: Event) {\n const files = Array.from((ev.target! as HTMLInputElement).files!);\n const validTypes = this.fileTypes.split(\" \").join(\", \");\n\n if (!!this.maxFiles && this.fileList.length + files.length > this.maxFiles) {\n const errMessage = 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 this.notif = { id: 2, message: errMessage };\n if (this.liveRegion) {\n this.liveRegion.innerHTML = errMessage;\n }\n } else {\n // map to create inProgress items so they can be displayed immediately\n files &&\n files.map((file) => {\n if (!hasValidType(file, this.fileTypes)) {\n const error = {\n file_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 (!this.isValidSize(file.size)) {\n const error = {\n file_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.maxSize }\n ),\n };\n this.errorList.push(error);\n } else if (this.isDuplicate(file.name)) {\n const error = {\n file_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.inProgressList.push(file);\n }\n forceUpdate(this.el);\n });\n\n if (this.inProgressList.length > 0) {\n this.numFilesInProgress = this.inProgressList.length;\n\n // map over \"uploadable\" files for actual upload\n // this happens separately otherwise at each pass we'd have to wait for the requests to complete before displaying things\n this.inProgressList.map((file, i) => {\n this.uploadFile(file, i); // = input.files file\n });\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 uploadFile(file: File, i: number) {\n // get upload link\n getRequest(this.requestUploadPath + i.toString())\n .then(async (reply: AWSData) => {\n const assData = JSON.parse(this.associatedData!);\n const fileInfo: FileInfo = {\n ...assData,\n file_name: file.name,\n mime_type: file.type,\n file_path: reply.path,\n document_uuid: reply.guid,\n };\n\n // onProgress is passed as a callback to the ev listener inside putRequest (http service),\n // so we can't change component things directly => custom event to pass data to uploader component.\n const onProgress = (ev: ProgressEvent) => {\n const progress = ev.lengthComputable && ev.total !== 0 ? (ev.loaded / ev.total) * 100 : 0;\n const event = new CustomEvent(\"wmUploadProgress\", {\n detail: { file_name: file.name, progress },\n });\n\n this.el.dispatchEvent(event);\n };\n\n // upload to AWS s3 to url we just fetched\n await putRequest(reply.url, file, onProgress);\n\n // create the db entry\n await postRequest(this.uploadPath, fileInfo);\n\n // get files from server again\n this.getExistingFiles();\n })\n .catch((err) => {\n // do not show toast on error\n this.numFilesInProgress = null;\n // do not show in progress item on error\n this.inProgressList = [];\n this.notif = {\n id: 3,\n message: intl.formatMessage({\n id: \"global.genericError\",\n defaultMessage: \"An error occurred. Please try again.\",\n }),\n };\n console.error(err);\n });\n }\n\n downloadFile(uuid: string, path: string) {\n this.clearErrors();\n\n // POST request to get temporary download link\n const payload = {\n file_path: path,\n file_uuid: uuid,\n };\n postRequest(this.requestDownloadPath, payload)\n .then((reply: { url: string }) => {\n // we got the download link, now download the file\n window.location.assign(reply.url);\n })\n .catch((err) => {\n console.error(err);\n });\n }\n\n deleteFile(file: FileInfo) {\n this.clearErrors();\n\n this.snackbar.push({\n message: intl.formatMessage(\n {\n id: \"uploader.fileDeleted\",\n defaultMessage: \"{fileName} was deleted.\",\n },\n { fileName: file.file_name }\n ),\n id: file.uuid!,\n link: \"\",\n });\n\n // rm file from list immediately.\n this.fileList = this.fileList.filter((i) => i.uuid !== file.uuid);\n\n deleteRequest(`${this.deletePath}/${file.uuid}`).catch((err) => {\n this.notif = {\n id: 4,\n message: intl.formatMessage(\n {\n id: \"uploader.fileNotDeleted\",\n defaultMessage: \"{fileName} could not be deleted.\",\n },\n { fileName: file.file_name }\n ),\n };\n this.getExistingFiles();\n console.error(err);\n });\n }\n\n componentWillLoad() {\n if (!this.getPath) {\n throw new Error(\"wm-network-uploader: get-path is a required prop\");\n }\n if (!this.requestUploadPath) {\n throw new Error(\"wm-network-uploader: request-upload-path is a required prop\");\n }\n if (!this.uploadPath) {\n throw new Error(\"wm-network-uploader: upload-path is a required prop\");\n }\n if (!this.requestDownloadPath) {\n throw new Error(\"wm-network-uploader: request-download-path is a required prop\");\n }\n if (!this.deletePath) {\n throw new Error(\"wm-network-uploader: delete-path is a required prop\");\n }\n if (!this.buttonText) {\n throw new Error(\"wm-network-uploader: button-text is a required prop\");\n }\n if (!this.emptyStateText) {\n throw new Error(\"wm-network-uploader: empty-state-text is a required prop\");\n }\n if (!this.associatedData) {\n throw new Error(\"wm-network-uploader: associated-data is a required prop\");\n }\n\n this.setMaxSize();\n this.clearErrors();\n }\n\n componentDidLoad() {\n this.getExistingFiles();\n\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 // this is not pretty duplicating a intl message + the logic of isDisabled,\n // but not worth a bigger refactor since this is only until we get the UX for disabled elements and refactor all interactive els.\n ev.preventDefault();\n if (this.liveRegion) {\n const isMax = !!this.maxFiles && this.fileList.length >= this.maxFiles;\n let errMsg: string = \"\";\n if (this.numFilesInProgress! > 0) {\n errMsg = 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 } else if (isMax) {\n errMsg = 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 if (errMsg) {\n // clear and set again to re-announce if button is clicked several times\n // (can't be done inside setTimeout because of scope, hence the promise)\n this.liveRegion.innerHTML = \"\";\n new Promise((resolve) => {\n setTimeout(() => {\n resolve(\"\");\n }, 500);\n }).then(() => (this.liveRegion!.innerHTML = errMsg));\n }\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 renderNotif() {\n return this.notif ? <span class=\"notif\">{this.notif.message}</span> : \"\";\n }\n\n renderUploadButton(classes: string) {\n return (\n <div class=\"notif-wrapper\">\n <input\n name={this.inputId}\n id={this.inputId}\n class=\"sr-only\"\n type=\"file\"\n multiple\n onClick={(ev) => this.uploadButtonOnClick(ev)}\n onChange={(e) => this.handleFiles(e)}\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.renderNotif()}\n </div>\n );\n }\n\n renderWithItems() {\n return (\n <div>\n <div class=\"header\">\n <div class=\"descr\">\n <slot />\n </div>\n {this.renderUploadButton(this.isDisabled ? \"disabled\" : \"\")}\n </div>\n {this.renderErrorList()}\n {this.renderInProgressList()}\n {this.renderFileList()}\n </div>\n );\n }\n\n renderEmptyState() {\n return (\n <div>\n <div class=\"header\">\n <div class=\"descr\">\n <slot />\n </div>\n </div>\n <div class=\"empty-block\">\n {this.renderUploadSvg()}\n <div class=\"empty-message\">{this.emptyStateText}</div>\n {this.renderUploadButton(\"-primary empty-button\")}\n </div>\n </div>\n );\n }\n\n renderErrorList() {\n if (!!this.errorList.length) {\n if (this.liveRegion) {\n let srMessage = this.errorList.reduce(function (acc, err) {\n return acc + `${err.file_name}: ${err.message} `;\n }, \"\");\n this.liveRegion.innerHTML = srMessage;\n }\n\n return (\n <ul class=\"error-list\">\n {this.errorList.map((err) => (\n <li>\n <div class=\"file --error\">\n <div class=\"file-info\">\n <span class=\"filename\">{err.file_name}</span>\n </div>\n </div>\n <div class=\"error-message\">{err.message}</div>\n </li>\n ))}\n </ul>\n );\n }\n }\n\n renderInProgressList() {\n return (\n <ul class=\"inprogress-list\">\n {this.inProgressList.map((item) => {\n return (\n <li>\n <div class=\"file --progress\">\n <div\n class=\"progress\"\n style={{\n background: `linear-gradient(to right, rgba(67, 126, 142, 1) ${item.progress}%, transparent ${item.progress}%)`,\n }}\n ></div>\n <div class=\"file-info\">\n <span class=\"filename\">\n {item.name} <span class=\"sr-only\">uploading</span>\n </span>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n );\n }\n\n renderFile(item: FileInfo) {\n return (\n <li>\n <div class=\"file --saved\">\n <div class=\"file-info\">\n <span class=\"filename\">{item.file_name}</span>\n <span class=\"filedate\">\n {this.formatDate(item.updated_at!, intl.locale, Intl.DateTimeFormat().resolvedOptions().timeZone)}\n </span>\n </div>\n <div class=\"file-controls\">\n <wm-button\n class=\"download-button\"\n button-type=\"icononly\"\n tooltip=\"download\"\n label-for-identical-buttons={`download ${item.file_name}`}\n icon=\"f1da\"\n onClick={() => this.downloadFile(item.uuid!, item.file_path!)}\n ></wm-button>\n <wm-button\n class=\"delete-button\"\n button-type=\"icononly\"\n tooltip=\"remove\"\n label-for-identical-buttons={`remove ${item.file_name}`}\n icon=\"f1c0\"\n onClick={() => this.deleteFile(item)}\n ></wm-button>\n </div>\n </div>\n </li>\n );\n }\n\n renderFileList() {\n return <ul class=\"file-list\">{this.fileList.map((item) => this.renderFile(item))}</ul>;\n }\n\n render() {\n return (\n <Host>\n {this.isEmpty() ? this.renderEmptyState() : this.renderWithItems()}\n <wm-snackbar notifications={JSON.stringify(this.snackbar)}></wm-snackbar>\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 ></div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmActionMenuCss","ActionMenu","exports","this","openUp","keysSoFar","searchIndex","keyClear","Object","defineProperty","class_1","prototype","el","itemsEl","shouldShiftRight","Array","from","querySelectorAll","tempActionMenuType","actionMenuType","buttonType","handleClickedItem","close","handleKeyUp","ev","moveUp","target","handleKeyDown","moveDown","detail","handleHomeKey","focusFirstItem","handleEndKey","focusLastItem","handleTabKey","isExpanded","handleEscKey","wmButtonEl","focus","handleKey","_this","key","preventDefault","open","window","requestAnimationFrame","handleMenuitemBlur","toElOrChild","relatedTarget","contains","event","CustomEvent","dispatchEvent","handleButtonBlur","stopPropagation","componentWillLoad","uid","id","generateId","console","warn","componentDidLoad","buttonText","error","tooltip","wmActionMenuLoaded","emit","menuLoaded","index","childItems","indexOf","focusItem","length","disabled","shouldOpenUp","classList","remove","returnFocus","forEach","i","focused","setTimeout","add","document","activeElement","tagName","item","map","findAndFocusItem","character","toUpperCase","clearKeysSoFarAfterDelay","nextMatch","findMatchInRange","clearTimeout","bind","list","startIndex","endIndex","n","label","innerText","render","h","Host","onBlur","class","getTextDir","internalButtonType","darkMode","undefined","labelForIdenticalButtons","icon","concat","onClick","ref","tooltipPosition","horizontalPosition","tabindex","role","wmMenuitemCss","Menuitem","descriptionCharLimit","class_2","toggleKeyingOn","isKeying","toggleKeyingOff","handleKeydown","modifierKeyUsed","altKey","ctrlKey","metaKey","isSingleCharacter","test","isCharacterEntry","wmKeyUpPressed","wmKeyDownPressed","click","wmEscKeyPressed","wmHomeKeyPressed","wmEndKeyPressed","wmTabKeyPressed","wmLetterPressed","handleClick","wmMenuitemClicked","handleBlur","wmMenuitemBlurred","setOnClick","onclick","onClickFunc","getIconCodeFromName","description","iconEl","innerHTML"],"sources":["src/components/wm-action-menu/wm-action-menu.scss?tag=wm-action-menu&encapsulation=shadow","src/components/wm-action-menu/wm-action-menu.tsx","src/components/wm-menuitem/wm-menuitem.scss?tag=wm-menuitem&encapsulation=shadow","src/components/wm-menuitem/wm-menuitem.tsx"],"sourcesContent":[":host {\n position: relative;\n display: inline-block;\n width: -moz-fit-content;\n width: fit-content;\n color: #575195;\n font-family: inherit;\n\n .sr-only {\n @include srOnly;\n }\n}\n\n:host(:focus) {\n outline: none;\n}\n\nwm-action-menu:focus {\n outline: none;\n}\n\n.dropdown {\n position: absolute;\n padding: 0;\n margin: rem-calc(4) 0;\n border-radius: 3px 3px 3px 3px;\n min-width: rem-calc(183);\n @include scale($xVal: 1, $yVal: 0);\n @include transition(transform 0.25s ease);\n @include transformOrigin(center top);\n visibility: hidden;\n\n &:focus {\n outline: none;\n }\n\n @include box-shadow(0 3px 14px 3px rgba(5, 3, 3, 0.12), 0 4px 15px 0 rgba(0, 0, 0, 0.2));\n background: #fff;\n z-index: 10;\n text-align: left;\n\n &.open {\n @include scale($xVal: 1, $yVal: 1);\n visibility: visible;\n }\n\n &.open-up {\n bottom: 2.5rem;\n top: auto;\n @include transformOrigin(center bottom);\n }\n\n &.right {\n // anchoring to left corner means it opens on the right side\n left: 0;\n }\n\n &.left {\n right: 0;\n }\n\n white-space: nowrap;\n}\n","import { h, Component, Element, Listen, Prop, State, Event, EventEmitter, Host } from \"@stencil/core\";\nimport { generateId, getTextDir, shouldOpenUp, shouldShiftRight } from \"../../global/functions\";\n\n@Component({\n tag: \"wm-action-menu\",\n styleUrl: \"wm-action-menu.scss\",\n shadow: { delegatesFocus: true },\n})\nexport class ActionMenu {\n @Element() el!: HTMLWmActionMenuElement;\n private wmButtonEl!: HTMLWmButtonElement;\n private itemsEl?: HTMLDivElement;\n private uid!: string;\n private openUp: boolean = false;\n get horizontalPosition(): \"right\" | \"left\" {\n return !!this.el && !!this.itemsEl && shouldShiftRight(this.el, this.itemsEl!) ? \"right\" : \"left\";\n }\n get childItems(): HTMLWmMenuitemElement[] {\n return Array.from(this.el.querySelectorAll(\"wm-menuitem\"));\n }\n get internalButtonType(): string {\n return this.tempActionMenuType === \"icon\" || this.tempActionMenuType === \"text\"\n ? this.tempActionMenuType + \"only\"\n : this.tempActionMenuType;\n }\n\n @State() isExpanded = false;\n @Prop() tooltipPosition?:\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"top-right\"\n | \"top-left\";\n @Prop() actionMenuType: \"icon\" | \"text\" | \"selector\" | \"selector-primary\" | null = null;\n @Prop() buttonType: \"icon\" | \"text\" | \"selector\" | null = null; // deprecated in favor of actionMenuType\n get tempActionMenuType(): \"icon\" | \"text\" | \"selector\" | \"selector-primary\" {\n // uses of this getter should be replaced with this.actionMenuType when buttonType is fully phased out\n // don't forget to reset this.actionMenuTypes's default value to icon\n return this.actionMenuType || this.buttonType || \"icon\";\n }\n @Prop() buttonText?: string;\n @Prop({ reflect: true }) disabled: boolean = false;\n @Prop() tooltip?: string;\n @Prop() labelForIdenticalButtons?: string;\n @Prop() darkMode?: boolean;\n @Event({ composed: true, bubbles: true }) wmActionMenuLoaded!: EventEmitter;\n @Event({ composed: true, bubbles: true }) menuLoaded!: EventEmitter; // deprecated in favor of wmActionMenuLoaded\n\n private keysSoFar: string = \"\";\n private searchIndex: number = 0;\n private keyClear: number | null = null;\n\n @Listen(\"wmMenuitemClicked\")\n handleClickedItem() {\n this.close();\n }\n\n @Listen(\"wmKeyUpPressed\")\n handleKeyUp(ev: CustomEvent) {\n this.moveUp(ev.target as HTMLWmMenuitemElement);\n }\n\n @Listen(\"wmKeyDownPressed\")\n handleKeyDown(ev: CustomEvent) {\n this.moveDown(ev.detail);\n }\n\n @Listen(\"wmHomeKeyPressed\")\n handleHomeKey() {\n this.focusFirstItem();\n }\n\n @Listen(\"wmEndKeyPressed\")\n handleEndKey() {\n this.focusLastItem();\n }\n\n @Listen(\"wmTabKeyPressed\")\n handleTabKey() {\n if (this.isExpanded) {\n this.close();\n }\n }\n\n @Listen(\"wmEscKeyPressed\")\n handleEscKey() {\n this.close();\n this.wmButtonEl.focus();\n }\n\n @Listen(\"keydown\")\n handleKey(ev: KeyboardEvent) {\n switch (ev.key) {\n case \"ArrowDown\":\n if (!this.isExpanded) {\n ev.preventDefault();\n this.open();\n window.requestAnimationFrame(() => this.focusFirstItem());\n }\n break;\n case \"ArrowUp\":\n if (!this.isExpanded) {\n ev.preventDefault();\n this.open();\n window.requestAnimationFrame(() => this.focusLastItem());\n }\n break;\n }\n }\n\n @Listen(\"wmMenuitemBlurred\")\n handleMenuitemBlur(ev: CustomEvent): void {\n const toElOrChild = ev.detail.relatedTarget === this.el || this.el.contains(ev.detail.relatedTarget as Node);\n // if the Menuitem is blurred to something other than the component, emit a blur event with the appropriate relatedTarget\n // keeps our component's blur events accurate, and closes when focusing browser address bar\n if (!toElOrChild) {\n const event = new CustomEvent(\"blur\");\n // @ts-ignore\n event.relatedTarget = ev.detail.relatedTarget;\n this.el.dispatchEvent(event);\n }\n }\n\n handleButtonBlur(ev: FocusEvent) {\n const toElOrChild = ev.relatedTarget === this.el || this.el.contains(ev.relatedTarget as Node);\n if (toElOrChild) {\n // do not emit a blur event when opening the dropdown and focusing the Menuitems\n ev.stopPropagation();\n }\n }\n\n componentWillLoad() {\n this.uid = this.el.id ? this.el.id : generateId();\n\n if (this.buttonType) {\n console.warn(\n \"wm-action-menu: button-type has been deprecated as of v3.1.0. Please use action-menu-type instead.\"\n );\n }\n }\n\n componentDidLoad() {\n if (this.tempActionMenuType !== \"icon\" && !this.buttonText) {\n console.error(\n \"wm-action-menu should have a valid button-text property when action-menu-type is set to 'text' or 'selector'\"\n );\n }\n\n if (this.tempActionMenuType === \"icon\" && !this.tooltip) {\n console.error(\"wm-action-menu should have a valid tooltip when action-menu-type is set to 'icon'\");\n }\n\n this.wmActionMenuLoaded.emit();\n this.menuLoaded.emit(); // deprecated\n }\n\n moveUp(el: HTMLWmMenuitemElement) {\n const index = this.childItems.indexOf(el);\n if (index === 0) {\n this.focusLastItem();\n } else {\n this.focusItem(this.childItems[index - 1]);\n }\n }\n\n moveDown(el: HTMLWmMenuitemElement) {\n const index = this.childItems.indexOf(el);\n if (index === this.childItems.length - 1) {\n this.focusFirstItem();\n } else {\n this.focusItem(this.childItems[index + 1]);\n }\n }\n\n open() {\n if (!this.disabled) {\n this.openUp = shouldOpenUp(this.el, this.itemsEl!);\n // action menu usually is on the right side of the screen,\n // so dropdown opens to the left (is anchored on the right corner)\n // if there is not enough space on the left and enough on the right though,\n // it will open on the right side\n\n this.isExpanded = true;\n this.itemsEl!.classList.remove(\"hidden\");\n window.requestAnimationFrame(() => this.focusFirstItem());\n }\n }\n\n close(returnFocus: boolean = true) {\n this.isExpanded = false;\n this.childItems.forEach((i) => (i.focused = false));\n\n window.setTimeout(() => {\n this.itemsEl!.classList.add(\"hidden\");\n }, 150);\n\n window.setTimeout(() => {\n // if dev omits to assign focus after an action is triggered,\n // the component brings the focus back on the button\n // Focus will only be lost (and go to the body) once the menuitem\n // is not visible anymore, so we need to wait for the transition to\n // finish and the hidden class to be applied.\n // also checking if focus stayed on the menuitem\n if (\n returnFocus &&\n (document.activeElement!.tagName === \"BODY\" || document.activeElement!.tagName === \"WM-MENUITEM\")\n ) {\n this.wmButtonEl.focus();\n }\n }, 250);\n }\n\n focusItem(item: HTMLWmMenuitemElement) {\n this.childItems.map((i: HTMLWmMenuitemElement) => (i.focused = i === item));\n item.focus && item.focus();\n }\n\n focusFirstItem() {\n this.focusItem(this.childItems[0]);\n }\n\n focusLastItem() {\n this.focusItem(this.childItems[this.childItems.length - 1]);\n }\n\n @Listen(\"wmLetterPressed\")\n findAndFocusItem(ev: CustomEvent) {\n const character = ev.detail.toUpperCase();\n this.focusFirstItem();\n if (!this.keysSoFar) {\n for (var i = 0; i < this.childItems.length; i++) {\n if (this.childItems[i] === document.activeElement) {\n this.searchIndex = i;\n }\n }\n }\n\n this.keysSoFar += character;\n this.clearKeysSoFarAfterDelay();\n\n var nextMatch = this.findMatchInRange(this.childItems, this.searchIndex + 1, this.childItems.length);\n if (!nextMatch) {\n nextMatch = this.findMatchInRange(this.childItems, 0, this.searchIndex);\n }\n if (nextMatch) {\n this.focusItem(nextMatch as HTMLWmMenuitemElement);\n }\n }\n\n clearKeysSoFarAfterDelay() {\n if (this.keyClear) {\n window.clearTimeout(this.keyClear);\n this.keyClear = null;\n }\n this.keyClear = window.setTimeout(\n function (this: ActionMenu) {\n this.keysSoFar = \"\";\n this.keyClear = null;\n }.bind(this),\n 500\n );\n }\n\n findMatchInRange(list: HTMLWmMenuitemElement[], startIndex: number, endIndex: number) {\n // Find the first item starting with the keysSoFar substring, searching in\n // the specified range of items\n for (var n = startIndex; n < endIndex; n++) {\n var label = list[n].innerText;\n if (label && label.toUpperCase().indexOf(this.keysSoFar) === 0) {\n return list[n];\n }\n }\n return null;\n }\n\n render() {\n return (\n <Host onBlur={() => this.close(false)}>\n <div class={getTextDir()}>\n <wm-button\n button-type={this.internalButtonType}\n tooltip={this.tooltip}\n custom-background={this.darkMode ? \"dark\" : undefined}\n label-for-identical-buttons={this.labelForIdenticalButtons}\n icon={this.tempActionMenuType === \"icon\" ? \"f1d9\" : \"\"}\n id={`menubtn-${this.uid}`}\n onClick={() => (this.isExpanded ? this.close() : this.open())}\n onBlur={(ev) => this.handleButtonBlur(ev)}\n disabled={this.disabled}\n ref={(el) => (this.wmButtonEl = el as HTMLWmButtonElement)}\n tooltip-position={this.tooltipPosition || this.horizontalPosition}\n aria-haspopup=\"true\"\n aria-expanded={this.isExpanded ? \"true\" : \"false\"}\n aria-controls={`menu-${this.uid}`}\n >\n {this.buttonText}\n </wm-button>\n <div\n class={`dropdown ${this.openUp ? \"open-up\" : \"\"} ${this.horizontalPosition} ${\n this.isExpanded ? \"open\" : \"\"\n } hidden`}\n id={`menu-${this.uid}`}\n tabindex={-1}\n role=\"menu\"\n ref={(el) => (this.itemsEl = el)}\n >\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n",":host,\nwm-menuitem {\n contain: content;\n font-family: inherit;\n\n .wrapper {\n display: block;\n min-width: rem-calc(140);\n cursor: pointer;\n padding: rem-calc(20);\n border-radius: 0px 0px 0px 0px;\n background: #fff;\n font-family: inherit;\n font-weight: 500;\n list-style: none;\n border-bottom: 2px solid rgba(#2e1b46, 0.05);\n color: $button-default-text;\n font-weight: 700;\n\n &:focus,\n &.focus {\n outline: none;\n background: #f4f3f6;\n }\n\n &:hover {\n background: #f4f3f6;\n outline: none;\n }\n\n .description {\n color: $charcoal;\n font-size: rem-calc(14);\n padding-top: rem-calc(8);\n white-space: normal;\n font-weight: 400;\n }\n\n &[aria-disabled=\"true\"] {\n font-style: italic;\n color: #6b6b6b;\n }\n\n &:not(:last-child) {\n border-bottom: 2px solid rgba(#2e1b46, 0.05);\n }\n }\n\n ::slotted {\n font-family: inherit;\n }\n\n .mdi {\n @include mdi-icon;\n display: inline-block;\n margin-right: rem-calc(10);\n pointer-events: none;\n }\n}\n\n:host(:focus),\nwm-menuitem:focus {\n outline: none;\n background: #f4f3f6;\n}\n\n//Set pointer events to none on host and element in shadow dom to disable menuitem\n:host([aria-disabled=\"true\"]),\nwm-menuitem[aria-disabled=\"true\"] {\n pointer-events: none;\n}\n","import { h, Component, Element, Event, EventEmitter, Listen, Prop, State, Host, Watch } from \"@stencil/core\";\nimport { getIconCodeFromName } from \"../../global/interfaces\";\n\n@Component({\n tag: \"wm-menuitem\",\n styleUrl: \"wm-menuitem.scss\",\n shadow: true,\n})\nexport class Menuitem {\n @Element() el!: HTMLWmMenuitemElement;\n private iconEl?: HTMLSpanElement;\n\n @Prop() disabled = false;\n @Prop() focused = false;\n @Prop({ mutable: true }) icon?: string = undefined;\n @Prop() description?: string = undefined;\n\n @Event() wmMenuitemClicked!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmKeyUpPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmKeyDownPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmEscKeyPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmHomeKeyPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmEndKeyPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmPageDownItems!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmPageUpItems!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmTabKeyPressed!: EventEmitter<HTMLWmMenuitemElement>;\n @Event() wmLetterPressed!: EventEmitter;\n @Event() wmMenuitemBlurred!: EventEmitter<{ relatedTarget: EventTarget | null }>;\n private onClickFunc!: (this: GlobalEventHandlers, ev: MouseEvent) => any;\n private descriptionCharLimit = 100;\n\n @State() isKeying: boolean = false;\n\n @Listen(\"wmUserIsKeying\", { target: \"window\" })\n @Listen(\"wmUserIsTabbing\", { target: \"window\" })\n toggleKeyingOn() {\n this.isKeying = true;\n }\n\n @Listen(\"wmUserIsNotKeying\", { target: \"window\" })\n @Listen(\"wmUserIsNotTabbing\", { target: \"window\" })\n toggleKeyingOff() {\n this.isKeying = false;\n }\n\n @Listen(\"keydown\")\n handleKeydown(ev: KeyboardEvent) {\n const modifierKeyUsed = ev.altKey || ev.ctrlKey || ev.metaKey;\n const isSingleCharacter = /^.$/.test(ev.key);\n const isCharacterEntry = isSingleCharacter && !modifierKeyUsed;\n switch (ev.key) {\n case \"ArrowUp\":\n ev.preventDefault();\n this.wmKeyUpPressed.emit(this.el as HTMLWmMenuitemElement);\n break;\n case \"ArrowDown\":\n ev.preventDefault();\n this.wmKeyDownPressed.emit(this.el as HTMLWmMenuitemElement);\n break;\n case \"Enter\":\n ev.preventDefault();\n if (!this.disabled) {\n this.el.click();\n }\n break;\n case \"Escape\":\n ev.preventDefault();\n ev.stopPropagation(); // prevents closing of parent modal\n this.wmEscKeyPressed.emit();\n break;\n case \"Home\":\n ev.preventDefault();\n this.wmHomeKeyPressed.emit();\n break;\n case \"End\":\n ev.preventDefault();\n this.wmEndKeyPressed.emit();\n break;\n case \"Tab\":\n this.wmTabKeyPressed.emit();\n break;\n default:\n if (isCharacterEntry) {\n ev.preventDefault();\n this.wmLetterPressed.emit(ev.key);\n }\n }\n }\n\n @Listen(\"click\")\n handleClick() {\n if (!this.disabled) {\n this.wmMenuitemClicked.emit();\n }\n }\n\n @Listen(\"blur\")\n handleBlur(ev: FocusEvent) {\n this.wmMenuitemBlurred.emit({ relatedTarget: ev.relatedTarget });\n }\n\n @Watch(\"disabled\")\n setOnClick() {\n if (this.disabled && this.el.onclick) {\n this.onClickFunc = this.el.onclick;\n this.el.onclick = null;\n } else if (!this.disabled && this.onClickFunc) {\n this.el.onclick = this.onClickFunc;\n }\n }\n\n componentWillLoad() {\n if (this.icon) {\n // in case a name was passed instead of a code, convert it to code (for backwards compatibility)\n this.icon = getIconCodeFromName(this.icon);\n }\n\n if (this.description) {\n if (this.description.length > this.descriptionCharLimit) {\n console.error(`wm-menuitem description is above the character limit of ${this.descriptionCharLimit}`);\n }\n if (this.icon) {\n console.error(\"wm-menuitems with descriptions do not support the use of icons\");\n }\n }\n\n this.setOnClick();\n }\n\n componentDidLoad() {\n if (this.icon) {\n this.iconEl!.classList.add(\"mdi\");\n this.iconEl!.innerHTML = `&#x${this.icon};`;\n }\n }\n\n render() {\n return (\n <Host tabindex={-1} role=\"menuitem\" aria-disabled={this.disabled ? \"true\" : null}>\n <div\n class={`wrapper ${this.focused && this.isKeying ? \"focus\" : \"\"}`}\n aria-disabled={this.disabled ? \"true\" : null}\n >\n <span ref={(el) => (this.iconEl = el)} />\n <slot />\n {this.description ? <div class=\"description\">{this.description}</div> : \"\"}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmModalHeaderCss","ModalHeader","this","closeTooltipMessage","intl","formatMessage","id","defaultMessage","description","componentWillLoad","uid","el","parentElement","addEventListener","closeButtonEl","focus","emitParentCloseEvent","parentModal","emitCloseEvent","render","h","Host","class","heading","subheading","icon","tooltip","ref","onClick"],"sources":["./src/components/wm-modal/wm-modal-header.scss?tag=wm-modal-header","./src/components/wm-modal/wm-modal-header.tsx"],"sourcesContent":["wm-modal-header {\n @include border-radius(5px 5px 0 0px);\n //Fix for Chrome sometimes leaving space between header and content, making the overlay show through\n margin-bottom: -1px;\n\n .wm-wrapper {\n @include displayFlex();\n @include justifyContent(space-between);\n @include alignItems(center);\n\n .title {\n margin: 0;\n font-weight: 600;\n font-size: rem-calc(18);\n color: rgb(74, 74, 74);\n line-height: normal;\n\n .subtitle {\n display: block;\n font-size: rem-calc(14);\n font-weight: normal;\n }\n\n &:focus {\n outline: none;\n }\n }\n }\n}\n","import { h, Component, Element, Prop, Host } from \"@stencil/core\";\nimport { intl } from \"../../global/functions\";\n\n@Component({\n tag: \"wm-modal-header\",\n styleUrl: \"wm-modal-header.scss\",\n})\nexport class ModalHeader {\n @Element() el!: HTMLElement;\n private closeButtonEl!: HTMLElement;\n\n @Prop() heading?: string = \"\";\n @Prop() subheading?: string = \"\";\n private uid!: string;\n\n private closeTooltipMessage: string = intl.formatMessage({\n id: \"global.closeVerb\",\n defaultMessage: \"Close\",\n description: \"For a button, to close a user interface element\",\n });\n\n componentWillLoad() {\n this.uid = (this.el.parentElement as HTMLWmModalElement).uid;\n\n // Trap focus when user tabs past last element in modal\n // NB @Listen doesn't allow to listen on a specific element (the parent modal)\n // if we listen to the whole doc each modal on the page reacts to every event\n this.el.parentElement!.addEventListener(\"focusFirstElement\", () => {\n this.closeButtonEl.focus();\n });\n }\n\n emitParentCloseEvent() {\n const parentModal = this.el.parentElement;\n //@ts-ignore\n parentModal.emitCloseEvent();\n }\n\n // @Listen(\"click\")\n // directFocusOnClick() {\n // this.headingElement.tabIndex = 0;\n // this.headingElement.focus();\n // }\n\n render() {\n return (\n <Host>\n <div class=\"wm-wrapper\">\n <div>\n <h2\n class=\"title\"\n id={`wm-modal-heading-text-${this.uid}`}\n // ref={el => (this.headingElement = el as HTMLElement)}\n // onBlur={() => (this.headingElement.tabIndex = -1)}\n >\n {this.heading}\n <span class=\"subtitle\">{this.subheading}</span>\n </h2>\n </div>\n <wm-button\n button-type=\"navigational\"\n icon=\"f156\"\n tooltip={this.closeTooltipMessage}\n tooltip-position=\"left\"\n id={`wm-modal-close-${this.uid}`}\n ref={(el) => (this.closeButtonEl = el as HTMLElement)}\n onClick={() => this.emitParentCloseEvent()}\n />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"6FAAA,MAAMA,EAAmB,ouB,MCOZC,EAAW,M,yBAQdC,KAAAC,oBAA8BC,EAAKC,cAAc,CACvDC,GAAI,mBACJC,eAAgB,QAChBC,YAAa,oD,aAPY,G,gBACG,E,CAS9BC,oBACEP,KAAKQ,IAAOR,KAAKS,GAAGC,cAAqCF,IAKzDR,KAAKS,GAAGC,cAAeC,iBAAiB,qBAAqB,KAC3DX,KAAKY,cAAcC,OAAO,G,CAI9BC,uBACE,MAAMC,EAAcf,KAAKS,GAAGC,cAE5BK,EAAYC,gB,CASdC,SACE,OACEC,EAACC,EAAI,KACHD,EAAA,OAAKE,MAAM,cACTF,EAAA,WACEA,EAAA,MACEE,MAAM,QACNhB,GAAI,yBAAyBJ,KAAKQ,OAIjCR,KAAKqB,QACNH,EAAA,QAAME,MAAM,YAAYpB,KAAKsB,cAGjCJ,EAAA,2BACc,eACZK,KAAK,OACLC,QAASxB,KAAKC,oBAAmB,mBAChB,OACjBG,GAAI,kBAAkBJ,KAAKQ,MAC3BiB,IAAMhB,GAAQT,KAAKY,cAAgBH,EACnCiB,QAAS,IAAM1B,KAAKc,0B"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["getIconCodeFromName","icon","iconCodes","close","pencil","cancel","check","delete","magnify","export","defaultMode","getWmMode","ref","getAttribute","document","documentElement"],"sources":["./src/global/interfaces.ts"],"sourcesContent":["export type Notification = {\n message: string;\n id: string;\n link: string;\n newWindow: boolean;\n};\n\n// Create label for icon-only buttons\nexport type label = string | undefined;\n\nexport type CssClassMap = { [className: string]: boolean };\n\ninterface IconLabels {\n [index: string]: string;\n}\n\nexport type Product = {\n description?: string;\n samlLinkUrl?: string;\n iconUrl: string;\n id: string;\n linkUrl: string;\n name: string;\n};\n\n// products retrieved from endpoint:\nexport type NavigatorPayload = {\n connection_name?: string;\n current_product_id: string;\n email: string;\n logout_url: string;\n products: Product[];\n};\n\nexport type validButtonTypes =\n | \"primary\"\n | \"secondary\"\n | \"textonly\"\n | \"icononly\"\n | \"navigational\"\n | \"selector\"\n | \"selector-primary\"\n | \"pairpositive\"\n | \"pairnegative\";\n\n//List of icon codes with more indicative descriptors to create labels for icon-only buttons\nexport const iconLabels: IconLabels = {\n f156: \"Close\",\n f3eb: \"Edit\",\n f739: \"Cancel\",\n f12c: \"Save\",\n f1c0: \"Delete\",\n f349: \"Search\",\n f207: \"Export info\",\n f1d9: \"Open dropdown\",\n f04d: \"Go back\",\n f054: \"Go forward\",\n f141: \"Left\",\n f142: \"Right\",\n f35e: \"Menu left\",\n f35d: \"Toggle menu down\",\n f30d: \"Backspace\",\n f645: \"Sort hierarchically\",\n f4bb: \"Sort alphabetically\",\n};\n\n// For backwards compatibility, the icon prop accepts the icon name minus mdi- prefix, e.g. \"icon\"\n// this function converts the name to the corresponding code or returns what it was passed\ninterface IconCodes {\n [index: string]: string;\n}\nexport function getIconCodeFromName(icon: string): string {\n return iconCodes[icon] || icon;\n}\n\nconst iconCodes: IconCodes = {\n close: \"f156\",\n pencil: \"f3eb\",\n cancel: \"f739\",\n check: \"f12c\",\n delete: \"f1c0\",\n magnify: \"f349\",\n export: \"f207\",\n \"dots-vertical\": \"f1d9\",\n \"arrow-left\": \"f04d\",\n \"arrow-right\": \"f054\",\n \"chevron-left\": \"f141\",\n \"chevron-right\": \"f142\",\n \"menu-left\": \"f35e\",\n \"menu-down\": \"f35d\",\n \"keyboard-backspace\": \"f30d\",\n \"file-tree\": \"f645\",\n \"sort-alphabetical\": \"f4bb\",\n \"checkbox-marked-circle\": \"f133\",\n \"account-settings\": \"f630\",\n \"backup-restore\": \"f06f\",\n};\n\nexport const defaultMode = \"planning\";\n\nexport const getWmMode = (ref?: any) => {\n return ref.getAttribute(\"mode\") || document.documentElement.getAttribute(\"mode\") || defaultMode;\n};\n\nexport type TooltipPlacement =\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"top-right\"\n | \"top-left\";\n\nexport type SliceElement = (SVGElement | HTMLElement);\n\nexport type SliceDetails = {\n amount: number;\n perc: number;\n legend: string | null;\n color: string;\n offset: number;\n id: string;\n title: string | null;\n text: string | null;\n buttonText: string | null;\n sliceRef: Element;\n inSmallCluster: boolean;\n coords?: {x: number, y: number};\n};\n\nexport type ChartDetails = {\n size: number;\n colors: Array<string>;\n thickness?: number;\n padding: number;\n category: \"doughnut\" | \"stackedBar\" | \"simpleBar\";\n};\n\nexport type ChartType =\n // progress monitor types\n | \"doughnut\"\n | \"bar\"\n // chart types\n | \"doughnut1\"\n | \"doughnut2\"\n | \"doughnut2plus\"\n | \"doughnut3\"\n | \"bar2\"\n | \"bar3\"\n | \"bar4\"\n | \"bar5\"\n | \"bar6\"\n | \"bar7\"\n // deprecated\n | \"doughnut0\"\n | \"bar1\";\n\nexport type LegendItem = { key: string; color: string };\n\nexport type UploadedFile = {\n name: string;\n id: string;\n type: string;\n lastUpdated: string; // in display format\n progress?: number;\n fileActions?: string;\n size?: string; // in display format\n};\n"],"mappings":"SAuEgBA,EAAoBC,GAClC,OAAOC,EAAUD,IAASA,CAC5B,CAEA,MAAMC,EAAuB,CAC3BC,MAAO,OACPC,OAAQ,OACRC,OAAQ,OACRC,MAAO,OACPC,OAAQ,OACRC,QAAS,OACTC,OAAQ,OACR,gBAAiB,OACjB,aAAc,OACd,cAAe,OACf,eAAgB,OAChB,gBAAiB,OACjB,YAAa,OACb,YAAa,OACb,qBAAsB,OACtB,YAAa,OACb,oBAAqB,OACrB,yBAA0B,OAC1B,mBAAoB,OACpB,iBAAkB,QAGb,MAAMC,EAAc,W,MAEdC,EAAaC,GACjBA,EAAIC,aAAa,SAAWC,SAASC,gBAAgBF,aAAa,SAAWH,S"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmDatepickerCss","DatePicker","exports","this","lastCommittedValue","value","parsableEntry","isoEntry","eightDigitsEntry","dateFormats","US","intl","formatMessage","id","defaultMessage","INT","ISO","class_1","prototype","handleTabbingOn","dpWrapper","classList","add","handleTabbingOff","remove","handleError","errorMessage","generateError","clearError","processInput","handleInput","ev","target","handleBlur","shouldPreventValidation","preventValidation","isRelatedTarget","focusHandler","handlePopupBlurred","detail","relatedTarget","el","event","CustomEvent","dispatchEvent","getActiveElement","checkForFocusableElInShadow","document","activeElement","handleCellTriggered","dateElement","isoDate","getAttribute","textContent","inputEl","reformatDate","dateFormat","isFirstLoad","leftEmpty","requiredField","test","addSlashes","isValidDate","length","lastValidValue","wmDatepickerNewValidValue","emit","toFormat","date","dateArr","replace","split","padStart","join","input","parts","day","parseInt","month","year","monthLength","requiredDateErr","requiredFieldMessage","validDateErr","toLowerCase","displayError","substring","componentWillLoad","label","console","error","uid","generateId","componentDidLoad","render","_this","h","Host","class","concat","invalid","ref","d","labelPosition","htmlFor","title","disabled","type","name","placeholder","onFocus","bind","onInput","onBlur","Date","parentId"],"sources":["src/components/wm-datepicker/wm-datepicker.scss?tag=wm-datepicker&encapsulation=shadow","src/components/wm-datepicker/wm-datepicker.tsx"],"sourcesContent":[":host,\nwm-datepicker {\n font-family: inherit;\n\n * {\n box-sizing: border-box;\n }\n\n @include label;\n\n .wrapper {\n position: relative;\n\n .required {\n color: $datepicker-required-input;\n }\n\n .inner-wrapper {\n @include displayFlex();\n align-items: center;\n height: rem-calc(40);\n border: 1px solid;\n border-color: $datepicker-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 .date-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\n &:disabled {\n background-color: $input-disabled-bg;\n color: $input-disabled-color;\n }\n\n &:focus {\n outline: none;\n }\n }\n }\n\n &.invalid {\n .inner-wrapper {\n @include invalid;\n }\n\n .error {\n margin-top: 4px;\n margin-bottom: 4px;\n display: block;\n top: 100%;\n left: 0;\n font-style: italic;\n font-size: rem-calc(14);\n color: $error-color;\n }\n }\n\n &.focus {\n .inner-wrapper {\n @include field-focus;\n }\n }\n }\n\n .user-is-tabbing {\n .toggle:focus {\n &:not(:active) {\n border: none;\n z-index: 11;\n }\n }\n }\n}\n","import { h, Component, Host, Element, Event, EventEmitter, Prop, Listen, Watch, State } from \"@stencil/core\";\nimport { generateId, checkForFocusableElInShadow, intl, isRelatedTarget } from \"../../global/functions\";\n\n@Component({\n tag: \"wm-datepicker\",\n styleUrl: \"wm-datepicker.scss\",\n shadow: { delegatesFocus: true },\n})\nexport class DatePicker {\n @Element() el!: HTMLWmDatepickerElement;\n private dpWrapper!: HTMLDivElement;\n private inputEl!: HTMLInputElement;\n\n @Prop({ mutable: true }) value?: string = \"\";\n @Prop() disabled: boolean = false;\n @Prop({ mutable: true }) dateFormat: string = \"US\";\n @Prop({ reflect: true }) errorMessage: string = \"\";\n @Prop({ mutable: true }) labelPosition: \"top\" | \"left\" | \"none\" = \"top\";\n @Prop({ mutable: true }) label: string = \"\";\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() displayError: string = \"\";\n @Event() wmDatepickerNewValidValue!: EventEmitter;\n\n // we only want to fire the \"change\" event if the value has actually changed (that's\n // how native elements do it), so we need to keep in state the last committed value.\n private lastCommittedValue?: string = this.value;\n private lastValidValue?: string;\n private uid!: string;\n\n // 1, 2, or 4 digits, separator, 1 or 2 digits, separator, then 1 or 2 or 4 digits\n private parsableEntry = /^(\\d{1}|\\d{2}|\\d{4})[\\-\\.\\/]\\d{1,2}[\\-\\.\\/](\\d{1}|\\d{2}|\\d{4})$/;\n private isoEntry = /^\\d\\d\\d\\d[-]\\d\\d[-]\\d\\d$/;\n private eightDigitsEntry = /^\\d{8}$/;\n\n dateFormats: any = {\n US: intl.formatMessage({\n id: \"date.formatUS\",\n defaultMessage: \"mm/dd/yyyy\",\n }),\n INT: intl.formatMessage({\n id: \"date.formatINT\",\n defaultMessage: \"dd/mm/yyyy\",\n }),\n ISO: intl.formatMessage({\n id: \"date.formatISO\",\n defaultMessage: \"yyyy/mm/dd\",\n }),\n };\n\n @Listen(\"keydown\")\n handleTabbingOn() {\n this.dpWrapper && this.dpWrapper.classList.add(\"user-is-tabbing\");\n }\n\n @Listen(\"click\")\n handleTabbingOff() {\n this.dpWrapper && this.dpWrapper.classList.remove(\"user-is-tabbing\");\n }\n\n @Watch(\"errorMessage\")\n handleError() {\n if (this.errorMessage) {\n this.generateError();\n } else {\n this.clearError();\n this.processInput();\n }\n }\n\n handleInput(ev: Event) {\n // keep component's value in sync with input's value\n // validation only happens on blur and initial load,\n // but component's value should reflect user input at any time\n this.value = (ev.target! as HTMLInputElement).value; // same as this.inputEl.value\n }\n\n // this is input blur, not component blur\n handleBlur(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.dpWrapper.classList.remove(\"focus\");\n }\n\n // this is input focus, not component focus\n focusHandler() {\n this.dpWrapper.classList.add(\"focus\");\n }\n\n @Listen(\"popupBlurred\")\n handlePopupBlurred(ev: CustomEvent) {\n // emit blur event when leaving component from priv-datepicker\n if (ev.detail.relatedTarget !== this.el) {\n const event = new CustomEvent(\"blur\");\n // @ts-ignore\n event.relatedTarget = ev.detail.relatedTarget;\n this.el.dispatchEvent(event);\n }\n }\n\n getActiveElement() {\n return checkForFocusableElInShadow(document.activeElement as HTMLElement);\n }\n\n @Listen(\"cellTriggered\")\n handleCellTriggered(ev: CustomEvent) {\n let dateElement = ev.detail as HTMLTableCellElement;\n let isoDate =\n dateElement.getAttribute(\"data-year\")! +\n \"-\" +\n dateElement.getAttribute(\"data-month\")! +\n \"-\" +\n dateElement.textContent!;\n this.inputEl.value = this.reformatDate(this.dateFormat, isoDate);\n this.processInput();\n\n // Create event to trigger onInput function on host element, to get the updated value\n // Because there are more ways to input than just typing, we are firing this event upon cellTriggered\n const event = new CustomEvent(\"input\");\n this.el.dispatchEvent(event);\n }\n\n processInput(isFirstLoad?: boolean) {\n // The required field error should not display on first load\n const leftEmpty = !isFirstLoad && this.requiredField;\n\n let isoDate = this.inputEl.value;\n\n //If input is 8 digits, add slashes as a courtesy and process anyway\n if (this.eightDigitsEntry.test(this.inputEl.value)) {\n this.inputEl.value = this.addSlashes(this.inputEl.value);\n }\n\n // if we don't have 2 separators we can't reformat so we'll return what was passed in\n if (this.parsableEntry.test(this.inputEl.value)) {\n //ISO format for submission\n isoDate = this.reformatDate(\"ISO\", this.inputEl.value);\n\n //User-specific format for display\n this.inputEl.value = this.reformatDate(this.dateFormat, isoDate);\n\n if (this.isValidDate(isoDate)) {\n //If there's no errorMessage on state, all errors can be cleared. If there IS an error message, it will clear any internal validation errors by overriding them.\n if (this.errorMessage) {\n this.generateError();\n } else {\n this.clearError();\n }\n //Prevents error from appearing if input field is empty\n } else if (this.inputEl.value.length) {\n this.generateError();\n }\n } else if (this.inputEl.value.length || leftEmpty || this.errorMessage) {\n this.generateError();\n } else if (!this.inputEl.value.length && !leftEmpty) {\n this.clearError();\n }\n\n if (isoDate !== this.lastCommittedValue) {\n // value is set to the reformated date or whatever the user passed\n this.value = isoDate;\n const event = new CustomEvent(\"change\");\n this.el.dispatchEvent(event);\n this.lastCommittedValue = this.value;\n }\n\n // event must fire after we set this.value\n // only fire if new valid value is different from the previous one\n if (this.isValidDate(isoDate) && isoDate !== this.lastValidValue) {\n this.wmDatepickerNewValidValue.emit();\n //Update prop passed into calendar to valid date\n this.lastValidValue = isoDate;\n }\n }\n\n // this function reformats date strings to/from the storage format ONLY. US -> INT and vice versa is not supported.\n reformatDate(toFormat: string, date?: string): string {\n if (!date) {\n return \"\";\n } else if (!this.parsableEntry.test(date)) {\n return date;\n } else {\n let dateArr = date.replace(/[\\-\\.]/gi, \"/\").split(\"/\");\n switch (toFormat) {\n case \"US\":\n case this.dateFormats[\"US\"]:\n return dateArr[1].padStart(2, \"0\") + \"/\" + dateArr[2].padStart(2, \"0\") + \"/\" + dateArr[0].padStart(4, \"20\");\n case \"INT\":\n case this.dateFormats[\"INT\"]:\n return dateArr[2].padStart(2, \"0\") + \"/\" + dateArr[1].padStart(2, \"0\") + \"/\" + dateArr[0].padStart(4, \"20\");\n case \"ISO\":\n case this.dateFormats[\"ISO\"]:\n if (this.dateFormat === \"US\" || this.dateFormat === this.dateFormats[\"US\"]) {\n return dateArr[2].padStart(4, \"20\") + \"-\" + dateArr[0].padStart(2, \"0\") + \"-\" + dateArr[1].padStart(2, \"0\");\n } else if (this.dateFormat === \"INT\" || this.dateFormat === this.dateFormats[\"INT\"]) {\n return dateArr[2].padStart(4, \"20\") + \"-\" + dateArr[1].padStart(2, \"0\") + \"-\" + dateArr[0].padStart(2, \"0\");\n } else if (this.dateFormat === \"ISO\" || this.dateFormat === this.dateFormats[\"ISO\"]) {\n return dateArr[0].padStart(4, \"20\") + \"-\" + dateArr[1].padStart(2, \"0\") + \"-\" + dateArr[2].padStart(2, \"0\");\n }\n default:\n return dateArr.join(\"/\");\n }\n }\n }\n\n isValidDate(input?: string) {\n // if it's not ISO it's not valid\n if (!input || !this.isoEntry.test(input)) {\n return false;\n } else {\n // Parse the ISO date parts to integers\n let parts = input.split(\"-\");\n let day = parseInt(parts[2], 10);\n let month = parseInt(parts[1], 10);\n let year = parseInt(parts[0], 10);\n // Check the ranges of month and year\n if (year < 1000 || year > 3000 || month == 0 || month > 12) return false;\n let monthLength = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n // Adjust for leap years\n if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) monthLength[1] = 29;\n // Check the range of the day\n return day > 0 && day <= monthLength[month - 1];\n }\n }\n\n generateError() {\n const requiredDateErr: string =\n this.requiredFieldMessage ||\n intl.formatMessage({\n id: \"date.requiredDateError\",\n defaultMessage: \"A date is required.\",\n });\n const validDateErr = intl.formatMessage(\n {\n id: \"date.invalidDate\",\n defaultMessage:\n \"Please enter a valid date in the format {dateFormat, select, us {mm/dd/yyyy} int {dd/mm/yyyy} other {yyyy/mm/dd}}.\",\n },\n { dateFormat: this.dateFormat.toLowerCase() }\n );\n if (this.errorMessage) {\n this.displayError = this.errorMessage;\n } else if (this.inputEl.value.length) {\n this.displayError = validDateErr;\n } else if (!this.inputEl.value.length && this.requiredField) {\n this.displayError = requiredDateErr;\n }\n }\n\n clearError() {\n this.displayError = \"\";\n }\n\n addSlashes(input: string) {\n if (this.dateFormat === \"ISO\" || this.dateFormat === this.dateFormats[\"ISO\"]) {\n return input.substring(0, 4) + \"/\" + input.substring(4, 6) + \"/\" + input.substring(6);\n } else {\n return input.substring(0, 2) + \"/\" + input.substring(2, 4) + \"/\" + input.substring(4);\n }\n }\n\n componentWillLoad() {\n if (this.label === \"\") {\n console.error(\n \"You must include a label prop for the datepicker input (for accessibility reasons), even if the label position is none.\"\n );\n }\n if (this.errorMessage) {\n this.generateError();\n }\n\n this.uid = this.el.id ? this.el.id : generateId();\n\n if (this.value && this.isValidDate(this.value)) {\n // update value passed into calendar so that it opens on the specified date\n this.lastValidValue = this.value;\n }\n }\n\n componentDidLoad() {\n // convert passed-in starting date from ISO to locale format, update displayed input to proper format\n this.inputEl.value = this.reformatDate(this.dateFormat, this.value);\n this.processInput(true);\n }\n\n render() {\n const dateFormat = intl.formatMessage(\n {\n id: \"date.format\",\n defaultMessage: \"{dateFormat, select, us {mm/dd/yyyy} int {dd/mm/yyyy} other {yyyy/mm/dd}}\",\n },\n { dateFormat: this.dateFormat.toLowerCase() }\n );\n return (\n <Host\n id={this.uid}\n aria-busy=\"false\"\n class={`${this.displayError ? \"invalid\" : \"\"}`}\n invalid={this.displayError ? \"true\" : null}\n >\n <div\n ref={(d) => (this.dpWrapper = d as HTMLDivElement)}\n class={`wrapper label-${this.labelPosition} ${this.displayError ? \"invalid\" : \"\"}`}\n >\n <div class=\"label-wrapper\">\n {this.labelPosition !== \"none\" && (\n <label\n id={`datepickerLabel-${this.uid}`}\n htmlFor={`date-input-${this.uid}`}\n class=\"label\"\n title={`${this.label} (${dateFormat})`}\n >\n {this.label}\n {this.requiredField && (\n <span aria-hidden=\"true\" class=\"required\">\n *\n </span>\n )}\n </label>\n )}\n </div>\n <div>\n <div class=\"inner-wrapper\">\n <input\n disabled={this.disabled}\n type=\"text\"\n id={`date-input-${this.uid}`}\n class=\"date-input\"\n name=\"date\"\n placeholder={dateFormat}\n onFocus={this.focusHandler.bind(this)}\n onInput={(ev) => this.handleInput(ev)}\n onBlur={(ev) => this.handleBlur(ev)}\n ref={(input) => (this.inputEl = input as HTMLInputElement)}\n aria-describedby={`error-${this.uid}`}\n aria-controls={`popup-${this.uid}`}\n aria-label={this.label}\n aria-required={this.requiredField ? \"true\" : null}\n />\n <priv-datepicker\n disabled={this.disabled}\n date={this.lastValidValue ? new Date(this.lastValidValue) : new Date()}\n parentId={this.uid}\n />\n </div>\n <div id={`error-${this.uid}`} class=\"error\" aria-live=\"assertive\" aria-atomic=\"true\">\n {this.displayError}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmNetworkUploaderCss","NetworkUploader","exports","this","inputId","generateId","class_1","prototype","toggleTabbingOn","isTabbing","toggleTabbingOff","handleUploadProgress","ev","_this","inProgressList","map","i","name","detail","file_name","progress","forceUpdate","el","numFilesInProgress","srProgress","total_1","setInterval","aggregate","reduce","avg","item","liveRegion","innerHTML","intl","formatMessage","id","defaultMessage","percentage","Math","floor","handleFinishedSnack","snackbar","filter","n","setMaxSize","maxSize","uploadNotifications","newNum","oldNum","setTimeout","notif","message","clearInterval","num","emitFileListEvent","wmNetworkUploaderFilesChanged","emit","fileList","formatDate","isoDate","locale","timezone","timestamp","Date","parse","match","Intl","getCanonicalLocales","_a","date","year","getFullYear","month","getMonth","substr","day","getDate","time","toLocaleTimeString","timeZone","hour","minute","concat","isValidSize","size","isDuplicate","find","f","isEmpty","length","errorList","Object","defineProperty","isMax","maxFiles","errMessage","description","purgeProgressList","getExistingFiles","getRequest","getPath","then","reply","sortBy","sort","a","b","localeCompare","catch","errStatus","console","error","clearErrors","handleFiles","files","Array","from","target","validTypes","fileTypes","split","join","file","hasValidType","push","uploadFile","value","requestUploadPath","toString","__awaiter","assData","JSON","associatedData","fileInfo","assign","mime_type","type","file_path","path","document_uuid","guid","onProgress","lengthComputable","total","loaded","event","CustomEvent","dispatchEvent","putRequest","url","_b","sent","postRequest","uploadPath","err","downloadFile","uuid","payload","file_uuid","requestDownloadPath","window","location","deleteFile","fileName","link","deleteRequest","deletePath","componentWillLoad","Error","buttonText","emptyStateText","componentDidLoad","document","body","classList","contains","uploadButtonOnClick","isDisabled","preventDefault","errMsg_1","Promise","resolve","renderUploadSvg","h","class","width","height","viewBox","transform","fill","d","renderIcon","rotate","icon","String","fromCodePoint","parseInt","renderNotif","renderUploadButton","classes","multiple","onClick","onChange","e","htmlFor","renderWithItems","renderErrorList","renderInProgressList","renderFileList","renderEmptyState","srMessage","acc","style","background","renderFile","updated_at","DateTimeFormat","resolvedOptions","tooltip","render","Host","notifications","stringify","ref"],"sources":["src/components/wm-uploader/wm-network-uploader/wm-network-uploader.scss?tag=wm-network-uploader&encapsulation=shadow","src/components/wm-uploader/wm-network-uploader/wm-network-uploader.tsx"],"sourcesContent":[":host,\nwm-network-uploader {\n width: 100%;\n position: relative;\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-network-uploader * {\n box-sizing: border-box;\n}\n\n.sr-only {\n @include srOnly;\n}\n\n.header {\n position: relative;\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n\n .notif-wrapper {\n align-items: flex-end;\n }\n}\n\n.notif-wrapper {\n display: flex;\n align-items: flex-start; // for .notif\n height: -moz-fit-content;\n height: fit-content;\n flex-direction: column; // for.notif\n align-items: center; // for.notif\n .notif {\n font-size: 0.875rem;\n font-style: italic;\n margin-top: rem-calc(4);\n }\n}\n\n@media (max-width: rem-calc(975)) {\n .descr {\n margin-bottom: rem-calc(8);\n }\n .notif-wrapper {\n margin-bottom: rem-calc(16);\n }\n .header {\n .notif-wrapper {\n align-items: flex-start;\n }\n }\n}\n\n.file-info {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n\n + .file-controls {\n flex: none;\n margin-left: rem-calc(16);\n }\n}\n\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: 1.5rem;\n margin-bottom: rem-calc(7);\n }\n\n .notif-wrapper {\n justify-content: center;\n\n .wm-button {\n // Removing the width inherit here to prevent a 100% width\n // from the notif-wrapper. Future proofing a day when\n // we might want a long notif to wrap.\n width: auto;\n }\n }\n}\n\nul {\n list-style: none;\n padding: 0;\n width: 100%;\n li {\n font-size: rem-calc(14);\n .file {\n @include border-radius(3px);\n position: relative; // for progress bar\n height: rem-calc(60);\n padding: rem-calc(8 20);\n background: $background;\n border: 1px solid rgb(107, 107, 107);\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n + .file {\n margin-top: rem-calc(20);\n }\n\n .filename {\n font-weight: 500;\n }\n\n .filedate {\n margin-left: rem-calc(60);\n font-weight: normal;\n font-style: italic;\n }\n\n wm-button + wm-button {\n margin-left: rem-calc(16);\n }\n }\n }\n\n &.file-list .file.--saved,\n &.inprogress-list .file {\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\n .progress {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n height: 8px;\n }\n\n &.error-list li {\n margin-bottom: rem-calc(20);\n color: $error-color;\n .file {\n border: 1px solid $error-color;\n background-color: #f5ebea;\n height: rem-calc(60);\n }\n }\n .error-message {\n padding-top: rem-calc(4);\n font-style: italic;\n }\n}\n","import { Component, Element, h, Host, Prop, State, Listen, Watch, Event, EventEmitter } from \"@stencil/core\";\nimport { forceUpdate } from \"@stencil/core\";\nimport { getRequest, postRequest, putRequest, deleteRequest } from \"../../../global/services/http-service\";\nimport { intl, generateId, hasValidType } from \"../../../global/functions\";\n//\n// Web API File interface => for FileList on input element, sending to AWS\n// Custom FileInfo interface (below) => for our server\nexport interface FileInfo {\n file_name: string;\n file_path?: string;\n mime_type: string;\n updated_at?: string;\n\n uuid?: string; // AWS guid\n document_uuid?: string; // aka file uuid. how is that different from the uuid above?\n // organization_uuid: string; // aka node uuid\n}\n\ninterface FileInProgress extends File {\n progress?: number;\n}\n\ninterface ErrorInfo {\n file_name: string;\n message: string;\n}\n\ninterface AWSData {\n url: string;\n updated_at: string;\n path: string;\n guid: string;\n}\n\ninterface Notification {\n message: string;\n id: string;\n link: string;\n}\n\n@Component({\n tag: \"wm-network-uploader\",\n styleUrl: \"wm-network-uploader.scss\",\n shadow: true,\n})\nexport class NetworkUploader {\n @Element() el!: HTMLWmNetworkUploaderElement;\n private liveRegion?: HTMLDivElement;\n\n @State() isTabbing: boolean = false;\n\n @State() fileList: FileInfo[] = [];\n @State() inProgressList: FileInProgress[] = [];\n @State() errorList: ErrorInfo[] = []; // for errors on a particular file\n @State() notif?: { id: number; message: string } | null; // for global errors, e.g. user tries uploading too many files, and upload notifications\n @State() snackbar: Notification[] = [];\n @State() numFilesInProgress?: number | null; // null when not uploading != 0 (when all files are done uploading) != undefined (original state)\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\n @Prop() getPath!: string;\n @Prop() requestUploadPath!: string;\n @Prop() uploadPath!: string; // used for POST request (create db entry)\n @Prop() requestDownloadPath!: string;\n @Prop() deletePath!: string;\n\n @Prop() associatedData?: string;\n @Prop() buttonText!: 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({ mutable: true }) maxSize: number = 100; // in Mb\n @Prop() maxFiles?: number;\n @Prop() sortBy: \"name\" | \"date\" = \"date\"; // name is descending (a -> z), date is ascending (earlier -> later)\n\n @Event() wmNetworkUploaderFilesChanged!: EventEmitter<Object[]>;\n\n private inputId = generateId();\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.inProgressList.map((i) => {\n if (i.name === ev.detail.file_name) {\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.inProgressList.reduce((avg, item) => (item.progress ? avg + item.progress : avg), 0);\n if (this.liveRegion) {\n this.liveRegion.innerHTML = 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(\"userFinishedSnack\")\n handleFinishedSnack(ev: CustomEvent) {\n this.snackbar = this.snackbar.filter((n) => n.id !== ev.detail.id);\n }\n\n @Watch(\"maxSize\")\n setMaxSize() {\n // Max size can't be set above 100Mb\n this.maxSize = this.maxSize > 100 ? 100 : this.maxSize;\n }\n\n @Watch(\"numFilesInProgress\")\n uploadNotifications(newNum: number, oldNum: number) {\n if (oldNum > 0 && newNum === 0) {\n setTimeout(() => {\n this.notif = null;\n }, 20 * 1000);\n const message = intl.formatMessage({\n id: \"uploader.finishedUploading\",\n defaultMessage: \"Finished uploading\",\n });\n this.notif = { id: 5, message };\n if (this.liveRegion) {\n this.liveRegion.innerHTML = message;\n }\n this.numFilesInProgress = null;\n clearInterval(this.srProgress);\n forceUpdate(this.el);\n } else if (newNum > 0 && newNum != oldNum) {\n const message = 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 = { id: 6, message };\n if (this.liveRegion) {\n this.liveRegion.innerHTML = message;\n }\n forceUpdate(this.el);\n }\n }\n\n @Watch(\"fileList\")\n emitFileListEvent() {\n this.wmNetworkUploaderFilesChanged.emit(this.fileList);\n }\n\n formatDate(isoDate: string, locale: string, timezone: string) {\n const timestamp = Date.parse(isoDate);\n if (locale.match(/^[a-zA-Z]*(-[a-zA-Z0-9]*)*$/g)) {\n // make sure locale is valid, otherwise set default locale\n try {\n //@ts-ignore\n Intl.getCanonicalLocales(locale);\n } catch {\n locale = \"en-us\";\n }\n } else {\n return isoDate;\n }\n\n if (!!timestamp) {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = (\"0\" + (date.getMonth() + 1)).substr(-2);\n const day = (\"0\" + date.getDate()).substr(-2);\n const time = date.toLocaleTimeString([locale, \"en-us\"], {\n timeZone: timezone,\n hour: \"numeric\",\n minute: \"numeric\",\n });\n return `${year}/${month}/${day} ${time}`;\n } else {\n return isoDate;\n }\n }\n\n isValidSize(size: number) {\n // https://stackoverflow.com/questions/2365100/converting-bytes-to-megabytes\n return size / 1024 / 1024 <= this.maxSize;\n }\n\n isDuplicate(name: string) {\n return this.fileList.find((f) => f.file_name === name);\n }\n\n isEmpty() {\n return !this.fileList.length && !this.inProgressList.length && !this.errorList.length;\n }\n\n get isDisabled() {\n const isMax = !!this.maxFiles && this.fileList.length >= this.maxFiles;\n\n if (!this.notif) {\n if (isMax) {\n const errMessage = 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 this.notif = { id: 1, message: errMessage };\n if (this.liveRegion) {\n this.liveRegion.innerHTML = errMessage;\n }\n } else {\n this.notif = null;\n }\n } else if (this.notif.id === 1) {\n // to make sure SR don't repeat the error, don't reset it if it already is showing\n // just dismiss it if isMax is not true anymore\n if (!isMax) {\n this.notif = null;\n }\n // finally do nothing if error 2 is showing (special case when user selects too many files)\n }\n // disable if is the uploader is maxed out or if something is uploading\n return isMax || this.numFilesInProgress! > 0;\n }\n\n purgeProgressList(item: FileInfo) {\n // If a file is retrieved from the server because it was just uploaded\n // it should be removed from inProgressList\n this.inProgressList = this.inProgressList.filter((i) => i.progress !== 100 && i.name !== item.file_name);\n }\n\n getExistingFiles() {\n getRequest(this.getPath)\n .then((reply: FileInfo[]) => {\n reply.map((item) => this.purgeProgressList(item));\n if (this.sortBy === \"name\") {\n reply.sort((a, b) => a.file_name.localeCompare(b.file_name));\n }\n this.fileList = reply;\n })\n .catch((errStatus) => {\n console.error(errStatus);\n });\n }\n\n clearErrors() {\n this.errorList = [];\n this.notif = null;\n }\n\n handleFiles(ev: Event) {\n const files = Array.from((ev.target! as HTMLInputElement).files!);\n const validTypes = this.fileTypes.split(\" \").join(\", \");\n\n if (!!this.maxFiles && this.fileList.length + files.length > this.maxFiles) {\n const errMessage = 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 this.notif = { id: 2, message: errMessage };\n if (this.liveRegion) {\n this.liveRegion.innerHTML = errMessage;\n }\n } else {\n // map to create inProgress items so they can be displayed immediately\n files &&\n files.map((file) => {\n if (!hasValidType(file, this.fileTypes)) {\n const error = {\n file_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 (!this.isValidSize(file.size)) {\n const error = {\n file_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.maxSize }\n ),\n };\n this.errorList.push(error);\n } else if (this.isDuplicate(file.name)) {\n const error = {\n file_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.inProgressList.push(file);\n }\n forceUpdate(this.el);\n });\n\n if (this.inProgressList.length > 0) {\n this.numFilesInProgress = this.inProgressList.length;\n\n // map over \"uploadable\" files for actual upload\n // this happens separately otherwise at each pass we'd have to wait for the requests to complete before displaying things\n this.inProgressList.map((file, i) => {\n this.uploadFile(file, i); // = input.files file\n });\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 uploadFile(file: File, i: number) {\n // get upload link\n getRequest(this.requestUploadPath + i.toString())\n .then(async (reply: AWSData) => {\n const assData = JSON.parse(this.associatedData!);\n const fileInfo: FileInfo = {\n ...assData,\n file_name: file.name,\n mime_type: file.type,\n file_path: reply.path,\n document_uuid: reply.guid,\n };\n\n // onProgress is passed as a callback to the ev listener inside putRequest (http service),\n // so we can't change component things directly => custom event to pass data to uploader component.\n const onProgress = (ev: ProgressEvent) => {\n const progress = ev.lengthComputable && ev.total !== 0 ? (ev.loaded / ev.total) * 100 : 0;\n const event = new CustomEvent(\"wmUploadProgress\", {\n detail: { file_name: file.name, progress },\n });\n\n this.el.dispatchEvent(event);\n };\n\n // upload to AWS s3 to url we just fetched\n await putRequest(reply.url, file, onProgress);\n\n // create the db entry\n await postRequest(this.uploadPath, fileInfo);\n\n // get files from server again\n this.getExistingFiles();\n })\n .catch((err) => {\n // do not show toast on error\n this.numFilesInProgress = null;\n // do not show in progress item on error\n this.inProgressList = [];\n this.notif = {\n id: 3,\n message: intl.formatMessage({\n id: \"global.genericError\",\n defaultMessage: \"An error occurred. Please try again.\",\n }),\n };\n console.error(err);\n });\n }\n\n downloadFile(uuid: string, path: string) {\n this.clearErrors();\n\n // POST request to get temporary download link\n const payload = {\n file_path: path,\n file_uuid: uuid,\n };\n postRequest(this.requestDownloadPath, payload)\n .then((reply: { url: string }) => {\n // we got the download link, now download the file\n window.location.assign(reply.url);\n })\n .catch((err) => {\n console.error(err);\n });\n }\n\n deleteFile(file: FileInfo) {\n this.clearErrors();\n\n this.snackbar.push({\n message: intl.formatMessage(\n {\n id: \"uploader.fileDeleted\",\n defaultMessage: \"{fileName} was deleted.\",\n },\n { fileName: file.file_name }\n ),\n id: file.uuid!,\n link: \"\",\n });\n\n // rm file from list immediately.\n this.fileList = this.fileList.filter((i) => i.uuid !== file.uuid);\n\n deleteRequest(`${this.deletePath}/${file.uuid}`).catch((err) => {\n this.notif = {\n id: 4,\n message: intl.formatMessage(\n {\n id: \"uploader.fileNotDeleted\",\n defaultMessage: \"{fileName} could not be deleted.\",\n },\n { fileName: file.file_name }\n ),\n };\n this.getExistingFiles();\n console.error(err);\n });\n }\n\n componentWillLoad() {\n if (!this.getPath) {\n throw new Error(\"wm-network-uploader: get-path is a required prop\");\n }\n if (!this.requestUploadPath) {\n throw new Error(\"wm-network-uploader: request-upload-path is a required prop\");\n }\n if (!this.uploadPath) {\n throw new Error(\"wm-network-uploader: upload-path is a required prop\");\n }\n if (!this.requestDownloadPath) {\n throw new Error(\"wm-network-uploader: request-download-path is a required prop\");\n }\n if (!this.deletePath) {\n throw new Error(\"wm-network-uploader: delete-path is a required prop\");\n }\n if (!this.buttonText) {\n throw new Error(\"wm-network-uploader: button-text is a required prop\");\n }\n if (!this.emptyStateText) {\n throw new Error(\"wm-network-uploader: empty-state-text is a required prop\");\n }\n if (!this.associatedData) {\n throw new Error(\"wm-network-uploader: associated-data is a required prop\");\n }\n\n this.setMaxSize();\n this.clearErrors();\n }\n\n componentDidLoad() {\n this.getExistingFiles();\n\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 // this is not pretty duplicating a intl message + the logic of isDisabled,\n // but not worth a bigger refactor since this is only until we get the UX for disabled elements and refactor all interactive els.\n ev.preventDefault();\n if (this.liveRegion) {\n const isMax = !!this.maxFiles && this.fileList.length >= this.maxFiles;\n let errMsg: string = \"\";\n if (this.numFilesInProgress! > 0) {\n errMsg = 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 } else if (isMax) {\n errMsg = 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 if (errMsg) {\n // clear and set again to re-announce if button is clicked several times\n // (can't be done inside setTimeout because of scope, hence the promise)\n this.liveRegion.innerHTML = \"\";\n new Promise((resolve) => {\n setTimeout(() => {\n resolve(\"\");\n }, 500);\n }).then(() => (this.liveRegion!.innerHTML = errMsg));\n }\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 renderNotif() {\n return this.notif ? <span class=\"notif\">{this.notif.message}</span> : \"\";\n }\n\n renderUploadButton(classes: string) {\n return (\n <div class=\"notif-wrapper\">\n <input\n name={this.inputId}\n id={this.inputId}\n class=\"sr-only\"\n type=\"file\"\n multiple\n onClick={(ev) => this.uploadButtonOnClick(ev)}\n onChange={(e) => this.handleFiles(e)}\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.renderNotif()}\n </div>\n );\n }\n\n renderWithItems() {\n return (\n <div>\n <div class=\"header\">\n <div class=\"descr\">\n <slot />\n </div>\n {this.renderUploadButton(this.isDisabled ? \"disabled\" : \"\")}\n </div>\n {this.renderErrorList()}\n {this.renderInProgressList()}\n {this.renderFileList()}\n </div>\n );\n }\n\n renderEmptyState() {\n return (\n <div>\n <div class=\"header\">\n <div class=\"descr\">\n <slot />\n </div>\n </div>\n <div class=\"empty-block\">\n {this.renderUploadSvg()}\n <div class=\"empty-message\">{this.emptyStateText}</div>\n {this.renderUploadButton(\"-primary empty-button\")}\n </div>\n </div>\n );\n }\n\n renderErrorList() {\n if (!!this.errorList.length) {\n if (this.liveRegion) {\n let srMessage = this.errorList.reduce(function (acc, err) {\n return acc + `${err.file_name}: ${err.message} `;\n }, \"\");\n this.liveRegion.innerHTML = srMessage;\n }\n\n return (\n <ul class=\"error-list\">\n {this.errorList.map((err) => (\n <li>\n <div class=\"file --error\">\n <div class=\"file-info\">\n <span class=\"filename\">{err.file_name}</span>\n </div>\n </div>\n <div class=\"error-message\">{err.message}</div>\n </li>\n ))}\n </ul>\n );\n }\n }\n\n renderInProgressList() {\n return (\n <ul class=\"inprogress-list\">\n {this.inProgressList.map((item) => {\n return (\n <li>\n <div class=\"file --progress\">\n <div\n class=\"progress\"\n style={{\n background: `linear-gradient(to right, rgba(67, 126, 142, 1) ${item.progress}%, transparent ${item.progress}%)`,\n }}\n ></div>\n <div class=\"file-info\">\n <span class=\"filename\">\n {item.name} <span class=\"sr-only\">uploading</span>\n </span>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n );\n }\n\n renderFile(item: FileInfo) {\n return (\n <li>\n <div class=\"file --saved\">\n <div class=\"file-info\">\n <span class=\"filename\">{item.file_name}</span>\n <span class=\"filedate\">\n {this.formatDate(item.updated_at!, intl.locale, Intl.DateTimeFormat().resolvedOptions().timeZone)}\n </span>\n </div>\n <div class=\"file-controls\">\n <wm-button\n class=\"download-button\"\n button-type=\"icononly\"\n tooltip=\"download\"\n label-for-identical-buttons={`download ${item.file_name}`}\n icon=\"f1da\"\n onClick={() => this.downloadFile(item.uuid!, item.file_path!)}\n ></wm-button>\n <wm-button\n class=\"delete-button\"\n button-type=\"icononly\"\n tooltip=\"remove\"\n label-for-identical-buttons={`remove ${item.file_name}`}\n icon=\"f1c0\"\n onClick={() => this.deleteFile(item)}\n ></wm-button>\n </div>\n </div>\n </li>\n );\n }\n\n renderFileList() {\n return <ul class=\"file-list\">{this.fileList.map((item) => this.renderFile(item))}</ul>;\n }\n\n render() {\n return (\n <Host>\n {this.isEmpty() ? this.renderEmptyState() : this.renderWithItems()}\n <wm-snackbar notifications={JSON.stringify(this.snackbar)}></wm-snackbar>\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 ></div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["wmButtonCss","Button","this","btnPos","old","new","id","generateId","ariaPopup","isDisabled","toBool","disabled","tempButtonType","buttonType","buttonStyle","isTruncated","buttonEl","offsetWidth","scrollWidth","hasTooltip","tooltipEl","document","getElementById","buttonClasses","classes","permanentlyDelete","textWrap","isTabbing","customBackground","iconStyles","transformStyle","iconRotate","iconFlip","Object","assign","iconSize","fontSize","transform","toggleTabbingOn","toggleTabbingOff","handleScroll","tooltipVisible","hideTooltip","validateType","newValue","valid","includes","validateIcon","validateDeprecatedType","updateIcon","icon","getIconCodeFromName","console","error","tooltip","handleKeydown","ev","key","preventDefault","el","click","componentWillLoad","warn","componentDidLoad","body","classList","contains","getAttribute","getBoundingClientRect","showTooltip","tooltipText","textContent","hasNoWhitespace","match","add","style","setProperty","remove","removeProperty","adjustedTooltipPlacement","adjustTooltipPlacement","tooltipPosition","tooltipRect","transitionDelay","opacity","setTimeout","positionTooltip","tPos","window","requestAnimationFrame","top","left","vDiff","height","hDiff","width","vPos","hPos","bottom","right","Math","max","showTooltipForKeyboardUsers","getAriaLabel","labelForIdenticalButtons","render","h","Host","class","ref","onMouseEnter","onMouseLeave","onFocus","onBlur","onClick","String","fromCodePoint","parseInt"],"sources":["./src/components/wm-button/wm-button.scss?tag=wm-button&encapsulation=shadow","./src/components/wm-button/wm-button.tsx"],"sourcesContent":[":host([disabled]),\n:host(.button-disabled) {\n pointer-events: none;\n}\n\n:host([disabled=\"false\"]) {\n // override disabled behavior from occuring when the string is \"false\", which would evaluate as truthy\n pointer-events: initial;\n}\n\n:host,\nwm-button {\n display: inline-block;\n width: fit-content;\n position: relative; // for tooltip\n @include box-shadow(none);\n\n .sr-only {\n @include srOnly;\n }\n\n @extend %wm-button;\n}\n","import { h, Component, Prop, Element, Listen, Watch, Host, State } from \"@stencil/core\";\nimport { getIconCodeFromName, TooltipPlacement, validButtonTypes } from \"../../global/interfaces\";\nimport { generateId, adjustTooltipPlacement, toBool } from \"../../global/functions\";\n\n@Component({\n tag: \"wm-button\",\n styleUrl: \"wm-button.scss\",\n shadow: { delegatesFocus: true },\n})\nexport class Button {\n @Element() el!: HTMLWmButtonElement;\n private buttonEl!: HTMLButtonElement;\n\n // icon and tooltip have reflect set to true. Without reflect, the react wrappers don't expose the attribute\n // and the component throws errors when they are required (when buttonType is icononly or navigational)\n @Prop({ reflect: true }) disabled: boolean = false;\n get isDisabled(): boolean {\n // string \"false\" needs to be treated as bool False because react wrappers convert bool to string.\n return toBool(this.disabled);\n }\n @Prop({ mutable: true }) buttonType: validButtonTypes | null = null;\n @Prop({ mutable: true }) buttonStyle: validButtonTypes | null = null; // DEPRECATED in favor of button-type\n get tempButtonType(): validButtonTypes {\n // uses of this getter should be replaced with this.buttonType when buttonStyle is fully phased out\n // don't forget to reset this.buttonType's default value to secondary\n return this.buttonType || this.buttonStyle || \"secondary\";\n }\n @Prop({ reflect: true, mutable: true }) icon?: string;\n @Prop() iconSize?: string;\n @Prop() iconRotate?: number;\n @Prop() iconFlip?: \"horizontal\" | \"vertical\";\n @Prop({ reflect: true, mutable: true }) tooltip?: string;\n @Prop() labelForIdenticalButtons?: string;\n @Prop() tooltipPosition: TooltipPlacement = \"bottom-right\";\n @Prop() permanentlyDelete?: boolean = false;\n @Prop() textWrap: boolean = true;\n @Prop() customBackground?: string;\n @Prop({ mutable: true }) tooltipVisible = false; // this is not part of the documented API but we need to expose as prop in order to change it from the focus method defined in WillLoad()\n\n @State() isTabbing: boolean = false;\n\n private btnPos: any = { old: {}, new: {} }; // for tooltip position. old and new are DOMRect\n private id = generateId();\n private ariaPopup: boolean = false;\n\n get isTruncated(): boolean {\n return (\n !!this.buttonEl && this.tempButtonType === \"textonly\" && this.buttonEl.offsetWidth < this.buttonEl.scrollWidth\n );\n }\n\n get hasTooltip(): boolean {\n // tooltip is only rendered for icononly and navigational types, or if the button text is truncated\n return this.tempButtonType === \"icononly\" || this.tempButtonType === \"navigational\" || this.isTruncated;\n }\n\n get tooltipEl(): HTMLElement {\n return document.getElementById(\"wm-tooltip\")!;\n }\n\n get buttonClasses() {\n let classes = \"wm-button\";\n classes += this.permanentlyDelete ? \" -permanentlydelete\" : \"\";\n classes += this.tempButtonType ? \" -\" + this.tempButtonType : \" -secondary\";\n classes += this.textWrap ? \"\" : \" nowrap\";\n classes += this.isTabbing ? \" user-is-tabbing\" : \"\";\n classes += this.isTruncated ? \" -truncated\" : \"\";\n classes += this.customBackground === \"dark\" ? \" dark\" : \"\";\n return classes;\n }\n\n get iconStyles() {\n let transformStyle = \"\";\n transformStyle += this.iconRotate ? `rotate(${this.iconRotate}deg)` : \"\";\n transformStyle += this.iconFlip === \"horizontal\" ? `scaleX(-1)` : \"\";\n transformStyle += this.iconFlip === \"vertical\" ? `scaleY(-1)` : \"\";\n\n return {\n ...(this.iconSize && { fontSize: this.iconSize }),\n ...((this.iconRotate || this.iconFlip) && { transform: transformStyle }),\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 // we need to listen for scroll events during the capture phase because they do not bubble up\n // there can be layouts where the main content has 100vh and overflows\n // in these cases window will register no scroll events unless we catch on they way down\n @Listen(\"scroll\", { target: \"window\", capture: true })\n handleScroll() {\n if (this.tooltipVisible) {\n this.hideTooltip();\n }\n }\n\n @Watch(\"buttonType\")\n validateType(newValue: string) {\n const valid = [\n \"primary\",\n \"secondary\",\n \"textonly\",\n \"icononly\",\n \"navigational\",\n \"selector\",\n \"selector-primary\",\n \"pairpositive\",\n \"pairnegative\",\n ].includes(newValue);\n\n if (!valid) {\n this.buttonType = \"secondary\";\n }\n\n this.validateIcon();\n }\n\n // remove entire watcher after buttonStyle has been fully removed\n @Watch(\"buttonStyle\")\n validateDeprecatedType(newValue: string) {\n const valid = [\"primary\", \"secondary\", \"textonly\", \"icononly\", \"navigational\", \"selector\"].includes(newValue);\n\n if (!valid) {\n this.buttonStyle = \"secondary\";\n }\n\n this.validateIcon();\n }\n\n @Watch(\"icon\")\n updateIcon() {\n this.icon = getIconCodeFromName(this.icon!);\n }\n\n validateIcon() {\n switch (this.tempButtonType) {\n case \"icononly\":\n case \"navigational\":\n // if the style is icononly or navigational...\n // - an icon must be provided\n if (!this.icon) {\n console.error(\n \"wm-button should have a valid 'icon' property when button-type is set to 'icononly' or 'navigational'.\"\n );\n }\n // - if no tooltip text was passed and we couldn't generate one, throw an error\n if (!this.tooltip) {\n console.error(\n \"wm-button should have a valid 'tooltip' property when button-type is set to 'icononly' or 'navigational'.\"\n );\n }\n break;\n case \"pairpositive\":\n this.icon = \"f12c\";\n break;\n case \"pairnegative\":\n this.icon = \"f739\";\n break;\n }\n }\n\n @Listen(\"keydown\")\n handleKeydown(ev: KeyboardEvent) {\n switch (ev.key) {\n case \"Enter\":\n ev.preventDefault();\n if (!this.isDisabled) {\n this.el.click();\n }\n break;\n }\n }\n\n componentWillLoad() {\n if (this.buttonStyle) {\n console.warn(\"wm-button: button-style has been deprecated as of v3.1.0. Please use button-type instead.\");\n }\n\n this.validateType(this.tempButtonType);\n\n if (this.icon) {\n this.icon = this.icon = getIconCodeFromName(this.icon);\n }\n }\n\n componentDidLoad() {\n if (document.body.classList.contains(\"wmcl-user-is-tabbing\")) {\n this.toggleTabbingOn();\n }\n\n this.ariaPopup = !!this.el.getAttribute(\"aria-haspopup\");\n\n this.btnPos.new = this.buttonEl.getBoundingClientRect();\n }\n\n showTooltip() {\n if (this.hasTooltip) {\n // set tooltip text\n let tooltipText = \"\";\n if (this.isTruncated && this.el.textContent) {\n // when truncated, tooltip text is the button's content\n tooltipText = this.el.textContent;\n } else if (this.tooltip) {\n // otherwise it is the tooltip property if present\n tooltipText = this.tooltip;\n }\n this.tooltipEl.textContent = tooltipText;\n\n // tooltip only has a maxWidth if it contains whitespace and can break\n const hasNoWhitespace = tooltipText.match(/^[^\\s]+$/);\n if (hasNoWhitespace) {\n this.tooltipEl.classList.add(\"single-word\");\n this.tooltipEl.style.setProperty(\"--wmTooltipMaxWidth\", \"none\");\n } else {\n this.tooltipEl.classList.remove(\"single-word\");\n this.tooltipEl.style.removeProperty(\"--wmTooltipMaxWidth\");\n }\n\n // adjust placement in case there is no space to place the tooltip where specified via prop\n // calculation outside of the function to keep it pure\n const adjustedTooltipPlacement = adjustTooltipPlacement(this.tooltipPosition, this.buttonEl, this.tooltipEl);\n\n this.btnPos.old = {};\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\n this.tooltipEl.style.transitionDelay = \"500ms\";\n this.tooltipEl.style.opacity = \"1\";\n // This slight delay fixes an issue for keyboard users:\n // if they tab to a button out of screen bounds, the page scrolls\n // and hideTooltip() would be triggered before the tooltip would show\n setTimeout(() => {\n this.tooltipVisible = true;\n this.positionTooltip(adjustedTooltipPlacement, tooltipRect);\n }, 50);\n }\n }\n\n positionTooltip(tPos: string, tooltipRect: DOMRect) {\n if (this.tooltipVisible) {\n window.requestAnimationFrame(() => this.positionTooltip(tPos, tooltipRect));\n }\n this.btnPos.new = this.buttonEl.getBoundingClientRect();\n if (this.btnPos.new.top != this.btnPos.old.top || this.btnPos.new.left != this.btnPos.old.left) {\n // this is to figure out how to offset, given the size of the button and of the tooltip\n // to get the center positions, calculate the difference between the button width and the tooltip width\n const vDiff = (this.btnPos.new.height - tooltipRect.height) / 2;\n const hDiff = (this.btnPos.new.width - tooltipRect.width) / 2;\n // the naming convention defaults to center in the absence of a value\n // Values \"top\" and \"bottom\" imply horizontal centering; Values \"right\" and \"left\" imply vertical centering\n // therefore we first set to center first, then adjust accordingly\n let vPos = this.btnPos.new.top + vDiff;\n let hPos = this.btnPos.new.left + hDiff;\n\n if (tPos.includes(\"top\")) {\n vPos = this.btnPos.new.top - tooltipRect.height - 8;\n }\n if (tPos.includes(\"bottom\")) {\n vPos = this.btnPos.new.bottom + 8;\n }\n if (tPos.includes(\"left\")) {\n hPos = this.btnPos.new.left - tooltipRect.width - 8;\n }\n if (tPos.includes(\"right\")) {\n hPos = this.btnPos.new.right + 8;\n }\n\n // after all positioning has been calculated, if tooltip is off-screen or closer than 24px it is readjusted\n // this only occurs when the tooltip is overflowing to the left and is positioned top or bottom\n // (button placed too far left, or screen size under 268px)\n hPos = Math.max(hPos, 24);\n this.tooltipEl.style.setProperty(\"--wmTooltipTop\", vPos + \"px\");\n this.tooltipEl.style.setProperty(\"--wmTooltipLeft\", hPos + \"px\");\n // this.tooltipEl.style.top = vPos + \"px\";\n // this.tooltipEl.style.left = hPos + \"px\";\n // this.tooltipEl.style.top = (vPos / 16).toString() + \"rem\";\n // this.tooltipEl.style.left = (hPos / 16).toString() + \"rem\";\n\n this.btnPos.old = this.btnPos.new;\n }\n }\n\n hideTooltip() {\n if (this.hasTooltip) {\n this.tooltipEl.style.transitionDelay = \"0s\";\n this.tooltipEl.style.opacity = \"0\";\n this.tooltipVisible = false;\n }\n }\n\n showTooltipForKeyboardUsers() {\n if (this.isTabbing) {\n this.showTooltip();\n }\n }\n\n getAriaLabel() {\n if (this.tempButtonType === \"icononly\" || this.tempButtonType === \"navigational\") {\n return this.labelForIdenticalButtons || this.tooltip;\n }\n\n if (this.labelForIdenticalButtons) {\n return this.labelForIdenticalButtons;\n }\n }\n\n render() {\n return (\n <Host class={this.isDisabled ? \"button-disabled\" : \"\"}>\n <button\n id={this.id}\n class={`${this.buttonClasses}`}\n disabled={this.isDisabled}\n ref={(el) => (this.buttonEl = el as HTMLButtonElement)}\n aria-label={this.getAriaLabel()}\n aria-hasPopup={this.ariaPopup ? \"menu\" : null}\n onMouseEnter={() => this.showTooltip()}\n onMouseLeave={() => this.hideTooltip()}\n onFocus={() => this.showTooltipForKeyboardUsers()}\n onBlur={() => this.hideTooltip()}\n onClick={() => this.hideTooltip()}\n >\n {this.icon && (\n <span class=\"mdi\" style={this.iconStyles}>\n {String.fromCodePoint(parseInt(`0x${this.icon}`))}\n </span>\n )}\n <span class=\"button-text\">\n <slot />\n </span>\n </button>\n </Host>\n );\n }\n}\n"],"mappings":"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"}