@sapudex/web-components 2.3.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/.eslintignore +3 -0
  2. package/bundle.esm.js +2 -0
  3. package/cypress/fixtures/contact-numbers.ts +10 -0
  4. package/cypress/specs/Accordion.cy.tsx +24 -0
  5. package/cypress/specs/Contact.cy.tsx +92 -0
  6. package/cypress/specs/ContactItem.cy.tsx +56 -0
  7. package/cypress/support/commands.ts +31 -2
  8. package/cypress/support/component-imports.instrumented.ts +4 -0
  9. package/cypress/support/component-imports.src.ts +4 -0
  10. package/dist/Accordion.d.ts +7 -1
  11. package/dist/Accordion.js +3 -3
  12. package/dist/Accordion.js.map +1 -1
  13. package/dist/Assets.js +31 -0
  14. package/dist/Assets.js.map +1 -1
  15. package/dist/AssetsVariables.js +6 -1
  16. package/dist/AssetsVariables.js.map +1 -1
  17. package/dist/Contact.d.ts +102 -0
  18. package/dist/Contact.js +152 -0
  19. package/dist/Contact.js.map +1 -0
  20. package/dist/ContactItem.d.ts +67 -0
  21. package/dist/ContactItem.js +96 -0
  22. package/dist/ContactItem.js.map +1 -0
  23. package/dist/ContactItemTemplate.d.ts +2 -0
  24. package/dist/ContactItemTemplate.js +13 -0
  25. package/dist/ContactItemTemplate.js.map +1 -0
  26. package/dist/ContactTemplate.d.ts +4 -0
  27. package/dist/ContactTemplate.js +29 -0
  28. package/dist/ContactTemplate.js.map +1 -0
  29. package/dist/CountrySelector.d.ts +0 -2
  30. package/dist/CountrySelector.js +0 -4
  31. package/dist/CountrySelector.js.map +1 -1
  32. package/dist/Footer.d.ts +0 -1
  33. package/dist/Footer.js +7 -9
  34. package/dist/Footer.js.map +1 -1
  35. package/dist/List.d.ts +1 -1
  36. package/dist/List.js +1 -1
  37. package/dist/List.js.map +1 -1
  38. package/dist/MastheadCountrySelector.d.ts +6 -0
  39. package/dist/MastheadCountrySelector.js +8 -2
  40. package/dist/MastheadCountrySelector.js.map +1 -1
  41. package/dist/MastheadItem.d.ts +13 -10
  42. package/dist/MastheadItem.js +24 -27
  43. package/dist/MastheadItem.js.map +1 -1
  44. package/dist/MastheadMenu.d.ts +3 -1
  45. package/dist/MastheadMenu.js +5 -4
  46. package/dist/MastheadMenu.js.map +1 -1
  47. package/dist/MastheadMenuItem.d.ts +1 -1
  48. package/dist/MastheadMenuItem.js +1 -1
  49. package/dist/MastheadMenuItem.js.map +1 -1
  50. package/dist/MastheadMobileMenu.d.ts +6 -0
  51. package/dist/MastheadMobileMenu.js +13 -2
  52. package/dist/MastheadMobileMenu.js.map +1 -1
  53. package/dist/MastheadProfileMenu.d.ts +4 -5
  54. package/dist/MastheadProfileMenu.js +9 -4
  55. package/dist/MastheadProfileMenu.js.map +1 -1
  56. package/dist/MastheadShell.d.ts +12 -4
  57. package/dist/MastheadShell.js +19 -10
  58. package/dist/MastheadShell.js.map +1 -1
  59. package/dist/MessageStripTemplate.js +1 -1
  60. package/dist/MessageStripTemplate.js.map +1 -1
  61. package/dist/SearchableListBase.js +5 -1
  62. package/dist/SearchableListBase.js.map +1 -1
  63. package/dist/SecondaryNavigation.d.ts +0 -1
  64. package/dist/SecondaryNavigation.js +2 -4
  65. package/dist/SecondaryNavigation.js.map +1 -1
  66. package/dist/assets/{InputSuggestions-BgbbJ4tc.js → InputSuggestions-B7dpC1q9.js} +1 -1
  67. package/dist/assets/{ListItemStandardExpandableTextTemplate-onAnn1Tj.js → ListItemStandardExpandableTextTemplate-BF6mHEec.js} +1 -1
  68. package/dist/assets/{bundle.esm-CwUfibNQ.js → bundle.esm-BFePNrxi.js} +241 -231
  69. package/dist/assets/messagebundle_en-DXEe5nWA.js +1 -0
  70. package/dist/css/themes/Accordion.css +1 -1
  71. package/dist/css/themes/Button.css +1 -1
  72. package/dist/css/themes/Contact.css +1 -0
  73. package/dist/css/themes/ContactItem.css +1 -0
  74. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  75. package/dist/css/themes/Modal.css +1 -1
  76. package/dist/css/themes/RatingIndicator.css +1 -1
  77. package/dist/css/themes/Search.css +1 -1
  78. package/dist/css/themes/Slider.css +1 -1
  79. package/dist/css/themes/TabInOverflow.css +1 -1
  80. package/dist/custom-elements-internal.json +416 -21
  81. package/dist/custom-elements.json +393 -21
  82. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  83. package/dist/generated/i18n/i18n-defaults.d.ts +4 -1
  84. package/dist/generated/i18n/i18n-defaults.js +4 -1
  85. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  86. package/dist/generated/templates/AccordionTemplate.lit.js +4 -2
  87. package/dist/generated/templates/AccordionTemplate.lit.js.map +1 -1
  88. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js +3 -3
  89. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js.map +1 -1
  90. package/dist/generated/templates/MastheadItemTemplate.lit.js +25 -22
  91. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  92. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +1 -1
  93. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
  94. package/dist/generated/templates/MastheadMenuTemplate.lit.js +2 -2
  95. package/dist/generated/templates/MastheadMenuTemplate.lit.js.map +1 -1
  96. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +14 -14
  97. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  98. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +1 -1
  99. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
  100. package/dist/generated/templates/MastheadShellTemplate.lit.js +2 -2
  101. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  102. package/dist/generated/themes/Accordion.css.d.ts +1 -1
  103. package/dist/generated/themes/Accordion.css.js +1 -1
  104. package/dist/generated/themes/Accordion.css.js.map +1 -1
  105. package/dist/generated/themes/Button.css.d.ts +1 -1
  106. package/dist/generated/themes/Button.css.js +1 -1
  107. package/dist/generated/themes/Button.css.js.map +1 -1
  108. package/dist/generated/themes/Contact.css.d.ts +2 -0
  109. package/dist/generated/themes/Contact.css.js +8 -0
  110. package/dist/generated/themes/Contact.css.js.map +1 -0
  111. package/dist/generated/themes/ContactItem.css.d.ts +2 -0
  112. package/dist/generated/themes/ContactItem.css.js +8 -0
  113. package/dist/generated/themes/ContactItem.css.js.map +1 -0
  114. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  115. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  116. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  117. package/dist/generated/themes/Modal.css.d.ts +1 -1
  118. package/dist/generated/themes/Modal.css.js +1 -1
  119. package/dist/generated/themes/Modal.css.js.map +1 -1
  120. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  121. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  122. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  123. package/dist/generated/themes/Search.css.d.ts +1 -1
  124. package/dist/generated/themes/Search.css.js +1 -1
  125. package/dist/generated/themes/Search.css.js.map +1 -1
  126. package/dist/generated/themes/Slider.css.d.ts +1 -1
  127. package/dist/generated/themes/Slider.css.js +1 -1
  128. package/dist/generated/themes/Slider.css.js.map +1 -1
  129. package/dist/generated/themes/TabInOverflow.css.d.ts +1 -1
  130. package/dist/generated/themes/TabInOverflow.css.js +1 -1
  131. package/dist/generated/themes/TabInOverflow.css.js.map +1 -1
  132. package/dist/messagebundle.properties +8 -0
  133. package/dist/messagebundle_en.properties +4 -0
  134. package/dist/types/AnalyticsName.d.ts +5 -0
  135. package/dist/types/AnalyticsName.js +7 -0
  136. package/dist/types/AnalyticsName.js.map +1 -0
  137. package/dist/types/ContactItemIcon.d.ts +6 -0
  138. package/dist/types/ContactItemIcon.js +8 -0
  139. package/dist/types/ContactItemIcon.js.map +1 -0
  140. package/dist/types/EventRibbon.d.ts +38 -13
  141. package/dist/types/EventRibbon.js +39 -12
  142. package/dist/types/EventRibbon.js.map +1 -1
  143. package/dist/utils/parseArrayFromString.d.ts +2 -0
  144. package/dist/utils/parseArrayFromString.js +5 -0
  145. package/dist/utils/parseArrayFromString.js.map +1 -0
  146. package/dist/vscode.html-custom-data.json +90 -26
  147. package/dist/web-types.json +184 -16
  148. package/package.json +2 -2
  149. package/src/Accordion.hbs +13 -9
  150. package/src/Accordion.ts +7 -4
  151. package/src/Assets.ts +29 -0
  152. package/src/AssetsVariables.ts +6 -1
  153. package/src/Contact.ts +200 -0
  154. package/src/ContactItem.ts +119 -0
  155. package/src/ContactItemTemplate.tsx +22 -0
  156. package/src/ContactTemplate.tsx +105 -0
  157. package/src/CountrySelector.ts +0 -5
  158. package/src/Footer.ts +7 -10
  159. package/src/List.ts +1 -1
  160. package/src/MastheadCountrySelector.hbs +3 -0
  161. package/src/MastheadCountrySelector.ts +13 -3
  162. package/src/MastheadItem.hbs +8 -0
  163. package/src/MastheadItem.ts +36 -35
  164. package/src/MastheadMenu.hbs +6 -1
  165. package/src/MastheadMenu.ts +7 -5
  166. package/src/MastheadMenuItem.hbs +1 -1
  167. package/src/MastheadMenuItem.ts +2 -2
  168. package/src/MastheadMobileMenu.hbs +24 -9
  169. package/src/MastheadMobileMenu.ts +19 -3
  170. package/src/MastheadProfileMenu.hbs +2 -0
  171. package/src/MastheadProfileMenu.ts +13 -10
  172. package/src/MastheadShell.hbs +2 -0
  173. package/src/MastheadShell.ts +31 -14
  174. package/src/MessageStripTemplate.tsx +1 -0
  175. package/src/SearchableListBase.ts +6 -1
  176. package/src/SecondaryNavigation.ts +3 -5
  177. package/src/generated/i18n/i18n-defaults.ts +2 -2
  178. package/src/generated/templates/AccordionTemplate.lit.ts +4 -2
  179. package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +3 -3
  180. package/src/generated/templates/MastheadItemTemplate.lit.ts +25 -22
  181. package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +1 -1
  182. package/src/generated/templates/MastheadMenuTemplate.lit.ts +2 -2
  183. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +14 -14
  184. package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +1 -1
  185. package/src/generated/templates/MastheadShellTemplate.lit.ts +2 -2
  186. package/src/generated/themes/Accordion.css.ts +1 -1
  187. package/src/generated/themes/Button.css.ts +1 -1
  188. package/src/generated/themes/Contact.css.ts +9 -0
  189. package/src/generated/themes/ContactItem.css.ts +9 -0
  190. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  191. package/src/generated/themes/Modal.css.ts +1 -1
  192. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  193. package/src/generated/themes/Search.css.ts +1 -1
  194. package/src/generated/themes/Slider.css.ts +1 -1
  195. package/src/generated/themes/TabInOverflow.css.ts +1 -1
  196. package/src/i18n/messagebundle.properties +8 -0
  197. package/src/i18n/messagebundle_en.properties +4 -0
  198. package/src/themes/Accordion.css +1 -0
  199. package/src/themes/Button.css +8 -1
  200. package/src/themes/Contact.css +184 -0
  201. package/src/themes/ContactItem.css +44 -0
  202. package/src/themes/MastheadProfileMenu.css +2 -1
  203. package/src/themes/Modal.css +4 -4
  204. package/src/themes/Search.css +2 -1
  205. package/src/themes/TabInOverflow.css +1 -1
  206. package/src/types/AnalyticsName.ts +6 -0
  207. package/src/types/ContactItemIcon.ts +7 -0
  208. package/src/types/EventRibbon.ts +38 -13
  209. package/src/utils/parseArrayFromString.ts +5 -0
  210. package/dist/assets/messagebundle_en-CVKgy_9L.js +0 -1
package/src/Contact.ts ADDED
@@ -0,0 +1,200 @@
1
+ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
5
+ import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
6
+ import ContactTemplate from "./ContactTemplate.js";
7
+ import type UDExContactItem from "./ContactItem.js";
8
+ import type UI5ResponsivePopover from "@ui5/webcomponents/dist/ResponsivePopover.js";
9
+ import parseArrayFromString from "./utils/parseArrayFromString.js";
10
+ import {
11
+ LOCAL_COUNTRY_NAMES, COMPLETE_LIST_OF, CALL_US_TODAY, CONTACT_US,
12
+ } from "./generated/i18n/i18n-defaults.js";
13
+ import i18n from "@ui5/webcomponents-base/decorators/i18n.js";
14
+ import type I18nBundle from "@ui5/webcomponents-base/i18nBundle.js";
15
+
16
+ // Styles
17
+ import ContactCss from "./generated/themes/Contact.css.js";
18
+ import { BreakpointUtils } from "./utils/Breakpoints.js";
19
+
20
+ export type ContactNumber = {
21
+ number: string;
22
+ country: string;
23
+ };
24
+
25
+ /**
26
+ * @class
27
+ *
28
+ * <h3 class="comment-api-title">Overview</h3>
29
+ *
30
+ *
31
+ * <h3>Usage</h3>
32
+ *
33
+ * For the <code>udex-contact</code>
34
+ * <h3>ES6 Module Import</h3>
35
+ *
36
+ * <code>import "@sapudex/web-components/dist/Contact.js";</code>
37
+ *
38
+ * @constructor
39
+ * @extends UI5Element
40
+ * @tagname udex-contact
41
+ * @public
42
+ */
43
+ @customElement({
44
+ tag: "udex-contact",
45
+ renderer: jsxRenderer,
46
+ styles: ContactCss,
47
+ template: ContactTemplate,
48
+ })
49
+
50
+ class UDExContact extends UI5Element {
51
+ /**
52
+ * Defines the <code>text</code> for the contact button.
53
+ *
54
+ * @public
55
+ */
56
+ @property({ type: String })
57
+ buttonText!: string;
58
+
59
+ /**
60
+ * List of the contact numbers
61
+ *
62
+ * @default "[]"
63
+ * @public
64
+ */
65
+ @property({ type: String })
66
+ contactNumbers: string = "";
67
+
68
+ /**
69
+ * Defines the local country numbers link's href
70
+ *
71
+ * @default ""
72
+ * @public
73
+ */
74
+ @property({ type: String })
75
+ localCountryNumbersLink: string = "";
76
+
77
+ /**
78
+ * Defines if the initial focus should be prevented.
79
+ * @public
80
+ */
81
+ @property({ type: Boolean })
82
+ preventInitialFocus!: boolean;
83
+
84
+ /**
85
+ * Defines if the focus should be returned to the previously focused element.
86
+ * @public
87
+ */
88
+ @property({ type: Boolean })
89
+ preventFocusRestore!: boolean;
90
+
91
+ /**
92
+ * Defines the accessible name of the component.
93
+ * @default undefined
94
+ * @public
95
+ */
96
+ @property({ type: String })
97
+ accessibleName?: string;
98
+
99
+ /**
100
+ * Defines the IDs of the elements that label the component.
101
+ * @default undefined
102
+ * @public
103
+ */
104
+ @property({ type: String })
105
+ accessibleNameRef?: string;
106
+
107
+ /**
108
+ * Slot for list items.
109
+ *
110
+ * @slot items
111
+ * @public
112
+ */
113
+ @slot({ type: HTMLElement, "default": true })
114
+ items!: Array<UDExContactItem>;
115
+
116
+ /**
117
+ * Defines the mobile mode for component
118
+ *
119
+ * @private
120
+ */
121
+ @property({ type: Boolean })
122
+ _isMobileMode: boolean = BreakpointUtils.isAtMost("M");
123
+
124
+ _screenResizeHandler: () => void;
125
+ _screenResizeHandlerAttached?: boolean;
126
+
127
+ @i18n("@sapudex/web-components")
128
+ static i18nBundle: I18nBundle;
129
+
130
+ constructor() {
131
+ super();
132
+ this._screenResizeHandler = this._screenResize.bind(this);
133
+ }
134
+
135
+ onEnterDOM() {
136
+ this._attachScreenResizeHandler();
137
+ }
138
+
139
+ onExitDOM() {
140
+ this._detachScreenResizeHandler();
141
+ }
142
+
143
+ _openPopover(): void {
144
+ this._responsivePopover.open = !this._responsivePopover.open;
145
+ }
146
+
147
+ _closePopover(): void {
148
+ this._responsivePopover.open = false;
149
+ }
150
+
151
+ _screenResize(): void {
152
+ this._isMobileMode = BreakpointUtils.isAtMost("M");
153
+ }
154
+
155
+ _attachScreenResizeHandler(): void {
156
+ if (!this._screenResizeHandlerAttached) {
157
+ window.addEventListener("resize", this._screenResizeHandler);
158
+ this._screenResizeHandlerAttached = true;
159
+ }
160
+ }
161
+
162
+ _detachScreenResizeHandler(): void {
163
+ if (this._screenResizeHandlerAttached) {
164
+ window.removeEventListener("resize", this._screenResizeHandler);
165
+ this._screenResizeHandlerAttached = false;
166
+ }
167
+ }
168
+
169
+ get _contactNumbersArray(): ContactNumber[] {
170
+ return parseArrayFromString<ContactNumber>(this.contactNumbers);
171
+ }
172
+
173
+ get _responsivePopover(): UI5ResponsivePopover {
174
+ return this.shadowRoot!.querySelector<UI5ResponsivePopover>(".udex-contact__popover")!;
175
+ }
176
+
177
+ get _completeListTitle(): string {
178
+ return `${UDExContact.i18nBundle.getText(COMPLETE_LIST_OF)} `;
179
+ }
180
+
181
+ get _localCountryTitle(): string {
182
+ return UDExContact.i18nBundle.getText(LOCAL_COUNTRY_NAMES);
183
+ }
184
+
185
+ get _numbersTitle(): string {
186
+ return UDExContact.i18nBundle.getText(CALL_US_TODAY);
187
+ }
188
+
189
+ get _contactUsTitle(): string {
190
+ return UDExContact.i18nBundle.getText(CONTACT_US);
191
+ }
192
+
193
+ get _hasNumbersList(): boolean {
194
+ return this._contactNumbersArray.length > 0;
195
+ }
196
+ }
197
+
198
+ UDExContact.define();
199
+
200
+ export default UDExContact;
@@ -0,0 +1,119 @@
1
+ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
+ import slot from "@ui5/webcomponents-base/decorators/slot.js";
4
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
+ import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
6
+ import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
7
+ import ContactItemTemplate from "./ContactItemTemplate.js";
8
+ import { UDExTarget } from "./types/common.js";
9
+ import UDExContactItemIcon from "./types/ContactItemIcon.js";
10
+ import "@ui5/webcomponents-icons/dist/headset.js";
11
+ import "@ui5/webcomponents-icons/dist/discussion-2.js";
12
+ import "@ui5/webcomponents-icons/dist/email.js";
13
+
14
+ // Styles
15
+ import ContactItemCss from "./generated/themes/ContactItem.css.js";
16
+
17
+ type UDExContactItemClickEventDetail = {
18
+ originalEvent: Event,
19
+ item: UDExContactItem,
20
+ }
21
+
22
+ /**
23
+ * @class
24
+ *
25
+ * <h3 class="comment-api-title">Overview</h3>
26
+ *
27
+ *
28
+ * <h3>Usage</h3>
29
+ *
30
+ * For the <code>udex-contact-item</code>
31
+ * <h3>ES6 Module Import</h3>
32
+ *
33
+ * <code>import "@sapudex/web-components/dist/ContactItem.js";</code>
34
+ *
35
+ * @constructor
36
+ * @extends UI5Element
37
+ * @tagname udex-contact-item
38
+ * @public
39
+ */
40
+ @customElement({
41
+ tag: "udex-contact-item",
42
+ renderer: jsxRenderer,
43
+ styles: ContactItemCss,
44
+ template: ContactItemTemplate,
45
+ })
46
+
47
+ /**
48
+ * Fires when item is clicked
49
+ *
50
+ * @public
51
+ */
52
+ @event("item-click", {
53
+ bubbles: true,
54
+ cancelable: true,
55
+ })
56
+
57
+ class UDExContactItem extends UI5Element {
58
+ eventDetails!: {
59
+ "item-click": UDExContactItemClickEventDetail,
60
+ };
61
+
62
+ /**
63
+ * Defines the label for the item.
64
+ *
65
+ * @public
66
+ */
67
+ @property({ type: String })
68
+ label!: string;
69
+
70
+ /**
71
+ * Defines the href for the item.
72
+ *
73
+ * @public
74
+ */
75
+ @property({ type: String })
76
+ href!: string;
77
+
78
+ /**
79
+ * Defines the icon name for the item.
80
+ *
81
+ * @public
82
+ */
83
+ @property({ type: String })
84
+ icon?: `${UDExContactItemIcon}`;
85
+
86
+ /**
87
+ * Defines target for the item
88
+ *
89
+ * @public
90
+ */
91
+ @property({ type: String })
92
+ target: `${UDExTarget}` = UDExTarget._self;
93
+
94
+ /**
95
+ * Slot for the item content.
96
+ *
97
+ * @slot
98
+ * @public
99
+ */
100
+ @slot({ type: Node, "default": true })
101
+ content!: Array<Node>;
102
+
103
+ _fireItemClickEvent(e: Event): void {
104
+ this.fireDecoratorEvent("item-click", {
105
+ item: this,
106
+ originalEvent: e,
107
+ });
108
+ }
109
+
110
+ get _iconName(): string | undefined {
111
+ if (this.icon) {
112
+ return UDExContactItemIcon[this.icon].toLowerCase();
113
+ }
114
+ }
115
+ }
116
+
117
+ UDExContactItem.define();
118
+
119
+ export default UDExContactItem;
@@ -0,0 +1,22 @@
1
+ import type ContactItem from "./ContactItem.js";
2
+ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
3
+ import UDExLink from "./Link.js";
4
+
5
+ export default function ContactItemTemplate(this: ContactItem) {
6
+ return (
7
+ <div class="udex-contact-item">
8
+ {this.icon && <UI5Icon class="udex-contact-item__icon" name={this._iconName} mode="Decorative"></UI5Icon>}
9
+ <div class="udex-contact-item__content">
10
+ {labelContent.call(this)}
11
+ <p class="udex-contact-item__description"><slot></slot></p>
12
+ </div>
13
+ </div>
14
+ );
15
+ }
16
+
17
+ function labelContent(this: ContactItem) {
18
+ if (this.href) {
19
+ return <UDExLink onClick={this._fireItemClickEvent} target={this.target} class="udex-contact-item__link" href={this.href}>{this.label}</UDExLink>;
20
+ }
21
+ return <span class="udex-contact-item__text">{this.label}</span>;
22
+ }
@@ -0,0 +1,105 @@
1
+ import type Contact from "./Contact.js";
2
+ import UDExButtonSize from "./types/ButtonSize.js";
3
+ import UDExButtonDesign from "./types/ButtonDesign.js";
4
+ import UDExButton from "./Button.js";
5
+ import UDExLink from "./Link.js";
6
+ import ButtonType from "@ui5/webcomponents/dist/types/ButtonType.js";
7
+ import UI5ResponsivePopover from "@ui5/webcomponents/dist/ResponsivePopover.js";
8
+ import PopoverPlacement from "@ui5/webcomponents/dist/types/PopoverPlacement.js";
9
+ import PopoverHorizontalAlign from "@ui5/webcomponents/dist/types/PopoverHorizontalAlign.js";
10
+ import PopupAccessibleRole from "@ui5/webcomponents/dist/types/PopupAccessibleRole.js";
11
+ import UDExButtonAccessibleRole from "./types/ButtonAccessibleRole.js";
12
+ import "@ui5/webcomponents-icons/dist/discussion-2.js";
13
+ import "@ui5/webcomponents-icons/dist/decline.js";
14
+
15
+ export default function ContactTemplate(this: Contact) {
16
+ return (
17
+ <div class="udex-contact">
18
+ {responsivePopover.call(this)}
19
+ {openerButton.call(this)}
20
+ </div>
21
+ );
22
+ }
23
+
24
+ function responsivePopover(this: Contact) {
25
+ return (
26
+ <UI5ResponsivePopover
27
+ id={`${this._id}-popover`}
28
+ opener={`${this._id}-opener`}
29
+ class="udex-contact__popover"
30
+ placement={PopoverPlacement.Top}
31
+ horizontalAlign={PopoverHorizontalAlign.End}
32
+ accessible-role={PopupAccessibleRole.Dialog}
33
+ preventInitialFocus={this.preventInitialFocus}
34
+ preventFocusRestore={this.preventFocusRestore}
35
+ accessibleName={this.accessibleName}
36
+ accessibleNameRef={this.accessibleNameRef}
37
+ hideArrow={true}>
38
+ <div
39
+ class={{
40
+ "udex-contact__call-us": true,
41
+ "udex-contact__call-us_empty": !this._hasNumbersList,
42
+ }}>
43
+ {!this._hasNumbersList && <span class="udex-contact__call-us-heading">{this._contactUsTitle}</span>}
44
+ <UDExButton
45
+ class="udex-contact__close-btn"
46
+ icon="sap-icon://decline"
47
+ type="Button"
48
+ onClick={this._closePopover}
49
+ size={UDExButtonSize.Medium}
50
+ design={UDExButtonDesign.Invisible}
51
+ accessible-role={UDExButtonAccessibleRole.Button}
52
+ icon-only>
53
+ </UDExButton>
54
+ {this._hasNumbersList && callUsSection.call(this)}
55
+ </div>
56
+ <div class="udex-contact__items"><slot></slot></div>
57
+ </UI5ResponsivePopover>
58
+ );
59
+ }
60
+
61
+ function openerButton(this: Contact) {
62
+ return (
63
+ <div id={`${this._id}-opener`} class="udex-contact__opener">
64
+ <UDExButton
65
+ onClick={this._openPopover}
66
+ class="udex-contact__button"
67
+ design={UDExButtonDesign.Primary}
68
+ size={UDExButtonSize.Large}
69
+ type={ButtonType.Button}
70
+ accessibleName={this._isMobileMode ? this.buttonText : undefined}
71
+ tooltip={this._isMobileMode ? this.buttonText : undefined}
72
+ icon="sap-icon://discussion-2">
73
+ {!this._isMobileMode && this.buttonText}
74
+ </UDExButton>
75
+ </div>
76
+ );
77
+ }
78
+
79
+ function callUsSection(this: Contact) {
80
+ return (
81
+ <>
82
+ <h4 class="udex-contact__call-us-title">{this._numbersTitle}</h4>
83
+ <div class="udex-contact__numbers">
84
+ {this._contactNumbersArray.map(({ number, country }) => (
85
+ <div class="udex-contact__number-wrapper">
86
+ <span class="udex-contact__country">{country}</span>
87
+ <UDExLink
88
+ class="udex-contact__number"
89
+ href={"tel:".concat(number)}>
90
+ {number}
91
+ </UDExLink>
92
+ </div>
93
+ ))}
94
+ </div>
95
+ <p class="udex-contact__complete-list">
96
+ {this._completeListTitle}
97
+ <UDExLink
98
+ class="udex-contact__local-country-link"
99
+ href={this.localCountryNumbersLink}>
100
+ {this._localCountryTitle}
101
+ </UDExLink>
102
+ </p>
103
+ </>
104
+ );
105
+ }
@@ -1,8 +1,6 @@
1
1
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
2
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
3
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
- import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
5
- import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
6
4
  import executeTemplate from "@ui5/webcomponents-base/dist/renderer/executeTemplate.js";
7
5
  import {
8
6
  isEscape,
@@ -273,9 +271,6 @@ class UDExCountrySelector extends UDExSearchableListBase {
273
271
  _search!: Search;
274
272
  _handleResizeBound: ResizeObserverCallback;
275
273
 
276
- @i18n("@sapudex/web-components")
277
- static i18nBundle: I18nBundle;
278
-
279
274
  constructor() {
280
275
  super();
281
276
  this._shouldFilterItems = false;
package/src/Footer.ts CHANGED
@@ -16,6 +16,7 @@ import UDExLink from "./Link.js";
16
16
  import UDExDivider from "./Divider.js";
17
17
  import type { UDExTarget } from "./types/common.js";
18
18
  import { BreakpointUtils } from "./utils/Breakpoints.js";
19
+ import parseArrayFromString from "./utils/parseArrayFromString.js";
19
20
 
20
21
  // Template
21
22
  import FooterTemplate from "./generated/templates/FooterTemplate.lit.js";
@@ -394,36 +395,32 @@ class UDExFooter extends UI5Element {
394
395
  window.scrollTo(0, 0);
395
396
  }
396
397
 
397
- parseArrayFromString<T>(string: string): T[] {
398
- return string ? JSON.parse(string) as T[] : [];
399
- }
400
-
401
398
  get parsedRef(): string | undefined {
402
399
  return (this.logoLink && this.logoLink.length > 0) ? this.logoLink : undefined;
403
400
  }
404
401
 
405
402
  get quickLinksArray(): FooterLink[] {
406
- return this.parseArrayFromString<FooterLink>(this.quickLinks);
403
+ return parseArrayFromString<FooterLink>(this.quickLinks);
407
404
  }
408
405
 
409
406
  get trendingLinksArray(): FooterLink[] {
410
- return this.parseArrayFromString<FooterLink>(this.trendingLinks);
407
+ return parseArrayFromString<FooterLink>(this.trendingLinks);
411
408
  }
412
409
 
413
410
  get aboutLinksArray(): FooterLink[] {
414
- return this.parseArrayFromString<FooterLink>(this.aboutLinks);
411
+ return parseArrayFromString<FooterLink>(this.aboutLinks);
415
412
  }
416
413
 
417
414
  get siteInformationLinksArray(): FooterLink[] {
418
- return this.parseArrayFromString<FooterLink>(this.siteInformationLinks);
415
+ return parseArrayFromString<FooterLink>(this.siteInformationLinks);
419
416
  }
420
417
 
421
418
  get contactNumbersArray(): FooterContactNumber[] {
422
- return this.parseArrayFromString<FooterContactNumber>(this.contactNumbersList);
419
+ return parseArrayFromString<FooterContactNumber>(this.contactNumbersList);
423
420
  }
424
421
 
425
422
  get socialLinksArray(): FooterSocialLink[] {
426
- return this.parseArrayFromString<FooterSocialLink>(this.socialLinks);
423
+ return parseArrayFromString<FooterSocialLink>(this.socialLinks);
427
424
  }
428
425
 
429
426
  get isContactContainerVisible(): boolean {
package/src/List.ts CHANGED
@@ -42,7 +42,7 @@ type UDExListSelectionChangeEventDetail = {
42
42
  * @class
43
43
  *
44
44
  * <h3 class="comment-api-title">Overview</h3>
45
- *\e
45
+ *
46
46
  *
47
47
  * <h3>Usage</h3>
48
48
  *
@@ -9,6 +9,7 @@
9
9
  @click="{{backToRegions}}"
10
10
  label="{{_activeRegion?.title}}"
11
11
  type="Button"
12
+ part="menu-item"
12
13
  is-back
13
14
  icon-start>
14
15
  </udex-masthead-menu-item>
@@ -35,6 +36,7 @@
35
36
  url="{{this.url}}"
36
37
  label="{{this.displayTitle}}"
37
38
  index="{{@index}}"
39
+ part="menu-item"
38
40
  is-nav-item>
39
41
  </udex-masthead-menu-item>
40
42
  </li>
@@ -55,6 +57,7 @@
55
57
  aria-has-popup="true"
56
58
  accessible-role="button"
57
59
  type="Button"
60
+ part="menu-item"
58
61
  is-nav-item
59
62
  has-border
60
63
  icon-end
@@ -11,8 +11,8 @@ import {
11
11
  } from "@ui5/webcomponents-base/dist/Keys.js";
12
12
  import UDExMastheadMenuItem from "./MastheadMenuItem.js";
13
13
  import UDExSearch, { Mode as UDExSearchMode } from "./Search.js";
14
-
15
14
  import MastheadCountrySelectorTemplate from "./generated/templates/MastheadCountrySelectorTemplate.lit.js";
15
+ import AnalyticsName from "./types/AnalyticsName.js";
16
16
 
17
17
  // Styles
18
18
  import MastheadCountrySelectorCss from "./generated/themes/MastheadCountrySelector.css.js";
@@ -23,6 +23,8 @@ type UDExMastheadCountrySelectorRegionClickEventDetail = {
23
23
  countries: Array<Country>,
24
24
  },
25
25
  originalEvent: Event,
26
+ analyticsName: AnalyticsName,
27
+ sourceNode: HTMLElement,
26
28
  }
27
29
 
28
30
  type UDExMastheadCountrySelectorItemClickEventDetail = {
@@ -32,10 +34,13 @@ type UDExMastheadCountrySelectorItemClickEventDetail = {
32
34
  url: string,
33
35
  },
34
36
  originalEvent: Event,
37
+ analyticsName: AnalyticsName,
38
+ sourceNode: HTMLElement,
35
39
  }
36
40
 
37
41
  type UDExMastheadCountrySelectorSearchEventDetail = {
38
42
  value: string,
43
+ analyticsName: AnalyticsName,
39
44
  }
40
45
 
41
46
  export type Region = {
@@ -287,6 +292,7 @@ class UDExMastheadCountrySelector extends UI5Element {
287
292
  this._shouldFocusBackBtn = false;
288
293
  this.fireDecoratorEvent("country-selector-search", {
289
294
  value: e.detail.value,
295
+ analyticsName: AnalyticsName.Header,
290
296
  });
291
297
  this.refreshRendering();
292
298
  }
@@ -412,14 +418,16 @@ class UDExMastheadCountrySelector extends UI5Element {
412
418
  }
413
419
 
414
420
  fireEventRegionItemClick(e: CustomEvent | KeyboardEvent): void {
415
- const { label } = e.target as UDExMastheadMenuItem;
421
+ const item = e.target as UDExMastheadMenuItem;
416
422
 
417
423
  this.fireDecoratorEvent("region-item-click", {
418
424
  item: {
419
- title: label,
425
+ title: item.label,
420
426
  countries: this._activeRegion?.countries || [],
421
427
  },
422
428
  originalEvent: e,
429
+ analyticsName: AnalyticsName.Header,
430
+ sourceNode: item.shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
423
431
  });
424
432
  }
425
433
 
@@ -434,6 +442,8 @@ class UDExMastheadCountrySelector extends UI5Element {
434
442
  url: url || "",
435
443
  },
436
444
  originalEvent: e,
445
+ analyticsName: AnalyticsName.Header,
446
+ sourceNode: item.shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
437
447
  });
438
448
  }
439
449
 
@@ -65,8 +65,16 @@
65
65
  {{else if image}}
66
66
  <img
67
67
  class="udex-masthead-item__image"
68
+ id="{{this._id}}_image-alt"
68
69
  src="{{image}}"
69
70
  alt="{{imageAlt}}"/>
71
+ {{#if imageAlt}}
72
+ <span
73
+ id="image-desc"
74
+ class="udex-masthead-hidden-text">
75
+ {{imageAlt}}
76
+ </span>
77
+ {{/if}}
70
78
  {{else}}
71
79
  <span class="udex-masthead-item__text">
72
80
  <slot></slot>