@swisspost/internet-header 1.7.1 → 1.7.3-beta.0

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 (315) hide show
  1. package/dist/cjs/{index-92e9d4f8.js → index-0f01e1a4.js} +4 -3
  2. package/dist/cjs/index-0f01e1a4.js.map +1 -0
  3. package/dist/cjs/{klp-widget.controller-5d5afa10.js → klp-widget.controller-413d85e1.js} +785 -1049
  4. package/dist/cjs/klp-widget.controller-413d85e1.js.map +1 -0
  5. package/dist/cjs/{language.service-56d68ec3.js → language.service-4954855f.js} +17 -2
  6. package/dist/cjs/language.service-4954855f.js.map +1 -0
  7. package/dist/cjs/loader.cjs.js +2 -2
  8. package/dist/cjs/loader.cjs.js.map +1 -1
  9. package/dist/cjs/post-klp-login-widget.cjs.entry.js +5 -5
  10. package/dist/cjs/post-klp-login-widget.cjs.entry.js.map +1 -1
  11. package/dist/cjs/post-language-switch.cjs.entry.js +9 -10
  12. package/dist/cjs/post-language-switch.cjs.entry.js.map +1 -1
  13. package/dist/cjs/post-logo.cjs.entry.js +3 -3
  14. package/dist/cjs/post-logo.cjs.entry.js.map +1 -1
  15. package/dist/cjs/post-main-navigation.cjs.entry.js +31 -32
  16. package/dist/cjs/post-main-navigation.cjs.entry.js.map +1 -1
  17. package/dist/cjs/post-meta-navigation.cjs.entry.js +6 -6
  18. package/dist/cjs/post-meta-navigation.cjs.entry.js.map +1 -1
  19. package/dist/cjs/post-search.cjs.entry.js +63 -38
  20. package/dist/cjs/post-search.cjs.entry.js.map +1 -1
  21. package/dist/cjs/post-skiplinks.cjs.entry.js +6 -6
  22. package/dist/cjs/post-skiplinks.cjs.entry.js.map +1 -1
  23. package/dist/cjs/{store-638313d5.js → store-9d562808.js} +2 -2
  24. package/dist/cjs/{store-638313d5.js.map → store-9d562808.js.map} +1 -1
  25. package/dist/cjs/{svg-icon.component-f07628a9.js → svg-icon.component-f4cd45b0.js} +2 -2
  26. package/dist/cjs/{svg-icon.component-f07628a9.js.map → svg-icon.component-f4cd45b0.js.map} +1 -1
  27. package/dist/cjs/{svg-sprite.component-dc8e2e95.js → svg-sprite.component-e4b163ae.js} +2 -2
  28. package/dist/cjs/{svg-sprite.component-dc8e2e95.js.map → svg-sprite.component-e4b163ae.js.map} +1 -1
  29. package/dist/cjs/swisspost-internet-breadcrumbs.cjs.entry.js +9 -9
  30. package/dist/cjs/swisspost-internet-breadcrumbs.cjs.entry.js.map +1 -1
  31. package/dist/cjs/swisspost-internet-footer.cjs.entry.js +4 -4
  32. package/dist/cjs/swisspost-internet-footer.cjs.entry.js.map +1 -1
  33. package/dist/cjs/swisspost-internet-header.cjs.entry.js +32 -24
  34. package/dist/cjs/swisspost-internet-header.cjs.entry.js.map +1 -1
  35. package/dist/cjs/swisspost-internet-header.cjs.js +2 -2
  36. package/dist/cjs/swisspost-internet-header.cjs.js.map +1 -1
  37. package/dist/collection/assets/i18n/translations.js +15 -0
  38. package/dist/collection/assets/i18n/translations.js.map +1 -1
  39. package/dist/collection/assets/js/klp-login-widget.js +1 -2
  40. package/dist/collection/collection-manifest.json +2 -2
  41. package/dist/collection/components/post-internet-breadcrumbs/components/middle-dropdown.component.js +1 -1
  42. package/dist/collection/components/post-internet-breadcrumbs/components/middle-dropdown.component.js.map +1 -1
  43. package/dist/collection/components/post-internet-breadcrumbs/post-internet-breadcrumbs.css +113 -58
  44. package/dist/collection/components/post-internet-breadcrumbs/post-internet-breadcrumbs.js +1 -1
  45. package/dist/collection/components/post-internet-breadcrumbs/post-internet-breadcrumbs.js.map +1 -1
  46. package/dist/collection/components/post-internet-footer/post-internet-footer.css +78 -44
  47. package/dist/collection/components/post-internet-header/post-internet-header.css +68 -44
  48. package/dist/collection/components/post-internet-header/post-internet-header.js +2 -1
  49. package/dist/collection/components/post-internet-header/post-internet-header.js.map +1 -1
  50. package/dist/collection/components/post-klp-login-widget/post-klp-login-widget.css +68 -46
  51. package/dist/collection/components/post-language-switch/components/post-language-switch-list.js +2 -2
  52. package/dist/collection/components/post-language-switch/components/post-language-switch-list.js.map +1 -1
  53. package/dist/collection/components/post-language-switch/post-language-switch.css +79 -53
  54. package/dist/collection/components/post-logo/post-logo.css +68 -44
  55. package/dist/collection/components/post-main-navigation/components/level-one-action.component.js +2 -1
  56. package/dist/collection/components/post-main-navigation/components/level-one-action.component.js.map +1 -1
  57. package/dist/collection/components/post-main-navigation/post-main-navigation.css +73 -48
  58. package/dist/collection/components/post-main-navigation/post-main-navigation.js +25 -27
  59. package/dist/collection/components/post-main-navigation/post-main-navigation.js.map +1 -1
  60. package/dist/collection/components/post-meta-navigation/post-meta-navigation.css +72 -48
  61. package/dist/collection/components/post-meta-navigation/post-meta-navigation.js +3 -3
  62. package/dist/collection/components/post-meta-navigation/post-meta-navigation.js.map +1 -1
  63. package/dist/collection/components/post-search/post-search.css +162 -90
  64. package/dist/collection/components/post-search/post-search.js +2 -2
  65. package/dist/collection/components/post-search/post-search.js.map +1 -1
  66. package/dist/collection/components/post-skiplinks/post-skiplinks.css +1 -0
  67. package/dist/collection/components/post-skiplinks/post-skiplinks.js +1 -1
  68. package/dist/collection/components/post-skiplinks/post-skiplinks.js.map +1 -1
  69. package/dist/collection/services/config.service.spec.js +274 -0
  70. package/dist/collection/services/config.service.spec.js.map +1 -0
  71. package/dist/collection/services/route.service.js +11 -3
  72. package/dist/collection/services/route.service.js.map +1 -1
  73. package/dist/collection/services/route.service.spec.js +109 -0
  74. package/dist/collection/services/route.service.spec.js.map +1 -0
  75. package/dist/collection/services/search/coveo.service.js +18 -10
  76. package/dist/collection/services/search/coveo.service.js.map +1 -1
  77. package/dist/collection/services/search/parcel.service.js +18 -8
  78. package/dist/collection/services/search/parcel.service.js.map +1 -1
  79. package/dist/collection/services/search/places.service.js +20 -13
  80. package/dist/collection/services/search/places.service.js.map +1 -1
  81. package/dist/collection/services/search/search.service.spec.js +49 -0
  82. package/dist/collection/services/search/search.service.spec.js.map +1 -0
  83. package/dist/collection/utils/utils.spec.js +11 -0
  84. package/dist/collection/utils/utils.spec.js.map +1 -0
  85. package/dist/components/klp-widget.controller.js +784 -1048
  86. package/dist/components/klp-widget.controller.js.map +1 -1
  87. package/dist/components/language.service.js +15 -0
  88. package/dist/components/language.service.js.map +1 -1
  89. package/dist/components/post-klp-login-widget2.js +1 -1
  90. package/dist/components/post-klp-login-widget2.js.map +1 -1
  91. package/dist/components/post-language-switch2.js +4 -5
  92. package/dist/components/post-language-switch2.js.map +1 -1
  93. package/dist/components/post-logo2.js +1 -1
  94. package/dist/components/post-logo2.js.map +1 -1
  95. package/dist/components/post-main-navigation2.js +27 -28
  96. package/dist/components/post-main-navigation2.js.map +1 -1
  97. package/dist/components/post-meta-navigation2.js +4 -4
  98. package/dist/components/post-meta-navigation2.js.map +1 -1
  99. package/dist/components/post-search2.js +59 -34
  100. package/dist/components/post-search2.js.map +1 -1
  101. package/dist/components/post-skiplinks2.js +2 -2
  102. package/dist/components/post-skiplinks2.js.map +1 -1
  103. package/dist/components/store.js.map +1 -1
  104. package/dist/components/swisspost-internet-breadcrumbs.js +4 -4
  105. package/dist/components/swisspost-internet-breadcrumbs.js.map +1 -1
  106. package/dist/components/swisspost-internet-footer.js +1 -1
  107. package/dist/components/swisspost-internet-footer.js.map +1 -1
  108. package/dist/components/swisspost-internet-header.js +28 -20
  109. package/dist/components/swisspost-internet-header.js.map +1 -1
  110. package/dist/esm/{index-35186c69.js → index-2aa4bc9f.js} +4 -3
  111. package/dist/esm/index-2aa4bc9f.js.map +1 -0
  112. package/dist/esm/{klp-widget.controller-9f7e3c54.js → klp-widget.controller-1b2db6e7.js} +785 -1049
  113. package/dist/esm/klp-widget.controller-1b2db6e7.js.map +1 -0
  114. package/dist/esm/{language.service-74bc1f43.js → language.service-c0f81273.js} +17 -2
  115. package/dist/esm/language.service-c0f81273.js.map +1 -0
  116. package/dist/esm/loader.js +3 -3
  117. package/dist/esm/loader.js.map +1 -1
  118. package/dist/esm/polyfills/core-js.js +0 -0
  119. package/dist/esm/polyfills/dom.js +0 -0
  120. package/dist/esm/polyfills/es5-html-element.js +0 -0
  121. package/dist/esm/polyfills/index.js +0 -0
  122. package/dist/esm/polyfills/system.js +0 -0
  123. package/dist/esm/post-klp-login-widget.entry.js +5 -5
  124. package/dist/esm/post-klp-login-widget.entry.js.map +1 -1
  125. package/dist/esm/post-language-switch.entry.js +9 -10
  126. package/dist/esm/post-language-switch.entry.js.map +1 -1
  127. package/dist/esm/post-logo.entry.js +3 -3
  128. package/dist/esm/post-logo.entry.js.map +1 -1
  129. package/dist/esm/post-main-navigation.entry.js +31 -32
  130. package/dist/esm/post-main-navigation.entry.js.map +1 -1
  131. package/dist/esm/post-meta-navigation.entry.js +6 -6
  132. package/dist/esm/post-meta-navigation.entry.js.map +1 -1
  133. package/dist/esm/post-search.entry.js +63 -38
  134. package/dist/esm/post-search.entry.js.map +1 -1
  135. package/dist/esm/post-skiplinks.entry.js +6 -6
  136. package/dist/esm/post-skiplinks.entry.js.map +1 -1
  137. package/dist/esm/{store-b78e2d3b.js → store-d5165a8f.js} +2 -2
  138. package/dist/esm/{store-b78e2d3b.js.map → store-d5165a8f.js.map} +1 -1
  139. package/dist/esm/{svg-icon.component-7bac7397.js → svg-icon.component-02f233c7.js} +2 -2
  140. package/dist/esm/{svg-icon.component-7bac7397.js.map → svg-icon.component-02f233c7.js.map} +1 -1
  141. package/dist/esm/{svg-sprite.component-f319da57.js → svg-sprite.component-1f13a769.js} +2 -2
  142. package/dist/esm/{svg-sprite.component-f319da57.js.map → svg-sprite.component-1f13a769.js.map} +1 -1
  143. package/dist/esm/swisspost-internet-breadcrumbs.entry.js +9 -9
  144. package/dist/esm/swisspost-internet-breadcrumbs.entry.js.map +1 -1
  145. package/dist/esm/swisspost-internet-footer.entry.js +4 -4
  146. package/dist/esm/swisspost-internet-footer.entry.js.map +1 -1
  147. package/dist/esm/swisspost-internet-header.entry.js +32 -24
  148. package/dist/esm/swisspost-internet-header.entry.js.map +1 -1
  149. package/dist/esm/swisspost-internet-header.js +3 -3
  150. package/dist/esm/swisspost-internet-header.js.map +1 -1
  151. package/dist/esm-es5/{index-35186c69.js → index-2aa4bc9f.js} +2 -2
  152. package/dist/esm-es5/index-2aa4bc9f.js.map +1 -0
  153. package/dist/esm-es5/klp-widget.controller-1b2db6e7.js +13 -0
  154. package/dist/esm-es5/klp-widget.controller-1b2db6e7.js.map +1 -0
  155. package/dist/esm-es5/language.service-c0f81273.js +2 -0
  156. package/dist/esm-es5/language.service-c0f81273.js.map +1 -0
  157. package/dist/esm-es5/loader.js +1 -1
  158. package/dist/esm-es5/loader.js.map +1 -1
  159. package/dist/esm-es5/post-klp-login-widget.entry.js +1 -1
  160. package/dist/esm-es5/post-klp-login-widget.entry.js.map +1 -1
  161. package/dist/esm-es5/post-language-switch.entry.js +1 -1
  162. package/dist/esm-es5/post-language-switch.entry.js.map +1 -1
  163. package/dist/esm-es5/post-logo.entry.js +1 -1
  164. package/dist/esm-es5/post-logo.entry.js.map +1 -1
  165. package/dist/esm-es5/post-main-navigation.entry.js +1 -1
  166. package/dist/esm-es5/post-main-navigation.entry.js.map +1 -1
  167. package/dist/esm-es5/post-meta-navigation.entry.js +1 -1
  168. package/dist/esm-es5/post-meta-navigation.entry.js.map +1 -1
  169. package/dist/esm-es5/post-search.entry.js +1 -1
  170. package/dist/esm-es5/post-search.entry.js.map +1 -1
  171. package/dist/esm-es5/post-skiplinks.entry.js +1 -1
  172. package/dist/esm-es5/post-skiplinks.entry.js.map +1 -1
  173. package/dist/esm-es5/{store-b78e2d3b.js → store-d5165a8f.js} +2 -2
  174. package/dist/esm-es5/{store-b78e2d3b.js.map → store-d5165a8f.js.map} +1 -1
  175. package/dist/esm-es5/svg-icon.component-02f233c7.js +2 -0
  176. package/dist/esm-es5/{svg-sprite.component-f319da57.js → svg-sprite.component-1f13a769.js} +2 -2
  177. package/dist/esm-es5/swisspost-internet-breadcrumbs.entry.js +3 -3
  178. package/dist/esm-es5/swisspost-internet-breadcrumbs.entry.js.map +1 -1
  179. package/dist/esm-es5/swisspost-internet-footer.entry.js +1 -1
  180. package/dist/esm-es5/swisspost-internet-footer.entry.js.map +1 -1
  181. package/dist/esm-es5/swisspost-internet-header.entry.js +1 -1
  182. package/dist/esm-es5/swisspost-internet-header.entry.js.map +1 -1
  183. package/dist/esm-es5/swisspost-internet-header.js +1 -1
  184. package/dist/esm-es5/swisspost-internet-header.js.map +1 -1
  185. package/dist/swisspost-internet-header/p-04cf4eeb.system.entry.js +2 -0
  186. package/dist/swisspost-internet-header/{p-055f51f2.system.entry.js.map → p-04cf4eeb.system.entry.js.map} +1 -1
  187. package/dist/swisspost-internet-header/p-0af4e3e8.entry.js +2 -0
  188. package/dist/swisspost-internet-header/{p-6a22a9c3.entry.js.map → p-0af4e3e8.entry.js.map} +1 -1
  189. package/dist/swisspost-internet-header/p-18a3b952.system.entry.js +2 -0
  190. package/dist/swisspost-internet-header/p-18a3b952.system.entry.js.map +1 -0
  191. package/dist/swisspost-internet-header/p-1a2a0045.system.entry.js +2 -0
  192. package/dist/swisspost-internet-header/p-1a2a0045.system.entry.js.map +1 -0
  193. package/dist/swisspost-internet-header/p-25872a84.system.entry.js +2 -0
  194. package/dist/swisspost-internet-header/{p-02bb40cf.system.entry.js.map → p-25872a84.system.entry.js.map} +1 -1
  195. package/dist/swisspost-internet-header/p-2824a296.entry.js +7 -0
  196. package/dist/swisspost-internet-header/{p-3f72b002.entry.js.map → p-2824a296.entry.js.map} +1 -1
  197. package/dist/swisspost-internet-header/p-30592816.system.js +13 -0
  198. package/dist/swisspost-internet-header/p-30592816.system.js.map +1 -0
  199. package/dist/swisspost-internet-header/p-34205e78.entry.js +2 -0
  200. package/dist/swisspost-internet-header/p-34205e78.entry.js.map +1 -0
  201. package/dist/swisspost-internet-header/p-47b1ef62.entry.js +2 -0
  202. package/dist/swisspost-internet-header/{p-5e5d587a.entry.js.map → p-47b1ef62.entry.js.map} +1 -1
  203. package/dist/swisspost-internet-header/p-5ecd4ac6.entry.js +2 -0
  204. package/dist/swisspost-internet-header/p-5ecd4ac6.entry.js.map +1 -0
  205. package/dist/swisspost-internet-header/p-6492c505.js +13 -0
  206. package/dist/swisspost-internet-header/p-6492c505.js.map +1 -0
  207. package/dist/swisspost-internet-header/{p-3819c4ce.system.js → p-65e18d30.system.js} +2 -2
  208. package/dist/swisspost-internet-header/{p-3819c4ce.system.js.map → p-65e18d30.system.js.map} +1 -1
  209. package/dist/swisspost-internet-header/{p-4d015bfc.system.js → p-70805f8f.system.js} +2 -2
  210. package/dist/swisspost-internet-header/{p-91035a2a.system.js → p-77394e93.system.js} +2 -2
  211. package/dist/swisspost-internet-header/p-7d4ecdb6.entry.js +2 -0
  212. package/dist/swisspost-internet-header/p-7d4ecdb6.entry.js.map +1 -0
  213. package/dist/swisspost-internet-header/p-809e69c8.entry.js +2 -0
  214. package/dist/swisspost-internet-header/{p-b9bcb22a.entry.js.map → p-809e69c8.entry.js.map} +1 -1
  215. package/dist/swisspost-internet-header/p-94d45cc5.system.entry.js +2 -0
  216. package/dist/swisspost-internet-header/{p-996a552e.system.entry.js.map → p-94d45cc5.system.entry.js.map} +1 -1
  217. package/dist/swisspost-internet-header/p-97793474.entry.js +2 -0
  218. package/dist/swisspost-internet-header/p-97793474.entry.js.map +1 -0
  219. package/dist/swisspost-internet-header/p-99eafc12.js +2 -0
  220. package/dist/swisspost-internet-header/p-99eafc12.js.map +1 -0
  221. package/dist/swisspost-internet-header/{p-e2db30e1.js → p-9a8f9281.js} +2 -2
  222. package/dist/swisspost-internet-header/{p-22e64bf2.js → p-b7feee8d.js} +2 -2
  223. package/dist/swisspost-internet-header/{p-22e64bf2.js.map → p-b7feee8d.js.map} +1 -1
  224. package/dist/swisspost-internet-header/p-bad10ea9.system.entry.js +7 -0
  225. package/dist/swisspost-internet-header/{p-8f34abed.system.entry.js.map → p-bad10ea9.system.entry.js.map} +1 -1
  226. package/dist/swisspost-internet-header/p-bf3dac2f.system.entry.js +2 -0
  227. package/dist/swisspost-internet-header/p-bf3dac2f.system.entry.js.map +1 -0
  228. package/dist/swisspost-internet-header/p-c72e824c.entry.js +2 -0
  229. package/dist/swisspost-internet-header/p-c72e824c.entry.js.map +1 -0
  230. package/dist/swisspost-internet-header/p-c96ad7d6.entry.js +2 -0
  231. package/dist/swisspost-internet-header/p-c96ad7d6.entry.js.map +1 -0
  232. package/dist/swisspost-internet-header/p-c9cf2e49.system.entry.js +2 -0
  233. package/dist/swisspost-internet-header/p-c9cf2e49.system.entry.js.map +1 -0
  234. package/dist/swisspost-internet-header/p-ce02164e.system.js +2 -0
  235. package/dist/swisspost-internet-header/p-ce02164e.system.js.map +1 -0
  236. package/dist/swisspost-internet-header/{p-2945db6c.js → p-d8b954a1.js} +3 -3
  237. package/dist/swisspost-internet-header/p-d8b954a1.js.map +1 -0
  238. package/dist/swisspost-internet-header/p-e415699e.system.entry.js +2 -0
  239. package/dist/swisspost-internet-header/p-e415699e.system.entry.js.map +1 -0
  240. package/dist/swisspost-internet-header/p-e75bba89.js +2 -0
  241. package/dist/swisspost-internet-header/p-eef407b0.system.entry.js +2 -0
  242. package/dist/swisspost-internet-header/p-eef407b0.system.entry.js.map +1 -0
  243. package/dist/swisspost-internet-header/{p-5e9ba287.system.js → p-f5935384.system.js} +2 -2
  244. package/dist/swisspost-internet-header/p-f5935384.system.js.map +1 -0
  245. package/dist/swisspost-internet-header/{p-49fe20ff.system.js → p-f70ab166.system.js} +2 -2
  246. package/dist/swisspost-internet-header/{p-49fe20ff.system.js.map → p-f70ab166.system.js.map} +1 -1
  247. package/dist/swisspost-internet-header/swisspost-internet-header.css +1 -1
  248. package/dist/swisspost-internet-header/swisspost-internet-header.esm.js +1 -1
  249. package/dist/swisspost-internet-header/swisspost-internet-header.esm.js.map +1 -1
  250. package/dist/swisspost-internet-header/swisspost-internet-header.js +1 -1
  251. package/dist/types/assets/i18n/translations.d.ts +15 -0
  252. package/dist/types/components/post-main-navigation/post-main-navigation.d.ts +2 -8
  253. package/dist/types/services/language.service.d.ts +19 -1
  254. package/package.json +29 -29
  255. package/dist/cjs/index-92e9d4f8.js.map +0 -1
  256. package/dist/cjs/klp-widget.controller-5d5afa10.js.map +0 -1
  257. package/dist/cjs/language.service-56d68ec3.js.map +0 -1
  258. package/dist/esm/index-35186c69.js.map +0 -1
  259. package/dist/esm/klp-widget.controller-9f7e3c54.js.map +0 -1
  260. package/dist/esm/language.service-74bc1f43.js.map +0 -1
  261. package/dist/esm-es5/index-35186c69.js.map +0 -1
  262. package/dist/esm-es5/klp-widget.controller-9f7e3c54.js +0 -27
  263. package/dist/esm-es5/klp-widget.controller-9f7e3c54.js.map +0 -1
  264. package/dist/esm-es5/language.service-74bc1f43.js +0 -2
  265. package/dist/esm-es5/language.service-74bc1f43.js.map +0 -1
  266. package/dist/esm-es5/svg-icon.component-7bac7397.js +0 -2
  267. package/dist/swisspost-internet-header/p-02bb40cf.system.entry.js +0 -2
  268. package/dist/swisspost-internet-header/p-055f51f2.system.entry.js +0 -2
  269. package/dist/swisspost-internet-header/p-21ef11a4.entry.js +0 -2
  270. package/dist/swisspost-internet-header/p-21ef11a4.entry.js.map +0 -1
  271. package/dist/swisspost-internet-header/p-2945db6c.js.map +0 -1
  272. package/dist/swisspost-internet-header/p-2fd2c574.system.entry.js +0 -2
  273. package/dist/swisspost-internet-header/p-2fd2c574.system.entry.js.map +0 -1
  274. package/dist/swisspost-internet-header/p-30335ce0.system.entry.js +0 -2
  275. package/dist/swisspost-internet-header/p-30335ce0.system.entry.js.map +0 -1
  276. package/dist/swisspost-internet-header/p-32fe68f0.js +0 -2
  277. package/dist/swisspost-internet-header/p-3f72b002.entry.js +0 -7
  278. package/dist/swisspost-internet-header/p-5e5d587a.entry.js +0 -2
  279. package/dist/swisspost-internet-header/p-5e9ba287.system.js.map +0 -1
  280. package/dist/swisspost-internet-header/p-6032d37e.entry.js +0 -2
  281. package/dist/swisspost-internet-header/p-6032d37e.entry.js.map +0 -1
  282. package/dist/swisspost-internet-header/p-6a22a9c3.entry.js +0 -2
  283. package/dist/swisspost-internet-header/p-6df0c486.entry.js +0 -2
  284. package/dist/swisspost-internet-header/p-6df0c486.entry.js.map +0 -1
  285. package/dist/swisspost-internet-header/p-73b6ce0d.system.entry.js +0 -2
  286. package/dist/swisspost-internet-header/p-73b6ce0d.system.entry.js.map +0 -1
  287. package/dist/swisspost-internet-header/p-8bd39c64.js +0 -2
  288. package/dist/swisspost-internet-header/p-8bd39c64.js.map +0 -1
  289. package/dist/swisspost-internet-header/p-8f34abed.system.entry.js +0 -7
  290. package/dist/swisspost-internet-header/p-996a552e.system.entry.js +0 -2
  291. package/dist/swisspost-internet-header/p-9efee6d6.system.entry.js +0 -2
  292. package/dist/swisspost-internet-header/p-9efee6d6.system.entry.js.map +0 -1
  293. package/dist/swisspost-internet-header/p-ad7071ea.system.js +0 -27
  294. package/dist/swisspost-internet-header/p-ad7071ea.system.js.map +0 -1
  295. package/dist/swisspost-internet-header/p-b9bcb22a.entry.js +0 -2
  296. package/dist/swisspost-internet-header/p-c24585eb.entry.js +0 -2
  297. package/dist/swisspost-internet-header/p-c24585eb.entry.js.map +0 -1
  298. package/dist/swisspost-internet-header/p-c435e138.entry.js +0 -2
  299. package/dist/swisspost-internet-header/p-c435e138.entry.js.map +0 -1
  300. package/dist/swisspost-internet-header/p-cce32859.entry.js +0 -2
  301. package/dist/swisspost-internet-header/p-cce32859.entry.js.map +0 -1
  302. package/dist/swisspost-internet-header/p-f0396178.system.entry.js +0 -2
  303. package/dist/swisspost-internet-header/p-f0396178.system.entry.js.map +0 -1
  304. package/dist/swisspost-internet-header/p-f4f5ca86.system.js +0 -2
  305. package/dist/swisspost-internet-header/p-f4f5ca86.system.js.map +0 -1
  306. package/dist/swisspost-internet-header/p-f62f50ce.system.entry.js +0 -2
  307. package/dist/swisspost-internet-header/p-f62f50ce.system.entry.js.map +0 -1
  308. package/dist/swisspost-internet-header/p-fefa1082.js +0 -27
  309. package/dist/swisspost-internet-header/p-fefa1082.js.map +0 -1
  310. /package/dist/esm-es5/{svg-icon.component-7bac7397.js.map → svg-icon.component-02f233c7.js.map} +0 -0
  311. /package/dist/esm-es5/{svg-sprite.component-f319da57.js.map → svg-sprite.component-1f13a769.js.map} +0 -0
  312. /package/dist/swisspost-internet-header/{p-4d015bfc.system.js.map → p-70805f8f.system.js.map} +0 -0
  313. /package/dist/swisspost-internet-header/{p-91035a2a.system.js.map → p-77394e93.system.js.map} +0 -0
  314. /package/dist/swisspost-internet-header/{p-e2db30e1.js.map → p-9a8f9281.js.map} +0 -0
  315. /package/dist/swisspost-internet-header/{p-32fe68f0.js.map → p-e75bba89.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"post-search.js","sourceRoot":"","sources":["../../../../src/components/post-search/post-search.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Host, h, State, Event, EventEmitter, Method, Element } from '@stencil/core';\nimport { throttle } from 'throttle-debounce';\nimport { disableBodyScroll, enableBodyScroll, clearAllBodyScrollLocks } from 'body-scroll-lock';\nimport { state } from '../../data/store';\nimport { CoveoCompletion } from '../../models/coveo.model';\nimport { GeocodeLocation } from '../../models/geocode.model';\nimport {\n DropdownElement,\n DropdownEvent,\n HasDropdown,\n IsFocusable,\n} from '../../models/header.model';\nimport { getSearchRedirectUrl, equalizeArrays } from '../../services/search/search.service';\nimport { getCoveoSuggestions } from '../../services/search/coveo.service';\nimport {\n getPlacesUrl,\n highlightPlacesString,\n queryPlaces,\n} from '../../services/search/places.service';\nimport { userPrefersReducedMotion, elementHasTransition } from '../../services/ui.service';\nimport { HighlightedText } from '../../utils/highlighted.component';\nimport { SvgSprite } from '../../utils/svg-sprite.component';\nimport { SvgIcon } from '../../utils/svg-icon.component';\nimport { TrackAndTraceInfo } from '../../models/track-and-trace.model';\nimport { getParcelSuggestion } from '../../services/search/parcel.service';\nimport { If } from '../../utils/if.component';\n\n@Component({\n tag: 'post-search',\n styleUrl: 'post-search.scss',\n shadow: true,\n})\nexport class PostSearch implements HasDropdown, IsFocusable {\n @State() searchDropdownOpen = false;\n @State() coveoSuggestions: CoveoCompletion[] = [];\n @State() placeSuggestions: GeocodeLocation[] = [];\n @State() parcelSuggestion: (TrackAndTraceInfo & { url: string }) | null = null;\n @Event() dropdownToggled: EventEmitter<DropdownEvent>;\n @Element() host: DropdownElement;\n private searchBox?: HTMLInputElement;\n private searchFlyout: HTMLElement | undefined;\n private throttledResize: throttle<() => void>;\n\n connectedCallback() {\n this.throttledResize = throttle(300, () => this.handleResize());\n window.addEventListener('resize', this.throttledResize, { passive: true });\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this.throttledResize);\n clearAllBodyScrollLocks();\n }\n\n componentWillUpdate() {\n // Check if search flyout got set to close\n if (this.searchFlyout && !this.searchDropdownOpen) {\n this.searchFlyout.classList.remove('open');\n\n // Check if element has transition applied and whether user prefers to see animations or not\n if (elementHasTransition(this.searchFlyout, 'transform') && !userPrefersReducedMotion()) {\n // Wait for CSS transition 'transform' to end before continuing\n return new Promise<boolean>(resolve => {\n if (this.searchFlyout === undefined) {\n return resolve(true);\n }\n\n this.searchFlyout.addEventListener('transitionend', event => {\n if (event.propertyName === 'transform') {\n resolve(true);\n }\n });\n });\n }\n }\n }\n\n componentDidUpdate() {\n // Search flyout got set to open\n if (this.searchFlyout && this.searchDropdownOpen) {\n // Force browser to redraw/refresh DOM before adding 'open' class\n this.searchFlyout.getBoundingClientRect();\n this.searchFlyout.classList.add('open');\n }\n\n // Focus on the searchBox whenever the dropdown is opened\n if (this.searchDropdownOpen && this.searchBox) {\n this.searchBox.focus({ preventScroll: true });\n }\n }\n\n public async toggleDropdown(event?: Event): Promise<boolean>;\n public async toggleDropdown(force?: boolean): Promise<boolean>;\n\n /**\n * Toggle the dropdown and optionally force an open/closed state\n * @param force Boolean to force open/closed state\n * @returns Boolean indicating open state of the component\n */\n @Method()\n async toggleDropdown(force?: unknown) {\n this.searchDropdownOpen =\n force === undefined || typeof force !== 'boolean' ? !this.searchDropdownOpen : force;\n this.dropdownToggled.emit({ open: this.searchDropdownOpen, element: this.host });\n\n if (!this.searchDropdownOpen) {\n // Reset suggestions when dropdown closes\n this.coveoSuggestions = [];\n this.placeSuggestions = [];\n if (this.searchBox) this.searchBox.value = '';\n this.setFocus();\n } else {\n // Get basic suggestions when dropdown opens\n try {\n this.coveoSuggestions = await getCoveoSuggestions('');\n } catch {}\n }\n\n this.setBodyScroll();\n\n return this.searchDropdownOpen;\n }\n\n /**\n * Sets the focus on the search button\n */\n @Method()\n public async setFocus() {\n const shadowRoot = this.host.shadowRoot;\n if (shadowRoot === null) {\n return;\n }\n const toggleButton = shadowRoot.querySelector<HTMLElement>('.search-button');\n if (toggleButton) {\n toggleButton.focus();\n }\n }\n\n private handleResize() {\n // Only enable/disable body scroll on resize if the search dropdown is open, otherwise this could lead to side effects in other controls\n if (this.searchDropdownOpen) {\n this.setBodyScroll();\n }\n }\n\n /**\n * Disable or re-enable body scrolling, depending on whether search dropdown is open or closed in mobile view (width < 1024px)\n */\n private setBodyScroll() {\n if (this.searchDropdownOpen && window.innerWidth < 1024) {\n disableBodyScroll(this.searchFlyout);\n } else {\n enableBodyScroll(this.searchFlyout);\n }\n }\n\n /**\n * Fetch suggestions from all available sources\n */\n private async handleSearchInput() {\n if (this.searchBox === undefined || state.localizedConfig?.header.search === undefined) {\n return;\n }\n const query = this.searchBox.value.trim();\n\n const [placeSuggestions, coveoSuggestions, trackAndTraceInfo] = await Promise.all([\n queryPlaces(query),\n getCoveoSuggestions(query),\n getParcelSuggestion(query, state.localizedConfig.header.search),\n ]);\n\n this.parcelSuggestion = trackAndTraceInfo;\n\n // Parcel suggestion is more important than any other\n if (trackAndTraceInfo) {\n this.placeSuggestions = [];\n this.coveoSuggestions = [];\n } else {\n [this.coveoSuggestions, this.placeSuggestions] = equalizeArrays(\n coveoSuggestions,\n placeSuggestions,\n 7,\n );\n }\n\n this.deselectSuggestion();\n }\n\n /**\n * Start search on enter\n * @param event\n */\n private handleKeyDown(event: KeyboardEvent) {\n if (this.searchFlyout === undefined) {\n return;\n }\n\n let selectedSuggestion = this.searchFlyout.querySelector<HTMLElement>(\n '.suggestions > li > a.selected',\n );\n\n switch (event.key.toLowerCase()) {\n case 'enter':\n if (selectedSuggestion) {\n const selectedHref = selectedSuggestion.getAttribute('href');\n if (selectedHref !== null) {\n window.location.href = selectedHref;\n }\n } else {\n this.startSearch();\n }\n\n break;\n case 'arrowdown':\n case 'arrowup':\n const suggestions = this.searchFlyout.querySelectorAll('.suggestions > li > a');\n\n this.deselectSuggestion();\n\n if (event.key.toLowerCase() === 'arrowdown') {\n if (selectedSuggestion?.parentElement?.nextElementSibling?.firstElementChild) {\n // Select next suggestion if there's any, otherwise none will be selected\n selectedSuggestion.parentElement.nextElementSibling.firstElementChild.classList.add(\n 'selected',\n );\n } else {\n // If there are any suggestions, select first suggestion in list\n if (suggestions.length > 0) {\n suggestions[0].classList.add('selected');\n }\n }\n } else if (event.key.toLowerCase() === 'arrowup') {\n if (selectedSuggestion?.parentElement?.previousElementSibling?.firstElementChild) {\n // Select previous suggestion if there's any, otherwise none will be selected\n\n selectedSuggestion.parentElement.previousElementSibling.firstElementChild.classList.add(\n 'selected',\n );\n } else {\n // If there are any suggestions, select last suggestion in list\n if (suggestions.length > 0) {\n suggestions[suggestions.length - 1].classList.add('selected');\n }\n }\n }\n\n // Get the newly selected suggestion\n selectedSuggestion = this.searchFlyout.querySelector('.suggestions > li > a.selected');\n const suggestedText = selectedSuggestion?.dataset.suggestionText;\n\n // Update search box value with selected suggestion text\n if (suggestedText !== undefined && this.searchBox) {\n this.searchBox.value = suggestedText;\n }\n\n break;\n }\n }\n\n /**\n * Set selected suggestion on mouse enter\n * @param event\n */\n private handleMouseEnterSuggestion(event: MouseEvent) {\n this.deselectSuggestion();\n\n // Set hovered suggestion element as selected\n (event.target as HTMLElement).classList.add('selected');\n }\n\n /**\n * Set selected suggestion on mouse enter\n * @param event\n */\n private handleMouseLeaveSuggestions() {\n this.deselectSuggestion();\n }\n\n /**\n * Deselect any previously selected suggestion\n */\n private deselectSuggestion() {\n if (this.searchFlyout === undefined) return;\n\n const selectedSuggestion = this.searchFlyout.querySelector('.suggestions .selected');\n\n if (selectedSuggestion) {\n selectedSuggestion.classList.remove('selected');\n }\n }\n\n /**\n * Redirect to the post search page\n */\n private async startSearch() {\n if (this.searchBox && state.localizedConfig?.header.search) {\n const redirectUrl = await getSearchRedirectUrl(\n this.searchBox.value.trim(),\n state.localizedConfig.header.search,\n );\n if (!redirectUrl) return;\n window.location.href = redirectUrl;\n }\n }\n\n render() {\n if (state.localizedConfig?.header === undefined) {\n return;\n }\n const { translations, search } = state.localizedConfig.header;\n const showPortalRecommendations =\n this.searchBox?.value === '' && search.searchRecommendations?.links.length > 0;\n\n return (\n <Host>\n <SvgSprite />\n <div class=\"search\">\n <button\n id=\"post-internet-header-search-button\"\n class=\"search-button\"\n type=\"button\"\n aria-expanded={`${this.searchDropdownOpen}`}\n onClick={e => this.toggleDropdown(e)}\n >\n <span class=\"visually-hidden\">\n {this.searchDropdownOpen\n ? translations.searchToggleExpanded\n : translations.searchToggle}\n </span>\n <SvgIcon name={this.searchDropdownOpen ? 'pi-close' : 'pi-search'} />\n </button>\n <If condition={this.searchDropdownOpen}>\n <div class=\"flyout\" ref={e => (this.searchFlyout = e)}>\n <div class=\"container box\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-md-10 col-lg-8\">\n <div class=\"form-group form-floating\">\n <input\n type=\"text\"\n id=\"searchBox\"\n class=\"form-control form-control-lg\"\n placeholder={translations.flyoutSearchBoxFloatingLabel}\n autocomplete=\"off\"\n ref={el => (this.searchBox = el)}\n onInput={() => this.handleSearchInput()}\n onKeyDown={e => this.handleKeyDown(e)}\n />\n <label htmlFor=\"searchBox\">{translations.flyoutSearchBoxFloatingLabel}</label>\n <button\n onClick={() => this.startSearch()}\n class=\"nav-link start-search-button\"\n >\n <span class=\"visually-hidden\">{translations.searchSubmit}</span>\n <SvgIcon name=\"pi-search\" />\n </button>\n </div>\n {showPortalRecommendations && (\n <h2\n id=\"post-internet-header-search-recommendations-title\"\n class=\"bold\"\n >{search.searchRecommendations.title}</h2>\n )}\n <ul\n class=\"suggestions no-list\"\n onMouseLeave={() => this.handleMouseLeaveSuggestions()}\n aria-labelledby={showPortalRecommendations\n ? 'post-internet-header-search-recommendations-title'\n : undefined\n }\n >\n {showPortalRecommendations &&\n search.searchRecommendations.links.map(recommendation => (\n <li key={recommendation.href}>\n <a\n class=\"nav-link search-recommendation\"\n href={new URL(recommendation.href, 'https://post.ch').href}\n data-suggestion-text={recommendation.label}\n onMouseEnter={e => this.handleMouseEnterSuggestion(e)}\n >\n <span\n class=\"search-recommendation__icon\"\n innerHTML={recommendation.inlineSvg}\n ></span>\n <span>{recommendation.label}</span>\n </a>\n </li>\n ))}\n {this.parcelSuggestion && this.parcelSuggestion.ok && (\n <li>\n <a\n class=\"nav-link parcel-suggestion\"\n href={this.parcelSuggestion.url}\n data-suggestion-text={this.searchBox?.value}\n onMouseEnter={e => this.handleMouseEnterSuggestion(e)}\n >\n <SvgIcon name=\"pi-letter-parcel\" />\n <span class=\"bold\">{this.parcelSuggestion?.sending?.id}:&nbsp;</span>\n <span>\n {this.parcelSuggestion?.sending?.product},{' '}\n {this.parcelSuggestion?.sending?.recipient.zipcode}{' '}\n {this.parcelSuggestion?.sending?.recipient.city},{' '}\n {this.parcelSuggestion?.sending?.state}\n </span>\n </a>\n </li>\n )}\n {!showPortalRecommendations &&\n this.coveoSuggestions &&\n this.coveoSuggestions.map(suggestion => (\n <li key={suggestion.objectId}>\n <a\n class=\"nav-link\"\n href={suggestion.redirectUrl}\n data-suggestion-text={suggestion.expression}\n onMouseEnter={e => this.handleMouseEnterSuggestion(e)}\n >\n <SvgIcon name=\"pi-search\" />\n <HighlightedText text={suggestion.highlighted} />\n </a>\n </li>\n ))}\n {!showPortalRecommendations &&\n this.placeSuggestions &&\n this.placeSuggestions.map(suggestion => (\n <li key={suggestion.id}>\n <a\n class=\"nav-link\"\n href={getPlacesUrl(suggestion)}\n data-suggestion-text={suggestion.name}\n onMouseEnter={e => this.handleMouseEnterSuggestion(e)}\n >\n <SvgIcon name=\"pi-place\" />\n <HighlightedText\n text={highlightPlacesString(\n this.searchBox?.value?.trim(),\n suggestion.name,\n )}\n />\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n </If>\n </div>\n </Host>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"post-search.js","sourceRoot":"","sources":["../../../../src/components/post-search/post-search.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Host, h, State, Event, EventEmitter, Method, Element } from '@stencil/core';\nimport { throttle } from 'throttle-debounce';\nimport { disableBodyScroll, enableBodyScroll, clearAllBodyScrollLocks } from 'body-scroll-lock';\nimport { state } from '../../data/store';\nimport { CoveoCompletion } from '../../models/coveo.model';\nimport { GeocodeLocation } from '../../models/geocode.model';\nimport {\n DropdownElement,\n DropdownEvent,\n HasDropdown,\n IsFocusable,\n} from '../../models/header.model';\nimport { getSearchRedirectUrl, equalizeArrays } from '../../services/search/search.service';\nimport { getCoveoSuggestions } from '../../services/search/coveo.service';\nimport {\n getPlacesUrl,\n highlightPlacesString,\n queryPlaces,\n} from '../../services/search/places.service';\nimport { userPrefersReducedMotion, elementHasTransition } from '../../services/ui.service';\nimport { HighlightedText } from '../../utils/highlighted.component';\nimport { SvgSprite } from '../../utils/svg-sprite.component';\nimport { SvgIcon } from '../../utils/svg-icon.component';\nimport { TrackAndTraceInfo } from '../../models/track-and-trace.model';\nimport { getParcelSuggestion } from '../../services/search/parcel.service';\nimport { If } from '../../utils/if.component';\n\n@Component({\n tag: 'post-search',\n styleUrl: 'post-search.scss',\n shadow: true,\n})\nexport class PostSearch implements HasDropdown, IsFocusable {\n @State() searchDropdownOpen = false;\n @State() coveoSuggestions: CoveoCompletion[] = [];\n @State() placeSuggestions: GeocodeLocation[] = [];\n @State() parcelSuggestion: (TrackAndTraceInfo & { url: string }) | null = null;\n @Event() dropdownToggled: EventEmitter<DropdownEvent>;\n @Element() host: DropdownElement;\n private searchBox?: HTMLInputElement;\n private searchFlyout: HTMLElement | undefined;\n private throttledResize: throttle<() => void>;\n\n connectedCallback() {\n this.throttledResize = throttle(300, () => this.handleResize());\n window.addEventListener('resize', this.throttledResize, { passive: true });\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this.throttledResize);\n clearAllBodyScrollLocks();\n }\n\n componentWillUpdate() {\n // Check if search flyout got set to close\n if (this.searchFlyout && !this.searchDropdownOpen) {\n this.searchFlyout.classList.remove('open');\n\n // Check if element has transition applied and whether user prefers to see animations or not\n if (elementHasTransition(this.searchFlyout, 'transform') && !userPrefersReducedMotion()) {\n // Wait for CSS transition 'transform' to end before continuing\n return new Promise<boolean>(resolve => {\n if (this.searchFlyout === undefined) {\n return resolve(true);\n }\n\n this.searchFlyout.addEventListener('transitionend', event => {\n if (event.propertyName === 'transform') {\n resolve(true);\n }\n });\n });\n }\n }\n }\n\n componentDidUpdate() {\n // Search flyout got set to open\n if (this.searchFlyout && this.searchDropdownOpen) {\n // Force browser to redraw/refresh DOM before adding 'open' class\n this.searchFlyout.getBoundingClientRect();\n this.searchFlyout.classList.add('open');\n }\n\n // Focus on the searchBox whenever the dropdown is opened\n if (this.searchDropdownOpen && this.searchBox) {\n this.searchBox.focus({ preventScroll: true });\n }\n }\n\n public async toggleDropdown(event?: Event): Promise<boolean>;\n public async toggleDropdown(force?: boolean): Promise<boolean>;\n\n /**\n * Toggle the dropdown and optionally force an open/closed state\n * @param force Boolean to force open/closed state\n * @returns Boolean indicating open state of the component\n */\n @Method()\n async toggleDropdown(force?: unknown) {\n this.searchDropdownOpen =\n force === undefined || typeof force !== 'boolean' ? !this.searchDropdownOpen : force;\n this.dropdownToggled.emit({ open: this.searchDropdownOpen, element: this.host });\n\n if (!this.searchDropdownOpen) {\n // Reset suggestions when dropdown closes\n this.coveoSuggestions = [];\n this.placeSuggestions = [];\n if (this.searchBox) this.searchBox.value = '';\n this.setFocus();\n } else {\n // Get basic suggestions when dropdown opens\n try {\n this.coveoSuggestions = await getCoveoSuggestions('');\n } catch {}\n }\n\n this.setBodyScroll();\n\n return this.searchDropdownOpen;\n }\n\n /**\n * Sets the focus on the search button\n */\n @Method()\n public async setFocus() {\n const shadowRoot = this.host.shadowRoot;\n if (shadowRoot === null) {\n return;\n }\n const toggleButton = shadowRoot.querySelector<HTMLElement>('.search-button');\n if (toggleButton) {\n toggleButton.focus();\n }\n }\n\n private handleResize() {\n // Only enable/disable body scroll on resize if the search dropdown is open, otherwise this could lead to side effects in other controls\n if (this.searchDropdownOpen) {\n this.setBodyScroll();\n }\n }\n\n /**\n * Disable or re-enable body scrolling, depending on whether search dropdown is open or closed in mobile view (width < 1024px)\n */\n private setBodyScroll() {\n if (this.searchDropdownOpen && window.innerWidth < 1024) {\n disableBodyScroll(this.searchFlyout);\n } else {\n enableBodyScroll(this.searchFlyout);\n }\n }\n\n /**\n * Fetch suggestions from all available sources\n */\n private async handleSearchInput() {\n if (this.searchBox === undefined || state.localizedConfig?.header.search === undefined) {\n return;\n }\n const query = this.searchBox.value.trim();\n\n const [placeSuggestions, coveoSuggestions, trackAndTraceInfo] = await Promise.all([\n queryPlaces(query),\n getCoveoSuggestions(query),\n getParcelSuggestion(query, state.localizedConfig.header.search),\n ]);\n\n this.parcelSuggestion = trackAndTraceInfo;\n\n // Parcel suggestion is more important than any other\n if (trackAndTraceInfo) {\n this.placeSuggestions = [];\n this.coveoSuggestions = [];\n } else {\n [this.coveoSuggestions, this.placeSuggestions] = equalizeArrays(\n coveoSuggestions,\n placeSuggestions,\n 7,\n );\n }\n\n this.deselectSuggestion();\n }\n\n /**\n * Start search on enter\n * @param event\n */\n private handleKeyDown(event: KeyboardEvent) {\n if (this.searchFlyout === undefined) {\n return;\n }\n\n let selectedSuggestion = this.searchFlyout.querySelector<HTMLElement>(\n '.suggestions > li > a.selected',\n );\n\n switch (event.key.toLowerCase()) {\n case 'enter':\n if (selectedSuggestion) {\n const selectedHref = selectedSuggestion.getAttribute('href');\n if (selectedHref !== null) {\n window.location.href = selectedHref;\n }\n } else {\n this.startSearch();\n }\n\n break;\n case 'arrowdown':\n case 'arrowup':\n const suggestions = this.searchFlyout.querySelectorAll('.suggestions > li > a');\n\n this.deselectSuggestion();\n\n if (event.key.toLowerCase() === 'arrowdown') {\n if (selectedSuggestion?.parentElement?.nextElementSibling?.firstElementChild) {\n // Select next suggestion if there's any, otherwise none will be selected\n selectedSuggestion.parentElement.nextElementSibling.firstElementChild.classList.add(\n 'selected',\n );\n } else {\n // If there are any suggestions, select first suggestion in list\n if (suggestions.length > 0) {\n suggestions[0].classList.add('selected');\n }\n }\n } else if (event.key.toLowerCase() === 'arrowup') {\n if (selectedSuggestion?.parentElement?.previousElementSibling?.firstElementChild) {\n // Select previous suggestion if there's any, otherwise none will be selected\n\n selectedSuggestion.parentElement.previousElementSibling.firstElementChild.classList.add(\n 'selected',\n );\n } else {\n // If there are any suggestions, select last suggestion in list\n if (suggestions.length > 0) {\n suggestions[suggestions.length - 1].classList.add('selected');\n }\n }\n }\n\n // Get the newly selected suggestion\n selectedSuggestion = this.searchFlyout.querySelector('.suggestions > li > a.selected');\n const suggestedText = selectedSuggestion?.dataset.suggestionText;\n\n // Update search box value with selected suggestion text\n if (suggestedText !== undefined && this.searchBox) {\n this.searchBox.value = suggestedText;\n }\n\n break;\n }\n }\n\n /**\n * Set selected suggestion on mouse enter\n * @param event\n */\n private handleMouseEnterSuggestion(event: MouseEvent) {\n this.deselectSuggestion();\n\n // Set hovered suggestion element as selected\n (event.target as HTMLElement).classList.add('selected');\n }\n\n /**\n * Set selected suggestion on mouse enter\n * @param event\n */\n private handleMouseLeaveSuggestions() {\n this.deselectSuggestion();\n }\n\n /**\n * Deselect any previously selected suggestion\n */\n private deselectSuggestion() {\n if (this.searchFlyout === undefined) return;\n\n const selectedSuggestion = this.searchFlyout.querySelector('.suggestions .selected');\n\n if (selectedSuggestion) {\n selectedSuggestion.classList.remove('selected');\n }\n }\n\n /**\n * Redirect to the post search page\n */\n private async startSearch() {\n if (this.searchBox && state.localizedConfig?.header.search) {\n const redirectUrl = await getSearchRedirectUrl(\n this.searchBox.value.trim(),\n state.localizedConfig.header.search,\n );\n if (!redirectUrl) return;\n window.location.href = redirectUrl;\n }\n }\n\n render() {\n if (state.localizedConfig?.header === undefined) {\n return;\n }\n const { translations, search } = state.localizedConfig.header;\n const showPortalRecommendations =\n this.searchBox?.value === '' && search.searchRecommendations?.links.length > 0;\n\n return (\n <Host role=\"search\">\n <SvgSprite />\n <div class=\"search\">\n <button\n id=\"post-internet-header-search-button\"\n class=\"search-button\"\n type=\"button\"\n aria-expanded={`${this.searchDropdownOpen}`}\n onClick={e => this.toggleDropdown(e)}\n >\n <span class=\"visually-hidden\">\n {this.searchDropdownOpen\n ? translations.searchToggleExpanded\n : translations.searchToggle}\n </span>\n <SvgIcon name={this.searchDropdownOpen ? 'pi-close' : 'pi-search'} />\n </button>\n <If condition={this.searchDropdownOpen}>\n <div class=\"flyout\" ref={e => (this.searchFlyout = e)}>\n <div class=\"container box\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-md-10 col-lg-8\">\n <div class=\"form-group form-floating\">\n <input\n type=\"text\"\n role=\"searchbox\"\n id=\"searchBox\"\n class=\"form-control form-control-lg\"\n placeholder={translations.flyoutSearchBoxFloatingLabel}\n autocomplete=\"off\"\n ref={el => (this.searchBox = el)}\n onInput={() => this.handleSearchInput()}\n onKeyDown={e => this.handleKeyDown(e)}\n />\n <label htmlFor=\"searchBox\">{translations.flyoutSearchBoxFloatingLabel}</label>\n <button\n onClick={() => this.startSearch()}\n class=\"nav-link start-search-button\"\n >\n <span class=\"visually-hidden\">{translations.searchSubmit}</span>\n <SvgIcon name=\"pi-search\" />\n </button>\n </div>\n {showPortalRecommendations && (\n <h2\n id=\"post-internet-header-search-recommendations-title\"\n class=\"bold\"\n >{search.searchRecommendations.title}</h2>\n )}\n <ul\n class=\"suggestions no-list\"\n onMouseLeave={() => this.handleMouseLeaveSuggestions()}\n aria-labelledby={showPortalRecommendations\n ? 'post-internet-header-search-recommendations-title'\n : undefined\n }\n >\n {showPortalRecommendations &&\n search.searchRecommendations.links.map(recommendation => (\n <li key={recommendation.href}>\n <a\n class=\"nav-link search-recommendation\"\n href={new URL(recommendation.href, 'https://post.ch').href}\n data-suggestion-text={recommendation.label}\n onMouseEnter={e => this.handleMouseEnterSuggestion(e)}\n >\n <span\n class=\"search-recommendation__icon\"\n innerHTML={recommendation.inlineSvg}\n ></span>\n <span>{recommendation.label}</span>\n </a>\n </li>\n ))}\n {this.parcelSuggestion && this.parcelSuggestion.ok && (\n <li>\n <a\n class=\"nav-link parcel-suggestion\"\n href={this.parcelSuggestion.url}\n data-suggestion-text={this.searchBox?.value}\n onMouseEnter={e => this.handleMouseEnterSuggestion(e)}\n >\n <SvgIcon name=\"pi-letter-parcel\" />\n <span class=\"bold\">{this.parcelSuggestion?.sending?.id}:&nbsp;</span>\n <span>\n {this.parcelSuggestion?.sending?.product},{' '}\n {this.parcelSuggestion?.sending?.recipient.zipcode}{' '}\n {this.parcelSuggestion?.sending?.recipient.city},{' '}\n {this.parcelSuggestion?.sending?.state}\n </span>\n </a>\n </li>\n )}\n {!showPortalRecommendations &&\n this.coveoSuggestions &&\n this.coveoSuggestions.map(suggestion => (\n <li key={suggestion.objectId}>\n <a\n class=\"nav-link\"\n href={suggestion.redirectUrl}\n data-suggestion-text={suggestion.expression}\n onMouseEnter={e => this.handleMouseEnterSuggestion(e)}\n >\n <SvgIcon name=\"pi-search\" />\n <HighlightedText text={suggestion.highlighted} />\n </a>\n </li>\n ))}\n {!showPortalRecommendations &&\n this.placeSuggestions &&\n this.placeSuggestions.map(suggestion => (\n <li key={suggestion.id}>\n <a\n class=\"nav-link\"\n href={getPlacesUrl(suggestion)}\n data-suggestion-text={suggestion.name}\n onMouseEnter={e => this.handleMouseEnterSuggestion(e)}\n >\n <SvgIcon name=\"pi-place\" />\n <HighlightedText\n text={highlightPlacesString(\n this.searchBox?.value?.trim(),\n suggestion.name,\n )}\n />\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n </If>\n </div>\n </Host>\n );\n }\n}\n"]}
@@ -15,6 +15,7 @@
15
15
  background: white;
16
16
  }
17
17
  .skiplinks a:focus-visible {
18
+ position: absolute;
18
19
  clip: unset;
19
20
  width: auto;
20
21
  }
@@ -33,7 +33,7 @@ export class PostSkiplinks {
33
33
  if (config === undefined) {
34
34
  return;
35
35
  }
36
- return (h(Host, null, h("div", { class: "skiplinks" }, h("h1", { class: "visually-hidden" }, translate('Navigate on post.ch')), h("ul", { class: "no-list" }, h("li", null, h("a", { class: "nav-link", href: config.logo.logoLink }, h("span", null, config.logo.logoLinkTitle), h(SvgIcon, { name: "pi-pointy-arrow-right" }))), h("li", null, h("a", { class: "nav-link", href: "#post-internet-header-main-navigation", onClick: () => this.focusMain() }, h("span", null, config.translations.navMainAriaLabel), h(SvgIcon, { name: "pi-pointy-arrow-right" }))), mainId ? (h("li", null, h("a", { class: "nav-link", href: `#${mainId}` }, h("span", null, translate('Go to main content')), h(SvgIcon, { name: "pi-pointy-arrow-right" })))) : null, state.search ? (h("li", null, h("a", { class: "nav-link", href: "#post-internet-header-search-button", onClick: () => this.focusSearch() }, h("span", null, translate('Go to search')), h(SvgIcon, { name: "pi-pointy-arrow-right" })))) : null, state.login ? (h("li", null, h("a", { class: "nav-link", href: "#post-klp-login-widget", onClick: () => this.focusLogin() }, h("span", null, translate('Go to login')), h(SvgIcon, { name: "pi-pointy-arrow-right" })))) : null))));
36
+ return (h(Host, null, h("div", { class: "skiplinks" }, h("ul", { class: "no-list", "aria-label": translate('Skip Links') }, h("li", null, h("a", { class: "nav-link", href: config.logo.logoLink }, h("span", null, config.logo.logoLinkTitle), h(SvgIcon, { name: "pi-pointy-arrow-right" }))), h("li", null, h("a", { class: "nav-link", href: "#post-internet-header-main-navigation", onClick: () => this.focusMain() }, h("span", null, config.translations.navMainAriaLabel), h(SvgIcon, { name: "pi-pointy-arrow-right" }))), mainId ? (h("li", null, h("a", { class: "nav-link", href: `#${mainId}` }, h("span", null, translate('Go to main content')), h(SvgIcon, { name: "pi-pointy-arrow-right" })))) : null, state.search ? (h("li", null, h("a", { class: "nav-link", href: "#post-internet-header-search-button", onClick: () => this.focusSearch() }, h("span", null, translate('Go to search')), h(SvgIcon, { name: "pi-pointy-arrow-right" })))) : null, state.login ? (h("li", null, h("a", { class: "nav-link", href: "#post-klp-login-widget", onClick: () => this.focusLogin() }, h("span", null, translate('Go to login')), h(SvgIcon, { name: "pi-pointy-arrow-right" })))) : null))));
37
37
  }
38
38
  static get is() { return "post-skiplinks"; }
39
39
  static get originalStyleUrls() {
@@ -1 +1 @@
1
- {"version":3,"file":"post-skiplinks.js","sourceRoot":"","sources":["../../../../src/components/post-skiplinks/post-skiplinks.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Host, h, Element } from '@stencil/core';\nimport { state } from '../../data/store';\nimport { FocusableElement } from '../../models/header.model';\nimport { translate } from '../../services/language.service';\nimport { SvgIcon } from '../../utils/svg-icon.component';\n\n@Component({\n tag: 'post-skiplinks',\n styleUrl: 'post-skiplinks.scss',\n shadow: false,\n})\nexport class PostSkiplinks {\n @Element() host: HTMLElement;\n\n private getMainId() {\n return document.querySelector('main[id]')?.getAttribute('id');\n }\n\n private setFocus(tagname: string) {\n const rootHost = this.host.closest('.post-internet-header');\n if (!rootHost) {\n return;\n }\n\n const focusable = rootHost.querySelector<FocusableElement>(tagname);\n if (focusable) {\n focusable.setFocus();\n }\n }\n\n private focusMain() {\n this.setFocus('post-main-navigation');\n }\n\n private focusSearch() {\n this.setFocus('post-search');\n }\n\n private focusLogin() {\n this.setFocus('post-klp-login-widget');\n }\n\n render() {\n const config = state.localizedConfig?.header;\n const mainId = this.getMainId();\n\n if (config === undefined) {\n return;\n }\n\n return (\n <Host>\n <div class=\"skiplinks\">\n <h1 class=\"visually-hidden\">{translate('Navigate on post.ch')}</h1>\n <ul class=\"no-list\">\n <li>\n <a class=\"nav-link\" href={config.logo.logoLink}>\n <span>{config.logo.logoLinkTitle}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n <li>\n <a class=\"nav-link\" href=\"#post-internet-header-main-navigation\" onClick={() => this.focusMain()}>\n <span>{config.translations.navMainAriaLabel}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n {mainId ? (\n <li>\n <a class=\"nav-link\" href={`#${mainId}`}>\n <span>{translate('Go to main content')}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n ) : null}\n {state.search ? (\n <li>\n <a class=\"nav-link\" href=\"#post-internet-header-search-button\" onClick={() => this.focusSearch()}>\n <span>{translate('Go to search')}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n ) : null}\n {state.login ? (\n <li>\n <a class=\"nav-link\" href=\"#post-klp-login-widget\" onClick={() => this.focusLogin()}>\n <span>{translate('Go to login')}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n ) : null}\n </ul>\n </div>\n </Host>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"post-skiplinks.js","sourceRoot":"","sources":["../../../../src/components/post-skiplinks/post-skiplinks.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Host, h, Element } from '@stencil/core';\nimport { state } from '../../data/store';\nimport { FocusableElement } from '../../models/header.model';\nimport { translate } from '../../services/language.service';\nimport { SvgIcon } from '../../utils/svg-icon.component';\n\n@Component({\n tag: 'post-skiplinks',\n styleUrl: 'post-skiplinks.scss',\n shadow: false,\n})\nexport class PostSkiplinks {\n @Element() host: HTMLElement;\n\n private getMainId() {\n return document.querySelector('main[id]')?.getAttribute('id');\n }\n\n private setFocus(tagname: string) {\n const rootHost = this.host.closest('.post-internet-header');\n if (!rootHost) {\n return;\n }\n\n const focusable = rootHost.querySelector<FocusableElement>(tagname);\n if (focusable) {\n focusable.setFocus();\n }\n }\n\n private focusMain() {\n this.setFocus('post-main-navigation');\n }\n\n private focusSearch() {\n this.setFocus('post-search');\n }\n\n private focusLogin() {\n this.setFocus('post-klp-login-widget');\n }\n\n render() {\n const config = state.localizedConfig?.header;\n const mainId = this.getMainId();\n\n if (config === undefined) {\n return;\n }\n\n return (\n <Host>\n <div class=\"skiplinks\">\n <ul class=\"no-list\" aria-label={translate('Skip Links')}>\n <li>\n <a class=\"nav-link\" href={config.logo.logoLink}>\n <span>{config.logo.logoLinkTitle}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n <li>\n <a class=\"nav-link\" href=\"#post-internet-header-main-navigation\" onClick={() => this.focusMain()}>\n <span>{config.translations.navMainAriaLabel}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n {mainId ? (\n <li>\n <a class=\"nav-link\" href={`#${mainId}`}>\n <span>{translate('Go to main content')}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n ) : null}\n {state.search ? (\n <li>\n <a class=\"nav-link\" href=\"#post-internet-header-search-button\" onClick={() => this.focusSearch()}>\n <span>{translate('Go to search')}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n ) : null}\n {state.login ? (\n <li>\n <a class=\"nav-link\" href=\"#post-klp-login-widget\" onClick={() => this.focusLogin()}>\n <span>{translate('Go to login')}</span>\n <SvgIcon name=\"pi-pointy-arrow-right\" />\n </a>\n </li>\n ) : null}\n </ul>\n </div>\n </Host>\n );\n }\n}\n"]}
@@ -0,0 +1,274 @@
1
+ import * as testConfigRaw from '../assets/config/test-configuration.json';
2
+ import { fetchConfig, generateConfigUrl, getLocalizedConfig, getLocalizedCustomConfig, isMobile, isValidProjectId, mergeOsFlyoutOverrides, setMainNavigationIds, } from './config.service';
3
+ const testConfig = testConfigRaw;
4
+ const customConfig = {
5
+ de: {
6
+ header: {
7
+ navMain: [
8
+ {
9
+ title: 'Meine Links (custom config)',
10
+ text: 'Meine Links',
11
+ flyout: [
12
+ {
13
+ title: 'Google',
14
+ linkList: [
15
+ { url: window.location.href, title: 'Google Maps', target: '_blank' },
16
+ { url: 'http://localhost:3333', title: 'Google Translate' },
17
+ { url: 'http://localhost:3333/aaa/bbb/ccc', title: 'Google Translate' },
18
+ ],
19
+ },
20
+ ],
21
+ },
22
+ ],
23
+ },
24
+ footer: {
25
+ block: {
26
+ title: 'Eigene Footer-Konfiguration',
27
+ links: [
28
+ { url: 'https://fireship.io', text: 'Fireship.io', target: '_blank' },
29
+ { url: 'https://css-tricks.com', text: 'CSS-Tricks', target: '_blank' },
30
+ { url: 'https://web.dev', text: 'web.dev', target: '_blank' },
31
+ { url: 'https://developer.mozilla.org', text: 'MDN Web Docs', target: '_blank' },
32
+ { url: 'https://getbootstrap.com', text: 'Bootstrap', target: '_blank' },
33
+ { url: 'https://google.com', text: 'Google', target: '_blank' },
34
+ { url: 'https://microsoft.com', text: 'Microsoft', target: '_blank' },
35
+ ],
36
+ },
37
+ },
38
+ },
39
+ en: {
40
+ footer: {
41
+ block: {
42
+ title: 'Custom footer config',
43
+ links: [
44
+ { url: 'https://fireship.io', text: 'Fireship.io', target: '_blank' },
45
+ { url: 'https://css-tricks.com', text: 'CSS-Tricks', target: '_blank' },
46
+ ],
47
+ },
48
+ },
49
+ },
50
+ };
51
+ const stringCustomConfig = JSON.stringify(customConfig);
52
+ describe('config.service.ts', () => {
53
+ global.fetch = jest.fn(() => {
54
+ return Promise.resolve({
55
+ json: () => Promise.resolve(testConfig),
56
+ });
57
+ });
58
+ describe('isMobile', () => {
59
+ it('checks the window width', () => {
60
+ global.innerWidth = 500;
61
+ expect(isMobile()).toBe(true);
62
+ global.innerWidth = 1500;
63
+ expect(isMobile()).toBe(false);
64
+ });
65
+ });
66
+ describe('isValidProjectId', () => {
67
+ it('Check if project id is valid', () => {
68
+ expect(isValidProjectId('test')).toBe(true);
69
+ expect(isValidProjectId('test123')).toBe(true);
70
+ expect(isValidProjectId('test-1')).toBe(true);
71
+ expect(isValidProjectId('test_1')).toBe(true);
72
+ expect(isValidProjectId('1test')).toBe(false);
73
+ expect(isValidProjectId(' test')).toBe(false);
74
+ expect(isValidProjectId('-test')).toBe(false);
75
+ expect(isValidProjectId('test-')).toBe(false);
76
+ expect(isValidProjectId('tes!t')).toBe(false);
77
+ expect(isValidProjectId('test.bla')).toBe(false);
78
+ expect(isValidProjectId('test,xy')).toBe(false);
79
+ expect(isValidProjectId('')).toBe(false);
80
+ });
81
+ });
82
+ describe('setMainNavigationIds', () => {
83
+ it('should replace all main nav ids with browser compatible ids and keep flyout_os', () => {
84
+ const base = [
85
+ { id: 123 },
86
+ { id: 'flyout_os' },
87
+ { id: '-11' },
88
+ { id: '%' },
89
+ ];
90
+ setMainNavigationIds(base);
91
+ expect(base).toEqual(expect.arrayContaining([
92
+ expect.objectContaining({
93
+ id: expect.stringMatching(/^main-nav-.+|^flyout_os$/gi),
94
+ }),
95
+ ]));
96
+ });
97
+ });
98
+ describe('getLocalizedCustomConfig', () => {
99
+ it('should parse the correct config', () => {
100
+ expect(typeof getLocalizedCustomConfig(stringCustomConfig, 'de')).toBe('object');
101
+ });
102
+ it('should return object if config lang is found', () => {
103
+ expect(typeof getLocalizedCustomConfig(customConfig, 'de')).toBe('object');
104
+ });
105
+ it('should return null if lang is not found in config', () => {
106
+ expect(getLocalizedCustomConfig(stringCustomConfig, 'kz')).toBe(undefined);
107
+ });
108
+ });
109
+ describe('generateConfigUrl', () => {
110
+ it('should return a test URL', () => {
111
+ expect(generateConfigUrl('test', 'int01')).toEqual('assets/config/test-configuration.json');
112
+ });
113
+ it('should return an int URL', () => {
114
+ expect(generateConfigUrl('topos', 'int01')).toEqual('https://int.post.ch/api/headerjs/Json?serviceid=topos&environment=int01');
115
+ });
116
+ it('should return prod by default', () => {
117
+ expect(generateConfigUrl('topos', 'prod')).toEqual('https://www.post.ch/api/headerjs/Json?serviceid=topos');
118
+ });
119
+ it('should reduce XSS risk', () => {
120
+ expect(generateConfigUrl('<script>alert()</script>', 'prod')).toEqual('https://www.post.ch/api/headerjs/Json?serviceid=%3Cscript%3Ealert()%3C%2Fscript%3E');
121
+ });
122
+ it('should work with upper case env', () => {
123
+ /* @ts-expect-error */
124
+ expect(generateConfigUrl('whatever', 'INT01')).toEqual('https://int.post.ch/api/headerjs/Json?serviceid=whatever&environment=int01');
125
+ });
126
+ });
127
+ describe('fetchConfig', () => {
128
+ it('should fetch config', async () => {
129
+ const res = await fetchConfig('test', 'int01');
130
+ expect(res).toEqual(testConfig);
131
+ expect(fetch).toHaveBeenCalledTimes(1);
132
+ });
133
+ });
134
+ describe('mergeOsFlyoutOverrides', () => {
135
+ it('should merge configs correctly', () => {
136
+ const newConfig = mergeOsFlyoutOverrides(testConfig.de, {
137
+ title: 'Test',
138
+ });
139
+ const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');
140
+ if (!osFlyout)
141
+ fail('osFlyout is undefined');
142
+ expect(osFlyout.title).toBe('Test');
143
+ });
144
+ it('should not overwrite function parameter', () => {
145
+ const newConfig = mergeOsFlyoutOverrides(testConfig.de, {
146
+ title: 'Test',
147
+ flyout: [
148
+ {
149
+ linkList: [
150
+ {
151
+ title: 'Additional link',
152
+ url: '/',
153
+ },
154
+ ],
155
+ },
156
+ ],
157
+ });
158
+ const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');
159
+ if (!osFlyout)
160
+ fail('osFlyout is undefined');
161
+ expect(osFlyout.flyout[0].linkList.length).toBe(2);
162
+ const newConfig2 = mergeOsFlyoutOverrides(testConfig.de, {
163
+ title: 'Test',
164
+ flyout: [
165
+ {
166
+ linkList: [
167
+ {
168
+ title: 'Additional link',
169
+ url: '/',
170
+ },
171
+ ],
172
+ },
173
+ ],
174
+ });
175
+ const osFlyout2 = newConfig2.find(nav => nav.id === 'flyout_os');
176
+ if (!osFlyout2)
177
+ fail('osFlyout is undefined');
178
+ expect(osFlyout2.flyout[0].linkList.length).toBe(2);
179
+ });
180
+ it('should extend os flyout with additional columns', () => {
181
+ const newConfig = mergeOsFlyoutOverrides(testConfig.de, {
182
+ title: 'Test',
183
+ flyout: [
184
+ {
185
+ linkList: [
186
+ {
187
+ title: 'Additional link',
188
+ url: '/',
189
+ },
190
+ ],
191
+ },
192
+ {
193
+ title: 'New column',
194
+ linkList: [
195
+ {
196
+ title: 'Link in new column',
197
+ url: '/',
198
+ },
199
+ ],
200
+ },
201
+ ],
202
+ });
203
+ const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');
204
+ if (!osFlyout)
205
+ fail('osFlyout is undefined');
206
+ expect(osFlyout.flyout.length).toBe(2);
207
+ });
208
+ });
209
+ describe('getLocalizedConfig', () => {
210
+ it('should get correct local config', async () => {
211
+ const config = await getLocalizedConfig({
212
+ projectId: 'test',
213
+ environment: 'int01',
214
+ language: 'de',
215
+ });
216
+ expect(config).toEqual(testConfig.de);
217
+ });
218
+ it('should modify the config correctly', async () => {
219
+ const config = await getLocalizedConfig({
220
+ projectId: 'test',
221
+ environment: 'int01',
222
+ language: 'de',
223
+ localizedCustomConfig: {
224
+ header: {
225
+ navMain: [
226
+ {
227
+ title: 'New Navmain',
228
+ flyout: [
229
+ {
230
+ title: 'New Navcol',
231
+ linkList: [
232
+ {
233
+ title: 'New Navlink',
234
+ url: '/',
235
+ },
236
+ ],
237
+ },
238
+ ],
239
+ },
240
+ ],
241
+ },
242
+ },
243
+ });
244
+ const [lastMainNav] = config.header.navMain.slice(-1);
245
+ expect(lastMainNav.title).toBe('New Navmain');
246
+ expect(lastMainNav.flyout.length).toBe(1);
247
+ });
248
+ it('should extend flyout_os', async () => {
249
+ const config = await getLocalizedConfig({
250
+ projectId: 'test',
251
+ environment: 'int01',
252
+ language: 'de',
253
+ osFlyoutOverrides: {
254
+ flyout: [
255
+ {
256
+ title: 'OS Extender',
257
+ linkList: [
258
+ {
259
+ title: 'Added link',
260
+ url: '/',
261
+ },
262
+ ],
263
+ },
264
+ ],
265
+ },
266
+ });
267
+ const osFlyout = config.header.navMain.find(nav => nav.id === 'flyout_os');
268
+ if (!osFlyout)
269
+ fail('osFlyout is undefined');
270
+ expect(osFlyout.flyout[0].linkList.length).toBe(2);
271
+ });
272
+ });
273
+ });
274
+ //# sourceMappingURL=config.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.spec.js","sourceRoot":"","sources":["../../../src/services/config.service.spec.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,aAAa,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,QAAQ,EACR,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,UAAU,GAAkB,aAA8B,CAAC;AAEjE,MAAM,YAAY,GAAG;EACnB,EAAE,EAAE;IACF,MAAM,EAAE;MACN,OAAO,EAAE;QACP;UACE,KAAK,EAAE,6BAA6B;UACpC,IAAI,EAAE,aAAa;UACnB,MAAM,EAAE;YACN;cACE,KAAK,EAAE,QAAQ;cACf,QAAQ,EAAE;gBACR,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE;gBACrE,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,kBAAkB,EAAE;gBAC3D,EAAE,GAAG,EAAE,mCAAmC,EAAE,KAAK,EAAE,kBAAkB,EAAE;eACxE;aACF;WACF;SACF;OACF;KACF;IACD,MAAM,EAAE;MACN,KAAK,EAAE;QACL,KAAK,EAAE,6BAA6B;QACpC,KAAK,EAAE;UACL,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE;UACrE,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE;UACvE,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;UAC7D,EAAE,GAAG,EAAE,+BAA+B,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE;UAChF,EAAE,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE;UACxE,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;UAC/D,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE;SACtE;OACF;KACF;GACF;EACD,EAAE,EAAE;IACF,MAAM,EAAE;MACN,KAAK,EAAE;QACL,KAAK,EAAE,sBAAsB;QAC7B,KAAK,EAAE;UACL,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE;UACrE,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE;SACxE;OACF;KACF;GACF;CACF,CAAC;AACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAExD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;EACjC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;IAC1B,OAAO,OAAO,CAAC,OAAO,CAAC;MACrB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;KACxC,CAAsB,CAAC;EAC1B,CAAC,CAAC,CAAC;EAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;MACjC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;MACxB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAC9B,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;MACzB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;EAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;MACtC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAC5C,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAC/C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAC9C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAE9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAE9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAC9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAC9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAC9C,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAC9C,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MACjD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;MAChD,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;EAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;MACxF,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,EAAE,GAAG,EAAE;QACX,EAAE,EAAE,EAAE,WAAW,EAAE;QACnB,EAAE,EAAE,EAAE,KAAK,EAAE;QACb,EAAE,EAAE,EAAE,GAAG,EAAE;OACO,CAAC;MACrB,oBAAoB,CAAC,IAAI,CAAC,CAAC;MAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAClB,MAAM,CAAC,eAAe,CAAC;QACrB,MAAM,CAAC,gBAAgB,CAAC;UACtB,EAAE,EAAE,MAAM,CAAC,cAAc,CAAC,4BAA4B,CAAC;SACxD,CAAC;OACH,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;EAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;MACzC,MAAM,CAAC,OAAO,wBAAwB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;MACtD,MAAM,CAAC,OAAO,wBAAwB,CAAC,YAA6B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;MAC3D,MAAM,CAAC,wBAAwB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;EAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;MAClC,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;MAClC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CACjD,yEAAyE,CAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;MACvC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAChD,uDAAuD,CACxD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;MAChC,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CACnE,oFAAoF,CACrF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;MACzC,sBAAsB;MACtB,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CACpD,4EAA4E,CAC7E,CAAC;IACJ,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;EAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;MACnC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;MAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;MAChC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;EAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;MACxC,MAAM,SAAS,GAAG,sBAAsB,CAAC,UAAU,CAAC,EAAG,EAAE;QACvD,KAAK,EAAE,MAAM;OACG,CAAC,CAAC;MAEpB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;MAC/D,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;MAC7C,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;MACjD,MAAM,SAAS,GAAG,sBAAsB,CAAC,UAAU,CAAC,EAAG,EAAE;QACvD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE;UACN;YACE,QAAQ,EAAE;cACR;gBACE,KAAK,EAAE,iBAAiB;gBACxB,GAAG,EAAE,GAAG;eACT;aACF;WACF;SACF;OACe,CAAC,CAAC;MAEpB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;MAC/D,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;MAC7C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;MAEnD,MAAM,UAAU,GAAG,sBAAsB,CAAC,UAAU,CAAC,EAAG,EAAE;QACxD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE;UACN;YACE,QAAQ,EAAE;cACR;gBACE,KAAK,EAAE,iBAAiB;gBACxB,GAAG,EAAE,GAAG;eACT;aACF;WACF;SACF;OACe,CAAC,CAAC;MACpB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;MACjE,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;MAC9C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;MACzD,MAAM,SAAS,GAAG,sBAAsB,CAAC,UAAU,CAAC,EAAG,EAAE;QACvD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE;UACN;YACE,QAAQ,EAAE;cACR;gBACE,KAAK,EAAE,iBAAiB;gBACxB,GAAG,EAAE,GAAG;eACT;aACF;WACF;UACD;YACE,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE;cACR;gBACE,KAAK,EAAE,oBAAoB;gBAC3B,GAAG,EAAE,GAAG;eACT;aACF;WACF;SACF;OACe,CAAC,CAAC;MAEpB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;MAC/D,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;MAC7C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;EAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;MAC/C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,OAAO;QACpB,QAAQ,EAAE,IAAI;OACf,CAAC,CAAC;MACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;MAClD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,OAAO;QACpB,QAAQ,EAAE,IAAI;QACd,qBAAqB,EAAE;UACrB,MAAM,EAAE;YACN,OAAO,EAAE;cACP;gBACE,KAAK,EAAE,aAAa;gBACpB,MAAM,EAAE;kBACN;oBACE,KAAK,EAAE,YAAY;oBACnB,QAAQ,EAAE;sBACR;wBACE,KAAK,EAAE,aAAa;wBACpB,GAAG,EAAE,GAAG;uBACT;qBACF;mBACF;iBACF;eACF;aACF;WACF;SACwB;OAC5B,CAAC,CAAC;MAEH,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;MAEtD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;MAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;MACvC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,OAAO;QACpB,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE;UACjB,MAAM,EAAE;YACN;cACE,KAAK,EAAE,aAAa;cACpB,QAAQ,EAAE;gBACR;kBACE,KAAK,EAAE,YAAY;kBACnB,GAAG,EAAE,GAAG;iBACT;eACF;aACF;WACF;SACe;OACnB,CAAC,CAAC;MACH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;MAC3E,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;MAC7C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { ICustomConfig, ILocalizedCustomConfig, IPortalConfig } from '../models/general.model';\nimport { NavMainEntity } from '../models/header.model';\nimport * as testConfigRaw from '../assets/config/test-configuration.json';\nimport {\n fetchConfig,\n generateConfigUrl,\n getLocalizedConfig,\n getLocalizedCustomConfig,\n isMobile,\n isValidProjectId,\n mergeOsFlyoutOverrides,\n setMainNavigationIds,\n} from './config.service';\n\nconst testConfig: IPortalConfig = testConfigRaw as IPortalConfig;\n\nconst customConfig = {\n de: {\n header: {\n navMain: [\n {\n title: 'Meine Links (custom config)',\n text: 'Meine Links',\n flyout: [\n {\n title: 'Google',\n linkList: [\n { url: window.location.href, title: 'Google Maps', target: '_blank' },\n { url: 'http://localhost:3333', title: 'Google Translate' },\n { url: 'http://localhost:3333/aaa/bbb/ccc', title: 'Google Translate' },\n ],\n },\n ],\n },\n ],\n },\n footer: {\n block: {\n title: 'Eigene Footer-Konfiguration',\n links: [\n { url: 'https://fireship.io', text: 'Fireship.io', target: '_blank' },\n { url: 'https://css-tricks.com', text: 'CSS-Tricks', target: '_blank' },\n { url: 'https://web.dev', text: 'web.dev', target: '_blank' },\n { url: 'https://developer.mozilla.org', text: 'MDN Web Docs', target: '_blank' },\n { url: 'https://getbootstrap.com', text: 'Bootstrap', target: '_blank' },\n { url: 'https://google.com', text: 'Google', target: '_blank' },\n { url: 'https://microsoft.com', text: 'Microsoft', target: '_blank' },\n ],\n },\n },\n },\n en: {\n footer: {\n block: {\n title: 'Custom footer config',\n links: [\n { url: 'https://fireship.io', text: 'Fireship.io', target: '_blank' },\n { url: 'https://css-tricks.com', text: 'CSS-Tricks', target: '_blank' },\n ],\n },\n },\n },\n};\nconst stringCustomConfig = JSON.stringify(customConfig);\n\ndescribe('config.service.ts', () => {\n global.fetch = jest.fn(() => {\n return Promise.resolve({\n json: () => Promise.resolve(testConfig),\n }) as Promise<Response>;\n });\n\n describe('isMobile', () => {\n it('checks the window width', () => {\n global.innerWidth = 500;\n expect(isMobile()).toBe(true);\n global.innerWidth = 1500;\n expect(isMobile()).toBe(false);\n });\n });\n\n describe('isValidProjectId', () => {\n it('Check if project id is valid', () => {\n expect(isValidProjectId('test')).toBe(true);\n expect(isValidProjectId('test123')).toBe(true);\n expect(isValidProjectId('test-1')).toBe(true);\n expect(isValidProjectId('test_1')).toBe(true);\n\n expect(isValidProjectId('1test')).toBe(false);\n\n expect(isValidProjectId(' test')).toBe(false);\n expect(isValidProjectId('-test')).toBe(false);\n expect(isValidProjectId('test-')).toBe(false);\n expect(isValidProjectId('tes!t')).toBe(false);\n expect(isValidProjectId('test.bla')).toBe(false);\n expect(isValidProjectId('test,xy')).toBe(false);\n expect(isValidProjectId('')).toBe(false);\n });\n });\n\n describe('setMainNavigationIds', () => {\n it('should replace all main nav ids with browser compatible ids and keep flyout_os', () => {\n const base = [\n { id: 123 },\n { id: 'flyout_os' },\n { id: '-11' },\n { id: '%' },\n ] as NavMainEntity[];\n setMainNavigationIds(base);\n expect(base).toEqual(\n expect.arrayContaining([\n expect.objectContaining({\n id: expect.stringMatching(/^main-nav-.+|^flyout_os$/gi),\n }),\n ]),\n );\n });\n });\n\n describe('getLocalizedCustomConfig', () => {\n it('should parse the correct config', () => {\n expect(typeof getLocalizedCustomConfig(stringCustomConfig, 'de')).toBe('object');\n });\n\n it('should return object if config lang is found', () => {\n expect(typeof getLocalizedCustomConfig(customConfig as ICustomConfig, 'de')).toBe('object');\n });\n\n it('should return null if lang is not found in config', () => {\n expect(getLocalizedCustomConfig(stringCustomConfig, 'kz')).toBe(undefined);\n });\n });\n\n describe('generateConfigUrl', () => {\n it('should return a test URL', () => {\n expect(generateConfigUrl('test', 'int01')).toEqual('assets/config/test-configuration.json');\n });\n\n it('should return an int URL', () => {\n expect(generateConfigUrl('topos', 'int01')).toEqual(\n 'https://int.post.ch/api/headerjs/Json?serviceid=topos&environment=int01',\n );\n });\n\n it('should return prod by default', () => {\n expect(generateConfigUrl('topos', 'prod')).toEqual(\n 'https://www.post.ch/api/headerjs/Json?serviceid=topos',\n );\n });\n\n it('should reduce XSS risk', () => {\n expect(generateConfigUrl('<script>alert()</script>', 'prod')).toEqual(\n 'https://www.post.ch/api/headerjs/Json?serviceid=%3Cscript%3Ealert()%3C%2Fscript%3E',\n );\n });\n\n it('should work with upper case env', () => {\n /* @ts-expect-error */\n expect(generateConfigUrl('whatever', 'INT01')).toEqual(\n 'https://int.post.ch/api/headerjs/Json?serviceid=whatever&environment=int01',\n );\n });\n });\n\n describe('fetchConfig', () => {\n it('should fetch config', async () => {\n const res = await fetchConfig('test', 'int01');\n expect(res).toEqual(testConfig);\n expect(fetch).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('mergeOsFlyoutOverrides', () => {\n it('should merge configs correctly', () => {\n const newConfig = mergeOsFlyoutOverrides(testConfig.de!, {\n title: 'Test',\n } as NavMainEntity);\n\n const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');\n if (!osFlyout) fail('osFlyout is undefined');\n expect(osFlyout.title).toBe('Test');\n });\n\n it('should not overwrite function parameter', () => {\n const newConfig = mergeOsFlyoutOverrides(testConfig.de!, {\n title: 'Test',\n flyout: [\n {\n linkList: [\n {\n title: 'Additional link',\n url: '/',\n },\n ],\n },\n ],\n } as NavMainEntity);\n\n const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');\n if (!osFlyout) fail('osFlyout is undefined');\n expect(osFlyout.flyout[0].linkList.length).toBe(2);\n\n const newConfig2 = mergeOsFlyoutOverrides(testConfig.de!, {\n title: 'Test',\n flyout: [\n {\n linkList: [\n {\n title: 'Additional link',\n url: '/',\n },\n ],\n },\n ],\n } as NavMainEntity);\n const osFlyout2 = newConfig2.find(nav => nav.id === 'flyout_os');\n if (!osFlyout2) fail('osFlyout is undefined');\n expect(osFlyout2.flyout[0].linkList.length).toBe(2);\n });\n\n it('should extend os flyout with additional columns', () => {\n const newConfig = mergeOsFlyoutOverrides(testConfig.de!, {\n title: 'Test',\n flyout: [\n {\n linkList: [\n {\n title: 'Additional link',\n url: '/',\n },\n ],\n },\n {\n title: 'New column',\n linkList: [\n {\n title: 'Link in new column',\n url: '/',\n },\n ],\n },\n ],\n } as NavMainEntity);\n\n const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');\n if (!osFlyout) fail('osFlyout is undefined');\n expect(osFlyout.flyout.length).toBe(2);\n });\n });\n\n describe('getLocalizedConfig', () => {\n it('should get correct local config', async () => {\n const config = await getLocalizedConfig({\n projectId: 'test',\n environment: 'int01',\n language: 'de',\n });\n expect(config).toEqual(testConfig.de);\n });\n\n it('should modify the config correctly', async () => {\n const config = await getLocalizedConfig({\n projectId: 'test',\n environment: 'int01',\n language: 'de',\n localizedCustomConfig: {\n header: {\n navMain: [\n {\n title: 'New Navmain',\n flyout: [\n {\n title: 'New Navcol',\n linkList: [\n {\n title: 'New Navlink',\n url: '/',\n },\n ],\n },\n ],\n },\n ],\n },\n } as ILocalizedCustomConfig,\n });\n\n const [lastMainNav] = config.header.navMain.slice(-1);\n\n expect(lastMainNav.title).toBe('New Navmain');\n expect(lastMainNav.flyout.length).toBe(1);\n });\n\n it('should extend flyout_os', async () => {\n const config = await getLocalizedConfig({\n projectId: 'test',\n environment: 'int01',\n language: 'de',\n osFlyoutOverrides: {\n flyout: [\n {\n title: 'OS Extender',\n linkList: [\n {\n title: 'Added link',\n url: '/',\n },\n ],\n },\n ],\n } as NavMainEntity,\n });\n const osFlyout = config.header.navMain.find(nav => nav.id === 'flyout_os');\n if (!osFlyout) fail('osFlyout is undefined');\n expect(osFlyout.flyout[0].linkList.length).toBe(2);\n });\n });\n});\n"]}
@@ -125,8 +125,10 @@ export const compareRoutes = (baseUrl, compareUrl, matchMode) => {
125
125
  if (!baseUrl || !compareUrl || baseUrl.origin !== compareUrl.origin) {
126
126
  return 0;
127
127
  }
128
+ const baseUrlPath = baseUrl.pathname.toLocaleLowerCase();
129
+ const compareUrlPath = compareUrl.pathname.toLocaleLowerCase();
128
130
  // Exact match, origin and pathname are the same
129
- if (baseUrl.pathname === compareUrl.pathname) {
131
+ if (baseUrlPath === compareUrlPath) {
130
132
  return Infinity;
131
133
  }
132
134
  // The basepath is longer than the comparison, a match is impossible
@@ -134,8 +136,14 @@ export const compareRoutes = (baseUrl, compareUrl, matchMode) => {
134
136
  return 0;
135
137
  }
136
138
  if (matchMode === 'auto') {
137
- const baseSegments = [baseUrl.origin, ...baseUrl.pathname.split('/').filter(x => !!x)];
138
- const compareSegments = [compareUrl.origin, ...compareUrl.pathname.split('/').filter(x => !!x)];
139
+ const baseSegments = [
140
+ baseUrl.origin.toLocaleLowerCase(),
141
+ ...baseUrlPath.split('/').filter(x => !!x),
142
+ ];
143
+ const compareSegments = [
144
+ compareUrl.origin.toLocaleLowerCase(),
145
+ ...compareUrlPath.split('/').filter(x => !!x),
146
+ ];
139
147
  const score = getSimilarityScore(baseSegments, compareSegments);
140
148
  // If only some segments match, but not the whole smaller array, it's not a match
141
149
  return Math.min(baseSegments.length, compareSegments.length) === score ? score : 0;
@@ -1 +1 @@
1
- {"version":3,"file":"route.service.js","sourceRoot":"","sources":["../../../src/services/route.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ActiveRouteProp } from '../models/general.model';\nimport { NavMainEntity, MainNavScoreList } from '../models/header.model';\n\n/**\n * Activate the current route based on the config and the match mode\n * @param config Main Navigation Config\n * @param activeRouteProp Match mode\n * @returns Modified Main Navigation Config\n */\nexport const markActiveRoute = (\n config: NavMainEntity[],\n activeRouteProp: ActiveRouteProp,\n): NavMainEntity[] => {\n // Don't highlight any route\n if (activeRouteProp === false) {\n return config;\n }\n\n // Set compare URL and check if activeRouteProp is valid\n let compareUrl: URL;\n config = resetOverrideConfig(config);\n\n if (activeRouteProp === 'auto' || activeRouteProp === 'exact') {\n // Check if an active route is already configured, set override to that and return\n if (hasActivePortalRoute(config)) {\n return resetActiveStateToPortalConfig(config);\n }\n\n compareUrl = new URL(window.location.href);\n } else {\n try {\n compareUrl = new URL(activeRouteProp, document.location.origin);\n } catch (error) {\n console.warn(\n `Active Route: ${activeRouteProp} is not a valid URL. Navigation highlighting has been disabled.`,\n );\n return config;\n }\n }\n\n const scoreList = compileScoreList(config, compareUrl, activeRouteProp);\n\n if (scoreList.length === 0) {\n // No match found or already active links defined\n return config;\n }\n\n const winnerPair = scoreList[0];\n winnerPair.main.isActiveOverride = true;\n if (winnerPair.sub) winnerPair.sub.isActiveOverride = true;\n\n return config;\n};\n\n/**\n * Check if the portal config set any active route\n * @param config Main navigation config\n * @returns True if portal set any route as active\n */\nexport const hasActivePortalRoute = (config: NavMainEntity[]): boolean => {\n return config.filter(nav => nav.isActive).length > 0;\n};\n\nexport const resetActiveStateToPortalConfig = (config: NavMainEntity[]): NavMainEntity[] => {\n return config.map(nav => ({\n ...nav,\n isActiveOverride: nav.isActive,\n flyout: nav.flyout.map(flyout => ({\n ...flyout,\n linkList: flyout.linkList.map(link => ({ ...link, isActiveOverride: link.isActive })),\n })),\n }));\n};\n\nconst resetOverrideConfig = (config: NavMainEntity[]): NavMainEntity[] => {\n return config.map(nav => ({\n ...nav,\n isActiveOverride: false,\n flyout: nav.flyout.map(flyout => ({\n ...flyout,\n linkList: flyout.linkList.map(link => ({ ...link, isActiveOverride: false })),\n })),\n }));\n};\n\n/**\n * Compile a list of scores based on the map mode, sorted in descending order\n * @param config Main Nav Config\n * @param compareUrl Current Browser URL or a custom URL\n * @param activeRouteProp Match mode\n * @returns A list of scored URLs if any matched\n */\nexport const compileScoreList = (\n config: NavMainEntity[],\n compareUrl: URL,\n activeRouteProp: ActiveRouteProp,\n): MainNavScoreList => {\n // Flag to check if the Portal set any active links or if there are any exact matches\n let hadAnyActiveLink = false;\n const scoreList: MainNavScoreList = [];\n\n config.forEach(mainNav => {\n if (hadAnyActiveLink || !mainNav) {\n return;\n }\n\n try {\n const score = compareRoutes(\n compareUrl,\n new URL(mainNav.url),\n activeRouteProp as 'auto' | 'exact',\n );\n if (score > 0) {\n if (score === Infinity) hadAnyActiveLink = true;\n scoreList.push({ main: mainNav, score });\n }\n } catch {\n // Not a valid url, continue\n }\n\n // Loop through flyout links 2nd level\n if (mainNav.flyout.length) {\n mainNav.flyout.forEach(flyout => {\n if (flyout.linkList) {\n flyout.linkList.forEach(linklist => {\n // Don't override if any link is already active\n if (linklist.isActive && (activeRouteProp === 'auto' || activeRouteProp === 'exact')) {\n hadAnyActiveLink = true;\n return;\n }\n\n try {\n const url = new URL(linklist.url);\n const score = compareRoutes(compareUrl, url, activeRouteProp as 'auto' | 'exact');\n if (score > 0) {\n if (score === Infinity) hadAnyActiveLink = true;\n\n // Push score\n scoreList.push({\n main: mainNav,\n sub: linklist,\n score,\n });\n }\n } catch {\n // Not a valid URL, continue\n }\n });\n }\n });\n }\n });\n\n return scoreList.sort((a, b) => b.score - a.score);\n};\n\n/**\n * Compare two URLs for similarity based on a match mode\n * @param baseUrl Browser URL\n * @param compareUrl Navigatgion URL\n * @param matchMode exact or auto matching\n * @returns Score\n */\nexport const compareRoutes = (\n baseUrl: URL,\n compareUrl: URL,\n matchMode?: 'auto' | 'exact',\n): number => {\n // One url is not defined or they don't share the same orign\n if (!baseUrl || !compareUrl || baseUrl.origin !== compareUrl.origin) {\n return 0;\n }\n\n // Exact match, origin and pathname are the same\n if (baseUrl.pathname === compareUrl.pathname) {\n return Infinity;\n }\n\n // The basepath is longer than the comparison, a match is impossible\n if (baseUrl.pathname.length < compareUrl.pathname.length) {\n return 0;\n }\n\n if (matchMode === 'auto') {\n const baseSegments = [baseUrl.origin, ...baseUrl.pathname.split('/').filter(x => !!x)];\n const compareSegments = [compareUrl.origin, ...compareUrl.pathname.split('/').filter(x => !!x)];\n\n const score = getSimilarityScore(baseSegments, compareSegments);\n\n // If only some segments match, but not the whole smaller array, it's not a match\n return Math.min(baseSegments.length, compareSegments.length) === score ? score : 0;\n }\n\n return 0;\n};\n\n/**\n * Check how many items in an array match\n * @param a Base array\n * @param b Compare array\n * @returns Score\n */\nexport const getSimilarityScore = (a: string[], b: string[]): number => {\n if (!a?.length || !b?.length) {\n return 0;\n }\n\n let i = 0;\n for (; i < Math.min(a.length, b.length); i++) {\n if (a[i] !== b[i]) {\n return 0;\n }\n }\n\n return i;\n};\n"]}
1
+ {"version":3,"file":"route.service.js","sourceRoot":"","sources":["../../../src/services/route.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ActiveRouteProp } from '../models/general.model';\nimport { NavMainEntity, MainNavScoreList } from '../models/header.model';\n\n/**\n * Activate the current route based on the config and the match mode\n * @param config Main Navigation Config\n * @param activeRouteProp Match mode\n * @returns Modified Main Navigation Config\n */\nexport const markActiveRoute = (\n config: NavMainEntity[],\n activeRouteProp: ActiveRouteProp,\n): NavMainEntity[] => {\n // Don't highlight any route\n if (activeRouteProp === false) {\n return config;\n }\n\n // Set compare URL and check if activeRouteProp is valid\n let compareUrl: URL;\n config = resetOverrideConfig(config);\n\n if (activeRouteProp === 'auto' || activeRouteProp === 'exact') {\n // Check if an active route is already configured, set override to that and return\n if (hasActivePortalRoute(config)) {\n return resetActiveStateToPortalConfig(config);\n }\n\n compareUrl = new URL(window.location.href);\n } else {\n try {\n compareUrl = new URL(activeRouteProp, document.location.origin);\n } catch (error) {\n console.warn(\n `Active Route: ${activeRouteProp} is not a valid URL. Navigation highlighting has been disabled.`,\n );\n return config;\n }\n }\n\n const scoreList = compileScoreList(config, compareUrl, activeRouteProp);\n\n if (scoreList.length === 0) {\n // No match found or already active links defined\n return config;\n }\n\n const winnerPair = scoreList[0];\n winnerPair.main.isActiveOverride = true;\n if (winnerPair.sub) winnerPair.sub.isActiveOverride = true;\n\n return config;\n};\n\n/**\n * Check if the portal config set any active route\n * @param config Main navigation config\n * @returns True if portal set any route as active\n */\nexport const hasActivePortalRoute = (config: NavMainEntity[]): boolean => {\n return config.filter(nav => nav.isActive).length > 0;\n};\n\nexport const resetActiveStateToPortalConfig = (config: NavMainEntity[]): NavMainEntity[] => {\n return config.map(nav => ({\n ...nav,\n isActiveOverride: nav.isActive,\n flyout: nav.flyout.map(flyout => ({\n ...flyout,\n linkList: flyout.linkList.map(link => ({ ...link, isActiveOverride: link.isActive })),\n })),\n }));\n};\n\nconst resetOverrideConfig = (config: NavMainEntity[]): NavMainEntity[] => {\n return config.map(nav => ({\n ...nav,\n isActiveOverride: false,\n flyout: nav.flyout.map(flyout => ({\n ...flyout,\n linkList: flyout.linkList.map(link => ({ ...link, isActiveOverride: false })),\n })),\n }));\n};\n\n/**\n * Compile a list of scores based on the map mode, sorted in descending order\n * @param config Main Nav Config\n * @param compareUrl Current Browser URL or a custom URL\n * @param activeRouteProp Match mode\n * @returns A list of scored URLs if any matched\n */\nexport const compileScoreList = (\n config: NavMainEntity[],\n compareUrl: URL,\n activeRouteProp: ActiveRouteProp,\n): MainNavScoreList => {\n // Flag to check if the Portal set any active links or if there are any exact matches\n let hadAnyActiveLink = false;\n const scoreList: MainNavScoreList = [];\n\n config.forEach(mainNav => {\n if (hadAnyActiveLink || !mainNav) {\n return;\n }\n\n try {\n const score = compareRoutes(\n compareUrl,\n new URL(mainNav.url),\n activeRouteProp as 'auto' | 'exact',\n );\n if (score > 0) {\n if (score === Infinity) hadAnyActiveLink = true;\n scoreList.push({ main: mainNav, score });\n }\n } catch {\n // Not a valid url, continue\n }\n\n // Loop through flyout links 2nd level\n if (mainNav.flyout.length) {\n mainNav.flyout.forEach(flyout => {\n if (flyout.linkList) {\n flyout.linkList.forEach(linklist => {\n // Don't override if any link is already active\n if (linklist.isActive && (activeRouteProp === 'auto' || activeRouteProp === 'exact')) {\n hadAnyActiveLink = true;\n return;\n }\n\n try {\n const url = new URL(linklist.url);\n const score = compareRoutes(compareUrl, url, activeRouteProp as 'auto' | 'exact');\n if (score > 0) {\n if (score === Infinity) hadAnyActiveLink = true;\n\n // Push score\n scoreList.push({\n main: mainNav,\n sub: linklist,\n score,\n });\n }\n } catch {\n // Not a valid URL, continue\n }\n });\n }\n });\n }\n });\n\n return scoreList.sort((a, b) => b.score - a.score);\n};\n\n/**\n * Compare two URLs for similarity based on a match mode\n * @param baseUrl Browser URL\n * @param compareUrl Navigatgion URL\n * @param matchMode exact or auto matching\n * @returns Score\n */\nexport const compareRoutes = (\n baseUrl: URL,\n compareUrl: URL,\n matchMode?: 'auto' | 'exact',\n): number => {\n // One url is not defined or they don't share the same orign\n if (!baseUrl || !compareUrl || baseUrl.origin !== compareUrl.origin) {\n return 0;\n }\n\n const baseUrlPath = baseUrl.pathname.toLocaleLowerCase();\n const compareUrlPath = compareUrl.pathname.toLocaleLowerCase();\n\n // Exact match, origin and pathname are the same\n if (baseUrlPath === compareUrlPath) {\n return Infinity;\n }\n\n // The basepath is longer than the comparison, a match is impossible\n if (baseUrl.pathname.length < compareUrl.pathname.length) {\n return 0;\n }\n\n if (matchMode === 'auto') {\n const baseSegments = [\n baseUrl.origin.toLocaleLowerCase(),\n ...baseUrlPath.split('/').filter(x => !!x),\n ];\n const compareSegments = [\n compareUrl.origin.toLocaleLowerCase(),\n ...compareUrlPath.split('/').filter(x => !!x),\n ];\n\n const score = getSimilarityScore(baseSegments, compareSegments);\n\n // If only some segments match, but not the whole smaller array, it's not a match\n return Math.min(baseSegments.length, compareSegments.length) === score ? score : 0;\n }\n\n return 0;\n};\n\n/**\n * Check how many items in an array match\n * @param a Base array\n * @param b Compare array\n * @returns Score\n */\nexport const getSimilarityScore = (a: string[], b: string[]): number => {\n if (!a?.length || !b?.length) {\n return 0;\n }\n\n let i = 0;\n for (; i < Math.min(a.length, b.length); i++) {\n if (a[i] !== b[i]) {\n return 0;\n }\n }\n\n return i;\n};\n"]}