@sapudex/web-components 0.224.0 → 0.226.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 (110) hide show
  1. package/dist/FilterMenu.d.ts +7 -0
  2. package/dist/FilterMenu.js +3 -0
  3. package/dist/FilterMenu.js.map +1 -1
  4. package/dist/HeroBanner.js.map +1 -1
  5. package/dist/MastheadItem.d.ts +49 -2
  6. package/dist/MastheadItem.js +112 -23
  7. package/dist/MastheadItem.js.map +1 -1
  8. package/dist/MastheadMenu.d.ts +1 -0
  9. package/dist/MastheadMenu.js +14 -5
  10. package/dist/MastheadMenu.js.map +1 -1
  11. package/dist/MastheadMobileMenu.d.ts +4 -1
  12. package/dist/MastheadMobileMenu.js +15 -3
  13. package/dist/MastheadMobileMenu.js.map +1 -1
  14. package/dist/MastheadShell.d.ts +26 -4
  15. package/dist/MastheadShell.js +86 -43
  16. package/dist/MastheadShell.js.map +1 -1
  17. package/dist/PasswordField.d.ts +12 -0
  18. package/dist/PasswordField.js +13 -0
  19. package/dist/PasswordField.js.map +1 -1
  20. package/dist/SecondaryNavigation.d.ts +1 -1
  21. package/dist/SecondaryNavigation.js +8 -6
  22. package/dist/SecondaryNavigation.js.map +1 -1
  23. package/dist/SecondaryNavigationItem.d.ts +4 -3
  24. package/dist/SecondaryNavigationItem.js +15 -9
  25. package/dist/SecondaryNavigationItem.js.map +1 -1
  26. package/dist/SecondaryNavigationSubItem.d.ts +2 -2
  27. package/dist/SecondaryNavigationSubItem.js +5 -4
  28. package/dist/SecondaryNavigationSubItem.js.map +1 -1
  29. package/dist/Table.d.ts +5 -0
  30. package/dist/Table.js +4 -1
  31. package/dist/Table.js.map +1 -1
  32. package/dist/TextField.d.ts +8 -0
  33. package/dist/TextField.js +9 -0
  34. package/dist/TextField.js.map +1 -1
  35. package/dist/assets/{bundle.esm-fe0b0d94.js → bundle.esm-740278cc.js} +194 -193
  36. package/dist/assets/messagebundle_en-f0b5e0d9.js +1 -0
  37. package/dist/css/themes/MastheadItem.css +1 -1
  38. package/dist/css/themes/PasswordField.css +1 -0
  39. package/dist/css/themes/RatingIndicator.css +1 -1
  40. package/dist/css/themes/Slider.css +1 -1
  41. package/dist/custom-elements-internal.json +148 -0
  42. package/dist/custom-elements.json +125 -0
  43. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  44. package/dist/generated/i18n/i18n-defaults.d.ts +4 -1
  45. package/dist/generated/i18n/i18n-defaults.js +4 -1
  46. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  47. package/dist/generated/templates/FilterMenuTemplate.lit.js +1 -1
  48. package/dist/generated/templates/FilterMenuTemplate.lit.js.map +1 -1
  49. package/dist/generated/templates/MastheadItemTemplate.lit.js +2 -2
  50. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  51. package/dist/generated/templates/MastheadMenuTemplate.lit.js +1 -1
  52. package/dist/generated/templates/MastheadMenuTemplate.lit.js.map +1 -1
  53. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +2 -2
  54. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  55. package/dist/generated/templates/MastheadShellTemplate.lit.js +6 -5
  56. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  57. package/dist/generated/templates/PasswordFieldTemplate.lit.js +1 -1
  58. package/dist/generated/templates/PasswordFieldTemplate.lit.js.map +1 -1
  59. package/dist/generated/templates/TextFieldTemplate.lit.js +1 -1
  60. package/dist/generated/templates/TextFieldTemplate.lit.js.map +1 -1
  61. package/dist/generated/themes/MastheadItem.css.js +1 -1
  62. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  63. package/dist/generated/themes/PasswordField.css.d.ts +3 -0
  64. package/dist/generated/themes/PasswordField.css.js +9 -0
  65. package/dist/generated/themes/PasswordField.css.js.map +1 -0
  66. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  67. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  68. package/dist/generated/themes/Slider.css.js +1 -1
  69. package/dist/generated/themes/Slider.css.js.map +1 -1
  70. package/dist/i18n/messagebundle.properties +10 -2
  71. package/dist/i18n/messagebundle_en.properties +4 -1
  72. package/dist/vscode.html-custom-data.json +22 -2
  73. package/dist/web-types.json +93 -4
  74. package/package.json +1 -1
  75. package/src/FilterMenu.hbs +1 -0
  76. package/src/FilterMenu.ts +9 -0
  77. package/src/HeroBanner.ts +1 -1
  78. package/src/MastheadItem.hbs +2 -2
  79. package/src/MastheadItem.ts +136 -25
  80. package/src/MastheadMenu.hbs +4 -1
  81. package/src/MastheadMenu.ts +16 -5
  82. package/src/MastheadMobileMenu.hbs +2 -2
  83. package/src/MastheadMobileMenu.ts +18 -3
  84. package/src/MastheadShell.hbs +14 -3
  85. package/src/MastheadShell.ts +98 -45
  86. package/src/PasswordField.hbs +1 -0
  87. package/src/PasswordField.ts +19 -1
  88. package/src/SecondaryNavigation.ts +9 -6
  89. package/src/SecondaryNavigationItem.ts +17 -10
  90. package/src/SecondaryNavigationSubItem.ts +5 -4
  91. package/src/Table.ts +8 -1
  92. package/src/TextField.hbs +2 -0
  93. package/src/TextField.ts +16 -0
  94. package/src/generated/i18n/i18n-defaults.ts +2 -2
  95. package/src/generated/templates/FilterMenuTemplate.lit.ts +1 -1
  96. package/src/generated/templates/MastheadItemTemplate.lit.ts +2 -2
  97. package/src/generated/templates/MastheadMenuTemplate.lit.ts +1 -1
  98. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +2 -2
  99. package/src/generated/templates/MastheadShellTemplate.lit.ts +6 -5
  100. package/src/generated/templates/PasswordFieldTemplate.lit.ts +1 -1
  101. package/src/generated/templates/TextFieldTemplate.lit.ts +1 -1
  102. package/src/generated/themes/MastheadItem.css.ts +1 -1
  103. package/src/generated/themes/PasswordField.css.ts +13 -0
  104. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  105. package/src/generated/themes/Slider.css.ts +1 -1
  106. package/src/i18n/messagebundle.properties +10 -2
  107. package/src/i18n/messagebundle_en.properties +4 -1
  108. package/src/themes/MastheadItem.css +9 -3
  109. package/src/themes/PasswordField.css +3 -0
  110. package/dist/assets/messagebundle_en-d1666c5e.js +0 -1
@@ -19,6 +19,8 @@ import MastheadMobileMenuTemplate from "./generated/templates/MastheadMobileMenu
19
19
  import MastheadMobileMenuCss from "./generated/themes/MastheadMobileMenu.css.js";
20
20
 
21
21
  export type MobileItemClickEventDetail = {
22
+ category?: string,
23
+ isMobile: boolean,
22
24
  originalEvent: Event,
23
25
  item: UDExMastheadMenuItem,
24
26
  }
@@ -71,7 +73,13 @@ export type MobileItemClickEventDetail = {
71
73
  * @allowPreventDefault
72
74
  * @public
73
75
  */
74
- @event("explorer-menu-click")
76
+ @event("explorer-menu-click", {
77
+ detail: {
78
+ originalEvent: {
79
+ type: Event,
80
+ },
81
+ },
82
+ })
75
83
 
76
84
  class UDExMastheadMobileMenu extends UI5Element {
77
85
  /**
@@ -152,7 +160,7 @@ class UDExMastheadMobileMenu extends UI5Element {
152
160
  e.preventDefault();
153
161
  this.openExploreSapMenu(e);
154
162
  this.setFocusItemByIndex(0);
155
- this.fireEvent("explorer-menu-click");
163
+ this.fireEvent("explorer-menu-click", { originalEvent: e });
156
164
  }
157
165
 
158
166
  handleBackToMenuItems(e: Event) {
@@ -239,6 +247,11 @@ class UDExMastheadMobileMenu extends UI5Element {
239
247
  this.fireMobileItemEvent(e);
240
248
  }
241
249
 
250
+ handleMobileCategoryItemEvent(e: PointerEvent) {
251
+ e.stopPropagation();
252
+ this.fireMobileItemEvent(e, this._category.category);
253
+ }
254
+
242
255
  handleMenuMode() {
243
256
  if (this.isNoMenuItemsMode && this.hasExploreBtnSlot) {
244
257
  this.openCategories(this.exploreItem);
@@ -406,8 +419,10 @@ class UDExMastheadMobileMenu extends UI5Element {
406
419
  this._showCategoryItems = false;
407
420
  }
408
421
 
409
- fireMobileItemEvent(e: Event) {
422
+ fireMobileItemEvent(e: Event, category?: string) {
410
423
  this.fireEvent<MobileItemClickEventDetail>("item-click", {
424
+ ...(category && { category }),
425
+ isMobile: true,
411
426
  item: e.target as UDExMastheadMenuItem,
412
427
  originalEvent: e,
413
428
  }, true, false);
@@ -1,4 +1,6 @@
1
- <header class="udex-masthead-shell" @keydown="{{handleKeyDown}}">
1
+ <header
2
+ class="udex-masthead-shell"
3
+ @keydown="{{handleKeyDown}}">
2
4
  <div class="udex-masthead-shell__main-content">
3
5
  <div class="udex-masthead-shell__landing-wrap">
4
6
  {{#if logoUrl}}
@@ -26,7 +28,9 @@
26
28
  </div>
27
29
 
28
30
  {{#if isSearchVisible}}
29
- <div class="udex-masthead-shell__search-container">
31
+ <div
32
+ class="udex-masthead-shell__search-container"
33
+ @ui5-search-keydown="{{handleSearchKeyDown}}">
30
34
  <slot name="search"></slot>
31
35
  </div>
32
36
  {{#if _isSearchOpened}}
@@ -80,6 +84,14 @@
80
84
  <slot name="cart"></slot>
81
85
  </div>
82
86
  {{/if}}
87
+ {{#if hasSupport}}
88
+ <div
89
+ class="udex-masthead-shell__support udex-masthead-shell__item_icon"
90
+ @ui5-item-click="{{setSelectedItem}}"
91
+ @click="{{handleSupportClick}}">
92
+ <slot name="support"></slot>
93
+ </div>
94
+ {{/if}}
83
95
  {{#if hasProfile}}
84
96
  <div
85
97
  class="udex-masthead-shell__profile udex-masthead-shell__item_icon"
@@ -96,7 +108,6 @@
96
108
  <slot name="countrySelector"></slot>
97
109
  </div>
98
110
  {{/if}}
99
-
100
111
  {{#if hasMobileMenuButtons}}
101
112
  <udex-masthead-item
102
113
  @keydown="{{handleEnterAndSpaceOnCloseBtn}}"
@@ -7,16 +7,15 @@ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
7
7
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
8
8
  import ResizeHandler, { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
9
9
  import {
10
- isLeft, isRight, isSpace, isEnter,
10
+ isLeft, isRight, isSpace, isEnter, isEscape,
11
11
  } from "@ui5/webcomponents-base/dist/Keys.js";
12
12
  import "@ui5/webcomponents-icons/dist/decline.js";
13
13
  import "@ui5/webcomponents-icons/dist/menu2.js";
14
14
  import "@ui5/webcomponents-icons/dist/search.js";
15
- import "@ui5/webcomponents-icons/dist/cart.js";
16
15
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
17
16
  import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
18
17
  import { MAIN_LINKS } from "./generated/i18n/i18n-defaults.js";
19
- import UDExMastheadItem from "./MastheadItem.js";
18
+ import UDExMastheadItem, { DropdownItemAction } from "./MastheadItem.js";
20
19
  import UDExMastheadMenu from "./MastheadMenu.js";
21
20
  import UDExControlButton from "./ControlButton.js";
22
21
  import UDExSearch from "./Search.js";
@@ -32,6 +31,12 @@ import MastheadShellCss from "./generated/themes/MastheadShell.css.js";
32
31
  const canvasContentFont = "16px '72 Brand Variable'";
33
32
  type MastheadSlottedItem = UDExMastheadItem | UDExMastheadProfileMenu | UDExMastheadMenu | UDExMastheadCountrySelector | undefined | null;
34
33
  type MastheadItemType = UDExMastheadItem | null | undefined;
34
+ export const MastheadOriginalEvent = {
35
+ detail: {
36
+ originalEvent: { type: Event },
37
+ },
38
+ };
39
+
35
40
  /**
36
41
  * @class
37
42
  *
@@ -83,54 +88,71 @@ type MastheadItemType = UDExMastheadItem | null | undefined;
83
88
  *
84
89
  * @public
85
90
  */
86
- @event("search-click")
91
+ @event("search-click", MastheadOriginalEvent)
92
+
93
+ /**
94
+ * Fired event when the user clicks the search close button.
95
+ *
96
+ * @public
97
+ */
98
+ @event("search-close-click", MastheadOriginalEvent)
99
+
100
+ /**
101
+ * Fired event when the search panel is opened.
102
+ *
103
+ * @public
104
+ */
105
+ @event("search-opened")
106
+
107
+ /**
108
+ * Fired event when the search panel is closed.
109
+ *
110
+ * @public
111
+ */
112
+ @event("search-closed")
87
113
 
88
114
  /**
89
115
  * Fired event when the user clicks the cart button trigger.
90
116
  *
91
117
  * @public
92
118
  */
93
- @event("cart-click")
119
+ @event("cart-click", MastheadOriginalEvent)
120
+
121
+ /**
122
+ * Fired event when the user clicks the support button trigger.
123
+ *
124
+ * @public
125
+ */
126
+ @event("support-click", MastheadOriginalEvent)
94
127
 
95
128
  /**
96
129
  * Fired event when the user clicks the profile button trigger.
97
130
  *
98
131
  * @public
99
132
  */
100
- @event("profile-click")
133
+ @event("profile-click", MastheadOriginalEvent)
101
134
 
102
135
  /**
103
136
  * Fired event when the user clicks the country selector button trigger.
104
137
  *
105
138
  * @public
106
139
  */
107
- @event("country-selector-click")
140
+ @event("country-selector-click", MastheadOriginalEvent)
108
141
 
109
142
  /**
110
143
  * Fired event when the user clicks the logo.
111
144
  *
112
145
  * @public
113
146
  */
114
- @event("logo-click", {
115
- detail: {
116
- originalEvent: {
117
- type: Event,
118
- },
119
- },
120
- })
147
+ @event("logo-click", MastheadOriginalEvent)
121
148
 
122
149
  /**
123
150
  * Fired event when the user clicks the site label.
124
151
  *
125
152
  * @public
153
+ * @public
126
154
  */
127
- @event("site-label-click", {
128
- detail: {
129
- originalEvent: {
130
- type: Event,
131
- },
132
- },
133
- })
155
+ @event("site-label-click", MastheadOriginalEvent)
134
156
 
135
157
  class UDExMastheadShell extends UI5Element {
136
158
  /**
@@ -191,6 +213,14 @@ class UDExMastheadShell extends UI5Element {
191
213
  @slot({ type: HTMLElement })
192
214
  profile!: Array<UDExMastheadItem>;
193
215
 
216
+ /**
217
+ * Slot for support
218
+ *
219
+ * @public
220
+ */
221
+ @slot({ type: HTMLElement })
222
+ support!: Array<UDExMastheadItem>;
223
+
194
224
  /**
195
225
  * Defines URL to homepage. It will be used as a link on a logo and a site label
196
226
  *
@@ -350,8 +380,6 @@ class UDExMastheadShell extends UI5Element {
350
380
  this._searchOpener = this.searchOpener;
351
381
  this._mobileMenu = this.mastheadMobileMenu;
352
382
 
353
- this.handleOutsideClick();
354
-
355
383
  if (this._isSearchOpened) {
356
384
  this.focusSearchInput();
357
385
  }
@@ -380,6 +408,7 @@ class UDExMastheadShell extends UI5Element {
380
408
 
381
409
  if (this._shouldHandleResize && this._isMobileMenuOpen) {
382
410
  this.closeMobileMenu();
411
+ this.resetSelectedItems();
383
412
  return;
384
413
  }
385
414
 
@@ -409,6 +438,19 @@ class UDExMastheadShell extends UI5Element {
409
438
  this.handleRightArrow(e);
410
439
  }
411
440
 
441
+ handleSearchKeyDown(e: CustomEvent): void {
442
+ e.stopPropagation();
443
+ const keyEvent = e.detail as KeyboardEvent;
444
+
445
+ if (isEscape(keyEvent)) {
446
+ if (this.showSearchByDefault && this.isAtLeastBreakpointSizeM) {
447
+ return;
448
+ }
449
+ this.closeSearch();
450
+ this.focusSearchBtn();
451
+ }
452
+ }
453
+
412
454
  handleLeftArrow(e: KeyboardEvent): void {
413
455
  if (isLeft(e)) {
414
456
  const currentItem = e.target as UDExMastheadItem;
@@ -443,23 +485,28 @@ class UDExMastheadShell extends UI5Element {
443
485
 
444
486
  handleSearchClick(e: CustomEvent): void {
445
487
  e.stopPropagation();
488
+ this.fireEvent("search-click", { originalEvent: e });
446
489
  this.openSearch();
447
- this.fireEvent("search-click");
448
490
  }
449
491
 
450
492
  handleCartClick(e: CustomEvent): void {
451
493
  e.stopPropagation();
452
- this.fireEvent("cart-click");
494
+ this.fireEvent("cart-click", { originalEvent: e });
495
+ }
496
+
497
+ handleSupportClick(e: CustomEvent): void {
498
+ e.stopPropagation();
499
+ this.fireEvent("support-click", { originalEvent: e });
453
500
  }
454
501
 
455
502
  handleProfileClick(e: CustomEvent): void {
456
503
  e.stopPropagation();
457
- this.fireEvent("profile-click");
504
+ this.fireEvent("profile-click", { originalEvent: e });
458
505
  }
459
506
 
460
507
  handleCountrySelectorClick(e: CustomEvent): void {
461
508
  e.stopPropagation();
462
- this.fireEvent("country-selector-click");
509
+ this.fireEvent("country-selector-click", { originalEvent: e });
463
510
  }
464
511
 
465
512
  handleOpenMobileMenu(): void {
@@ -478,9 +525,10 @@ class UDExMastheadShell extends UI5Element {
478
525
  this.fireEvent("mobile-menu-open");
479
526
  }
480
527
 
481
- handleCloseSearch(): void {
482
- this.closeSearch();
528
+ handleCloseSearch(e: CustomEvent): void {
483
529
  this._closeBtnClicked = true;
530
+ this.fireEvent("search-close-click", { originalEvent: e });
531
+ this.closeSearch();
484
532
  }
485
533
 
486
534
  handleEnterAndSpaceOnCloseBtn(e: KeyboardEvent): void {
@@ -491,17 +539,6 @@ class UDExMastheadShell extends UI5Element {
491
539
  }
492
540
  }
493
541
 
494
- handleOutsideClick(): void {
495
- document.addEventListener("click", (e: Event) => {
496
- const el = e.target as UDExMastheadItem;
497
- const isMobile = window.innerWidth < 1280 || this._isMobileMode;
498
- const isDropdownSlot = el.getAttribute("slot") === "dropdown";
499
- if (!isDropdownSlot && !el.isMenuItem && !isMobile) {
500
- this.resetSelectedItems();
501
- }
502
- });
503
- }
504
-
505
542
  focusSearchInput(): void {
506
543
  const searchSlot = this.querySelector<UDExSearch>("[udex-search]");
507
544
  if (searchSlot) {
@@ -527,7 +564,10 @@ class UDExMastheadShell extends UI5Element {
527
564
 
528
565
  resetSelectedItems(clickedId?: string): void {
529
566
  this.getSelectedItems().forEach(item => {
530
- if (item._id !== clickedId) {
567
+ if (item._id !== clickedId && item.selected) {
568
+ if (item.hasDropdownSlot) {
569
+ item.fireDropdownCloseEvent(item.eventItemTitle, DropdownItemAction.ClickOutside);
570
+ }
531
571
  item.selected = false;
532
572
  }
533
573
  });
@@ -556,6 +596,7 @@ class UDExMastheadShell extends UI5Element {
556
596
  ...this.menuItems,
557
597
  ...this.exploreSAP,
558
598
  ...this.cart,
599
+ ...this.support,
559
600
  ...this.profile,
560
601
  ...this.countrySelector,
561
602
  ...(this.mobileBtn && this.closeBtn ? [this.mobileBtn, this.closeBtn] : []),
@@ -673,6 +714,7 @@ class UDExMastheadShell extends UI5Element {
673
714
  */
674
715
  closeSearch(): void {
675
716
  this._isSearchOpened = false;
717
+ this.fireEvent("search-closed");
676
718
  }
677
719
 
678
720
  /**
@@ -683,7 +725,7 @@ class UDExMastheadShell extends UI5Element {
683
725
  const shouldPreventOpeningSearch = this._isSearchOpened
684
726
  || (this.isBreakpointSizeM && !this.showSearchByDefault)
685
727
  || this._isMobileMode
686
- || (this.IsAtLeastBreakpointSizeM && this.showSearchByDefault);
728
+ || (this.isAtLeastBreakpointSizeM && this.showSearchByDefault);
687
729
 
688
730
  if (shouldPreventOpeningSearch) {
689
731
  return;
@@ -695,6 +737,8 @@ class UDExMastheadShell extends UI5Element {
695
737
  if (this._searchOpener) {
696
738
  this._searchOpener.selected = false;
697
739
  }
740
+
741
+ this.fireEvent("search-opened");
698
742
  }
699
743
 
700
744
  /**
@@ -703,7 +747,7 @@ class UDExMastheadShell extends UI5Element {
703
747
  */
704
748
  openMobileMenu(): void {
705
749
  if (!this._isMobileMenuOpen && (this._isMobileMode || this.isBreakpointSizeM)) {
706
- (this.mobileBtn as UDExMastheadItem).handleSelectedChange();
750
+ this.mobileBtn?.handleSelectedChange();
707
751
  this.handleOpenMobileMenu();
708
752
  }
709
753
  }
@@ -717,8 +761,8 @@ class UDExMastheadShell extends UI5Element {
717
761
  return;
718
762
  }
719
763
 
764
+ (this.mobileBtn as UDExMastheadItem).selected = false;
720
765
  this._isMobileMenuOpen = false;
721
- this.resetSelectedItems();
722
766
  this._mobileMenu?.showFirstLevelMenu();
723
767
 
724
768
  if (this.bodyOverflow) {
@@ -733,6 +777,7 @@ class UDExMastheadShell extends UI5Element {
733
777
  this.profileItem,
734
778
  this.profileMenu,
735
779
  this.cartItem,
780
+ this.supportItem,
736
781
  this.profileMenu,
737
782
  this.profileMenuLinks,
738
783
  this.countrySelectorItem,
@@ -772,6 +817,10 @@ class UDExMastheadShell extends UI5Element {
772
817
  return this.getSlottedNodes<UDExMastheadItem>("cart")[0];
773
818
  }
774
819
 
820
+ get supportItem(): MastheadItemType {
821
+ return this.getSlottedNodes<UDExMastheadItem>("support")[0];
822
+ }
823
+
775
824
  get profileMenu(): UDExMastheadProfileMenu {
776
825
  return this.querySelector("[udex-masthead-profile-menu]")!;
777
826
  }
@@ -804,6 +853,10 @@ class UDExMastheadShell extends UI5Element {
804
853
  return !!this.countrySelector.length;
805
854
  }
806
855
 
856
+ get hasSupport(): boolean {
857
+ return !!this.support.length;
858
+ }
859
+
807
860
  get hasMobileMenuButtons(): boolean {
808
861
  return !!this.mobileMenu.length;
809
862
  }
@@ -812,7 +865,7 @@ class UDExMastheadShell extends UI5Element {
812
865
  return BreakpointUtils.isAtMost("M");
813
866
  }
814
867
 
815
- get IsAtLeastBreakpointSizeM(): boolean {
868
+ get isAtLeastBreakpointSizeM(): boolean {
816
869
  return BreakpointUtils.isAtLeast("M");
817
870
  }
818
871
 
@@ -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}}"
@@ -7,9 +7,18 @@ import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
7
7
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
8
  import UDExTextField from "./TextField.js";
9
9
  import ValueState from "./types/common.js";
10
-
10
+ import "@ui5/webcomponents-icons/dist/hide.js";
11
+ import "@ui5/webcomponents-icons/dist/show.js";
11
12
  import PasswordFieldTemplate from "./generated/templates/PasswordFieldTemplate.lit.js";
12
13
 
14
+ // Styles
15
+ import PasswordFieldCss from "./generated/themes/PasswordField.css";
16
+
17
+ export enum PasswordFieldAutoComplete {
18
+ On = "on",
19
+ Off = "off",
20
+ }
21
+
13
22
  export enum InputType {
14
23
  Password = "password",
15
24
  Text = "text",
@@ -40,6 +49,7 @@ export enum IconType {
40
49
  @customElement({
41
50
  tag: "udex-password-field",
42
51
  renderer: litRender,
52
+ styles: PasswordFieldCss,
43
53
  template: PasswordFieldTemplate,
44
54
  dependencies: [UDExTextField],
45
55
  })
@@ -54,6 +64,14 @@ class UDExPasswordField extends UI5Element {
54
64
  @property({ type: String, noAttribute: true, defaultValue: InputType.Password })
55
65
  type!: InputType;
56
66
 
67
+ /**
68
+ * Defines the behaviour of autocomplete.
69
+ *
70
+ * @public
71
+ */
72
+ @property({ type: String, defaultValue: PasswordFieldAutoComplete.Off })
73
+ autocomplete!: `${PasswordFieldAutoComplete}`;
74
+
57
75
  /**
58
76
  * Defines whether the component is in disabled state.
59
77
  * <br><br>
@@ -244,7 +244,7 @@ class UDExSecondaryNavigation extends UI5Element {
244
244
  return item.closeDropdown();
245
245
  }
246
246
  if (isDown(e) && item.hasNestedItems) {
247
- item.openDropdown();
247
+ item.openDropdown(e);
248
248
  }
249
249
  }
250
250
 
@@ -293,12 +293,13 @@ class UDExSecondaryNavigation extends UI5Element {
293
293
  }
294
294
 
295
295
  handleItemClick(e: CustomEvent): void {
296
- const clickedItem = e.detail.item as UDExSecondaryNavigationItem;
296
+ const { index, item: detailItem, originalEvent: actualOriginalEvent } = e.detail;
297
+ const clickedItem = detailItem as UDExSecondaryNavigationItem;
297
298
  const {
298
299
  path, target, title, active, subItems, _id, mobileLinkTitle,
299
300
  } = clickedItem;
300
301
 
301
- const prevented = !this.fireEventItemClick(e, {
302
+ const prevented = !this.fireEventItemClick(actualOriginalEvent as Event, index as number, {
302
303
  path,
303
304
  target,
304
305
  title,
@@ -321,9 +322,10 @@ class UDExSecondaryNavigation extends UI5Element {
321
322
  }
322
323
 
323
324
  handleSubItemClick(e: CustomEvent): void {
325
+ const { originalEvent: actualOriginalEvent, index } = e.detail;
324
326
  const item = e.detail.item as UDExSecondaryNavigationSubItem;
325
327
  const { items } = item as NavItem;
326
- const prevented = !this.fireEventItemClick(e, item);
328
+ const prevented = !this.fireEventItemClick(actualOriginalEvent as Event, index as number, item);
327
329
 
328
330
  if (prevented) {
329
331
  e.preventDefault();
@@ -341,7 +343,8 @@ class UDExSecondaryNavigation extends UI5Element {
341
343
  }
342
344
 
343
345
  fireEventItemClick(
344
- e: CustomEvent,
346
+ e: Event,
347
+ clickedIndex: number,
345
348
  {
346
349
  items, target, path, title, active, mobileLinkTitle,
347
350
  }: NavItem,
@@ -356,7 +359,7 @@ class UDExSecondaryNavigation extends UI5Element {
356
359
  target,
357
360
  title,
358
361
  },
359
- clickedIndex: e.detail.index,
362
+ clickedIndex,
360
363
  }, true);
361
364
  }
362
365
 
@@ -173,7 +173,8 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
173
173
  this._subTitle = this.subActiveItemTitle || this._subTitle;
174
174
  }
175
175
 
176
- onSubItemClick(e: Event): void {
176
+ onSubItemClick(e: CustomEvent | KeyboardEvent): void {
177
+ const { originalEvent } = e.detail;
177
178
  const { index } = e.target as UDExSecondaryNavigationSubItem;
178
179
  const clickedItem = this._processedItems[index];
179
180
 
@@ -183,24 +184,21 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
183
184
  this.onShouldFocusFirstSubItem();
184
185
  }
185
186
 
186
- this.fireEvent("sub-item-click", {
187
- item: clickedItem,
188
- index,
189
- });
187
+ this.fireSubItemClickEvent(originalEvent as PointerEvent, clickedItem, index);
190
188
  }
191
189
 
192
190
  onBackClick(): void {
193
191
  this.setPrevNestedItems();
194
192
  }
195
193
 
196
- openDropdown(): void {
194
+ openDropdown(e: PointerEvent | KeyboardEvent): void {
197
195
  if (this.hasNestedItems) {
198
196
  this.setDropdownItems();
199
197
  this.isOpen = !this.isOpen;
200
198
  this.onShouldFocusFirstSubItem();
201
199
  }
202
200
 
203
- this.fireNavItemClickEvent();
201
+ this.fireNavItemClickEvent(e);
204
202
  }
205
203
 
206
204
  closeDropdown(): void {
@@ -209,7 +207,7 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
209
207
 
210
208
  handleItemLinkKeyDown(e: KeyboardEvent): void {
211
209
  if (isEnter(e) || isSpace(e)) {
212
- this.openDropdown();
210
+ this.fireNavItemClickEvent(e);
213
211
  }
214
212
  }
215
213
 
@@ -326,11 +324,20 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
326
324
  this.focus();
327
325
  }
328
326
 
329
- fireNavItemClickEvent(): void {
327
+ fireNavItemClickEvent(e: PointerEvent | KeyboardEvent): void {
330
328
  this.fireEvent("nav-item-click", {
331
329
  item: this,
332
330
  index: this.index,
333
- });
331
+ originalEvent: e,
332
+ }, true);
333
+ }
334
+
335
+ fireSubItemClickEvent(e: PointerEvent, clickedItem: NavItem, index: number): void {
336
+ this.fireEvent("sub-item-click", {
337
+ item: clickedItem,
338
+ index,
339
+ originalEvent: e,
340
+ }, true);
334
341
  }
335
342
 
336
343
  setDropdownHistory(): void {
@@ -88,14 +88,15 @@ class UDExSecondaryNavigationSubItem extends UDExSecondaryNavigationItemBase {
88
88
  UDExSecondaryNavigationSubItem.i18nBundle = await getI18nBundle("@sapudex/web-components");
89
89
  }
90
90
 
91
- onItemClick(): void {
91
+ onItemClick(e: PointerEvent): void {
92
92
  this.fireEvent("sub-item-click", {
93
93
  item: this,
94
- });
94
+ originalEvent: e,
95
+ }, true);
95
96
  }
96
97
 
97
- onBackItemClick(): void {
98
- this.fireEvent("back-item-click");
98
+ onBackItemClick(e: PointerEvent): void {
99
+ this.fireEvent("back-item-click", { originalEvent: e }, true);
99
100
  }
100
101
 
101
102
  get hasItems(): boolean {
package/src/Table.ts CHANGED
@@ -163,6 +163,13 @@ class UDExTable extends UI5Element {
163
163
  @slot()
164
164
  footnotes!: Array<HTMLElement>;
165
165
 
166
+ /**
167
+ * Defines the rows of the table.
168
+ * @public
169
+ */
170
+ @property({ type: String })
171
+ customColumns!: string;
172
+
166
173
  /**
167
174
  * Defines the table has vertical scrolling.
168
175
  *
@@ -382,7 +389,7 @@ class UDExTable extends UI5Element {
382
389
 
383
390
  return {
384
391
  table: {
385
- "grid-template-columns": this._gridTemplateColumns,
392
+ "grid-template-columns": this.customColumns || this._gridTemplateColumns,
386
393
  "max-height": this._tableMaxHeight,
387
394
  ...headerStyleMap,
388
395
  },
package/src/TextField.hbs CHANGED
@@ -19,6 +19,7 @@
19
19
  @click="{{handleClick}}"
20
20
  @keydown="{{handleKeydown}}"
21
21
  maxlength="{{maxlength}}"
22
+ autocomplete="{{autocomplete}}"
22
23
  ?disabled="{{disabled}}"
23
24
  ?readonly="{{isInputReadonly}}"
24
25
  ?required="{{required}}"
@@ -30,6 +31,7 @@
30
31
  aria-haspopup="{{accInfo.ariaHasPopup}}"
31
32
  aria-label="{{accInfo.ariaLabel}}"
32
33
  aria-labelledby="{{accInfo.ariaLabelledBy}}"
34
+ role="{{inputRole}}"
33
35
  part="textfield-input"
34
36
  min="{{min}}"
35
37
  max="{{max}}"
package/src/TextField.ts CHANGED
@@ -228,6 +228,14 @@ class UDExTextField extends UI5Element {
228
228
  @property({ type: String, noAttribute: true, defaultValue: "" })
229
229
  labelActiveClass!: string;
230
230
 
231
+ /**
232
+ * Defines the behaviour of autocomplete.
233
+ * @default "off"
234
+ * @public
235
+ */
236
+ @property({ type: String, defaultValue: "off" })
237
+ autocomplete!: string;
238
+
231
239
  /**
232
240
  * Defines the inner stored value of the readonly attribute of the input.
233
241
  *
@@ -358,6 +366,14 @@ class UDExTextField extends UI5Element {
358
366
  };
359
367
  }
360
368
 
369
+ get inputRole(): string | undefined {
370
+ return this.isAutoCompleteDisabled ? "presentation" : undefined;
371
+ }
372
+
373
+ get isAutoCompleteDisabled(): boolean {
374
+ return this.autocomplete === "off" || this.autocomplete === "new-password";
375
+ }
376
+
361
377
  handleKeydown(e: KeyboardEvent): void {
362
378
  e.stopPropagation();
363
379
  this.fireEvent<KeyboardEvent>("keydown", e);