@sapudex/web-components 0.111.0 → 0.114.2

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 (189) hide show
  1. package/.npmrc +1 -2
  2. package/bundle.esm.js +1 -0
  3. package/dist/AccordionItem.d.ts +7 -0
  4. package/dist/AccordionItem.js +6 -2
  5. package/dist/AccordionItem.js.map +1 -1
  6. package/dist/CountrySelector.d.ts +5 -7
  7. package/dist/CountrySelector.js +12 -7
  8. package/dist/CountrySelector.js.map +1 -1
  9. package/dist/Dropdown.d.ts +10 -0
  10. package/dist/Dropdown.js +10 -0
  11. package/dist/Dropdown.js.map +1 -1
  12. package/dist/Footer.d.ts +40 -1
  13. package/dist/Footer.js +151 -1
  14. package/dist/Footer.js.map +1 -1
  15. package/dist/InputGroup.d.ts +75 -0
  16. package/dist/InputGroup.js +101 -0
  17. package/dist/InputGroup.js.map +1 -0
  18. package/dist/MastheadMobileMenu.d.ts +4 -1
  19. package/dist/MastheadMobileMenu.js +10 -3
  20. package/dist/MastheadMobileMenu.js.map +1 -1
  21. package/dist/PhoneNumberField.d.ts +8 -0
  22. package/dist/PhoneNumberField.js +23 -10
  23. package/dist/PhoneNumberField.js.map +1 -1
  24. package/dist/Search.d.ts +58 -2
  25. package/dist/Search.js +159 -12
  26. package/dist/Search.js.map +1 -1
  27. package/dist/SecondaryNavigation.d.ts +5 -1
  28. package/dist/SecondaryNavigation.js +18 -2
  29. package/dist/SecondaryNavigation.js.map +1 -1
  30. package/dist/SelectBox.d.ts +6 -0
  31. package/dist/SelectBox.js +14 -1
  32. package/dist/SelectBox.js.map +1 -1
  33. package/dist/Table.d.ts +5 -5
  34. package/dist/Table.js +5 -5
  35. package/dist/Table.js.map +1 -1
  36. package/dist/Tag.d.ts +7 -1
  37. package/dist/Tag.js +6 -2
  38. package/dist/Tag.js.map +1 -1
  39. package/dist/TextArea.js.map +1 -1
  40. package/dist/assets/{bundle.esm-b7920968.js → bundle.esm-ab45813e.js} +181 -179
  41. package/dist/css/themes/AccordionItem.css +1 -1
  42. package/dist/css/themes/Breadcrumbs.css +1 -1
  43. package/dist/css/themes/CountrySelector.css +1 -1
  44. package/dist/css/themes/DatePicker.css +1 -1
  45. package/dist/css/themes/Dropdown.css +1 -1
  46. package/dist/css/themes/InputGroup.css +1 -0
  47. package/dist/css/themes/MastheadItem.css +1 -1
  48. package/dist/css/themes/MastheadMenuItem.css +1 -1
  49. package/dist/css/themes/MastheadShell.css +1 -1
  50. package/dist/css/themes/PhoneNumberField.css +1 -1
  51. package/dist/css/themes/RatingIndicator.css +1 -1
  52. package/dist/css/themes/Search.css +1 -1
  53. package/dist/css/themes/SearchSuggestions.css +1 -1
  54. package/dist/css/themes/Slider.css +1 -1
  55. package/dist/css/themes/Tag.css +1 -1
  56. package/dist/css/themes/TextField.css +1 -1
  57. package/dist/custom-elements-internal.json +405 -53
  58. package/dist/custom-elements.json +358 -52
  59. package/dist/features/SearchSuggestionsPopover.d.ts +3 -3
  60. package/dist/features/SearchSuggestionsPopover.js +16 -18
  61. package/dist/features/SearchSuggestionsPopover.js.map +1 -1
  62. package/dist/generated/templates/AccordionItemTemplate.lit.js +2 -1
  63. package/dist/generated/templates/AccordionItemTemplate.lit.js.map +1 -1
  64. package/dist/generated/templates/CountrySelectorTemplate.lit.js +1 -1
  65. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  66. package/dist/generated/templates/FooterTemplate.lit.js +15 -15
  67. package/dist/generated/templates/FooterTemplate.lit.js.map +1 -1
  68. package/dist/generated/templates/InputGroupTemplate.lit.d.ts +4 -0
  69. package/dist/generated/templates/InputGroupTemplate.lit.js +7 -0
  70. package/dist/generated/templates/InputGroupTemplate.lit.js.map +1 -0
  71. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +15 -10
  72. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  73. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +1 -1
  74. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
  75. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js +11 -10
  76. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js.map +1 -1
  77. package/dist/generated/templates/SearchTemplate.lit.js +11 -10
  78. package/dist/generated/templates/SearchTemplate.lit.js.map +1 -1
  79. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js +2 -1
  80. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js.map +1 -1
  81. package/dist/generated/themes/AccordionItem.css.js +1 -1
  82. package/dist/generated/themes/AccordionItem.css.js.map +1 -1
  83. package/dist/generated/themes/Breadcrumbs.css.js +1 -1
  84. package/dist/generated/themes/Breadcrumbs.css.js.map +1 -1
  85. package/dist/generated/themes/CountrySelector.css.js +1 -1
  86. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  87. package/dist/generated/themes/DatePicker.css.js +1 -1
  88. package/dist/generated/themes/DatePicker.css.js.map +1 -1
  89. package/dist/generated/themes/Dropdown.css.js +1 -1
  90. package/dist/generated/themes/Dropdown.css.js.map +1 -1
  91. package/dist/generated/themes/InputGroup.css.d.ts +3 -0
  92. package/dist/generated/themes/InputGroup.css.js +9 -0
  93. package/dist/generated/themes/InputGroup.css.js.map +1 -0
  94. package/dist/generated/themes/MastheadItem.css.js +1 -1
  95. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  96. package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
  97. package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
  98. package/dist/generated/themes/MastheadShell.css.js +1 -1
  99. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  100. package/dist/generated/themes/PhoneNumberField.css.js +1 -1
  101. package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
  102. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  103. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  104. package/dist/generated/themes/Search.css.js +1 -1
  105. package/dist/generated/themes/Search.css.js.map +1 -1
  106. package/dist/generated/themes/SearchSuggestions.css.js +1 -1
  107. package/dist/generated/themes/SearchSuggestions.css.js.map +1 -1
  108. package/dist/generated/themes/Slider.css.js +1 -1
  109. package/dist/generated/themes/Slider.css.js.map +1 -1
  110. package/dist/generated/themes/Tag.css.js +1 -1
  111. package/dist/generated/themes/Tag.css.js.map +1 -1
  112. package/dist/generated/themes/TextField.css.js +1 -1
  113. package/dist/generated/themes/TextField.css.js.map +1 -1
  114. package/dist/types/callback.d.ts +2 -0
  115. package/dist/types/callback.js +2 -0
  116. package/dist/types/callback.js.map +1 -0
  117. package/dist/utils/debounce.d.ts +2 -2
  118. package/dist/utils/debounce.js.map +1 -1
  119. package/dist/utils/retryUntilSuccessful.d.ts +3 -0
  120. package/dist/utils/retryUntilSuccessful.js +21 -0
  121. package/dist/utils/retryUntilSuccessful.js.map +1 -0
  122. package/dist/vscode.html-custom-data.json +48 -12
  123. package/dist/web-types.json +205 -29
  124. package/package.json +1 -1
  125. package/src/AccordionItem.hbs +12 -1
  126. package/src/AccordionItem.ts +11 -2
  127. package/src/CountrySelector.hbs +1 -2
  128. package/src/CountrySelector.ts +18 -20
  129. package/src/Dropdown.ts +10 -0
  130. package/src/Footer.hbs +154 -91
  131. package/src/Footer.ts +158 -1
  132. package/src/InputGroup.hbs +20 -0
  133. package/src/InputGroup.ts +136 -0
  134. package/src/MastheadMobileMenu.hbs +51 -28
  135. package/src/MastheadMobileMenu.ts +12 -3
  136. package/src/MastheadProfileMenu.hbs +1 -1
  137. package/src/PhoneNumberField.ts +27 -3
  138. package/src/Search.hbs +23 -1
  139. package/src/Search.ts +203 -15
  140. package/src/SearchSuggestions.hbs +46 -48
  141. package/src/SecondaryNavigation.hbs +6 -4
  142. package/src/SecondaryNavigation.ts +23 -3
  143. package/src/SelectBox.ts +22 -0
  144. package/src/Table.ts +7 -7
  145. package/src/Tag.ts +12 -3
  146. package/src/TextArea.ts +1 -1
  147. package/src/features/SearchSuggestionsPopover.ts +18 -20
  148. package/src/generated/templates/AccordionItemTemplate.lit.ts +2 -1
  149. package/src/generated/templates/CountrySelectorTemplate.lit.ts +1 -1
  150. package/src/generated/templates/FooterTemplate.lit.ts +15 -15
  151. package/src/generated/templates/InputGroupTemplate.lit.ts +12 -0
  152. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +15 -10
  153. package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +1 -1
  154. package/src/generated/templates/SearchSuggestionsTemplate.lit.ts +11 -10
  155. package/src/generated/templates/SearchTemplate.lit.ts +10 -9
  156. package/src/generated/templates/SecondaryNavigationTemplate.lit.ts +2 -1
  157. package/src/generated/themes/AccordionItem.css.ts +1 -1
  158. package/src/generated/themes/Breadcrumbs.css.ts +1 -1
  159. package/src/generated/themes/CountrySelector.css.ts +1 -1
  160. package/src/generated/themes/DatePicker.css.ts +1 -1
  161. package/src/generated/themes/Dropdown.css.ts +1 -1
  162. package/src/generated/themes/InputGroup.css.ts +13 -0
  163. package/src/generated/themes/MastheadItem.css.ts +1 -1
  164. package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
  165. package/src/generated/themes/MastheadShell.css.ts +1 -1
  166. package/src/generated/themes/PhoneNumberField.css.ts +1 -1
  167. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  168. package/src/generated/themes/Search.css.ts +1 -1
  169. package/src/generated/themes/SearchSuggestions.css.ts +1 -1
  170. package/src/generated/themes/Slider.css.ts +1 -1
  171. package/src/generated/themes/Tag.css.ts +1 -1
  172. package/src/generated/themes/TextField.css.ts +1 -1
  173. package/src/themes/AccordionItem.css +20 -15
  174. package/src/themes/Breadcrumbs.css +4 -2
  175. package/src/themes/CountrySelector.css +12 -1
  176. package/src/themes/DatePicker.css +1 -1
  177. package/src/themes/Dropdown.css +2 -2
  178. package/src/themes/InputGroup.css +19 -0
  179. package/src/themes/MastheadItem.css +2 -7
  180. package/src/themes/MastheadMenuItem.css +0 -4
  181. package/src/themes/MastheadShell.css +9 -10
  182. package/src/themes/PhoneNumberField.css +13 -3
  183. package/src/themes/Search.css +160 -17
  184. package/src/themes/SearchSuggestions.css +7 -1
  185. package/src/themes/Tag.css +6 -1
  186. package/src/themes/TextField.css +10 -1
  187. package/src/types/callback.ts +3 -0
  188. package/src/utils/debounce.ts +1 -1
  189. package/src/utils/retryUntilSuccessful.ts +23 -0
@@ -7,6 +7,7 @@ import executeTemplate from "@ui5/webcomponents-base/dist/renderer/executeTempla
7
7
  import { isEnter, isSpace } from "@ui5/webcomponents-base/dist/Keys.js";
8
8
  import event from "@ui5/webcomponents-base/dist/decorators/event.js";
9
9
  import Button from "@ui5/webcomponents/dist/Button.js";
10
+ import ResizeHandler, { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
10
11
  import { COUNTRY_SELECT } from "./generated/i18n/i18n-defaults.js";
11
12
  import CountrySelectorTemplate from "./generated/templates/CountrySelectorTemplate.lit.js";
12
13
  import SearchableListBaseTemplate from "./generated/templates/SearchableListBaseTemplate.lit.js";
@@ -23,12 +24,6 @@ import UDExListItem from "./ListItem.js";
23
24
  import "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
24
25
  import TextField from "./TextField.js";
25
26
 
26
- type CountryItem = {
27
- label: any,
28
- content: any,
29
- _id: any
30
- }
31
-
32
27
  /**
33
28
  * @class
34
29
  *
@@ -163,14 +158,6 @@ class CountrySelector extends UDExSearchableListBase {
163
158
  @property({ type: Boolean })
164
159
  required!: boolean;
165
160
 
166
- /**
167
- * Allows control over the width.
168
- *
169
- * @public
170
- */
171
- @property({ type: String })
172
- width?: string;
173
-
174
161
  /**
175
162
  * Allows control over the height.
176
163
  *
@@ -258,6 +245,8 @@ class CountrySelector extends UDExSearchableListBase {
258
245
  _dropdown!: UDExDropdown;
259
246
  _search!: Search;
260
247
 
248
+ _handleResizeBound: ResizeObserverCallback;
249
+
261
250
  static i18nBundle: I18nBundle;
262
251
 
263
252
  static async onDefine() {
@@ -267,9 +256,18 @@ class CountrySelector extends UDExSearchableListBase {
267
256
  constructor() {
268
257
  super();
269
258
  this._shouldFilterItems = false;
259
+ this._handleResizeBound = this._handleResize.bind(this);
270
260
  this._filteredItems = [];
271
261
  }
272
262
 
263
+ onEnterDOM(): void {
264
+ ResizeHandler.register(this, this._handleResizeBound);
265
+ }
266
+
267
+ onExitDOM(): void {
268
+ ResizeHandler.deregister(this, this._handleResizeBound);
269
+ }
270
+
273
271
  onBeforeRendering(): void {
274
272
  if (this.blockedCountryCodes?.length) {
275
273
  const blockedCountryCodesArray = this.blockedCountryCodes.split(",").map(code => code.trim().toUpperCase());
@@ -319,15 +317,15 @@ class CountrySelector extends UDExSearchableListBase {
319
317
  return SearchableListBaseTemplate;
320
318
  }
321
319
 
320
+ _handleResize() {
321
+ this._dropdown.style.setProperty("--udex-dropdown-pane-width", `${this.offsetWidth}px`);
322
+ }
323
+
322
324
  get ariaControls(): string | null | undefined {
323
325
  const list = this.shadowRoot!.querySelector<UDExList>("udex-list");
324
326
  return list?.getAttribute("id");
325
327
  }
326
328
 
327
- get holderWidth() {
328
- return this.width ? this.width : "auto";
329
- }
330
-
331
329
  get selectedCountryFlagX() {
332
330
  return this.selectedCountry?.flagX;
333
331
  }
@@ -444,10 +442,10 @@ class CountrySelector extends UDExSearchableListBase {
444
442
  const selected = country.iso.toUpperCase() === this.selectedCountry.iso.toUpperCase();
445
443
  this.items.push({
446
444
  label: this.getCountryLabel(country.countryName, country.localName),
447
- content: this.getItemTemplate(country),
445
+ innerHTML: this.getItemTemplate(country),
448
446
  selected,
449
447
  _id: country.iso.toUpperCase(),
450
- } as CountryItem as UDExListItem);
448
+ } as UDExListItem);
451
449
  });
452
450
  }
453
451
 
package/src/Dropdown.ts CHANGED
@@ -225,11 +225,21 @@ class UDExDropdown extends UI5Element {
225
225
  }
226
226
  }
227
227
 
228
+ /**
229
+ * Open dropdown
230
+ *
231
+ * @public
232
+ */
228
233
  onOpen(opener: HTMLElement): void {
229
234
  const dropdown = this.getDropdownPane();
230
235
  dropdown.showAt(opener);
231
236
  }
232
237
 
238
+ /**
239
+ * Close dropdown
240
+ *
241
+ * @public
242
+ */
233
243
  onClose():void {
234
244
  const dropdown = this.getDropdownPane();
235
245
  dropdown.close(true);
package/src/Footer.hbs CHANGED
@@ -5,7 +5,7 @@
5
5
  {{#if logoUrl}}
6
6
  <div class="udex-footer__logo">
7
7
  {{#if logoLink}}
8
- <a href="{{parsedRef}}">
8
+ <a href="{{parsedRef}}" @click="{{_onLogoClick}}">
9
9
  <img id="udex-footer__logo-image" src="{{logoUrl}}" class="udex-footer__logo-image" alt="{{logoAlt}}"/>
10
10
  </a>
11
11
  {{else}}
@@ -27,7 +27,7 @@
27
27
  <div>
28
28
  <span class="hidden" aria-hidden id="udex-footer__{{@index}}_phone-label">{{../phoneNumberAccessibleName}} {{this.country}} : {{this.number}}</span>
29
29
  <p class="udex-footer__country">{{this.country}}</p>
30
- <a href="tel:{{this.number}}" class="udex-footer__number" aria-labelledby="udex-footer__{{@index}}_phone-label">
30
+ <a href="tel:{{this.number}}" class="udex-footer__number" @click="{{../_onContactPhoneClick}}" aria-labelledby="udex-footer__{{@index}}_phone-label">
31
31
  {{this.number}}
32
32
  </a>
33
33
  </div>
@@ -36,7 +36,7 @@
36
36
  {{#if localCountryNumbersLink}}
37
37
  <p class="udex-footer__remark">
38
38
  {{completeListTitle}}
39
- <a href="{{this.localCountryNumbersLink}}">
39
+ <a href="{{this.localCountryNumbersLink}}" @click="{{_onContactPhoneLocalNumbersClick}}">
40
40
  {{localCountryTitle}}.
41
41
  </a>
42
42
  </p>
@@ -52,7 +52,12 @@
52
52
  <ui5-icon class="udex-footer__icon" name="email"></ui5-icon>
53
53
  </div>
54
54
  <span class="hidden" aria-hidden id="udex-footer__contact-us-label">{{contactUsAccessibleLabel}}</span>
55
- <a href="{{contactUsLink}}" class="udex-footer__contact-us-link" aria-labelledby="udex-footer__contact-us-label">{{contactUsAccessibleName}}</a>
55
+ <a
56
+ href="{{contactUsLink}}"
57
+ class="udex-footer__contact-us-link"
58
+ aria-labelledby="udex-footer__contact-us-label"
59
+ @click="{{_onContactEmailClick}}"
60
+ >{{contactUsAccessibleName}}</a>
56
61
  </div>
57
62
  </div>
58
63
  {{/if}}
@@ -62,7 +67,7 @@
62
67
  <div class="udex-footer__icon-container">
63
68
  <ui5-icon class="udex-footer__icon" name="discussion-2"></ui5-icon>
64
69
  </div>
65
- <a href="{{chatWithUsLink}}" class="udex-footer__chat-with-us-link">{{chatWithUsAccessibleName}}</a>
70
+ <a href="{{chatWithUsLink}}" class="udex-footer__chat-with-us-link" @click="{{_onContactChatClick}}">{{chatWithUsAccessibleName}}</a>
66
71
  </div>
67
72
  </div>
68
73
  {{/if}}
@@ -75,7 +80,12 @@
75
80
  <div class="udex-footer__social-container">
76
81
  {{#each socialLinksArray}}
77
82
  <div>
78
- <a href="{{this.url}}" class="udex-footer__social-icon">
83
+ <a
84
+ href="{{this.url}}"
85
+ class="udex-footer__social-icon"
86
+ data-name="{{this.name}}"
87
+ @click="{{../_onSocialMediaLinkClick}}"
88
+ >
79
89
  <img
80
90
  alt="{{this.name}} {{../socialIconAccessibleName}}"
81
91
  title="{{this.name}}"
@@ -107,7 +117,12 @@
107
117
  <div class="udex-footer__social-container">
108
118
  {{#each socialLinksArray}}
109
119
  <div>
110
- <a href="{{this.url}}" class="udex-footer__social-icon">
120
+ <a
121
+ href="{{this.url}}"
122
+ class="udex-footer__social-icon"
123
+ data-name="{{this.name}}"
124
+ @click="{{../_onSocialMediaLinkClick}}"
125
+ >
111
126
  <img
112
127
  alt="{{this.name}} {{../socialIconAccessibleName}}"
113
128
  src="{{this.iconUrl}}"
@@ -132,94 +147,142 @@
132
147
  </footer>
133
148
 
134
149
  {{#*inline "mobile-navigation"}}
135
- <udex-accordion class="udex-footer__accordion">
136
- {{#if quickLinksArray.length}}
137
- <udex-accordion-item title="{{quickLinksTitle}}" class="udex-footer__action-item">
138
- <ul class="udex-footer__links-list udex-footer__links-list--mobile">
139
- {{#each ../quickLinksArray}}
140
- <li><a aria-describedby="udex-footer__quick-links" href="{{this.url}}">{{this.title}}</a></li>
141
- {{/each}}
142
- </ul>
143
- </udex-accordion-item>
144
- <h3 class="udex-footer__links-item hidden" aria-hidden="true" id="udex-footer__quick-links">{{quickLinksTitle}}</h3>
145
- {{/if}}
150
+ <udex-accordion class="udex-footer__accordion">
151
+ {{#if quickLinksArray.length}}
152
+ <udex-accordion-item title="{{quickLinksTitle}}" class="udex-footer__action-item">
153
+ <ul class="udex-footer__links-list udex-footer__links-list--mobile">
154
+ {{#each ../quickLinksArray}}
155
+ <li>
156
+ <a
157
+ aria-describedby="udex-footer__quick-links"
158
+ href="{{this.url}}"
159
+ @click="{{../_onQuickLinksClick}}"
160
+ >{{this.title}}</a>
161
+ </li>
162
+ {{/each}}
163
+ </ul>
164
+ </udex-accordion-item>
165
+ <h3 class="udex-footer__links-item hidden" aria-hidden="true" id="udex-footer__quick-links">{{quickLinksTitle}}</h3>
166
+ {{/if}}
146
167
 
147
- {{#if trendingLinksArray.length}}
148
- <udex-accordion-item title="{{trendingTitle}}" class="udex-footer__action-item">
149
- <ul class="udex-footer__links-list udex-footer__links-list--mobile">
150
- {{#each trendingLinksArray}}
151
- <li><a aria-describedby="udex-footer__trending" href="{{this.url}}">{{this.title}}</a></li>
152
- {{/each}}
153
- </ul>
154
- </udex-accordion-item>
155
- <h3 class="udex-footer__links-item hidden" aria-hidden="true" id="udex-footer__trending">{{trendingTitle}}</h3>
156
- {{/if}}
168
+ {{#if trendingLinksArray.length}}
169
+ <udex-accordion-item title="{{trendingTitle}}" class="udex-footer__action-item">
170
+ <ul class="udex-footer__links-list udex-footer__links-list--mobile">
171
+ {{#each trendingLinksArray}}
172
+ <li>
173
+ <a
174
+ aria-describedby="udex-footer__footer__trending"
175
+ href="{{this.url}}"
176
+ @click="{{../_onTrendingClick}}"
177
+ >{{this.title}}</a>
178
+ </li>
179
+ {{/each}}
180
+ </ul>
181
+ </udex-accordion-item>
182
+ <h3 class="udex-footer__links-item hidden" aria-hidden="true" id="udex-footer__trending">{{trendingTitle}}</h3>
183
+ {{/if}}
157
184
 
158
- {{#if aboutLinksArray.length}}
159
- <udex-accordion-item title="{{aboutSapTitle}}" class="udex-footer__action-item">
160
- <ul class="udex-footer__links-list udex-footer__links-list--mobile">
161
- {{#each aboutLinksArray}}
162
- <li><a aria-describedby="udex-footer__about" href="{{this.url}}">{{this.title}}</a></li>
163
- {{/each}}
164
- </ul>
165
- </udex-accordion-item>
166
- <h3 class="udex-footer__links-item hidden" aria-hidden="true" id="udex-footer__about">{{aboutSapTitle}}</h3>
167
- {{/if}}
185
+ {{#if aboutLinksArray.length}}
186
+ <udex-accordion-item title="{{aboutSapTitle}}" class="udex-footer__action-item">
187
+ <ul class="udex-footer__links-list udex-footer__links-list--mobile">
188
+ {{#each aboutLinksArray}}
189
+ <li>
190
+ <a
191
+ aria-describedby="udex-footer__about"
192
+ href="{{this.url}}"
193
+ @click="{{../_onAboutSapClick}}"
194
+ >{{this.title}}</a>
195
+ </li>
196
+ {{/each}}
197
+ </ul>
198
+ </udex-accordion-item>
199
+ <h3 class="udex-footer__links-item hidden" aria-hidden="true" id="udex-footer__about">{{aboutSapTitle}}</h3>
200
+ {{/if}}
168
201
 
169
- {{#if siteInformationLinksArray.length}}
170
- <udex-accordion-item title="{{siteInformationTitle}}" class="udex-footer__action-item">
171
- <ul class="udex-footer__links-list udex-footer__links-list--mobile">
172
- {{#each siteInformationLinksArray}}
173
- <li><a aria-describedby="udex-footer__site-information" href="{{this.url}}">{{this.title}}</a></li>
174
- {{/each}}
175
- </ul>
176
- </udex-accordion-item>
177
- <h3 class="udex-footer__links-item hidden" aria-hidden="true" id="udex-footer__site-information">{{siteInformationTitle}}</h3>
178
- {{/if}}
179
- </udex-accordion>
202
+ {{#if siteInformationLinksArray.length}}
203
+ <udex-accordion-item title="{{siteInformationTitle}}" class="udex-footer__action-item">
204
+ <ul class="udex-footer__links-list udex-footer__links-list--mobile">
205
+ {{#each siteInformationLinksArray}}
206
+ <li>
207
+ <a
208
+ aria-describedby="udex-footer__site-information"
209
+ href="{{this.url}}"
210
+ @click="{{../_onSiteInformationClick}}"
211
+ >{{this.title}}</a>
212
+ </li>
213
+ {{/each}}
214
+ </ul>
215
+ </udex-accordion-item>
216
+ <h3 class="udex-footer__links-item hidden" aria-hidden="true" id="udex-footer__site-information">{{siteInformationTitle}}</h3>
217
+ {{/if}}
218
+ </udex-accordion>
180
219
  {{/inline}}
181
220
 
182
221
  {{#*inline "desktop-navigation"}}
183
- <div class="udex-footer__links">
184
- {{#if quickLinksArray.length}}
185
- <div class="udex-footer__links-group udex-footer__quick-links">
186
- <h3 class="udex-footer__links-item" id="udex-footer__quick-links">{{quickLinksTitle}}</h3>
187
- <ul class="udex-footer__links-list udex-footer__links-list--desktop">
188
- {{#each quickLinksArray}}
189
- <li><a aria-describedby="udex-footer__quick-links" href="{{this.url}}">{{this.title}}</a></li>
190
- {{/each}}
191
- </ul>
192
- </div>
193
- {{/if}}
194
- {{#if trendingLinksArray.length}}
195
- <div class="udex-footer__links-group udex-footer__trending-links">
196
- <h3 class="udex-footer__links-item" id="udex-footer__trending">{{trendingTitle}}</h3>
197
- <ul class="udex-footer__links-list udex-footer__links-list--desktop">
198
- {{#each trendingLinksArray}}
199
- <li><a aria-describedby="udex-footer__trending" href="{{this.url}}">{{this.title}}</a></li>
200
- {{/each}}
201
- </ul>
202
- </div>
203
- {{/if}}
204
- {{#if aboutLinksArray.length}}
205
- <div class="udex-footer__links-group udex-footer__about-links">
206
- <h3 class="udex-footer__links-item" id="udex-footer__about">{{aboutSapTitle}}</h3>
207
- <ul class="udex-footer__links-list udex-footer__links-list--desktop">
208
- {{#each aboutLinksArray}}
209
- <li><a aria-describedby="udex-footer__about" href="{{this.url}}">{{this.title}}</a></li>
210
- {{/each}}
211
- </ul>
212
- </div>
213
- {{/if}}
214
- {{#if siteInformationLinksArray.length}}
215
- <div class="udex-footer__links-group udex-footer__site-information-links">
216
- <h3 class="udex-footer__links-item" id="udex-footer__site-information">{{siteInformationTitle}}</h3>
217
- <ul class="udex-footer__links-list udex-footer__links-list--desktop">
218
- {{#each siteInformationLinksArray}}
219
- <li><a aria-describedby="udex-footer__site-information" href="{{this.url}}">{{this.title}}</a></li>
220
- {{/each}}
221
- </ul>
222
- </div>
223
- {{/if}}
224
- </div>
222
+ <div class="udex-footer__links">
223
+ {{#if quickLinksArray.length}}
224
+ <div class="udex-footer__links-group udex-footer__quick-links">
225
+ <h3 class="udex-footer__links-item" id="udex-footer__quick-links">{{quickLinksTitle}}</h3>
226
+ <ul class="udex-footer__links-list udex-footer__links-list--desktop">
227
+ {{#each quickLinksArray}}
228
+ <li>
229
+ <a
230
+ aria-describedby="udex-footer__quick-links"
231
+ href="{{this.url}}"
232
+ @click="{{../_onQuickLinksClick}}"
233
+ >{{this.title}}</a>
234
+ </li>
235
+ {{/each}}
236
+ </ul>
237
+ </div>
238
+ {{/if}}
239
+ {{#if trendingLinksArray.length}}
240
+ <div class="udex-footer__links-group udex-footer__trending-links">
241
+ <h3 class="udex-footer__links-item" id="udex-footer__trending">{{trendingTitle}}</h3>
242
+ <ul class="udex-footer__links-list udex-footer__links-list--desktop">
243
+ {{#each trendingLinksArray}}
244
+ <li>
245
+ <a
246
+ aria-describedby="udex-footer__footer__trending"
247
+ href="{{this.url}}"
248
+ @click="{{../_onTrendingClick}}"
249
+ >{{this.title}}</a>
250
+ </li>
251
+ {{/each}}
252
+ </ul>
253
+ </div>
254
+ {{/if}}
255
+ {{#if aboutLinksArray.length}}
256
+ <div class="udex-footer__links-group udex-footer__about-links">
257
+ <h3 class="udex-footer__links-item" id="udex-footer__about">{{aboutSapTitle}}</h3>
258
+ <ul class="udex-footer__links-list udex-footer__links-list--desktop">
259
+ {{#each aboutLinksArray}}
260
+ <li>
261
+ <a
262
+ aria-describedby="udex-footer__about"
263
+ href="{{this.url}}"
264
+ @click="{{../_onAboutSapClick}}"
265
+ >{{this.title}}</a>
266
+ </li>
267
+ {{/each}}
268
+ </ul>
269
+ </div>
270
+ {{/if}}
271
+ {{#if siteInformationLinksArray.length}}
272
+ <div class="udex-footer__links-group udex-footer__site-information-links">
273
+ <h3 class="udex-footer__links-item" id="udex-footer__site-information">{{siteInformationTitle}}</h3>
274
+ <ul class="udex-footer__links-list udex-footer__links-list--desktop">
275
+ {{#each siteInformationLinksArray}}
276
+ <li>
277
+ <a
278
+ aria-describedby="udex-footer__site-information"
279
+ href="{{this.url}}"
280
+ @click="{{../_onSiteInformationClick}}"
281
+ >{{this.title}}</a>
282
+ </li>
283
+ {{/each}}
284
+ </ul>
285
+ </div>
286
+ {{/if}}
287
+ </div>
225
288
  {{/inline}}
package/src/Footer.ts CHANGED
@@ -2,6 +2,7 @@ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
2
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
3
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
4
4
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
+ import event from "@ui5/webcomponents-base/dist/decorators/event.js";
5
6
  import ResizeHandler, { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
6
7
 
7
8
  import "@ui5/webcomponents-icons/dist/headset.js";
@@ -49,6 +50,21 @@ export type FooterContactNumber = {
49
50
  number: string;
50
51
  country: string;
51
52
  };
53
+
54
+ export const FooterBaseEvent = {
55
+ detail: {
56
+ originalEvent: { type: PointerEvent },
57
+ },
58
+ };
59
+
60
+ export const FooterDetailedEvent = {
61
+ detail: {
62
+ originalEvent: { type: PointerEvent },
63
+ name: { type: String },
64
+ sourceNode: { type: HTMLElement },
65
+ },
66
+ };
67
+
52
68
  /**
53
69
  * @class
54
70
  *
@@ -75,6 +91,75 @@ export type FooterContactNumber = {
75
91
  template: FooterTemplate,
76
92
  dependencies: [UDExAccordionItem],
77
93
  })
94
+ /**
95
+ * Triggered on click interaction with logo in footer
96
+ * @public
97
+ * @allowPreventDefault
98
+ */
99
+ @event("logo-click", FooterBaseEvent)
100
+ /**
101
+ * Triggered on click interaction with "Back to Top" button
102
+ * @public
103
+ * @allowPreventDefault
104
+ */
105
+ @event("back-to-top-click", FooterBaseEvent)
106
+
107
+ /**
108
+ * Triggered on click interaction with phone number link in footer
109
+ * @public
110
+ * @allowPreventDefault
111
+ */
112
+ @event("contact-phone-click", FooterBaseEvent)
113
+ /**
114
+ * Triggered on click interaction with local country numbers list link
115
+ * @public
116
+ * @allowPreventDefault
117
+ */
118
+ @event("contact-phone-local-numbers-click", FooterBaseEvent)
119
+ /**
120
+ * Triggered on click interaction with "Contact us by email" link
121
+ * @public
122
+ * @allowPreventDefault
123
+ */
124
+ @event("contact-email-click", FooterBaseEvent)
125
+ /**
126
+ * Triggered on click interaction with "Contact us by chat" link
127
+ * @public
128
+ * @allowPreventDefault
129
+ */
130
+ @event("contact-chat-click", FooterBaseEvent)
131
+
132
+ /**
133
+ * Triggered on click interaction with a link within "Quick Links" category
134
+ * @public
135
+ * @allowPreventDefault
136
+ */
137
+ @event("quick-links-click", FooterDetailedEvent)
138
+ /**
139
+ * Triggered on click interaction with a link within "Trending" category
140
+ * @public
141
+ * @allowPreventDefault
142
+ */
143
+ @event("trending-click", FooterDetailedEvent)
144
+ /**
145
+ * Triggered on click interaction with a link within "About SAP" category
146
+ * @public
147
+ * @allowPreventDefault
148
+ */
149
+ @event("about-sap-click", FooterDetailedEvent)
150
+ /**
151
+ * Triggered on click interaction with a link within "Site Information" category
152
+ * @public
153
+ * @allowPreventDefault
154
+ */
155
+ @event("site-information-click", FooterDetailedEvent)
156
+
157
+ /**
158
+ * Triggered on click interaction with any of the social media links within footer
159
+ * @public
160
+ * @allowPreventDefault
161
+ */
162
+ @event("social-media-link-click", FooterDetailedEvent)
78
163
  class UDExFooter extends UI5Element {
79
164
  /**
80
165
  * Defines the Logo URL
@@ -221,7 +306,9 @@ class UDExFooter extends UI5Element {
221
306
  this._shouldRenderMobileMenu = this.isMobile;
222
307
  }
223
308
 
224
- onBackToTopClick(): void {
309
+ onBackToTopClick(e: Event): void {
310
+ this.fireEvent("back-to-top-click", { originalEvent: e }, true);
311
+
225
312
  window.scrollTo(0, 0);
226
313
  }
227
314
 
@@ -311,6 +398,76 @@ class UDExFooter extends UI5Element {
311
398
  get isMobile(): boolean {
312
399
  return window.innerWidth <= BreakpointSizeS;
313
400
  }
401
+
402
+ _onLogoClick(e: Event): void {
403
+ this.fireEvent("logo-click", { originalEvent: e }, true);
404
+ }
405
+
406
+ _onContactPhoneClick(e: Event): void {
407
+ this.fireEvent("contact-phone-click", { originalEvent: e }, true);
408
+ }
409
+ _onContactPhoneLocalNumbersClick(e: Event): void {
410
+ this.fireEvent("contact-phone-local-numbers-click", { originalEvent: e }, true);
411
+ }
412
+ _onContactEmailClick(e: Event): void {
413
+ this.fireEvent("contact-email-click", { originalEvent: e }, true);
414
+ }
415
+ _onContactChatClick(e: Event): void {
416
+ this.fireEvent("contact-chat-click", { originalEvent: e }, true);
417
+ }
418
+
419
+ _onQuickLinksClick(e: Event): void {
420
+ const sourceNode = e.composedPath()[0]as HTMLElement;
421
+
422
+ this.fireEvent("quick-links-click", {
423
+ name: sourceNode.innerText,
424
+ originalEvent: e,
425
+ sourceNode,
426
+ }, true);
427
+ }
428
+
429
+ _onTrendingClick(e: Event): void {
430
+ const sourceNode = e.composedPath()[0]as HTMLElement;
431
+
432
+ this.fireEvent("trending-click", {
433
+ name: sourceNode.innerText,
434
+ originalEvent: e,
435
+ sourceNode,
436
+ }, true);
437
+ }
438
+
439
+ _onAboutSapClick(e: Event): void {
440
+ const sourceNode = e.composedPath()[0]as HTMLElement;
441
+
442
+ this.fireEvent("about-sap-click", {
443
+ name: sourceNode.innerText,
444
+ originalEvent: e,
445
+ sourceNode,
446
+ }, true);
447
+ }
448
+
449
+ _onSiteInformationClick(e: Event): void {
450
+ const sourceNode = e.composedPath()[0]as HTMLElement;
451
+
452
+ this.fireEvent("site-information-click", {
453
+ name: sourceNode.innerText,
454
+ originalEvent: e,
455
+ sourceNode,
456
+ }, true);
457
+ }
458
+
459
+ _onSocialMediaLinkClick(e: Event): void {
460
+ const nodes = e.composedPath() as HTMLElement[];
461
+ let sourceNode = nodes[0];
462
+
463
+ if (nodes[0] instanceof HTMLImageElement) { sourceNode = nodes[1]; }
464
+
465
+ this.fireEvent("social-media-link-click", {
466
+ name: sourceNode?.dataset?.name,
467
+ originalEvent: e,
468
+ sourceNode,
469
+ }, true);
470
+ }
314
471
  }
315
472
 
316
473
  UDExFooter.define();
@@ -0,0 +1,20 @@
1
+ <div id="{{_id}}-input-group"
2
+ class="udex-input-group__container"
3
+ role="group"
4
+ aria-describedby="{{_id}}-valueStateDesc"
5
+ >
6
+ <div class="udex-input-group__content">
7
+ {{#each _items}}
8
+ <div class="udex-input-group__item">
9
+ <slot name="{{this.item._individualSlot}}"></slot>
10
+ </div>
11
+ {{/each}}
12
+ </div>
13
+ {{#if valueStateText}}
14
+ <udex-status-message
15
+ supporting-text="{{valueStateText}}"
16
+ value-state="{{valueState}}">
17
+ </udex-status-message>
18
+ <span id="{{_id}}-valueStateDesc" class="hidden-text">{{valueStateText}}</span>
19
+ {{/if}}
20
+ </div>