@sapudex/web-components 2.55.0 → 2.56.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/HeroBanner.cy.tsx +35 -1
- package/cypress/specs/List.cy.tsx +63 -1
- package/cypress/specs/ListItem.cy.tsx +44 -0
- package/cypress/specs/MastheadShell.cy.tsx +39 -0
- package/cypress/specs/PhoneNumberField.cy.tsx +29 -1
- package/cypress/specs/SelectBox.cy.tsx +99 -0
- package/dist/CountrySelectorTemplate.js +1 -1
- package/dist/CountrySelectorTemplate.js.map +1 -1
- package/dist/FilterMenu.js +5 -1
- package/dist/FilterMenu.js.map +1 -1
- package/dist/HeroBanner.d.ts +12 -0
- package/dist/HeroBanner.js +54 -0
- package/dist/HeroBanner.js.map +1 -1
- package/dist/List.d.ts +5 -0
- package/dist/List.js +7 -0
- package/dist/List.js.map +1 -1
- package/dist/ListItem.js +5 -1
- package/dist/ListItem.js.map +1 -1
- package/dist/ListTemplate.js +1 -1
- package/dist/ListTemplate.js.map +1 -1
- package/dist/MastheadShell.d.ts +7 -0
- package/dist/MastheadShell.js +38 -0
- package/dist/MastheadShell.js.map +1 -1
- package/dist/PhoneNumberField.d.ts +3 -3
- package/dist/PhoneNumberField.js +18 -21
- package/dist/PhoneNumberField.js.map +1 -1
- package/dist/PhoneNumberFieldTemplate.d.ts +2 -0
- package/dist/PhoneNumberFieldTemplate.js +12 -0
- package/dist/PhoneNumberFieldTemplate.js.map +1 -0
- package/dist/Search.d.ts +2 -0
- package/dist/Search.js +21 -0
- package/dist/Search.js.map +1 -1
- package/dist/SearchableListBase.d.ts +4 -0
- package/dist/SearchableListBase.js +66 -6
- package/dist/SearchableListBase.js.map +1 -1
- package/dist/SearchableListBaseTemplate.js +1 -1
- package/dist/SearchableListBaseTemplate.js.map +1 -1
- package/dist/SelectBase.js +14 -22
- package/dist/SelectBase.js.map +1 -1
- package/dist/SelectBoxTemplate.js +1 -1
- package/dist/SelectBoxTemplate.js.map +1 -1
- package/dist/StatusMessage.d.ts +2 -2
- package/dist/StatusMessage.js +1 -1
- package/dist/StatusMessage.js.map +1 -1
- package/dist/TextAreaTemplate.js +1 -1
- package/dist/TextAreaTemplate.js.map +1 -1
- package/dist/TextFieldTemplate.js +1 -1
- package/dist/TextFieldTemplate.js.map +1 -1
- package/dist/Upload.js +6 -9
- package/dist/Upload.js.map +1 -1
- package/dist/UploadItem.d.ts +2 -2
- package/dist/UploadItem.js +6 -9
- package/dist/UploadItem.js.map +1 -1
- package/dist/UploadItemTemplate.d.ts +2 -0
- package/dist/UploadItemTemplate.js +14 -0
- package/dist/UploadItemTemplate.js.map +1 -0
- package/dist/UploadTemplate.d.ts +2 -0
- package/dist/UploadTemplate.js +11 -0
- package/dist/UploadTemplate.js.map +1 -0
- package/dist/assets/{InputSuggestions-DPiJnNLn.js → InputSuggestions-ChhTxYh4.js} +1 -1
- package/dist/assets/{ListItemStandardExpandableTextTemplate-B-v72jL6.js → ListItemStandardExpandableTextTemplate-Bh1HxZfH.js} +1 -1
- package/dist/assets/{bundle-C7Yft7IG.css → bundle-CdO3MnjQ.css} +1 -1
- package/dist/assets/{bundle.esm-DPppjwN7.js → bundle.esm-DCX_ohoZ.js} +253 -241
- package/dist/assets/messagebundle_uk-CCv57GhV.js +1 -0
- package/dist/css/themes/AccordionItem.css +1 -1
- package/dist/css/themes/AccordionSpotlight.css +1 -1
- package/dist/css/themes/Avatar.css +1 -1
- package/dist/css/themes/CountrySelector.css +1 -1
- package/dist/css/themes/EventRibbon.css +1 -1
- package/dist/css/themes/FilterMenu.css +1 -1
- package/dist/css/themes/HeroBanner.css +1 -1
- package/dist/css/themes/ImageGridTicker.css +1 -1
- package/dist/css/themes/ListItem.css +1 -1
- package/dist/css/themes/MastheadCountrySelector.css +1 -1
- package/dist/css/themes/MastheadItem.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/Modal.css +1 -1
- package/dist/css/themes/PhoneNumberField.css +1 -1
- package/dist/css/themes/Search.css +1 -1
- package/dist/css/themes/SecondaryNavigationItem.css +1 -1
- package/dist/css/themes/SelectBase.css +1 -1
- package/dist/css/themes/StepInput.css +1 -1
- package/dist/css/themes/TabInOverflow.css +1 -1
- package/dist/css/themes/TabNavigation.css +1 -1
- package/dist/css/themes/TableCellBase.css +1 -1
- package/dist/css/themes/TagGroup.css +1 -1
- package/dist/css/themes/TextArea.css +1 -1
- package/dist/css/themes/TextField.css +1 -1
- package/dist/css/themes/Wizard.css +1 -1
- package/dist/custom-elements-internal.json +1138 -117
- package/dist/custom-elements.json +740 -123
- package/dist/generated/assets/i18n/messagebundle_uk.json +1 -1
- 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/AccordionSpotlight.css.d.ts +1 -1
- package/dist/generated/themes/AccordionSpotlight.css.js +1 -1
- package/dist/generated/themes/AccordionSpotlight.css.js.map +1 -1
- package/dist/generated/themes/Avatar.css.d.ts +1 -1
- package/dist/generated/themes/Avatar.css.js +1 -1
- package/dist/generated/themes/Avatar.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/EventRibbon.css.d.ts +1 -1
- package/dist/generated/themes/EventRibbon.css.js +1 -1
- package/dist/generated/themes/EventRibbon.css.js.map +1 -1
- package/dist/generated/themes/FilterMenu.css.d.ts +1 -1
- package/dist/generated/themes/FilterMenu.css.js +1 -1
- package/dist/generated/themes/FilterMenu.css.js.map +1 -1
- package/dist/generated/themes/HeroBanner.css.d.ts +1 -1
- package/dist/generated/themes/HeroBanner.css.js +1 -1
- package/dist/generated/themes/HeroBanner.css.js.map +1 -1
- package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
- package/dist/generated/themes/ImageGridTicker.css.js +1 -1
- package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
- package/dist/generated/themes/ListItem.css.d.ts +1 -1
- package/dist/generated/themes/ListItem.css.js +1 -1
- package/dist/generated/themes/ListItem.css.js.map +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
- package/dist/generated/themes/MastheadItem.css.d.ts +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/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/MastheadShell.css.d.ts +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.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/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/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/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/SecondaryNavigationItem.css.d.ts +1 -1
- package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
- package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
- package/dist/generated/themes/SelectBase.css.d.ts +1 -1
- package/dist/generated/themes/SelectBase.css.js +1 -1
- package/dist/generated/themes/SelectBase.css.js.map +1 -1
- package/dist/generated/themes/StepInput.css.d.ts +1 -1
- package/dist/generated/themes/StepInput.css.js +1 -1
- package/dist/generated/themes/StepInput.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/generated/themes/TabNavigation.css.d.ts +1 -1
- package/dist/generated/themes/TabNavigation.css.js +1 -1
- package/dist/generated/themes/TabNavigation.css.js.map +1 -1
- package/dist/generated/themes/TableCellBase.css.d.ts +1 -1
- package/dist/generated/themes/TableCellBase.css.js +1 -1
- package/dist/generated/themes/TableCellBase.css.js.map +1 -1
- package/dist/generated/themes/TagGroup.css.d.ts +1 -1
- package/dist/generated/themes/TagGroup.css.js +1 -1
- package/dist/generated/themes/TagGroup.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/generated/themes/Wizard.css.d.ts +1 -1
- package/dist/generated/themes/Wizard.css.js +1 -1
- package/dist/generated/themes/Wizard.css.js.map +1 -1
- package/dist/messagebundle_uk.properties +8 -0
- package/dist/utils/searchBackdrop.d.ts +1 -0
- package/dist/utils/searchBackdrop.js +23 -0
- package/dist/utils/searchBackdrop.js.map +1 -0
- package/dist/vscode.html-custom-data.json +165 -2
- package/dist/web-types.json +363 -6
- package/package.json +1 -1
- package/src/CountrySelectorTemplate.tsx +2 -2
- package/src/FilterMenu.ts +5 -1
- package/src/HeroBanner.ts +66 -0
- package/src/List.ts +8 -0
- package/src/ListItem.ts +5 -1
- package/src/ListTemplate.tsx +1 -1
- package/src/MastheadShell.ts +44 -0
- package/src/PhoneNumberField.ts +23 -22
- package/src/PhoneNumberFieldTemplate.tsx +128 -0
- package/src/Search.ts +21 -1
- package/src/SearchableListBase.ts +62 -7
- package/src/SearchableListBaseTemplate.tsx +1 -0
- package/src/SelectBase.ts +14 -21
- package/src/SelectBoxTemplate.tsx +1 -1
- package/src/StatusMessage.ts +4 -3
- package/src/TextAreaTemplate.tsx +1 -1
- package/src/TextFieldTemplate.tsx +1 -1
- package/src/Upload.ts +7 -10
- package/src/UploadItem.ts +7 -9
- package/src/UploadItemTemplate.tsx +62 -0
- package/src/UploadTemplate.tsx +53 -0
- package/src/generated/themes/AccordionItem.css.ts +1 -1
- package/src/generated/themes/AccordionSpotlight.css.ts +1 -1
- package/src/generated/themes/Avatar.css.ts +1 -1
- package/src/generated/themes/CountrySelector.css.ts +1 -1
- package/src/generated/themes/EventRibbon.css.ts +1 -1
- package/src/generated/themes/FilterMenu.css.ts +1 -1
- package/src/generated/themes/HeroBanner.css.ts +1 -1
- package/src/generated/themes/ImageGridTicker.css.ts +1 -1
- package/src/generated/themes/ListItem.css.ts +1 -1
- package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
- package/src/generated/themes/MastheadItem.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/Modal.css.ts +1 -1
- package/src/generated/themes/PhoneNumberField.css.ts +1 -1
- package/src/generated/themes/Search.css.ts +1 -1
- package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
- package/src/generated/themes/SelectBase.css.ts +1 -1
- package/src/generated/themes/StepInput.css.ts +1 -1
- package/src/generated/themes/TabInOverflow.css.ts +1 -1
- package/src/generated/themes/TabNavigation.css.ts +1 -1
- package/src/generated/themes/TableCellBase.css.ts +1 -1
- package/src/generated/themes/TagGroup.css.ts +1 -1
- package/src/generated/themes/TextArea.css.ts +1 -1
- package/src/generated/themes/TextField.css.ts +1 -1
- package/src/generated/themes/Wizard.css.ts +1 -1
- package/src/i18n/messagebundle_uk.properties +8 -0
- package/src/themes/AccordionItem.css +1 -1
- package/src/themes/AccordionSpotlight.css +1 -1
- package/src/themes/Avatar.css +1 -1
- package/src/themes/CountrySelector.css +12 -2
- package/src/themes/EventRibbon.css +1 -1
- package/src/themes/FilterMenu.css +3 -2
- package/src/themes/HeroBanner.css +1 -1
- package/src/themes/ImageGridTicker.css +1 -1
- package/src/themes/ListItem.css +10 -2
- package/src/themes/MastheadCountrySelector.css +1 -1
- package/src/themes/MastheadItem.css +1 -1
- package/src/themes/MastheadProfileMenu.css +1 -1
- package/src/themes/MastheadShell.css +1 -1
- package/src/themes/MediaPlayer.css +10 -10
- package/src/themes/Modal.css +5 -3
- package/src/themes/PhoneNumberField.css +16 -6
- package/src/themes/Search.css +9 -9
- package/src/themes/SecondaryNavigationItem.css +1 -1
- package/src/themes/SelectBase.css +2 -2
- package/src/themes/StepInput.css +1 -1
- package/src/themes/TabInOverflow.css +2 -2
- package/src/themes/TabNavigation.css +7 -7
- package/src/themes/TableCellBase.css +1 -1
- package/src/themes/TagGroup.css +1 -1
- package/src/themes/TextArea.css +1 -1
- package/src/themes/TextField.css +1 -1
- package/src/themes/Wizard.css +1 -1
- package/src/utils/searchBackdrop.ts +23 -0
- package/dist/assets/messagebundle_uk-GmdhsMsP.js +0 -1
- package/dist/generated/templates/PhoneNumberFieldTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/PhoneNumberFieldTemplate.lit.js +0 -16
- package/dist/generated/templates/PhoneNumberFieldTemplate.lit.js.map +0 -1
- package/dist/generated/templates/UploadItemTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/UploadItemTemplate.lit.js +0 -12
- package/dist/generated/templates/UploadItemTemplate.lit.js.map +0 -1
- package/dist/generated/templates/UploadTemplate.lit.d.ts +0 -3
- package/dist/generated/templates/UploadTemplate.lit.js +0 -10
- package/dist/generated/templates/UploadTemplate.lit.js.map +0 -1
- package/src/PhoneNumberField.hbs +0 -119
- package/src/Upload.hbs +0 -21
- package/src/UploadItem.hbs +0 -32
- package/src/generated/templates/PhoneNumberFieldTemplate.lit.ts +0 -20
- package/src/generated/templates/UploadItemTemplate.lit.ts +0 -16
- package/src/generated/templates/UploadTemplate.lit.ts +0 -14
package/src/MastheadShell.ts
CHANGED
|
@@ -29,6 +29,7 @@ import { BreakpointUtils } from "./utils/Breakpoints.js";
|
|
|
29
29
|
import AnalyticsName from "./types/AnalyticsName.js";
|
|
30
30
|
import MastheadShellTemplate from "./generated/templates/MastheadShellTemplate.lit.js";
|
|
31
31
|
import translate from "./utils/translate.js";
|
|
32
|
+
import ensureSearchBackdropStyles from "./utils/searchBackdrop.js";
|
|
32
33
|
|
|
33
34
|
// Styles
|
|
34
35
|
import MastheadShellCss from "./generated/themes/MastheadShell.css.js";
|
|
@@ -550,11 +551,16 @@ class UDExMastheadShell extends UI5Element {
|
|
|
550
551
|
_rootHolder!: HTMLElement | null | undefined;
|
|
551
552
|
_shouldHandleResize!: boolean;
|
|
552
553
|
_isVisible!: boolean;
|
|
554
|
+
_handleSuggestionOpenedBound!: () => void;
|
|
555
|
+
_handleSuggestionClosedBound!: () => void;
|
|
556
|
+
_bodyBackdropEl: HTMLElement | null = null;
|
|
553
557
|
|
|
554
558
|
constructor() {
|
|
555
559
|
super();
|
|
556
560
|
this._handleResizeBound = this._handleResize.bind(this);
|
|
557
561
|
this._handleWindowResizeBound = this._handleWindowResize.bind(this);
|
|
562
|
+
this._handleSuggestionOpenedBound = this._showSearchBackdrop.bind(this);
|
|
563
|
+
this._handleSuggestionClosedBound = this._hideSearchBackdrop.bind(this);
|
|
558
564
|
}
|
|
559
565
|
|
|
560
566
|
onBeforeRendering() {
|
|
@@ -585,6 +591,8 @@ class UDExMastheadShell extends UI5Element {
|
|
|
585
591
|
onEnterDOM(): void {
|
|
586
592
|
ResizeHandler.register(this, this._handleResizeBound);
|
|
587
593
|
window.addEventListener("resize", this._handleWindowResizeBound);
|
|
594
|
+
this.addEventListener("suggestion-popover-opened", this._handleSuggestionOpenedBound);
|
|
595
|
+
this.addEventListener("suggestion-popover-closed", this._handleSuggestionClosedBound);
|
|
588
596
|
if (isDesktop()) {
|
|
589
597
|
this.setAttribute("desktop", "");
|
|
590
598
|
}
|
|
@@ -593,6 +601,10 @@ class UDExMastheadShell extends UI5Element {
|
|
|
593
601
|
onExitDOM(): void {
|
|
594
602
|
ResizeHandler.deregister(this, this._handleResizeBound);
|
|
595
603
|
window.removeEventListener("resize", this._handleWindowResizeBound);
|
|
604
|
+
this.removeEventListener("suggestion-popover-opened", this._handleSuggestionOpenedBound);
|
|
605
|
+
this.removeEventListener("suggestion-popover-closed", this._handleSuggestionClosedBound);
|
|
606
|
+
this._bodyBackdropEl?.remove();
|
|
607
|
+
this._bodyBackdropEl = null;
|
|
596
608
|
}
|
|
597
609
|
|
|
598
610
|
_handleWindowResize(): void {
|
|
@@ -985,6 +997,38 @@ class UDExMastheadShell extends UI5Element {
|
|
|
985
997
|
this.fireMastheadEvent("search-opened");
|
|
986
998
|
}
|
|
987
999
|
|
|
1000
|
+
private _getBackdropEl(): HTMLElement {
|
|
1001
|
+
if (!this._bodyBackdropEl) {
|
|
1002
|
+
ensureSearchBackdropStyles(this.ownerDocument);
|
|
1003
|
+
const el = this.ownerDocument.createElement("div");
|
|
1004
|
+
el.className = "udex-search-backdrop";
|
|
1005
|
+
el.addEventListener("click", () => this.handleBackdropClick());
|
|
1006
|
+
this.ownerDocument.body.appendChild(el);
|
|
1007
|
+
this._bodyBackdropEl = el;
|
|
1008
|
+
}
|
|
1009
|
+
return this._bodyBackdropEl;
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
private _showSearchBackdrop(): void {
|
|
1013
|
+
if (!this.showSearchByDefault && this.isMobileMenuMode) {
|
|
1014
|
+
return;
|
|
1015
|
+
}
|
|
1016
|
+
const backdrop = this._getBackdropEl();
|
|
1017
|
+
const top = this.getBoundingClientRect().bottom;
|
|
1018
|
+
backdrop.style.top = `${top}px`;
|
|
1019
|
+
backdrop.style.display = "block";
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
private _hideSearchBackdrop(): void {
|
|
1023
|
+
if (this._bodyBackdropEl) {
|
|
1024
|
+
this._bodyBackdropEl.style.display = "none";
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
handleBackdropClick(): void {
|
|
1029
|
+
this._desktopSearch?.onClosePopover();
|
|
1030
|
+
}
|
|
1031
|
+
|
|
988
1032
|
/**
|
|
989
1033
|
* Open the mobile menu panel.
|
|
990
1034
|
* @public
|
package/src/PhoneNumberField.ts
CHANGED
|
@@ -1,34 +1,32 @@
|
|
|
1
1
|
import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
|
|
2
2
|
import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
|
|
3
3
|
import property from "@ui5/webcomponents-base/dist/decorators/property.js";
|
|
4
|
-
import
|
|
4
|
+
import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
|
|
5
5
|
import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
|
|
6
6
|
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 type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
|
|
9
9
|
import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
|
|
10
10
|
import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
|
|
11
|
+
import { isEnter } from "@ui5/webcomponents-base/dist/Keys.js";
|
|
11
12
|
import {
|
|
12
13
|
COUNTRY_SELECT, READ_ONLY, VALUE_STATE_ERROR, VALUE_STATE_SUCCESS,
|
|
13
14
|
} from "./generated/i18n/i18n-defaults.js";
|
|
14
15
|
import type { Country } from "./data/CountryListISO3166.js";
|
|
15
16
|
import { CountryListDB } from "./data/CountryListISO3166.js";
|
|
16
|
-
import UDExDropdown from "./Dropdown.js";
|
|
17
|
-
import UDExList from "./List.js";
|
|
18
|
-
import
|
|
19
|
-
import UDExButton from "./Button.js";
|
|
20
|
-
import UDExStatusMessage from "./StatusMessage.js";
|
|
17
|
+
import type UDExDropdown from "./Dropdown.js";
|
|
18
|
+
import type UDExList from "./List.js";
|
|
19
|
+
import type UDExButton from "./Button.js";
|
|
21
20
|
import translate from "./utils/translate.js";
|
|
22
21
|
|
|
23
22
|
import "@ui5/webcomponents/dist/Icon.js";
|
|
24
23
|
import "@ui5/webcomponents-icons/dist/slim-arrow-up.js";
|
|
25
24
|
import "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
|
|
26
25
|
|
|
27
|
-
import PhoneNumberFieldTemplate from "./
|
|
26
|
+
import PhoneNumberFieldTemplate from "./PhoneNumberFieldTemplate.js";
|
|
28
27
|
|
|
29
28
|
// Styles
|
|
30
29
|
import PhoneNumberFieldCss from "./generated/themes/PhoneNumberField.css.js";
|
|
31
|
-
import { isEnter } from "@ui5/webcomponents-base/dist/Keys.js";
|
|
32
30
|
|
|
33
31
|
export interface ExtendedCountriesListPhoneNumberData extends Country {
|
|
34
32
|
selected?: boolean;
|
|
@@ -66,16 +64,9 @@ const digitsLimit: number = 15;
|
|
|
66
64
|
*/
|
|
67
65
|
@customElement({
|
|
68
66
|
tag: "udex-phone-number-field",
|
|
69
|
-
renderer:
|
|
67
|
+
renderer: jsxRenderer,
|
|
70
68
|
styles: PhoneNumberFieldCss,
|
|
71
69
|
template: PhoneNumberFieldTemplate,
|
|
72
|
-
dependencies: [
|
|
73
|
-
UDExDropdown,
|
|
74
|
-
UDExList,
|
|
75
|
-
UDExListItem,
|
|
76
|
-
UDExButton,
|
|
77
|
-
UDExStatusMessage,
|
|
78
|
-
],
|
|
79
70
|
})
|
|
80
71
|
/**
|
|
81
72
|
* Fired when the value of the component changes at each keystroke.
|
|
@@ -323,13 +314,22 @@ class UDExPhoneNumberField extends UI5Element {
|
|
|
323
314
|
}
|
|
324
315
|
|
|
325
316
|
onBeforeRendering() {
|
|
326
|
-
this.applyPlaceholder();
|
|
327
|
-
|
|
328
317
|
if (this.blockedCountryCodes?.length) {
|
|
329
318
|
const blockedCountryCodesArray = this.blockedCountryCodes.split(",").map(code => code.trim().toUpperCase());
|
|
330
319
|
this.countriesList = this.countriesList
|
|
331
320
|
.filter(country => !blockedCountryCodesArray?.includes(country.iso.toUpperCase()));
|
|
332
321
|
}
|
|
322
|
+
|
|
323
|
+
if (this.value) {
|
|
324
|
+
if (this.selectedIso && !this.value.startsWith(this.selectedPhonePrefix)) {
|
|
325
|
+
this.selectedIso = "";
|
|
326
|
+
}
|
|
327
|
+
if (!this.selectedIso) {
|
|
328
|
+
this.autoSelectCountry(this.value);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
this.applyPlaceholder();
|
|
333
333
|
}
|
|
334
334
|
|
|
335
335
|
onAfterRendering() {
|
|
@@ -430,7 +430,8 @@ class UDExPhoneNumberField extends UI5Element {
|
|
|
430
430
|
handleSelect(e: CustomEvent) {
|
|
431
431
|
this._dropdown.open = false;
|
|
432
432
|
this.selectedIso = e.detail.item.id;
|
|
433
|
-
this.
|
|
433
|
+
this.value = this.selectedPhonePrefix;
|
|
434
|
+
this.maxlength = this.calculateMaxLength(this.selectedPhonePrefix, this.selectedPlaceholder);
|
|
434
435
|
this.getInputField().focus();
|
|
435
436
|
this.fireDecoratorEvent("change");
|
|
436
437
|
}
|
|
@@ -585,7 +586,7 @@ class UDExPhoneNumberField extends UI5Element {
|
|
|
585
586
|
}
|
|
586
587
|
|
|
587
588
|
get ariaInvalid(): string | null {
|
|
588
|
-
return this.valueState ===
|
|
589
|
+
return this.valueState === UDExPhoneNumberFieldValueState.Error ? "true" : null;
|
|
589
590
|
}
|
|
590
591
|
|
|
591
592
|
get isInputReadonly(): boolean {
|
|
@@ -619,11 +620,11 @@ class UDExPhoneNumberField extends UI5Element {
|
|
|
619
620
|
}
|
|
620
621
|
|
|
621
622
|
get hasValueState(): boolean {
|
|
622
|
-
return this.valueState !==
|
|
623
|
+
return this.valueState !== UDExPhoneNumberFieldValueState.Standard;
|
|
623
624
|
}
|
|
624
625
|
|
|
625
626
|
get valueStateText(): string | undefined {
|
|
626
|
-
return this.valueState !==
|
|
627
|
+
return this.valueState !== UDExPhoneNumberFieldValueState.Standard ? this.valueStateTypeMappings[this.valueState] : undefined;
|
|
627
628
|
}
|
|
628
629
|
|
|
629
630
|
get readOnlyStateText() {
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type UDExPhoneNumberField from "./PhoneNumberField.js";
|
|
2
|
+
import UDExDropdown from "./Dropdown.js";
|
|
3
|
+
import UDExList from "./List.js";
|
|
4
|
+
import UDExListItem from "./ListItem.js";
|
|
5
|
+
import UDExButton from "./Button.js";
|
|
6
|
+
import UDExStatusMessage from "./StatusMessage.js";
|
|
7
|
+
import UDExButtonDesign from "./types/ButtonDesign.js";
|
|
8
|
+
import UDExButtonSize from "./types/ButtonSize.js";
|
|
9
|
+
|
|
10
|
+
export default function PhoneNumberFieldTemplate(this: UDExPhoneNumberField) {
|
|
11
|
+
return (
|
|
12
|
+
<>
|
|
13
|
+
<div
|
|
14
|
+
class="udex-phone-number-field"
|
|
15
|
+
onui5-selection-change={this.handleSelect}>
|
|
16
|
+
{this.label && (
|
|
17
|
+
<label
|
|
18
|
+
id="udex-phone-number-field__label"
|
|
19
|
+
class="udex-phone-number-field__label"
|
|
20
|
+
htmlFor={`${this._id}-phone`}>
|
|
21
|
+
{this.label}
|
|
22
|
+
{this.required && " *"}
|
|
23
|
+
</label>
|
|
24
|
+
)}
|
|
25
|
+
<UDExDropdown
|
|
26
|
+
class="udex-phone-number-field__dropdown"
|
|
27
|
+
opener={`udex-${this._id}-phone-number__opener`}
|
|
28
|
+
id={`${this._id}_dropdown-menu`}
|
|
29
|
+
onui5-before-open={this.dropdownBeforeOpen}
|
|
30
|
+
onui5-before-close={this.dropdownBeforeClose}
|
|
31
|
+
horizontalAlign="Start"
|
|
32
|
+
height={this.height}>
|
|
33
|
+
<UDExList>
|
|
34
|
+
{this.countriesList.map(country => (
|
|
35
|
+
<UDExListItem
|
|
36
|
+
id={country.iso}
|
|
37
|
+
selected={country.selected}>
|
|
38
|
+
<div class="udex-phone-number-field__dropdown-list-item">
|
|
39
|
+
<div
|
|
40
|
+
class="udex-phone-number-field__flag"
|
|
41
|
+
style={{ backgroundPositionX: country.flagX, backgroundPositionY: country.flagY }}
|
|
42
|
+
></div>
|
|
43
|
+
<span class="udex-phone-number-field__country-name">
|
|
44
|
+
{country.countryName}
|
|
45
|
+
{country.localName && ` (${country.localName})`}
|
|
46
|
+
{" "}{country.phonePrefix}
|
|
47
|
+
</span>
|
|
48
|
+
</div>
|
|
49
|
+
</UDExListItem>
|
|
50
|
+
))}
|
|
51
|
+
</UDExList>
|
|
52
|
+
</UDExDropdown>
|
|
53
|
+
<div class="udex-phone-number-field__input-wrapper">
|
|
54
|
+
{!this.displayonly && (
|
|
55
|
+
<UDExButton
|
|
56
|
+
id={`udex-${this._id}-phone-number__opener`}
|
|
57
|
+
class="udex-phone-number-field__open-button"
|
|
58
|
+
role="combobox"
|
|
59
|
+
aria-haspopup="true"
|
|
60
|
+
design={UDExButtonDesign.Tertiary}
|
|
61
|
+
size={UDExButtonSize.Large}
|
|
62
|
+
endIcon={this.buttonIcon}
|
|
63
|
+
disabled={this.isButtonDisabled}
|
|
64
|
+
accessibleNameRef={`${this._id}-countrySelectorAriaLabel ${this.ariaDescribedById}`}
|
|
65
|
+
aria-label={this.countrySelectorAriaLabel}
|
|
66
|
+
aria-expanded={this._dropdownExpanded}
|
|
67
|
+
aria-controls={`${this._id}_dropdown-menu`}
|
|
68
|
+
onClick={this.openDropdown}>
|
|
69
|
+
<div class="udex-phone-number-field__open-button-text">
|
|
70
|
+
{this.selectedCountryName} {this.selectedPhonePrefix}
|
|
71
|
+
</div>
|
|
72
|
+
<div class="udex-phone-number-field__button-content">
|
|
73
|
+
<span
|
|
74
|
+
class="udex-phone-number-field__flag"
|
|
75
|
+
aria-label={this.selectedCountryName}
|
|
76
|
+
style={{ backgroundPositionX: this.selectedFlagBackgroundPosition.x, backgroundPositionY: this.selectedFlagBackgroundPosition.y }}
|
|
77
|
+
/>
|
|
78
|
+
</div>
|
|
79
|
+
</UDExButton>
|
|
80
|
+
)}
|
|
81
|
+
<input
|
|
82
|
+
id={`${this._id}-phone`}
|
|
83
|
+
class="udex-phone-number-field__input"
|
|
84
|
+
type="tel"
|
|
85
|
+
value={this.value}
|
|
86
|
+
placeholder={this.phoneFormat}
|
|
87
|
+
maxLength={this.maxlength}
|
|
88
|
+
disabled={this.disabled}
|
|
89
|
+
readonly={this.isInputReadonly}
|
|
90
|
+
required={this.required}
|
|
91
|
+
autoComplete="tel"
|
|
92
|
+
aria-label={this.accessibleName}
|
|
93
|
+
aria-labelledby={this.accessibleName}
|
|
94
|
+
aria-required={this.required}
|
|
95
|
+
aria-readonly={this.isInputReadonly}
|
|
96
|
+
aria-disabled={this.disabled}
|
|
97
|
+
aria-invalid={(this.ariaInvalid ?? undefined) as "true" | undefined}
|
|
98
|
+
aria-describedby={this.ariaDescribedById}
|
|
99
|
+
onInput={this.handleInput}
|
|
100
|
+
onClick={this.handleClick}
|
|
101
|
+
onFocus={this.handleFocus}
|
|
102
|
+
onBlur={this.handleBlur}
|
|
103
|
+
onKeyDown={this.handleKeyDown}
|
|
104
|
+
onKeyUp={this.handleKeyUp}
|
|
105
|
+
tabIndex={this.inputTabIndex}
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
{this.supportingText && (
|
|
110
|
+
<UDExStatusMessage
|
|
111
|
+
disabled={this.disabled}
|
|
112
|
+
supportingText={this.supportingText}
|
|
113
|
+
valueState={this.valueState}>
|
|
114
|
+
</UDExStatusMessage>
|
|
115
|
+
)}
|
|
116
|
+
{this.supportingText && (
|
|
117
|
+
<span id={`${this._id}-supportingTextDesc`} class="hidden-text">{this.supportingText}</span>
|
|
118
|
+
)}
|
|
119
|
+
{this.hasValueState && (
|
|
120
|
+
<span id={`${this._id}-valueStateDesc`} class="hidden-text">{this.valueStateText}</span>
|
|
121
|
+
)}
|
|
122
|
+
{this.readonly && (
|
|
123
|
+
<span id={`${this._id}-stateReadOnlyDesc`} class="hidden-text">{this.readOnlyStateText}</span>
|
|
124
|
+
)}
|
|
125
|
+
<span id={`${this._id}-countrySelectorAriaLabel`} class="hidden-text">{this.countrySelectorAriaLabel}</span>
|
|
126
|
+
</>
|
|
127
|
+
);
|
|
128
|
+
}
|
package/src/Search.ts
CHANGED
|
@@ -188,6 +188,18 @@ type UDExSearchKeydownEventDetail = {
|
|
|
188
188
|
* @param {KeyboardEvent} e The keyboard event object
|
|
189
189
|
*/
|
|
190
190
|
@event("search-keydown", { bubbles: true })
|
|
191
|
+
/**
|
|
192
|
+
* Fired when the suggestions popover opens.
|
|
193
|
+
*
|
|
194
|
+
* @public
|
|
195
|
+
*/
|
|
196
|
+
@event("suggestion-popover-opened", { bubbles: true })
|
|
197
|
+
/**
|
|
198
|
+
* Fired when the suggestions popover closes.
|
|
199
|
+
*
|
|
200
|
+
* @public
|
|
201
|
+
*/
|
|
202
|
+
@event("suggestion-popover-closed", { bubbles: true })
|
|
191
203
|
class UDExSearch extends UI5Element {
|
|
192
204
|
eventDetails!: {
|
|
193
205
|
"submit-search-value": UDExSearchBaseEventDetail,
|
|
@@ -196,7 +208,8 @@ class UDExSearch extends UI5Element {
|
|
|
196
208
|
"search-keydown": UDExSearchKeydownEventDetail,
|
|
197
209
|
"dropdown-item-click": UDExSearchBaseEventDetail,
|
|
198
210
|
"prefix-item-click": UDExSearchPrefixItemClickEventDetail,
|
|
199
|
-
|
|
211
|
+
"suggestion-popover-opened": void,
|
|
212
|
+
"suggestion-popover-closed": void,
|
|
200
213
|
};
|
|
201
214
|
_labelActiveClassName = "udex-search__label--active";
|
|
202
215
|
_labelAnimationClassName = "udex-search__label--animation-enabled";
|
|
@@ -856,6 +869,7 @@ class UDExSearch extends UI5Element {
|
|
|
856
869
|
retryUntilSuccessful(() => this.Suggestion, this.retryDelay, this.maxRetryAttempts, this.unsuccessfulRetryMessage)
|
|
857
870
|
.then(() => {
|
|
858
871
|
this.Suggestion!.open();
|
|
872
|
+
this.fireDecoratorEvent("suggestion-popover-opened");
|
|
859
873
|
})
|
|
860
874
|
.catch(error => {
|
|
861
875
|
console.warn(error.message);
|
|
@@ -863,6 +877,7 @@ class UDExSearch extends UI5Element {
|
|
|
863
877
|
} else {
|
|
864
878
|
this.open = true;
|
|
865
879
|
this.Suggestion.open();
|
|
880
|
+
this.fireDecoratorEvent("suggestion-popover-opened");
|
|
866
881
|
}
|
|
867
882
|
this.handleAriaExpanded();
|
|
868
883
|
}
|
|
@@ -873,6 +888,7 @@ class UDExSearch extends UI5Element {
|
|
|
873
888
|
this.Suggestion!.close();
|
|
874
889
|
this.handleAriaExpanded();
|
|
875
890
|
this.open = false;
|
|
891
|
+
this.fireDecoratorEvent("suggestion-popover-closed");
|
|
876
892
|
}
|
|
877
893
|
}
|
|
878
894
|
|
|
@@ -951,6 +967,9 @@ class UDExSearch extends UI5Element {
|
|
|
951
967
|
|
|
952
968
|
if (mutation.attributeName === "open" && newValue !== oldValue && !ingoreOpenState) {
|
|
953
969
|
this.open = popover?.open || false;
|
|
970
|
+
if (!popover?.open) {
|
|
971
|
+
this.fireDecoratorEvent("suggestion-popover-closed");
|
|
972
|
+
}
|
|
954
973
|
}
|
|
955
974
|
});
|
|
956
975
|
});
|
|
@@ -1053,6 +1072,7 @@ class UDExSearch extends UI5Element {
|
|
|
1053
1072
|
if (isEscape(e)) {
|
|
1054
1073
|
if (this.open) {
|
|
1055
1074
|
this.Suggestion?.onEscape(e);
|
|
1075
|
+
this.fireDecoratorEvent("suggestion-popover-closed");
|
|
1056
1076
|
}
|
|
1057
1077
|
}
|
|
1058
1078
|
}
|
|
@@ -345,6 +345,14 @@ class UDExSearchableListBase extends UI5Element {
|
|
|
345
345
|
this.fireSelectionChange(id);
|
|
346
346
|
}
|
|
347
347
|
|
|
348
|
+
handleAccordionIconClick(e: CustomEvent<{ collapsed: boolean }>): void {
|
|
349
|
+
const target = e.target as HTMLElement;
|
|
350
|
+
const originalItem = this._validItems.find(item => item._id === target.id) as (UDExListGroupHeaderBase & { setCollapsedItems?(): void }) | undefined;
|
|
351
|
+
if (!originalItem) { return; }
|
|
352
|
+
originalItem.collapsed = e.detail.collapsed;
|
|
353
|
+
originalItem.setCollapsedItems?.();
|
|
354
|
+
}
|
|
355
|
+
|
|
348
356
|
onSelectAllHeaderPress(e:CustomEvent) {
|
|
349
357
|
const item = e.detail.item as UDExListItemBase;
|
|
350
358
|
const id = this.getDataTokenId(item);
|
|
@@ -570,20 +578,67 @@ class UDExSearchableListBase extends UI5Element {
|
|
|
570
578
|
this.getPopoverPart(UDExPopoverPart.Content)?.scrollTo({ top: 0 });
|
|
571
579
|
}
|
|
572
580
|
|
|
581
|
+
_expandCollapsedGroupsWithSelection() {
|
|
582
|
+
this._validItems
|
|
583
|
+
.filter(item => item.isGroup)
|
|
584
|
+
.forEach(group => {
|
|
585
|
+
const header = group as UDExListGroupHeaderBase & { setCollapsedItems?(): void };
|
|
586
|
+
if (!header.collapsible) { return; }
|
|
587
|
+
// The rendered element may have been manually collapsed by the user, which
|
|
588
|
+
// only updates the rendered copy. handleAccordionIconClick syncs the original
|
|
589
|
+
// going forward, but we also check the rendered element as a safety net
|
|
590
|
+
// (e.g. if the event wasn't caught, or for the current open cycle).
|
|
591
|
+
const rendered = this.shadowRoot?.querySelector<HTMLElement & { collapsed?: boolean; setCollapsedItems?(): void }>(`[udex-list-group-header][id="${header._id}"]`);
|
|
592
|
+
const isCollapsed = header.collapsed || !!rendered?.hasAttribute("collapsed");
|
|
593
|
+
if (!isCollapsed) { return; }
|
|
594
|
+
const hasSelectedChild = (header.items as UDExListItemBase[]).some(child => child.selected);
|
|
595
|
+
if (hasSelectedChild) {
|
|
596
|
+
header.collapsed = false;
|
|
597
|
+
header.setCollapsedItems?.();
|
|
598
|
+
// Also reset the rendered element directly so it takes effect
|
|
599
|
+
// immediately, regardless of whether a template re-render is pending.
|
|
600
|
+
if (rendered) {
|
|
601
|
+
rendered.collapsed = false;
|
|
602
|
+
rendered.setCollapsedItems?.();
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
|
|
573
608
|
_dropdownScrollToSelectedItem() {
|
|
574
609
|
const content = this.getPopoverPart(UDExPopoverPart.Content);
|
|
610
|
+
if (!content) { return; }
|
|
575
611
|
const activeItem = this.activeItem;
|
|
576
|
-
if (!
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
612
|
+
if (!activeItem) {
|
|
613
|
+
this._dropdownScrollToTop();
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
// Refresh max-height on expanded collapsible groups before measuring.
|
|
617
|
+
// setContentHeight() may have run while the popup was closed (scrollHeight=0
|
|
618
|
+
// for hidden elements), leaving --udex-list-content-max-height at 0px.
|
|
619
|
+
// With that stale 0px value, getBoundingClientRect on slotted items inside
|
|
620
|
+
// the overflow:hidden container returns the container top rather than the
|
|
621
|
+
// item's natural position, producing an incorrect scroll delta.
|
|
622
|
+
// removeProperty → setContentHeight() avoids the CSS transition because
|
|
623
|
+
// browsers do not interpolate to/from the `none` fallback value.
|
|
624
|
+
this.shadowRoot?.querySelectorAll<HTMLElement & { setContentHeight(): void }>("[udex-list-group-header]")
|
|
625
|
+
.forEach(header => {
|
|
626
|
+
if (header.hasAttribute("collapsible") && !header.hasAttribute("collapsed")) {
|
|
627
|
+
header.style.removeProperty("--udex-list-content-max-height");
|
|
628
|
+
header.setContentHeight();
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
// Reset to top before measuring so getBoundingClientRect reads from a stable
|
|
632
|
+
// baseline regardless of the scroll state left by previous open/close cycles.
|
|
633
|
+
content.scrollTop = 0;
|
|
634
|
+
const delta = activeItem.getBoundingClientRect().top - content.getBoundingClientRect().top;
|
|
635
|
+
content.scrollTop = delta;
|
|
580
636
|
}
|
|
581
637
|
|
|
582
638
|
_handleDropdownScroll() {
|
|
583
|
-
if (this.modeMultiSelect) {
|
|
639
|
+
if (this.modeMultiSelect || !this.activeItem) {
|
|
584
640
|
this._dropdownScrollToTop();
|
|
585
|
-
}
|
|
586
|
-
if (this.modeSingleSelect) {
|
|
641
|
+
} else if (this.modeSingleSelect) {
|
|
587
642
|
this._dropdownScrollToSelectedItem();
|
|
588
643
|
}
|
|
589
644
|
}
|
|
@@ -132,6 +132,7 @@ function renderGroupHeader(this: UDExSearchableListBase, processedItem: UDExProc
|
|
|
132
132
|
selected={item.selected}
|
|
133
133
|
onFirstIconClick={this.fireFirstIconClickEvent}
|
|
134
134
|
onSecondIconClick={this.fireSecondIconClickEvent}
|
|
135
|
+
onAccordionIconClick={this.handleAccordionIconClick}
|
|
135
136
|
indeterminate={header.indeterminate}>
|
|
136
137
|
{groupItems.map((child, i) =>
|
|
137
138
|
renderListItem(child as UDExListItem, i, "none", childAccessibleRole, this.fireFirstIconClickEvent, this.fireSecondIconClickEvent, this._activeDescendantMode, this.isTreeStructure, this.modeMultiSelect)
|
package/src/SelectBase.ts
CHANGED
|
@@ -781,28 +781,21 @@ class UDExSelectBase extends UDExSearchableListBase {
|
|
|
781
781
|
}
|
|
782
782
|
|
|
783
783
|
handleDropdownOpen() {
|
|
784
|
-
//
|
|
785
|
-
// otherwise scroll to top. Do NOT pre-activate any item — that is done
|
|
786
|
-
// by the first ArrowDown so that ArrowDown[1]=item[0], ArrowDown[2]=item[1].
|
|
787
|
-
if (this.activeItem) {
|
|
788
|
-
const items = this._list?.getKeyboardNavigationItems();
|
|
789
|
-
const active = items?.find(i => !i.isGroup && (i as any).selected);
|
|
790
|
-
if (active && this._list?._scrollIntoView) {
|
|
791
|
-
this._list.scrollToItem(active);
|
|
792
|
-
} else {
|
|
793
|
-
this._dropdownScrollToTop();
|
|
794
|
-
}
|
|
795
|
-
} else {
|
|
796
|
-
this._dropdownScrollToTop();
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
// Announce the visually focused item (fake focus outline on first item).
|
|
800
|
-
// Using polite politeness — it waits for the AT to finish announcing
|
|
801
|
-
// "expanded" before reading the item, so no timeout is needed.
|
|
802
|
-
// Clear first so the mutation fires even if the text is unchanged from
|
|
803
|
-
// the previous open, then populate after render completes.
|
|
784
|
+
// Clear first so the live-region mutation fires even if text is unchanged.
|
|
804
785
|
this._liveRegionText = "";
|
|
805
|
-
|
|
786
|
+
// Defer scroll and announcement until rendering settles.
|
|
787
|
+
// Calling _handleDropdownScroll synchronously causes getBoundingClientRect
|
|
788
|
+
// to read mid-transition positions (e.g. the max-height animation on
|
|
789
|
+
// collapsible group headers), producing an incorrect scroll offset.
|
|
790
|
+
// The expand step modifies reactive properties that trigger a new render,
|
|
791
|
+
// so a second renderFinished is needed before measuring scroll positions.
|
|
792
|
+
renderFinished().then(() => {
|
|
793
|
+
this._expandCollapsedGroupsWithSelection();
|
|
794
|
+
return renderFinished();
|
|
795
|
+
}).then(() => {
|
|
796
|
+
this._handleDropdownScroll();
|
|
797
|
+
this._announceCurrentOrFirst();
|
|
798
|
+
}).catch(() => {});
|
|
806
799
|
|
|
807
800
|
this.fireEventDropdownOpen();
|
|
808
801
|
}
|
|
@@ -106,7 +106,7 @@ export default function SelectBoxTemplate(this: UDExSelectBox) {
|
|
|
106
106
|
</div>
|
|
107
107
|
{this.supportingText && (
|
|
108
108
|
<UDExStatusMessage
|
|
109
|
-
disabled={this.disabled
|
|
109
|
+
disabled={this.disabled}
|
|
110
110
|
supporting-text={this.supportingText}
|
|
111
111
|
value-state={this.valueState}>
|
|
112
112
|
</UDExStatusMessage>
|
package/src/StatusMessage.ts
CHANGED
|
@@ -67,11 +67,12 @@ class UDExStatusMessage extends UI5Element {
|
|
|
67
67
|
/**
|
|
68
68
|
* Defines if component should have disabled styles.
|
|
69
69
|
*
|
|
70
|
-
* @default
|
|
70
|
+
* @default false
|
|
71
71
|
* @public
|
|
72
72
|
*/
|
|
73
|
-
@property({ type:
|
|
74
|
-
disabled!:
|
|
73
|
+
@property({ type: Boolean })
|
|
74
|
+
disabled!: boolean;
|
|
75
|
+
|
|
75
76
|
/**
|
|
76
77
|
* Defines the value state of the component.
|
|
77
78
|
*
|
package/src/TextAreaTemplate.tsx
CHANGED
|
@@ -45,7 +45,7 @@ export default function TextAreaTemplate(this: TextArea) {
|
|
|
45
45
|
supporting-text={this._supportingText}
|
|
46
46
|
supporting-text-alignment="Right"
|
|
47
47
|
value-state={this.valueState}
|
|
48
|
-
disabled={this.disabled
|
|
48
|
+
disabled={this.disabled}>
|
|
49
49
|
</UDExStatusMessage>
|
|
50
50
|
<span id={`${this._id}-supportingTextDesc`} class={hiddenClass}>
|
|
51
51
|
{this._supportingText}
|
|
@@ -70,7 +70,7 @@ export default function TextFieldTemplate(this: TextField) {
|
|
|
70
70
|
<UDExStatusMessage
|
|
71
71
|
supporting-text={this.supportingText}
|
|
72
72
|
value-state={this.valueState}
|
|
73
|
-
disabled={this.disabled
|
|
73
|
+
disabled={this.disabled}>
|
|
74
74
|
</UDExStatusMessage>
|
|
75
75
|
<span id={`${this._id}-supportingTextDesc`} class={hiddenClass}>
|
|
76
76
|
{this.supportingText}
|
package/src/Upload.ts
CHANGED
|
@@ -1,29 +1,26 @@
|
|
|
1
1
|
import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
|
|
2
2
|
import type { DefaultSlot } from "@ui5/webcomponents-base/dist/UI5Element.js";
|
|
3
|
-
|
|
4
3
|
import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
|
|
5
4
|
import property from "@ui5/webcomponents-base/dist/decorators/property.js";
|
|
6
|
-
import
|
|
5
|
+
import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
|
|
7
6
|
import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
|
|
8
7
|
import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
|
|
9
|
-
import
|
|
8
|
+
import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
|
|
10
9
|
import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
|
|
11
|
-
import FileUploader from "@ui5/webcomponents/dist/FileUploader.js";
|
|
10
|
+
import type FileUploader from "@ui5/webcomponents/dist/FileUploader.js";
|
|
12
11
|
import type { FileUploaderChangeEventDetail } from "@ui5/webcomponents/dist/FileUploader.js";
|
|
13
12
|
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
|
|
14
13
|
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
15
14
|
import { UPLOAD_BUTTON_LABEL } from "./generated/i18n/i18n-defaults.js";
|
|
16
|
-
import UDExButton from "./Button.js";
|
|
17
15
|
import UDExButtonSize from "./types/ButtonSize.js";
|
|
18
|
-
import UDExList from "./List.js";
|
|
19
16
|
import UDExUploadItem from "./UploadItem.js";
|
|
20
|
-
import UploadTemplate from "./
|
|
17
|
+
import UploadTemplate from "./UploadTemplate.js";
|
|
21
18
|
import type FileData from "./types/FileData.js";
|
|
22
19
|
import translate from "./utils/translate.js";
|
|
20
|
+
import { BreakpointUtils } from "./utils/Breakpoints.js";
|
|
23
21
|
|
|
24
22
|
// Styles
|
|
25
23
|
import UploadCss from "./generated/themes/Upload.css.js";
|
|
26
|
-
import { BreakpointUtils } from "./utils/Breakpoints.js";
|
|
27
24
|
|
|
28
25
|
const convertBytesToMegabytes = (bytes: number) => (bytes / 1024) / 1024;
|
|
29
26
|
|
|
@@ -58,10 +55,10 @@ type UDExUploadFileChangeEventDetail = {
|
|
|
58
55
|
*/
|
|
59
56
|
@customElement({
|
|
60
57
|
tag: "udex-upload",
|
|
61
|
-
renderer:
|
|
58
|
+
renderer: jsxRenderer,
|
|
62
59
|
styles: UploadCss,
|
|
63
60
|
template: UploadTemplate,
|
|
64
|
-
dependencies: [
|
|
61
|
+
dependencies: [UDExUploadItem],
|
|
65
62
|
})
|
|
66
63
|
|
|
67
64
|
/**
|