@ui5/webcomponents-base 1.12.0-rc.0 → 1.12.0-rc.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/.eslintrc.js +3 -0
- package/CHANGELOG.md +27 -0
- package/dist/AssetRegistry.js.map +1 -1
- package/dist/Boot.js +14 -0
- package/dist/Boot.js.map +1 -1
- package/dist/CSP.js.map +1 -1
- package/dist/CustomElementsRegistry.js.map +1 -1
- package/dist/CustomElementsScope.js.map +1 -1
- package/dist/CustomElementsScopeUtils.js.map +1 -1
- package/dist/DOMObserver.js.map +1 -1
- package/dist/Device.js.map +1 -1
- package/dist/EventProvider.js.map +1 -1
- package/dist/FeaturesRegistry.js.map +1 -1
- package/dist/FontFace.js.map +1 -1
- package/dist/InitialConfiguration.js.map +1 -1
- package/dist/Keys.js.map +1 -1
- package/dist/ManagedStyles.js.map +1 -1
- package/dist/MarkedEvents.js.map +1 -1
- package/dist/MediaRange.js.map +1 -1
- package/dist/PropertiesFileFormat.js.map +1 -1
- package/dist/Render.js.map +1 -1
- package/dist/RenderQueue.js.map +1 -1
- package/dist/Runtimes.js.map +1 -1
- package/dist/StaticArea.js.map +1 -1
- package/dist/StaticAreaItem.js.map +1 -1
- package/dist/SystemCSSVars.js.map +1 -1
- package/dist/Theming.js.map +1 -1
- package/dist/UI5Element.js.map +1 -1
- package/dist/UI5ElementMetadata.js.map +1 -1
- package/dist/animations/AnimationQueue.js.map +1 -1
- package/dist/animations/animate.js.map +1 -1
- package/dist/animations/scroll.js.map +1 -1
- package/dist/animations/slideDown.js.map +1 -1
- package/dist/animations/slideUp.js.map +1 -1
- package/dist/asset-registries/Icons.d.ts +6 -6
- package/dist/asset-registries/Icons.js +1 -1
- package/dist/asset-registries/Icons.js.map +1 -1
- package/dist/asset-registries/Illustrations.js.map +1 -1
- package/dist/asset-registries/LocaleData.js.map +1 -1
- package/dist/asset-registries/Themes.js +2 -0
- package/dist/asset-registries/Themes.js.map +1 -1
- package/dist/asset-registries/i18n.js +9 -3
- package/dist/asset-registries/i18n.js.map +1 -1
- package/dist/assets/Boot.0f056029.js +9 -0
- package/dist/assets/Boot.34b7cea0.css +1 -0
- package/dist/assets/{bundle.esm.5ddf1fb1.js → bundle.esm.90296f02.js} +1 -1
- package/dist/assets/test/pages/Boot.html.a40788ce.js +1 -0
- package/dist/assets/test/pages/{i18n.html.95232fe8.js → i18n.html.65058ddf.js} +1 -1
- package/dist/assets/test/pages/{i18n_texts.html.351ef5df.js → i18n_texts.html.4d80a4fd.js} +1 -1
- package/dist/assets-meta/IconCollectionsAlias.js.map +1 -1
- package/dist/config/AnimationMode.js.map +1 -1
- package/dist/config/CalendarType.js.map +1 -1
- package/dist/config/FormatSettings.js.map +1 -1
- package/dist/config/Icons.js.map +1 -1
- package/dist/config/Language.d.ts +10 -1
- package/dist/config/Language.js +13 -1
- package/dist/config/Language.js.map +1 -1
- package/dist/config/NoConflict.js.map +1 -1
- package/dist/config/RTL.js.map +1 -1
- package/dist/config/Theme.d.ts +10 -1
- package/dist/config/Theme.js +13 -1
- package/dist/config/Theme.js.map +1 -1
- package/dist/config/ThemeRoots.js.map +1 -1
- package/dist/decorators/customElement.js.map +1 -1
- package/dist/decorators/event.js.map +1 -1
- package/dist/decorators/property.js.map +1 -1
- package/dist/decorators/slot.js.map +1 -1
- package/dist/delegate/ItemNavigation.js.map +1 -1
- package/dist/delegate/ResizeHandler.js.map +1 -1
- package/dist/delegate/ScrollEnablement.js.map +1 -1
- package/dist/features/F6Navigation.js.map +1 -1
- package/dist/features/LegacyDateFormats.js.map +1 -1
- package/dist/features/OpenUI5Element.js.map +1 -1
- package/dist/features/OpenUI5Enablement.js.map +1 -1
- package/dist/features/OpenUI5Support.js.map +1 -1
- package/dist/generated/VersionInfo.js +3 -3
- package/dist/generated/css/BusyIndicator.css.js.map +1 -1
- package/dist/generated/css/FontFace.css.js.map +1 -1
- package/dist/generated/css/OverrideFontFace.css.js.map +1 -1
- package/dist/generated/css/SystemCSSVars.css.js.map +1 -1
- package/dist/getSharedResource.js.map +1 -1
- package/dist/i18nBundle.js.map +1 -1
- package/dist/locale/Locale.js.map +1 -1
- package/dist/locale/RTLAwareRegistry.js.map +1 -1
- package/dist/locale/applyDirection.js.map +1 -1
- package/dist/locale/directionChange.js.map +1 -1
- package/dist/locale/getEffectiveDir.js.map +1 -1
- package/dist/locale/getLocale.js.map +1 -1
- package/dist/locale/languageChange.js.map +1 -1
- package/dist/locale/nextFallbackLocale.js.map +1 -1
- package/dist/locale/normalizeLocale.js.map +1 -1
- package/dist/renderer/LitRenderer.js.map +1 -1
- package/dist/renderer/executeTemplate.js.map +1 -1
- package/dist/test/pages/AllTestElements.html +2 -2
- package/dist/test/pages/Boot.html +4 -4
- package/dist/test/pages/Configuration.html +2 -2
- package/dist/test/pages/ConfigurationScript.html +2 -2
- package/dist/test/pages/WithComplexTemplate.html +2 -2
- package/dist/test/pages/i18n.html +3 -3
- package/dist/test/pages/i18n_texts.html +3 -3
- package/dist/theming/CustomStyle.js.map +1 -1
- package/dist/theming/ThemeLoaded.js.map +1 -1
- package/dist/theming/ThemeRegistered.d.ts +4 -0
- package/dist/theming/ThemeRegistered.js +11 -0
- package/dist/theming/ThemeRegistered.js.map +1 -0
- package/dist/theming/applyTheme.js.map +1 -1
- package/dist/theming/getConstructableStyle.js.map +1 -1
- package/dist/theming/getEffectiveLinksHrefs.js.map +1 -1
- package/dist/theming/getEffectiveStyle.js.map +1 -1
- package/dist/theming/getStylesString.js.map +1 -1
- package/dist/theming/getThemeDesignerTheme.js.map +1 -1
- package/dist/theming/preloadLinks.js.map +1 -1
- package/dist/thirdparty/_merge.js.map +1 -1
- package/dist/thirdparty/isPlainObject.js.map +1 -1
- package/dist/thirdparty/merge.js.map +1 -1
- package/dist/types/AnimationMode.js.map +1 -1
- package/dist/types/CSSColor.js.map +1 -1
- package/dist/types/CalendarType.js.map +1 -1
- package/dist/types/DOMReference.js.map +1 -1
- package/dist/types/DataType.js.map +1 -1
- package/dist/types/Float.js.map +1 -1
- package/dist/types/Integer.js.map +1 -1
- package/dist/types/InvisibleMessageMode.js.map +1 -1
- package/dist/types/ItemNavigationBehavior.js.map +1 -1
- package/dist/types/NavigationMode.js.map +1 -1
- package/dist/types/ValueState.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/updateShadowRoot.js.map +1 -1
- package/dist/util/AriaLabelHelper.js.map +1 -1
- package/dist/util/Caret.js.map +1 -1
- package/dist/util/ColorConversion.js.map +1 -1
- package/dist/util/FetchHelper.js.map +1 -1
- package/dist/util/FocusableElements.js.map +1 -1
- package/dist/util/HTMLSanitizer.js.map +1 -1
- package/dist/util/InvisibleMessage.js.map +1 -1
- package/dist/util/PopupUtils.js.map +1 -1
- package/dist/util/SlotsHelper.js.map +1 -1
- package/dist/util/StringHelper.js.map +1 -1
- package/dist/util/TabbableElements.js.map +1 -1
- package/dist/util/arraysAreEqual.js.map +1 -1
- package/dist/util/clamp.js.map +1 -1
- package/dist/util/createLinkInHead.js.map +1 -1
- package/dist/util/createStyleInHead.js.map +1 -1
- package/dist/util/debounce.js.map +1 -1
- package/dist/util/detectNavigatorLanguage.js.map +1 -1
- package/dist/util/escapeRegex.js.map +1 -1
- package/dist/util/formatMessage.js.map +1 -1
- package/dist/util/generateHighlightedMarkup.js.map +1 -1
- package/dist/util/getActiveElement.js.map +1 -1
- package/dist/util/getClassCopy.js.map +1 -1
- package/dist/util/getDesigntimePropertyAsArray.js.map +1 -1
- package/dist/util/getEffectiveContentDensity.js.map +1 -1
- package/dist/util/getEffectiveScrollbarStyle.js.map +1 -1
- package/dist/util/getFastNavigationGroups.js.map +1 -1
- package/dist/util/getFileExtension.js.map +1 -1
- package/dist/util/getNormalizedTarget.js.map +1 -1
- package/dist/util/getSingletonElementInstance.js.map +1 -1
- package/dist/util/isElementClickable.js.map +1 -1
- package/dist/util/isElementHidden.js.map +1 -1
- package/dist/util/isElementInView.js.map +1 -1
- package/dist/util/isElementTabbable.js.map +1 -1
- package/dist/util/isValidPropertyName.js.map +1 -1
- package/dist/util/whenDOMReady.js.map +1 -1
- package/dist/util/willShowContent.js.map +1 -1
- package/dist/validateThemeRoot.js.map +1 -1
- package/package-scripts.js +1 -2
- package/package.json +4 -4
- package/tsconfig.json +1 -0
- package/dist/assets/Boot.6335ce08.css +0 -1
- package/dist/assets/Boot.6f2dd050.js +0 -9
- package/dist/assets/test/pages/Boot.html.3e0c3154.js +0 -1
- package/src/AssetRegistry.ts +0 -11
- package/src/Boot.ts +0 -76
- package/src/CSP.ts +0 -66
- package/src/CustomElementsRegistry.ts +0 -98
- package/src/CustomElementsScope.ts +0 -33
- package/src/CustomElementsScopeUtils.ts +0 -115
- package/src/DOMObserver.ts +0 -28
- package/src/Device.ts +0 -203
- package/src/EventProvider.ts +0 -87
- package/src/FeaturesRegistry.ts +0 -14
- package/src/FontFace.ts +0 -31
- package/src/InitialConfiguration.ts +0 -207
- package/src/Keys.ts +0 -295
- package/src/ManagedStyles.ts +0 -92
- package/src/MarkedEvents.ts +0 -20
- package/src/MediaRange.ts +0 -110
- package/src/PropertiesFileFormat.ts +0 -95
- package/src/Render.ts +0 -180
- package/src/RenderQueue.ts +0 -71
- package/src/Runtimes.ts +0 -114
- package/src/StaticArea.ts +0 -3
- package/src/StaticAreaItem.ts +0 -113
- package/src/SystemCSSVars.ts +0 -10
- package/src/Theming.ts +0 -4
- package/src/UI5Element.ts +0 -1159
- package/src/UI5ElementMetadata.ts +0 -389
- package/src/animations/AnimationQueue.ts +0 -43
- package/src/animations/animate.ts +0 -64
- package/src/animations/scroll.ts +0 -21
- package/src/animations/slideDown.ts +0 -72
- package/src/animations/slideUp.ts +0 -67
- package/src/asset-registries/Icons.ts +0 -161
- package/src/asset-registries/Illustrations.ts +0 -75
- package/src/asset-registries/LocaleData.ts +0 -172
- package/src/asset-registries/Themes.ts +0 -72
- package/src/asset-registries/i18n.ts +0 -118
- package/src/assets-meta/IconCollectionsAlias.ts +0 -41
- package/src/config/AnimationMode.ts +0 -33
- package/src/config/CalendarType.ts +0 -23
- package/src/config/FormatSettings.ts +0 -35
- package/src/config/Icons.ts +0 -126
- package/src/config/Language.ts +0 -72
- package/src/config/NoConflict.ts +0 -67
- package/src/config/RTL.ts +0 -45
- package/src/config/Theme.ts +0 -64
- package/src/config/ThemeRoots.ts +0 -41
- package/src/decorators/customElement.ts +0 -57
- package/src/decorators/event.ts +0 -28
- package/src/decorators/property.ts +0 -30
- package/src/decorators/slot.ts +0 -49
- package/src/delegate/ItemNavigation.ts +0 -393
- package/src/delegate/ResizeHandler.ts +0 -100
- package/src/delegate/ScrollEnablement.ts +0 -224
- package/src/features/F6Navigation.ts +0 -195
- package/src/features/LegacyDateFormats.ts +0 -40
- package/src/features/OpenUI5Element.ts +0 -11
- package/src/features/OpenUI5Enablement.ts +0 -117
- package/src/features/OpenUI5Support.ts +0 -153
- package/src/generated/css/BusyIndicator.css.ts +0 -9
- package/src/generated/css/FontFace.css.ts +0 -9
- package/src/generated/css/OverrideFontFace.css.ts +0 -9
- package/src/generated/css/SystemCSSVars.css.ts +0 -9
- package/src/getSharedResource.ts +0 -39
- package/src/global.d.ts +0 -38
- package/src/i18nBundle.ts +0 -108
- package/src/locale/Locale.ts +0 -101
- package/src/locale/RTLAwareRegistry.ts +0 -16
- package/src/locale/applyDirection.ts +0 -18
- package/src/locale/directionChange.ts +0 -34
- package/src/locale/getEffectiveDir.ts +0 -28
- package/src/locale/getLocale.ts +0 -46
- package/src/locale/languageChange.ts +0 -24
- package/src/locale/nextFallbackLocale.ts +0 -28
- package/src/locale/normalizeLocale.ts +0 -56
- package/src/renderer/LitRenderer.ts +0 -60
- package/src/renderer/executeTemplate.ts +0 -40
- package/src/theming/CustomStyle.ts +0 -64
- package/src/theming/ThemeLoaded.ts +0 -24
- package/src/theming/applyTheme.ts +0 -90
- package/src/theming/getConstructableStyle.ts +0 -31
- package/src/theming/getEffectiveLinksHrefs.ts +0 -26
- package/src/theming/getEffectiveStyle.ts +0 -41
- package/src/theming/getStylesString.ts +0 -15
- package/src/theming/getThemeDesignerTheme.ts +0 -101
- package/src/theming/preloadLinks.ts +0 -24
- package/src/thirdparty/_merge.ts +0 -32
- package/src/thirdparty/isPlainObject.ts +0 -18
- package/src/thirdparty/merge.ts +0 -5
- package/src/types/AnimationMode.ts +0 -33
- package/src/types/CSSColor.ts +0 -19
- package/src/types/CalendarType.ts +0 -38
- package/src/types/DOMReference.ts +0 -28
- package/src/types/DataType.ts +0 -51
- package/src/types/Float.ts +0 -24
- package/src/types/Integer.ts +0 -24
- package/src/types/InvisibleMessageMode.ts +0 -27
- package/src/types/ItemNavigationBehavior.ts +0 -26
- package/src/types/NavigationMode.ts +0 -33
- package/src/types/ValueState.ts +0 -47
- package/src/types.ts +0 -30
- package/src/updateShadowRoot.ts +0 -42
- package/src/util/AriaLabelHelper.ts +0 -218
- package/src/util/Caret.ts +0 -28
- package/src/util/ColorConversion.ts +0 -399
- package/src/util/FetchHelper.ts +0 -31
- package/src/util/FocusableElements.ts +0 -92
- package/src/util/HTMLSanitizer.ts +0 -9
- package/src/util/InvisibleMessage.ts +0 -69
- package/src/util/PopupUtils.ts +0 -112
- package/src/util/SlotsHelper.ts +0 -39
- package/src/util/StringHelper.ts +0 -26
- package/src/util/TabbableElements.ts +0 -70
- package/src/util/arraysAreEqual.ts +0 -15
- package/src/util/clamp.ts +0 -12
- package/src/util/createLinkInHead.ts +0 -25
- package/src/util/createStyleInHead.ts +0 -20
- package/src/util/debounce.ts +0 -18
- package/src/util/detectNavigatorLanguage.ts +0 -13
- package/src/util/escapeRegex.ts +0 -11
- package/src/util/formatMessage.ts +0 -24
- package/src/util/generateHighlightedMarkup.ts +0 -43
- package/src/util/getActiveElement.ts +0 -11
- package/src/util/getClassCopy.ts +0 -12
- package/src/util/getDesigntimePropertyAsArray.ts +0 -4
- package/src/util/getEffectiveContentDensity.ts +0 -5
- package/src/util/getEffectiveScrollbarStyle.ts +0 -5
- package/src/util/getFastNavigationGroups.ts +0 -63
- package/src/util/getFileExtension.ts +0 -21
- package/src/util/getNormalizedTarget.ts +0 -16
- package/src/util/getSingletonElementInstance.ts +0 -13
- package/src/util/isElementClickable.ts +0 -19
- package/src/util/isElementHidden.ts +0 -9
- package/src/util/isElementInView.ts +0 -15
- package/src/util/isElementTabbable.ts +0 -37
- package/src/util/isValidPropertyName.ts +0 -29
- package/src/util/whenDOMReady.ts +0 -13
- package/src/util/willShowContent.ts +0 -7
- package/src/validateThemeRoot.ts +0 -58
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { supportsTouch } from "../Device.js";
|
|
2
|
-
import EventProvider from "../EventProvider.js";
|
|
3
|
-
import scroll from "../animations/scroll.js";
|
|
4
|
-
import type UI5Element from "../UI5Element.js";
|
|
5
|
-
|
|
6
|
-
const scrollEventName = "scroll";
|
|
7
|
-
const touchEndEventName = supportsTouch() ? "touchend" : "mouseup";
|
|
8
|
-
|
|
9
|
-
type ScrollEnablementEventListenerParam = {
|
|
10
|
-
isLeft: boolean;
|
|
11
|
-
isRight: boolean
|
|
12
|
-
}
|
|
13
|
-
type ScrollEnablementEventListenerReturn = void;
|
|
14
|
-
|
|
15
|
-
class ScrollEnablement extends EventProvider<ScrollEnablementEventListenerParam, ScrollEnablementEventListenerReturn> {
|
|
16
|
-
containerComponent: UI5Element;
|
|
17
|
-
mouseMove: (event: MouseEvent | TouchEvent) => void;
|
|
18
|
-
mouseUp: (event: MouseEvent | TouchEvent) => void;
|
|
19
|
-
touchStart: (event: MouseEvent | TouchEvent) => void;
|
|
20
|
-
cachedValue: { dragX: number, dragY: number };
|
|
21
|
-
startX: number;
|
|
22
|
-
startY: number;
|
|
23
|
-
_container?: HTMLElement;
|
|
24
|
-
supportsTouch = supportsTouch();
|
|
25
|
-
_canScroll?: boolean;
|
|
26
|
-
_prevDragX?: number;
|
|
27
|
-
_prevDragY?: number;
|
|
28
|
-
|
|
29
|
-
constructor(containerComponent: UI5Element) {
|
|
30
|
-
super();
|
|
31
|
-
this.containerComponent = containerComponent;
|
|
32
|
-
this.mouseMove = this.ontouchmove.bind(this);
|
|
33
|
-
this.mouseUp = this.ontouchend.bind(this);
|
|
34
|
-
this.touchStart = this.ontouchstart.bind(this);
|
|
35
|
-
|
|
36
|
-
this.supportsTouch = supportsTouch();
|
|
37
|
-
|
|
38
|
-
// On Android devices touchmove is thrown one more time than neccessary (together with touchend)
|
|
39
|
-
// so we have to cache the previus coordinates in order to provide correct parameters in the
|
|
40
|
-
// event for Android
|
|
41
|
-
this.cachedValue = { dragX: 0, dragY: 0 };
|
|
42
|
-
|
|
43
|
-
// In components like Carousel you need to know if the user has clicked on something or swiped
|
|
44
|
-
// in order to throw the needed event or not
|
|
45
|
-
this.startX = 0;
|
|
46
|
-
this.startY = 0;
|
|
47
|
-
|
|
48
|
-
if (this.supportsTouch) {
|
|
49
|
-
containerComponent.addEventListener("touchstart", this.touchStart, { passive: true });
|
|
50
|
-
containerComponent.addEventListener("touchmove", this.mouseMove, { passive: true });
|
|
51
|
-
containerComponent.addEventListener("touchend", this.mouseUp, { passive: true });
|
|
52
|
-
} else {
|
|
53
|
-
containerComponent.addEventListener("mousedown", this.touchStart, { passive: true });
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
set scrollContainer(container: HTMLElement) {
|
|
58
|
-
this._container = container;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
get scrollContainer() {
|
|
62
|
-
return this._container!;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Scrolls the container to the left/top position, retrying retryCount times, if the container is not yet painted
|
|
67
|
-
*
|
|
68
|
-
* @param left
|
|
69
|
-
* @param top
|
|
70
|
-
* @param retryCount
|
|
71
|
-
* @param retryInterval
|
|
72
|
-
* @returns {Promise<void>} resolved when scrolled successfully
|
|
73
|
-
*/
|
|
74
|
-
async scrollTo(left: number, top: number, retryCount = 0, retryInterval = 0) {
|
|
75
|
-
let containerPainted = this.scrollContainer.clientHeight > 0 && this.scrollContainer.clientWidth > 0;
|
|
76
|
-
|
|
77
|
-
/* eslint-disable no-loop-func, no-await-in-loop */
|
|
78
|
-
while (!containerPainted && retryCount > 0) {
|
|
79
|
-
await new Promise<void>(resolve => {
|
|
80
|
-
setTimeout(() => {
|
|
81
|
-
containerPainted = this.scrollContainer.clientHeight > 0 && this.scrollContainer.clientWidth > 0;
|
|
82
|
-
retryCount--;
|
|
83
|
-
resolve();
|
|
84
|
-
}, retryInterval);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
/* eslint-disable no-loop-func, no-await-in-loop */
|
|
88
|
-
|
|
89
|
-
this._container!.scrollLeft = left;
|
|
90
|
-
this._container!.scrollTop = top;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
move(dx: number, dy: number, disableAnimation: boolean) {
|
|
94
|
-
if (disableAnimation) {
|
|
95
|
-
this._container!.scrollLeft += dx;
|
|
96
|
-
this._container!.scrollTop += dy;
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (this._container) {
|
|
101
|
-
return scroll(this._container, dx, dy);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
getScrollLeft() {
|
|
106
|
-
return this._container!.scrollLeft;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
getScrollTop() {
|
|
110
|
-
return this._container!.scrollTop;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
_isTouchInside(event: TouchEvent | MouseEvent) {
|
|
114
|
-
let touch = null;
|
|
115
|
-
if (this.supportsTouch && event instanceof TouchEvent) {
|
|
116
|
-
touch = event.touches[0];
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const rect = this._container!.getBoundingClientRect();
|
|
120
|
-
const x = this.supportsTouch ? (touch as TouchInit).clientX : (event as MouseEvent).x;
|
|
121
|
-
const y = this.supportsTouch ? (touch as TouchInit).clientY : (event as MouseEvent).y;
|
|
122
|
-
|
|
123
|
-
return x! >= rect.left && x! <= rect.right
|
|
124
|
-
&& y! >= rect.top && y! <= rect.bottom;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
ontouchstart(event: TouchEvent | MouseEvent) {
|
|
128
|
-
let touch = null;
|
|
129
|
-
if (this.supportsTouch && event instanceof TouchEvent) {
|
|
130
|
-
touch = event.touches[0];
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (!this.supportsTouch) {
|
|
134
|
-
document.addEventListener("mouseup", this.mouseUp, { passive: true });
|
|
135
|
-
document.addEventListener("mousemove", this.mouseMove, { passive: true });
|
|
136
|
-
} else {
|
|
137
|
-
// Needed only on mobile
|
|
138
|
-
this.startX = touch!.pageX;
|
|
139
|
-
this.startY = touch!.pageY;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (this.supportsTouch && event instanceof TouchEvent) {
|
|
143
|
-
this._prevDragX = touch!.pageX;
|
|
144
|
-
this._prevDragY = touch!.pageY;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (event instanceof MouseEvent) {
|
|
148
|
-
this._prevDragX = event.x;
|
|
149
|
-
this._prevDragY = event.y;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
this._canScroll = this._isTouchInside(event);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
ontouchmove(event: TouchEvent | MouseEvent) {
|
|
156
|
-
if (!this._canScroll) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const container = this._container;
|
|
161
|
-
const touch = this.supportsTouch ? (event as TouchEvent).touches[0] : null;
|
|
162
|
-
|
|
163
|
-
const dragX = this.supportsTouch ? (touch as TouchInit).pageX : (event as MouseEvent).x;
|
|
164
|
-
const dragY = this.supportsTouch ? (touch as TouchInit).pageY : (event as MouseEvent).y;
|
|
165
|
-
|
|
166
|
-
container!.scrollLeft += this._prevDragX! - dragX!;
|
|
167
|
-
container!.scrollTop += this._prevDragY! - dragY!;
|
|
168
|
-
|
|
169
|
-
this.fireEvent(scrollEventName, {
|
|
170
|
-
isLeft: dragX! > this._prevDragX!,
|
|
171
|
-
isRight: dragX! < this._prevDragX!,
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
this.cachedValue.dragX = this._prevDragX!;
|
|
175
|
-
this.cachedValue.dragY = this._prevDragY!;
|
|
176
|
-
|
|
177
|
-
this._prevDragX = dragX;
|
|
178
|
-
this._prevDragY = dragY;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
ontouchend(event: TouchEvent | MouseEvent) {
|
|
182
|
-
if (this.supportsTouch) {
|
|
183
|
-
const deltaX = Math.abs((event as TouchEvent).changedTouches[0].pageX - this.startX);
|
|
184
|
-
const deltaY = Math.abs((event as TouchEvent).changedTouches[0].pageY - this.startY);
|
|
185
|
-
|
|
186
|
-
if (deltaX < 10 && deltaY < 10) {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (!this._canScroll) {
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const container = this._container;
|
|
196
|
-
const dragX = this.supportsTouch ? (event as TouchEvent).changedTouches[0].pageX : (event as MouseEvent).x;
|
|
197
|
-
const dragY = this.supportsTouch ? (event as TouchEvent).changedTouches[0].pageY : (event as MouseEvent).y;
|
|
198
|
-
|
|
199
|
-
container!.scrollLeft += this._prevDragX! - dragX;
|
|
200
|
-
container!.scrollTop += this._prevDragY! - dragY;
|
|
201
|
-
|
|
202
|
-
const useCachedValues = dragX === this._prevDragX;
|
|
203
|
-
const _dragX = useCachedValues ? this.cachedValue.dragX : dragX;
|
|
204
|
-
// const _dragY = useCachedValues ? this.cachedValue.dragY : dragY; add if needed
|
|
205
|
-
|
|
206
|
-
this.fireEvent(touchEndEventName, {
|
|
207
|
-
isLeft: _dragX < this._prevDragX!,
|
|
208
|
-
isRight: _dragX > this._prevDragX!,
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
this._prevDragX = dragX;
|
|
212
|
-
this._prevDragY = dragY;
|
|
213
|
-
|
|
214
|
-
if (!this.supportsTouch) {
|
|
215
|
-
document.removeEventListener("mousemove", this.mouseMove);
|
|
216
|
-
document.removeEventListener("mouseup", this.mouseUp);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
export default ScrollEnablement;
|
|
222
|
-
export type {
|
|
223
|
-
ScrollEnablementEventListenerParam,
|
|
224
|
-
};
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { registerFeature } from "../FeaturesRegistry.js";
|
|
2
|
-
import { isF6Next, isF6Previous } from "../Keys.js";
|
|
3
|
-
import { instanceOfUI5Element } from "../UI5Element.js";
|
|
4
|
-
import { getFirstFocusableElement } from "../util/FocusableElements.js";
|
|
5
|
-
import getFastNavigationGroups from "../util/getFastNavigationGroups.js";
|
|
6
|
-
import isElementClickable from "../util/isElementClickable.js";
|
|
7
|
-
|
|
8
|
-
class F6Navigation {
|
|
9
|
-
static _instance: F6Navigation;
|
|
10
|
-
keydownHandler: (event: KeyboardEvent) => void;
|
|
11
|
-
selectedGroup: HTMLElement | null = null;
|
|
12
|
-
groups: Array<HTMLElement> = [];
|
|
13
|
-
|
|
14
|
-
constructor() {
|
|
15
|
-
this.keydownHandler = this._keydownHandler.bind(this) as (event: KeyboardEvent) => void;
|
|
16
|
-
this.attachEventListeners();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
attachEventListeners() {
|
|
20
|
-
document.addEventListener("keydown", this.keydownHandler);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async groupElementToFocus(nextElement: HTMLElement) {
|
|
24
|
-
const nextElementDomRef = instanceOfUI5Element(nextElement) ? nextElement.getDomRef() : nextElement;
|
|
25
|
-
|
|
26
|
-
if (nextElementDomRef) {
|
|
27
|
-
if (isElementClickable(nextElementDomRef)) {
|
|
28
|
-
return nextElementDomRef;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const elementToFocus = await getFirstFocusableElement(nextElementDomRef);
|
|
32
|
-
|
|
33
|
-
if (elementToFocus) {
|
|
34
|
-
return elementToFocus;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async findNextFocusableGroupElement(currentIndex: number) {
|
|
40
|
-
let elementToFocus;
|
|
41
|
-
|
|
42
|
-
/* eslint-disable no-await-in-loop */
|
|
43
|
-
for (let index = 0; index < this.groups.length; index++) {
|
|
44
|
-
let nextElement;
|
|
45
|
-
|
|
46
|
-
if (currentIndex > -1) {
|
|
47
|
-
if (currentIndex + 1 >= this.groups.length) {
|
|
48
|
-
currentIndex = 0;
|
|
49
|
-
nextElement = this.groups[currentIndex];
|
|
50
|
-
} else {
|
|
51
|
-
currentIndex += 1;
|
|
52
|
-
nextElement = this.groups[currentIndex];
|
|
53
|
-
}
|
|
54
|
-
} else {
|
|
55
|
-
currentIndex = 0;
|
|
56
|
-
nextElement = this.groups[currentIndex];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
elementToFocus = await this.groupElementToFocus(nextElement);
|
|
60
|
-
|
|
61
|
-
if (elementToFocus) {
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/* eslint-enable no-await-in-loop */
|
|
66
|
-
|
|
67
|
-
return elementToFocus;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async findPreviousFocusableGroupElement(currentIndex: number) {
|
|
71
|
-
let elementToFocus;
|
|
72
|
-
|
|
73
|
-
/* eslint-disable no-await-in-loop */
|
|
74
|
-
for (let index = 0; index < this.groups.length; index++) {
|
|
75
|
-
let nextElement;
|
|
76
|
-
|
|
77
|
-
if (currentIndex > 0) {
|
|
78
|
-
// Handle the situation where the first focusable element of two neighbor groups is the same
|
|
79
|
-
// For example:
|
|
80
|
-
// <ui5-flexible-column-layout>
|
|
81
|
-
// <ui5-list>
|
|
82
|
-
// <ui5-li>List Item</ui5-li>
|
|
83
|
-
// </ui5-list>
|
|
84
|
-
// </ui5-flexible-column-layout>
|
|
85
|
-
// Here for both FCL & List the firstFoccusableElement is the same (the ui5-li)
|
|
86
|
-
const firstFocusable = await this.groupElementToFocus(this.groups[currentIndex - 1]);
|
|
87
|
-
const shouldSkipParent = firstFocusable === await this.groupElementToFocus(this.groups[currentIndex]);
|
|
88
|
-
|
|
89
|
-
currentIndex = shouldSkipParent ? currentIndex - 2 : currentIndex - 1;
|
|
90
|
-
|
|
91
|
-
if (currentIndex < 0) {
|
|
92
|
-
currentIndex = this.groups.length - 1;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
nextElement = this.groups[currentIndex];
|
|
96
|
-
} else {
|
|
97
|
-
currentIndex = this.groups.length - 1;
|
|
98
|
-
nextElement = this.groups[currentIndex];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
elementToFocus = await this.groupElementToFocus(nextElement);
|
|
102
|
-
|
|
103
|
-
if (elementToFocus) {
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/* eslint-enable no-await-in-loop */
|
|
108
|
-
|
|
109
|
-
return elementToFocus;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async _keydownHandler(event: KeyboardEvent) {
|
|
113
|
-
const forward = isF6Next(event);
|
|
114
|
-
const backward = isF6Previous(event);
|
|
115
|
-
if (!(forward || backward)) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
this.updateGroups();
|
|
120
|
-
|
|
121
|
-
if (this.groups.length < 1) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
event.preventDefault();
|
|
126
|
-
|
|
127
|
-
let elementToFocus;
|
|
128
|
-
|
|
129
|
-
if (this.groups.length === 0) {
|
|
130
|
-
elementToFocus = await this.groupElementToFocus(this.groups[0]);
|
|
131
|
-
|
|
132
|
-
return elementToFocus?.focus();
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
let currentIndex = -1;
|
|
136
|
-
|
|
137
|
-
if (this.selectedGroup) {
|
|
138
|
-
currentIndex = this.groups.indexOf(this.selectedGroup);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (forward) {
|
|
142
|
-
elementToFocus = await this.findNextFocusableGroupElement(currentIndex);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (backward) {
|
|
146
|
-
elementToFocus = await this.findPreviousFocusableGroupElement(currentIndex);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
elementToFocus?.focus();
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
removeEventListeners() {
|
|
153
|
-
document.removeEventListener("keydown", this.keydownHandler);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
updateGroups() {
|
|
157
|
-
this.setSelectedGroup();
|
|
158
|
-
this.groups = getFastNavigationGroups(document.body);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
setSelectedGroup(root: DocumentOrShadowRoot = window.document) {
|
|
162
|
-
const htmlElement = window.document.querySelector("html");
|
|
163
|
-
let element: Element | null | ParentNode = this.deepActive(root);
|
|
164
|
-
|
|
165
|
-
while (element && (element as Element).getAttribute("data-sap-ui-fastnavgroup") !== "true" && element !== htmlElement) {
|
|
166
|
-
element = element.parentElement ? element.parentNode : (element.parentNode as ShadowRoot).host;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
this.selectedGroup = element as HTMLElement;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
deepActive(root: DocumentOrShadowRoot): Element | null {
|
|
173
|
-
if (root.activeElement && root.activeElement.shadowRoot) {
|
|
174
|
-
return this.deepActive(root.activeElement.shadowRoot);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return root.activeElement;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
destroy() {
|
|
181
|
-
this.removeEventListeners();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
static init() {
|
|
185
|
-
if (!this._instance) {
|
|
186
|
-
this._instance = new F6Navigation();
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return this._instance;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
registerFeature("F6Navigation", F6Navigation);
|
|
194
|
-
|
|
195
|
-
export default F6Navigation;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { getFormatSettings } from "../InitialConfiguration.js";
|
|
2
|
-
import type { FormatSettings } from "../config/FormatSettings.js";
|
|
3
|
-
import { registerFeature } from "../FeaturesRegistry.js";
|
|
4
|
-
|
|
5
|
-
// Allows specifying the customizing data for Islamic calendar support
|
|
6
|
-
// dateFormat - The date format
|
|
7
|
-
// islamicMonthStart - The Islamic date in string format // 14360101
|
|
8
|
-
// gregDate - Corresponding Gregorian date to the Islamic one in string format // 20141024
|
|
9
|
-
type IslamicToGregorianMapping = {
|
|
10
|
-
dateFormat: string,
|
|
11
|
-
islamicMonthStart: string,
|
|
12
|
-
gregDate: string,
|
|
13
|
-
};
|
|
14
|
-
type LegacyDateCalendarCustomizing = Array<IslamicToGregorianMapping>;
|
|
15
|
-
|
|
16
|
-
let formatSettings: FormatSettings;
|
|
17
|
-
|
|
18
|
-
class LegacyDateFormats {
|
|
19
|
-
/**
|
|
20
|
-
* Returns the currently set customizing data for Islamic calendar support
|
|
21
|
-
*
|
|
22
|
-
* @return {object[]} Returns an array that contains the customizing data.
|
|
23
|
-
* @public
|
|
24
|
-
*/
|
|
25
|
-
static getLegacyDateCalendarCustomizing(this: void): LegacyDateCalendarCustomizing {
|
|
26
|
-
if (formatSettings === undefined) {
|
|
27
|
-
formatSettings = getFormatSettings();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return formatSettings.legacyDateCalendarCustomizing || [];
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
registerFeature("LegacyDateFormats", LegacyDateFormats);
|
|
35
|
-
|
|
36
|
-
export default LegacyDateFormats;
|
|
37
|
-
export type {
|
|
38
|
-
FormatSettings,
|
|
39
|
-
LegacyDateCalendarCustomizing,
|
|
40
|
-
};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import UI5Element from "../UI5Element.js";
|
|
2
|
-
|
|
3
|
-
class OpenUI5Element extends UI5Element {
|
|
4
|
-
__isBusy?: boolean;
|
|
5
|
-
isOpenUI5Component?: boolean;
|
|
6
|
-
__suppressFocusIn?: () => void;
|
|
7
|
-
__suppressFocusBack?: (e: KeyboardEvent) => void;
|
|
8
|
-
__redirectFocus?: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export default OpenUI5Element;
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { TemplateResult } from "lit-html";
|
|
2
|
-
import { registerFeature } from "../FeaturesRegistry.js";
|
|
3
|
-
import BusyIndicatorStyles from "../generated/css/BusyIndicator.css.js";
|
|
4
|
-
import merge from "../thirdparty/merge.js";
|
|
5
|
-
import {
|
|
6
|
-
isTabPrevious,
|
|
7
|
-
} from "../Keys.js";
|
|
8
|
-
|
|
9
|
-
import type UI5Element from "../UI5Element.js";
|
|
10
|
-
import type OpenUI5Element from "./OpenUI5Element.js";
|
|
11
|
-
|
|
12
|
-
const busyIndicatorMetadata = {
|
|
13
|
-
properties: {
|
|
14
|
-
__isBusy: {
|
|
15
|
-
type: Boolean,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
class OpenUI5Enablement {
|
|
21
|
-
static wrapTemplateResultInBusyMarkup(html: (strings: TemplateStringsArray, ...values: Array<unknown>) => TemplateResult, host: OpenUI5Element, templateResult: TemplateResult) {
|
|
22
|
-
if (host.isOpenUI5Component && host.__isBusy) {
|
|
23
|
-
templateResult = html`
|
|
24
|
-
<div class="busy-indicator-wrapper">
|
|
25
|
-
<span tabindex="0" busy-indicator-before-span @focusin=${host.__suppressFocusIn}></span>
|
|
26
|
-
${templateResult}
|
|
27
|
-
<div class="busy-indicator-overlay"></div>
|
|
28
|
-
<div busy-indicator
|
|
29
|
-
class="busy-indicator-busy-area"
|
|
30
|
-
tabindex="0"
|
|
31
|
-
role="progressbar"
|
|
32
|
-
@keydown=${host.__suppressFocusBack}
|
|
33
|
-
aria-valuemin="0"
|
|
34
|
-
aria-valuemax="100"
|
|
35
|
-
aria-valuetext="Busy">
|
|
36
|
-
<div>
|
|
37
|
-
<div class="busy-indicator-circle circle-animation-0"></div>
|
|
38
|
-
<div class="busy-indicator-circle circle-animation-1"></div>
|
|
39
|
-
<div class="busy-indicator-circle circle-animation-2"></div>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
</div>`;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return templateResult;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
static enrichBusyIndicatorSettings(klass: typeof UI5Element) {
|
|
49
|
-
OpenUI5Enablement.enrichBusyIndicatorMetadata(klass);
|
|
50
|
-
OpenUI5Enablement.enrichBusyIndicatorMethods(klass.prototype);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
static enrichBusyIndicatorMetadata(klass: typeof UI5Element) {
|
|
54
|
-
klass.metadata = merge(klass.metadata, busyIndicatorMetadata);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
static enrichBusyIndicatorMethods(UI5ElementPrototype: typeof OpenUI5Element.prototype) {
|
|
58
|
-
Object.defineProperties(UI5ElementPrototype, {
|
|
59
|
-
"__redirectFocus": { value: true, writable: true },
|
|
60
|
-
"__suppressFocusBack": {
|
|
61
|
-
get() {
|
|
62
|
-
return {
|
|
63
|
-
handleEvent: (e: KeyboardEvent) => {
|
|
64
|
-
if (isTabPrevious(e)) {
|
|
65
|
-
const beforeElem = this.shadowRoot.querySelector("[busy-indicator-before-span]");
|
|
66
|
-
this.__redirectFocus = false;
|
|
67
|
-
beforeElem.focus();
|
|
68
|
-
this.__redirectFocus = true;
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
capture: true,
|
|
72
|
-
passive: false,
|
|
73
|
-
};
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
"isOpenUI5Component": { get: () => { return true; } },
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
UI5ElementPrototype.__suppressFocusIn = function handleFocusIn() {
|
|
80
|
-
const busyIndicator = this.shadowRoot?.querySelector("[busy-indicator]") as HTMLElement;
|
|
81
|
-
if (busyIndicator && this.__redirectFocus) {
|
|
82
|
-
busyIndicator.focus();
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
UI5ElementPrototype.getDomRef = function getDomRef() {
|
|
87
|
-
// If a component set _getRealDomRef to its children, use the return value of this function
|
|
88
|
-
if (typeof this._getRealDomRef === "function") {
|
|
89
|
-
return this._getRealDomRef();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
if (!this.shadowRoot || this.shadowRoot.children.length === 0) {
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const children = [...this.shadowRoot.children].filter(child => !["link", "style"].includes(child.localName));
|
|
97
|
-
|
|
98
|
-
if (children.length !== 1) {
|
|
99
|
-
console.warn(`The shadow DOM for ${(this.constructor as typeof UI5Element).getMetadata().getTag()} does not have a top level element, the getDomRef() method might not work as expected`); // eslint-disable-line
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (this.__isBusy) {
|
|
103
|
-
return children[0].querySelector(".busy-indicator-wrapper > :not([busy-indicator-before-span]):not(.busy-indicator-overlay):not(.busy-indicator-busy-area)") as HTMLElement;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return children[0] as HTMLElement;
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
static getBusyIndicatorStyles() {
|
|
111
|
-
return BusyIndicatorStyles;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
registerFeature("OpenUI5Enablement", OpenUI5Enablement);
|
|
116
|
-
|
|
117
|
-
export default OpenUI5Enablement;
|