@sapudex/web-components 2.14.0 → 2.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cypress/specs/Breadcrumbs.cy.tsx +77 -0
- package/cypress/specs/FilterMenu.cy.tsx +19 -43
- package/cypress/specs/HeroBanner.cy.tsx +6 -6
- package/cypress/specs/InputGroup.cy.tsx +47 -0
- package/cypress/specs/RatingBar.cy.tsx +41 -0
- package/cypress/specs/Tooltip.cy.tsx +6 -11
- package/cypress/support/component-imports.instrumented.ts +4 -0
- package/cypress/support/component-imports.src.ts +4 -0
- package/dist/Accordion.js +44 -30
- package/dist/Accordion.js.map +1 -1
- package/dist/Breadcrumbs.d.ts +2 -0
- package/dist/Breadcrumbs.js +8 -7
- package/dist/Breadcrumbs.js.map +1 -1
- package/dist/BreadcrumbsItem.d.ts +1 -2
- package/dist/BreadcrumbsItem.js.map +1 -1
- package/dist/BreadcrumbsPopoverTemplate.d.ts +2 -0
- package/dist/BreadcrumbsPopoverTemplate.js +8 -0
- package/dist/BreadcrumbsPopoverTemplate.js.map +1 -0
- package/dist/BreadcrumbsTemplate.d.ts +2 -0
- package/dist/BreadcrumbsTemplate.js +10 -0
- package/dist/BreadcrumbsTemplate.js.map +1 -0
- package/dist/FilterMenu.js +1 -2
- package/dist/FilterMenu.js.map +1 -1
- package/dist/FilterMenuSelectAll.d.ts +0 -1
- package/dist/FilterMenuSelectAll.js +0 -3
- package/dist/FilterMenuSelectAll.js.map +1 -1
- package/dist/Footer.d.ts +17 -21
- package/dist/Footer.js +5 -11
- package/dist/Footer.js.map +1 -1
- package/dist/FooterTemplate.d.ts +2 -0
- package/dist/FooterTemplate.js +27 -0
- package/dist/FooterTemplate.js.map +1 -0
- package/dist/HeroBanner.js +4 -4
- package/dist/HeroBanner.js.map +1 -1
- package/dist/HeroBannerTemplate.d.ts +2 -0
- package/dist/HeroBannerTemplate.js +10 -0
- package/dist/HeroBannerTemplate.js.map +1 -0
- package/dist/InputGroup.d.ts +0 -1
- package/dist/InputGroup.js +3 -6
- package/dist/InputGroup.js.map +1 -1
- package/dist/InputGroupTemplate.d.ts +2 -0
- package/dist/InputGroupTemplate.js +7 -0
- package/dist/InputGroupTemplate.js.map +1 -0
- package/dist/MastheadMobileMenu.js +1 -1
- package/dist/MastheadMobileMenu.js.map +1 -1
- package/dist/RatingBar.js +3 -3
- package/dist/RatingBar.js.map +1 -1
- package/dist/RatingBarTemplate.d.ts +2 -0
- package/dist/RatingBarTemplate.js +8 -0
- package/dist/RatingBarTemplate.js.map +1 -0
- package/dist/Search.js +5 -4
- package/dist/Search.js.map +1 -1
- package/dist/SearchableListBase.d.ts +2 -1
- package/dist/SearchableListBase.js +13 -23
- package/dist/SearchableListBase.js.map +1 -1
- package/dist/SelectBox.js +1 -2
- package/dist/SelectBox.js.map +1 -1
- package/dist/StatusBadge.js +3 -3
- package/dist/StatusBadge.js.map +1 -1
- package/dist/StatusBadgeTemplate.d.ts +2 -0
- package/dist/StatusBadgeTemplate.js +7 -0
- package/dist/StatusBadgeTemplate.js.map +1 -0
- package/dist/StatusMessage.js +3 -3
- package/dist/StatusMessage.js.map +1 -1
- package/dist/StatusMessageTemplate.d.ts +2 -0
- package/dist/StatusMessageTemplate.js +8 -0
- package/dist/StatusMessageTemplate.js.map +1 -0
- package/dist/Switch.d.ts +1 -4
- package/dist/Switch.js +4 -8
- package/dist/Switch.js.map +1 -1
- package/dist/SwitchTemplate.d.ts +2 -0
- package/dist/SwitchTemplate.js +12 -0
- package/dist/SwitchTemplate.js.map +1 -0
- package/dist/TagGroup.d.ts +2 -0
- package/dist/TagGroup.js +10 -3
- package/dist/TagGroup.js.map +1 -1
- package/dist/TruncatedText.d.ts +0 -1
- package/dist/TruncatedText.js +5 -6
- package/dist/TruncatedText.js.map +1 -1
- package/dist/TruncatedTextTemplate.d.ts +2 -0
- package/dist/TruncatedTextTemplate.js +9 -0
- package/dist/TruncatedTextTemplate.js.map +1 -0
- package/dist/assets/{InputSuggestions-AxcsfuTc.js → InputSuggestions-lpqKgn1j.js} +1 -1
- package/dist/assets/{ListItemStandardExpandableTextTemplate-CaS49yZt.js → ListItemStandardExpandableTextTemplate-BPs3CyVq.js} +1 -1
- package/dist/assets/{bundle.esm-DzkSPQ0p.js → bundle.esm-C3RAGF4b.js} +211 -211
- package/dist/css/themes/AccordionItem.css +1 -1
- package/dist/css/themes/CountrySelector.css +1 -1
- package/dist/css/themes/Link.css +1 -1
- package/dist/css/themes/MediaPlayer.css +1 -1
- package/dist/css/themes/PhoneNumberField.css +1 -1
- package/dist/css/themes/RatingBar.css +1 -1
- package/dist/css/themes/RatingIndicator.css +1 -1
- package/dist/css/themes/Search.css +1 -1
- package/dist/css/themes/SelectBox.css +1 -1
- package/dist/css/themes/Slider.css +1 -1
- package/dist/css/themes/TextArea.css +1 -1
- package/dist/css/themes/TextField.css +1 -1
- package/dist/custom-elements-internal.json +148 -133
- package/dist/custom-elements.json +133 -118
- package/dist/generated/themes/AccordionItem.css.d.ts +1 -1
- package/dist/generated/themes/AccordionItem.css.js +1 -1
- package/dist/generated/themes/AccordionItem.css.js.map +1 -1
- package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
- package/dist/generated/themes/CountrySelector.css.js +1 -1
- package/dist/generated/themes/CountrySelector.css.js.map +1 -1
- package/dist/generated/themes/Link.css.d.ts +1 -1
- package/dist/generated/themes/Link.css.js +1 -1
- package/dist/generated/themes/Link.css.js.map +1 -1
- package/dist/generated/themes/MediaPlayer.css.d.ts +1 -1
- package/dist/generated/themes/MediaPlayer.css.js +1 -1
- package/dist/generated/themes/MediaPlayer.css.js.map +1 -1
- package/dist/generated/themes/PhoneNumberField.css.d.ts +1 -1
- package/dist/generated/themes/PhoneNumberField.css.js +1 -1
- package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
- package/dist/generated/themes/RatingBar.css.d.ts +1 -1
- package/dist/generated/themes/RatingBar.css.js +1 -1
- package/dist/generated/themes/RatingBar.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/SelectBox.css.d.ts +1 -1
- package/dist/generated/themes/SelectBox.css.js +1 -1
- package/dist/generated/themes/SelectBox.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/TextArea.css.d.ts +1 -1
- package/dist/generated/themes/TextArea.css.js +1 -1
- package/dist/generated/themes/TextArea.css.js.map +1 -1
- package/dist/generated/themes/TextField.css.d.ts +1 -1
- package/dist/generated/themes/TextField.css.js +1 -1
- package/dist/generated/themes/TextField.css.js.map +1 -1
- package/dist/utils/sanitizeString.d.ts +2 -0
- package/dist/utils/sanitizeString.js +12 -0
- package/dist/utils/sanitizeString.js.map +1 -0
- package/dist/web-types.json +2 -2
- package/package.json +2 -2
- package/src/Accordion.ts +56 -26
- package/src/Breadcrumbs.ts +12 -7
- package/src/BreadcrumbsItem.ts +2 -2
- package/src/BreadcrumbsPopoverTemplate.tsx +60 -0
- package/src/BreadcrumbsTemplate.tsx +53 -0
- package/src/FilterMenu.ts +1 -2
- package/src/FilterMenuSelectAll.ts +0 -4
- package/src/Footer.ts +28 -35
- package/src/FooterTemplate.tsx +410 -0
- package/src/HeroBanner.ts +4 -4
- package/src/HeroBannerTemplate.tsx +101 -0
- package/src/InputGroup.ts +3 -7
- package/src/InputGroupTemplate.tsx +31 -0
- package/src/MastheadMobileMenu.ts +1 -1
- package/src/RatingBar.ts +3 -3
- package/src/RatingBarTemplate.tsx +38 -0
- package/src/Search.ts +5 -4
- package/src/SearchableListBase.ts +15 -26
- package/src/SelectBox.ts +1 -2
- package/src/StatusBadge.ts +5 -4
- package/src/StatusBadgeTemplate.tsx +18 -0
- package/src/StatusMessage.ts +3 -3
- package/src/StatusMessageTemplate.tsx +20 -0
- package/src/Switch.ts +5 -11
- package/src/SwitchTemplate.tsx +50 -0
- package/src/TagGroup.ts +13 -3
- package/src/TruncatedText.ts +8 -14
- package/src/TruncatedTextTemplate.tsx +21 -0
- package/src/generated/themes/AccordionItem.css.ts +1 -1
- package/src/generated/themes/CountrySelector.css.ts +1 -1
- package/src/generated/themes/Link.css.ts +1 -1
- package/src/generated/themes/MediaPlayer.css.ts +1 -1
- package/src/generated/themes/PhoneNumberField.css.ts +1 -1
- package/src/generated/themes/RatingBar.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/SelectBox.css.ts +1 -1
- package/src/generated/themes/Slider.css.ts +1 -1
- package/src/generated/themes/TextArea.css.ts +1 -1
- package/src/generated/themes/TextField.css.ts +1 -1
- package/src/themes/AccordionItem.css +0 -1
- package/src/themes/CountrySelector.css +1 -7
- package/src/themes/Link.css +11 -4
- package/src/themes/MediaPlayer.css +133 -186
- package/src/themes/PhoneNumberField.css +25 -7
- package/src/themes/RatingBar.css +2 -2
- package/src/themes/Search.css +7 -3
- package/src/themes/SelectBox.css +4 -0
- package/src/themes/TextArea.css +31 -7
- package/src/themes/TextField.css +15 -5
- package/src/utils/sanitizeString.ts +13 -0
- package/dist/generated/templates/BreadcrumbsPopoverTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/BreadcrumbsPopoverTemplate.lit.js +0 -12
- package/dist/generated/templates/BreadcrumbsPopoverTemplate.lit.js.map +0 -1
- package/dist/generated/templates/BreadcrumbsTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/BreadcrumbsTemplate.lit.js +0 -14
- package/dist/generated/templates/BreadcrumbsTemplate.lit.js.map +0 -1
- package/dist/generated/templates/FooterTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/FooterTemplate.lit.js +0 -39
- package/dist/generated/templates/FooterTemplate.lit.js.map +0 -1
- package/dist/generated/templates/InputGroupTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/InputGroupTemplate.lit.js +0 -9
- package/dist/generated/templates/InputGroupTemplate.lit.js.map +0 -1
- package/dist/generated/templates/RatingBarTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/RatingBarTemplate.lit.js +0 -8
- package/dist/generated/templates/RatingBarTemplate.lit.js.map +0 -1
- package/dist/generated/templates/StatusBadgeTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/StatusBadgeTemplate.lit.js +0 -7
- package/dist/generated/templates/StatusBadgeTemplate.lit.js.map +0 -1
- package/dist/generated/templates/StatusMessageTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/StatusMessageTemplate.lit.js +0 -8
- package/dist/generated/templates/StatusMessageTemplate.lit.js.map +0 -1
- package/dist/generated/templates/SwitchTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/SwitchTemplate.lit.js +0 -14
- package/dist/generated/templates/SwitchTemplate.lit.js.map +0 -1
- package/dist/generated/templates/TruncatedTextTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/TruncatedTextTemplate.lit.js +0 -7
- package/dist/generated/templates/TruncatedTextTemplate.lit.js.map +0 -1
- package/src/Breadcrumbs.hbs +0 -38
- package/src/BreadcrumbsPopover.hbs +0 -48
- package/src/Footer.hbs +0 -296
- package/src/InputGroup.hbs +0 -20
- package/src/RatingBar.hbs +0 -11
- package/src/StatusBadge.hbs +0 -9
- package/src/StatusMessage.hbs +0 -6
- package/src/Switch.hbs +0 -35
- package/src/TruncatedText.hbs +0 -11
- package/src/generated/templates/BreadcrumbsPopoverTemplate.lit.ts +0 -16
- package/src/generated/templates/BreadcrumbsTemplate.lit.ts +0 -18
- package/src/generated/templates/FooterTemplate.lit.ts +0 -43
- package/src/generated/templates/InputGroupTemplate.lit.ts +0 -13
- package/src/generated/templates/RatingBarTemplate.lit.ts +0 -12
- package/src/generated/templates/StatusBadgeTemplate.lit.ts +0 -11
- package/src/generated/templates/StatusMessageTemplate.lit.ts +0 -12
- package/src/generated/templates/SwitchTemplate.lit.ts +0 -18
- package/src/generated/templates/TruncatedTextTemplate.lit.ts +0 -11
package/src/Accordion.ts
CHANGED
|
@@ -7,7 +7,9 @@ import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
|
|
|
7
7
|
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
8
8
|
import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
|
|
9
9
|
import "@ui5/webcomponents-icons/dist/feeder-arrow.js";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
isEnter, isSpace, isUp, isDown, isEnd, isHome, isTabPrevious, isTabNext,
|
|
12
|
+
} from "@ui5/webcomponents-base/dist/Keys.js";
|
|
11
13
|
import AccordionTemplate from "./AccordionTemplate.js";
|
|
12
14
|
import type UDExAccordionItem from "./AccordionItem.js";
|
|
13
15
|
import { COLLAPSE_ALL, EXPAND_ALL } from "./generated/i18n/i18n-defaults.js";
|
|
@@ -153,39 +155,67 @@ class UDExAccordion extends UI5Element {
|
|
|
153
155
|
}
|
|
154
156
|
|
|
155
157
|
keydownHandler(e: KeyboardEvent) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const
|
|
158
|
+
const activeItem = this._items[this._activeItemIndex];
|
|
159
|
+
const previousItem = this._items[this._activeItemIndex - 1];
|
|
160
|
+
const isLastItem = this._activeItemIndex === this._items.length - 1;
|
|
161
|
+
const isFirstItem = this._activeItemIndex === 0;
|
|
162
|
+
const lastItem = this._items[this._items.length - 1];
|
|
163
|
+
|
|
164
|
+
const updateTabIndex = (elements: NodeListOf<Element>, value: string) => {
|
|
165
|
+
elements.forEach(element => element.setAttribute("tabindex", value));
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const getInteractiveElements = (item: HTMLElement) => {
|
|
169
|
+
const selectors = ["button", "a[href]", "input", "select", "textarea", "[tabindex]"];
|
|
170
|
+
return item.querySelectorAll(selectors.join(","));
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const handleTabNavigation = (keyboardEvent: KeyboardEvent) => {
|
|
174
|
+
if (isLastItem && isTabNext(keyboardEvent) && !lastItem.expanded) {
|
|
175
|
+
updateTabIndex(getInteractiveElements(activeItem), "-1");
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if ((activeItem?.expanded && isTabNext(e))
|
|
180
|
+
|| (previousItem?.expanded && isTabPrevious(e))
|
|
181
|
+
|| (isFirstItem && isTabPrevious(e))) {
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (isEnter(e) && isLastItem) {
|
|
186
|
+
updateTabIndex(getInteractiveElements(activeItem), "0");
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return false;
|
|
190
|
+
};
|
|
191
|
+
|
|
160
192
|
const focusOnItem = (itemIndex: number) => {
|
|
161
193
|
const item = this._items[itemIndex];
|
|
162
194
|
this._activeItemIndex = itemIndex;
|
|
163
195
|
(item?.shadowRoot?.querySelector(".udex-accordion-item__header") as HTMLElement)?.focus();
|
|
164
196
|
};
|
|
165
197
|
|
|
166
|
-
|
|
167
|
-
|
|
198
|
+
if (handleTabNavigation(e)) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
e.preventDefault();
|
|
203
|
+
const len = this._items.length;
|
|
204
|
+
|
|
205
|
+
if (isHome(e)) {
|
|
168
206
|
focusOnItem(0);
|
|
169
|
-
|
|
170
|
-
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (isEnd(e)) {
|
|
171
210
|
focusOnItem(len - 1);
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
case "ArrowDown":
|
|
181
|
-
if (this._activeItemIndex < len - 1) {
|
|
182
|
-
focusOnItem(this._activeItemIndex + 1);
|
|
183
|
-
} else if (this._activeItemIndex === len - 1) {
|
|
184
|
-
focusOnItem(0);
|
|
185
|
-
}
|
|
186
|
-
break;
|
|
187
|
-
default:
|
|
188
|
-
break;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (isTabPrevious(e) || isUp(e)) {
|
|
214
|
+
focusOnItem(this._activeItemIndex > 0 ? this._activeItemIndex - 1 : len - 1);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (isTabNext(e) || isDown(e)) {
|
|
218
|
+
focusOnItem(this._activeItemIndex < len - 1 ? this._activeItemIndex + 1 : 0);
|
|
189
219
|
}
|
|
190
220
|
}
|
|
191
221
|
|
package/src/Breadcrumbs.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
|
|
2
2
|
import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
|
|
3
|
-
import
|
|
3
|
+
import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
|
|
4
4
|
import property from "@ui5/webcomponents-base/dist/decorators/property.js";
|
|
5
5
|
import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
|
|
6
6
|
import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
|
|
@@ -14,7 +14,7 @@ import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
|
14
14
|
import UI5BreadcrumbsCss from "@ui5/webcomponents/dist/generated/themes/Breadcrumbs.css.js";
|
|
15
15
|
import "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
|
|
16
16
|
import "@ui5/webcomponents-icons/dist/home.js";
|
|
17
|
-
import BreadcrumbsTemplate from "./
|
|
17
|
+
import BreadcrumbsTemplate from "./BreadcrumbsTemplate.js";
|
|
18
18
|
import UDExBreadcrumbsItem from "./BreadcrumbsItem.js";
|
|
19
19
|
import UDExDropdown from "./Dropdown.js";
|
|
20
20
|
import UDExLink from "./Link.js";
|
|
@@ -24,8 +24,6 @@ import { BREADCRUMBS_ARIA_LABEL, BREADCRUMBS_OVERFLOW_ARIA_LABEL } from "./gener
|
|
|
24
24
|
import BreadcrumbsCss from "./generated/themes/Breadcrumbs.css.js";
|
|
25
25
|
import BreadcrumbsPopoverCss from "./generated/themes/BreadcrumbsPopover.css.js";
|
|
26
26
|
|
|
27
|
-
const triggerActiveClass = "udex-breadcrumbs__trigger--opened";
|
|
28
|
-
|
|
29
27
|
type UDExBreadcrumbsItemClickEventDetail = {
|
|
30
28
|
item: UDExBreadcrumbsItem;
|
|
31
29
|
altKey?: boolean;
|
|
@@ -53,7 +51,7 @@ type UDExBreadcrumbsItemClickEventDetail = {
|
|
|
53
51
|
*/
|
|
54
52
|
@customElement({
|
|
55
53
|
tag: "udex-breadcrumbs",
|
|
56
|
-
renderer:
|
|
54
|
+
renderer: jsxRenderer,
|
|
57
55
|
styles: [UI5BreadcrumbsCss, BreadcrumbsCss, BreadcrumbsPopoverCss],
|
|
58
56
|
template: BreadcrumbsTemplate,
|
|
59
57
|
dependencies: [UDExBreadcrumbsItem, UDExLink, UDExDropdown, UI5Icon],
|
|
@@ -116,6 +114,12 @@ class UDExBreadcrumbs extends UI5Element {
|
|
|
116
114
|
_responsivePopover?: UDExDropdown;
|
|
117
115
|
_itemNavigation?: ItemNavigation;
|
|
118
116
|
_shouldFocusFirstVisibleItem!: boolean;
|
|
117
|
+
_rootClass: string;
|
|
118
|
+
|
|
119
|
+
constructor() {
|
|
120
|
+
super();
|
|
121
|
+
this._rootClass = "udex-breadcrumbs";
|
|
122
|
+
}
|
|
119
123
|
|
|
120
124
|
onBeforeRendering(): void {
|
|
121
125
|
this._preprocessItems();
|
|
@@ -232,7 +236,7 @@ class UDExBreadcrumbs extends UI5Element {
|
|
|
232
236
|
}
|
|
233
237
|
|
|
234
238
|
_handleKeydown(e: KeyboardEvent): void {
|
|
235
|
-
const itemIndex = (e.target as HTMLElement).getAttribute("index");
|
|
239
|
+
const itemIndex = (e.target as HTMLElement).getAttribute("data-index");
|
|
236
240
|
const isLastItem = itemIndex === (this.items.length - 2).toString();
|
|
237
241
|
const isFirstItem = itemIndex === "0";
|
|
238
242
|
|
|
@@ -304,7 +308,8 @@ class UDExBreadcrumbs extends UI5Element {
|
|
|
304
308
|
}
|
|
305
309
|
|
|
306
310
|
get _triggerClass(): string {
|
|
307
|
-
|
|
311
|
+
const rootClass = "udex-breadcrumbs";
|
|
312
|
+
return this._dropdownOpened ? `${rootClass} ${rootClass}__trigger--opened` : rootClass;
|
|
308
313
|
}
|
|
309
314
|
|
|
310
315
|
get _accessibleNameText(): string {
|
package/src/BreadcrumbsItem.ts
CHANGED
|
@@ -24,11 +24,11 @@ import BreadcrumbsItem from "@ui5/webcomponents/dist/BreadcrumbsItem.js";
|
|
|
24
24
|
tag: "udex-breadcrumbs-item",
|
|
25
25
|
renderer: jsxRenderer,
|
|
26
26
|
})
|
|
27
|
+
|
|
27
28
|
class UDExBreadcrumbsItem extends BreadcrumbsItem {
|
|
28
29
|
/**
|
|
29
30
|
* Defines item icon to be displayed before the item name.
|
|
30
|
-
*
|
|
31
|
-
* @default ""
|
|
31
|
+
* @default undefined
|
|
32
32
|
* @public
|
|
33
33
|
*/
|
|
34
34
|
@property()
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type Breadcrumbs from "./Breadcrumbs.js";
|
|
2
|
+
import UDExDropdown from "./Dropdown.js";
|
|
3
|
+
import UDExLink from "./Link.js";
|
|
4
|
+
import { Placement, HorizontalAlign } from "./types/Dropdown.js";
|
|
5
|
+
|
|
6
|
+
export default function BreadcrumbsPopoverTemplate(this: Breadcrumbs) {
|
|
7
|
+
return (
|
|
8
|
+
<UDExDropdown
|
|
9
|
+
id={`udex-${this._id}-breadcrumbs__popover`}
|
|
10
|
+
opener={`udex-${this._id}-breadcrumbs__opener`}
|
|
11
|
+
class={`${this._rootClass}__popover ui5-breadcrumbs-popover`}
|
|
12
|
+
placement={Placement.Bottom}
|
|
13
|
+
horizontalAlign={HorizontalAlign.Start}
|
|
14
|
+
onKeyDown={this._handleKeydown}
|
|
15
|
+
onClose={this._afterDropdownClose}
|
|
16
|
+
onOpen={this._afterDropdownOpen}>
|
|
17
|
+
<div className={`${this._rootClass}__popover-content`}>
|
|
18
|
+
{this._dropdownItems.map((item, index) => (
|
|
19
|
+
item.icon ? (
|
|
20
|
+
<UDExLink
|
|
21
|
+
key={index}
|
|
22
|
+
data-index={index}
|
|
23
|
+
id={`${item._id}-li`}
|
|
24
|
+
onClick={this._onDropdownLinkPress}
|
|
25
|
+
href={item.href}
|
|
26
|
+
target={item.target}
|
|
27
|
+
class={`${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
|
|
28
|
+
icon={item.icon}
|
|
29
|
+
accessibleName={item.textContent ?? undefined}
|
|
30
|
+
data-ui5-stable={item.stableDomRef}>
|
|
31
|
+
{item.textContent}
|
|
32
|
+
</UDExLink>
|
|
33
|
+
) : item._isCurrentPageItem ? (
|
|
34
|
+
<span
|
|
35
|
+
key={index}
|
|
36
|
+
id={`${item._id}-li`}
|
|
37
|
+
className={`${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
|
|
38
|
+
accessible-name={item.accessibleName}
|
|
39
|
+
data-ui5-stable={item.stableDomRef}>
|
|
40
|
+
{item.textContent}
|
|
41
|
+
</span>
|
|
42
|
+
) : (
|
|
43
|
+
<UDExLink
|
|
44
|
+
key={index}
|
|
45
|
+
data-index={index}
|
|
46
|
+
id={`${item._id}-li`}
|
|
47
|
+
onClick={this._onDropdownLinkPress}
|
|
48
|
+
href={item.href}
|
|
49
|
+
target={item.target}
|
|
50
|
+
class={`${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
|
|
51
|
+
accessibleName={item.accessibleName}
|
|
52
|
+
data-ui5-stable={item.stableDomRef}>
|
|
53
|
+
{item.textContent}
|
|
54
|
+
</UDExLink>
|
|
55
|
+
)
|
|
56
|
+
))}
|
|
57
|
+
</div>
|
|
58
|
+
</UDExDropdown>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type Breadcrumbs from "./Breadcrumbs.js";
|
|
2
|
+
import UDExLink from "./Link.js";
|
|
3
|
+
import UDExButtonAccessibleRole from "./types/ButtonAccessibleRole.js";
|
|
4
|
+
import slimArrowDown from "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
|
|
5
|
+
import BreadcrumbsPopoverTemplate from "./BreadcrumbsPopoverTemplate.js";
|
|
6
|
+
|
|
7
|
+
export default function BreadcrumbsTemplate(this: Breadcrumbs) {
|
|
8
|
+
const rootClass = "udex-breadcrumbs";
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<>
|
|
12
|
+
<nav
|
|
13
|
+
class={`${this._rootClass} ui5-breadcrumbs-root`}
|
|
14
|
+
aria-label={this._accessibleNameText}>
|
|
15
|
+
<ol onFocusIn={this._onfocusin}>
|
|
16
|
+
<li class={`${this._rootClass}__arrow-wrapper ui5-breadcrumbs-dropdown-arrow-link-wrapper`}>
|
|
17
|
+
<UDExLink
|
|
18
|
+
id={`udex-${this._id}-breadcrumbs__opener`}
|
|
19
|
+
class={`${this._rootClass}__trigger ${this._triggerClass}`}
|
|
20
|
+
onClick={this._toggleDropdown}
|
|
21
|
+
aria-label={this._dropdownArrowAccessibleNameText}
|
|
22
|
+
accessibleRole={UDExButtonAccessibleRole.Button}
|
|
23
|
+
icon={slimArrowDown}
|
|
24
|
+
aria-haspopup="true">
|
|
25
|
+
</UDExLink>
|
|
26
|
+
</li>
|
|
27
|
+
{this._linksData.map(linkData =>
|
|
28
|
+
<li
|
|
29
|
+
class={`${this._rootClass}__link-wrapper ui5-breadcrumbs-link-wrapper`}
|
|
30
|
+
id={`${linkData._id}-link-wrapper`}>
|
|
31
|
+
{!linkData._isCurrentPageItem && (
|
|
32
|
+
<>
|
|
33
|
+
<span className={`${this._rootClass}__separator`} aria-hidden="true"></span>
|
|
34
|
+
<UDExLink
|
|
35
|
+
onClick={this._onLinkPress}
|
|
36
|
+
id={`${linkData._id}-link`}
|
|
37
|
+
class={`${rootClass}__item ${this._rootClass}__item--visible`}
|
|
38
|
+
href={linkData.href}
|
|
39
|
+
target={linkData.target}
|
|
40
|
+
accessibleName={linkData._accessibleNameText}
|
|
41
|
+
data-ui5-stable={linkData.stableDomRef}>
|
|
42
|
+
{linkData.innerText}
|
|
43
|
+
</UDExLink>
|
|
44
|
+
</>
|
|
45
|
+
)}
|
|
46
|
+
</li>
|
|
47
|
+
)}
|
|
48
|
+
</ol>
|
|
49
|
+
</nav>
|
|
50
|
+
{BreadcrumbsPopoverTemplate.call(this)}
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
53
|
+
}
|
package/src/FilterMenu.ts
CHANGED
|
@@ -332,8 +332,7 @@ class UDExFilterMenu extends UDExSearchableListBase {
|
|
|
332
332
|
}
|
|
333
333
|
|
|
334
334
|
handleSelectAll(e:CustomEvent): void {
|
|
335
|
-
this.
|
|
336
|
-
this.fireDecoratorEvent("select-all");
|
|
335
|
+
this.onSelectAllHeaderPress(e);
|
|
337
336
|
}
|
|
338
337
|
|
|
339
338
|
handleItemPress(e:CustomEvent): void {
|
package/src/Footer.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
|
|
2
|
-
import
|
|
2
|
+
import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.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
5
|
import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
|
|
6
6
|
import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
|
|
7
7
|
import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
|
|
8
|
-
|
|
9
8
|
import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
|
|
10
9
|
import { getLanguage } from "@ui5/webcomponents-base/dist/config/Language.js";
|
|
10
|
+
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
|
|
11
|
+
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
11
12
|
import Icon from "@ui5/webcomponents/dist/Icon.js";
|
|
12
13
|
import UDExAccordionItem from "./AccordionItem.js";
|
|
13
14
|
import UDExButton from "./Button.js";
|
|
@@ -19,14 +20,7 @@ import type { UDExSocialMediaButtonType } from "./types/SocialMediaButtonType.js
|
|
|
19
20
|
import type { UDExTarget } from "./types/common.js";
|
|
20
21
|
import { BreakpointUtils } from "./utils/Breakpoints.js";
|
|
21
22
|
import parseArrayFromString from "./utils/parseArrayFromString.js";
|
|
22
|
-
|
|
23
|
-
// Template
|
|
24
|
-
import FooterTemplate from "./generated/templates/FooterTemplate.lit.js";
|
|
25
|
-
|
|
26
|
-
// Styles
|
|
27
|
-
import FooterCss from "./generated/themes/Footer.css.js";
|
|
28
|
-
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
|
|
29
|
-
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
23
|
+
import FooterTemplate from "./FooterTemplate.js";
|
|
30
24
|
import {
|
|
31
25
|
ABOUT_SAP,
|
|
32
26
|
CHAT_WITH_US,
|
|
@@ -42,15 +36,14 @@ import {
|
|
|
42
36
|
PUBLIC_SECURITY_NETWORK_NUMBER,
|
|
43
37
|
ICP_NUMBER,
|
|
44
38
|
} from "./generated/i18n/i18n-defaults.js";
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
import "
|
|
48
|
-
import "@ui5/webcomponents-icons/dist/discussion-2.js";
|
|
49
|
-
import "@ui5/webcomponents-icons/dist/navigation-right-arrow.js";
|
|
39
|
+
|
|
40
|
+
// Styles
|
|
41
|
+
import FooterCss from "./generated/themes/Footer.css.js";
|
|
50
42
|
|
|
51
43
|
export const chineseICPDefaultLink = "https://beian.miit.gov.cn/";
|
|
52
44
|
|
|
53
45
|
export type FooterLink = {
|
|
46
|
+
id: string;
|
|
54
47
|
title: string;
|
|
55
48
|
url: string;
|
|
56
49
|
target: UDExTarget;
|
|
@@ -70,14 +63,14 @@ export type FooterContactNumber = {
|
|
|
70
63
|
};
|
|
71
64
|
|
|
72
65
|
type UDExFooterDetailedClickEventDetail = {
|
|
73
|
-
originalEvent:
|
|
66
|
+
originalEvent: MouseEvent,
|
|
74
67
|
name: string | undefined;
|
|
75
68
|
id?: string;
|
|
76
69
|
sourceNode: HTMLElement;
|
|
77
70
|
}
|
|
78
71
|
|
|
79
72
|
type UDExFooterBaseEventDetail = {
|
|
80
|
-
originalEvent:
|
|
73
|
+
originalEvent: MouseEvent | Event,
|
|
81
74
|
}
|
|
82
75
|
|
|
83
76
|
type BaseEvents = "contact-chat-click" | "contact-phone-local-numbers-click" | "contact-email-click" | "contact-phone-click" | "logo-click" | "back-to-top-click";
|
|
@@ -106,7 +99,7 @@ type DetailedEvents = "quick-links-click" | "trending-click" | "about-sap-click"
|
|
|
106
99
|
@customElement({
|
|
107
100
|
languageAware: true,
|
|
108
101
|
tag: "udex-footer",
|
|
109
|
-
renderer:
|
|
102
|
+
renderer: jsxRenderer,
|
|
110
103
|
styles: [FooterCss],
|
|
111
104
|
template: FooterTemplate,
|
|
112
105
|
dependencies: [UDExAccordion, UDExAccordionItem, Icon, UDExButton, UDExDivider, UDExLink, UDExSocialMediaButton],
|
|
@@ -437,7 +430,7 @@ class UDExFooter extends UI5Element {
|
|
|
437
430
|
this._shouldRenderMobileMenu = this.isMobile;
|
|
438
431
|
}
|
|
439
432
|
|
|
440
|
-
onBackToTopClick(e:
|
|
433
|
+
onBackToTopClick(e: Event): void {
|
|
441
434
|
this.fireFooterBaseEvent(e, "back-to-top-click");
|
|
442
435
|
|
|
443
436
|
window.scrollTo(0, 0);
|
|
@@ -490,19 +483,19 @@ class UDExFooter extends UI5Element {
|
|
|
490
483
|
return UDExFooter.i18nBundle.getText(CHAT_WITH_US);
|
|
491
484
|
}
|
|
492
485
|
|
|
493
|
-
get _quickLinksTitle() {
|
|
486
|
+
get _quickLinksTitle(): string {
|
|
494
487
|
return this.quickLinksTitle || UDExFooter.i18nBundle.getText(QUICK_LINKS);
|
|
495
488
|
}
|
|
496
489
|
|
|
497
|
-
get _trendingTitle() {
|
|
490
|
+
get _trendingTitle(): string {
|
|
498
491
|
return this.trendingTitle || UDExFooter.i18nBundle.getText(TRENDING);
|
|
499
492
|
}
|
|
500
493
|
|
|
501
|
-
get _aboutSapTitle() {
|
|
494
|
+
get _aboutSapTitle(): string {
|
|
502
495
|
return this.aboutSapTitle || UDExFooter.i18nBundle.getText(ABOUT_SAP);
|
|
503
496
|
}
|
|
504
497
|
|
|
505
|
-
get _siteInformationTitle() {
|
|
498
|
+
get _siteInformationTitle(): string {
|
|
506
499
|
return this.siteInformationTitle || UDExFooter.i18nBundle.getText(SITE_INFORMATION);
|
|
507
500
|
}
|
|
508
501
|
|
|
@@ -568,48 +561,48 @@ class UDExFooter extends UI5Element {
|
|
|
568
561
|
return this.isChineseLang && this.chineseLogoUrl ? `${root}-chinese` : root;
|
|
569
562
|
}
|
|
570
563
|
|
|
571
|
-
_onLogoClick(e:
|
|
564
|
+
_onLogoClick(e: MouseEvent): void {
|
|
572
565
|
this.fireFooterBaseEvent(e, "logo-click");
|
|
573
566
|
}
|
|
574
567
|
|
|
575
|
-
_onContactPhoneClick(e:
|
|
568
|
+
_onContactPhoneClick(e: MouseEvent): void {
|
|
576
569
|
this.fireFooterBaseEvent(e, "contact-phone-click");
|
|
577
570
|
}
|
|
578
|
-
_onContactPhoneLocalNumbersClick(e:
|
|
571
|
+
_onContactPhoneLocalNumbersClick(e: Event): void {
|
|
579
572
|
this.fireFooterBaseEvent(e, "contact-phone-local-numbers-click");
|
|
580
573
|
}
|
|
581
|
-
_onContactEmailClick(e:
|
|
574
|
+
_onContactEmailClick(e: MouseEvent): void {
|
|
582
575
|
this.fireFooterBaseEvent(e, "contact-email-click");
|
|
583
576
|
}
|
|
584
|
-
_onContactChatClick(e:
|
|
577
|
+
_onContactChatClick(e: MouseEvent): void {
|
|
585
578
|
this.fireFooterBaseEvent(e, "contact-chat-click");
|
|
586
579
|
}
|
|
587
580
|
|
|
588
|
-
_onQuickLinksClick(e:
|
|
581
|
+
_onQuickLinksClick(e: MouseEvent): void {
|
|
589
582
|
this.fireFooterDetailedClickEvent(e, "quick-links-click");
|
|
590
583
|
}
|
|
591
584
|
|
|
592
|
-
_onTrendingClick(e:
|
|
585
|
+
_onTrendingClick(e: MouseEvent): void {
|
|
593
586
|
this.fireFooterDetailedClickEvent(e, "trending-click");
|
|
594
587
|
}
|
|
595
588
|
|
|
596
|
-
_onAboutSapClick(e:
|
|
589
|
+
_onAboutSapClick(e: MouseEvent): void {
|
|
597
590
|
this.fireFooterDetailedClickEvent(e, "about-sap-click");
|
|
598
591
|
}
|
|
599
592
|
|
|
600
|
-
_onSiteInformationClick(e:
|
|
593
|
+
_onSiteInformationClick(e: MouseEvent): void {
|
|
601
594
|
this.fireFooterDetailedClickEvent(e, "site-information-click");
|
|
602
595
|
}
|
|
603
596
|
|
|
604
|
-
_onSocialMediaLinkClick(e:
|
|
597
|
+
_onSocialMediaLinkClick(e: MouseEvent): void {
|
|
605
598
|
this.fireFooterDetailedClickEvent(e, "social-media-link-click");
|
|
606
599
|
}
|
|
607
600
|
|
|
608
|
-
fireFooterBaseEvent(e:
|
|
601
|
+
fireFooterBaseEvent(e: MouseEvent | Event, eventName: BaseEvents): void {
|
|
609
602
|
this.fireDecoratorEvent(eventName, { originalEvent: e });
|
|
610
603
|
}
|
|
611
604
|
|
|
612
|
-
fireFooterDetailedClickEvent(e:
|
|
605
|
+
fireFooterDetailedClickEvent(e: MouseEvent, eventName: DetailedEvents): void {
|
|
613
606
|
const sourceNode = e.composedPath()[0] as HTMLElement;
|
|
614
607
|
const { innerText, dataset: { id, name } } = sourceNode;
|
|
615
608
|
|