@sapudex/web-components 2.0.0 → 2.1.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 (195) hide show
  1. package/cypress/fixtures/footer-links.ts +221 -0
  2. package/cypress/specs/Checkbox.cy.tsx +92 -0
  3. package/cypress/specs/CountrySelector.cy.tsx +215 -0
  4. package/cypress/specs/Footer.cy.tsx +313 -0
  5. package/cypress/specs/PhoneNumberField.cy.tsx +2 -2
  6. package/cypress/specs/Table.cy.tsx +361 -0
  7. package/cypress/specs/TextField.cy.tsx +4 -0
  8. package/cypress/specs/Tooltip.cy.tsx +26 -0
  9. package/cypress/specs/Upload.cy.tsx +20 -3
  10. package/dist/AssetsVariables.js +1 -1
  11. package/dist/AssetsVariables.js.map +1 -1
  12. package/dist/Checkbox.d.ts +17 -0
  13. package/dist/Checkbox.js +36 -1
  14. package/dist/Checkbox.js.map +1 -1
  15. package/dist/FilterMenu.d.ts +7 -0
  16. package/dist/FilterMenu.js +3 -0
  17. package/dist/FilterMenu.js.map +1 -1
  18. package/dist/Link.d.ts +3 -4
  19. package/dist/Link.js +4 -5
  20. package/dist/Link.js.map +1 -1
  21. package/dist/MastheadItem.d.ts +21 -2
  22. package/dist/MastheadItem.js +95 -13
  23. package/dist/MastheadItem.js.map +1 -1
  24. package/dist/MastheadMenu.d.ts +1 -0
  25. package/dist/MastheadMenu.js +11 -5
  26. package/dist/MastheadMenu.js.map +1 -1
  27. package/dist/MastheadMobileMenu.d.ts +8 -2
  28. package/dist/MastheadMobileMenu.js +8 -2
  29. package/dist/MastheadMobileMenu.js.map +1 -1
  30. package/dist/MastheadShell.d.ts +24 -12
  31. package/dist/MastheadShell.js +75 -26
  32. package/dist/MastheadShell.js.map +1 -1
  33. package/dist/PasswordField.d.ts +10 -0
  34. package/dist/PasswordField.js +14 -0
  35. package/dist/PasswordField.js.map +1 -1
  36. package/dist/PhoneNumberField.d.ts +1 -0
  37. package/dist/PhoneNumberField.js +15 -1
  38. package/dist/PhoneNumberField.js.map +1 -1
  39. package/dist/RadioButton.d.ts +1 -0
  40. package/dist/RadioButton.js +1 -0
  41. package/dist/RadioButton.js.map +1 -1
  42. package/dist/SecondaryNavigation.d.ts +6 -5
  43. package/dist/SecondaryNavigation.js +8 -6
  44. package/dist/SecondaryNavigation.js.map +1 -1
  45. package/dist/SecondaryNavigationItem.d.ts +9 -6
  46. package/dist/SecondaryNavigationItem.js +19 -13
  47. package/dist/SecondaryNavigationItem.js.map +1 -1
  48. package/dist/SecondaryNavigationSubItem.d.ts +8 -4
  49. package/dist/SecondaryNavigationSubItem.js +6 -5
  50. package/dist/SecondaryNavigationSubItem.js.map +1 -1
  51. package/dist/Table.d.ts +1 -1
  52. package/dist/Table.js +1 -1
  53. package/dist/Table.js.map +1 -1
  54. package/dist/TextField.d.ts +8 -0
  55. package/dist/TextField.js +15 -0
  56. package/dist/TextField.js.map +1 -1
  57. package/dist/Tooltip.d.ts +5 -0
  58. package/dist/Tooltip.js +11 -1
  59. package/dist/Tooltip.js.map +1 -1
  60. package/dist/Upload.d.ts +12 -2
  61. package/dist/Upload.js +25 -1
  62. package/dist/Upload.js.map +1 -1
  63. package/dist/assets/{InputSuggestions-pMcXiozG.js → InputSuggestions-CP3cBQsh.js} +1 -1
  64. package/dist/assets/{ListItemStandardExpandableTextTemplate-BoB9C9hl.js → ListItemStandardExpandableTextTemplate-CLBtdbBK.js} +1 -1
  65. package/dist/assets/bundle-C9ZlnwwH.css +1 -0
  66. package/dist/assets/{bundle.esm-4ejJpC9l.js → bundle.esm-jHcdiVfj.js} +224 -224
  67. package/dist/assets/messagebundle_en-CVKgy_9L.js +1 -0
  68. package/dist/css/themes/Button.css +1 -1
  69. package/dist/css/themes/Checkbox.css +1 -1
  70. package/dist/css/themes/MastheadItem.css +1 -1
  71. package/dist/css/themes/RadioButton.css +1 -1
  72. package/dist/css/themes/RatingIndicator.css +1 -1
  73. package/dist/css/themes/Search.css +1 -1
  74. package/dist/css/themes/Slider.css +1 -1
  75. package/dist/css/themes/Tooltip.css +1 -1
  76. package/dist/css/themes/Upload.css +1 -1
  77. package/dist/css/themes/WizardTab.css +1 -1
  78. package/dist/custom-elements-internal.json +204 -12
  79. package/dist/custom-elements.json +165 -8
  80. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  81. package/dist/generated/i18n/i18n-defaults.d.ts +4 -1
  82. package/dist/generated/i18n/i18n-defaults.js +4 -1
  83. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  84. package/dist/generated/templates/FilterMenuTemplate.lit.js +1 -1
  85. package/dist/generated/templates/FilterMenuTemplate.lit.js.map +1 -1
  86. package/dist/generated/templates/MastheadItemTemplate.lit.js +2 -2
  87. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  88. package/dist/generated/templates/MastheadMenuTemplate.lit.js +1 -1
  89. package/dist/generated/templates/MastheadMenuTemplate.lit.js.map +1 -1
  90. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +2 -2
  91. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  92. package/dist/generated/templates/MastheadShellTemplate.lit.js +6 -5
  93. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  94. package/dist/generated/templates/PasswordFieldTemplate.lit.js +1 -1
  95. package/dist/generated/templates/PasswordFieldTemplate.lit.js.map +1 -1
  96. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js +1 -1
  97. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js.map +1 -1
  98. package/dist/generated/templates/TextFieldTemplate.lit.js +1 -1
  99. package/dist/generated/templates/TextFieldTemplate.lit.js.map +1 -1
  100. package/dist/generated/templates/UploadTemplate.lit.js +2 -2
  101. package/dist/generated/templates/UploadTemplate.lit.js.map +1 -1
  102. package/dist/generated/themes/Button.css.d.ts +1 -1
  103. package/dist/generated/themes/Button.css.js +1 -1
  104. package/dist/generated/themes/Button.css.js.map +1 -1
  105. package/dist/generated/themes/Checkbox.css.d.ts +1 -1
  106. package/dist/generated/themes/Checkbox.css.js +1 -1
  107. package/dist/generated/themes/Checkbox.css.js.map +1 -1
  108. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  109. package/dist/generated/themes/MastheadItem.css.js +1 -1
  110. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  111. package/dist/generated/themes/RadioButton.css.d.ts +1 -1
  112. package/dist/generated/themes/RadioButton.css.js +1 -1
  113. package/dist/generated/themes/RadioButton.css.js.map +1 -1
  114. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  115. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  116. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  117. package/dist/generated/themes/Search.css.d.ts +1 -1
  118. package/dist/generated/themes/Search.css.js +1 -1
  119. package/dist/generated/themes/Search.css.js.map +1 -1
  120. package/dist/generated/themes/Slider.css.d.ts +1 -1
  121. package/dist/generated/themes/Slider.css.js +1 -1
  122. package/dist/generated/themes/Slider.css.js.map +1 -1
  123. package/dist/generated/themes/Tooltip.css.d.ts +1 -1
  124. package/dist/generated/themes/Tooltip.css.js +1 -1
  125. package/dist/generated/themes/Tooltip.css.js.map +1 -1
  126. package/dist/generated/themes/Upload.css.d.ts +1 -1
  127. package/dist/generated/themes/Upload.css.js +1 -1
  128. package/dist/generated/themes/Upload.css.js.map +1 -1
  129. package/dist/generated/themes/WizardTab.css.d.ts +1 -1
  130. package/dist/generated/themes/WizardTab.css.js +1 -1
  131. package/dist/generated/themes/WizardTab.css.js.map +1 -1
  132. package/dist/messagebundle.properties +9 -1
  133. package/dist/messagebundle_en.properties +4 -1
  134. package/dist/vscode.html-custom-data.json +29 -4
  135. package/dist/web-types.json +113 -11
  136. package/package.json +1 -1
  137. package/src/AssetsVariables.ts +1 -1
  138. package/src/Checkbox.ts +47 -0
  139. package/src/FilterMenu.hbs +2 -0
  140. package/src/FilterMenu.ts +8 -0
  141. package/src/Link.ts +4 -5
  142. package/src/MastheadItem.hbs +2 -2
  143. package/src/MastheadItem.ts +119 -15
  144. package/src/MastheadMenu.hbs +4 -1
  145. package/src/MastheadMenu.ts +12 -5
  146. package/src/MastheadMobileMenu.hbs +2 -2
  147. package/src/MastheadMobileMenu.ts +16 -3
  148. package/src/MastheadShell.hbs +14 -3
  149. package/src/MastheadShell.ts +98 -36
  150. package/src/PasswordField.hbs +1 -0
  151. package/src/PasswordField.ts +14 -0
  152. package/src/PhoneNumberField.ts +19 -1
  153. package/src/RadioButton.ts +1 -0
  154. package/src/SecondaryNavigation.ts +14 -10
  155. package/src/SecondaryNavigationItem.hbs +1 -1
  156. package/src/SecondaryNavigationItem.ts +25 -16
  157. package/src/SecondaryNavigationSubItem.ts +13 -7
  158. package/src/Table.ts +2 -2
  159. package/src/TextField.hbs +2 -0
  160. package/src/TextField.ts +16 -0
  161. package/src/Tooltip.ts +19 -0
  162. package/src/Upload.hbs +4 -4
  163. package/src/Upload.ts +24 -3
  164. package/src/generated/i18n/i18n-defaults.ts +2 -2
  165. package/src/generated/templates/FilterMenuTemplate.lit.ts +1 -1
  166. package/src/generated/templates/MastheadItemTemplate.lit.ts +2 -2
  167. package/src/generated/templates/MastheadMenuTemplate.lit.ts +1 -1
  168. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +2 -2
  169. package/src/generated/templates/MastheadShellTemplate.lit.ts +6 -5
  170. package/src/generated/templates/PasswordFieldTemplate.lit.ts +1 -1
  171. package/src/generated/templates/SecondaryNavigationItemTemplate.lit.ts +1 -1
  172. package/src/generated/templates/TextFieldTemplate.lit.ts +1 -1
  173. package/src/generated/templates/UploadTemplate.lit.ts +2 -2
  174. package/src/generated/themes/Button.css.ts +1 -1
  175. package/src/generated/themes/Checkbox.css.ts +1 -1
  176. package/src/generated/themes/MastheadItem.css.ts +1 -1
  177. package/src/generated/themes/RadioButton.css.ts +1 -1
  178. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  179. package/src/generated/themes/Search.css.ts +1 -1
  180. package/src/generated/themes/Slider.css.ts +1 -1
  181. package/src/generated/themes/Tooltip.css.ts +1 -1
  182. package/src/generated/themes/Upload.css.ts +1 -1
  183. package/src/generated/themes/WizardTab.css.ts +1 -1
  184. package/src/i18n/messagebundle.properties +9 -1
  185. package/src/i18n/messagebundle_en.properties +4 -1
  186. package/src/themes/Button.css +9 -5
  187. package/src/themes/Checkbox.css +15 -1
  188. package/src/themes/MastheadItem.css +9 -3
  189. package/src/themes/RadioButton.css +2 -0
  190. package/src/themes/Search.css +1 -0
  191. package/src/themes/Tooltip.css +1 -1
  192. package/src/themes/Upload.css +10 -2
  193. package/src/themes/WizardTab.css +5 -0
  194. package/dist/assets/bundle-7XIcgsQH.css +0 -1
  195. package/dist/assets/messagebundle_en-BYIX4tmE.js +0 -1
@@ -8,16 +8,15 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
8
8
  import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
9
9
  import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
10
10
  import {
11
- isLeft, isRight, isSpace, isEnter,
11
+ isLeft, isRight, isSpace, isEnter, isEscape,
12
12
  } from "@ui5/webcomponents-base/dist/Keys.js";
13
13
  import "@ui5/webcomponents-icons/dist/decline.js";
14
14
  import "@ui5/webcomponents-icons/dist/menu2.js";
15
15
  import "@ui5/webcomponents-icons/dist/search.js";
16
- import "@ui5/webcomponents-icons/dist/cart.js";
17
16
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
18
17
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
19
18
  import { MAIN_LINKS } from "./generated/i18n/i18n-defaults.js";
20
- import UDExMastheadItem from "./MastheadItem.js";
19
+ import UDExMastheadItem, { UDExMastheadDropdownItemAction } from "./MastheadItem.js";
21
20
  import UDExMastheadMenu from "./MastheadMenu.js";
22
21
  import UDExControlButton from "./ControlButton.js";
23
22
  import type UDExSearch from "./Search.js";
@@ -91,6 +90,27 @@ type UDExMastheadShellBaseEventDetail = {
91
90
  */
92
91
  @event("search-click", { bubbles: true })
93
92
 
93
+ /**
94
+ * Fired event when the user clicks the search close button.
95
+ *
96
+ * @public
97
+ */
98
+ @event("search-close-click", { bubbles: true })
99
+
100
+ /**
101
+ * Fired event when the search panel is opened.
102
+ *
103
+ * @public
104
+ */
105
+ @event("search-opened", { bubbles: true })
106
+
107
+ /**
108
+ * Fired event when the search panel is closed.
109
+ *
110
+ * @public
111
+ */
112
+ @event("search-closed", { bubbles: true })
113
+
94
114
  /**
95
115
  * Fired event when the user clicks the cart button trigger.
96
116
  *
@@ -98,6 +118,13 @@ type UDExMastheadShellBaseEventDetail = {
98
118
  */
99
119
  @event("cart-click", { bubbles: true })
100
120
 
121
+ /**
122
+ * Fired event when the user clicks the support button trigger.
123
+ *
124
+ * @public
125
+ */
126
+ @event("support-click", { bubbles: true })
127
+
101
128
  /**
102
129
  * Fired event when the user clicks the profile button trigger.
103
130
  *
@@ -130,10 +157,14 @@ class UDExMastheadShell extends UI5Element {
130
157
  eventDetails!: {
131
158
  "mobile-menu-open": void,
132
159
  "mobile-menu-close": void,
133
- "search-click": void,
134
- "cart-click": void,
135
- "profile-click": void,
136
- "country-selector-click": void,
160
+ "search-opened": void,
161
+ "search-closed": void,
162
+ "cart-click": UDExMastheadShellBaseEventDetail,
163
+ "support-click": UDExMastheadShellBaseEventDetail,
164
+ "profile-click": UDExMastheadShellBaseEventDetail,
165
+ "country-selector-click": UDExMastheadShellBaseEventDetail,
166
+ "search-click": UDExMastheadShellBaseEventDetail,
167
+ "search-close-click": UDExMastheadShellBaseEventDetail,
137
168
  "logo-click": UDExMastheadShellBaseEventDetail,
138
169
  "site-label-click": UDExMastheadShellBaseEventDetail,
139
170
  };
@@ -195,6 +226,14 @@ class UDExMastheadShell extends UI5Element {
195
226
  @slot({ type: HTMLElement })
196
227
  profile!: Array<UDExMastheadItem>;
197
228
 
229
+ /**
230
+ * Slot for support
231
+ *
232
+ * @public
233
+ */
234
+ @slot({ type: HTMLElement })
235
+ support!: Array<UDExMastheadItem>;
236
+
198
237
  /**
199
238
  * Defines URL to homepage. It will be used as a link on a logo and a site label
200
239
  *
@@ -353,8 +392,6 @@ class UDExMastheadShell extends UI5Element {
353
392
  this._searchOpener = this.searchOpener;
354
393
  this._mobileMenu = this.mastheadMobileMenu;
355
394
 
356
- this.handleOutsideClick();
357
-
358
395
  if (this._isSearchOpened) {
359
396
  this.focusSearchInput();
360
397
  }
@@ -383,6 +420,7 @@ class UDExMastheadShell extends UI5Element {
383
420
 
384
421
  if (this._shouldHandleResize && this._isMobileMenuOpen) {
385
422
  this.closeMobileMenu();
423
+ this.resetSelectedItems();
386
424
  return;
387
425
  }
388
426
 
@@ -412,6 +450,19 @@ class UDExMastheadShell extends UI5Element {
412
450
  this.handleRightArrow(e);
413
451
  }
414
452
 
453
+ handleSearchKeyDown(e: CustomEvent): void {
454
+ e.stopPropagation();
455
+ const keyEvent = e.detail.e as KeyboardEvent;
456
+
457
+ if (isEscape(keyEvent)) {
458
+ if (this.showSearchByDefault && this.isAtLeastBreakpointSizeM) {
459
+ return;
460
+ }
461
+ this.closeSearch();
462
+ this.focusSearchBtn();
463
+ }
464
+ }
465
+
415
466
  handleLeftArrow(e: KeyboardEvent): void {
416
467
  if (isLeft(e)) {
417
468
  const currentItem = e.target as UDExMastheadItem;
@@ -444,25 +495,30 @@ class UDExMastheadShell extends UI5Element {
444
495
  this.fireDecoratorEvent("site-label-click", { originalEvent: e });
445
496
  }
446
497
 
447
- handleSearchClick(e: CustomEvent): void {
498
+ handleSearchClick(e: PointerEvent): void {
448
499
  e.stopPropagation();
500
+ this.fireDecoratorEvent("search-click", { originalEvent: e });
449
501
  this.openSearch();
450
- this.fireEvent("search-click");
451
502
  }
452
503
 
453
- handleCartClick(e: CustomEvent): void {
504
+ handleCartClick(e: PointerEvent): void {
505
+ e.stopPropagation();
506
+ this.fireDecoratorEvent("cart-click", { originalEvent: e });
507
+ }
508
+
509
+ handleProfileClick(e: PointerEvent): void {
454
510
  e.stopPropagation();
455
- this.fireDecoratorEvent("cart-click");
511
+ this.fireDecoratorEvent("profile-click", { originalEvent: e });
456
512
  }
457
513
 
458
- handleProfileClick(e: CustomEvent): void {
514
+ handleSupportClick(e: PointerEvent): void {
459
515
  e.stopPropagation();
460
- this.fireDecoratorEvent("profile-click");
516
+ this.fireDecoratorEvent("support-click", { originalEvent: e });
461
517
  }
462
518
 
463
- handleCountrySelectorClick(e: CustomEvent): void {
519
+ handleCountrySelectorClick(e: PointerEvent): void {
464
520
  e.stopPropagation();
465
- this.fireDecoratorEvent("country-selector-click");
521
+ this.fireDecoratorEvent("country-selector-click", { originalEvent: e });
466
522
  }
467
523
 
468
524
  handleOpenMobileMenu(): void {
@@ -481,9 +537,10 @@ class UDExMastheadShell extends UI5Element {
481
537
  this.fireDecoratorEvent("mobile-menu-open");
482
538
  }
483
539
 
484
- handleCloseSearch(): void {
485
- this.closeSearch();
540
+ handleCloseSearch(e: PointerEvent): void {
486
541
  this._closeBtnClicked = true;
542
+ this.fireDecoratorEvent("search-close-click", { originalEvent: e });
543
+ this.closeSearch();
487
544
  }
488
545
 
489
546
  handleEnterAndSpaceOnCloseBtn(e: KeyboardEvent): void {
@@ -494,17 +551,6 @@ class UDExMastheadShell extends UI5Element {
494
551
  }
495
552
  }
496
553
 
497
- handleOutsideClick(): void {
498
- document.addEventListener("click", (e: MouseEvent) => {
499
- const el = e.target as UDExMastheadItem;
500
- const isMobile = window.innerWidth < 1280 || this._isMobileMode;
501
- const isDropdownSlot = el.getAttribute("slot") === "dropdown";
502
- if (!isDropdownSlot && !el.isMenuItem && !isMobile) {
503
- this.resetSelectedItems();
504
- }
505
- });
506
- }
507
-
508
554
  focusSearchInput(): void {
509
555
  const searchSlot = this.querySelector<UDExSearch>("[udex-search]");
510
556
  if (searchSlot) {
@@ -530,7 +576,10 @@ class UDExMastheadShell extends UI5Element {
530
576
 
531
577
  resetSelectedItems(clickedId?: string): void {
532
578
  this.getSelectedItems().forEach(item => {
533
- if (item._id !== clickedId) {
579
+ if (item._id !== clickedId && item.selected) {
580
+ if (item.hasDropdownSlot) {
581
+ item.fireDropdownCloseEvent(item.eventItemTitle, UDExMastheadDropdownItemAction.ClickOutside);
582
+ }
534
583
  item.selected = false;
535
584
  }
536
585
  });
@@ -559,6 +608,7 @@ class UDExMastheadShell extends UI5Element {
559
608
  ...this.menuItems,
560
609
  ...this.exploreSAP,
561
610
  ...this.cart,
611
+ ...this.support,
562
612
  ...this.profile,
563
613
  ...this.countrySelector,
564
614
  ...(this.mobileBtn && this.closeBtn ? [this.mobileBtn, this.closeBtn] : []),
@@ -676,6 +726,7 @@ class UDExMastheadShell extends UI5Element {
676
726
  */
677
727
  closeSearch(): void {
678
728
  this._isSearchOpened = false;
729
+ this.fireDecoratorEvent("search-closed");
679
730
  }
680
731
 
681
732
  /**
@@ -686,7 +737,7 @@ class UDExMastheadShell extends UI5Element {
686
737
  const shouldPreventOpeningSearch = this._isSearchOpened
687
738
  || (this.isBreakpointSizeM && !this.showSearchByDefault)
688
739
  || this._isMobileMode
689
- || (this.IsAtLeastBreakpointSizeM && this.showSearchByDefault);
740
+ || (this.isAtLeastBreakpointSizeM && this.showSearchByDefault);
690
741
 
691
742
  if (shouldPreventOpeningSearch) {
692
743
  return;
@@ -698,6 +749,8 @@ class UDExMastheadShell extends UI5Element {
698
749
  if (this._searchOpener) {
699
750
  this._searchOpener.selected = false;
700
751
  }
752
+
753
+ this.fireDecoratorEvent("search-opened");
701
754
  }
702
755
 
703
756
  /**
@@ -706,7 +759,7 @@ class UDExMastheadShell extends UI5Element {
706
759
  */
707
760
  openMobileMenu(): void {
708
761
  if (!this._isMobileMenuOpen && (this._isMobileMode || this.isBreakpointSizeM)) {
709
- (this.mobileBtn as UDExMastheadItem).handleSelectedChange();
762
+ this.mobileBtn?.handleSelectedChange();
710
763
  this.handleOpenMobileMenu();
711
764
  }
712
765
  }
@@ -720,15 +773,15 @@ class UDExMastheadShell extends UI5Element {
720
773
  return;
721
774
  }
722
775
 
776
+ (this.mobileBtn as UDExMastheadItem).selected = false;
723
777
  this._isMobileMenuOpen = false;
724
- this.resetSelectedItems();
725
778
  this._mobileMenu?.showFirstLevelMenu();
726
779
 
727
780
  if (this.bodyOverflow) {
728
781
  this.removeOverflowBody();
729
782
  }
730
783
 
731
- this.fireEvent("mobile-menu-close");
784
+ this.fireDecoratorEvent("mobile-menu-close");
732
785
  }
733
786
 
734
787
  get slottedItems(): (MastheadSlottedItem)[] {
@@ -736,6 +789,7 @@ class UDExMastheadShell extends UI5Element {
736
789
  this.profileItem,
737
790
  this.profileMenu,
738
791
  this.cartItem,
792
+ this.supportItem,
739
793
  this.profileMenu,
740
794
  this.profileMenuLinks,
741
795
  this.countrySelectorItem,
@@ -775,6 +829,10 @@ class UDExMastheadShell extends UI5Element {
775
829
  return this.getSlottedNodes<UDExMastheadItem>("cart")[0];
776
830
  }
777
831
 
832
+ get supportItem(): MastheadItemType {
833
+ return this.getSlottedNodes<UDExMastheadItem>("support")[0];
834
+ }
835
+
778
836
  get profileMenu(): UDExMastheadProfileMenu {
779
837
  return this.querySelector("[udex-masthead-profile-menu]")!;
780
838
  }
@@ -807,6 +865,10 @@ class UDExMastheadShell extends UI5Element {
807
865
  return !!this.countrySelector.length;
808
866
  }
809
867
 
868
+ get hasSupport(): boolean {
869
+ return !!this.support.length;
870
+ }
871
+
810
872
  get hasMobileMenuButtons(): boolean {
811
873
  return !!this.mobileMenu.length;
812
874
  }
@@ -815,7 +877,7 @@ class UDExMastheadShell extends UI5Element {
815
877
  return BreakpointUtils.isAtMost("M");
816
878
  }
817
879
 
818
- get IsAtLeastBreakpointSizeM(): boolean {
880
+ get isAtLeastBreakpointSizeM(): boolean {
819
881
  return BreakpointUtils.isAtLeast("M");
820
882
  }
821
883
 
@@ -2,6 +2,7 @@
2
2
  type="{{type}}"
3
3
  value="{{value}}"
4
4
  label="{{passwordLabel}}"
5
+ autocomplete="{{autocomplete}}"
5
6
  ?disabled="{{disabled}}"
6
7
  ?readonly="{{readonly}}"
7
8
  ?displayonly="{{displayonly}}"
@@ -20,6 +20,12 @@ export enum UDExIconType {
20
20
  Hide = "hide",
21
21
  Show = "show",
22
22
  }
23
+
24
+ export enum UDExPasswordFieldAutoComplete {
25
+ On = "on",
26
+ Off = "off",
27
+ }
28
+
23
29
  /**
24
30
  * @class
25
31
  *
@@ -55,6 +61,14 @@ class UDExPasswordField extends UI5Element {
55
61
  @property({ type: String, noAttribute: true })
56
62
  type: UDExInputType = UDExInputType.Password;
57
63
 
64
+ /**
65
+ * Defines the behaviour of autocomplete.
66
+ *
67
+ * @public
68
+ */
69
+ @property({ type: String })
70
+ autocomplete: `${UDExPasswordFieldAutoComplete}` = "off";
71
+
58
72
  /**
59
73
  * Defines whether the component is in disabled state.
60
74
  * <br><br>
@@ -42,6 +42,10 @@ export enum UDExOpenButtonIcon {
42
42
  export type UDExPhoneNumberFieldValueState = Exclude<UDExValueState, "Warning">
43
43
 
44
44
  const initialPlaceholder: string = "+X XXX-XXX-XXXX";
45
+ /**
46
+ * Maximum number of possible digits based on international standard https://en.wikipedia.org/wiki/E.164
47
+ */
48
+ const digitsLimit: number = 15;
45
49
 
46
50
  /**
47
51
  * @class
@@ -432,6 +436,15 @@ class UDExPhoneNumberField extends UI5Element {
432
436
  this._dropdownExpanded = false;
433
437
  }
434
438
 
439
+ calculateMaxLength(prefix: string, mask: string): number {
440
+ const prefixNonDigitCount = prefix.replace(/[\d]/g, "").length;
441
+ const maskNonDigitCount = mask.replace(/X/g, "").length;
442
+
443
+ const maxLength = digitsLimit + prefixNonDigitCount + maskNonDigitCount;
444
+
445
+ return maxLength;
446
+ }
447
+
435
448
  autoSelectCountry(value: string) {
436
449
  const countryToSelect = this.updatedCountriesList.find(country => {
437
450
  const valuePhonePrefix = value.substring(0, country.phonePrefix.length);
@@ -444,7 +457,7 @@ class UDExPhoneNumberField extends UI5Element {
444
457
  }
445
458
 
446
459
  if (this.selectedPhonePrefix && this.selectedPlaceholder) {
447
- this.maxlength = this.selectedPhonePrefix.length + this.selectedPlaceholder.length;
460
+ this.maxlength = this.calculateMaxLength(this.selectedPhonePrefix, this.selectedPlaceholder);
448
461
  }
449
462
  }
450
463
 
@@ -460,6 +473,7 @@ class UDExPhoneNumberField extends UI5Element {
460
473
  return;
461
474
  }
462
475
 
476
+ const maskLength = this.selectedPhonePrefix.length + this.selectedPlaceholder.length;
463
477
  const mask = this.selectedPhonePrefix + this.selectedPlaceholder;
464
478
  const maskSymbols = [" ", "-", "(", ")"];
465
479
 
@@ -476,6 +490,10 @@ class UDExPhoneNumberField extends UI5Element {
476
490
  return char;
477
491
  }).join("");
478
492
 
493
+ if (this.value.length >= maskLength) {
494
+ return;
495
+ }
496
+
479
497
  this.value = valueWithMask;
480
498
 
481
499
  if (this.value.length > this.maxlength) {
@@ -27,6 +27,7 @@ import RadioButtonCss from "./generated/themes/RadioButton.css.js";
27
27
  *
28
28
  * @constructor
29
29
  * @extends RadioButton
30
+ * @tagname udex-radio-button
30
31
  * @public
31
32
  */
32
33
  @customElement({
@@ -10,6 +10,7 @@ import {
10
10
  isEscape, isLeft, isRight, isDown,
11
11
  } from "@ui5/webcomponents-base/dist/Keys.js";
12
12
  import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
13
+ import type { UDExSecondaryNavigationItemClickEventDetail, UDExSecondaryNavigationItemSubItemClickEventDetail } from "./SecondaryNavigationItem.js";
13
14
  import UDExSecondaryNavigationItem from "./SecondaryNavigationItem.js";
14
15
  import type UDExSecondaryNavigationSubItem from "./SecondaryNavigationSubItem.js";
15
16
  import type { NavItem } from "./SecondaryNavigationItemBase.js";
@@ -25,7 +26,7 @@ import SecondaryNavigationCss from "./generated/themes/SecondaryNavigation.css.j
25
26
  const canvasContentFont: string = "16px / 17.6px '72 Brand Variable'";
26
27
  const rootClass = "udex-secondary-navigation__root";
27
28
 
28
- type UDExSecondaryNavigationItemClickEventDetail = {
29
+ type UDExSecondaryNavigationClickEventDetail = {
29
30
  originalEvent: Event,
30
31
  clickedItem: NavItem;
31
32
  clickedIndex: number;
@@ -66,7 +67,7 @@ type UDExSecondaryNavigationItemClickEventDetail = {
66
67
 
67
68
  class UDExSecondaryNavigation extends UI5Element {
68
69
  eventDetails!: {
69
- "item-click": UDExSecondaryNavigationItemClickEventDetail,
70
+ "item-click": UDExSecondaryNavigationClickEventDetail,
70
71
  };
71
72
  /**
72
73
  * Defines an aria label for the mobile menu opener
@@ -234,7 +235,7 @@ class UDExSecondaryNavigation extends UI5Element {
234
235
  return item.closeDropdown();
235
236
  }
236
237
  if (isDown(e) && item.hasNestedItems) {
237
- item.openDropdown();
238
+ item.openDropdown(e);
238
239
  }
239
240
  }
240
241
 
@@ -282,13 +283,14 @@ class UDExSecondaryNavigation extends UI5Element {
282
283
  return this.domNavItems.indexOf(item);
283
284
  }
284
285
 
285
- handleItemClick(e: CustomEvent): void {
286
- const clickedItem = e.detail.item as UDExSecondaryNavigationItem;
286
+ handleItemClick(e: CustomEvent<UDExSecondaryNavigationItemClickEventDetail>): void {
287
+ const { index, item, originalEvent: actualOriginalEvent } = e.detail;
288
+ const clickedItem = item as UDExSecondaryNavigationItem;
287
289
  const {
288
290
  path, target, title, active, subItems, _id, mobileLinkTitle,
289
291
  } = clickedItem;
290
292
 
291
- const prevented = !this.fireEventItemClick(e, {
293
+ const prevented = !this.fireEventItemClick(actualOriginalEvent, index, {
292
294
  path,
293
295
  target,
294
296
  title,
@@ -310,10 +312,11 @@ class UDExSecondaryNavigation extends UI5Element {
310
312
  }
311
313
  }
312
314
 
313
- handleSubItemClick(e: CustomEvent): void {
315
+ handleSubItemClick(e: CustomEvent<UDExSecondaryNavigationItemSubItemClickEventDetail>): void {
316
+ const { originalEvent: actualOriginalEvent, index } = e.detail;
314
317
  const item = e.detail.item as UDExSecondaryNavigationSubItem;
315
318
  const { items } = item as NavItem;
316
- const prevented = !this.fireEventItemClick(e, item);
319
+ const prevented = !this.fireEventItemClick(actualOriginalEvent, index, item);
317
320
 
318
321
  if (prevented) {
319
322
  e.preventDefault();
@@ -331,7 +334,8 @@ class UDExSecondaryNavigation extends UI5Element {
331
334
  }
332
335
 
333
336
  fireEventItemClick(
334
- e: CustomEvent,
337
+ e: PointerEvent | KeyboardEvent,
338
+ clickedIndex: number,
335
339
  {
336
340
  items, target, path, title, active, mobileLinkTitle,
337
341
  }: NavItem,
@@ -346,7 +350,7 @@ class UDExSecondaryNavigation extends UI5Element {
346
350
  target,
347
351
  title,
348
352
  },
349
- clickedIndex: e.detail.index,
353
+ clickedIndex,
350
354
  });
351
355
  }
352
356
 
@@ -48,7 +48,7 @@
48
48
  <li role="none">
49
49
  <udex-secondary-navigation-sub-item
50
50
  index="{{@index}}"
51
- @ui5-sub-item-click="{{../onSubItemClick}}"
51
+ @ui5-sub-item-click="{{../handleSubItemClick}}"
52
52
  @ui5-back-item-click="{{../onBackClick}}"
53
53
  is-back="{{this.isBack}}"
54
54
  label="{{this.title}}"
@@ -30,14 +30,16 @@ import SecondaryNavigationItemCss from "./generated/themes/SecondaryNavigationIt
30
30
 
31
31
  export const menuItemRole: string = "menuitem";
32
32
 
33
- type UDExSecondaryNavigationItemClickEventDetail = {
33
+ export type UDExSecondaryNavigationItemClickEventDetail = {
34
34
  item: HTMLElement,
35
35
  index: number,
36
+ originalEvent: PointerEvent | KeyboardEvent
36
37
  };
37
38
 
38
- type UDExSecondaryNavigationItemSubItemClickEventDetail = {
39
- item: object,
39
+ export type UDExSecondaryNavigationItemSubItemClickEventDetail = {
40
+ item: NavItem,
40
41
  index: number,
42
+ originalEvent: PointerEvent
41
43
  }
42
44
 
43
45
  /**
@@ -72,7 +74,7 @@ type UDExSecondaryNavigationItemSubItemClickEventDetail = {
72
74
  * @allowPreventDefault
73
75
  * @public
74
76
  */
75
- @event("nav-item-click", { bubbles: true })
77
+ @event("nav-item-click", { bubbles: true, cancelable: true })
76
78
 
77
79
  /**
78
80
  * Fires when dropdown item is clicked
@@ -80,7 +82,7 @@ type UDExSecondaryNavigationItemSubItemClickEventDetail = {
80
82
  * @allowPreventDefault
81
83
  * @public
82
84
  */
83
- @event("sub-item-click", { bubbles: true })
85
+ @event("sub-item-click", { bubbles: true, cancelable: true })
84
86
 
85
87
  class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
86
88
  eventDetails!: {
@@ -178,7 +180,8 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
178
180
  this._subTitle = this.subActiveItemTitle || this._subTitle;
179
181
  }
180
182
 
181
- onSubItemClick(e: Event): void {
183
+ handleSubItemClick(e: CustomEvent | KeyboardEvent): void {
184
+ const { originalEvent } = e.detail;
182
185
  const { index } = e.target as UDExSecondaryNavigationSubItem;
183
186
  const clickedItem = this._processedItems[index];
184
187
 
@@ -188,24 +191,21 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
188
191
  this.onShouldFocusFirstSubItem();
189
192
  }
190
193
 
191
- this.fireDecoratorEvent("sub-item-click", {
192
- item: clickedItem,
193
- index,
194
- });
194
+ this.fireSubItemClickEvent(originalEvent as PointerEvent, clickedItem, index);
195
195
  }
196
196
 
197
197
  onBackClick(): void {
198
198
  this.setPrevNestedItems();
199
199
  }
200
200
 
201
- openDropdown(): void {
201
+ openDropdown(e: PointerEvent | KeyboardEvent): void {
202
202
  if (this.hasNestedItems) {
203
203
  this.setDropdownItems();
204
204
  this.isOpen = !this.isOpen;
205
205
  this.onShouldFocusFirstSubItem();
206
206
  }
207
207
 
208
- this.fireNavItemClickEvent();
208
+ this.fireNavItemClickEvent(e);
209
209
  }
210
210
 
211
211
  closeDropdown(): void {
@@ -214,7 +214,7 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
214
214
 
215
215
  handleItemLinkKeyDown(e: KeyboardEvent): void {
216
216
  if (isSpace(e)) {
217
- this.fireNavItemClickEvent();
217
+ this.fireNavItemClickEvent(e);
218
218
  }
219
219
  }
220
220
 
@@ -303,7 +303,7 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
303
303
  handleRightArrow(e: KeyboardEvent): void {
304
304
  const { hasItems, isBack, index } = e.target as UDExSecondaryNavigationSubItem;
305
305
  if (hasItems && !isBack) {
306
- this.onSubItemClick(e);
306
+ this.handleSubItemClick(e);
307
307
  this.unsetTabIndex(this.domNavItems[index]);
308
308
  }
309
309
  }
@@ -316,7 +316,7 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
316
316
  return;
317
317
  }
318
318
 
319
- this.onSubItemClick(e);
319
+ this.handleSubItemClick(e);
320
320
 
321
321
  if (hasItems) {
322
322
  this.onShouldFocusFirstSubItem();
@@ -331,10 +331,19 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
331
331
  this.focus();
332
332
  }
333
333
 
334
- fireNavItemClickEvent(): void {
334
+ fireNavItemClickEvent(e: PointerEvent | KeyboardEvent): void {
335
335
  this.fireDecoratorEvent("nav-item-click", {
336
336
  item: this,
337
337
  index: this.index,
338
+ originalEvent: e,
339
+ });
340
+ }
341
+
342
+ fireSubItemClickEvent(e: PointerEvent, clickedItem: NavItem, index: number): void {
343
+ this.fireDecoratorEvent("sub-item-click", {
344
+ item: clickedItem,
345
+ index,
346
+ originalEvent: e,
338
347
  });
339
348
  }
340
349
 
@@ -15,8 +15,13 @@ import SecondaryNavigationSubItemTemplate from "./generated/templates/SecondaryN
15
15
  // Styles
16
16
  import SecondaryNavigationSubItemCss from "./generated/themes/SecondaryNavigationSubItem.css.js";
17
17
 
18
- type UDExSecondaryNavigationSubItemClickEventDetail = {
18
+ export type UDExSecondaryNavigationSubItemClickEventDetail = {
19
19
  item: UDExSecondaryNavigationSubItem,
20
+ originalEvent: PointerEvent
21
+ }
22
+
23
+ export type UDExSecondaryNavigationSubItemBackClickEventDetail = {
24
+ originalEvent: PointerEvent
20
25
  }
21
26
 
22
27
  /**
@@ -51,7 +56,7 @@ type UDExSecondaryNavigationSubItemClickEventDetail = {
51
56
  * @allowPreventDefault
52
57
  * @public
53
58
  */
54
- @event("sub-item-click", { bubbles: true })
59
+ @event("sub-item-click", { bubbles: true, cancelable: true })
55
60
 
56
61
  /**
57
62
  * Fires when back item is clicked
@@ -59,12 +64,12 @@ type UDExSecondaryNavigationSubItemClickEventDetail = {
59
64
  * @allowPreventDefault
60
65
  * @public
61
66
  */
62
- @event("back-item-click", { bubbles: true })
67
+ @event("back-item-click", { bubbles: true, cancelable: true })
63
68
 
64
69
  class UDExSecondaryNavigationSubItem extends UDExSecondaryNavigationItemBase {
65
70
  eventDetails!: {
66
71
  "sub-item-click": UDExSecondaryNavigationSubItemClickEventDetail,
67
- "back-item-click": void,
72
+ "back-item-click": UDExSecondaryNavigationSubItemBackClickEventDetail,
68
73
  };
69
74
  /**
70
75
  * Defines back item.
@@ -90,14 +95,15 @@ class UDExSecondaryNavigationSubItem extends UDExSecondaryNavigationItemBase {
90
95
  @i18n("@sapudex/web-components")
91
96
  static i18nBundle: I18nBundle;
92
97
 
93
- onItemClick(): void {
98
+ onItemClick(e: PointerEvent): void {
94
99
  this.fireDecoratorEvent("sub-item-click", {
95
100
  item: this,
101
+ originalEvent: e,
96
102
  });
97
103
  }
98
104
 
99
- onBackItemClick(): void {
100
- this.fireDecoratorEvent("back-item-click");
105
+ onBackItemClick(e: PointerEvent): void {
106
+ this.fireDecoratorEvent("back-item-click", { originalEvent: e });
101
107
  }
102
108
 
103
109
  get hasItems(): boolean {
package/src/Table.ts CHANGED
@@ -98,8 +98,8 @@ class UDExTable extends UI5Element {
98
98
  * @default false
99
99
  * @public
100
100
  */
101
- @property({ type: String })
102
- loading!: string;
101
+ @property({ type: Boolean })
102
+ loading!: boolean;
103
103
 
104
104
  /**
105
105
  * Defines the delay in milliseconds, after which the loading indicator will show up for this component.