@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.
- package/.eslintignore +3 -0
- package/bundle.esm.js +2 -0
- package/cypress/fixtures/contact-numbers.ts +10 -0
- package/cypress/specs/Accordion.cy.tsx +24 -0
- package/cypress/specs/Contact.cy.tsx +92 -0
- package/cypress/specs/ContactItem.cy.tsx +56 -0
- package/cypress/support/commands.ts +31 -2
- package/cypress/support/component-imports.instrumented.ts +4 -0
- package/cypress/support/component-imports.src.ts +4 -0
- package/dist/Accordion.d.ts +7 -1
- package/dist/Accordion.js +3 -3
- package/dist/Accordion.js.map +1 -1
- package/dist/Assets.js +31 -0
- package/dist/Assets.js.map +1 -1
- package/dist/AssetsVariables.js +6 -1
- package/dist/AssetsVariables.js.map +1 -1
- package/dist/Contact.d.ts +102 -0
- package/dist/Contact.js +152 -0
- package/dist/Contact.js.map +1 -0
- package/dist/ContactItem.d.ts +67 -0
- package/dist/ContactItem.js +96 -0
- package/dist/ContactItem.js.map +1 -0
- package/dist/ContactItemTemplate.d.ts +2 -0
- package/dist/ContactItemTemplate.js +13 -0
- package/dist/ContactItemTemplate.js.map +1 -0
- package/dist/ContactTemplate.d.ts +4 -0
- package/dist/ContactTemplate.js +29 -0
- package/dist/ContactTemplate.js.map +1 -0
- package/dist/CountrySelector.d.ts +0 -2
- package/dist/CountrySelector.js +0 -4
- package/dist/CountrySelector.js.map +1 -1
- package/dist/Footer.d.ts +0 -1
- package/dist/Footer.js +7 -9
- package/dist/Footer.js.map +1 -1
- package/dist/List.d.ts +1 -1
- package/dist/List.js +1 -1
- package/dist/List.js.map +1 -1
- package/dist/MastheadCountrySelector.d.ts +6 -0
- package/dist/MastheadCountrySelector.js +8 -2
- package/dist/MastheadCountrySelector.js.map +1 -1
- package/dist/MastheadItem.d.ts +13 -10
- package/dist/MastheadItem.js +24 -27
- package/dist/MastheadItem.js.map +1 -1
- package/dist/MastheadMenu.d.ts +3 -1
- package/dist/MastheadMenu.js +5 -4
- package/dist/MastheadMenu.js.map +1 -1
- package/dist/MastheadMenuItem.d.ts +1 -1
- package/dist/MastheadMenuItem.js +1 -1
- package/dist/MastheadMenuItem.js.map +1 -1
- package/dist/MastheadMobileMenu.d.ts +6 -0
- package/dist/MastheadMobileMenu.js +13 -2
- package/dist/MastheadMobileMenu.js.map +1 -1
- package/dist/MastheadProfileMenu.d.ts +4 -5
- package/dist/MastheadProfileMenu.js +9 -4
- package/dist/MastheadProfileMenu.js.map +1 -1
- package/dist/MastheadShell.d.ts +12 -4
- package/dist/MastheadShell.js +19 -10
- package/dist/MastheadShell.js.map +1 -1
- package/dist/MessageStripTemplate.js +1 -1
- package/dist/MessageStripTemplate.js.map +1 -1
- package/dist/SearchableListBase.js +5 -1
- package/dist/SearchableListBase.js.map +1 -1
- package/dist/SecondaryNavigation.d.ts +0 -1
- package/dist/SecondaryNavigation.js +2 -4
- package/dist/SecondaryNavigation.js.map +1 -1
- package/dist/assets/{InputSuggestions-BgbbJ4tc.js → InputSuggestions-B7dpC1q9.js} +1 -1
- package/dist/assets/{ListItemStandardExpandableTextTemplate-onAnn1Tj.js → ListItemStandardExpandableTextTemplate-BF6mHEec.js} +1 -1
- package/dist/assets/{bundle.esm-CwUfibNQ.js → bundle.esm-BFePNrxi.js} +241 -231
- package/dist/assets/messagebundle_en-DXEe5nWA.js +1 -0
- package/dist/css/themes/Accordion.css +1 -1
- package/dist/css/themes/Button.css +1 -1
- package/dist/css/themes/Contact.css +1 -0
- package/dist/css/themes/ContactItem.css +1 -0
- package/dist/css/themes/MastheadProfileMenu.css +1 -1
- package/dist/css/themes/Modal.css +1 -1
- package/dist/css/themes/RatingIndicator.css +1 -1
- package/dist/css/themes/Search.css +1 -1
- package/dist/css/themes/Slider.css +1 -1
- package/dist/css/themes/TabInOverflow.css +1 -1
- package/dist/custom-elements-internal.json +416 -21
- package/dist/custom-elements.json +393 -21
- package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
- package/dist/generated/i18n/i18n-defaults.d.ts +4 -1
- package/dist/generated/i18n/i18n-defaults.js +4 -1
- package/dist/generated/i18n/i18n-defaults.js.map +1 -1
- package/dist/generated/templates/AccordionTemplate.lit.js +4 -2
- package/dist/generated/templates/AccordionTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js +3 -3
- package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadItemTemplate.lit.js +25 -22
- package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +1 -1
- package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadMenuTemplate.lit.js +2 -2
- package/dist/generated/templates/MastheadMenuTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +14 -14
- package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +1 -1
- package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadShellTemplate.lit.js +2 -2
- package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
- package/dist/generated/themes/Accordion.css.d.ts +1 -1
- package/dist/generated/themes/Accordion.css.js +1 -1
- package/dist/generated/themes/Accordion.css.js.map +1 -1
- package/dist/generated/themes/Button.css.d.ts +1 -1
- package/dist/generated/themes/Button.css.js +1 -1
- package/dist/generated/themes/Button.css.js.map +1 -1
- package/dist/generated/themes/Contact.css.d.ts +2 -0
- package/dist/generated/themes/Contact.css.js +8 -0
- package/dist/generated/themes/Contact.css.js.map +1 -0
- package/dist/generated/themes/ContactItem.css.d.ts +2 -0
- package/dist/generated/themes/ContactItem.css.js +8 -0
- package/dist/generated/themes/ContactItem.css.js.map +1 -0
- package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
- package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
- package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
- package/dist/generated/themes/Modal.css.d.ts +1 -1
- package/dist/generated/themes/Modal.css.js +1 -1
- package/dist/generated/themes/Modal.css.js.map +1 -1
- package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
- package/dist/generated/themes/RatingIndicator.css.js +1 -1
- package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
- package/dist/generated/themes/Search.css.d.ts +1 -1
- package/dist/generated/themes/Search.css.js +1 -1
- package/dist/generated/themes/Search.css.js.map +1 -1
- package/dist/generated/themes/Slider.css.d.ts +1 -1
- package/dist/generated/themes/Slider.css.js +1 -1
- package/dist/generated/themes/Slider.css.js.map +1 -1
- package/dist/generated/themes/TabInOverflow.css.d.ts +1 -1
- package/dist/generated/themes/TabInOverflow.css.js +1 -1
- package/dist/generated/themes/TabInOverflow.css.js.map +1 -1
- package/dist/messagebundle.properties +8 -0
- package/dist/messagebundle_en.properties +4 -0
- package/dist/types/AnalyticsName.d.ts +5 -0
- package/dist/types/AnalyticsName.js +7 -0
- package/dist/types/AnalyticsName.js.map +1 -0
- package/dist/types/ContactItemIcon.d.ts +6 -0
- package/dist/types/ContactItemIcon.js +8 -0
- package/dist/types/ContactItemIcon.js.map +1 -0
- package/dist/types/EventRibbon.d.ts +38 -13
- package/dist/types/EventRibbon.js +39 -12
- package/dist/types/EventRibbon.js.map +1 -1
- package/dist/utils/parseArrayFromString.d.ts +2 -0
- package/dist/utils/parseArrayFromString.js +5 -0
- package/dist/utils/parseArrayFromString.js.map +1 -0
- package/dist/vscode.html-custom-data.json +90 -26
- package/dist/web-types.json +184 -16
- package/package.json +2 -2
- package/src/Accordion.hbs +13 -9
- package/src/Accordion.ts +7 -4
- package/src/Assets.ts +29 -0
- package/src/AssetsVariables.ts +6 -1
- package/src/Contact.ts +200 -0
- package/src/ContactItem.ts +119 -0
- package/src/ContactItemTemplate.tsx +22 -0
- package/src/ContactTemplate.tsx +105 -0
- package/src/CountrySelector.ts +0 -5
- package/src/Footer.ts +7 -10
- package/src/List.ts +1 -1
- package/src/MastheadCountrySelector.hbs +3 -0
- package/src/MastheadCountrySelector.ts +13 -3
- package/src/MastheadItem.hbs +8 -0
- package/src/MastheadItem.ts +36 -35
- package/src/MastheadMenu.hbs +6 -1
- package/src/MastheadMenu.ts +7 -5
- package/src/MastheadMenuItem.hbs +1 -1
- package/src/MastheadMenuItem.ts +2 -2
- package/src/MastheadMobileMenu.hbs +24 -9
- package/src/MastheadMobileMenu.ts +19 -3
- package/src/MastheadProfileMenu.hbs +2 -0
- package/src/MastheadProfileMenu.ts +13 -10
- package/src/MastheadShell.hbs +2 -0
- package/src/MastheadShell.ts +31 -14
- package/src/MessageStripTemplate.tsx +1 -0
- package/src/SearchableListBase.ts +6 -1
- package/src/SecondaryNavigation.ts +3 -5
- package/src/generated/i18n/i18n-defaults.ts +2 -2
- package/src/generated/templates/AccordionTemplate.lit.ts +4 -2
- package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +3 -3
- package/src/generated/templates/MastheadItemTemplate.lit.ts +25 -22
- package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +1 -1
- package/src/generated/templates/MastheadMenuTemplate.lit.ts +2 -2
- package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +14 -14
- package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +1 -1
- package/src/generated/templates/MastheadShellTemplate.lit.ts +2 -2
- package/src/generated/themes/Accordion.css.ts +1 -1
- package/src/generated/themes/Button.css.ts +1 -1
- package/src/generated/themes/Contact.css.ts +9 -0
- package/src/generated/themes/ContactItem.css.ts +9 -0
- package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
- package/src/generated/themes/Modal.css.ts +1 -1
- package/src/generated/themes/RatingIndicator.css.ts +1 -1
- package/src/generated/themes/Search.css.ts +1 -1
- package/src/generated/themes/Slider.css.ts +1 -1
- package/src/generated/themes/TabInOverflow.css.ts +1 -1
- package/src/i18n/messagebundle.properties +8 -0
- package/src/i18n/messagebundle_en.properties +4 -0
- package/src/themes/Accordion.css +1 -0
- package/src/themes/Button.css +8 -1
- package/src/themes/Contact.css +184 -0
- package/src/themes/ContactItem.css +44 -0
- package/src/themes/MastheadProfileMenu.css +2 -1
- package/src/themes/Modal.css +4 -4
- package/src/themes/Search.css +2 -1
- package/src/themes/TabInOverflow.css +1 -1
- package/src/types/AnalyticsName.ts +6 -0
- package/src/types/ContactItemIcon.ts +7 -0
- package/src/types/EventRibbon.ts +38 -13
- package/src/utils/parseArrayFromString.ts +5 -0
- 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
|
+
}
|
package/src/CountrySelector.ts
CHANGED
|
@@ -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
|
|
403
|
+
return parseArrayFromString<FooterLink>(this.quickLinks);
|
|
407
404
|
}
|
|
408
405
|
|
|
409
406
|
get trendingLinksArray(): FooterLink[] {
|
|
410
|
-
return
|
|
407
|
+
return parseArrayFromString<FooterLink>(this.trendingLinks);
|
|
411
408
|
}
|
|
412
409
|
|
|
413
410
|
get aboutLinksArray(): FooterLink[] {
|
|
414
|
-
return
|
|
411
|
+
return parseArrayFromString<FooterLink>(this.aboutLinks);
|
|
415
412
|
}
|
|
416
413
|
|
|
417
414
|
get siteInformationLinksArray(): FooterLink[] {
|
|
418
|
-
return
|
|
415
|
+
return parseArrayFromString<FooterLink>(this.siteInformationLinks);
|
|
419
416
|
}
|
|
420
417
|
|
|
421
418
|
get contactNumbersArray(): FooterContactNumber[] {
|
|
422
|
-
return
|
|
419
|
+
return parseArrayFromString<FooterContactNumber>(this.contactNumbersList);
|
|
423
420
|
}
|
|
424
421
|
|
|
425
422
|
get socialLinksArray(): FooterSocialLink[] {
|
|
426
|
-
return
|
|
423
|
+
return parseArrayFromString<FooterSocialLink>(this.socialLinks);
|
|
427
424
|
}
|
|
428
425
|
|
|
429
426
|
get isContactContainerVisible(): boolean {
|
package/src/List.ts
CHANGED
|
@@ -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
|
|
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
|
|
package/src/MastheadItem.hbs
CHANGED
|
@@ -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>
|