@sapudex/web-components 0.184.0 → 0.192.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CountrySelector.d.ts +2 -0
- package/dist/CountrySelector.js +5 -1
- package/dist/CountrySelector.js.map +1 -1
- package/dist/MastheadItem.d.ts +10 -1
- package/dist/MastheadItem.js +11 -5
- package/dist/MastheadItem.js.map +1 -1
- package/dist/MastheadMenu.d.ts +6 -0
- package/dist/MastheadMenu.js +3 -0
- package/dist/MastheadMenu.js.map +1 -1
- package/dist/MastheadMenuItem.d.ts +1 -0
- package/dist/MastheadMenuItem.js +3 -0
- package/dist/MastheadMenuItem.js.map +1 -1
- package/dist/MastheadProfileMenu.d.ts +6 -0
- package/dist/MastheadProfileMenu.js +3 -0
- package/dist/MastheadProfileMenu.js.map +1 -1
- package/dist/MastheadShell.d.ts +34 -4
- package/dist/MastheadShell.js +122 -11
- package/dist/MastheadShell.js.map +1 -1
- package/dist/Pagination.d.ts +3 -2
- package/dist/Pagination.js +4 -2
- package/dist/Pagination.js.map +1 -1
- package/dist/SelectBox.d.ts +2 -0
- package/dist/SelectBox.js +5 -1
- package/dist/SelectBox.js.map +1 -1
- package/dist/Tab.d.ts +4 -13
- package/dist/Tab.js +11 -14
- package/dist/Tab.js.map +1 -1
- package/dist/TabNavigation.js +0 -1
- package/dist/TabNavigation.js.map +1 -1
- package/dist/TextArea.d.ts +13 -22
- package/dist/TextArea.js +30 -33
- package/dist/TextArea.js.map +1 -1
- package/dist/assets/{bundle.esm-d98e72b5.js → bundle.esm-809b9769.js} +177 -177
- package/dist/assets/messagebundle_en-06c0dadc.js +1 -0
- package/dist/css/themes/CountrySelector.css +1 -1
- package/dist/css/themes/MastheadItem.css +1 -1
- package/dist/css/themes/MastheadMenu.css +1 -1
- package/dist/css/themes/MastheadMenuItem.css +1 -1
- package/dist/css/themes/MastheadProfileMenu.css +1 -1
- package/dist/css/themes/MastheadShell.css +1 -1
- package/dist/css/themes/MediaPlayer.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/TextArea.css +1 -1
- package/dist/custom-elements-internal.json +14 -12
- package/dist/custom-elements.json +14 -12
- package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
- package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
- package/dist/generated/i18n/i18n-defaults.js +2 -1
- package/dist/generated/i18n/i18n-defaults.js.map +1 -1
- package/dist/generated/templates/MastheadItemTemplate.lit.js +3 -3
- package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +2 -2
- package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadShellTemplate.lit.js +8 -9
- package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
- package/dist/generated/templates/PaginationTemplate.lit.js +1 -1
- package/dist/generated/templates/PaginationTemplate.lit.js.map +1 -1
- package/dist/generated/templates/TabHeaderTemplate.lit.js +1 -1
- package/dist/generated/templates/TabHeaderTemplate.lit.js.map +1 -1
- package/dist/generated/templates/TabNavigationTemplate.lit.js +1 -1
- package/dist/generated/templates/TabNavigationTemplate.lit.js.map +1 -1
- package/dist/generated/templates/TextAreaTemplate.lit.js +5 -4
- package/dist/generated/templates/TextAreaTemplate.lit.js.map +1 -1
- package/dist/generated/templates/TextFieldTemplate.lit.js +1 -1
- package/dist/generated/templates/TextFieldTemplate.lit.js.map +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/MastheadItem.css.js +1 -1
- package/dist/generated/themes/MastheadItem.css.js.map +1 -1
- package/dist/generated/themes/MastheadMenu.css.js +1 -1
- package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
- package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
- package/dist/generated/themes/MastheadMenuItem.css.js.map +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/MastheadShell.css.js +1 -1
- package/dist/generated/themes/MastheadShell.css.js.map +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/RatingIndicator.css.js +1 -1
- package/dist/generated/themes/RatingIndicator.css.js.map +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.js +1 -1
- package/dist/generated/themes/Slider.css.js.map +1 -1
- package/dist/generated/themes/TextArea.css.js +1 -1
- package/dist/generated/themes/TextArea.css.js.map +1 -1
- package/dist/i18n/messagebundle.properties +3 -0
- package/dist/i18n/messagebundle_en.properties +1 -0
- package/dist/web-types.json +3 -3
- package/package.json +1 -1
- package/src/CountrySelector.hbs +30 -30
- package/src/CountrySelector.ts +18 -13
- package/src/MastheadItem.hbs +3 -3
- package/src/MastheadItem.ts +22 -10
- package/src/MastheadMenu.ts +8 -0
- package/src/MastheadMenuItem.hbs +2 -1
- package/src/MastheadMenuItem.ts +4 -0
- package/src/MastheadProfileMenu.ts +8 -0
- package/src/MastheadShell.hbs +69 -67
- package/src/MastheadShell.ts +154 -16
- package/src/Pagination.hbs +2 -2
- package/src/Pagination.ts +8 -5
- package/src/SelectBox.ts +7 -1
- package/src/Tab.ts +18 -29
- package/src/TabHeader.hbs +1 -1
- package/src/TabNavigation.hbs +1 -2
- package/src/TabNavigation.ts +2 -1
- package/src/TextArea.hbs +21 -21
- package/src/TextArea.ts +82 -78
- package/src/TextField.hbs +4 -2
- package/src/generated/i18n/i18n-defaults.ts +2 -2
- package/src/generated/templates/MastheadItemTemplate.lit.ts +3 -3
- package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +2 -2
- package/src/generated/templates/MastheadShellTemplate.lit.ts +8 -9
- package/src/generated/templates/PaginationTemplate.lit.ts +1 -1
- package/src/generated/templates/TabHeaderTemplate.lit.ts +1 -1
- package/src/generated/templates/TabNavigationTemplate.lit.ts +1 -1
- package/src/generated/templates/TextAreaTemplate.lit.ts +5 -4
- package/src/generated/templates/TextFieldTemplate.lit.ts +1 -1
- package/src/generated/themes/CountrySelector.css.ts +1 -1
- package/src/generated/themes/MastheadItem.css.ts +1 -1
- package/src/generated/themes/MastheadMenu.css.ts +1 -1
- package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
- package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
- package/src/generated/themes/MastheadShell.css.ts +1 -1
- package/src/generated/themes/MediaPlayer.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/TextArea.css.ts +1 -1
- package/src/i18n/messagebundle.properties +3 -0
- package/src/i18n/messagebundle_en.properties +1 -0
- package/src/themes/CountrySelector.css +23 -16
- package/src/themes/MastheadItem.css +40 -2
- package/src/themes/MastheadMenu.css +72 -0
- package/src/themes/MastheadMenuItem.css +1 -0
- package/src/themes/MastheadProfileMenu.css +8 -0
- package/src/themes/MastheadShell.css +59 -27
- package/src/themes/MediaPlayer.css +18 -9
- package/src/themes/Search.css +4 -4
- package/src/themes/TextArea.css +12 -1
- package/dist/assets/messagebundle_en-4997b226.js +0 -1
package/src/MastheadShell.ts
CHANGED
|
@@ -15,19 +15,22 @@ import "@ui5/webcomponents-icons/dist/search.js";
|
|
|
15
15
|
import "@ui5/webcomponents-icons/dist/cart.js";
|
|
16
16
|
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
17
17
|
import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
18
|
+
import { MAIN_LINKS } from "./generated/i18n/i18n-defaults.js";
|
|
18
19
|
import UDExMastheadItem from "./MastheadItem.js";
|
|
19
20
|
import UDExMastheadMenu from "./MastheadMenu.js";
|
|
20
21
|
import UDExControlButton from "./ControlButton.js";
|
|
21
22
|
import UDExSearch from "./Search.js";
|
|
22
23
|
import UDExMastheadMobileMenu from "./MastheadMobileMenu.js";
|
|
23
|
-
|
|
24
|
+
import UDExMastheadProfileMenu from "./MastheadProfileMenu.js";
|
|
24
25
|
import MastheadShellTemplate from "./generated/templates/MastheadShellTemplate.lit.js";
|
|
25
26
|
|
|
26
27
|
// Styles
|
|
27
28
|
import MastheadShellCss from "./generated/themes/MastheadShell.css.js";
|
|
28
|
-
import { MAIN_LINKS } from "./generated/i18n/i18n-defaults.js";
|
|
29
29
|
|
|
30
30
|
const breakpointSizeM: number = 1279;
|
|
31
|
+
const canvasContentFont = "16px '72 Brand Variable'";
|
|
32
|
+
type MastheadSlottedItem = UDExMastheadItem | UDExMastheadProfileMenu | UDExMastheadMenu | undefined | null;
|
|
33
|
+
type MastheadItemType = UDExMastheadItem | null | undefined;
|
|
31
34
|
/**
|
|
32
35
|
* @class
|
|
33
36
|
*
|
|
@@ -293,6 +296,14 @@ class UDExMastheadShell extends UI5Element {
|
|
|
293
296
|
@property({ type: Boolean })
|
|
294
297
|
_isMobileMenuOpen!: boolean;
|
|
295
298
|
|
|
299
|
+
/**
|
|
300
|
+
* Defines the mobile mode for component
|
|
301
|
+
*
|
|
302
|
+
* @private
|
|
303
|
+
*/
|
|
304
|
+
@property({ type: Boolean })
|
|
305
|
+
_isMobileMode!: boolean;
|
|
306
|
+
|
|
296
307
|
/**
|
|
297
308
|
* Defines if the close button was clicked
|
|
298
309
|
*
|
|
@@ -343,11 +354,15 @@ class UDExMastheadShell extends UI5Element {
|
|
|
343
354
|
}
|
|
344
355
|
|
|
345
356
|
_handleResize(): void {
|
|
357
|
+
if (this.shouldHandleMobileView) {
|
|
358
|
+
this.handleMobileMode();
|
|
359
|
+
}
|
|
360
|
+
|
|
346
361
|
if (this.isBreakpointSizeM) {
|
|
347
362
|
this._isSearchOpened = false;
|
|
348
363
|
}
|
|
349
364
|
|
|
350
|
-
if (this._shouldHandleResize && this.
|
|
365
|
+
if (this._shouldHandleResize && this._isMobileMenuOpen) {
|
|
351
366
|
this.closeMobileMenu();
|
|
352
367
|
return;
|
|
353
368
|
}
|
|
@@ -355,6 +370,23 @@ class UDExMastheadShell extends UI5Element {
|
|
|
355
370
|
this._shouldHandleResize = true;
|
|
356
371
|
}
|
|
357
372
|
|
|
373
|
+
handleMobileMode(): void {
|
|
374
|
+
const rootHolder = this.getDomRef();
|
|
375
|
+
if (rootHolder) {
|
|
376
|
+
const rootHolderWidth = this.getRootHolderWidth(rootHolder);
|
|
377
|
+
const landingHolderWidth = this.getLandingHolderWidth();
|
|
378
|
+
const rightMenuWidth = this.getRightMenuWidth();
|
|
379
|
+
const mainMenuWidth = this.getMainMenuWidth();
|
|
380
|
+
const availableWidth = rootHolderWidth - rightMenuWidth - landingHolderWidth;
|
|
381
|
+
|
|
382
|
+
if (mainMenuWidth >= availableWidth) {
|
|
383
|
+
this.setMobileMode();
|
|
384
|
+
} else {
|
|
385
|
+
this.removeMobileMode();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
358
390
|
handleKeyDown(e: KeyboardEvent): void {
|
|
359
391
|
e.stopPropagation();
|
|
360
392
|
this.handleLeftArrow(e);
|
|
@@ -429,12 +461,14 @@ class UDExMastheadShell extends UI5Element {
|
|
|
429
461
|
handleMobileCloseClick(e: CustomEvent) {
|
|
430
462
|
e.preventDefault();
|
|
431
463
|
this.closeMobileMenu();
|
|
464
|
+
this.fireMobileMenuCloseEvent();
|
|
432
465
|
}
|
|
433
466
|
|
|
434
467
|
handleEnterAndSpaceOnCloseBtn(e: KeyboardEvent) {
|
|
435
468
|
if (isSpace(e) || isEnter(e)) {
|
|
436
469
|
e.preventDefault();
|
|
437
470
|
this.closeMobileMenu();
|
|
471
|
+
this.fireMobileMenuCloseEvent();
|
|
438
472
|
this.mobileBtn?.focus();
|
|
439
473
|
}
|
|
440
474
|
}
|
|
@@ -442,7 +476,7 @@ class UDExMastheadShell extends UI5Element {
|
|
|
442
476
|
handleOutsideClick(): void {
|
|
443
477
|
document.addEventListener("click", (e: Event) => {
|
|
444
478
|
const el = e.target as UDExMastheadItem;
|
|
445
|
-
const isMobile = window.innerWidth < 1280;
|
|
479
|
+
const isMobile = window.innerWidth < 1280 || this._isMobileMode;
|
|
446
480
|
const isDropdownSlot = el.getAttribute("slot") === "dropdown";
|
|
447
481
|
if (!isDropdownSlot && !el.isMenuItem && !isMobile) {
|
|
448
482
|
this.resetSelectedItems();
|
|
@@ -459,16 +493,18 @@ class UDExMastheadShell extends UI5Element {
|
|
|
459
493
|
}
|
|
460
494
|
|
|
461
495
|
focusPreviousMenuItem(item: UDExMastheadItem): void {
|
|
496
|
+
const menuItems = this.menuItems;
|
|
497
|
+
const lastItemIndex = menuItems.length - 1;
|
|
462
498
|
const currentSelectedIndex = this.getCurrentIndex(item);
|
|
463
|
-
const lastItemIndex = this.menuItems.length - 1;
|
|
464
499
|
const previousSelectIndex = currentSelectedIndex - 1 < 0 ? lastItemIndex : currentSelectedIndex - 1;
|
|
465
|
-
|
|
500
|
+
menuItems[previousSelectIndex].focus();
|
|
466
501
|
}
|
|
467
502
|
|
|
468
503
|
focusNextMenuItem(item: UDExMastheadItem): void {
|
|
504
|
+
const menuItems = this.menuItems;
|
|
469
505
|
const currentSelectedIndex = this.getCurrentIndex(item);
|
|
470
|
-
const nextSelectIndex = currentSelectedIndex + 1 >
|
|
471
|
-
|
|
506
|
+
const nextSelectIndex = currentSelectedIndex + 1 > menuItems.length - 1 ? 0 : currentSelectedIndex + 1;
|
|
507
|
+
menuItems[nextSelectIndex].focus();
|
|
472
508
|
}
|
|
473
509
|
|
|
474
510
|
resetSelectedItems(): void {
|
|
@@ -518,6 +554,74 @@ class UDExMastheadShell extends UI5Element {
|
|
|
518
554
|
return buttonsArray.filter(({ selected }) => selected);
|
|
519
555
|
}
|
|
520
556
|
|
|
557
|
+
getRootHolderWidth(root: HTMLElement): number {
|
|
558
|
+
const rootPadding = parseInt(window.getComputedStyle(root).getPropertyValue("padding-left")) * 2;
|
|
559
|
+
const scrollWidth = window.innerWidth - document.documentElement.clientWidth;
|
|
560
|
+
return this.getDomRef()!.clientWidth + scrollWidth - rootPadding;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
getLandingHolderWidth(): number {
|
|
564
|
+
const landingHolder = this.getDomElement(".udex-masthead-shell__landing-wrap");
|
|
565
|
+
return landingHolder?.offsetWidth || 0;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
getRightMenuWidth(): number {
|
|
569
|
+
const itemsIcon = [...this.shadowRoot!.querySelectorAll<HTMLDivElement>(".udex-masthead-shell__item_icon")];
|
|
570
|
+
const itemIconWidths = itemsIcon.length * this.getItemIconWidth();
|
|
571
|
+
const itemIconGaps = itemsIcon.length * this.getItemIconGap();
|
|
572
|
+
const exploreSAPWidth = this.hasExploreSAP ? this.getItemWidth(this.exploreSAP[0]) : 0;
|
|
573
|
+
const rightMenuGaps = this.getRightMenuGap() + this.getExploreSapBtnGap() + itemIconGaps;
|
|
574
|
+
return exploreSAPWidth + itemIconWidths + rightMenuGaps;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
getItemIconWidth(): number {
|
|
578
|
+
const style = window.getComputedStyle(this.profileItem);
|
|
579
|
+
const itemIconWidthVar = style.getPropertyValue("--udex-masthead-item-button-icon-size");
|
|
580
|
+
return parseInt(itemIconWidthVar);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
getMainMenuWidth(): number {
|
|
584
|
+
const mainItems = this.getSlottedNodes("menuItems");
|
|
585
|
+
const gapItemVar = this.getRootVar("--udex-masthead-shell-item-gap");
|
|
586
|
+
return mainItems.reduce((accumulatedWidth, item, index) => {
|
|
587
|
+
return accumulatedWidth + this.getItemWidth(item as UDExMastheadItem) + (index && parseInt(gapItemVar));
|
|
588
|
+
}, 0);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
getDomElement(selector: string): HTMLElement | undefined | null {
|
|
592
|
+
return this.shadowRoot?.querySelector(`${selector}`);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
getItemWidth(item: UDExMastheadItem): number {
|
|
596
|
+
const context = this.getCanvasContext();
|
|
597
|
+
context.font = canvasContentFont;
|
|
598
|
+
return Math.ceil(context.measureText(item.innerText.trim()).width);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
getCanvasContext(): CanvasRenderingContext2D {
|
|
602
|
+
const canvas = document.createElement("canvas");
|
|
603
|
+
return canvas.getContext("2d")!;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
getItemIconGap(): number {
|
|
607
|
+
const gapIconItemVar = this.getRootVar("--udex-masthead-shell-item-icon-gap");
|
|
608
|
+
return parseInt(gapIconItemVar);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
getExploreSapBtnGap(): number {
|
|
612
|
+
const exploreSapBtnGapVar = this.getRootVar("--udex-masthead-shell-explore-margin");
|
|
613
|
+
return this.hasExploreSAP ? parseInt(exploreSapBtnGapVar) : 0;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
getRightMenuGap(): number {
|
|
617
|
+
const rightMenuGapVar = this.getRootVar("--udex-masthead-right-menu-padding");
|
|
618
|
+
return parseInt(rightMenuGapVar);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
getRootVar(variableName: string): string {
|
|
622
|
+
return window.getComputedStyle(this.getDomRef()!).getPropertyValue(`${variableName}`);
|
|
623
|
+
}
|
|
624
|
+
|
|
521
625
|
isNavigationItem(item: UDExMastheadItem): boolean {
|
|
522
626
|
return this.menuItems.some(menuItem => menuItem === item);
|
|
523
627
|
}
|
|
@@ -541,15 +645,33 @@ class UDExMastheadShell extends UI5Element {
|
|
|
541
645
|
if (this.bodyOverflow) {
|
|
542
646
|
this.removeOverflowBody();
|
|
543
647
|
}
|
|
648
|
+
}
|
|
544
649
|
|
|
545
|
-
|
|
650
|
+
setMobileMode(): void {
|
|
651
|
+
this._isMobileMode = true;
|
|
652
|
+
this.slottedItems.forEach((item: MastheadSlottedItem) => {
|
|
653
|
+
if (item) {
|
|
654
|
+
item._isMobileMode = true;
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
removeMobileMode(): void {
|
|
660
|
+
this._isMobileMode = false;
|
|
661
|
+
this.slottedItems.forEach((item: MastheadSlottedItem) => {
|
|
662
|
+
item?.removeAttribute("_is-mobile-mode");
|
|
663
|
+
});
|
|
546
664
|
}
|
|
547
665
|
|
|
548
666
|
fireMobileMenuCloseEvent(): void {
|
|
549
667
|
this.fireEvent("mobile-menu-close");
|
|
550
668
|
}
|
|
551
669
|
|
|
552
|
-
get
|
|
670
|
+
get slottedItems(): (MastheadSlottedItem)[] {
|
|
671
|
+
return [this.profileItem, this.cartItem, this.profileMenu, this.profileMenuLinks];
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
get searchOpener(): MastheadItemType {
|
|
553
675
|
return this.shadowRoot?.querySelector(".udex-masthead-shell__search-btn");
|
|
554
676
|
}
|
|
555
677
|
|
|
@@ -561,14 +683,30 @@ class UDExMastheadShell extends UI5Element {
|
|
|
561
683
|
return this.querySelector("[udex-masthead-mobile-menu]");
|
|
562
684
|
}
|
|
563
685
|
|
|
564
|
-
get mobileBtn():
|
|
686
|
+
get mobileBtn(): MastheadItemType {
|
|
565
687
|
return this.shadowRoot?.querySelector(".udex-masthead-shell__menu-btn");
|
|
566
688
|
}
|
|
567
689
|
|
|
568
|
-
get closeBtn():
|
|
690
|
+
get closeBtn(): MastheadItemType {
|
|
569
691
|
return this.shadowRoot?.querySelector(".udex-masthead-shell__close-btn");
|
|
570
692
|
}
|
|
571
693
|
|
|
694
|
+
get profileItem(): UDExMastheadItem {
|
|
695
|
+
return this.getSlottedNodes<UDExMastheadItem>("profile")[0];
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
get cartItem(): MastheadItemType {
|
|
699
|
+
return this.getSlottedNodes<UDExMastheadItem>("cart")[0];
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
get profileMenu(): UDExMastheadProfileMenu {
|
|
703
|
+
return this.querySelector("[udex-masthead-profile-menu]")!;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
get profileMenuLinks(): UDExMastheadMenu | undefined | null {
|
|
707
|
+
return this.profileMenu?.shadowRoot?.querySelector("[udex-masthead-menu]");
|
|
708
|
+
}
|
|
709
|
+
|
|
572
710
|
get hasProfile(): boolean {
|
|
573
711
|
return !!this.profile.length;
|
|
574
712
|
}
|
|
@@ -597,14 +735,14 @@ class UDExMastheadShell extends UI5Element {
|
|
|
597
735
|
return !this.showSearchByDefault && !this._isSearchOpened;
|
|
598
736
|
}
|
|
599
737
|
|
|
600
|
-
get isRightMenuVisible(): boolean {
|
|
601
|
-
return this.showSearchByDefault || !this._isSearchOpened;
|
|
602
|
-
}
|
|
603
|
-
|
|
604
738
|
get isSearchVisible(): boolean {
|
|
605
739
|
return this.showSearchByDefault || this._isSearchOpened;
|
|
606
740
|
}
|
|
607
741
|
|
|
742
|
+
get shouldHandleMobileView(): boolean {
|
|
743
|
+
return !this.isBreakpointSizeM && !this.showSearchByDefault;
|
|
744
|
+
}
|
|
745
|
+
|
|
608
746
|
get mainNavigationAriaLabel(): string {
|
|
609
747
|
return UDExMastheadShell.i18nBundle.getText(MAIN_LINKS);
|
|
610
748
|
}
|
package/src/Pagination.hbs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{{#if pages}}
|
|
2
|
-
<nav
|
|
3
|
-
<ul class="udex-pagination__list"
|
|
2
|
+
<nav class="{{paginationClass}}" role="navigation" aria-label="{{paginationAccessibleName}}">
|
|
3
|
+
<ul class="udex-pagination__list">
|
|
4
4
|
{{#if absoluteNavigation}}
|
|
5
5
|
<li class="udex-pagination__item--first udex-pagination__item">
|
|
6
6
|
<udex-button
|
package/src/Pagination.ts
CHANGED
|
@@ -82,9 +82,10 @@ class UDExPagination extends UI5Element {
|
|
|
82
82
|
* Defines number of pages.
|
|
83
83
|
*
|
|
84
84
|
* @public
|
|
85
|
+
* @default 0
|
|
85
86
|
*/
|
|
86
|
-
@property({ validator: Integer })
|
|
87
|
-
pages
|
|
87
|
+
@property({ validator: Integer, defaultValue: 0 })
|
|
88
|
+
pages: number;
|
|
88
89
|
|
|
89
90
|
/**
|
|
90
91
|
* Defines type of pagination.
|
|
@@ -143,6 +144,7 @@ class UDExPagination extends UI5Element {
|
|
|
143
144
|
|
|
144
145
|
constructor() {
|
|
145
146
|
super();
|
|
147
|
+
this.pages = 0;
|
|
146
148
|
this._pages = [];
|
|
147
149
|
this._visiblePages = [];
|
|
148
150
|
this.currentPageIndex = 0;
|
|
@@ -348,15 +350,16 @@ class UDExPagination extends UI5Element {
|
|
|
348
350
|
this.emitChangeEvent();
|
|
349
351
|
}
|
|
350
352
|
|
|
351
|
-
setupPages(pages
|
|
353
|
+
setupPages(pages: number) {
|
|
352
354
|
if (!pages) {
|
|
353
355
|
this._visiblePages = [];
|
|
354
356
|
return;
|
|
355
357
|
}
|
|
356
358
|
|
|
357
|
-
if (!this._pages.length) {
|
|
359
|
+
if (!this._pages.length || this._visiblePages.length < this.displayNumber) {
|
|
358
360
|
this._firstPageIndex = 0;
|
|
359
361
|
this._lastPageIndex = pages > this.displayNumber ? this.displayNumber : pages;
|
|
362
|
+
this._pageFocusedManually = false;
|
|
360
363
|
}
|
|
361
364
|
|
|
362
365
|
this._pages = this.setupPagesData();
|
|
@@ -397,7 +400,7 @@ class UDExPagination extends UI5Element {
|
|
|
397
400
|
this._lastPageIndex--;
|
|
398
401
|
}
|
|
399
402
|
} else {
|
|
400
|
-
while (this._lastPageIndex - this.currentPageIndex - 1 < this.pageOffset && this._lastPageIndex < this.pages
|
|
403
|
+
while (this._lastPageIndex - this.currentPageIndex - 1 < this.pageOffset && this._lastPageIndex < this.pages) {
|
|
401
404
|
this._firstPageIndex++;
|
|
402
405
|
this._lastPageIndex++;
|
|
403
406
|
}
|
package/src/SelectBox.ts
CHANGED
|
@@ -246,6 +246,7 @@ class UDExSelectBox extends UDExSearchableListBase {
|
|
|
246
246
|
_showTagsDropdownContent!: boolean;
|
|
247
247
|
|
|
248
248
|
_trigger!: HTMLElement;
|
|
249
|
+
_triggerWrapper!: HTMLElement;
|
|
249
250
|
_popover!: Popover;
|
|
250
251
|
_tokenizer!: Tokenizer;
|
|
251
252
|
_search!: UDExSearch;
|
|
@@ -278,6 +279,7 @@ class UDExSelectBox extends UDExSearchableListBase {
|
|
|
278
279
|
this._popover = this.getPopover();
|
|
279
280
|
this._search = this.getSearch();
|
|
280
281
|
this._trigger = this.getTrigger();
|
|
282
|
+
this._triggerWrapper = this.getTriggerWrapper();
|
|
281
283
|
this._tags = this.getTags();
|
|
282
284
|
this.handleDirection();
|
|
283
285
|
if (this._tokenizer?.tokens.length > 0) {
|
|
@@ -298,7 +300,7 @@ class UDExSelectBox extends UDExSearchableListBase {
|
|
|
298
300
|
}
|
|
299
301
|
|
|
300
302
|
_handleResize() {
|
|
301
|
-
this._popover.style.setProperty("--udex-dropdown-pane-width", `${this.offsetWidth}px`);
|
|
303
|
+
this._popover.style.setProperty("--udex-dropdown-pane-width", `${this._triggerWrapper.offsetWidth}px`);
|
|
302
304
|
}
|
|
303
305
|
|
|
304
306
|
handleItemPress(e:CustomEvent) {
|
|
@@ -588,6 +590,10 @@ class UDExSelectBox extends UDExSearchableListBase {
|
|
|
588
590
|
return this.shadowRoot!.querySelector(".udex-text-field__input")!;
|
|
589
591
|
}
|
|
590
592
|
|
|
593
|
+
getTriggerWrapper(): HTMLElement {
|
|
594
|
+
return this.shadowRoot!.querySelector(".udex-text-field__wrap")!;
|
|
595
|
+
}
|
|
596
|
+
|
|
591
597
|
getTagGroup(): UDExTagGroup {
|
|
592
598
|
return this.shadowRoot!.querySelector<UDExTagGroup>("[udex-tag-group]")!;
|
|
593
599
|
}
|
package/src/Tab.ts
CHANGED
|
@@ -38,7 +38,6 @@ interface ITab extends UI5Element {
|
|
|
38
38
|
isOnSelectedTab: boolean;
|
|
39
39
|
hasNotIcon: boolean;
|
|
40
40
|
hasNotHref: boolean;
|
|
41
|
-
isSelected: boolean;
|
|
42
41
|
selectedClass: string;
|
|
43
42
|
tabNavigation: any;
|
|
44
43
|
_individualSlot: string;
|
|
@@ -46,7 +45,6 @@ interface ITab extends UI5Element {
|
|
|
46
45
|
_slotName: string;
|
|
47
46
|
_selected?: boolean;
|
|
48
47
|
_tabIndex: string;
|
|
49
|
-
_contentTabIndex: string;
|
|
50
48
|
_iconWithoutBackground: boolean;
|
|
51
49
|
_posinset?: number;
|
|
52
50
|
_setsize?: number;
|
|
@@ -174,15 +172,6 @@ class UDExTab extends UI5Element implements ITab {
|
|
|
174
172
|
@property({ type: String })
|
|
175
173
|
_tabIndex!: string;
|
|
176
174
|
|
|
177
|
-
/**
|
|
178
|
-
* Defines the tabindex of the tab content.
|
|
179
|
-
*
|
|
180
|
-
* @private
|
|
181
|
-
* @default -1
|
|
182
|
-
*/
|
|
183
|
-
@property({ type: String })
|
|
184
|
-
_contentTabIndex!: string;
|
|
185
|
-
|
|
186
175
|
/**
|
|
187
176
|
* Defines the background color of the component.
|
|
188
177
|
*
|
|
@@ -222,7 +211,7 @@ class UDExTab extends UI5Element implements ITab {
|
|
|
222
211
|
return this._realTab === this;
|
|
223
212
|
}
|
|
224
213
|
|
|
225
|
-
get _effectiveSlotName() {
|
|
214
|
+
get _effectiveSlotName(): string {
|
|
226
215
|
return this.isOnSelectedTab ? this._individualSlot : `disabled-${this._individualSlot}`;
|
|
227
216
|
}
|
|
228
217
|
|
|
@@ -246,35 +235,23 @@ class UDExTab extends UI5Element implements ITab {
|
|
|
246
235
|
return !this.href;
|
|
247
236
|
}
|
|
248
237
|
|
|
249
|
-
get
|
|
238
|
+
get effectiveSelected(): boolean {
|
|
250
239
|
return this.selected || this._selected;
|
|
251
240
|
}
|
|
252
241
|
|
|
253
242
|
get selectedClass(): string {
|
|
254
|
-
return this.
|
|
243
|
+
return this.effectiveSelected ? "udex-tab-navigation__button-tab--active" : "";
|
|
255
244
|
}
|
|
256
245
|
|
|
257
246
|
get classWithIconWithoutBackground(): string {
|
|
258
247
|
return this.hasIcon && !this._iconWithoutBackground ? " udex-tab-navigation__button-tab--icon-tab" : "";
|
|
259
248
|
}
|
|
260
249
|
|
|
261
|
-
get
|
|
262
|
-
return executeTemplate(UDExTab.headerTemplate, this);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
get tabInOverflow() {
|
|
266
|
-
return executeTemplate(UDExTab.overflowTemplate, this);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
get _slotName() {
|
|
250
|
+
get _slotName(): string {
|
|
270
251
|
return this.isOnSelectedTab ? this._individualSlot : `disabled-${this._individualSlot}`;
|
|
271
252
|
}
|
|
272
253
|
|
|
273
|
-
get
|
|
274
|
-
return this.selected || this._selected;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
get ariaLabelledBy() {
|
|
254
|
+
get ariaLabelledBy(): string {
|
|
278
255
|
const labels = [];
|
|
279
256
|
|
|
280
257
|
if (this.text) {
|
|
@@ -288,10 +265,22 @@ class UDExTab extends UI5Element implements ITab {
|
|
|
288
265
|
return labels.join(" ");
|
|
289
266
|
}
|
|
290
267
|
|
|
291
|
-
get accessibleNameText() {
|
|
268
|
+
get accessibleNameText(): string {
|
|
292
269
|
return this.accessibleName || (this.showAttentionBadge ? `, ${UDExTab.i18nBundle.getText(ATTENTION_BADGE)}` : "");
|
|
293
270
|
}
|
|
294
271
|
|
|
272
|
+
get linkTabIndex(): string {
|
|
273
|
+
return this.href && this.effectiveSelected ? "1" : "-1";
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
get tabNavigation() {
|
|
277
|
+
return executeTemplate(UDExTab.headerTemplate, this);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
get tabInOverflow() {
|
|
281
|
+
return executeTemplate(UDExTab.overflowTemplate, this);
|
|
282
|
+
}
|
|
283
|
+
|
|
295
284
|
static get headerTemplate() {
|
|
296
285
|
return TabHeaderTemplate;
|
|
297
286
|
}
|
package/src/TabHeader.hbs
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<a
|
|
20
20
|
id="{{this._id}}"
|
|
21
21
|
class="udex-tab-navigation__button-tab {{selectedClass}} {{classWithIconWithoutBackground}} {{buttonClassWithIcon}}"
|
|
22
|
-
tabindex="
|
|
22
|
+
tabindex="{{this.linkTabIndex}}"
|
|
23
23
|
role="tab"
|
|
24
24
|
aria-posinset="{{this._posinset}}"
|
|
25
25
|
aria-setsize="{{this._setsize}}"
|
package/src/TabNavigation.hbs
CHANGED
package/src/TabNavigation.ts
CHANGED
|
@@ -74,6 +74,7 @@ export enum Mode {
|
|
|
74
74
|
template: TabNavigationTemplate,
|
|
75
75
|
dependencies: [Popover, Icon],
|
|
76
76
|
})
|
|
77
|
+
|
|
77
78
|
/**
|
|
78
79
|
* Fires when the tab was clicked.
|
|
79
80
|
*
|
|
@@ -86,6 +87,7 @@ export enum Mode {
|
|
|
86
87
|
currentPage: { type: Number },
|
|
87
88
|
},
|
|
88
89
|
})
|
|
90
|
+
|
|
89
91
|
class UDExTabNavigation extends UI5Element {
|
|
90
92
|
/**
|
|
91
93
|
* Defines the size of the "More" button.
|
|
@@ -228,7 +230,6 @@ class UDExTabNavigation extends UI5Element {
|
|
|
228
230
|
tab._contentId = this.getContentId(index);
|
|
229
231
|
tab._realTab = this._selectedTab;
|
|
230
232
|
tab._width = this.tabWidth;
|
|
231
|
-
tab._contentTabIndex = this.getContentTabIndex(tab);
|
|
232
233
|
});
|
|
233
234
|
}
|
|
234
235
|
|
package/src/TextArea.hbs
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
<div class="udex-textarea">
|
|
2
2
|
<div class="udex-textarea__wrapper">
|
|
3
3
|
{{#if label}}
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
<label
|
|
5
|
+
class="{{labelClasses}}"
|
|
6
|
+
for="textarea"
|
|
7
|
+
part="label">
|
|
8
|
+
{{label}}
|
|
9
|
+
{{#if required}}
|
|
10
|
+
*
|
|
11
|
+
{{/if}}
|
|
12
|
+
</label>
|
|
13
|
+
{{else}}
|
|
14
|
+
<label for="textarea" class="hidden-label">{{textHiddenLabel}}</label>
|
|
14
15
|
{{/if}}
|
|
15
16
|
<textarea
|
|
16
17
|
id="textarea"
|
|
@@ -32,23 +33,22 @@
|
|
|
32
33
|
@focus="{{handleFocus}}"
|
|
33
34
|
@click="{{handleClick}}"
|
|
34
35
|
@blur="{{handleBlur}}"
|
|
35
|
-
@change="{{handleChange}}"
|
|
36
|
-
>
|
|
36
|
+
@change="{{handleChange}}">
|
|
37
37
|
</textarea>
|
|
38
38
|
</div>
|
|
39
39
|
{{#if _supportingText}}
|
|
40
40
|
<udex-status-message
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
supporting-text-alignment="Right"
|
|
42
|
+
?disabled="{{disabled}}"
|
|
43
|
+
supporting-text="{{_supportingText}}"
|
|
44
|
+
value-state="{{fieldState}}">
|
|
45
45
|
</udex-status-message>
|
|
46
|
-
|
|
46
|
+
<span id="{{_id}}-supportingTextDesc" class="hidden-text">{{_supportingText}}</span>
|
|
47
47
|
{{/if}}
|
|
48
48
|
{{#if hasValueState}}
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
<span id="{{_id}}-valueStateDesc" class="hidden-text">{{ariaValueStateHiddenText}}</span>
|
|
50
|
+
{{/if}}
|
|
51
51
|
{{#if readonly}}
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
<span id="{{_id}}-readonlyDesc" class="hidden-text">{{readOnlyText}}</span>
|
|
53
|
+
{{/if}}
|
|
54
54
|
</div>
|