@ui5/webcomponents-base 0.0.0-8db0ce01a → 0.0.0-918b4fbe7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +3 -1
- package/CHANGELOG.md +326 -0
- package/README.md +53 -7
- package/bundle.esm.js +18 -12
- package/dist/AssetRegistry.d.ts +5 -0
- package/dist/AssetRegistry.js +2 -7
- package/dist/AssetRegistry.js.map +1 -0
- package/dist/Boot.d.ts +8 -0
- package/dist/Boot.js +31 -30
- package/dist/Boot.js.map +1 -0
- package/dist/CSP.d.ts +30 -0
- package/dist/CSP.js +51 -0
- package/dist/CSP.js.map +1 -0
- package/dist/CustomElementsRegistry.d.ts +5 -0
- package/dist/CustomElementsRegistry.js +69 -30
- package/dist/CustomElementsRegistry.js.map +1 -0
- package/dist/CustomElementsScope.d.ts +7 -0
- package/dist/CustomElementsScope.js +11 -108
- package/dist/CustomElementsScope.js.map +1 -0
- package/dist/CustomElementsScopeUtils.d.ts +55 -0
- package/dist/CustomElementsScopeUtils.js +90 -0
- package/dist/CustomElementsScopeUtils.js.map +1 -0
- package/dist/DOMObserver.d.ts +11 -0
- package/dist/DOMObserver.js +12 -54
- package/dist/DOMObserver.js.map +1 -0
- package/dist/Device.d.ts +11 -0
- package/dist/Device.js +61 -72
- package/dist/Device.js.map +1 -0
- package/dist/EventProvider.d.ts +25 -0
- package/dist/EventProvider.js +67 -88
- package/dist/EventProvider.js.map +1 -0
- package/dist/FeaturesRegistry.d.ts +3 -0
- package/dist/FeaturesRegistry.js +5 -7
- package/dist/FeaturesRegistry.js.map +1 -0
- package/dist/FontFace.d.ts +2 -0
- package/dist/FontFace.js +17 -110
- package/dist/FontFace.js.map +1 -0
- package/dist/InitialConfiguration.d.ts +22 -0
- package/dist/InitialConfiguration.js +112 -127
- package/dist/InitialConfiguration.js.map +1 -0
- package/dist/Keys.d.ts +57 -0
- package/dist/Keys.js +174 -229
- package/dist/Keys.js.map +1 -0
- package/dist/ManagedStyles.d.ts +8 -0
- package/dist/ManagedStyles.js +77 -0
- package/dist/ManagedStyles.js.map +1 -0
- package/dist/MediaRange.d.ts +36 -0
- package/dist/MediaRange.js +38 -51
- package/dist/MediaRange.js.map +1 -0
- package/dist/PropertiesFileFormat.d.ts +8 -0
- package/dist/PropertiesFileFormat.js +72 -82
- package/dist/PropertiesFileFormat.js.map +1 -0
- package/dist/Render.d.ts +47 -0
- package/dist/Render.js +82 -112
- package/dist/Render.js.map +1 -0
- package/dist/RenderQueue.d.ts +19 -0
- package/dist/RenderQueue.js +52 -62
- package/dist/RenderQueue.js.map +1 -0
- package/dist/Runtimes.d.ts +27 -0
- package/dist/Runtimes.js +86 -0
- package/dist/Runtimes.js.map +1 -0
- package/dist/StaticArea.d.ts +0 -0
- package/dist/StaticArea.js +4 -1
- package/dist/StaticArea.js.map +1 -0
- package/dist/StaticAreaItem.d.ts +36 -0
- package/dist/StaticAreaItem.js +86 -83
- package/dist/StaticAreaItem.js.map +1 -0
- package/dist/SystemCSSVars.d.ts +2 -0
- package/dist/SystemCSSVars.js +6 -28
- package/dist/SystemCSSVars.js.map +1 -0
- package/dist/Theming.d.ts +3 -0
- package/dist/Theming.js +1 -1
- package/dist/Theming.js.map +1 -0
- package/dist/UI5Element.d.ts +371 -0
- package/dist/UI5Element.js +907 -996
- package/dist/UI5Element.js.map +1 -0
- package/dist/UI5ElementMetadata.d.ts +147 -0
- package/dist/UI5ElementMetadata.js +261 -298
- package/dist/UI5ElementMetadata.js.map +1 -0
- package/dist/animations/AnimationQueue.d.ts +8 -0
- package/dist/animations/AnimationQueue.js +31 -38
- package/dist/animations/AnimationQueue.js.map +1 -0
- package/dist/animations/animate.d.ts +14 -0
- package/dist/animations/animate.js +46 -51
- package/dist/animations/animate.js.map +1 -0
- package/dist/animations/scroll.d.ts +5 -0
- package/dist/animations/scroll.js +18 -27
- package/dist/animations/scroll.js.map +1 -0
- package/dist/animations/slideDown.d.ts +5 -0
- package/dist/animations/slideDown.js +53 -78
- package/dist/animations/slideDown.js.map +1 -0
- package/dist/animations/slideUp.d.ts +5 -0
- package/dist/animations/slideUp.js +49 -70
- package/dist/animations/slideUp.js.map +1 -0
- package/dist/api.json +1 -0
- package/dist/asset-registries/Icons.d.ts +30 -0
- package/dist/asset-registries/Icons.js +87 -104
- package/dist/asset-registries/Icons.js.map +1 -0
- package/dist/asset-registries/Illustrations.d.ts +16 -0
- package/dist/asset-registries/Illustrations.js +46 -0
- package/dist/asset-registries/Illustrations.js.map +1 -0
- package/dist/asset-registries/LocaleData.d.ts +7 -0
- package/dist/asset-registries/LocaleData.js +104 -118
- package/dist/asset-registries/LocaleData.js.map +1 -0
- package/dist/asset-registries/Themes.d.ts +10 -0
- package/dist/asset-registries/Themes.js +38 -66
- package/dist/asset-registries/Themes.js.map +1 -0
- package/dist/asset-registries/i18n.d.ts +23 -0
- package/dist/asset-registries/i18n.js +55 -81
- package/dist/asset-registries/i18n.js.map +1 -0
- package/dist/assets/bundle.esm.60caa7e5.js +56 -0
- package/dist/assets-meta/IconCollectionsAlias.d.ts +17 -0
- package/dist/assets-meta/IconCollectionsAlias.js +18 -0
- package/dist/assets-meta/IconCollectionsAlias.js.map +1 -0
- package/dist/config/AnimationMode.d.ts +14 -0
- package/dist/config/AnimationMode.js +21 -18
- package/dist/config/AnimationMode.js.map +1 -0
- package/dist/config/CalendarType.d.ts +8 -0
- package/dist/config/CalendarType.js +13 -12
- package/dist/config/CalendarType.js.map +1 -0
- package/dist/config/FormatSettings.d.ts +11 -0
- package/dist/config/FormatSettings.js +10 -8
- package/dist/config/FormatSettings.js.map +1 -0
- package/dist/config/Icons.d.ts +30 -0
- package/dist/config/Icons.js +48 -0
- package/dist/config/Icons.js.map +1 -0
- package/dist/config/Language.d.ts +31 -0
- package/dist/config/Language.js +31 -43
- package/dist/config/Language.js.map +1 -0
- package/dist/config/NoConflict.d.ts +20 -0
- package/dist/config/NoConflict.js +40 -41
- package/dist/config/NoConflict.js.map +1 -0
- package/dist/config/RTL.d.ts +7 -0
- package/dist/config/RTL.js +23 -20
- package/dist/config/RTL.js.map +1 -0
- package/dist/config/Theme.d.ts +28 -0
- package/dist/config/Theme.js +45 -22
- package/dist/config/Theme.js.map +1 -0
- package/dist/config/ThemeRoots.d.ts +4 -0
- package/dist/config/ThemeRoots.js +28 -0
- package/dist/config/ThemeRoots.js.map +1 -0
- package/dist/css/BusyIndicator.css +80 -0
- package/dist/css/FontFace.css +66 -0
- package/dist/css/OverrideFontFace.css +32 -0
- package/dist/css/SystemCSSVars.css +17 -0
- package/dist/delegate/ItemNavigation.d.ts +113 -0
- package/dist/delegate/ItemNavigation.js +277 -246
- package/dist/delegate/ItemNavigation.js.map +1 -0
- package/dist/delegate/ResizeHandler.d.ts +24 -0
- package/dist/delegate/ResizeHandler.js +68 -91
- package/dist/delegate/ResizeHandler.js.map +1 -0
- package/dist/delegate/ScrollEnablement.d.ts +43 -0
- package/dist/delegate/ScrollEnablement.js +157 -174
- package/dist/delegate/ScrollEnablement.js.map +1 -0
- package/dist/features/F6Navigation.d.ts +16 -0
- package/dist/features/F6Navigation.js +112 -0
- package/dist/features/F6Navigation.js.map +1 -0
- package/dist/features/OpenUI5Element.d.ts +9 -0
- package/dist/features/OpenUI5Element.js +5 -0
- package/dist/features/OpenUI5Element.js.map +1 -0
- package/dist/features/OpenUI5Enablement.d.ts +11 -0
- package/dist/features/OpenUI5Enablement.js +96 -0
- package/dist/features/OpenUI5Enablement.js.map +1 -0
- package/dist/features/OpenUI5Support.d.ts +23 -0
- package/dist/features/OpenUI5Support.js +91 -119
- package/dist/features/OpenUI5Support.js.map +1 -0
- package/dist/generated/AssetParameters.js +1 -1
- package/dist/generated/VersionInfo.js +10 -0
- package/dist/generated/css/BusyIndicator.css.js +5 -0
- package/dist/generated/css/FontFace.css.js +5 -0
- package/dist/generated/css/OverrideFontFace.css.js +5 -0
- package/dist/generated/css/SystemCSSVars.css.js +5 -0
- package/dist/generated/templates/elements/WithComplexTemplateTemplate.lit.js +11 -0
- package/dist/getSharedResource.d.ts +11 -0
- package/dist/getSharedResource.js +12 -16
- package/dist/getSharedResource.js.map +1 -0
- package/dist/i18nBundle.d.ts +43 -0
- package/dist/i18nBundle.js +67 -44
- package/dist/i18nBundle.js.map +1 -0
- package/dist/locale/Locale.d.ts +22 -0
- package/dist/locale/Locale.js +75 -87
- package/dist/locale/Locale.js.map +1 -0
- package/dist/locale/RTLAwareRegistry.d.ts +4 -0
- package/dist/locale/RTLAwareRegistry.js +6 -11
- package/dist/locale/RTLAwareRegistry.js.map +1 -0
- package/dist/locale/applyDirection.d.ts +10 -0
- package/dist/locale/applyDirection.js +7 -7
- package/dist/locale/applyDirection.js.map +1 -0
- package/dist/locale/directionChange.d.ts +15 -0
- package/dist/locale/directionChange.js +7 -15
- package/dist/locale/directionChange.js.map +1 -0
- package/dist/locale/getEffectiveDir.d.ts +2 -0
- package/dist/locale/getEffectiveDir.js +20 -24
- package/dist/locale/getEffectiveDir.js.map +1 -0
- package/dist/locale/getLocale.d.ts +7 -0
- package/dist/locale/getLocale.js +26 -29
- package/dist/locale/getLocale.js.map +1 -0
- package/dist/locale/languageChange.d.ts +5 -0
- package/dist/locale/languageChange.js +8 -16
- package/dist/locale/languageChange.js.map +1 -0
- package/dist/locale/nextFallbackLocale.d.ts +8 -0
- package/dist/locale/nextFallbackLocale.js +15 -19
- package/dist/locale/nextFallbackLocale.js.map +1 -0
- package/dist/locale/normalizeLocale.d.ts +7 -0
- package/dist/locale/normalizeLocale.js +34 -41
- package/dist/locale/normalizeLocale.js.map +1 -0
- package/dist/renderer/LitRenderer.d.ts +14 -0
- package/dist/renderer/LitRenderer.js +34 -24
- package/dist/renderer/LitRenderer.js.map +1 -0
- package/dist/renderer/directives/style-map.js +72 -0
- package/dist/renderer/executeTemplate.d.ts +13 -0
- package/dist/renderer/executeTemplate.js +20 -7
- package/dist/renderer/executeTemplate.js.map +1 -0
- package/dist/sap/base/Log.js +241 -0
- package/dist/sap/base/assert.js +8 -0
- package/dist/sap/base/security/URLListValidator.js +148 -0
- package/dist/sap/base/security/encodeCSS.js +14 -0
- package/dist/sap/base/security/encodeXML.js +23 -0
- package/dist/sap/base/security/sanitizeHTML.js +16 -0
- package/dist/sap/base/strings/toHex.js +8 -0
- package/dist/sap/base/util/now.js +7 -0
- package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
- package/dist/theming/CustomStyle.d.ts +6 -0
- package/dist/theming/CustomStyle.js +37 -31
- package/dist/theming/CustomStyle.js.map +1 -0
- package/dist/theming/ThemeLoaded.d.ts +5 -0
- package/dist/theming/ThemeLoaded.js +8 -16
- package/dist/theming/ThemeLoaded.js.map +1 -0
- package/dist/theming/applyTheme.d.ts +2 -0
- package/dist/theming/applyTheme.js +62 -65
- package/dist/theming/applyTheme.js.map +1 -0
- package/dist/theming/getConstructableStyle.d.ts +9 -0
- package/dist/theming/getConstructableStyle.js +12 -17
- package/dist/theming/getConstructableStyle.js.map +1 -0
- package/dist/theming/getEffectiveLinksHrefs.d.ts +3 -0
- package/dist/theming/getEffectiveLinksHrefs.js +16 -0
- package/dist/theming/getEffectiveLinksHrefs.js.map +1 -0
- package/dist/theming/getEffectiveStyle.d.ts +3 -0
- package/dist/theming/getEffectiveStyle.js +25 -23
- package/dist/theming/getEffectiveStyle.js.map +1 -0
- package/dist/theming/getStylesString.d.ts +3 -0
- package/dist/theming/getStylesString.js +8 -11
- package/dist/theming/getStylesString.js.map +1 -0
- package/dist/theming/getThemeDesignerTheme.d.ts +7 -0
- package/dist/theming/getThemeDesignerTheme.js +73 -60
- package/dist/theming/getThemeDesignerTheme.js.map +1 -0
- package/dist/theming/preloadLinks.d.ts +3 -0
- package/dist/theming/preloadLinks.js +19 -0
- package/dist/theming/preloadLinks.js.map +1 -0
- package/dist/thirdparty/_merge.d.ts +2 -0
- package/dist/thirdparty/_merge.js +7 -4
- package/dist/thirdparty/_merge.js.map +1 -0
- package/dist/thirdparty/isPlainObject.d.ts +2 -0
- package/dist/thirdparty/isPlainObject.js +11 -10
- package/dist/thirdparty/isPlainObject.js.map +1 -0
- package/dist/thirdparty/merge.d.ts +2 -0
- package/dist/thirdparty/merge.js +4 -8
- package/dist/thirdparty/merge.js.map +1 -0
- package/dist/types/AnimationMode.d.ts +32 -0
- package/dist/types/AnimationMode.js +33 -6
- package/dist/types/AnimationMode.js.map +1 -0
- package/dist/types/CSSColor.d.ts +16 -0
- package/dist/types/CSSColor.js +15 -5
- package/dist/types/CSSColor.js.map +1 -0
- package/dist/types/CalendarType.d.ts +37 -0
- package/dist/types/CalendarType.js +35 -18
- package/dist/types/CalendarType.js.map +1 -0
- package/dist/types/DOMReference.d.ts +17 -0
- package/dist/types/DOMReference.js +25 -0
- package/dist/types/DOMReference.js.map +1 -0
- package/dist/types/DataType.d.ts +25 -0
- package/dist/types/DataType.js +32 -13
- package/dist/types/DataType.js.map +1 -0
- package/dist/types/Float.d.ts +18 -0
- package/dist/types/Float.js +18 -6
- package/dist/types/Float.js.map +1 -0
- package/dist/types/Integer.d.ts +18 -0
- package/dist/types/Integer.js +18 -5
- package/dist/types/Integer.js.map +1 -0
- package/dist/types/InvisibleMessageMode.d.ts +25 -0
- package/dist/types/InvisibleMessageMode.js +27 -0
- package/dist/types/InvisibleMessageMode.js.map +1 -0
- package/dist/types/ItemNavigationBehavior.d.ts +24 -0
- package/dist/types/ItemNavigationBehavior.js +22 -12
- package/dist/types/ItemNavigationBehavior.js.map +1 -0
- package/dist/types/NavigationMode.d.ts +32 -0
- package/dist/types/NavigationMode.js +33 -6
- package/dist/types/NavigationMode.js.map +1 -0
- package/dist/types/ValueState.d.ts +42 -0
- package/dist/types/ValueState.js +41 -19
- package/dist/types/ValueState.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/updateShadowRoot.d.ts +8 -0
- package/dist/updateShadowRoot.js +23 -15
- package/dist/updateShadowRoot.js.map +1 -0
- package/dist/util/AriaLabelHelper.d.ts +6 -0
- package/dist/util/AriaLabelHelper.js +37 -34
- package/dist/util/AriaLabelHelper.js.map +1 -0
- package/dist/util/Caret.d.ts +7 -0
- package/dist/util/Caret.js +16 -38
- package/dist/util/Caret.js.map +1 -0
- package/dist/util/ColorConversion.d.ts +33 -0
- package/dist/util/ColorConversion.js +315 -348
- package/dist/util/ColorConversion.js.map +1 -0
- package/dist/util/FetchHelper.d.ts +3 -0
- package/dist/util/FetchHelper.js +19 -25
- package/dist/util/FetchHelper.js.map +1 -0
- package/dist/util/FocusableElements.d.ts +3 -0
- package/dist/util/FocusableElements.js +57 -68
- package/dist/util/FocusableElements.js.map +1 -0
- package/dist/util/HTMLSanitizer.d.ts +3 -0
- package/dist/util/HTMLSanitizer.js +6 -0
- package/dist/util/HTMLSanitizer.js.map +1 -0
- package/dist/util/InvisibleMessage.d.ts +10 -0
- package/dist/util/InvisibleMessage.js +56 -0
- package/dist/util/InvisibleMessage.js.map +1 -0
- package/dist/util/PopupUtils.d.ts +7 -0
- package/dist/util/PopupUtils.js +57 -76
- package/dist/util/PopupUtils.js.map +1 -0
- package/dist/util/SlotsHelper.d.ts +9 -0
- package/dist/util/SlotsHelper.js +22 -35
- package/dist/util/SlotsHelper.js.map +1 -0
- package/dist/util/StringHelper.d.ts +3 -0
- package/dist/util/StringHelper.js +17 -20
- package/dist/util/StringHelper.js.map +1 -0
- package/dist/util/TabbableElements.d.ts +3 -0
- package/dist/util/TabbableElements.js +39 -43
- package/dist/util/TabbableElements.js.map +1 -0
- package/dist/util/arraysAreEqual.d.ts +2 -0
- package/dist/util/arraysAreEqual.js +10 -12
- package/dist/util/arraysAreEqual.js.map +1 -0
- package/dist/util/clamp.d.ts +9 -0
- package/dist/util/clamp.js +2 -2
- package/dist/util/clamp.js.map +1 -0
- package/dist/util/createLinkInHead.d.ts +7 -0
- package/dist/util/createLinkInHead.js +21 -0
- package/dist/util/createLinkInHead.js.map +1 -0
- package/dist/util/createStyleInHead.d.ts +8 -0
- package/dist/util/createStyleInHead.js +10 -10
- package/dist/util/createStyleInHead.js.map +1 -0
- package/dist/util/debounce.d.ts +2 -0
- package/dist/util/debounce.js +6 -8
- package/dist/util/debounce.js.map +1 -0
- package/dist/util/detectNavigatorLanguage.d.ts +2 -0
- package/dist/util/detectNavigatorLanguage.js +7 -10
- package/dist/util/detectNavigatorLanguage.js.map +1 -0
- package/dist/util/escapeRegex.d.ts +8 -0
- package/dist/util/escapeRegex.js +11 -0
- package/dist/util/escapeRegex.js.map +1 -0
- package/dist/util/formatMessage.d.ts +2 -0
- package/dist/util/formatMessage.js +15 -19
- package/dist/util/formatMessage.js.map +1 -0
- package/dist/util/generateHighlightedMarkup.d.ts +9 -0
- package/dist/util/generateHighlightedMarkup.js +41 -0
- package/dist/util/generateHighlightedMarkup.js.map +1 -0
- package/dist/util/getActiveElement.d.ts +2 -0
- package/dist/util/getActiveElement.js +6 -8
- package/dist/util/getActiveElement.js.map +1 -0
- package/dist/util/getClassCopy.d.ts +398 -0
- package/dist/util/getClassCopy.js +7 -7
- package/dist/util/getClassCopy.js.map +1 -0
- package/dist/util/getDesigntimePropertyAsArray.d.ts +2 -0
- package/dist/util/getDesigntimePropertyAsArray.js +4 -3
- package/dist/util/getDesigntimePropertyAsArray.js.map +1 -0
- package/dist/util/getEffectiveContentDensity.d.ts +2 -0
- package/dist/util/getEffectiveContentDensity.js +2 -3
- package/dist/util/getEffectiveContentDensity.js.map +1 -0
- package/dist/util/getEffectiveScrollbarStyle.d.ts +2 -0
- package/dist/util/getEffectiveScrollbarStyle.js +4 -0
- package/dist/util/getEffectiveScrollbarStyle.js.map +1 -0
- package/dist/util/getFastNavigationGroups.d.ts +2 -0
- package/dist/util/getFastNavigationGroups.js +51 -0
- package/dist/util/getFastNavigationGroups.js.map +1 -0
- package/dist/util/getFileExtension.d.ts +12 -0
- package/dist/util/getFileExtension.js +9 -11
- package/dist/util/getFileExtension.js.map +1 -0
- package/dist/util/getNormalizedTarget.d.ts +7 -0
- package/dist/util/getNormalizedTarget.js +14 -0
- package/dist/util/getNormalizedTarget.js.map +1 -0
- package/dist/util/getSingletonElementInstance.d.ts +2 -0
- package/dist/util/getSingletonElementInstance.js +7 -10
- package/dist/util/getSingletonElementInstance.js.map +1 -0
- package/dist/util/isDefaultSlotProvided.d.ts +2 -0
- package/dist/util/isDefaultSlotProvided.js +10 -0
- package/dist/util/isDefaultSlotProvided.js.map +1 -0
- package/dist/util/isElementClickable.d.ts +2 -0
- package/dist/util/isElementClickable.js +16 -0
- package/dist/util/isElementClickable.js.map +1 -0
- package/dist/util/isElementHidden.d.ts +2 -0
- package/dist/util/isElementHidden.js +8 -0
- package/dist/util/isElementHidden.js.map +1 -0
- package/dist/util/isElementInView.d.ts +6 -0
- package/dist/util/isElementInView.js +6 -9
- package/dist/util/isElementInView.js.map +1 -0
- package/dist/util/isElementTabbable.d.ts +2 -0
- package/dist/util/isElementTabbable.js +22 -0
- package/dist/util/isElementTabbable.js.map +1 -0
- package/dist/util/isValidPropertyName.d.ts +8 -0
- package/dist/util/isValidPropertyName.js +16 -17
- package/dist/util/isValidPropertyName.js.map +1 -0
- package/dist/util/whenDOMReady.d.ts +2 -0
- package/dist/util/whenDOMReady.js +11 -10
- package/dist/util/whenDOMReady.js.map +1 -0
- package/dist/validateThemeRoot.d.ts +2 -0
- package/dist/validateThemeRoot.js +47 -0
- package/dist/validateThemeRoot.js.map +1 -0
- package/global.d.ts +44 -0
- package/index.js +1 -1
- package/lib/generate-asset-parameters/index.js +8 -5
- package/lib/generate-styles/index.js +26 -0
- package/lib/generate-version-info/index.js +32 -0
- package/package-scripts.js +47 -23
- package/package.json +19 -9
- package/src/{AssetRegistry.js → AssetRegistry.ts} +0 -0
- package/src/Boot.ts +61 -0
- package/src/CSP.ts +66 -0
- package/src/CustomElementsRegistry.ts +98 -0
- package/src/CustomElementsScope.ts +33 -0
- package/src/{CustomElementsScope.js → CustomElementsScopeUtils.ts} +14 -7
- package/src/DOMObserver.ts +28 -0
- package/src/{Device.js → Device.ts} +25 -4
- package/src/EventProvider.ts +87 -0
- package/src/FeaturesRegistry.ts +14 -0
- package/src/FontFace.ts +31 -0
- package/src/{InitialConfiguration.js → InitialConfiguration.ts} +62 -17
- package/src/Keys.ts +295 -0
- package/src/ManagedStyles.ts +92 -0
- package/src/{MediaRange.js → MediaRange.ts} +14 -14
- package/src/{PropertiesFileFormat.js → PropertiesFileFormat.ts} +8 -8
- package/src/{Render.js → Render.ts} +27 -20
- package/src/{RenderQueue.js → RenderQueue.ts} +10 -5
- package/src/Runtimes.ts +114 -0
- package/src/{StaticArea.js → StaticArea.ts} +0 -0
- package/src/{StaticAreaItem.js → StaticAreaItem.ts} +39 -22
- package/src/SystemCSSVars.ts +10 -0
- package/src/{Theming.js → Theming.ts} +0 -0
- package/src/{UI5Element.js → UI5Element.ts} +269 -178
- package/src/{UI5ElementMetadata.js → UI5ElementMetadata.ts} +98 -45
- package/src/animations/{AnimationQueue.js → AnimationQueue.ts} +8 -7
- package/src/animations/animate.ts +64 -0
- package/src/animations/scroll.ts +21 -0
- package/src/animations/{slideDown.js → slideDown.ts} +27 -34
- package/src/animations/{slideUp.js → slideUp.ts} +28 -32
- package/src/asset-registries/Icons.ts +161 -0
- package/src/asset-registries/Illustrations.ts +73 -0
- package/src/asset-registries/{LocaleData.js → LocaleData.ts} +47 -25
- package/src/asset-registries/Themes.ts +67 -0
- package/src/asset-registries/{i18n.js → i18n.ts} +21 -24
- package/src/assets-meta/IconCollectionsAlias.ts +18 -0
- package/src/config/AnimationMode.ts +33 -0
- package/src/config/{CalendarType.js → CalendarType.ts} +8 -3
- package/src/config/FormatSettings.ts +21 -0
- package/src/config/Icons.ts +59 -0
- package/src/config/{Language.js → Language.ts} +22 -18
- package/src/config/NoConflict.ts +67 -0
- package/src/config/{RTL.js → RTL.ts} +14 -4
- package/src/config/Theme.ts +64 -0
- package/src/config/ThemeRoots.ts +41 -0
- package/src/css/BusyIndicator.css +80 -0
- package/src/css/FontFace.css +66 -0
- package/src/css/OverrideFontFace.css +32 -0
- package/src/css/SystemCSSVars.css +17 -0
- package/src/delegate/{ItemNavigation.js → ItemNavigation.ts} +129 -21
- package/src/delegate/{ResizeHandler.js → ResizeHandler.ts} +25 -36
- package/src/delegate/ScrollEnablement.ts +215 -0
- package/src/features/F6Navigation.ts +141 -0
- package/src/features/OpenUI5Element.ts +11 -0
- package/src/features/OpenUI5Enablement.ts +117 -0
- package/src/features/OpenUI5Support.ts +148 -0
- package/src/{getSharedResource.js → getSharedResource.ts} +3 -3
- package/src/i18nBundle.ts +108 -0
- package/src/locale/{Locale.js → Locale.ts} +15 -5
- package/src/locale/RTLAwareRegistry.ts +16 -0
- package/src/locale/{applyDirection.js → applyDirection.ts} +4 -3
- package/src/locale/{directionChange.js → directionChange.ts} +6 -4
- package/src/locale/{getEffectiveDir.js → getEffectiveDir.ts} +1 -1
- package/src/locale/{getLocale.js → getLocale.ts} +12 -7
- package/src/locale/languageChange.ts +24 -0
- package/src/locale/{nextFallbackLocale.js → nextFallbackLocale.ts} +1 -1
- package/src/locale/{normalizeLocale.js → normalizeLocale.ts} +4 -2
- package/src/renderer/LitRenderer.ts +60 -0
- package/src/renderer/directives/style-map.js +72 -0
- package/src/renderer/executeTemplate.ts +40 -0
- package/src/theming/CustomStyle.ts +62 -0
- package/src/theming/{ThemeLoaded.js → ThemeLoaded.ts} +6 -4
- package/src/theming/applyTheme.ts +90 -0
- package/src/theming/{getConstructableStyle.js → getConstructableStyle.ts} +5 -4
- package/src/theming/getEffectiveLinksHrefs.ts +24 -0
- package/src/theming/{getEffectiveStyle.js → getEffectiveStyle.ts} +15 -4
- package/src/theming/getStylesString.ts +13 -0
- package/src/theming/getThemeDesignerTheme.ts +101 -0
- package/src/theming/preloadLinks.ts +24 -0
- package/src/thirdparty/{_merge.js → _merge.ts} +2 -2
- package/src/thirdparty/{isPlainObject.js → isPlainObject.ts} +1 -1
- package/src/thirdparty/merge.ts +5 -0
- package/src/types/AnimationMode.ts +33 -0
- package/src/types/{CSSColor.js → CSSColor.ts} +12 -1
- package/src/types/CalendarType.ts +38 -0
- package/src/types/DOMReference.ts +28 -0
- package/src/types/DataType.ts +51 -0
- package/src/types/Float.ts +25 -0
- package/src/types/Integer.ts +25 -0
- package/src/types/InvisibleMessageMode.ts +27 -0
- package/src/types/ItemNavigationBehavior.ts +26 -0
- package/src/types/NavigationMode.ts +33 -0
- package/src/types/ValueState.ts +47 -0
- package/src/types.ts +22 -0
- package/src/updateShadowRoot.ts +37 -0
- package/src/util/AriaLabelHelper.ts +63 -0
- package/src/util/Caret.ts +28 -0
- package/src/util/ColorConversion.ts +394 -0
- package/src/util/{FetchHelper.js → FetchHelper.ts} +7 -7
- package/src/util/FocusableElements.ts +80 -0
- package/src/util/HTMLSanitizer.ts +9 -0
- package/src/util/InvisibleMessage.ts +69 -0
- package/src/util/PopupUtils.ts +114 -0
- package/src/util/{SlotsHelper.js → SlotsHelper.ts} +9 -13
- package/src/util/{StringHelper.js → StringHelper.ts} +7 -7
- package/src/util/TabbableElements.ts +56 -0
- package/src/util/{arraysAreEqual.js → arraysAreEqual.ts} +1 -1
- package/src/util/{clamp.js → clamp.ts} +1 -1
- package/src/util/createLinkInHead.ts +25 -0
- package/src/util/{createStyleInHead.js → createStyleInHead.ts} +4 -2
- package/src/util/{debounce.js → debounce.ts} +5 -4
- package/src/util/{detectNavigatorLanguage.js → detectNavigatorLanguage.ts} +1 -1
- package/src/util/escapeRegex.ts +11 -0
- package/src/util/{formatMessage.js → formatMessage.ts} +4 -3
- package/src/util/generateHighlightedMarkup.ts +43 -0
- package/src/util/{getActiveElement.js → getActiveElement.ts} +0 -0
- package/src/util/{getClassCopy.js → getClassCopy.ts} +3 -1
- package/src/util/{getDesigntimePropertyAsArray.js → getDesigntimePropertyAsArray.ts} +1 -1
- package/src/util/getEffectiveContentDensity.ts +5 -0
- package/src/util/getEffectiveScrollbarStyle.ts +5 -0
- package/src/util/getFastNavigationGroups.ts +63 -0
- package/src/util/{getFileExtension.js → getFileExtension.ts} +3 -3
- package/src/util/getNormalizedTarget.ts +16 -0
- package/src/util/{getSingletonElementInstance.js → getSingletonElementInstance.ts} +1 -1
- package/src/util/isDefaultSlotProvided.ts +11 -0
- package/src/util/isElementClickable.ts +19 -0
- package/src/util/isElementHidden.ts +9 -0
- package/src/util/{isElementInView.js → isElementInView.ts} +1 -1
- package/src/util/isElementTabbable.ts +28 -0
- package/src/util/{isValidPropertyName.js → isValidPropertyName.ts} +1 -1
- package/src/util/{whenDOMReady.js → whenDOMReady.ts} +1 -1
- package/src/validateThemeRoot.ts +58 -0
- package/tsconfig.json +13 -0
- package/used-modules.txt +10 -0
- package/config/.eslintrc.js +0 -3
- package/config/rollup.config.js +0 -1
- package/dist/RenderScheduler.js +0 -44
- package/dist/animations/config.js +0 -5
- package/dist/config/AssetsPath.js +0 -17
- package/dist/isLegacyBrowser.js +0 -3
- package/dist/renderer/ifDefined.js +0 -21
- package/dist/renderer/scopeHTML.js +0 -32
- package/dist/resources/bundle.esm.js +0 -121
- package/dist/resources/bundle.esm.js.map +0 -1
- package/dist/test-resources/assets/Themes.js +0 -17
- package/dist/test-resources/elements/Child.js +0 -35
- package/dist/test-resources/elements/Generic.js +0 -84
- package/dist/test-resources/elements/GenericExt.js +0 -26
- package/dist/test-resources/elements/NoShadowDOM.js +0 -13
- package/dist/test-resources/elements/Parent.js +0 -41
- package/dist/test-resources/elements/WithStaticArea.js +0 -76
- package/dist/test-resources/pages/AllTestElements.html +0 -39
- package/dist/test-resources/pages/Configuration.html +0 -18
- package/dist/test-resources/pages/ConfigurationScript.html +0 -34
- package/dist/test-resources/pages/assets/messagebundle_de.properties +0 -1
- package/dist/test-resources/pages/assets/messagebundle_en.properties +0 -1
- package/dist/test-resources/pages/assets/messagebundle_es.properties +0 -1
- package/dist/test-resources/pages/assets/messagebundle_fr.properties +0 -1
- package/dist/test-resources/pages/i18n.html +0 -35
- package/dist/test-resources/specs/ConfigurationChange.spec.js +0 -27
- package/dist/test-resources/specs/ConfigurationScript.spec.js +0 -63
- package/dist/test-resources/specs/ConfigurationURL.spec.js +0 -93
- package/dist/test-resources/specs/CustomTheme.spec.js +0 -27
- package/dist/test-resources/specs/StaticArea.spec.js +0 -36
- package/dist/test-resources/specs/Theming.spec.js +0 -33
- package/dist/test-resources/specs/UI5ElementInvalidation.js +0 -242
- package/dist/test-resources/specs/UI5ElementLifecycle.js +0 -98
- package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +0 -75
- package/dist/test-resources/specs/UI5ElementMetadataExt.js +0 -42
- package/dist/test-resources/specs/UI5ElementPropertyValidation.js +0 -14
- package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +0 -67
- package/dist/test-resources/specs/UI5ElementShadowDOM.js +0 -24
- package/dist/test-resources/specs/UI5ElementSlots.js +0 -36
- package/dist/theming/createThemePropertiesStyleTag.js +0 -20
- package/dist/types/CSSSize.js +0 -9
- package/dist/types/PopupState.js +0 -37
- package/dist/util/encodeCSS.js +0 -24
- package/dist/util/findNodeOwner.js +0 -35
- package/dist/util/isDescendantOf.js +0 -15
- package/dist/util/isNodeClickable.js +0 -19
- package/dist/util/isNodeHidden.js +0 -9
- package/dist/util/isNodeTabbable.js +0 -28
- package/dist/util/setToArray.js +0 -10
- package/hash.txt +0 -1
- package/src/Boot.js +0 -43
- package/src/CustomElementsRegistry.js +0 -39
- package/src/DOMObserver.js +0 -65
- package/src/EventProvider.js +0 -91
- package/src/FeaturesRegistry.js +0 -11
- package/src/FontFace.js +0 -118
- package/src/Keys.js +0 -233
- package/src/RenderScheduler.js +0 -44
- package/src/SystemCSSVars.js +0 -31
- package/src/animations/animate.js +0 -53
- package/src/animations/config.js +0 -5
- package/src/animations/scroll.js +0 -28
- package/src/asset-registries/Icons.js +0 -121
- package/src/asset-registries/Themes.js +0 -78
- package/src/config/AnimationMode.js +0 -23
- package/src/config/AssetsPath.js +0 -17
- package/src/config/FormatSettings.js +0 -13
- package/src/config/NoConflict.js +0 -51
- package/src/config/Theme.js +0 -28
- package/src/delegate/ScrollEnablement.js +0 -182
- package/src/features/OpenUI5Support.js +0 -125
- package/src/i18nBundle.js +0 -55
- package/src/isLegacyBrowser.js +0 -3
- package/src/locale/RTLAwareRegistry.js +0 -14
- package/src/locale/languageChange.js +0 -22
- package/src/renderer/LitRenderer.js +0 -31
- package/src/renderer/executeTemplate.js +0 -17
- package/src/renderer/ifDefined.js +0 -21
- package/src/renderer/scopeHTML.js +0 -32
- package/src/theming/CustomStyle.js +0 -40
- package/src/theming/applyTheme.js +0 -78
- package/src/theming/createThemePropertiesStyleTag.js +0 -20
- package/src/theming/getStylesString.js +0 -13
- package/src/theming/getThemeDesignerTheme.js +0 -67
- package/src/thirdparty/merge.js +0 -10
- package/src/types/AnimationMode.js +0 -7
- package/src/types/CSSSize.js +0 -9
- package/src/types/CalendarType.js +0 -22
- package/src/types/DataType.js +0 -25
- package/src/types/Float.js +0 -10
- package/src/types/Integer.js +0 -9
- package/src/types/ItemNavigationBehavior.js +0 -16
- package/src/types/NavigationMode.js +0 -7
- package/src/types/PopupState.js +0 -37
- package/src/types/ValueState.js +0 -22
- package/src/updateShadowRoot.js +0 -26
- package/src/util/AriaLabelHelper.js +0 -41
- package/src/util/Caret.js +0 -45
- package/src/util/ColorConversion.js +0 -370
- package/src/util/FocusableElements.js +0 -73
- package/src/util/PopupUtils.js +0 -93
- package/src/util/TabbableElements.js +0 -47
- package/src/util/encodeCSS.js +0 -24
- package/src/util/findNodeOwner.js +0 -35
- package/src/util/getEffectiveContentDensity.js +0 -5
- package/src/util/isDescendantOf.js +0 -15
- package/src/util/isNodeClickable.js +0 -19
- package/src/util/isNodeHidden.js +0 -9
- package/src/util/isNodeTabbable.js +0 -28
- package/src/util/setToArray.js +0 -10
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import merge from "./thirdparty/merge.js";
|
|
2
2
|
import { boot } from "./Boot.js";
|
|
3
|
-
import UI5ElementMetadata
|
|
3
|
+
import UI5ElementMetadata, {
|
|
4
|
+
Slot,
|
|
5
|
+
SlotValue,
|
|
6
|
+
State,
|
|
7
|
+
PropertyValue,
|
|
8
|
+
Metadata,
|
|
9
|
+
} from "./UI5ElementMetadata.js";
|
|
4
10
|
import EventProvider from "./EventProvider.js";
|
|
5
11
|
import getSingletonElementInstance from "./util/getSingletonElementInstance.js";
|
|
6
12
|
import StaticAreaItem from "./StaticAreaItem.js";
|
|
@@ -10,28 +16,43 @@ import { registerTag, isTagRegistered, recordTagRegistrationFailure } from "./Cu
|
|
|
10
16
|
import { observeDOMNode, unobserveDOMNode } from "./DOMObserver.js";
|
|
11
17
|
import { skipOriginalEvent } from "./config/NoConflict.js";
|
|
12
18
|
import getEffectiveDir from "./locale/getEffectiveDir.js";
|
|
13
|
-
import
|
|
14
|
-
import Float from "./types/Float.js";
|
|
19
|
+
import DataType from "./types/DataType.js";
|
|
15
20
|
import { kebabToCamelCase, camelToKebabCase } from "./util/StringHelper.js";
|
|
16
21
|
import isValidPropertyName from "./util/isValidPropertyName.js";
|
|
17
|
-
import {
|
|
22
|
+
import { getSlotName, getSlottedNodesList } from "./util/SlotsHelper.js";
|
|
18
23
|
import arraysAreEqual from "./util/arraysAreEqual.js";
|
|
19
|
-
import getClassCopy from "./util/getClassCopy.js";
|
|
20
24
|
import { markAsRtlAware } from "./locale/RTLAwareRegistry.js";
|
|
21
|
-
import
|
|
25
|
+
import preloadLinks from "./theming/preloadLinks.js";
|
|
26
|
+
import { TemplateFunction, TemplateFunctionResult } from "./renderer/executeTemplate.js";
|
|
27
|
+
import { PromiseResolve, StyleData } from "./types.js";
|
|
22
28
|
|
|
23
29
|
let autoId = 0;
|
|
24
30
|
|
|
25
|
-
const elementTimeouts = new Map();
|
|
26
|
-
const uniqueDependenciesCache = new Map();
|
|
31
|
+
const elementTimeouts = new Map<string, Promise<void>>();
|
|
32
|
+
const uniqueDependenciesCache = new Map<typeof UI5Element, Array<typeof UI5Element>>();
|
|
33
|
+
|
|
34
|
+
type ChangeInfo = {
|
|
35
|
+
type: "property" | "slot",
|
|
36
|
+
name: string,
|
|
37
|
+
reason?: string,
|
|
38
|
+
child?: SlotValue,
|
|
39
|
+
target?: UI5Element,
|
|
40
|
+
newValue?: PropertyValue,
|
|
41
|
+
oldValue?: PropertyValue,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type InvalidationInfo = ChangeInfo & { target: UI5Element };
|
|
45
|
+
|
|
46
|
+
type ChildChangeListener = (param: InvalidationInfo) => void;
|
|
47
|
+
|
|
48
|
+
type SlotChangeListener = (this: HTMLSlotElement, ev: Event) => void;
|
|
27
49
|
|
|
28
50
|
/**
|
|
29
51
|
* Triggers re-rendering of a UI5Element instance due to state change.
|
|
30
|
-
*
|
|
31
|
-
* @param changeInfo An object with information about the change that caused invalidation.
|
|
52
|
+
* @param {ChangeInfo} changeInfo An object with information about the change that caused invalidation.
|
|
32
53
|
* @private
|
|
33
54
|
*/
|
|
34
|
-
function _invalidate(changeInfo) {
|
|
55
|
+
function _invalidate(this: UI5Element, changeInfo: ChangeInfo) {
|
|
35
56
|
// Invalidation should be suppressed: 1) before the component is rendered for the first time 2) and during the execution of onBeforeRendering
|
|
36
57
|
// This is necessary not only as an optimization, but also to avoid infinite loops on invalidation between children and parents (when invalidateOnChildChange is used)
|
|
37
58
|
if (this._suppressInvalidation) {
|
|
@@ -43,9 +64,11 @@ function _invalidate(changeInfo) {
|
|
|
43
64
|
|
|
44
65
|
this._changedState.push(changeInfo);
|
|
45
66
|
renderDeferred(this);
|
|
46
|
-
this._eventProvider.fireEvent("
|
|
67
|
+
this._eventProvider.fireEvent("invalidate", { ...changeInfo, target: this });
|
|
47
68
|
}
|
|
48
69
|
|
|
70
|
+
let metadata = {} as Metadata;
|
|
71
|
+
|
|
49
72
|
/**
|
|
50
73
|
* Base class for all UI5 Web Components
|
|
51
74
|
*
|
|
@@ -56,10 +79,32 @@ function _invalidate(changeInfo) {
|
|
|
56
79
|
* @extends HTMLElement
|
|
57
80
|
* @public
|
|
58
81
|
*/
|
|
59
|
-
class UI5Element extends HTMLElement {
|
|
82
|
+
abstract class UI5Element extends HTMLElement {
|
|
83
|
+
__id?: string;
|
|
84
|
+
_suppressInvalidation: boolean;
|
|
85
|
+
_changedState: Array<ChangeInfo>;
|
|
86
|
+
_eventProvider: EventProvider<InvalidationInfo, void>;
|
|
87
|
+
_inDOM: boolean;
|
|
88
|
+
_fullyConnected: boolean;
|
|
89
|
+
_childChangeListeners: Map<string, ChildChangeListener>;
|
|
90
|
+
_slotChangeListeners: Map<string, SlotChangeListener>;
|
|
91
|
+
_domRefReadyPromise: Promise<void> & { _deferredResolve?: PromiseResolve };
|
|
92
|
+
_doNotSyncAttributes: Set<string>;
|
|
93
|
+
_state: State;
|
|
94
|
+
_onComponentStateFinalized?: () => void;
|
|
95
|
+
_getRealDomRef?: () => HTMLElement;
|
|
96
|
+
|
|
97
|
+
staticAreaItem?: StaticAreaItem;
|
|
98
|
+
|
|
99
|
+
static template?: TemplateFunction;
|
|
100
|
+
static staticAreaTemplate?: TemplateFunction;
|
|
101
|
+
static _metadata: UI5ElementMetadata;
|
|
102
|
+
static render: (templateFunctionResult: TemplateFunctionResult, container: HTMLElement | DocumentFragment, styleStrOrHrefsArr: string | Array<string> | undefined, forStaticArea: boolean, options: { host: HTMLElement }) => void;
|
|
103
|
+
|
|
60
104
|
constructor() {
|
|
61
105
|
super();
|
|
62
106
|
|
|
107
|
+
const ctor = this.constructor as typeof UI5Element;
|
|
63
108
|
this._changedState = []; // Filled on each invalidation, cleared on re-render (used for debugging)
|
|
64
109
|
this._suppressInvalidation = true; // A flag telling whether all invalidations should be ignored. Initialized with "true" because a UI5Element can not be invalidated until it is rendered for the first time
|
|
65
110
|
this._inDOM = false; // A flag telling whether the UI5Element is currently in the DOM tree of the document or not
|
|
@@ -72,11 +117,13 @@ class UI5Element extends HTMLElement {
|
|
|
72
117
|
deferredResolve = resolve;
|
|
73
118
|
});
|
|
74
119
|
this._domRefReadyPromise._deferredResolve = deferredResolve;
|
|
120
|
+
this._doNotSyncAttributes = new Set(); // attributes that are excluded from attributeChangedCallback synchronization
|
|
121
|
+
|
|
122
|
+
this._state = { ...ctor.getMetadata().getInitialState() };
|
|
75
123
|
|
|
76
|
-
this._initializeState();
|
|
77
124
|
this._upgradeAllProperties();
|
|
78
125
|
|
|
79
|
-
if (
|
|
126
|
+
if (ctor._needsShadowDOM()) {
|
|
80
127
|
this.attachShadow({ mode: "open" });
|
|
81
128
|
}
|
|
82
129
|
}
|
|
@@ -100,10 +147,14 @@ class UI5Element extends HTMLElement {
|
|
|
100
147
|
* @private
|
|
101
148
|
*/
|
|
102
149
|
async connectedCallback() {
|
|
103
|
-
this.
|
|
150
|
+
const ctor = this.constructor as typeof UI5Element;
|
|
104
151
|
|
|
105
|
-
|
|
106
|
-
|
|
152
|
+
this.setAttribute(ctor.getMetadata().getPureTag(), "");
|
|
153
|
+
if (ctor.getMetadata().supportsF6FastNavigation()) {
|
|
154
|
+
this.setAttribute("data-sap-ui-fastnavgroup", "true");
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const slotsAreManaged = ctor.getMetadata().slotsAreManaged();
|
|
107
158
|
|
|
108
159
|
this._inDOM = true;
|
|
109
160
|
|
|
@@ -113,20 +164,14 @@ class UI5Element extends HTMLElement {
|
|
|
113
164
|
await this._processChildren();
|
|
114
165
|
}
|
|
115
166
|
|
|
116
|
-
if (needsShadowDOM && !this.shadowRoot) { // Workaround for Firefox74 bug
|
|
117
|
-
await Promise.resolve();
|
|
118
|
-
}
|
|
119
|
-
|
|
120
167
|
if (!this._inDOM) { // Component removed from DOM while _processChildren was running
|
|
121
168
|
return;
|
|
122
169
|
}
|
|
123
170
|
|
|
124
171
|
renderImmediately(this);
|
|
125
|
-
this._domRefReadyPromise._deferredResolve();
|
|
172
|
+
this._domRefReadyPromise._deferredResolve!();
|
|
126
173
|
this._fullyConnected = true;
|
|
127
|
-
|
|
128
|
-
this.onEnterDOM();
|
|
129
|
-
}
|
|
174
|
+
this.onEnterDOM();
|
|
130
175
|
}
|
|
131
176
|
|
|
132
177
|
/**
|
|
@@ -134,8 +179,8 @@ class UI5Element extends HTMLElement {
|
|
|
134
179
|
* @private
|
|
135
180
|
*/
|
|
136
181
|
disconnectedCallback() {
|
|
137
|
-
const
|
|
138
|
-
const slotsAreManaged =
|
|
182
|
+
const ctor = this.constructor as typeof UI5Element;
|
|
183
|
+
const slotsAreManaged = ctor.getMetadata().slotsAreManaged();
|
|
139
184
|
|
|
140
185
|
this._inDOM = false;
|
|
141
186
|
|
|
@@ -143,13 +188,9 @@ class UI5Element extends HTMLElement {
|
|
|
143
188
|
this._stopObservingDOMChildren();
|
|
144
189
|
}
|
|
145
190
|
|
|
146
|
-
if (
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
this.onExitDOM();
|
|
150
|
-
}
|
|
151
|
-
this._fullyConnected = false;
|
|
152
|
-
}
|
|
191
|
+
if (this._fullyConnected) {
|
|
192
|
+
this.onExitDOM();
|
|
193
|
+
this._fullyConnected = false;
|
|
153
194
|
}
|
|
154
195
|
|
|
155
196
|
if (this.staticAreaItem && this.staticAreaItem.parentElement) {
|
|
@@ -159,22 +200,47 @@ class UI5Element extends HTMLElement {
|
|
|
159
200
|
cancelRender(this);
|
|
160
201
|
}
|
|
161
202
|
|
|
203
|
+
/**
|
|
204
|
+
* Called every time before the component renders.
|
|
205
|
+
* @public
|
|
206
|
+
*/
|
|
207
|
+
onBeforeRendering() {}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Called every time after the component renders.
|
|
211
|
+
* @public
|
|
212
|
+
*/
|
|
213
|
+
onAfterRendering() {}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Called on connectedCallback - added to the DOM.
|
|
217
|
+
* @public
|
|
218
|
+
*/
|
|
219
|
+
onEnterDOM() {}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Called on disconnectedCallback - removed from the DOM.
|
|
223
|
+
* @public
|
|
224
|
+
*/
|
|
225
|
+
onExitDOM() {}
|
|
226
|
+
|
|
162
227
|
/**
|
|
163
228
|
* @private
|
|
164
229
|
*/
|
|
165
230
|
_startObservingDOMChildren() {
|
|
166
|
-
const
|
|
231
|
+
const ctor = this.constructor as typeof UI5Element;
|
|
232
|
+
const shouldObserveChildren = ctor.getMetadata().hasSlots();
|
|
167
233
|
if (!shouldObserveChildren) {
|
|
168
234
|
return;
|
|
169
235
|
}
|
|
170
236
|
|
|
171
|
-
const canSlotText =
|
|
237
|
+
const canSlotText = ctor.getMetadata().canSlotText();
|
|
172
238
|
const mutationObserverOptions = {
|
|
173
239
|
childList: true,
|
|
174
240
|
subtree: canSlotText,
|
|
175
241
|
characterData: canSlotText,
|
|
176
242
|
};
|
|
177
|
-
observeDOMNode(this, this._processChildren.bind(this), mutationObserverOptions);
|
|
243
|
+
observeDOMNode(this, this._processChildren.bind(this) as MutationCallback, mutationObserverOptions);
|
|
178
244
|
}
|
|
179
245
|
|
|
180
246
|
/**
|
|
@@ -189,7 +255,7 @@ class UI5Element extends HTMLElement {
|
|
|
189
255
|
* @private
|
|
190
256
|
*/
|
|
191
257
|
async _processChildren() {
|
|
192
|
-
const hasSlots = this.constructor.getMetadata().hasSlots();
|
|
258
|
+
const hasSlots = (this.constructor as typeof UI5Element).getMetadata().hasSlots();
|
|
193
259
|
if (hasSlots) {
|
|
194
260
|
await this._updateSlots();
|
|
195
261
|
}
|
|
@@ -199,23 +265,24 @@ class UI5Element extends HTMLElement {
|
|
|
199
265
|
* @private
|
|
200
266
|
*/
|
|
201
267
|
async _updateSlots() {
|
|
202
|
-
const
|
|
203
|
-
const
|
|
204
|
-
const
|
|
268
|
+
const ctor = this.constructor as typeof UI5Element;
|
|
269
|
+
const slotsMap = ctor.getMetadata().getSlots();
|
|
270
|
+
const canSlotText = ctor.getMetadata().canSlotText();
|
|
271
|
+
const domChildren = Array.from(canSlotText ? this.childNodes : this.children) as Array<Node>;
|
|
205
272
|
|
|
206
|
-
const slotsCachedContentMap = new Map(); // Store here the content of each slot before the mutation occurred
|
|
207
|
-
const propertyNameToSlotMap = new Map(); // Used for reverse lookup to determine to which slot the property name corresponds
|
|
273
|
+
const slotsCachedContentMap = new Map<string, Array<SlotValue>>(); // Store here the content of each slot before the mutation occurred
|
|
274
|
+
const propertyNameToSlotMap = new Map<string, string>(); // Used for reverse lookup to determine to which slot the property name corresponds
|
|
208
275
|
|
|
209
276
|
// Init the _state object based on the supported slots and store the previous values
|
|
210
277
|
for (const [slotName, slotData] of Object.entries(slotsMap)) { // eslint-disable-line
|
|
211
278
|
const propertyName = slotData.propertyName || slotName;
|
|
212
279
|
propertyNameToSlotMap.set(propertyName, slotName);
|
|
213
|
-
slotsCachedContentMap.set(propertyName, [...this._state[propertyName]]);
|
|
280
|
+
slotsCachedContentMap.set(propertyName, [...(this._state[propertyName] as Array<SlotValue>)]);
|
|
214
281
|
this._clearSlot(slotName, slotData);
|
|
215
282
|
}
|
|
216
283
|
|
|
217
|
-
const autoIncrementMap = new Map();
|
|
218
|
-
const slottedChildrenMap = new Map();
|
|
284
|
+
const autoIncrementMap = new Map<string, number>();
|
|
285
|
+
const slottedChildrenMap = new Map<string, Array<{child: Node, idx: number }>>();
|
|
219
286
|
|
|
220
287
|
const allChildrenUpgraded = domChildren.map(async (child, idx) => {
|
|
221
288
|
// Determine the type of the child (mainly by the slot attribute)
|
|
@@ -233,7 +300,7 @@ class UI5Element extends HTMLElement {
|
|
|
233
300
|
if (slotData.individualSlots) {
|
|
234
301
|
const nextIndex = (autoIncrementMap.get(slotName) || 0) + 1;
|
|
235
302
|
autoIncrementMap.set(slotName, nextIndex);
|
|
236
|
-
child._individualSlot = `${slotName}-${nextIndex}`;
|
|
303
|
+
(child as Record<string, any>)._individualSlot = `${slotName}-${nextIndex}`;
|
|
237
304
|
}
|
|
238
305
|
|
|
239
306
|
// Await for not-yet-defined custom elements
|
|
@@ -255,22 +322,26 @@ class UI5Element extends HTMLElement {
|
|
|
255
322
|
}
|
|
256
323
|
}
|
|
257
324
|
|
|
258
|
-
child =
|
|
325
|
+
child = (ctor.getMetadata().constructor as typeof UI5ElementMetadata).validateSlotValue(child, slotData);
|
|
259
326
|
|
|
260
327
|
// Listen for any invalidation on the child if invalidateOnChildChange is true or an object (ignore when false or not set)
|
|
261
|
-
if (child
|
|
262
|
-
|
|
328
|
+
if (instanceOfUI5Element(child) && slotData.invalidateOnChildChange) {
|
|
329
|
+
const childChangeListener = this._getChildChangeListener(slotName);
|
|
330
|
+
|
|
331
|
+
if (childChangeListener) {
|
|
332
|
+
child.attachInvalidate.call(child, childChangeListener);
|
|
333
|
+
}
|
|
263
334
|
}
|
|
264
335
|
|
|
265
336
|
// Listen for the slotchange event if the child is a slot itself
|
|
266
|
-
if (
|
|
337
|
+
if (child instanceof HTMLSlotElement) {
|
|
267
338
|
this._attachSlotChange(child, slotName);
|
|
268
339
|
}
|
|
269
340
|
|
|
270
341
|
const propertyName = slotData.propertyName || slotName;
|
|
271
342
|
|
|
272
343
|
if (slottedChildrenMap.has(propertyName)) {
|
|
273
|
-
slottedChildrenMap.get(propertyName)
|
|
344
|
+
slottedChildrenMap.get(propertyName)!.push({ child, idx });
|
|
274
345
|
} else {
|
|
275
346
|
slottedChildrenMap.set(propertyName, [{ child, idx }]);
|
|
276
347
|
}
|
|
@@ -288,10 +359,10 @@ class UI5Element extends HTMLElement {
|
|
|
288
359
|
let invalidated = false;
|
|
289
360
|
for (const [slotName, slotData] of Object.entries(slotsMap)) { // eslint-disable-line
|
|
290
361
|
const propertyName = slotData.propertyName || slotName;
|
|
291
|
-
if (!arraysAreEqual(slotsCachedContentMap.get(propertyName)
|
|
362
|
+
if (!arraysAreEqual(slotsCachedContentMap.get(propertyName)!, this._state[propertyName] as Array<SlotValue>)) {
|
|
292
363
|
_invalidate.call(this, {
|
|
293
364
|
type: "slot",
|
|
294
|
-
name: propertyNameToSlotMap.get(propertyName)
|
|
365
|
+
name: propertyNameToSlotMap.get(propertyName)!,
|
|
295
366
|
reason: "children",
|
|
296
367
|
});
|
|
297
368
|
invalidated = true;
|
|
@@ -313,16 +384,20 @@ class UI5Element extends HTMLElement {
|
|
|
313
384
|
* Removes all children from the slot and detaches listeners, if any
|
|
314
385
|
* @private
|
|
315
386
|
*/
|
|
316
|
-
_clearSlot(slotName, slotData) {
|
|
387
|
+
_clearSlot(slotName: string, slotData: Slot) {
|
|
317
388
|
const propertyName = slotData.propertyName || slotName;
|
|
318
|
-
const children = this._state[propertyName]
|
|
389
|
+
const children = this._state[propertyName] as Array<SlotValue>;
|
|
319
390
|
|
|
320
391
|
children.forEach(child => {
|
|
321
|
-
if (child
|
|
322
|
-
|
|
392
|
+
if (instanceOfUI5Element(child)) {
|
|
393
|
+
const childChangeListener = this._getChildChangeListener(slotName);
|
|
394
|
+
|
|
395
|
+
if (childChangeListener) {
|
|
396
|
+
child.detachInvalidate.call(child, childChangeListener);
|
|
397
|
+
}
|
|
323
398
|
}
|
|
324
399
|
|
|
325
|
-
if (
|
|
400
|
+
if (child instanceof HTMLSlotElement) {
|
|
326
401
|
this._detachSlotChange(child, slotName);
|
|
327
402
|
}
|
|
328
403
|
});
|
|
@@ -333,32 +408,32 @@ class UI5Element extends HTMLElement {
|
|
|
333
408
|
/**
|
|
334
409
|
* Attach a callback that will be executed whenever the component is invalidated
|
|
335
410
|
*
|
|
336
|
-
* @param callback
|
|
337
|
-
* @
|
|
411
|
+
* @param {InvalidationInfo} callback
|
|
412
|
+
* @public
|
|
338
413
|
*/
|
|
339
|
-
|
|
340
|
-
this._eventProvider.attachEvent("
|
|
414
|
+
attachInvalidate(callback: (param: InvalidationInfo) => void) {
|
|
415
|
+
this._eventProvider.attachEvent("invalidate", callback);
|
|
341
416
|
}
|
|
342
417
|
|
|
343
418
|
/**
|
|
344
419
|
* Detach the callback that is executed whenever the component is invalidated
|
|
345
420
|
*
|
|
346
|
-
* @param callback
|
|
347
|
-
* @
|
|
421
|
+
* @param {InvalidationInfo} callback
|
|
422
|
+
* @public
|
|
348
423
|
*/
|
|
349
|
-
|
|
350
|
-
this._eventProvider.detachEvent("
|
|
424
|
+
detachInvalidate(callback: (param: InvalidationInfo) => void) {
|
|
425
|
+
this._eventProvider.detachEvent("invalidate", callback);
|
|
351
426
|
}
|
|
352
427
|
|
|
353
428
|
/**
|
|
354
429
|
* Callback that is executed whenever a monitored child changes its state
|
|
355
430
|
*
|
|
356
|
-
* @param slotName the slot in which a child was invalidated
|
|
357
|
-
* @param childChangeInfo the changeInfo object for the child in the given slot
|
|
431
|
+
* @param {sting} slotName the slot in which a child was invalidated
|
|
432
|
+
* @param { ChangeInfo } childChangeInfo the changeInfo object for the child in the given slot
|
|
358
433
|
* @private
|
|
359
434
|
*/
|
|
360
|
-
_onChildChange(slotName, childChangeInfo) {
|
|
361
|
-
if (!this.constructor.getMetadata().shouldInvalidateOnChildChange(slotName, childChangeInfo.type, childChangeInfo.name)) {
|
|
435
|
+
_onChildChange(slotName: string, childChangeInfo: ChangeInfo) {
|
|
436
|
+
if (!(this.constructor as typeof UI5Element).getMetadata().shouldInvalidateOnChildChange(slotName, childChangeInfo.type, childChangeInfo.name)) {
|
|
362
437
|
return;
|
|
363
438
|
}
|
|
364
439
|
|
|
@@ -376,58 +451,73 @@ class UI5Element extends HTMLElement {
|
|
|
376
451
|
* Do not override this method in derivatives of UI5Element
|
|
377
452
|
* @private
|
|
378
453
|
*/
|
|
379
|
-
attributeChangedCallback(name, oldValue, newValue) {
|
|
380
|
-
|
|
454
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
|
|
455
|
+
let newPropertyValue: PropertyValue;
|
|
456
|
+
if (this._doNotSyncAttributes.has(name)) { // This attribute is mutated internally, not by the user
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
const properties = (this.constructor as typeof UI5Element).getMetadata().getProperties();
|
|
381
461
|
const realName = name.replace(/^ui5-/, "");
|
|
382
462
|
const nameInCamelCase = kebabToCamelCase(realName);
|
|
383
463
|
if (properties.hasOwnProperty(nameInCamelCase)) { // eslint-disable-line
|
|
384
464
|
const propertyTypeClass = properties[nameInCamelCase].type;
|
|
385
465
|
if (propertyTypeClass === Boolean) {
|
|
386
|
-
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
if (propertyTypeClass === Float) {
|
|
392
|
-
newValue = parseFloat(newValue);
|
|
466
|
+
newPropertyValue = newValue !== null;
|
|
467
|
+
} else if ((propertyTypeClass as typeof DataType).isDataTypeClass) {
|
|
468
|
+
newPropertyValue = (propertyTypeClass as typeof DataType).attributeToProperty(newValue);
|
|
469
|
+
} else {
|
|
470
|
+
newPropertyValue = newValue as string;
|
|
393
471
|
}
|
|
394
|
-
|
|
472
|
+
|
|
473
|
+
(this as Record<string, any>)[nameInCamelCase] = newPropertyValue;
|
|
395
474
|
}
|
|
396
475
|
}
|
|
397
476
|
|
|
398
477
|
/**
|
|
399
478
|
* @private
|
|
400
479
|
*/
|
|
401
|
-
_updateAttribute(name, newValue) {
|
|
402
|
-
|
|
403
|
-
return;
|
|
404
|
-
}
|
|
480
|
+
_updateAttribute(name: string, newValue: PropertyValue) {
|
|
481
|
+
const ctor = this.constructor as typeof UI5Element;
|
|
405
482
|
|
|
406
|
-
if (
|
|
483
|
+
if (!ctor.getMetadata().hasAttribute(name)) {
|
|
407
484
|
return;
|
|
408
485
|
}
|
|
409
|
-
|
|
486
|
+
const properties = ctor.getMetadata().getProperties();
|
|
487
|
+
const propertyTypeClass = properties[name].type;
|
|
410
488
|
const attrName = camelToKebabCase(name);
|
|
411
489
|
const attrValue = this.getAttribute(attrName);
|
|
412
|
-
|
|
490
|
+
|
|
491
|
+
if (propertyTypeClass === Boolean) {
|
|
413
492
|
if (newValue === true && attrValue === null) {
|
|
414
493
|
this.setAttribute(attrName, "");
|
|
415
494
|
} else if (newValue === false && attrValue !== null) {
|
|
416
495
|
this.removeAttribute(attrName);
|
|
417
496
|
}
|
|
418
|
-
} else if (
|
|
419
|
-
|
|
420
|
-
|
|
497
|
+
} else if ((propertyTypeClass as typeof DataType).isDataTypeClass) {
|
|
498
|
+
const newAttrValue = (propertyTypeClass as typeof DataType).propertyToAttribute(newValue);
|
|
499
|
+
if (newAttrValue === null) { // null means there must be no attribute for the current value of the property
|
|
500
|
+
this._doNotSyncAttributes.add(attrName); // skip the attributeChangedCallback call for this attribute
|
|
501
|
+
this.removeAttribute(attrName); // remove the attribute safely (will not trigger synchronization to the property value due to the above line)
|
|
502
|
+
this._doNotSyncAttributes.delete(attrName); // enable synchronization again for this attribute
|
|
503
|
+
} else {
|
|
504
|
+
this.setAttribute(attrName, newAttrValue);
|
|
505
|
+
}
|
|
506
|
+
} else if (typeof newValue !== "object") {
|
|
507
|
+
if (attrValue !== newValue) {
|
|
508
|
+
this.setAttribute(attrName, newValue as string);
|
|
509
|
+
}
|
|
510
|
+
} // else { return; } // old object handling
|
|
421
511
|
}
|
|
422
512
|
|
|
423
513
|
/**
|
|
424
514
|
* @private
|
|
425
515
|
*/
|
|
426
|
-
_upgradeProperty(
|
|
427
|
-
if (this.hasOwnProperty(
|
|
428
|
-
const value = this[
|
|
429
|
-
delete this[
|
|
430
|
-
this[
|
|
516
|
+
_upgradeProperty(this: Record<string, any>, propertyName: string) {
|
|
517
|
+
if (this.hasOwnProperty(propertyName)) { // eslint-disable-line
|
|
518
|
+
const value = this[propertyName];
|
|
519
|
+
delete this[propertyName];
|
|
520
|
+
this[propertyName] = value;
|
|
431
521
|
}
|
|
432
522
|
}
|
|
433
523
|
|
|
@@ -435,25 +525,18 @@ class UI5Element extends HTMLElement {
|
|
|
435
525
|
* @private
|
|
436
526
|
*/
|
|
437
527
|
_upgradeAllProperties() {
|
|
438
|
-
const allProps = this.constructor.getMetadata().getPropertiesList();
|
|
439
|
-
allProps.forEach(this._upgradeProperty
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
/**
|
|
443
|
-
* @private
|
|
444
|
-
*/
|
|
445
|
-
_initializeState() {
|
|
446
|
-
this._state = { ...this.constructor.getMetadata().getInitialState() };
|
|
528
|
+
const allProps = (this.constructor as typeof UI5Element).getMetadata().getPropertiesList();
|
|
529
|
+
allProps.forEach(this._upgradeProperty.bind(this));
|
|
447
530
|
}
|
|
448
531
|
|
|
449
532
|
/**
|
|
450
533
|
* Returns a singleton event listener for the "change" event of a child in a given slot
|
|
451
534
|
*
|
|
452
535
|
* @param slotName the name of the slot, where the child is
|
|
453
|
-
* @returns {
|
|
536
|
+
* @returns {ChildChangeListener}
|
|
454
537
|
* @private
|
|
455
538
|
*/
|
|
456
|
-
_getChildChangeListener(slotName) {
|
|
539
|
+
_getChildChangeListener(slotName: string) {
|
|
457
540
|
if (!this._childChangeListeners.has(slotName)) {
|
|
458
541
|
this._childChangeListeners.set(slotName, this._onChildChange.bind(this, slotName));
|
|
459
542
|
}
|
|
@@ -464,27 +547,30 @@ class UI5Element extends HTMLElement {
|
|
|
464
547
|
* Returns a singleton slotchange event listener that invalidates the component due to changes in the given slot
|
|
465
548
|
*
|
|
466
549
|
* @param slotName the name of the slot, where the slot element (whose slotchange event we're listening to) is
|
|
467
|
-
* @returns {
|
|
550
|
+
* @returns {SlotChangeListener}
|
|
468
551
|
* @private
|
|
469
552
|
*/
|
|
470
|
-
_getSlotChangeListener(slotName) {
|
|
553
|
+
_getSlotChangeListener(slotName: string) {
|
|
471
554
|
if (!this._slotChangeListeners.has(slotName)) {
|
|
472
555
|
this._slotChangeListeners.set(slotName, this._onSlotChange.bind(this, slotName));
|
|
473
556
|
}
|
|
474
|
-
return this._slotChangeListeners.get(slotName)
|
|
557
|
+
return this._slotChangeListeners.get(slotName)!;
|
|
475
558
|
}
|
|
476
559
|
|
|
477
560
|
/**
|
|
478
561
|
* @private
|
|
479
562
|
*/
|
|
480
|
-
_attachSlotChange(child, slotName) {
|
|
481
|
-
|
|
563
|
+
_attachSlotChange(child: HTMLSlotElement, slotName: string) {
|
|
564
|
+
const slotChangeListener = this._getSlotChangeListener(slotName);
|
|
565
|
+
if (slotChangeListener) {
|
|
566
|
+
child.addEventListener("slotchange", slotChangeListener);
|
|
567
|
+
}
|
|
482
568
|
}
|
|
483
569
|
|
|
484
570
|
/**
|
|
485
571
|
* @private
|
|
486
572
|
*/
|
|
487
|
-
_detachSlotChange(child, slotName) {
|
|
573
|
+
_detachSlotChange(child: HTMLSlotElement, slotName: string) {
|
|
488
574
|
child.removeEventListener("slotchange", this._getSlotChangeListener(slotName));
|
|
489
575
|
}
|
|
490
576
|
|
|
@@ -494,7 +580,7 @@ class UI5Element extends HTMLElement {
|
|
|
494
580
|
* @param slotName the name of the slot, where the slot element (whose slotchange event we're listening to) is
|
|
495
581
|
* @private
|
|
496
582
|
*/
|
|
497
|
-
_onSlotChange(slotName) {
|
|
583
|
+
_onSlotChange(slotName: string) {
|
|
498
584
|
_invalidate.call(this, {
|
|
499
585
|
type: "slot",
|
|
500
586
|
name: slotName,
|
|
@@ -529,21 +615,20 @@ class UI5Element extends HTMLElement {
|
|
|
529
615
|
*
|
|
530
616
|
* @public
|
|
531
617
|
*/
|
|
532
|
-
onInvalidation(changeInfo) {}
|
|
618
|
+
onInvalidation(changeInfo: ChangeInfo) {} // eslint-disable-line
|
|
533
619
|
|
|
534
620
|
/**
|
|
535
621
|
* Do not call this method directly, only intended to be called by js
|
|
536
622
|
* @protected
|
|
537
623
|
*/
|
|
538
624
|
_render() {
|
|
539
|
-
const
|
|
625
|
+
const ctor = this.constructor as typeof UI5Element;
|
|
626
|
+
const hasIndividualSlots = ctor.getMetadata().hasIndividualSlots();
|
|
540
627
|
|
|
541
628
|
// suppress invalidation to prevent state changes scheduling another rendering
|
|
542
629
|
this._suppressInvalidation = true;
|
|
543
630
|
|
|
544
|
-
|
|
545
|
-
this.onBeforeRendering();
|
|
546
|
-
}
|
|
631
|
+
this.onBeforeRendering();
|
|
547
632
|
|
|
548
633
|
// Intended for framework usage only. Currently ItemNavigation updates tab indexes after the component has updated its state but before the template is rendered
|
|
549
634
|
if (this._onComponentStateFinalized) {
|
|
@@ -577,7 +662,7 @@ class UI5Element extends HTMLElement {
|
|
|
577
662
|
this._changedState = [];
|
|
578
663
|
|
|
579
664
|
// Update shadow root and static area item
|
|
580
|
-
if (
|
|
665
|
+
if (ctor._needsShadowDOM()) {
|
|
581
666
|
updateShadowRoot(this);
|
|
582
667
|
}
|
|
583
668
|
if (this.staticAreaItem) {
|
|
@@ -590,9 +675,7 @@ class UI5Element extends HTMLElement {
|
|
|
590
675
|
}
|
|
591
676
|
|
|
592
677
|
// Call the onAfterRendering hook
|
|
593
|
-
|
|
594
|
-
this.onAfterRendering();
|
|
595
|
-
}
|
|
678
|
+
this.onAfterRendering();
|
|
596
679
|
}
|
|
597
680
|
|
|
598
681
|
/**
|
|
@@ -601,7 +684,7 @@ class UI5Element extends HTMLElement {
|
|
|
601
684
|
_assignIndividualSlotsToChildren() {
|
|
602
685
|
const domChildren = Array.from(this.children);
|
|
603
686
|
|
|
604
|
-
domChildren.forEach(child => {
|
|
687
|
+
domChildren.forEach((child: Record<string, any>) => {
|
|
605
688
|
if (child._individualSlot) {
|
|
606
689
|
child.setAttribute("slot", child._individualSlot);
|
|
607
690
|
}
|
|
@@ -617,25 +700,27 @@ class UI5Element extends HTMLElement {
|
|
|
617
700
|
|
|
618
701
|
/**
|
|
619
702
|
* Returns the DOM Element inside the Shadow Root that corresponds to the opening tag in the UI5 Web Component's template
|
|
703
|
+
* *Note:* For logical (abstract) elements (items, options, etc...), returns the part of the parent's DOM that represents this option
|
|
620
704
|
* Use this method instead of "this.shadowRoot" to read the Shadow DOM, if ever necessary
|
|
705
|
+
*
|
|
621
706
|
* @public
|
|
622
707
|
*/
|
|
623
708
|
getDomRef() {
|
|
709
|
+
// If a component set _getRealDomRef to its children, use the return value of this function
|
|
710
|
+
if (typeof this._getRealDomRef === "function") {
|
|
711
|
+
return this._getRealDomRef();
|
|
712
|
+
}
|
|
713
|
+
|
|
624
714
|
if (!this.shadowRoot || this.shadowRoot.children.length === 0) {
|
|
625
715
|
return;
|
|
626
716
|
}
|
|
627
717
|
|
|
628
|
-
this.
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
? this.shadowRoot.children[0] : this.shadowRoot.children[1];
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
_assertShadowRootStructure() {
|
|
635
|
-
const expectedChildrenCount = document.adoptedStyleSheets || isLegacyBrowser() ? 1 : 2;
|
|
636
|
-
if (this.shadowRoot.children.length !== expectedChildrenCount) {
|
|
637
|
-
console.warn(`The shadow DOM for ${this.constructor.getMetadata().getTag()} does not have a top level element, the getDomRef() method might not work as expected`); // eslint-disable-line
|
|
718
|
+
const children = [...this.shadowRoot.children].filter(child => !["link", "style"].includes(child.localName));
|
|
719
|
+
if (children.length !== 1) {
|
|
720
|
+
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
|
|
638
721
|
}
|
|
722
|
+
|
|
723
|
+
return children[0] as HTMLElement;
|
|
639
724
|
}
|
|
640
725
|
|
|
641
726
|
/**
|
|
@@ -646,7 +731,7 @@ class UI5Element extends HTMLElement {
|
|
|
646
731
|
getFocusDomRef() {
|
|
647
732
|
const domRef = this.getDomRef();
|
|
648
733
|
if (domRef) {
|
|
649
|
-
const focusRef = domRef.querySelector("[data-sap-focus-ref]");
|
|
734
|
+
const focusRef = domRef.querySelector("[data-sap-focus-ref]") as HTMLElement;
|
|
650
735
|
return focusRef || domRef;
|
|
651
736
|
}
|
|
652
737
|
}
|
|
@@ -661,17 +746,6 @@ class UI5Element extends HTMLElement {
|
|
|
661
746
|
return this.getFocusDomRef();
|
|
662
747
|
}
|
|
663
748
|
|
|
664
|
-
/**
|
|
665
|
-
* Use this method in order to get a reference to an element in the shadow root of the web component or the static area item of the component
|
|
666
|
-
* @public
|
|
667
|
-
* @method
|
|
668
|
-
* @param {String} refName Defines the name of the stable DOM ref
|
|
669
|
-
*/
|
|
670
|
-
getStableDomRef(refName) {
|
|
671
|
-
const staticAreaResult = this.staticAreaItem && this.staticAreaItem.getStableDomRef(refName);
|
|
672
|
-
return staticAreaResult || this.getDomRef().querySelector(`[data-ui5-stable=${refName}]`);
|
|
673
|
-
}
|
|
674
|
-
|
|
675
749
|
/**
|
|
676
750
|
* Set the focus to the element, returned by "getFocusDomRef()" (marked by "data-sap-focus-ref")
|
|
677
751
|
* @public
|
|
@@ -695,7 +769,7 @@ class UI5Element extends HTMLElement {
|
|
|
695
769
|
* @param bubbles - true, if the event bubbles
|
|
696
770
|
* @returns {boolean} false, if the event was cancelled (preventDefault called), true otherwise
|
|
697
771
|
*/
|
|
698
|
-
fireEvent(name, data, cancelable = false, bubbles = true) {
|
|
772
|
+
fireEvent<T>(name: string, data?: T, cancelable = false, bubbles = true) {
|
|
699
773
|
const eventResult = this._fireEvent(name, data, cancelable, bubbles);
|
|
700
774
|
const camelCaseEventName = kebabToCamelCase(name);
|
|
701
775
|
|
|
@@ -706,8 +780,8 @@ class UI5Element extends HTMLElement {
|
|
|
706
780
|
return eventResult;
|
|
707
781
|
}
|
|
708
782
|
|
|
709
|
-
_fireEvent(name, data, cancelable = false, bubbles = true) {
|
|
710
|
-
const noConflictEvent = new CustomEvent(`ui5-${name}`, {
|
|
783
|
+
_fireEvent<T>(name: string, data?: T, cancelable = false, bubbles = true) {
|
|
784
|
+
const noConflictEvent = new CustomEvent<T>(`ui5-${name}`, {
|
|
711
785
|
detail: data,
|
|
712
786
|
composed: false,
|
|
713
787
|
bubbles,
|
|
@@ -721,7 +795,7 @@ class UI5Element extends HTMLElement {
|
|
|
721
795
|
return noConflictEventResult;
|
|
722
796
|
}
|
|
723
797
|
|
|
724
|
-
const normalEvent = new CustomEvent(name, {
|
|
798
|
+
const normalEvent = new CustomEvent<T>(name, {
|
|
725
799
|
detail: data,
|
|
726
800
|
composed: false,
|
|
727
801
|
bubbles,
|
|
@@ -740,8 +814,8 @@ class UI5Element extends HTMLElement {
|
|
|
740
814
|
* Useful when there are transitive slots in nested component scenarios and you don't want to get a list of the slots, but rather of their content.
|
|
741
815
|
* @public
|
|
742
816
|
*/
|
|
743
|
-
getSlottedNodes(slotName) {
|
|
744
|
-
return
|
|
817
|
+
getSlottedNodes(this: Record<string, Array<SlotValue>>, slotName: string) {
|
|
818
|
+
return getSlottedNodesList(this[slotName]);
|
|
745
819
|
}
|
|
746
820
|
|
|
747
821
|
/**
|
|
@@ -752,7 +826,7 @@ class UI5Element extends HTMLElement {
|
|
|
752
826
|
* @returns {String|undefined}
|
|
753
827
|
*/
|
|
754
828
|
get effectiveDir() {
|
|
755
|
-
markAsRtlAware(this.constructor); // if a UI5 Element calls this method, it's considered to be rtl-aware
|
|
829
|
+
markAsRtlAware(this.constructor as typeof UI5Element); // if a UI5 Element calls this method, it's considered to be rtl-aware
|
|
756
830
|
return getEffectiveDir(this);
|
|
757
831
|
}
|
|
758
832
|
|
|
@@ -791,7 +865,7 @@ class UI5Element extends HTMLElement {
|
|
|
791
865
|
* @public
|
|
792
866
|
*/
|
|
793
867
|
getStaticAreaItemDomRef() {
|
|
794
|
-
if (!this.constructor._needsStaticArea()) {
|
|
868
|
+
if (!(this.constructor as typeof UI5Element)._needsStaticArea()) {
|
|
795
869
|
throw new Error("This component does not use the static area");
|
|
796
870
|
}
|
|
797
871
|
|
|
@@ -837,7 +911,7 @@ class UI5Element extends HTMLElement {
|
|
|
837
911
|
}
|
|
838
912
|
|
|
839
913
|
Object.defineProperty(proto, prop, {
|
|
840
|
-
get() {
|
|
914
|
+
get(this: UI5Element) {
|
|
841
915
|
if (this._state[prop] !== undefined) {
|
|
842
916
|
return this._state[prop];
|
|
843
917
|
}
|
|
@@ -854,13 +928,19 @@ class UI5Element extends HTMLElement {
|
|
|
854
928
|
return propDefaultValue;
|
|
855
929
|
}
|
|
856
930
|
},
|
|
857
|
-
|
|
931
|
+
|
|
932
|
+
set(this: UI5Element, value: PropertyValue) {
|
|
858
933
|
let isDifferent;
|
|
859
|
-
|
|
934
|
+
const ctor = this.constructor as typeof UI5Element;
|
|
935
|
+
const metadataCtor = ctor.getMetadata().constructor as typeof UI5ElementMetadata;
|
|
860
936
|
|
|
937
|
+
value = metadataCtor.validatePropertyValue(value, propData);
|
|
938
|
+
const propertyTypeClass = propData.type;
|
|
861
939
|
const oldState = this._state[prop];
|
|
862
|
-
if (propData.multiple && propData.compareValues) {
|
|
940
|
+
if (Array.isArray(oldState) && Array.isArray(value) && propData.multiple && propData.compareValues) { // compareValues is added for IE, test if needed now
|
|
863
941
|
isDifferent = !arraysAreEqual(oldState, value);
|
|
942
|
+
} else if ((propertyTypeClass as typeof DataType).isDataTypeClass) {
|
|
943
|
+
isDifferent = !(propertyTypeClass as typeof DataType).valuesAreEqual(oldState, value);
|
|
864
944
|
} else {
|
|
865
945
|
isDifferent = oldState !== value;
|
|
866
946
|
}
|
|
@@ -889,7 +969,7 @@ class UI5Element extends HTMLElement {
|
|
|
889
969
|
|
|
890
970
|
const propertyName = slotData.propertyName || slotName;
|
|
891
971
|
Object.defineProperty(proto, propertyName, {
|
|
892
|
-
get() {
|
|
972
|
+
get(this: UI5Element) {
|
|
893
973
|
if (this._state[propertyName] !== undefined) {
|
|
894
974
|
return this._state[propertyName];
|
|
895
975
|
}
|
|
@@ -908,14 +988,22 @@ class UI5Element extends HTMLElement {
|
|
|
908
988
|
* @protected
|
|
909
989
|
*/
|
|
910
990
|
static get metadata() {
|
|
911
|
-
return
|
|
991
|
+
return metadata;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
/**
|
|
995
|
+
* Sets a new metadata object for this UI5 Web Component Class
|
|
996
|
+
* @protected
|
|
997
|
+
*/
|
|
998
|
+
static set metadata(newMetadata) {
|
|
999
|
+
metadata = newMetadata;
|
|
912
1000
|
}
|
|
913
1001
|
|
|
914
1002
|
/**
|
|
915
1003
|
* Returns the CSS for this UI5 Web Component Class
|
|
916
1004
|
* @protected
|
|
917
1005
|
*/
|
|
918
|
-
static get styles() {
|
|
1006
|
+
static get styles(): Array<StyleData> | StyleData {
|
|
919
1007
|
return "";
|
|
920
1008
|
}
|
|
921
1009
|
|
|
@@ -923,7 +1011,7 @@ class UI5Element extends HTMLElement {
|
|
|
923
1011
|
* Returns the Static Area CSS for this UI5 Web Component Class
|
|
924
1012
|
* @protected
|
|
925
1013
|
*/
|
|
926
|
-
static get staticAreaStyles() {
|
|
1014
|
+
static get staticAreaStyles(): Array<StyleData> | StyleData {
|
|
927
1015
|
return "";
|
|
928
1016
|
}
|
|
929
1017
|
|
|
@@ -934,7 +1022,7 @@ class UI5Element extends HTMLElement {
|
|
|
934
1022
|
*
|
|
935
1023
|
* @protected
|
|
936
1024
|
*/
|
|
937
|
-
static get dependencies() {
|
|
1025
|
+
static get dependencies(): Array<typeof UI5Element> {
|
|
938
1026
|
return [];
|
|
939
1027
|
}
|
|
940
1028
|
|
|
@@ -943,21 +1031,21 @@ class UI5Element extends HTMLElement {
|
|
|
943
1031
|
*
|
|
944
1032
|
* @public
|
|
945
1033
|
*/
|
|
946
|
-
static getUniqueDependencies() {
|
|
1034
|
+
static getUniqueDependencies(this: typeof UI5Element) {
|
|
947
1035
|
if (!uniqueDependenciesCache.has(this)) {
|
|
948
1036
|
const filtered = this.dependencies.filter((dep, index, deps) => deps.indexOf(dep) === index);
|
|
949
1037
|
uniqueDependenciesCache.set(this, filtered);
|
|
950
1038
|
}
|
|
951
1039
|
|
|
952
|
-
return uniqueDependenciesCache.get(this);
|
|
1040
|
+
return uniqueDependenciesCache.get(this) || [];
|
|
953
1041
|
}
|
|
954
1042
|
|
|
955
1043
|
/**
|
|
956
1044
|
* Returns a promise that resolves whenever all dependencies for this UI5 Web Component have resolved
|
|
957
1045
|
*
|
|
958
|
-
* @returns {Promise
|
|
1046
|
+
* @returns {Promise}
|
|
959
1047
|
*/
|
|
960
|
-
static whenDependenciesDefined() {
|
|
1048
|
+
static whenDependenciesDefined(): Promise<Array<typeof UI5Element>> {
|
|
961
1049
|
return Promise.all(this.getUniqueDependencies().map(dep => dep.define()));
|
|
962
1050
|
}
|
|
963
1051
|
|
|
@@ -985,7 +1073,6 @@ class UI5Element extends HTMLElement {
|
|
|
985
1073
|
]);
|
|
986
1074
|
|
|
987
1075
|
const tag = this.getMetadata().getTag();
|
|
988
|
-
const altTag = this.getMetadata().getAltTag();
|
|
989
1076
|
|
|
990
1077
|
const definedLocally = isTagRegistered(tag);
|
|
991
1078
|
const definedGlobally = customElements.get(tag);
|
|
@@ -995,14 +1082,8 @@ class UI5Element extends HTMLElement {
|
|
|
995
1082
|
} else if (!definedGlobally) {
|
|
996
1083
|
this._generateAccessors();
|
|
997
1084
|
registerTag(tag);
|
|
998
|
-
window.customElements.define(tag, this);
|
|
999
|
-
|
|
1000
|
-
if (altTag && !customElements.get(altTag)) {
|
|
1001
|
-
registerTag(altTag);
|
|
1002
|
-
window.customElements.define(altTag, getClassCopy(this, () => {
|
|
1003
|
-
console.log(`The ${altTag} tag is deprecated and will be removed in the next release, please use ${tag} instead.`); // eslint-disable-line
|
|
1004
|
-
}));
|
|
1005
|
-
}
|
|
1085
|
+
window.customElements.define(tag, this as unknown as CustomElementConstructor);
|
|
1086
|
+
preloadLinks(this);
|
|
1006
1087
|
}
|
|
1007
1088
|
return this;
|
|
1008
1089
|
}
|
|
@@ -1024,11 +1105,21 @@ class UI5Element extends HTMLElement {
|
|
|
1024
1105
|
klass = Object.getPrototypeOf(klass);
|
|
1025
1106
|
metadataObjects.unshift(klass.metadata);
|
|
1026
1107
|
}
|
|
1027
|
-
const mergedMetadata = merge({}, ...metadataObjects);
|
|
1108
|
+
const mergedMetadata = merge({}, ...metadataObjects) as Metadata;
|
|
1028
1109
|
|
|
1029
1110
|
this._metadata = new UI5ElementMetadata(mergedMetadata);
|
|
1030
1111
|
return this._metadata;
|
|
1031
1112
|
}
|
|
1032
1113
|
}
|
|
1033
1114
|
|
|
1115
|
+
/**
|
|
1116
|
+
* Always use duck-typing to cover all runtimes on the page.
|
|
1117
|
+
* @returns {boolean}
|
|
1118
|
+
*/
|
|
1119
|
+
const instanceOfUI5Element = (object: any): object is UI5Element => {
|
|
1120
|
+
return "isUI5Element" in object;
|
|
1121
|
+
};
|
|
1122
|
+
|
|
1034
1123
|
export default UI5Element;
|
|
1124
|
+
export { instanceOfUI5Element };
|
|
1125
|
+
export type { ChangeInfo };
|