@sapudex/web-components 2.3.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/.eslintignore +3 -0
  2. package/bundle.esm.js +2 -0
  3. package/cypress/fixtures/contact-numbers.ts +10 -0
  4. package/cypress/specs/Accordion.cy.tsx +24 -0
  5. package/cypress/specs/Contact.cy.tsx +92 -0
  6. package/cypress/specs/ContactItem.cy.tsx +56 -0
  7. package/cypress/support/commands.ts +31 -2
  8. package/cypress/support/component-imports.instrumented.ts +4 -0
  9. package/cypress/support/component-imports.src.ts +4 -0
  10. package/dist/Accordion.d.ts +7 -1
  11. package/dist/Accordion.js +3 -3
  12. package/dist/Accordion.js.map +1 -1
  13. package/dist/Assets.js +31 -0
  14. package/dist/Assets.js.map +1 -1
  15. package/dist/AssetsVariables.js +6 -1
  16. package/dist/AssetsVariables.js.map +1 -1
  17. package/dist/Contact.d.ts +102 -0
  18. package/dist/Contact.js +152 -0
  19. package/dist/Contact.js.map +1 -0
  20. package/dist/ContactItem.d.ts +67 -0
  21. package/dist/ContactItem.js +96 -0
  22. package/dist/ContactItem.js.map +1 -0
  23. package/dist/ContactItemTemplate.d.ts +2 -0
  24. package/dist/ContactItemTemplate.js +13 -0
  25. package/dist/ContactItemTemplate.js.map +1 -0
  26. package/dist/ContactTemplate.d.ts +4 -0
  27. package/dist/ContactTemplate.js +29 -0
  28. package/dist/ContactTemplate.js.map +1 -0
  29. package/dist/CountrySelector.d.ts +0 -2
  30. package/dist/CountrySelector.js +0 -4
  31. package/dist/CountrySelector.js.map +1 -1
  32. package/dist/Footer.d.ts +0 -1
  33. package/dist/Footer.js +7 -9
  34. package/dist/Footer.js.map +1 -1
  35. package/dist/List.d.ts +1 -1
  36. package/dist/List.js +1 -1
  37. package/dist/List.js.map +1 -1
  38. package/dist/MastheadCountrySelector.d.ts +6 -0
  39. package/dist/MastheadCountrySelector.js +8 -2
  40. package/dist/MastheadCountrySelector.js.map +1 -1
  41. package/dist/MastheadItem.d.ts +13 -10
  42. package/dist/MastheadItem.js +24 -27
  43. package/dist/MastheadItem.js.map +1 -1
  44. package/dist/MastheadMenu.d.ts +3 -1
  45. package/dist/MastheadMenu.js +5 -4
  46. package/dist/MastheadMenu.js.map +1 -1
  47. package/dist/MastheadMenuItem.d.ts +1 -1
  48. package/dist/MastheadMenuItem.js +1 -1
  49. package/dist/MastheadMenuItem.js.map +1 -1
  50. package/dist/MastheadMobileMenu.d.ts +6 -0
  51. package/dist/MastheadMobileMenu.js +13 -2
  52. package/dist/MastheadMobileMenu.js.map +1 -1
  53. package/dist/MastheadProfileMenu.d.ts +4 -5
  54. package/dist/MastheadProfileMenu.js +9 -4
  55. package/dist/MastheadProfileMenu.js.map +1 -1
  56. package/dist/MastheadShell.d.ts +12 -4
  57. package/dist/MastheadShell.js +19 -10
  58. package/dist/MastheadShell.js.map +1 -1
  59. package/dist/MessageStripTemplate.js +1 -1
  60. package/dist/MessageStripTemplate.js.map +1 -1
  61. package/dist/SearchableListBase.js +5 -1
  62. package/dist/SearchableListBase.js.map +1 -1
  63. package/dist/SecondaryNavigation.d.ts +0 -1
  64. package/dist/SecondaryNavigation.js +2 -4
  65. package/dist/SecondaryNavigation.js.map +1 -1
  66. package/dist/assets/{InputSuggestions-BgbbJ4tc.js → InputSuggestions-B7dpC1q9.js} +1 -1
  67. package/dist/assets/{ListItemStandardExpandableTextTemplate-onAnn1Tj.js → ListItemStandardExpandableTextTemplate-BF6mHEec.js} +1 -1
  68. package/dist/assets/{bundle.esm-CwUfibNQ.js → bundle.esm-BFePNrxi.js} +241 -231
  69. package/dist/assets/messagebundle_en-DXEe5nWA.js +1 -0
  70. package/dist/css/themes/Accordion.css +1 -1
  71. package/dist/css/themes/Button.css +1 -1
  72. package/dist/css/themes/Contact.css +1 -0
  73. package/dist/css/themes/ContactItem.css +1 -0
  74. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  75. package/dist/css/themes/Modal.css +1 -1
  76. package/dist/css/themes/RatingIndicator.css +1 -1
  77. package/dist/css/themes/Search.css +1 -1
  78. package/dist/css/themes/Slider.css +1 -1
  79. package/dist/css/themes/TabInOverflow.css +1 -1
  80. package/dist/custom-elements-internal.json +416 -21
  81. package/dist/custom-elements.json +393 -21
  82. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  83. package/dist/generated/i18n/i18n-defaults.d.ts +4 -1
  84. package/dist/generated/i18n/i18n-defaults.js +4 -1
  85. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  86. package/dist/generated/templates/AccordionTemplate.lit.js +4 -2
  87. package/dist/generated/templates/AccordionTemplate.lit.js.map +1 -1
  88. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js +3 -3
  89. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js.map +1 -1
  90. package/dist/generated/templates/MastheadItemTemplate.lit.js +25 -22
  91. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  92. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +1 -1
  93. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
  94. package/dist/generated/templates/MastheadMenuTemplate.lit.js +2 -2
  95. package/dist/generated/templates/MastheadMenuTemplate.lit.js.map +1 -1
  96. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +14 -14
  97. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  98. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +1 -1
  99. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
  100. package/dist/generated/templates/MastheadShellTemplate.lit.js +2 -2
  101. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  102. package/dist/generated/themes/Accordion.css.d.ts +1 -1
  103. package/dist/generated/themes/Accordion.css.js +1 -1
  104. package/dist/generated/themes/Accordion.css.js.map +1 -1
  105. package/dist/generated/themes/Button.css.d.ts +1 -1
  106. package/dist/generated/themes/Button.css.js +1 -1
  107. package/dist/generated/themes/Button.css.js.map +1 -1
  108. package/dist/generated/themes/Contact.css.d.ts +2 -0
  109. package/dist/generated/themes/Contact.css.js +8 -0
  110. package/dist/generated/themes/Contact.css.js.map +1 -0
  111. package/dist/generated/themes/ContactItem.css.d.ts +2 -0
  112. package/dist/generated/themes/ContactItem.css.js +8 -0
  113. package/dist/generated/themes/ContactItem.css.js.map +1 -0
  114. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  115. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  116. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  117. package/dist/generated/themes/Modal.css.d.ts +1 -1
  118. package/dist/generated/themes/Modal.css.js +1 -1
  119. package/dist/generated/themes/Modal.css.js.map +1 -1
  120. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  121. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  122. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  123. package/dist/generated/themes/Search.css.d.ts +1 -1
  124. package/dist/generated/themes/Search.css.js +1 -1
  125. package/dist/generated/themes/Search.css.js.map +1 -1
  126. package/dist/generated/themes/Slider.css.d.ts +1 -1
  127. package/dist/generated/themes/Slider.css.js +1 -1
  128. package/dist/generated/themes/Slider.css.js.map +1 -1
  129. package/dist/generated/themes/TabInOverflow.css.d.ts +1 -1
  130. package/dist/generated/themes/TabInOverflow.css.js +1 -1
  131. package/dist/generated/themes/TabInOverflow.css.js.map +1 -1
  132. package/dist/messagebundle.properties +8 -0
  133. package/dist/messagebundle_en.properties +4 -0
  134. package/dist/types/AnalyticsName.d.ts +5 -0
  135. package/dist/types/AnalyticsName.js +7 -0
  136. package/dist/types/AnalyticsName.js.map +1 -0
  137. package/dist/types/ContactItemIcon.d.ts +6 -0
  138. package/dist/types/ContactItemIcon.js +8 -0
  139. package/dist/types/ContactItemIcon.js.map +1 -0
  140. package/dist/types/EventRibbon.d.ts +38 -13
  141. package/dist/types/EventRibbon.js +39 -12
  142. package/dist/types/EventRibbon.js.map +1 -1
  143. package/dist/utils/parseArrayFromString.d.ts +2 -0
  144. package/dist/utils/parseArrayFromString.js +5 -0
  145. package/dist/utils/parseArrayFromString.js.map +1 -0
  146. package/dist/vscode.html-custom-data.json +90 -26
  147. package/dist/web-types.json +184 -16
  148. package/package.json +2 -2
  149. package/src/Accordion.hbs +13 -9
  150. package/src/Accordion.ts +7 -4
  151. package/src/Assets.ts +29 -0
  152. package/src/AssetsVariables.ts +6 -1
  153. package/src/Contact.ts +200 -0
  154. package/src/ContactItem.ts +119 -0
  155. package/src/ContactItemTemplate.tsx +22 -0
  156. package/src/ContactTemplate.tsx +105 -0
  157. package/src/CountrySelector.ts +0 -5
  158. package/src/Footer.ts +7 -10
  159. package/src/List.ts +1 -1
  160. package/src/MastheadCountrySelector.hbs +3 -0
  161. package/src/MastheadCountrySelector.ts +13 -3
  162. package/src/MastheadItem.hbs +8 -0
  163. package/src/MastheadItem.ts +36 -35
  164. package/src/MastheadMenu.hbs +6 -1
  165. package/src/MastheadMenu.ts +7 -5
  166. package/src/MastheadMenuItem.hbs +1 -1
  167. package/src/MastheadMenuItem.ts +2 -2
  168. package/src/MastheadMobileMenu.hbs +24 -9
  169. package/src/MastheadMobileMenu.ts +19 -3
  170. package/src/MastheadProfileMenu.hbs +2 -0
  171. package/src/MastheadProfileMenu.ts +13 -10
  172. package/src/MastheadShell.hbs +2 -0
  173. package/src/MastheadShell.ts +31 -14
  174. package/src/MessageStripTemplate.tsx +1 -0
  175. package/src/SearchableListBase.ts +6 -1
  176. package/src/SecondaryNavigation.ts +3 -5
  177. package/src/generated/i18n/i18n-defaults.ts +2 -2
  178. package/src/generated/templates/AccordionTemplate.lit.ts +4 -2
  179. package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +3 -3
  180. package/src/generated/templates/MastheadItemTemplate.lit.ts +25 -22
  181. package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +1 -1
  182. package/src/generated/templates/MastheadMenuTemplate.lit.ts +2 -2
  183. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +14 -14
  184. package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +1 -1
  185. package/src/generated/templates/MastheadShellTemplate.lit.ts +2 -2
  186. package/src/generated/themes/Accordion.css.ts +1 -1
  187. package/src/generated/themes/Button.css.ts +1 -1
  188. package/src/generated/themes/Contact.css.ts +9 -0
  189. package/src/generated/themes/ContactItem.css.ts +9 -0
  190. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  191. package/src/generated/themes/Modal.css.ts +1 -1
  192. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  193. package/src/generated/themes/Search.css.ts +1 -1
  194. package/src/generated/themes/Slider.css.ts +1 -1
  195. package/src/generated/themes/TabInOverflow.css.ts +1 -1
  196. package/src/i18n/messagebundle.properties +8 -0
  197. package/src/i18n/messagebundle_en.properties +4 -0
  198. package/src/themes/Accordion.css +1 -0
  199. package/src/themes/Button.css +8 -1
  200. package/src/themes/Contact.css +184 -0
  201. package/src/themes/ContactItem.css +44 -0
  202. package/src/themes/MastheadProfileMenu.css +2 -1
  203. package/src/themes/Modal.css +4 -4
  204. package/src/themes/Search.css +2 -1
  205. package/src/themes/TabInOverflow.css +1 -1
  206. package/src/types/AnalyticsName.ts +6 -0
  207. package/src/types/ContactItemIcon.ts +7 -0
  208. package/src/types/EventRibbon.ts +38 -13
  209. package/src/utils/parseArrayFromString.ts +5 -0
  210. package/dist/assets/messagebundle_en-CVKgy_9L.js +0 -1
@@ -11,7 +11,7 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
11
11
  import { isEscape } from "@ui5/webcomponents-base/dist/Keys.js";
12
12
  import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
13
13
  import {
14
- OPENS_IN_A_NEW_WINDOW, PROFILE, CART, COUNTRY_SELECTOR, SUPPORT,
14
+ OPENS_IN_A_NEW_WINDOW, PROFILE, CART, COUNTRY_SELECTOR, SUPPORT, SEARCH,
15
15
  } from "./generated/i18n/i18n-defaults.js";
16
16
  import UDExMastheadMenu from "./MastheadMenu.js";
17
17
  import type UDExAvatar from "./Avatar.js";
@@ -20,6 +20,8 @@ import type UDExMastheadShell from "./MastheadShell.js";
20
20
  import MastheadItemTemplate from "./generated/templates/MastheadItemTemplate.lit.js";
21
21
  import { UDExTarget } from "./types/common.js";
22
22
  import { BreakpointUtils } from "./utils/Breakpoints.js";
23
+ import parseArrayFromString from "./utils/parseArrayFromString.js";
24
+ import AnalyticsName from "./types/AnalyticsName.js";
23
25
 
24
26
  // Styles
25
27
  import MastheadItemCss from "./generated/themes/MastheadItem.css.js";
@@ -31,7 +33,6 @@ export enum UDExMastheadDropdownItemAction {
31
33
  }
32
34
 
33
35
  export interface IMastheadItem {
34
- text?: string;
35
36
  selected?: boolean;
36
37
  icon?: string;
37
38
  avatar?: Array<HTMLElement>;
@@ -58,11 +59,14 @@ export type MenuItem = {
58
59
  type UDExMastheadItemItemClickEventDetail = {
59
60
  originalEvent: PointerEvent,
60
61
  item: UDExMastheadItem,
62
+ analyticsName: AnalyticsName,
63
+ sourceNode: HTMLElement,
61
64
  }
62
65
 
63
66
  export type UDExMastheadDropdownEventDetail = {
64
67
  title: string,
65
68
  action: UDExMastheadDropdownItemAction,
69
+ analyticsName: AnalyticsName,
66
70
  }
67
71
 
68
72
  /**
@@ -142,15 +146,6 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
142
146
  @property({ type: String })
143
147
  menuTitle: string = "";
144
148
 
145
- /**
146
- * Defines the text of item.
147
- *
148
- * @public
149
- * @default ""
150
- */
151
- @property({ type: String })
152
- text: string = "";
153
-
154
149
  /**
155
150
  * Defines the selected item.
156
151
  *
@@ -264,6 +259,14 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
264
259
  @property({ type: Boolean })
265
260
  _isMobileMode!: boolean;
266
261
 
262
+ /**
263
+ * Defines the label for analytics
264
+ *
265
+ * @public
266
+ */
267
+ @property({ type: String })
268
+ label!: string;
269
+
267
270
  /**
268
271
  * Slot for the dropdown
269
272
  *
@@ -295,6 +298,10 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
295
298
  }
296
299
  }
297
300
 
301
+ onBeforeRendering(): void {
302
+ this.label = this.eventItemTitle;
303
+ }
304
+
298
305
  onAfterRendering(): void {
299
306
  this._profileAvatar = this.profileAvatar;
300
307
  this._mastheadShell = this.mastheadShell;
@@ -381,17 +388,19 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
381
388
  }
382
389
 
383
390
  fireDropdownCloseEvent(title: string, action: UDExMastheadDropdownItemAction): void {
384
- this.fireDecoratorEvent("dropdown-closed", { title, action });
391
+ this.fireDecoratorEvent("dropdown-closed", { title, action, analyticsName: AnalyticsName.Header });
385
392
  }
386
393
 
387
394
  fireDropdownOpenEvent(title: string, action: UDExMastheadDropdownItemAction): void {
388
- this.fireDecoratorEvent("dropdown-opened", { title, action });
395
+ this.fireDecoratorEvent("dropdown-opened", { title, action, analyticsName: AnalyticsName.Header });
389
396
  }
390
397
 
391
398
  fireItemClickEvent(e: PointerEvent): void {
392
399
  this.fireDecoratorEvent("item-click", {
393
400
  item: this,
394
401
  originalEvent: e,
402
+ analyticsName: AnalyticsName.Header,
403
+ sourceNode: e.currentTarget as HTMLElement,
395
404
  });
396
405
  }
397
406
 
@@ -442,19 +451,15 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
442
451
 
443
452
  closeDropdown(): void {
444
453
  this.selected = false;
445
- this.fireDropdownCloseEvent(this.eventItemTitle, UDExMastheadDropdownItemAction.Close);
454
+ this.fireDropdownCloseEvent(this.accessibleName || this.eventItemTitle, UDExMastheadDropdownItemAction.Close);
446
455
  }
447
456
 
448
457
  getDomElement(selector: string): HTMLElement | undefined | null {
449
458
  return this.shadowRoot?.querySelector(`${selector}`);
450
459
  }
451
460
 
452
- parseArrayFromString<T>(string: string): T[] {
453
- return string ? JSON.parse(string) as T[] : [];
454
- }
455
-
456
461
  getSubItems(): Array<MenuItem> {
457
- return this.parseArrayFromString(this.subItems);
462
+ return parseArrayFromString(this.subItems);
458
463
  }
459
464
 
460
465
  get mastheadShell(): UDExMastheadShell {
@@ -494,22 +499,18 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
494
499
  return this.selected ? " udex-masthead-item__button--active" : "";
495
500
  }
496
501
 
497
- get ariaDescribedBy(): string {
502
+ get ariaDescribedBy(): string | undefined {
498
503
  const labels = [];
499
504
 
500
- if (this.text) {
501
- labels.push(`${this.__id}-text`);
502
- }
503
-
504
- if (this.icon) {
505
- labels.push(`${this.__id}-icon`);
506
- }
507
-
508
505
  if (this.isTargetBlank) {
509
506
  labels.push(`new-win-desc`);
510
507
  }
511
508
 
512
- return labels.join(" ").trim();
509
+ if (this.imageAlt) {
510
+ labels.push(`image-desc`);
511
+ }
512
+
513
+ return labels.length ? labels.join(" ").trim() : undefined;
513
514
  }
514
515
 
515
516
  get isDropdownOpened(): boolean {
@@ -540,6 +541,10 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
540
541
  return this.getAttribute("slot") === "cart";
541
542
  }
542
543
 
544
+ get isSearchBtn(): boolean {
545
+ return this.icon === "search";
546
+ }
547
+
543
548
  get isSupportBtn(): boolean {
544
549
  return this.getAttribute("slot") === "support";
545
550
  }
@@ -561,22 +566,18 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
561
566
  }
562
567
 
563
568
  get eventItemTitle(): string {
564
- if (this.accessibleName) {
565
- return this.accessibleName.trim();
569
+ if (this.isSearchBtn) {
570
+ return UDExMastheadItem.i18nBundle.getText(SEARCH);
566
571
  }
567
-
568
572
  if (this.isCartBtn) {
569
573
  return UDExMastheadItem.i18nBundle.getText(CART);
570
574
  }
571
-
572
575
  if (this.isProfileBtn) {
573
576
  return UDExMastheadItem.i18nBundle.getText(PROFILE);
574
577
  }
575
-
576
578
  if (this.isCountrySelectorBtn) {
577
579
  return UDExMastheadItem.i18nBundle.getText(COUNTRY_SELECTOR);
578
580
  }
579
-
580
581
  if (this.isSupportBtn) {
581
582
  return UDExMastheadItem.i18nBundle.getText(SUPPORT);
582
583
  }
@@ -22,6 +22,8 @@
22
22
  {{#*inline "header"}}
23
23
  <div class="udex-masthead-menu__header">
24
24
  <udex-masthead-menu-item
25
+ part="menu-item"
26
+ exportparts="menu-item"
25
27
  id="category-{{categoryId}}"
26
28
  @click="{{../../handleMenuItemClick}}"
27
29
  url="{{this.url}}"
@@ -42,11 +44,14 @@
42
44
  <li>
43
45
  {{#if this.url}}
44
46
  <udex-masthead-menu-item
47
+ part="menu-item"
48
+ exportparts="menu-item"
45
49
  @click="{{../../../handleMenuItemClick}}"
46
50
  badge="{{this.badge}}"
47
51
  ?external-link="{{this.externalLink}}"
48
52
  url="{{this.url}}"
49
- label="{{this.title}}">
53
+ label="{{this.title}}"
54
+ exportparts="badge">
50
55
  </udex-masthead-menu-item>
51
56
  {{else}}
52
57
  <udex-divider class="udex-masthead-menu__item-divider"></udex-divider>
@@ -11,6 +11,8 @@ import UDExBadge from "./Badge.js";
11
11
  import UDExMastheadMenuItem, { UDExItemType } from "./MastheadMenuItem.js";
12
12
  import UDExDivider from "./Divider.js";
13
13
  import MastheadMenuTemplate from "./generated/templates/MastheadMenuTemplate.lit.js";
14
+ import parseArrayFromString from "./utils/parseArrayFromString.js";
15
+ import AnalyticsName from "./types/AnalyticsName.js";
14
16
 
15
17
  // Styles
16
18
  import MastheadMenuCss from "./generated/themes/MastheadMenu.css.js";
@@ -38,6 +40,8 @@ type UDExMastheadMenuMenuItemClickEventDetail = {
38
40
  category?: string,
39
41
  originalEvent: PointerEvent,
40
42
  item: UDExMastheadMenuItem,
43
+ analyticsName: AnalyticsName,
44
+ sourceNode: HTMLElement,
41
45
  }
42
46
 
43
47
  /**
@@ -130,6 +134,8 @@ class UDExMastheadMenu extends UI5Element {
130
134
  if (url?.length) {
131
135
  const list = item.closest(".udex-masthead-menu__list") as HTMLElement;
132
136
  this.fireDecoratorEvent("menu-item-click", {
137
+ sourceNode: item.shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
138
+ analyticsName: AnalyticsName.Header,
133
139
  item,
134
140
  originalEvent: e,
135
141
  ...(type !== UDExItemType.Heading && { category: list?.getAttribute("category") || "" }),
@@ -154,10 +160,6 @@ class UDExMastheadMenu extends UI5Element {
154
160
  return this.links.indexOf(item);
155
161
  }
156
162
 
157
- parseArrayFromString<T>(string: string): T[] {
158
- return string ? JSON.parse(string) as T[] : [];
159
- }
160
-
161
163
  get links(): Array<UDExMastheadMenuItem> {
162
164
  const menuItems: Array<UDExMastheadMenuItem> = Array.from(this.shadowRoot!.querySelectorAll("[udex-masthead-menu-item]"));
163
165
  return menuItems.filter(({ url }) => url && url.length > 0);
@@ -165,7 +167,7 @@ class UDExMastheadMenu extends UI5Element {
165
167
 
166
168
  get itemsList(): Array<MenuItem> {
167
169
  let id = 1;
168
- const parsedItems: Array<MenuItem> = this.parseArrayFromString(this.subItems);
170
+ const parsedItems: Array<MenuItem> = parseArrayFromString(this.subItems);
169
171
  return parsedItems.map((mainItem: MenuItem) => {
170
172
  mainItem.subMenuLinkItems = mainItem.subMenuLinkItems.map((category: SubMenuLinkItem) => {
171
173
  category.categoryId = `${id++}`;
@@ -41,7 +41,7 @@
41
41
  class="udex-masthead-menu-item {{rootClass}}"
42
42
  part="menu-item-button"
43
43
  aria-haspopup="{{ariaHasPopup}}"
44
- role="button"
44
+ role="{{accessibleRoleText}}"
45
45
  tabindex="{{_tabIndex}}">
46
46
  {{#if iconStart}}
47
47
  {{>arrow-left}}
@@ -225,8 +225,8 @@ class UDExMastheadMenuItem extends UI5Element {
225
225
  return this.externalLink ? "new-win-desc" : null;
226
226
  }
227
227
 
228
- get accessibleRoleText(): string | null {
229
- return this.accessibleRole ? this.accessibleRole : null;
228
+ get accessibleRoleText(): string {
229
+ return this.accessibleRole ? this.accessibleRole : "menuitem";
230
230
  }
231
231
 
232
232
  get partAttr(): string {
@@ -10,9 +10,10 @@
10
10
  {{>nav-items}}
11
11
  {{/if}}
12
12
  {{#if _showCategories}}
13
- <li class="udex-masthead-mobile-menu__list-item" role="menuitem">
13
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
14
14
  {{#if _hideExploreSapBtn}}
15
15
  <udex-masthead-menu-item
16
+ part="menu-item"
16
17
  class="udex-masthead-mobile-menu__back-item"
17
18
  @click="{{handleExploreBackToMenuItems}}"
18
19
  label="{{_clickedItem.innerText}}"
@@ -24,6 +25,7 @@
24
25
  {{else}}
25
26
  {{#if isNotMultipleMode}}
26
27
  <udex-masthead-menu-item
28
+ part="menu-item"
27
29
  class="udex-masthead-mobile-menu__heading"
28
30
  label="{{_clickedItem.innerText}}"
29
31
  type="Heading"
@@ -31,9 +33,11 @@
31
33
  </udex-masthead-menu-item>
32
34
  {{else}}
33
35
  <udex-masthead-menu-item
36
+ part="menu-item"
34
37
  class="udex-masthead-mobile-menu__back-item"
35
38
  @click="{{handleBackToMenuItems}}"
36
39
  label="{{_clickedItem.innerText}}"
40
+ aria-has-popup="true"
37
41
  type="Button"
38
42
  has-border
39
43
  icon-start
@@ -45,12 +49,14 @@
45
49
  {{>categories}}
46
50
  {{/if}}
47
51
  {{#if _showCategoryItems}}
48
- <li class="udex-masthead-mobile-menu__list-item" role="menuitem">
52
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
49
53
  <udex-masthead-menu-item
54
+ part="menu-item"
50
55
  class="udex-masthead-mobile-menu__back-item"
51
56
  @click="{{handleBackToCategories}}"
52
57
  label="{{_category.category}}"
53
58
  type="Button"
59
+ aria-has-popup="true"
54
60
  has-border
55
61
  icon-start
56
62
  is-back-to-categories>
@@ -62,11 +68,13 @@
62
68
  </div>
63
69
  {{#if showExploreBtn}}
64
70
  <udex-masthead-menu-item
71
+ part="menu-item"
65
72
  class="udex-masthead-mobile-menu__explore-btn"
66
73
  id="{{exploreItem._id}}"
67
74
  @click="{{handleExploreSapClick}}"
68
75
  @keydown="{{handleLeftRightKeys}}"
69
- accessible-role="button"
76
+ accessible-role-text="button"
77
+ aria-has-popup="true"
70
78
  type="Button"
71
79
  first-level
72
80
  icon-end
@@ -78,9 +86,10 @@
78
86
 
79
87
  {{#*inline "nav-items"}}
80
88
  {{#each items}}
81
- <li class="udex-masthead-mobile-menu__list-item" role="menuitem">
89
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
82
90
  {{#if this.subItems}}
83
91
  <udex-masthead-menu-item
92
+ part="menu-item"
84
93
  @click="{{../handleMenuItemClick}}"
85
94
  label="{{this.innerText}}"
86
95
  aria-has-popup="true"
@@ -92,6 +101,7 @@
92
101
  </udex-masthead-menu-item>
93
102
  {{else}}
94
103
  <udex-masthead-menu-item
104
+ part="menu-item"
95
105
  @click="{{../handleMobileItemEvent}}"
96
106
  url="{{this.href}}"
97
107
  label="{{this.innerText}}"
@@ -105,8 +115,9 @@
105
115
 
106
116
  {{#*inline "categories"}}
107
117
  {{#if _clickedItem.href}}
108
- <li class="udex-masthead-mobile-menu__list-item" role="menuitem">
118
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
109
119
  <udex-masthead-menu-item
120
+ part="menu-item"
110
121
  url="{{_clickedItem.href}}"
111
122
  label="{{overviewLinkText}}"
112
123
  @click="{{handleMobileItemEvent}}"
@@ -116,8 +127,9 @@
116
127
  {{/if}}
117
128
  {{#each _categories}}
118
129
  {{#if this.category}}
119
- <li class="udex-masthead-mobile-menu__list-item" role="menuitem">
130
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
120
131
  <udex-masthead-menu-item
132
+ part="menu-item"
121
133
  @click="{{../handleMenuCategoryClick}}"
122
134
  url="{{this.url}}"
123
135
  id="{{@index}}"
@@ -131,8 +143,9 @@
131
143
  </li>
132
144
  {{else}}
133
145
  {{#each this.items}}
134
- <li class="udex-masthead-mobile-menu__list-item" role="menuitem">
146
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
135
147
  <udex-masthead-menu-item
148
+ part="menu-item"
136
149
  @click="{{../handleMobileItemEvent}}"
137
150
  url="{{this.url}}"
138
151
  label="{{this.title}}"
@@ -146,8 +159,9 @@
146
159
 
147
160
  {{#*inline "category-items"}}
148
161
  {{#if _category.url}}
149
- <li class="udex-masthead-mobile-menu__list-item" role="menuitem">
162
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
150
163
  <udex-masthead-menu-item
164
+ part="menu-item"
151
165
  @click="{{../handleMobileCategoryItemEvent}}"
152
166
  url="{{this._category.url}}"
153
167
  label="{{overviewLinkText}}"
@@ -157,8 +171,9 @@
157
171
  {{/if}}
158
172
  {{#each _category.items}}
159
173
  {{#if this.url}}
160
- <li class="udex-masthead-mobile-menu__list-item" role="menuitem">
174
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
161
175
  <udex-masthead-menu-item
176
+ part="menu-item"
162
177
  @click="{{../handleMobileCategoryItemEvent}}"
163
178
  label="{{this.title}}"
164
179
  url="{{this.url}}"
@@ -13,7 +13,7 @@ import type { MenuItem, SubMenuLinkItem } from "./MastheadItem.js";
13
13
  import type UDExMastheadItem from "./MastheadItem.js";
14
14
  import UDExMastheadMenuItem, { UDExItemType } from "./MastheadMenuItem.js";
15
15
  import { OVERVIEW } from "./generated/i18n/i18n-defaults.js";
16
-
16
+ import AnalyticsName from "./types/AnalyticsName.js";
17
17
  import MastheadMobileMenuTemplate from "./generated/templates/MastheadMobileMenuTemplate.lit.js";
18
18
 
19
19
  // Styles
@@ -24,10 +24,14 @@ type UDExMastheadMobileMenuItemClickEventDetail = {
24
24
  item: UDExMastheadMenuItem,
25
25
  category?: string,
26
26
  isMobile: boolean,
27
+ analyticsName: AnalyticsName,
28
+ sourceNode: HTMLElement,
27
29
  }
28
30
 
29
31
  type UDExMastheadMobileMenuExploreClickEventDetail = {
30
32
  originalEvent: PointerEvent | KeyboardEvent,
33
+ analyticsName: AnalyticsName,
34
+ sourceNode: HTMLElement,
31
35
  }
32
36
 
33
37
  /**
@@ -151,7 +155,7 @@ class UDExMastheadMobileMenu extends UI5Element {
151
155
  e.preventDefault();
152
156
  this.openExploreSapMenu(e);
153
157
  this.setFocusItemByIndex(0);
154
- this.fireDecoratorEvent("explorer-menu-click", { originalEvent: e });
158
+ this.fireExploreSapMobileButton(e);
155
159
  }
156
160
 
157
161
  handleBackToMenuItems(e: PointerEvent) {
@@ -411,14 +415,26 @@ class UDExMastheadMobileMenu extends UI5Element {
411
415
  }
412
416
 
413
417
  fireMobileItemEvent(e: PointerEvent | KeyboardEvent, category?: string) {
418
+ const item = e.target as UDExMastheadMenuItem;
419
+
414
420
  this.fireDecoratorEvent("item-click", {
415
421
  isMobile: true,
416
- item: e.target as UDExMastheadMenuItem,
422
+ item,
417
423
  originalEvent: e,
424
+ analyticsName: AnalyticsName.Header,
425
+ sourceNode: item.shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
418
426
  ...(category && { category }),
419
427
  });
420
428
  }
421
429
 
430
+ fireExploreSapMobileButton(e: PointerEvent | KeyboardEvent) {
431
+ this.fireDecoratorEvent("explorer-menu-click", {
432
+ originalEvent: e,
433
+ analyticsName: AnalyticsName.Header,
434
+ sourceNode: (e.target as HTMLElement).shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
435
+ });
436
+ }
437
+
422
438
  setFocusItemByIndex(index: number) {
423
439
  this._shouldFocusItemByIndex = true;
424
440
  this._focusedItemIndex = index;
@@ -22,6 +22,8 @@
22
22
  {{/if}}
23
23
  <div class="udex-masthead-profile-menu__links">
24
24
  <udex-masthead-menu
25
+ part="menu"
26
+ exportparts="badge, menu-item"
25
27
  sub-items='{{linksList}}'
26
28
  @ui5-menu-item-click="{{handleProfileMenuItemClick}}">
27
29
  </udex-masthead-menu>
@@ -10,6 +10,8 @@ import { LOGOUT } from "./generated/i18n/i18n-defaults.js";
10
10
  import UDExMastheadMenu from "./MastheadMenu.js";
11
11
  import MastheadProfileMenuTemplate from "./generated/templates/MastheadProfileMenuTemplate.lit.js";
12
12
  import type UDExMastheadMenuItem from "./MastheadMenuItem.js";
13
+ import parseArrayFromString from "./utils/parseArrayFromString.js";
14
+ import AnalyticsName from "./types/AnalyticsName.js";
13
15
 
14
16
  // Styles
15
17
  import MastheadProfileMenuCss from "./generated/themes/MastheadProfileMenu.css.js";
@@ -22,13 +24,11 @@ interface UserData {
22
24
  avatarInitials?: string
23
25
  }
24
26
 
25
- type UDExMastheadProfileMenuLogoutClickEventDetail = {
26
- originalEvent: PointerEvent,
27
- }
28
-
29
27
  type UDExMastheadProfileMenuItemClickEventDetail = {
30
28
  item: UDExMastheadMenuItem,
31
29
  originalEvent: PointerEvent,
30
+ analyticsName: AnalyticsName,
31
+ sourceNode: HTMLElement,
32
32
  }
33
33
 
34
34
  /**
@@ -71,7 +71,7 @@ type UDExMastheadProfileMenuItemClickEventDetail = {
71
71
 
72
72
  class UDExMastheadProfileMenu extends UI5Element {
73
73
  eventDetails!: {
74
- "logout": UDExMastheadProfileMenuLogoutClickEventDetail,
74
+ "logout": UDExMastheadProfileMenuItemClickEventDetail,
75
75
  "profile-item-click": UDExMastheadProfileMenuItemClickEventDetail
76
76
  };
77
77
  /**
@@ -121,8 +121,13 @@ class UDExMastheadProfileMenu extends UI5Element {
121
121
  static i18nBundle: I18nBundle;
122
122
 
123
123
  handleUserLogoutItemClick(e: PointerEvent): void {
124
+ const item = e.target as UDExMastheadMenuItem;
125
+
124
126
  this.fireDecoratorEvent("logout", {
127
+ item,
128
+ sourceNode: item.shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
125
129
  originalEvent: e,
130
+ analyticsName: AnalyticsName.Header,
126
131
  });
127
132
  }
128
133
 
@@ -132,13 +137,11 @@ class UDExMastheadProfileMenu extends UI5Element {
132
137
  this.fireDecoratorEvent("profile-item-click", {
133
138
  item,
134
139
  originalEvent,
140
+ analyticsName: AnalyticsName.Header,
141
+ sourceNode: item.shadowRoot.querySelector(".udex-masthead-menu-item") as HTMLElement,
135
142
  });
136
143
  }
137
144
 
138
- parseArrayFromString<T>(string: string): T[] {
139
- return string ? JSON.parse(string) as T[] : [];
140
- }
141
-
142
145
  get linksList(): string {
143
146
  return this.links ? JSON.stringify([{
144
147
  subMenuLinkItems: JSON.parse(this.links),
@@ -146,7 +149,7 @@ class UDExMastheadProfileMenu extends UI5Element {
146
149
  }
147
150
 
148
151
  get userData(): UserData {
149
- return this.parseArrayFromString(this.loggedInUser) as UserData;
152
+ return parseArrayFromString(this.loggedInUser) as UserData;
150
153
  }
151
154
 
152
155
  get messageAvailable(): boolean {
@@ -39,6 +39,7 @@
39
39
  class="udex-masthead-shell__close-search-btn"
40
40
  size="Small"
41
41
  icon="decline"
42
+ part="search-close-button"
42
43
  tooltip="{{closeButtonAccessibleName}}"
43
44
  accessible-name="{{closeButtonAccessibleName}}"
44
45
  @click="{{handleCloseSearch}}">
@@ -71,6 +72,7 @@
71
72
  <udex-masthead-item
72
73
  class="udex-masthead-shell__search-btn"
73
74
  icon="search"
75
+ part="search-button"
74
76
  @click="{{handleSearchClick}}"
75
77
  accessible-name="search">
76
78
  </udex-masthead-item>