@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,1209 +1,1209 @@
1
- import { h, Host, forceUpdate, } from "@stencil/core";
2
- import { csvToArray, debounce, generateId, hideTooltip, intl, measureText, shouldOpenUp, showTooltip, } from "../../global/functions";
3
- export class TagInput {
4
- constructor() {
5
- this.uid = this.el.id ? this.el.id : generateId();
6
- this.openUp = false;
7
- this.tooltipVisible = false;
8
- this.tagAreaInstructions = intl.formatMessage({
9
- id: "tagInput.tagAreaInstructions",
10
- defaultMessage: "tag selection. Press Backspace or Delete to remove a tag.",
11
- });
12
- this.maxTagsReachedMessage = intl.formatMessage({
13
- id: "tagInput.maxTagsReached",
14
- defaultMessage: "No more tags can be added because the limit has been reached.",
15
- });
16
- this.debouncedUpdate = debounce(() => forceUpdate(this.el), 30);
17
- this.label = undefined;
18
- this.labelPosition = "top";
19
- this.options = "";
20
- this.selectedTags = "";
21
- this.info = undefined;
22
- this.addNew = true;
23
- this.placeholder = undefined;
24
- this.characterLimit = 50;
25
- this.maxTags = undefined;
26
- this.tagInputType = "dropdown";
27
- this.colHeaders = undefined;
28
- this.colWidths = undefined;
29
- this.colWrap = undefined;
30
- this.focusedListItem = undefined;
31
- this.focusedTag = null;
32
- this.tablePosition = { row: 0, column: 1 };
33
- this.isExpanded = false;
34
- this.tagsList = csvToArray(this.selectedTags);
35
- this.optionsList = csvToArray(this.options);
36
- this.charCount = 0;
37
- this.liveRegionMessage = "";
38
- }
39
- get focusedElement() {
40
- return this.el.shadowRoot.activeElement;
41
- }
42
- get listItemEls() {
43
- return Array.from(this.dropdownEl.querySelectorAll("li"));
44
- }
45
- get tagEls() {
46
- return this.tagAreaEl ? Array.from(this.tagAreaEl.querySelectorAll(".tag")) : [];
47
- }
48
- get nonLockedTagEls() {
49
- return this.tagEls.filter((tag) => !tag.classList.contains("locked"));
50
- }
51
- get optionEls() {
52
- return Array.from(this.dropdownEl.querySelectorAll(".option"));
53
- }
54
- get wmRowEls() {
55
- return Array.from(this.el.querySelectorAll("wm-tag-input-row"));
56
- }
57
- get localRowEls() {
58
- return Array.from(this.el.shadowRoot.querySelectorAll("tr"));
59
- }
60
- get filteredRows() {
61
- return this.wmRowEls.filter((row) => {
62
- const colValues = [row.col1, row.col2, row.col3, row.col4].join("").toLowerCase();
63
- return this.inputEl && this.inputEl.value ? colValues.includes(this.inputEl.value.toLowerCase()) : true;
64
- });
65
- }
66
- get nonLockedTagsList() {
67
- let list = [];
68
- if (this.tagInputType === "table") {
69
- this.tagsList.forEach((id) => {
70
- const correspondingRowEl = this.wmRowEls.filter((row) => id === row.id)[0];
71
- if (!correspondingRowEl.locked) {
72
- list.push(id);
73
- }
74
- });
75
- }
76
- else if (this.tagInputType === "dropdown") {
77
- list = this.tagsList;
78
- }
79
- return list;
80
- }
81
- get tagLimitReached() {
82
- return !!(this.maxTags && this.tagsList.length >= this.maxTags);
83
- }
84
- get noResultsMessage() {
85
- return intl.formatMessage({
86
- id: "tagInput.noResults",
87
- defaultMessage: "No results match your search.",
88
- description: "Message displayed when a user's search returns empty.",
89
- });
90
- }
91
- get inputMinimumWidth() {
92
- // 150px is the minimum width of the input field, or the length of the placeholder text
93
- const inputElStyles = getComputedStyle(this.inputEl);
94
- const tagElStyles = getComputedStyle(this.tagEls[this.tagEls.length - 1]);
95
- const inputElBuffer = [
96
- inputElStyles.paddingLeft,
97
- inputElStyles.paddingRight,
98
- inputElStyles.marginLeft,
99
- inputElStyles.marginRight,
100
- tagElStyles.marginRight,
101
- ].reduce((prev, curr) => prev + parseInt(curr.replace("px", "")), 0);
102
- const minimumWidth = Math.max(150, measureText(this.inputEl, this.placeholder).width + inputElBuffer);
103
- return minimumWidth;
104
- }
105
- generateTagAddedMessage(tag) {
106
- return intl.formatMessage({
107
- id: "tagInput.tagAdded",
108
- defaultMessage: "{tagName} added.",
109
- description: "A confirmation for adding a tag.",
110
- }, { tagName: tag });
111
- }
112
- generateTagAlreadyAddedMessage(tag) {
113
- return intl.formatMessage({
114
- id: "tagInput.tagAlreadyAdded",
115
- defaultMessage: "{tagName} has already been added.",
116
- description: "An alert for adding a tag that is already present.",
117
- }, { tagName: tag });
118
- }
119
- generateTagCounterMessage(x, y) {
120
- return intl.formatMessage({
121
- id: "tagInput.tagsAddedCounter",
122
- defaultMessage: "Tags added: {x, number}/{y, number}",
123
- description: "For the user to understand how close they are to the tag limit.",
124
- }, {
125
- x: x,
126
- y: y,
127
- });
128
- }
129
- generateCharacterLimitLabel(characterLimit) {
130
- return intl.formatMessage({
131
- id: "global.characterLimit",
132
- defaultMessage: "{limit, number} characters allowed.",
133
- description: "for screen readers",
134
- }, { limit: characterLimit });
135
- }
136
- componentWillLoad() {
137
- if (!this.placeholder) {
138
- this.placeholder = this.createPlaceholderDefault(this.addNew, !!this.options);
139
- }
140
- if (!this.label) {
141
- console.error("wm-tag-input must have a label property");
142
- }
143
- this.consolidateSelectedTags();
144
- this.el.focus = () => {
145
- const firstFocusableTag = this.nonLockedTagEls[0];
146
- if (firstFocusableTag) {
147
- this.tagAreaEl.focus();
148
- this.focusTag(firstFocusableTag);
149
- }
150
- else {
151
- this.inputEl.focus();
152
- }
153
- };
154
- // on resize of component, trigger componentDidRender -> positionInput
155
- const resizeObserver = new ResizeObserver(() => this.debouncedUpdate());
156
- resizeObserver.observe(this.el);
157
- }
158
- componentDidLoad() {
159
- // prevent highlighting of pre-selected tags
160
- this.tagEls.forEach((el) => el.classList.remove("highlight"));
161
- }
162
- componentDidRender() {
163
- this.positionInput();
164
- }
165
- consolidateSelectedTags() {
166
- this.tagsList.forEach((tag) => {
167
- if (!this.includesCaseInsensitive(this.optionsList, tag)) {
168
- this.options += `${this.options.length > 0 ? "," : ""}${tag}`;
169
- }
170
- });
171
- this.optionsList = csvToArray(this.options);
172
- }
173
- createPlaceholderDefault(addNew, hasOptions) {
174
- const addAndSearchPlaceholder = intl.formatMessage({
175
- id: "tagInput.placeholderAddAndSearch",
176
- defaultMessage: "Add or search for a tag",
177
- description: "Placeholder text. Use imperative",
178
- });
179
- const searchPlaceholder = intl.formatMessage({
180
- id: "tagInput.placeholderSearch",
181
- defaultMessage: "Search and select a tag",
182
- description: "Placeholder text. Use imperative",
183
- });
184
- const addPlaceholder = intl.formatMessage({
185
- id: "tagInput.placeholderAdd",
186
- defaultMessage: "Add a new tag",
187
- description: "Placeholder text. Use imperative",
188
- });
189
- let placeholder = "";
190
- if (addNew && hasOptions) {
191
- placeholder = addAndSearchPlaceholder;
192
- }
193
- else if (!addNew && hasOptions) {
194
- placeholder = searchPlaceholder;
195
- }
196
- else if (addNew) {
197
- placeholder = addPlaceholder;
198
- }
199
- return placeholder;
200
- }
201
- reflectSelectedTags(newValue, oldValue) {
202
- const isAddition = newValue.length > oldValue.length;
203
- let changedTag = "";
204
- let selectedTags = this.tagsList;
205
- if (isAddition) {
206
- changedTag = newValue.filter((val) => !oldValue.includes(val))[0];
207
- }
208
- else {
209
- changedTag = oldValue.filter((val) => !newValue.includes(val))[0];
210
- }
211
- // event emitted by type table uses element references instead of strings
212
- if (this.tagInputType === "table") {
213
- changedTag = this.wmRowEls.filter((row) => row.id === changedTag)[0];
214
- selectedTags = this.tagsList.map((id) => this.el.querySelector(`#${id}`));
215
- }
216
- this.selectedTags = this.listToCSV(this.tagsList);
217
- let detail = { value: selectedTags, tagChanged: changedTag };
218
- this.wmTagInputChanged.emit(detail);
219
- }
220
- handleRowUpdate() {
221
- forceUpdate(this.el);
222
- }
223
- closeIfNotElOrChild(ev) {
224
- const isntElOrChild = ev.target !== this.el && !this.el.shadowRoot.contains(ev.target);
225
- if (this.tagInputType === "dropdown" && isntElOrChild && this.isExpanded) {
226
- this.closeDropdown();
227
- }
228
- }
229
- // From wm-button
230
- // we need to listen for scroll events during the capture phase because they do not bubble up
231
- // there can be layouts where the main content has 100vh and overflows
232
- // in these cases window will register no scroll events unless we catch on they way down
233
- dismissTooltip() {
234
- if (this.tooltipVisible) {
235
- hideTooltip();
236
- this.tooltipVisible = false;
237
- }
238
- }
239
- handleInputKeyDown(ev) {
240
- if (/^.$/.test(ev.key) && this.inputEl.value.length >= this.characterLimit) {
241
- this.announceCharacterLimitWarning(this.inputEl.value.length, this.characterLimit);
242
- }
243
- // prevent keydown triggering on tag area
244
- ev.stopPropagation();
245
- switch (ev.key) {
246
- case "Enter":
247
- case ",":
248
- ev.preventDefault();
249
- this.handleInputEnter();
250
- break;
251
- case "ArrowDown":
252
- ev.preventDefault();
253
- this.handleInputArrowDown();
254
- break;
255
- case "ArrowUp":
256
- ev.preventDefault();
257
- this.handleInputArrowUp();
258
- break;
259
- case "ArrowLeft":
260
- ev.preventDefault();
261
- if (this.tagInputType === "table" && this.tablePosition.row) {
262
- this.moveLeftCell();
263
- }
264
- break;
265
- case "ArrowRight":
266
- ev.preventDefault();
267
- if (this.tagInputType === "table" && this.tablePosition.row) {
268
- this.moveRightCell();
269
- }
270
- break;
271
- case "Escape":
272
- if (this.tagInputType === "dropdown" && this.isExpanded) {
273
- this.closeDropdown();
274
- }
275
- break;
276
- case "ArrowLeft":
277
- case "Backspace":
278
- this.handleInputBackspace();
279
- break;
280
- }
281
- }
282
- handleInputFocus() {
283
- if (this.tagInputType === "dropdown") {
284
- this.openDropdown();
285
- this.clearListItemFocus();
286
- }
287
- // force update needed to apply styled state of field-wrapper el
288
- forceUpdate(this.el);
289
- }
290
- handleInputChanged(value) {
291
- this.charCount = value.length;
292
- if (this.tagInputType === "dropdown") {
293
- this.clearListItemFocus();
294
- if (this.charCount >= this.characterLimit - 5) {
295
- this.announceCharacterLimitWarning(this.charCount, this.characterLimit);
296
- }
297
- if (!this.isExpanded) {
298
- this.openDropdown();
299
- }
300
- }
301
- else if (this.tagInputType === "table") {
302
- this.clearCellFocus();
303
- }
304
- this.announceExistingOptions();
305
- }
306
- handleInputEnter() {
307
- if (this.tagInputType === "dropdown") {
308
- if (this.focusedListItem) {
309
- this.handleListItemClick(this.focusedListItem);
310
- }
311
- else {
312
- this.submitInput(this.addNew, this.inputEl.value.trim());
313
- }
314
- }
315
- else if (this.tagInputType === "table" && this.tablePosition.row > 0) {
316
- this.handleTableRowClick(this.localRowEls[this.tablePosition.row].id);
317
- }
318
- }
319
- submitInput(canAddNew, value) {
320
- const hasNonWhiteSpaceCharacters = value.match(/\S/);
321
- if (canAddNew && hasNonWhiteSpaceCharacters) {
322
- this.addTag(value);
323
- this.optionsList = this.addOption(value);
324
- this.resetInput();
325
- }
326
- }
327
- handleInputArrowDown() {
328
- if (this.tagInputType === "table") {
329
- this.moveDownRow();
330
- }
331
- else if (this.tagInputType === "dropdown" && this.isExpanded) {
332
- this.moveDownListItem();
333
- }
334
- else if (this.tagInputType === "dropdown") {
335
- this.openDropdown();
336
- }
337
- }
338
- handleInputArrowUp() {
339
- if (this.tagInputType === "table") {
340
- this.moveUpRow();
341
- }
342
- else if (this.tagInputType === "dropdown" && this.isExpanded) {
343
- this.moveUpListItem();
344
- }
345
- else if (this.tagInputType === "dropdown") {
346
- this.openDropdown();
347
- }
348
- }
349
- handleInputBackspace() {
350
- if (this.inputEl.value === "" && this.tagsList.length > 0) {
351
- // wait for events to finish firing before redirecting focus
352
- // prevents double input in input area and tag area
353
- window.requestAnimationFrame(() => {
354
- if (this.nonLockedTagsList.length > 0) {
355
- this.tagAreaEl.focus();
356
- this.focusTag(this.tagEls[this.tagEls.length - 1]);
357
- }
358
- });
359
- }
360
- }
361
- handleListItemKeyDown(ev) {
362
- const typedEvTarget = ev.target;
363
- switch (ev.key) {
364
- case "Enter":
365
- case " ":
366
- ev.preventDefault();
367
- typedEvTarget.click();
368
- break;
369
- case "ArrowDown":
370
- ev.preventDefault();
371
- this.moveDownListItem();
372
- break;
373
- case "ArrowUp":
374
- ev.preventDefault();
375
- this.moveUpListItem();
376
- break;
377
- case "Escape":
378
- if (this.focusedElement !== this.inputEl) {
379
- this.inputEl.focus();
380
- }
381
- else if (this.tagInputType === "dropdown") {
382
- this.closeDropdown();
383
- }
384
- break;
385
- }
386
- }
387
- handleListItemClick(item) {
388
- const tag = item.dataset.option.trim() || "";
389
- if (this.includesCaseInsensitive(this.tagsList, tag)) {
390
- this.announce(this.generateTagAlreadyAddedMessage(tag));
391
- }
392
- else {
393
- this.resetInput();
394
- this.addTag(tag);
395
- this.optionsList = this.addOption(tag);
396
- this.focusedListItem = null;
397
- }
398
- }
399
- handleTableRowClick(rowId) {
400
- const referencedRow = this.el.querySelector(`#${rowId}`);
401
- const isLocked = referencedRow.locked;
402
- if (!isLocked) {
403
- if (this.includesCaseInsensitive(this.tagsList, rowId)) {
404
- this.removeTag(rowId);
405
- }
406
- else if (!this.tagLimitReached) {
407
- this.addTag(rowId);
408
- this.resetInput();
409
- }
410
- }
411
- }
412
- handleTagAreaKeyDown(ev) {
413
- switch (ev.key) {
414
- case "ArrowLeft":
415
- case "ArrowUp":
416
- ev.preventDefault();
417
- this.moveLeftTag();
418
- break;
419
- case "ArrowRight":
420
- case "ArrowDown":
421
- ev.preventDefault();
422
- this.moveRightTag();
423
- break;
424
- case "Backspace":
425
- case "Delete":
426
- this.handleTagAreaDelete();
427
- break;
428
- }
429
- }
430
- handleTagAreaDelete() {
431
- const isLocked = this.focusedTag && this.focusedTag.classList.contains("locked");
432
- if (this.focusedTag && this.focusedTag.dataset.tag && !isLocked) {
433
- this.removeTag(this.focusedTag.dataset.tag);
434
- if (this.nonLockedTagsList.length === 0) {
435
- // focus input if no tags are left
436
- this.inputEl.focus();
437
- }
438
- else if (this.focusedTag === this.tagEls[this.tagEls.length - 1]) {
439
- // reassign focus if removing the last tag but there are still tags remaining
440
- this.focusedTag = this.tagEls[this.tagEls.length - 2];
441
- this.focusTag(this.focusedTag);
442
- }
443
- }
444
- }
445
- handleBlur(ev, component) {
446
- const isntElOrChild = ev.relatedTarget !== component && !this.el.shadowRoot.contains(ev.relatedTarget);
447
- this.dismissTooltip();
448
- this.clearCellFocus();
449
- if (isntElOrChild) {
450
- this.fieldWrapperEl.classList.remove("focused");
451
- if (this.tagInputType === "dropdown") {
452
- this.closeDropdown();
453
- }
454
- }
455
- }
456
- handleCellMouseEnter(ev) {
457
- const cell = ev.target;
458
- const contentWrapper = cell.querySelector(".cell-content-wrapper");
459
- const isTruncated = contentWrapper.scrollWidth > contentWrapper.clientWidth;
460
- if (isTruncated) {
461
- // innerText is necessary vs textContent, as innerText ignores sr-only / display: none text
462
- showTooltip("bottom", cell, cell.innerText);
463
- this.tooltipVisible = true;
464
- }
465
- }
466
- handleTagAreaFocus() {
467
- if (this.tagInputType === "dropdown") {
468
- this.closeDropdown();
469
- }
470
- const firstFocusableTag = this.nonLockedTagEls[0];
471
- firstFocusableTag && this.focusTag(firstFocusableTag);
472
- }
473
- handleRemoveButtonClick(tag) {
474
- this.moveLeftTag();
475
- this.removeTag(tag);
476
- }
477
- moveDownListItem() {
478
- if (this.listItemEls.length > 0) {
479
- const firstListItem = this.listItemEls[0];
480
- if (!this.focusedListItem) {
481
- this.focusListItem(firstListItem);
482
- }
483
- else if (this.focusedListItem.nextElementSibling) {
484
- this.focusListItem(this.focusedListItem.nextElementSibling);
485
- }
486
- else {
487
- this.focusListItem(firstListItem);
488
- }
489
- }
490
- }
491
- moveUpListItem() {
492
- if (this.listItemEls.length > 0) {
493
- const lastListItem = this.listItemEls[this.listItemEls.length - 1];
494
- if (!this.focusedListItem) {
495
- this.focusListItem(lastListItem);
496
- }
497
- else if (this.focusedListItem.previousElementSibling) {
498
- this.focusListItem(this.focusedListItem.previousElementSibling);
499
- }
500
- else {
501
- this.clearListItemFocus();
502
- }
503
- }
504
- }
505
- moveDownRow() {
506
- if (this.filteredRows.length > 0) {
507
- if (this.tablePosition.row === 0) {
508
- this.tablePosition.row = 1;
509
- }
510
- else if (this.tablePosition.row === this.filteredRows.length) {
511
- this.tablePosition.row = 1;
512
- }
513
- else {
514
- this.tablePosition.row++;
515
- }
516
- // skip locked rows
517
- const rowToFocus = this.wmRowEls[this.tablePosition.row - 1];
518
- if (rowToFocus.locked) {
519
- this.moveDownRow();
520
- }
521
- else {
522
- this.focusCell(this.tablePosition);
523
- }
524
- }
525
- }
526
- moveUpRow() {
527
- if (this.filteredRows.length > 0) {
528
- if (this.tablePosition.row === 0) {
529
- this.tablePosition.row = this.filteredRows.length;
530
- }
531
- else if (this.tablePosition.row === 1) {
532
- this.tablePosition.row = 0;
533
- }
534
- else {
535
- this.tablePosition.row--;
536
- }
537
- // skip locked rows
538
- const rowToFocus = this.wmRowEls[this.tablePosition.row - 1];
539
- if (rowToFocus && rowToFocus.locked) {
540
- this.moveUpRow();
541
- }
542
- else if (rowToFocus) {
543
- this.focusCell(this.tablePosition);
544
- }
545
- else {
546
- this.clearCellFocus();
547
- }
548
- }
549
- }
550
- moveLeftCell() {
551
- if (this.tablePosition.column != 1) {
552
- this.tablePosition.column--;
553
- this.focusCell(this.tablePosition);
554
- }
555
- }
556
- moveRightCell() {
557
- const numCols = csvToArray(this.colHeaders).length;
558
- if (this.tablePosition.column < numCols) {
559
- this.tablePosition.column++;
560
- this.focusCell(this.tablePosition);
561
- }
562
- }
563
- moveLeftTag() {
564
- const lastTag = this.tagEls[this.tagEls.length - 1];
565
- if (this.focusedTag && this.tagEls.includes(this.focusedTag.previousElementSibling)) {
566
- this.focusedTag = this.focusedTag.previousElementSibling;
567
- }
568
- else {
569
- this.focusedTag = lastTag;
570
- }
571
- // skip locked tags
572
- if (this.focusedTag.classList.contains("locked") && this.nonLockedTagEls.length > 0) {
573
- this.moveLeftTag();
574
- }
575
- else {
576
- this.focusTag(this.focusedTag);
577
- }
578
- }
579
- moveRightTag() {
580
- const firstTag = this.tagEls[0];
581
- if (this.focusedTag && this.tagEls.includes(this.focusedTag.nextElementSibling)) {
582
- this.focusedTag = this.focusedTag.nextElementSibling;
583
- }
584
- else {
585
- this.focusedTag = firstTag;
586
- }
587
- // skip locked tags
588
- if (this.focusedTag.classList.contains("locked")) {
589
- this.moveRightTag();
590
- }
591
- else {
592
- this.focusTag(this.focusedTag);
593
- }
594
- }
595
- addOption(option) {
596
- let newOptionsList = this.optionsList;
597
- const optionAlreadyExists = this.includesCaseInsensitive(this.optionsList, option);
598
- if (!optionAlreadyExists) {
599
- newOptionsList = newOptionsList.concat(option);
600
- }
601
- return newOptionsList;
602
- }
603
- removeOption(option) {
604
- this.optionsList = this.filterCaseInsensitive(this.optionsList, option);
605
- }
606
- addTag(tag) {
607
- let newTagsList = this.tagsList;
608
- const tagAlreadyAdded = this.includesCaseInsensitive(this.tagsList, tag);
609
- const tagExistsAsOption = this.optionsList.filter((x) => x.toLowerCase() === tag.toLowerCase())[0];
610
- if (!tagAlreadyAdded) {
611
- let textToAnnounce = tag;
612
- if (this.tagInputType === "table") {
613
- const referencedRow = this.el.querySelector(`#${tag}`);
614
- textToAnnounce = referencedRow.col1;
615
- }
616
- this.announce(this.generateTagAddedMessage(textToAnnounce));
617
- this.tagsList = newTagsList.concat(tagExistsAsOption || tag);
618
- // if maxTags has been reached, focus should go to the tagArea
619
- if (this.tagLimitReached) {
620
- this.tagAreaEl.focus();
621
- }
622
- }
623
- }
624
- removeTag(tag) {
625
- let textToAnnounce = tag;
626
- if (this.tagInputType === "table") {
627
- const referencedRow = this.el.querySelector(`#${tag}`);
628
- textToAnnounce = referencedRow.col1;
629
- }
630
- const tagRemovedMessage = intl.formatMessage({ id: "tagInput.tagRemoved", defaultMessage: "{tag} removed" }, { tag: textToAnnounce });
631
- this.announce(tagRemovedMessage);
632
- this.tagsList = this.filterCaseInsensitive(this.tagsList, tag);
633
- if (this.tagInputType === "dropdown") {
634
- // if a tag was introduced by the user, also remove it from the dropdown options
635
- const devOptionsList = csvToArray(this.options);
636
- if (this.includesCaseInsensitive(this.optionsList, tag) && !this.includesCaseInsensitive(devOptionsList, tag)) {
637
- this.removeOption(tag);
638
- }
639
- }
640
- }
641
- focusListItem(item) {
642
- this.focusedListItem = item;
643
- this.inputEl.setAttribute("aria-activedescendant", this.focusedListItem.id);
644
- item.scrollIntoView({ block: "nearest" });
645
- }
646
- focusTag(element) {
647
- if (element.classList.contains("locked")) {
648
- this.focusedTag = null;
649
- this.tagAreaEl.setAttribute("aria-activedescendant", "");
650
- }
651
- else {
652
- this.focusedTag = element;
653
- this.tagAreaEl.setAttribute("aria-activedescendant", this.focusedTag.id);
654
- }
655
- }
656
- focusCell(position) {
657
- this.clearCellFocus(false);
658
- if (position.row) {
659
- const rowToFocus = this.localRowEls[position.row];
660
- const rowCells = rowToFocus.querySelectorAll("td");
661
- const cellToFocus = rowCells[position.column - 1];
662
- const contentWrapper = cellToFocus.querySelector(".cell-content-wrapper");
663
- const isTruncated = contentWrapper.scrollWidth > contentWrapper.clientWidth;
664
- rowToFocus.classList.add("focused");
665
- cellToFocus.classList.add("focused");
666
- cellToFocus.scrollIntoView({ block: "nearest" });
667
- this.inputEl.setAttribute("aria-activedescendant", cellToFocus.id);
668
- this.dismissTooltip();
669
- if (isTruncated) {
670
- // innerText is necessary vs textContent, as innerText ignores sr-only / display: none text
671
- showTooltip("bottom", cellToFocus, cellToFocus.innerText);
672
- this.tooltipVisible = true;
673
- }
674
- }
675
- }
676
- clearTagFocus() {
677
- this.tagAreaEl.setAttribute("aria-activedescendant", "");
678
- this.focusedTag = null;
679
- }
680
- clearCellFocus(resetPosition = true) {
681
- this.inputEl.setAttribute("aria-activedescendant", "");
682
- if (resetPosition) {
683
- this.tablePosition = { row: 0, column: 1 };
684
- }
685
- this.localRowEls.forEach((row) => {
686
- row.classList.remove("focused");
687
- row.querySelectorAll("td").forEach((cell) => {
688
- cell.classList.remove("focused");
689
- });
690
- });
691
- }
692
- openDropdown() {
693
- // given an offset of -2px because the dropdown is transformed downwards to avoid overlapping the focus border
694
- this.openUp = shouldOpenUp(this.el, this.dropdownEl, this.el.clientHeight, -2);
695
- this.isExpanded = true;
696
- }
697
- closeDropdown() {
698
- this.clearListItemFocus();
699
- this.isExpanded = false;
700
- }
701
- clearListItemFocus() {
702
- this.focusedListItem = null;
703
- this.inputEl.setAttribute("aria-activedescendant", "");
704
- this.listItemEls.forEach((el) => {
705
- el.classList.remove("focused");
706
- });
707
- }
708
- resetInput() {
709
- this.charCount = 0;
710
- this.inputEl.value = "";
711
- }
712
- announce(message) {
713
- // \u00A0 is a non-breaking space character, which causes the message to be read as a new one
714
- if (this.liveRegionEl.textContent === message) {
715
- message += "\u00A0";
716
- }
717
- this.liveRegionMessage = message;
718
- }
719
- announceExistingOptions() {
720
- // request animation frame to wait for re-rendering of filtered options
721
- window.requestAnimationFrame(() => {
722
- let numResults = 0;
723
- if (this.tagInputType === "dropdown") {
724
- numResults = this.optionEls.length;
725
- }
726
- else if (this.tagInputType === "table") {
727
- numResults = this.filteredRows.length;
728
- }
729
- const existingOptionsMessage = intl.formatMessage({
730
- id: "tagInput.existingOptions",
731
- defaultMessage: "{num, plural, one {1 existing option.} other {# existing options.}}",
732
- }, { num: numResults });
733
- this.announce(existingOptionsMessage);
734
- });
735
- }
736
- announceCharacterLimitWarning(charCount, charLimit) {
737
- const charactersEnteredMessage = intl.formatMessage({
738
- id: "global.charactersEntered",
739
- defaultMessage: "{x, number} of {y, number} characters entered.",
740
- description: "for screen readers",
741
- }, { x: charCount, y: charLimit });
742
- const characterLimitReachedMessage = intl.formatMessage({
743
- id: "global.characterLimitReached",
744
- defaultMessage: "No additional characters will be entered.",
745
- description: "for screen readers",
746
- });
747
- this.announce(`${charactersEnteredMessage}${charCount >= charLimit ? " " + characterLimitReachedMessage : ""}`);
748
- }
749
- positionInput() {
750
- const lastTag = this.tagEls[this.tagEls.length - 1];
751
- // default placement to fall back to when no tags are present, or not enough space is available
752
- this.inputEl.style.position = "static";
753
- this.inputEl.style.width = "100%";
754
- if (lastTag) {
755
- const spaceAvailable = this.tagAreaEl.getBoundingClientRect().right - lastTag.getBoundingClientRect().right;
756
- if (spaceAvailable >= this.inputMinimumWidth) {
757
- // because the input has right: 0px
758
- // all thats needed to properly place it is setting position: absolute, top, and width
759
- this.inputEl.style.position = "absolute";
760
- this.inputEl.style.top = lastTag.offsetTop.toString() + "px";
761
- this.inputEl.style.width =
762
- (this.tagAreaEl.getBoundingClientRect().right - lastTag.getBoundingClientRect().right - 8).toString() + "px";
763
- }
764
- }
765
- }
766
- /// Helpers
767
- listToCSV(list) {
768
- return list.join(",");
769
- }
770
- includesCaseInsensitive(list, element) {
771
- const lowercaseList = list.map((str) => str.toLowerCase());
772
- return lowercaseList.includes(element.toLowerCase());
773
- }
774
- filterCaseInsensitive(list, element) {
775
- return list.filter((x) => x.toLowerCase() !== element.toLowerCase());
776
- }
777
- sortCaseInsensitive(list) {
778
- // The vanilla .sort method places words that start with capital letters above others (ASCII order)
779
- // so we need to pass in our own compare function to sort case-insensitive
780
- return list.sort((a, b) => {
781
- a = a.toLowerCase();
782
- b = b.toLowerCase();
783
- return a > b ? 1 : a < b ? -1 : 0;
784
- });
785
- }
786
- /// Renders
787
- renderTags() {
788
- let lockedTags = [];
789
- let unlockedTags = [];
790
- this.tagsList.forEach((tag, idx) => {
791
- const id = `tag${idx + 1}`;
792
- let tagText = "";
793
- let isLocked = false;
794
- if (this.tagInputType === "dropdown") {
795
- tagText = tag;
796
- }
797
- else if (this.tagInputType === "table") {
798
- // display table tags using col1 of the row with the same id
799
- // if one can't be found, display as empty
800
- const referencedRow = this.el.querySelector(`#${tag}`);
801
- tagText = referencedRow ? referencedRow.col1 : "";
802
- isLocked = referencedRow ? referencedRow.locked : false;
803
- }
804
- // make sure locked tags always appear in front of list
805
- const targetList = isLocked ? lockedTags : unlockedTags;
806
- targetList.push(h("li", { id: id, class: `tag highlight ${this.focusedTag && this.focusedTag.id === id ? "focused" : ""} ${isLocked ? "locked" : ""}`, "data-tag": tag, role: "option" }, tagText, isLocked ? (h("div", { class: "icon lock" })) : (h("button", { class: "icon remove-btn", tabIndex: -1, onClick: () => this.handleRemoveButtonClick(tag) }))));
807
- });
808
- return [...lockedTags, ...unlockedTags];
809
- }
810
- renderDropdown() {
811
- return (h("div", { class: `dropdown-wrapper ${this.isExpanded ? "open" : ""} ${this.openUp ? "upwards" : ""}`, ref: (el) => (this.dropdownEl = el) }, h("div", { id: "help-text", class: "help-text" }, this.renderHelpText()), h("ul", { class: "dropdown", id: "dropdown", role: "listbox", "aria-multiselectable": "true", "aria-expanded": this.isExpanded ? "true" : false, "aria-label": this.label, tabindex: -1 }, this.inputEl && this.renderAddNewButton(), this.renderListItems(this.optionsList))));
812
- }
813
- renderListItems(optionsList) {
814
- optionsList = this.sortCaseInsensitive(optionsList);
815
- // filter by input
816
- if (this.inputEl && this.inputEl.value) {
817
- optionsList = this.optionsList.filter((option) => option.toLowerCase().includes(this.inputEl.value.toLowerCase()));
818
- }
819
- return optionsList.map((option, idx) => {
820
- const id = `option${idx + 1}`;
821
- const isFocused = this.focusedListItem && this.focusedListItem.id === id;
822
- const isSelected = this.includesCaseInsensitive(this.tagsList, option);
823
- return (h("li", { class: `option ${isFocused ? "focused" : ""}`, role: "option", id: id, "data-option": option, "aria-selected": isSelected ? "true" : "false", "aria-disabled": isSelected ? "true" : "false", onKeyDown: (ev) => this.handleListItemKeyDown(ev), onBlur: (ev) => this.handleBlur(ev, this.el), onClick: (ev) => this.handleListItemClick(ev.target) }, option));
824
- });
825
- }
826
- renderAddNewButton() {
827
- const hasNonWhiteSpaceCharacters = this.inputEl.value.match(/\S/);
828
- const optionAlreadyExists = this.includesCaseInsensitive(this.optionsList, this.inputEl.value.trim());
829
- if (this.addNew && hasNonWhiteSpaceCharacters && !optionAlreadyExists) {
830
- const id = `add-new-btn`;
831
- const isFocused = this.focusedListItem && this.focusedListItem.id === id;
832
- return (h("li", { role: "option", class: `add-new-btn ${isFocused ? "focused" : ""}`, id: id, "data-option": this.inputEl.value, onKeyDown: (ev) => this.handleListItemKeyDown(ev), onBlur: (ev) => this.handleBlur(ev, this.el), onClick: (ev) => this.handleListItemClick(ev.target), tabIndex: isFocused ? 0 : -1 }, `Add "${this.inputEl.value.trim()}"`));
833
- }
834
- else
835
- return "";
836
- }
837
- renderHelpText() {
838
- const helpTextHasOptions = intl.formatMessage({
839
- id: "tagInput.helpTextCanSelect",
840
- defaultMessage: "Search and select a tag.",
841
- description: "Placeholder text. Use imperative",
842
- });
843
- const helpTextEditable = intl.formatMessage({
844
- id: "tagInput.helpTextEditable",
845
- defaultMessage: "Press the Enter or Comma key to add a new tag.",
846
- description: "Placeholder text. Use imperative",
847
- });
848
- let helpText = "";
849
- if (this.optionsList.length > 0) {
850
- helpText += helpTextHasOptions;
851
- }
852
- if (this.addNew) {
853
- helpText += " " + helpTextEditable;
854
- }
855
- return helpText;
856
- }
857
- renderTagCounter() {
858
- if (this.maxTags) {
859
- return (h("div", { class: "lower-row" }, h("div", { id: "max-tags" }, this.generateTagCounterMessage(this.tagsList.length, this.maxTags), this.tagLimitReached && ` - ${this.maxTagsReachedMessage}`)));
860
- }
861
- }
862
- renderTable() {
863
- return (h("div", { class: "table-wrapper", onScroll: () => this.dismissTooltip() }, h("table", { id: "table", role: "grid", class: `${this.colWidths ? "fixed-widths" : ""}`, "aria-label": this.label, "aria-multiselectable": "true" }, this.renderTableHeaders(), this.filteredRows.length ? this.renderTableRows() : h("div", { class: "no-results" }, this.noResultsMessage))));
864
- }
865
- renderTableHeaders() {
866
- return (h("tr", { class: "headers", role: "row" }, csvToArray(this.colHeaders).map((header, idx) => {
867
- let overflowRule = "wrap";
868
- if (this.colWrap && csvToArray(this.colWrap)[idx]) {
869
- overflowRule = csvToArray(this.colWrap)[idx];
870
- }
871
- return (h("th", { class: `header-cell ${overflowRule}`, role: "columnheader",
872
- // @ts-ignore
873
- width: this.colWidths ? csvToArray(this.colWidths)[idx] : "" }, header));
874
- })));
875
- }
876
- renderTableRows() {
877
- return this.filteredRows.map((row) => {
878
- const isSelected = this.includesCaseInsensitive(this.tagsList, row.id);
879
- return (h("tr", { id: row.id, class: `${row.locked ? "locked" : ""} ${isSelected ? "selected" : ""}`, role: "row", onClick: () => this.handleTableRowClick(row.id) }, this.renderTableCells(row)));
880
- });
881
- }
882
- renderTableCells(row) {
883
- const colValues = [row.col1, row.col2, row.col3, row.col4].filter((val) => !!val);
884
- const isSelected = this.includesCaseInsensitive(this.tagsList, row.id);
885
- return colValues.map((val, idx) => {
886
- const localId = `${row.id}-col${idx + 1}`;
887
- let overflowRule = "wrap";
888
- if (this.colWrap && csvToArray(this.colWrap)[idx]) {
889
- overflowRule = csvToArray(this.colWrap)[idx];
890
- }
891
- return (h("td", { id: localId, role: "gridcell", "aria-describedby": `${localId}-description`, "aria-selected": isSelected.toString(), onMouseEnter: (ev) => this.handleCellMouseEnter(ev), onMouseLeave: () => this.dismissTooltip() }, h("div", { class: `cell-content-wrapper ${overflowRule}` }, val), h("div", { class: "description", id: `${localId}-description` }, row.locked ? "locked" : "")));
892
- });
893
- }
894
- render() {
895
- return (h(Host, { id: this.uid }, h("div", { class: `wrapper label-${this.labelPosition}` }, h("div", { class: "label-wrapper" }, h("label", { class: "label", htmlFor: `input${this.uid}` }, this.label)), h("div", { class: `field-wrapper ${this.focusedElement ? "focused" : ""}`, ref: (el) => (this.fieldWrapperEl = el) }, h("div", { class: "upper-row" }, h("div", { class: "tags-and-input-wrapper" }, this.tagsList.length > 0 && (h("ul", { ref: (el) => (this.tagAreaEl = el), class: "tag-area", role: "listbox", "aria-activedescendant": "", "aria-orientation": "horizontal", "aria-label": `${this.label} ${this.tagsList.length > 0 ? this.tagAreaInstructions : ""}`, tabindex: this.nonLockedTagsList.length > 0 ? 0 : -1, "aria-describedby": `info max-tags`, onFocus: () => this.handleTagAreaFocus(), onBlur: (ev) => {
896
- this.clearTagFocus();
897
- this.handleBlur(ev, this.el);
898
- }, onKeyDown: (ev) => this.handleTagAreaKeyDown(ev) }, this.renderTags())), h("input", { id: `input${this.uid}`, class: this.tagLimitReached ? "hidden" : "", role: "combobox", ref: (el) => (this.inputEl = el), autocomplete: "off", "aria-controls": this.tagInputType, "aria-describedby": "help-text", "aria-label": `${this.label} ${this.tagInputType === "dropdown" ? this.generateCharacterLimitLabel(this.characterLimit) : ""}`, "aria-expanded": this.tagInputType === "dropdown" ? this.isExpanded.toString() : null, placeholder: this.placeholder, maxLength: this.tagInputType === "dropdown" ? this.characterLimit : undefined, onInput: () => this.handleInputChanged(this.inputEl.value), onBlur: (ev) => {
899
- this.handleBlur(ev, this.el);
900
- }, onFocus: () => this.handleInputFocus(), onKeyDown: (ev) => this.handleInputKeyDown(ev) })), this.tagInputType === "dropdown" && (h("div", { class: "character-count" }, this.charCount, "/", this.characterLimit))), this.renderTagCounter(), this.tagInputType === "dropdown" && this.renderDropdown()), this.info ? (h("div", { id: "info", class: "info-text" }, this.info)) : (""), h("div", { class: "sr-only", "aria-live": "assertive", ref: (el) => (this.liveRegionEl = el), "aria-atomic": "true" }, this.liveRegionMessage), this.tagInputType === "table" && this.renderTable())));
901
- }
902
- static get is() { return "wm-tag-input"; }
903
- static get encapsulation() { return "shadow"; }
904
- static get delegatesFocus() { return true; }
905
- static get originalStyleUrls() {
906
- return {
907
- "$": ["wm-tag-input.scss"]
908
- };
909
- }
910
- static get styleUrls() {
911
- return {
912
- "$": ["wm-tag-input.css"]
913
- };
914
- }
915
- static get properties() {
916
- return {
917
- "label": {
918
- "type": "string",
919
- "mutable": false,
920
- "complexType": {
921
- "original": "string",
922
- "resolved": "string",
923
- "references": {}
924
- },
925
- "required": true,
926
- "optional": false,
927
- "docs": {
928
- "tags": [],
929
- "text": ""
930
- },
931
- "attribute": "label",
932
- "reflect": false
933
- },
934
- "labelPosition": {
935
- "type": "string",
936
- "mutable": false,
937
- "complexType": {
938
- "original": "\"top\" | \"left\" | \"none\"",
939
- "resolved": "\"left\" | \"none\" | \"top\"",
940
- "references": {}
941
- },
942
- "required": false,
943
- "optional": false,
944
- "docs": {
945
- "tags": [],
946
- "text": ""
947
- },
948
- "attribute": "label-position",
949
- "reflect": false,
950
- "defaultValue": "\"top\""
951
- },
952
- "options": {
953
- "type": "string",
954
- "mutable": true,
955
- "complexType": {
956
- "original": "string",
957
- "resolved": "string",
958
- "references": {}
959
- },
960
- "required": false,
961
- "optional": false,
962
- "docs": {
963
- "tags": [],
964
- "text": ""
965
- },
966
- "attribute": "options",
967
- "reflect": false,
968
- "defaultValue": "\"\""
969
- },
970
- "selectedTags": {
971
- "type": "string",
972
- "mutable": true,
973
- "complexType": {
974
- "original": "string",
975
- "resolved": "string",
976
- "references": {}
977
- },
978
- "required": false,
979
- "optional": false,
980
- "docs": {
981
- "tags": [],
982
- "text": ""
983
- },
984
- "attribute": "selected-tags",
985
- "reflect": true,
986
- "defaultValue": "\"\""
987
- },
988
- "info": {
989
- "type": "string",
990
- "mutable": false,
991
- "complexType": {
992
- "original": "string",
993
- "resolved": "string | undefined",
994
- "references": {}
995
- },
996
- "required": false,
997
- "optional": true,
998
- "docs": {
999
- "tags": [],
1000
- "text": ""
1001
- },
1002
- "attribute": "info",
1003
- "reflect": false
1004
- },
1005
- "addNew": {
1006
- "type": "boolean",
1007
- "mutable": false,
1008
- "complexType": {
1009
- "original": "boolean",
1010
- "resolved": "boolean",
1011
- "references": {}
1012
- },
1013
- "required": false,
1014
- "optional": false,
1015
- "docs": {
1016
- "tags": [],
1017
- "text": ""
1018
- },
1019
- "attribute": "add-new",
1020
- "reflect": false,
1021
- "defaultValue": "true"
1022
- },
1023
- "placeholder": {
1024
- "type": "string",
1025
- "mutable": true,
1026
- "complexType": {
1027
- "original": "string",
1028
- "resolved": "string | undefined",
1029
- "references": {}
1030
- },
1031
- "required": false,
1032
- "optional": true,
1033
- "docs": {
1034
- "tags": [],
1035
- "text": ""
1036
- },
1037
- "attribute": "placeholder",
1038
- "reflect": false
1039
- },
1040
- "characterLimit": {
1041
- "type": "number",
1042
- "mutable": false,
1043
- "complexType": {
1044
- "original": "number",
1045
- "resolved": "number",
1046
- "references": {}
1047
- },
1048
- "required": false,
1049
- "optional": false,
1050
- "docs": {
1051
- "tags": [],
1052
- "text": ""
1053
- },
1054
- "attribute": "character-limit",
1055
- "reflect": false,
1056
- "defaultValue": "50"
1057
- },
1058
- "maxTags": {
1059
- "type": "number",
1060
- "mutable": false,
1061
- "complexType": {
1062
- "original": "number",
1063
- "resolved": "number | undefined",
1064
- "references": {}
1065
- },
1066
- "required": false,
1067
- "optional": true,
1068
- "docs": {
1069
- "tags": [],
1070
- "text": ""
1071
- },
1072
- "attribute": "max-tags",
1073
- "reflect": false
1074
- },
1075
- "tagInputType": {
1076
- "type": "string",
1077
- "mutable": false,
1078
- "complexType": {
1079
- "original": "\"dropdown\" | \"table\"",
1080
- "resolved": "\"dropdown\" | \"table\"",
1081
- "references": {}
1082
- },
1083
- "required": false,
1084
- "optional": false,
1085
- "docs": {
1086
- "tags": [],
1087
- "text": ""
1088
- },
1089
- "attribute": "tag-input-type",
1090
- "reflect": false,
1091
- "defaultValue": "\"dropdown\""
1092
- },
1093
- "colHeaders": {
1094
- "type": "string",
1095
- "mutable": false,
1096
- "complexType": {
1097
- "original": "string",
1098
- "resolved": "string",
1099
- "references": {}
1100
- },
1101
- "required": true,
1102
- "optional": false,
1103
- "docs": {
1104
- "tags": [],
1105
- "text": ""
1106
- },
1107
- "attribute": "col-headers",
1108
- "reflect": false
1109
- },
1110
- "colWidths": {
1111
- "type": "string",
1112
- "mutable": false,
1113
- "complexType": {
1114
- "original": "string",
1115
- "resolved": "string | undefined",
1116
- "references": {}
1117
- },
1118
- "required": false,
1119
- "optional": true,
1120
- "docs": {
1121
- "tags": [],
1122
- "text": ""
1123
- },
1124
- "attribute": "col-widths",
1125
- "reflect": false
1126
- },
1127
- "colWrap": {
1128
- "type": "string",
1129
- "mutable": false,
1130
- "complexType": {
1131
- "original": "string",
1132
- "resolved": "string | undefined",
1133
- "references": {}
1134
- },
1135
- "required": false,
1136
- "optional": true,
1137
- "docs": {
1138
- "tags": [],
1139
- "text": ""
1140
- },
1141
- "attribute": "col-wrap",
1142
- "reflect": false
1143
- }
1144
- };
1145
- }
1146
- static get states() {
1147
- return {
1148
- "focusedListItem": {},
1149
- "focusedTag": {},
1150
- "tablePosition": {},
1151
- "isExpanded": {},
1152
- "tagsList": {},
1153
- "optionsList": {},
1154
- "charCount": {},
1155
- "liveRegionMessage": {}
1156
- };
1157
- }
1158
- static get events() {
1159
- return [{
1160
- "method": "wmTagInputChanged",
1161
- "name": "wmTagInputChanged",
1162
- "bubbles": true,
1163
- "cancelable": true,
1164
- "composed": true,
1165
- "docs": {
1166
- "tags": [],
1167
- "text": ""
1168
- },
1169
- "complexType": {
1170
- "original": "{\n value: string[] | HTMLWmTagInputRowElement[];\n tagChanged: string | HTMLWmTagInputRowElement;\n }",
1171
- "resolved": "{ value: string[] | HTMLWmTagInputRowElement[]; tagChanged: string | HTMLWmTagInputRowElement; }",
1172
- "references": {
1173
- "HTMLWmTagInputRowElement": {
1174
- "location": "global"
1175
- }
1176
- }
1177
- }
1178
- }];
1179
- }
1180
- static get elementRef() { return "el"; }
1181
- static get watchers() {
1182
- return [{
1183
- "propName": "tagsList",
1184
- "methodName": "reflectSelectedTags"
1185
- }];
1186
- }
1187
- static get listeners() {
1188
- return [{
1189
- "name": "wmTagInputRowUpdated",
1190
- "method": "handleRowUpdate",
1191
- "target": undefined,
1192
- "capture": false,
1193
- "passive": false
1194
- }, {
1195
- "name": "click",
1196
- "method": "closeIfNotElOrChild",
1197
- "target": "document",
1198
- "capture": false,
1199
- "passive": false
1200
- }, {
1201
- "name": "scroll",
1202
- "method": "dismissTooltip",
1203
- "target": "window",
1204
- "capture": true,
1205
- "passive": true
1206
- }];
1207
- }
1208
- }
1209
- //# sourceMappingURL=wm-tag-input.js.map
1
+ import { h, Host, forceUpdate, } from "@stencil/core";
2
+ import { csvToArray, debounce, generateId, hideTooltip, intl, measureText, shouldOpenUp, showTooltip, } from "../../global/functions";
3
+ export class TagInput {
4
+ constructor() {
5
+ this.uid = this.el.id ? this.el.id : generateId();
6
+ this.openUp = false;
7
+ this.tooltipVisible = false;
8
+ this.tagAreaInstructions = intl.formatMessage({
9
+ id: "tagInput.tagAreaInstructions",
10
+ defaultMessage: "tag selection. Press Backspace or Delete to remove a tag.",
11
+ });
12
+ this.maxTagsReachedMessage = intl.formatMessage({
13
+ id: "tagInput.maxTagsReached",
14
+ defaultMessage: "No more tags can be added because the limit has been reached.",
15
+ });
16
+ this.debouncedUpdate = debounce(() => forceUpdate(this.el), 30);
17
+ this.label = undefined;
18
+ this.labelPosition = "top";
19
+ this.options = "";
20
+ this.selectedTags = "";
21
+ this.info = undefined;
22
+ this.addNew = true;
23
+ this.placeholder = undefined;
24
+ this.characterLimit = 50;
25
+ this.maxTags = undefined;
26
+ this.tagInputType = "dropdown";
27
+ this.colHeaders = undefined;
28
+ this.colWidths = undefined;
29
+ this.colWrap = undefined;
30
+ this.focusedListItem = undefined;
31
+ this.focusedTag = null;
32
+ this.tablePosition = { row: 0, column: 1 };
33
+ this.isExpanded = false;
34
+ this.tagsList = csvToArray(this.selectedTags);
35
+ this.optionsList = csvToArray(this.options);
36
+ this.charCount = 0;
37
+ this.liveRegionMessage = "";
38
+ }
39
+ get focusedElement() {
40
+ return this.el.shadowRoot.activeElement;
41
+ }
42
+ get listItemEls() {
43
+ return Array.from(this.dropdownEl.querySelectorAll("li"));
44
+ }
45
+ get tagEls() {
46
+ return this.tagAreaEl ? Array.from(this.tagAreaEl.querySelectorAll(".tag")) : [];
47
+ }
48
+ get nonLockedTagEls() {
49
+ return this.tagEls.filter((tag) => !tag.classList.contains("locked"));
50
+ }
51
+ get optionEls() {
52
+ return Array.from(this.dropdownEl.querySelectorAll(".option"));
53
+ }
54
+ get wmRowEls() {
55
+ return Array.from(this.el.querySelectorAll("wm-tag-input-row"));
56
+ }
57
+ get localRowEls() {
58
+ return Array.from(this.el.shadowRoot.querySelectorAll("tr"));
59
+ }
60
+ get filteredRows() {
61
+ return this.wmRowEls.filter((row) => {
62
+ const colValues = [row.col1, row.col2, row.col3, row.col4].join("").toLowerCase();
63
+ return this.inputEl && this.inputEl.value ? colValues.includes(this.inputEl.value.toLowerCase()) : true;
64
+ });
65
+ }
66
+ get nonLockedTagsList() {
67
+ let list = [];
68
+ if (this.tagInputType === "table") {
69
+ this.tagsList.forEach((id) => {
70
+ const correspondingRowEl = this.wmRowEls.filter((row) => id === row.id)[0];
71
+ if (!correspondingRowEl.locked) {
72
+ list.push(id);
73
+ }
74
+ });
75
+ }
76
+ else if (this.tagInputType === "dropdown") {
77
+ list = this.tagsList;
78
+ }
79
+ return list;
80
+ }
81
+ get tagLimitReached() {
82
+ return !!(this.maxTags && this.tagsList.length >= this.maxTags);
83
+ }
84
+ get noResultsMessage() {
85
+ return intl.formatMessage({
86
+ id: "tagInput.noResults",
87
+ defaultMessage: "No results match your search.",
88
+ description: "Message displayed when a user's search returns empty.",
89
+ });
90
+ }
91
+ get inputMinimumWidth() {
92
+ // 150px is the minimum width of the input field, or the length of the placeholder text
93
+ const inputElStyles = getComputedStyle(this.inputEl);
94
+ const tagElStyles = getComputedStyle(this.tagEls[this.tagEls.length - 1]);
95
+ const inputElBuffer = [
96
+ inputElStyles.paddingLeft,
97
+ inputElStyles.paddingRight,
98
+ inputElStyles.marginLeft,
99
+ inputElStyles.marginRight,
100
+ tagElStyles.marginRight,
101
+ ].reduce((prev, curr) => prev + parseInt(curr.replace("px", "")), 0);
102
+ const minimumWidth = Math.max(150, measureText(this.inputEl, this.placeholder).width + inputElBuffer);
103
+ return minimumWidth;
104
+ }
105
+ generateTagAddedMessage(tag) {
106
+ return intl.formatMessage({
107
+ id: "tagInput.tagAdded",
108
+ defaultMessage: "{tagName} added.",
109
+ description: "A confirmation for adding a tag.",
110
+ }, { tagName: tag });
111
+ }
112
+ generateTagAlreadyAddedMessage(tag) {
113
+ return intl.formatMessage({
114
+ id: "tagInput.tagAlreadyAdded",
115
+ defaultMessage: "{tagName} has already been added.",
116
+ description: "An alert for adding a tag that is already present.",
117
+ }, { tagName: tag });
118
+ }
119
+ generateTagCounterMessage(x, y) {
120
+ return intl.formatMessage({
121
+ id: "tagInput.tagsAddedCounter",
122
+ defaultMessage: "Tags added: {x, number}/{y, number}",
123
+ description: "For the user to understand how close they are to the tag limit.",
124
+ }, {
125
+ x: x,
126
+ y: y,
127
+ });
128
+ }
129
+ generateCharacterLimitLabel(characterLimit) {
130
+ return intl.formatMessage({
131
+ id: "global.characterLimit",
132
+ defaultMessage: "{limit, number} characters allowed.",
133
+ description: "for screen readers",
134
+ }, { limit: characterLimit });
135
+ }
136
+ componentWillLoad() {
137
+ if (!this.placeholder) {
138
+ this.placeholder = this.createPlaceholderDefault(this.addNew, !!this.options);
139
+ }
140
+ if (!this.label) {
141
+ console.error("wm-tag-input must have a label property");
142
+ }
143
+ this.consolidateSelectedTags();
144
+ this.el.focus = () => {
145
+ const firstFocusableTag = this.nonLockedTagEls[0];
146
+ if (firstFocusableTag) {
147
+ this.tagAreaEl.focus();
148
+ this.focusTag(firstFocusableTag);
149
+ }
150
+ else {
151
+ this.inputEl.focus();
152
+ }
153
+ };
154
+ // on resize of component, trigger componentDidRender -> positionInput
155
+ const resizeObserver = new ResizeObserver(() => this.debouncedUpdate());
156
+ resizeObserver.observe(this.el);
157
+ }
158
+ componentDidLoad() {
159
+ // prevent highlighting of pre-selected tags
160
+ this.tagEls.forEach((el) => el.classList.remove("highlight"));
161
+ }
162
+ componentDidRender() {
163
+ this.positionInput();
164
+ }
165
+ consolidateSelectedTags() {
166
+ this.tagsList.forEach((tag) => {
167
+ if (!this.includesCaseInsensitive(this.optionsList, tag)) {
168
+ this.options += `${this.options.length > 0 ? "," : ""}${tag}`;
169
+ }
170
+ });
171
+ this.optionsList = csvToArray(this.options);
172
+ }
173
+ createPlaceholderDefault(addNew, hasOptions) {
174
+ const addAndSearchPlaceholder = intl.formatMessage({
175
+ id: "tagInput.placeholderAddAndSearch",
176
+ defaultMessage: "Add or search for a tag",
177
+ description: "Placeholder text. Use imperative",
178
+ });
179
+ const searchPlaceholder = intl.formatMessage({
180
+ id: "tagInput.placeholderSearch",
181
+ defaultMessage: "Search and select a tag",
182
+ description: "Placeholder text. Use imperative",
183
+ });
184
+ const addPlaceholder = intl.formatMessage({
185
+ id: "tagInput.placeholderAdd",
186
+ defaultMessage: "Add a new tag",
187
+ description: "Placeholder text. Use imperative",
188
+ });
189
+ let placeholder = "";
190
+ if (addNew && hasOptions) {
191
+ placeholder = addAndSearchPlaceholder;
192
+ }
193
+ else if (!addNew && hasOptions) {
194
+ placeholder = searchPlaceholder;
195
+ }
196
+ else if (addNew) {
197
+ placeholder = addPlaceholder;
198
+ }
199
+ return placeholder;
200
+ }
201
+ reflectSelectedTags(newValue, oldValue) {
202
+ const isAddition = newValue.length > oldValue.length;
203
+ let changedTag = "";
204
+ let selectedTags = this.tagsList;
205
+ if (isAddition) {
206
+ changedTag = newValue.filter((val) => !oldValue.includes(val))[0];
207
+ }
208
+ else {
209
+ changedTag = oldValue.filter((val) => !newValue.includes(val))[0];
210
+ }
211
+ // event emitted by type table uses element references instead of strings
212
+ if (this.tagInputType === "table") {
213
+ changedTag = this.wmRowEls.filter((row) => row.id === changedTag)[0];
214
+ selectedTags = this.tagsList.map((id) => this.el.querySelector(`#${id}`));
215
+ }
216
+ this.selectedTags = this.listToCSV(this.tagsList);
217
+ let detail = { value: selectedTags, tagChanged: changedTag };
218
+ this.wmTagInputChanged.emit(detail);
219
+ }
220
+ handleRowUpdate() {
221
+ forceUpdate(this.el);
222
+ }
223
+ closeIfNotElOrChild(ev) {
224
+ const isntElOrChild = ev.target !== this.el && !this.el.shadowRoot.contains(ev.target);
225
+ if (this.tagInputType === "dropdown" && isntElOrChild && this.isExpanded) {
226
+ this.closeDropdown();
227
+ }
228
+ }
229
+ // From wm-button
230
+ // we need to listen for scroll events during the capture phase because they do not bubble up
231
+ // there can be layouts where the main content has 100vh and overflows
232
+ // in these cases window will register no scroll events unless we catch on they way down
233
+ dismissTooltip() {
234
+ if (this.tooltipVisible) {
235
+ hideTooltip();
236
+ this.tooltipVisible = false;
237
+ }
238
+ }
239
+ handleInputKeyDown(ev) {
240
+ if (/^.$/.test(ev.key) && this.inputEl.value.length >= this.characterLimit) {
241
+ this.announceCharacterLimitWarning(this.inputEl.value.length, this.characterLimit);
242
+ }
243
+ // prevent keydown triggering on tag area
244
+ ev.stopPropagation();
245
+ switch (ev.key) {
246
+ case "Enter":
247
+ case ",":
248
+ ev.preventDefault();
249
+ this.handleInputEnter();
250
+ break;
251
+ case "ArrowDown":
252
+ ev.preventDefault();
253
+ this.handleInputArrowDown();
254
+ break;
255
+ case "ArrowUp":
256
+ ev.preventDefault();
257
+ this.handleInputArrowUp();
258
+ break;
259
+ case "ArrowLeft":
260
+ ev.preventDefault();
261
+ if (this.tagInputType === "table" && this.tablePosition.row) {
262
+ this.moveLeftCell();
263
+ }
264
+ break;
265
+ case "ArrowRight":
266
+ ev.preventDefault();
267
+ if (this.tagInputType === "table" && this.tablePosition.row) {
268
+ this.moveRightCell();
269
+ }
270
+ break;
271
+ case "Escape":
272
+ if (this.tagInputType === "dropdown" && this.isExpanded) {
273
+ this.closeDropdown();
274
+ }
275
+ break;
276
+ case "ArrowLeft":
277
+ case "Backspace":
278
+ this.handleInputBackspace();
279
+ break;
280
+ }
281
+ }
282
+ handleInputFocus() {
283
+ if (this.tagInputType === "dropdown") {
284
+ this.openDropdown();
285
+ this.clearListItemFocus();
286
+ }
287
+ // force update needed to apply styled state of field-wrapper el
288
+ forceUpdate(this.el);
289
+ }
290
+ handleInputChanged(value) {
291
+ this.charCount = value.length;
292
+ if (this.tagInputType === "dropdown") {
293
+ this.clearListItemFocus();
294
+ if (this.charCount >= this.characterLimit - 5) {
295
+ this.announceCharacterLimitWarning(this.charCount, this.characterLimit);
296
+ }
297
+ if (!this.isExpanded) {
298
+ this.openDropdown();
299
+ }
300
+ }
301
+ else if (this.tagInputType === "table") {
302
+ this.clearCellFocus();
303
+ }
304
+ this.announceExistingOptions();
305
+ }
306
+ handleInputEnter() {
307
+ if (this.tagInputType === "dropdown") {
308
+ if (this.focusedListItem) {
309
+ this.handleListItemClick(this.focusedListItem);
310
+ }
311
+ else {
312
+ this.submitInput(this.addNew, this.inputEl.value.trim());
313
+ }
314
+ }
315
+ else if (this.tagInputType === "table" && this.tablePosition.row > 0) {
316
+ this.handleTableRowClick(this.localRowEls[this.tablePosition.row].id);
317
+ }
318
+ }
319
+ submitInput(canAddNew, value) {
320
+ const hasNonWhiteSpaceCharacters = value.match(/\S/);
321
+ if (canAddNew && hasNonWhiteSpaceCharacters) {
322
+ this.addTag(value);
323
+ this.optionsList = this.addOption(value);
324
+ this.resetInput();
325
+ }
326
+ }
327
+ handleInputArrowDown() {
328
+ if (this.tagInputType === "table") {
329
+ this.moveDownRow();
330
+ }
331
+ else if (this.tagInputType === "dropdown" && this.isExpanded) {
332
+ this.moveDownListItem();
333
+ }
334
+ else if (this.tagInputType === "dropdown") {
335
+ this.openDropdown();
336
+ }
337
+ }
338
+ handleInputArrowUp() {
339
+ if (this.tagInputType === "table") {
340
+ this.moveUpRow();
341
+ }
342
+ else if (this.tagInputType === "dropdown" && this.isExpanded) {
343
+ this.moveUpListItem();
344
+ }
345
+ else if (this.tagInputType === "dropdown") {
346
+ this.openDropdown();
347
+ }
348
+ }
349
+ handleInputBackspace() {
350
+ if (this.inputEl.value === "" && this.tagsList.length > 0) {
351
+ // wait for events to finish firing before redirecting focus
352
+ // prevents double input in input area and tag area
353
+ window.requestAnimationFrame(() => {
354
+ if (this.nonLockedTagsList.length > 0) {
355
+ this.tagAreaEl.focus();
356
+ this.focusTag(this.tagEls[this.tagEls.length - 1]);
357
+ }
358
+ });
359
+ }
360
+ }
361
+ handleListItemKeyDown(ev) {
362
+ const typedEvTarget = ev.target;
363
+ switch (ev.key) {
364
+ case "Enter":
365
+ case " ":
366
+ ev.preventDefault();
367
+ typedEvTarget.click();
368
+ break;
369
+ case "ArrowDown":
370
+ ev.preventDefault();
371
+ this.moveDownListItem();
372
+ break;
373
+ case "ArrowUp":
374
+ ev.preventDefault();
375
+ this.moveUpListItem();
376
+ break;
377
+ case "Escape":
378
+ if (this.focusedElement !== this.inputEl) {
379
+ this.inputEl.focus();
380
+ }
381
+ else if (this.tagInputType === "dropdown") {
382
+ this.closeDropdown();
383
+ }
384
+ break;
385
+ }
386
+ }
387
+ handleListItemClick(item) {
388
+ const tag = item.dataset.option.trim() || "";
389
+ if (this.includesCaseInsensitive(this.tagsList, tag)) {
390
+ this.announce(this.generateTagAlreadyAddedMessage(tag));
391
+ }
392
+ else {
393
+ this.resetInput();
394
+ this.addTag(tag);
395
+ this.optionsList = this.addOption(tag);
396
+ this.focusedListItem = null;
397
+ }
398
+ }
399
+ handleTableRowClick(rowId) {
400
+ const referencedRow = this.el.querySelector(`#${rowId}`);
401
+ const isLocked = referencedRow.locked;
402
+ if (!isLocked) {
403
+ if (this.includesCaseInsensitive(this.tagsList, rowId)) {
404
+ this.removeTag(rowId);
405
+ }
406
+ else if (!this.tagLimitReached) {
407
+ this.addTag(rowId);
408
+ this.resetInput();
409
+ }
410
+ }
411
+ }
412
+ handleTagAreaKeyDown(ev) {
413
+ switch (ev.key) {
414
+ case "ArrowLeft":
415
+ case "ArrowUp":
416
+ ev.preventDefault();
417
+ this.moveLeftTag();
418
+ break;
419
+ case "ArrowRight":
420
+ case "ArrowDown":
421
+ ev.preventDefault();
422
+ this.moveRightTag();
423
+ break;
424
+ case "Backspace":
425
+ case "Delete":
426
+ this.handleTagAreaDelete();
427
+ break;
428
+ }
429
+ }
430
+ handleTagAreaDelete() {
431
+ const isLocked = this.focusedTag && this.focusedTag.classList.contains("locked");
432
+ if (this.focusedTag && this.focusedTag.dataset.tag && !isLocked) {
433
+ this.removeTag(this.focusedTag.dataset.tag);
434
+ if (this.nonLockedTagsList.length === 0) {
435
+ // focus input if no tags are left
436
+ this.inputEl.focus();
437
+ }
438
+ else if (this.focusedTag === this.tagEls[this.tagEls.length - 1]) {
439
+ // reassign focus if removing the last tag but there are still tags remaining
440
+ this.focusedTag = this.tagEls[this.tagEls.length - 2];
441
+ this.focusTag(this.focusedTag);
442
+ }
443
+ }
444
+ }
445
+ handleBlur(ev, component) {
446
+ const isntElOrChild = ev.relatedTarget !== component && !this.el.shadowRoot.contains(ev.relatedTarget);
447
+ this.dismissTooltip();
448
+ this.clearCellFocus();
449
+ if (isntElOrChild) {
450
+ this.fieldWrapperEl.classList.remove("focused");
451
+ if (this.tagInputType === "dropdown") {
452
+ this.closeDropdown();
453
+ }
454
+ }
455
+ }
456
+ handleCellMouseEnter(ev) {
457
+ const cell = ev.target;
458
+ const contentWrapper = cell.querySelector(".cell-content-wrapper");
459
+ const isTruncated = contentWrapper.scrollWidth > contentWrapper.clientWidth;
460
+ if (isTruncated) {
461
+ // innerText is necessary vs textContent, as innerText ignores sr-only / display: none text
462
+ showTooltip("bottom", cell, cell.innerText);
463
+ this.tooltipVisible = true;
464
+ }
465
+ }
466
+ handleTagAreaFocus() {
467
+ if (this.tagInputType === "dropdown") {
468
+ this.closeDropdown();
469
+ }
470
+ const firstFocusableTag = this.nonLockedTagEls[0];
471
+ firstFocusableTag && this.focusTag(firstFocusableTag);
472
+ }
473
+ handleRemoveButtonClick(tag) {
474
+ this.moveLeftTag();
475
+ this.removeTag(tag);
476
+ }
477
+ moveDownListItem() {
478
+ if (this.listItemEls.length > 0) {
479
+ const firstListItem = this.listItemEls[0];
480
+ if (!this.focusedListItem) {
481
+ this.focusListItem(firstListItem);
482
+ }
483
+ else if (this.focusedListItem.nextElementSibling) {
484
+ this.focusListItem(this.focusedListItem.nextElementSibling);
485
+ }
486
+ else {
487
+ this.focusListItem(firstListItem);
488
+ }
489
+ }
490
+ }
491
+ moveUpListItem() {
492
+ if (this.listItemEls.length > 0) {
493
+ const lastListItem = this.listItemEls[this.listItemEls.length - 1];
494
+ if (!this.focusedListItem) {
495
+ this.focusListItem(lastListItem);
496
+ }
497
+ else if (this.focusedListItem.previousElementSibling) {
498
+ this.focusListItem(this.focusedListItem.previousElementSibling);
499
+ }
500
+ else {
501
+ this.clearListItemFocus();
502
+ }
503
+ }
504
+ }
505
+ moveDownRow() {
506
+ if (this.filteredRows.length > 0) {
507
+ if (this.tablePosition.row === 0) {
508
+ this.tablePosition.row = 1;
509
+ }
510
+ else if (this.tablePosition.row === this.filteredRows.length) {
511
+ this.tablePosition.row = 1;
512
+ }
513
+ else {
514
+ this.tablePosition.row++;
515
+ }
516
+ // skip locked rows
517
+ const rowToFocus = this.wmRowEls[this.tablePosition.row - 1];
518
+ if (rowToFocus.locked) {
519
+ this.moveDownRow();
520
+ }
521
+ else {
522
+ this.focusCell(this.tablePosition);
523
+ }
524
+ }
525
+ }
526
+ moveUpRow() {
527
+ if (this.filteredRows.length > 0) {
528
+ if (this.tablePosition.row === 0) {
529
+ this.tablePosition.row = this.filteredRows.length;
530
+ }
531
+ else if (this.tablePosition.row === 1) {
532
+ this.tablePosition.row = 0;
533
+ }
534
+ else {
535
+ this.tablePosition.row--;
536
+ }
537
+ // skip locked rows
538
+ const rowToFocus = this.wmRowEls[this.tablePosition.row - 1];
539
+ if (rowToFocus && rowToFocus.locked) {
540
+ this.moveUpRow();
541
+ }
542
+ else if (rowToFocus) {
543
+ this.focusCell(this.tablePosition);
544
+ }
545
+ else {
546
+ this.clearCellFocus();
547
+ }
548
+ }
549
+ }
550
+ moveLeftCell() {
551
+ if (this.tablePosition.column != 1) {
552
+ this.tablePosition.column--;
553
+ this.focusCell(this.tablePosition);
554
+ }
555
+ }
556
+ moveRightCell() {
557
+ const numCols = csvToArray(this.colHeaders).length;
558
+ if (this.tablePosition.column < numCols) {
559
+ this.tablePosition.column++;
560
+ this.focusCell(this.tablePosition);
561
+ }
562
+ }
563
+ moveLeftTag() {
564
+ const lastTag = this.tagEls[this.tagEls.length - 1];
565
+ if (this.focusedTag && this.tagEls.includes(this.focusedTag.previousElementSibling)) {
566
+ this.focusedTag = this.focusedTag.previousElementSibling;
567
+ }
568
+ else {
569
+ this.focusedTag = lastTag;
570
+ }
571
+ // skip locked tags
572
+ if (this.focusedTag.classList.contains("locked") && this.nonLockedTagEls.length > 0) {
573
+ this.moveLeftTag();
574
+ }
575
+ else {
576
+ this.focusTag(this.focusedTag);
577
+ }
578
+ }
579
+ moveRightTag() {
580
+ const firstTag = this.tagEls[0];
581
+ if (this.focusedTag && this.tagEls.includes(this.focusedTag.nextElementSibling)) {
582
+ this.focusedTag = this.focusedTag.nextElementSibling;
583
+ }
584
+ else {
585
+ this.focusedTag = firstTag;
586
+ }
587
+ // skip locked tags
588
+ if (this.focusedTag.classList.contains("locked")) {
589
+ this.moveRightTag();
590
+ }
591
+ else {
592
+ this.focusTag(this.focusedTag);
593
+ }
594
+ }
595
+ addOption(option) {
596
+ let newOptionsList = this.optionsList;
597
+ const optionAlreadyExists = this.includesCaseInsensitive(this.optionsList, option);
598
+ if (!optionAlreadyExists) {
599
+ newOptionsList = newOptionsList.concat(option);
600
+ }
601
+ return newOptionsList;
602
+ }
603
+ removeOption(option) {
604
+ this.optionsList = this.filterCaseInsensitive(this.optionsList, option);
605
+ }
606
+ addTag(tag) {
607
+ let newTagsList = this.tagsList;
608
+ const tagAlreadyAdded = this.includesCaseInsensitive(this.tagsList, tag);
609
+ const tagExistsAsOption = this.optionsList.filter((x) => x.toLowerCase() === tag.toLowerCase())[0];
610
+ if (!tagAlreadyAdded) {
611
+ let textToAnnounce = tag;
612
+ if (this.tagInputType === "table") {
613
+ const referencedRow = this.el.querySelector(`#${tag}`);
614
+ textToAnnounce = referencedRow.col1;
615
+ }
616
+ this.announce(this.generateTagAddedMessage(textToAnnounce));
617
+ this.tagsList = newTagsList.concat(tagExistsAsOption || tag);
618
+ // if maxTags has been reached, focus should go to the tagArea
619
+ if (this.tagLimitReached) {
620
+ this.tagAreaEl.focus();
621
+ }
622
+ }
623
+ }
624
+ removeTag(tag) {
625
+ let textToAnnounce = tag;
626
+ if (this.tagInputType === "table") {
627
+ const referencedRow = this.el.querySelector(`#${tag}`);
628
+ textToAnnounce = referencedRow.col1;
629
+ }
630
+ const tagRemovedMessage = intl.formatMessage({ id: "tagInput.tagRemoved", defaultMessage: "{tag} removed" }, { tag: textToAnnounce });
631
+ this.announce(tagRemovedMessage);
632
+ this.tagsList = this.filterCaseInsensitive(this.tagsList, tag);
633
+ if (this.tagInputType === "dropdown") {
634
+ // if a tag was introduced by the user, also remove it from the dropdown options
635
+ const devOptionsList = csvToArray(this.options);
636
+ if (this.includesCaseInsensitive(this.optionsList, tag) && !this.includesCaseInsensitive(devOptionsList, tag)) {
637
+ this.removeOption(tag);
638
+ }
639
+ }
640
+ }
641
+ focusListItem(item) {
642
+ this.focusedListItem = item;
643
+ this.inputEl.setAttribute("aria-activedescendant", this.focusedListItem.id);
644
+ item.scrollIntoView({ block: "nearest" });
645
+ }
646
+ focusTag(element) {
647
+ if (element.classList.contains("locked")) {
648
+ this.focusedTag = null;
649
+ this.tagAreaEl.setAttribute("aria-activedescendant", "");
650
+ }
651
+ else {
652
+ this.focusedTag = element;
653
+ this.tagAreaEl.setAttribute("aria-activedescendant", this.focusedTag.id);
654
+ }
655
+ }
656
+ focusCell(position) {
657
+ this.clearCellFocus(false);
658
+ if (position.row) {
659
+ const rowToFocus = this.localRowEls[position.row];
660
+ const rowCells = rowToFocus.querySelectorAll("td");
661
+ const cellToFocus = rowCells[position.column - 1];
662
+ const contentWrapper = cellToFocus.querySelector(".cell-content-wrapper");
663
+ const isTruncated = contentWrapper.scrollWidth > contentWrapper.clientWidth;
664
+ rowToFocus.classList.add("focused");
665
+ cellToFocus.classList.add("focused");
666
+ cellToFocus.scrollIntoView({ block: "nearest" });
667
+ this.inputEl.setAttribute("aria-activedescendant", cellToFocus.id);
668
+ this.dismissTooltip();
669
+ if (isTruncated) {
670
+ // innerText is necessary vs textContent, as innerText ignores sr-only / display: none text
671
+ showTooltip("bottom", cellToFocus, cellToFocus.innerText);
672
+ this.tooltipVisible = true;
673
+ }
674
+ }
675
+ }
676
+ clearTagFocus() {
677
+ this.tagAreaEl.setAttribute("aria-activedescendant", "");
678
+ this.focusedTag = null;
679
+ }
680
+ clearCellFocus(resetPosition = true) {
681
+ this.inputEl.setAttribute("aria-activedescendant", "");
682
+ if (resetPosition) {
683
+ this.tablePosition = { row: 0, column: 1 };
684
+ }
685
+ this.localRowEls.forEach((row) => {
686
+ row.classList.remove("focused");
687
+ row.querySelectorAll("td").forEach((cell) => {
688
+ cell.classList.remove("focused");
689
+ });
690
+ });
691
+ }
692
+ openDropdown() {
693
+ // given an offset of -2px because the dropdown is transformed downwards to avoid overlapping the focus border
694
+ this.openUp = shouldOpenUp(this.el, this.dropdownEl, this.el.clientHeight, -2);
695
+ this.isExpanded = true;
696
+ }
697
+ closeDropdown() {
698
+ this.clearListItemFocus();
699
+ this.isExpanded = false;
700
+ }
701
+ clearListItemFocus() {
702
+ this.focusedListItem = null;
703
+ this.inputEl.setAttribute("aria-activedescendant", "");
704
+ this.listItemEls.forEach((el) => {
705
+ el.classList.remove("focused");
706
+ });
707
+ }
708
+ resetInput() {
709
+ this.charCount = 0;
710
+ this.inputEl.value = "";
711
+ }
712
+ announce(message) {
713
+ // \u00A0 is a non-breaking space character, which causes the message to be read as a new one
714
+ if (this.liveRegionEl.textContent === message) {
715
+ message += "\u00A0";
716
+ }
717
+ this.liveRegionMessage = message;
718
+ }
719
+ announceExistingOptions() {
720
+ // request animation frame to wait for re-rendering of filtered options
721
+ window.requestAnimationFrame(() => {
722
+ let numResults = 0;
723
+ if (this.tagInputType === "dropdown") {
724
+ numResults = this.optionEls.length;
725
+ }
726
+ else if (this.tagInputType === "table") {
727
+ numResults = this.filteredRows.length;
728
+ }
729
+ const existingOptionsMessage = intl.formatMessage({
730
+ id: "tagInput.existingOptions",
731
+ defaultMessage: "{num, plural, one {1 existing option.} other {# existing options.}}",
732
+ }, { num: numResults });
733
+ this.announce(existingOptionsMessage);
734
+ });
735
+ }
736
+ announceCharacterLimitWarning(charCount, charLimit) {
737
+ const charactersEnteredMessage = intl.formatMessage({
738
+ id: "global.charactersEntered",
739
+ defaultMessage: "{x, number} of {y, number} characters entered.",
740
+ description: "for screen readers",
741
+ }, { x: charCount, y: charLimit });
742
+ const characterLimitReachedMessage = intl.formatMessage({
743
+ id: "global.characterLimitReached",
744
+ defaultMessage: "No additional characters will be entered.",
745
+ description: "for screen readers",
746
+ });
747
+ this.announce(`${charactersEnteredMessage}${charCount >= charLimit ? " " + characterLimitReachedMessage : ""}`);
748
+ }
749
+ positionInput() {
750
+ const lastTag = this.tagEls[this.tagEls.length - 1];
751
+ // default placement to fall back to when no tags are present, or not enough space is available
752
+ this.inputEl.style.position = "static";
753
+ this.inputEl.style.width = "100%";
754
+ if (lastTag) {
755
+ const spaceAvailable = this.tagAreaEl.getBoundingClientRect().right - lastTag.getBoundingClientRect().right;
756
+ if (spaceAvailable >= this.inputMinimumWidth) {
757
+ // because the input has right: 0px
758
+ // all thats needed to properly place it is setting position: absolute, top, and width
759
+ this.inputEl.style.position = "absolute";
760
+ this.inputEl.style.top = lastTag.offsetTop.toString() + "px";
761
+ this.inputEl.style.width =
762
+ (this.tagAreaEl.getBoundingClientRect().right - lastTag.getBoundingClientRect().right - 8).toString() + "px";
763
+ }
764
+ }
765
+ }
766
+ /// Helpers
767
+ listToCSV(list) {
768
+ return list.join(",");
769
+ }
770
+ includesCaseInsensitive(list, element) {
771
+ const lowercaseList = list.map((str) => str.toLowerCase());
772
+ return lowercaseList.includes(element.toLowerCase());
773
+ }
774
+ filterCaseInsensitive(list, element) {
775
+ return list.filter((x) => x.toLowerCase() !== element.toLowerCase());
776
+ }
777
+ sortCaseInsensitive(list) {
778
+ // The vanilla .sort method places words that start with capital letters above others (ASCII order)
779
+ // so we need to pass in our own compare function to sort case-insensitive
780
+ return list.sort((a, b) => {
781
+ a = a.toLowerCase();
782
+ b = b.toLowerCase();
783
+ return a > b ? 1 : a < b ? -1 : 0;
784
+ });
785
+ }
786
+ /// Renders
787
+ renderTags() {
788
+ let lockedTags = [];
789
+ let unlockedTags = [];
790
+ this.tagsList.forEach((tag, idx) => {
791
+ const id = `tag${idx + 1}`;
792
+ let tagText = "";
793
+ let isLocked = false;
794
+ if (this.tagInputType === "dropdown") {
795
+ tagText = tag;
796
+ }
797
+ else if (this.tagInputType === "table") {
798
+ // display table tags using col1 of the row with the same id
799
+ // if one can't be found, display as empty
800
+ const referencedRow = this.el.querySelector(`#${tag}`);
801
+ tagText = referencedRow ? referencedRow.col1 : "";
802
+ isLocked = referencedRow ? referencedRow.locked : false;
803
+ }
804
+ // make sure locked tags always appear in front of list
805
+ const targetList = isLocked ? lockedTags : unlockedTags;
806
+ targetList.push(h("li", { id: id, class: `tag highlight ${this.focusedTag && this.focusedTag.id === id ? "focused" : ""} ${isLocked ? "locked" : ""}`, "data-tag": tag, role: "option" }, tagText, isLocked ? (h("div", { class: "icon lock" })) : (h("button", { class: "icon remove-btn", tabIndex: -1, onClick: () => this.handleRemoveButtonClick(tag) }))));
807
+ });
808
+ return [...lockedTags, ...unlockedTags];
809
+ }
810
+ renderDropdown() {
811
+ return (h("div", { class: `dropdown-wrapper ${this.isExpanded ? "open" : ""} ${this.openUp ? "upwards" : ""}`, ref: (el) => (this.dropdownEl = el) }, h("div", { id: "help-text", class: "help-text" }, this.renderHelpText()), h("ul", { class: "dropdown", id: "dropdown", role: "listbox", "aria-multiselectable": "true", "aria-expanded": this.isExpanded ? "true" : false, "aria-label": this.label, tabindex: -1 }, this.inputEl && this.renderAddNewButton(), this.renderListItems(this.optionsList))));
812
+ }
813
+ renderListItems(optionsList) {
814
+ optionsList = this.sortCaseInsensitive(optionsList);
815
+ // filter by input
816
+ if (this.inputEl && this.inputEl.value) {
817
+ optionsList = this.optionsList.filter((option) => option.toLowerCase().includes(this.inputEl.value.toLowerCase()));
818
+ }
819
+ return optionsList.map((option, idx) => {
820
+ const id = `option${idx + 1}`;
821
+ const isFocused = this.focusedListItem && this.focusedListItem.id === id;
822
+ const isSelected = this.includesCaseInsensitive(this.tagsList, option);
823
+ return (h("li", { class: `option ${isFocused ? "focused" : ""}`, role: "option", id: id, "data-option": option, "aria-selected": isSelected ? "true" : "false", "aria-disabled": isSelected ? "true" : "false", onKeyDown: (ev) => this.handleListItemKeyDown(ev), onBlur: (ev) => this.handleBlur(ev, this.el), onClick: (ev) => this.handleListItemClick(ev.target) }, option));
824
+ });
825
+ }
826
+ renderAddNewButton() {
827
+ const hasNonWhiteSpaceCharacters = this.inputEl.value.match(/\S/);
828
+ const optionAlreadyExists = this.includesCaseInsensitive(this.optionsList, this.inputEl.value.trim());
829
+ if (this.addNew && hasNonWhiteSpaceCharacters && !optionAlreadyExists) {
830
+ const id = `add-new-btn`;
831
+ const isFocused = this.focusedListItem && this.focusedListItem.id === id;
832
+ return (h("li", { role: "option", class: `add-new-btn ${isFocused ? "focused" : ""}`, id: id, "data-option": this.inputEl.value, onKeyDown: (ev) => this.handleListItemKeyDown(ev), onBlur: (ev) => this.handleBlur(ev, this.el), onClick: (ev) => this.handleListItemClick(ev.target), tabIndex: isFocused ? 0 : -1 }, `Add "${this.inputEl.value.trim()}"`));
833
+ }
834
+ else
835
+ return "";
836
+ }
837
+ renderHelpText() {
838
+ const helpTextHasOptions = intl.formatMessage({
839
+ id: "tagInput.helpTextCanSelect",
840
+ defaultMessage: "Search and select a tag.",
841
+ description: "Placeholder text. Use imperative",
842
+ });
843
+ const helpTextEditable = intl.formatMessage({
844
+ id: "tagInput.helpTextEditable",
845
+ defaultMessage: "Press the Enter or Comma key to add a new tag.",
846
+ description: "Placeholder text. Use imperative",
847
+ });
848
+ let helpText = "";
849
+ if (this.optionsList.length > 0) {
850
+ helpText += helpTextHasOptions;
851
+ }
852
+ if (this.addNew) {
853
+ helpText += " " + helpTextEditable;
854
+ }
855
+ return helpText;
856
+ }
857
+ renderTagCounter() {
858
+ if (this.maxTags) {
859
+ return (h("div", { class: "lower-row" }, h("div", { id: "max-tags" }, this.generateTagCounterMessage(this.tagsList.length, this.maxTags), this.tagLimitReached && ` - ${this.maxTagsReachedMessage}`)));
860
+ }
861
+ }
862
+ renderTable() {
863
+ return (h("div", { class: "table-wrapper", onScroll: () => this.dismissTooltip() }, h("table", { id: "table", role: "grid", class: `${this.colWidths ? "fixed-widths" : ""}`, "aria-label": this.label, "aria-multiselectable": "true" }, this.renderTableHeaders(), this.filteredRows.length ? this.renderTableRows() : h("div", { class: "no-results" }, this.noResultsMessage))));
864
+ }
865
+ renderTableHeaders() {
866
+ return (h("tr", { class: "headers", role: "row" }, csvToArray(this.colHeaders).map((header, idx) => {
867
+ let overflowRule = "wrap";
868
+ if (this.colWrap && csvToArray(this.colWrap)[idx]) {
869
+ overflowRule = csvToArray(this.colWrap)[idx];
870
+ }
871
+ return (h("th", { class: `header-cell ${overflowRule}`, role: "columnheader",
872
+ // @ts-ignore
873
+ width: this.colWidths ? csvToArray(this.colWidths)[idx] : "" }, header));
874
+ })));
875
+ }
876
+ renderTableRows() {
877
+ return this.filteredRows.map((row) => {
878
+ const isSelected = this.includesCaseInsensitive(this.tagsList, row.id);
879
+ return (h("tr", { id: row.id, class: `${row.locked ? "locked" : ""} ${isSelected ? "selected" : ""}`, role: "row", onClick: () => this.handleTableRowClick(row.id) }, this.renderTableCells(row)));
880
+ });
881
+ }
882
+ renderTableCells(row) {
883
+ const colValues = [row.col1, row.col2, row.col3, row.col4].filter((val) => !!val);
884
+ const isSelected = this.includesCaseInsensitive(this.tagsList, row.id);
885
+ return colValues.map((val, idx) => {
886
+ const localId = `${row.id}-col${idx + 1}`;
887
+ let overflowRule = "wrap";
888
+ if (this.colWrap && csvToArray(this.colWrap)[idx]) {
889
+ overflowRule = csvToArray(this.colWrap)[idx];
890
+ }
891
+ return (h("td", { id: localId, role: "gridcell", "aria-describedby": `${localId}-description`, "aria-selected": isSelected.toString(), onMouseEnter: (ev) => this.handleCellMouseEnter(ev), onMouseLeave: () => this.dismissTooltip() }, h("div", { class: `cell-content-wrapper ${overflowRule}` }, val), h("div", { class: "description", id: `${localId}-description` }, row.locked ? "locked" : "")));
892
+ });
893
+ }
894
+ render() {
895
+ return (h(Host, { id: this.uid }, h("div", { class: `wrapper label-${this.labelPosition}` }, h("div", { class: "label-wrapper" }, h("label", { class: "label", htmlFor: `input${this.uid}` }, this.label)), h("div", { class: `field-wrapper ${this.focusedElement ? "focused" : ""}`, ref: (el) => (this.fieldWrapperEl = el) }, h("div", { class: "upper-row" }, h("div", { class: "tags-and-input-wrapper" }, this.tagsList.length > 0 && (h("ul", { ref: (el) => (this.tagAreaEl = el), class: "tag-area", role: "listbox", "aria-activedescendant": "", "aria-orientation": "horizontal", "aria-label": `${this.label} ${this.tagsList.length > 0 ? this.tagAreaInstructions : ""}`, tabindex: this.nonLockedTagsList.length > 0 ? 0 : -1, "aria-describedby": `info max-tags`, onFocus: () => this.handleTagAreaFocus(), onBlur: (ev) => {
896
+ this.clearTagFocus();
897
+ this.handleBlur(ev, this.el);
898
+ }, onKeyDown: (ev) => this.handleTagAreaKeyDown(ev) }, this.renderTags())), h("input", { id: `input${this.uid}`, class: this.tagLimitReached ? "hidden" : "", role: "combobox", ref: (el) => (this.inputEl = el), autocomplete: "off", "aria-controls": this.tagInputType, "aria-describedby": "help-text", "aria-label": `${this.label} ${this.tagInputType === "dropdown" ? this.generateCharacterLimitLabel(this.characterLimit) : ""}`, "aria-expanded": this.tagInputType === "dropdown" ? this.isExpanded.toString() : null, placeholder: this.placeholder, maxLength: this.tagInputType === "dropdown" ? this.characterLimit : undefined, onInput: () => this.handleInputChanged(this.inputEl.value), onBlur: (ev) => {
899
+ this.handleBlur(ev, this.el);
900
+ }, onFocus: () => this.handleInputFocus(), onKeyDown: (ev) => this.handleInputKeyDown(ev) })), this.tagInputType === "dropdown" && (h("div", { class: "character-count" }, this.charCount, "/", this.characterLimit))), this.renderTagCounter(), this.tagInputType === "dropdown" && this.renderDropdown()), this.info ? (h("div", { id: "info", class: "info-text" }, this.info)) : (""), h("div", { class: "sr-only", "aria-live": "assertive", ref: (el) => (this.liveRegionEl = el), "aria-atomic": "true" }, this.liveRegionMessage), this.tagInputType === "table" && this.renderTable())));
901
+ }
902
+ static get is() { return "wm-tag-input"; }
903
+ static get encapsulation() { return "shadow"; }
904
+ static get delegatesFocus() { return true; }
905
+ static get originalStyleUrls() {
906
+ return {
907
+ "$": ["wm-tag-input.scss"]
908
+ };
909
+ }
910
+ static get styleUrls() {
911
+ return {
912
+ "$": ["wm-tag-input.css"]
913
+ };
914
+ }
915
+ static get properties() {
916
+ return {
917
+ "label": {
918
+ "type": "string",
919
+ "mutable": false,
920
+ "complexType": {
921
+ "original": "string",
922
+ "resolved": "string",
923
+ "references": {}
924
+ },
925
+ "required": true,
926
+ "optional": false,
927
+ "docs": {
928
+ "tags": [],
929
+ "text": ""
930
+ },
931
+ "attribute": "label",
932
+ "reflect": false
933
+ },
934
+ "labelPosition": {
935
+ "type": "string",
936
+ "mutable": false,
937
+ "complexType": {
938
+ "original": "\"top\" | \"left\" | \"none\"",
939
+ "resolved": "\"left\" | \"none\" | \"top\"",
940
+ "references": {}
941
+ },
942
+ "required": false,
943
+ "optional": false,
944
+ "docs": {
945
+ "tags": [],
946
+ "text": ""
947
+ },
948
+ "attribute": "label-position",
949
+ "reflect": false,
950
+ "defaultValue": "\"top\""
951
+ },
952
+ "options": {
953
+ "type": "string",
954
+ "mutable": true,
955
+ "complexType": {
956
+ "original": "string",
957
+ "resolved": "string",
958
+ "references": {}
959
+ },
960
+ "required": false,
961
+ "optional": false,
962
+ "docs": {
963
+ "tags": [],
964
+ "text": ""
965
+ },
966
+ "attribute": "options",
967
+ "reflect": false,
968
+ "defaultValue": "\"\""
969
+ },
970
+ "selectedTags": {
971
+ "type": "string",
972
+ "mutable": true,
973
+ "complexType": {
974
+ "original": "string",
975
+ "resolved": "string",
976
+ "references": {}
977
+ },
978
+ "required": false,
979
+ "optional": false,
980
+ "docs": {
981
+ "tags": [],
982
+ "text": ""
983
+ },
984
+ "attribute": "selected-tags",
985
+ "reflect": true,
986
+ "defaultValue": "\"\""
987
+ },
988
+ "info": {
989
+ "type": "string",
990
+ "mutable": false,
991
+ "complexType": {
992
+ "original": "string",
993
+ "resolved": "string | undefined",
994
+ "references": {}
995
+ },
996
+ "required": false,
997
+ "optional": true,
998
+ "docs": {
999
+ "tags": [],
1000
+ "text": ""
1001
+ },
1002
+ "attribute": "info",
1003
+ "reflect": false
1004
+ },
1005
+ "addNew": {
1006
+ "type": "boolean",
1007
+ "mutable": false,
1008
+ "complexType": {
1009
+ "original": "boolean",
1010
+ "resolved": "boolean",
1011
+ "references": {}
1012
+ },
1013
+ "required": false,
1014
+ "optional": false,
1015
+ "docs": {
1016
+ "tags": [],
1017
+ "text": ""
1018
+ },
1019
+ "attribute": "add-new",
1020
+ "reflect": false,
1021
+ "defaultValue": "true"
1022
+ },
1023
+ "placeholder": {
1024
+ "type": "string",
1025
+ "mutable": true,
1026
+ "complexType": {
1027
+ "original": "string",
1028
+ "resolved": "string | undefined",
1029
+ "references": {}
1030
+ },
1031
+ "required": false,
1032
+ "optional": true,
1033
+ "docs": {
1034
+ "tags": [],
1035
+ "text": ""
1036
+ },
1037
+ "attribute": "placeholder",
1038
+ "reflect": false
1039
+ },
1040
+ "characterLimit": {
1041
+ "type": "number",
1042
+ "mutable": false,
1043
+ "complexType": {
1044
+ "original": "number",
1045
+ "resolved": "number",
1046
+ "references": {}
1047
+ },
1048
+ "required": false,
1049
+ "optional": false,
1050
+ "docs": {
1051
+ "tags": [],
1052
+ "text": ""
1053
+ },
1054
+ "attribute": "character-limit",
1055
+ "reflect": false,
1056
+ "defaultValue": "50"
1057
+ },
1058
+ "maxTags": {
1059
+ "type": "number",
1060
+ "mutable": false,
1061
+ "complexType": {
1062
+ "original": "number",
1063
+ "resolved": "number | undefined",
1064
+ "references": {}
1065
+ },
1066
+ "required": false,
1067
+ "optional": true,
1068
+ "docs": {
1069
+ "tags": [],
1070
+ "text": ""
1071
+ },
1072
+ "attribute": "max-tags",
1073
+ "reflect": false
1074
+ },
1075
+ "tagInputType": {
1076
+ "type": "string",
1077
+ "mutable": false,
1078
+ "complexType": {
1079
+ "original": "\"dropdown\" | \"table\"",
1080
+ "resolved": "\"dropdown\" | \"table\"",
1081
+ "references": {}
1082
+ },
1083
+ "required": false,
1084
+ "optional": false,
1085
+ "docs": {
1086
+ "tags": [],
1087
+ "text": ""
1088
+ },
1089
+ "attribute": "tag-input-type",
1090
+ "reflect": false,
1091
+ "defaultValue": "\"dropdown\""
1092
+ },
1093
+ "colHeaders": {
1094
+ "type": "string",
1095
+ "mutable": false,
1096
+ "complexType": {
1097
+ "original": "string",
1098
+ "resolved": "string",
1099
+ "references": {}
1100
+ },
1101
+ "required": true,
1102
+ "optional": false,
1103
+ "docs": {
1104
+ "tags": [],
1105
+ "text": ""
1106
+ },
1107
+ "attribute": "col-headers",
1108
+ "reflect": false
1109
+ },
1110
+ "colWidths": {
1111
+ "type": "string",
1112
+ "mutable": false,
1113
+ "complexType": {
1114
+ "original": "string",
1115
+ "resolved": "string | undefined",
1116
+ "references": {}
1117
+ },
1118
+ "required": false,
1119
+ "optional": true,
1120
+ "docs": {
1121
+ "tags": [],
1122
+ "text": ""
1123
+ },
1124
+ "attribute": "col-widths",
1125
+ "reflect": false
1126
+ },
1127
+ "colWrap": {
1128
+ "type": "string",
1129
+ "mutable": false,
1130
+ "complexType": {
1131
+ "original": "string",
1132
+ "resolved": "string | undefined",
1133
+ "references": {}
1134
+ },
1135
+ "required": false,
1136
+ "optional": true,
1137
+ "docs": {
1138
+ "tags": [],
1139
+ "text": ""
1140
+ },
1141
+ "attribute": "col-wrap",
1142
+ "reflect": false
1143
+ }
1144
+ };
1145
+ }
1146
+ static get states() {
1147
+ return {
1148
+ "focusedListItem": {},
1149
+ "focusedTag": {},
1150
+ "tablePosition": {},
1151
+ "isExpanded": {},
1152
+ "tagsList": {},
1153
+ "optionsList": {},
1154
+ "charCount": {},
1155
+ "liveRegionMessage": {}
1156
+ };
1157
+ }
1158
+ static get events() {
1159
+ return [{
1160
+ "method": "wmTagInputChanged",
1161
+ "name": "wmTagInputChanged",
1162
+ "bubbles": true,
1163
+ "cancelable": true,
1164
+ "composed": true,
1165
+ "docs": {
1166
+ "tags": [],
1167
+ "text": ""
1168
+ },
1169
+ "complexType": {
1170
+ "original": "{\r\n value: string[] | HTMLWmTagInputRowElement[];\r\n tagChanged: string | HTMLWmTagInputRowElement;\r\n }",
1171
+ "resolved": "{ value: string[] | HTMLWmTagInputRowElement[]; tagChanged: string | HTMLWmTagInputRowElement; }",
1172
+ "references": {
1173
+ "HTMLWmTagInputRowElement": {
1174
+ "location": "global"
1175
+ }
1176
+ }
1177
+ }
1178
+ }];
1179
+ }
1180
+ static get elementRef() { return "el"; }
1181
+ static get watchers() {
1182
+ return [{
1183
+ "propName": "tagsList",
1184
+ "methodName": "reflectSelectedTags"
1185
+ }];
1186
+ }
1187
+ static get listeners() {
1188
+ return [{
1189
+ "name": "wmTagInputRowUpdated",
1190
+ "method": "handleRowUpdate",
1191
+ "target": undefined,
1192
+ "capture": false,
1193
+ "passive": false
1194
+ }, {
1195
+ "name": "click",
1196
+ "method": "closeIfNotElOrChild",
1197
+ "target": "document",
1198
+ "capture": false,
1199
+ "passive": false
1200
+ }, {
1201
+ "name": "scroll",
1202
+ "method": "dismissTooltip",
1203
+ "target": "window",
1204
+ "capture": true,
1205
+ "passive": true
1206
+ }];
1207
+ }
1208
+ }
1209
+ //# sourceMappingURL=wm-tag-input.js.map