UNPKG

@openui5/sap.ui.core

Version:

OpenUI5 Core Library sap.ui.core

407 lines (343 loc) 12.7 kB
/*! * OpenUI5 * (c) Copyright 2009-2021 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ sap.ui.define([ 'sap/ui/core/library', 'sap/ui/Global', 'sap/ui/core/Core', 'sap/ui/core/ElementMetadata', "sap/base/util/LoaderExtensions", "sap/base/util/UriParameters", "jquery.sap.global" ], function( library, Global, Core, ElementMetadata, LoaderExtensions, UriParameters, jQuery ) { 'use strict'; var configurationInfo = sap.ui.getCore().getConfiguration(); // ================================================================================ // Technical Information // ================================================================================ /** * Creates an object with the libraries and their version from the version info file. * @returns {Object} * @private */ function _getLibraries() { var libraries = Global.versioninfo ? Global.versioninfo.libraries : undefined; var formattedLibraries = Object.create(null); if (libraries !== undefined) { libraries.forEach(function (element, index, array) { formattedLibraries[element.name] = element.version; }); } return formattedLibraries; } /** * Creates an object with the loaded libraries and their version. * @returns {Object} * @private */ function _getLoadedLibraries() { var libraries = sap.ui.getCore().getLoadedLibraries(); var formattedLibraries = Object.create(null); Object.keys(sap.ui.getCore().getLoadedLibraries()).forEach(function (element, index, array) { formattedLibraries[element] = libraries[element].version; }); return formattedLibraries; } /** * Creates a simple object with all URL parameters. * @returns {Object<string,string[]>} Map of parameter value arrays keyed by parameter names */ function getURLParameters() { var oParams = UriParameters.fromQuery(window.location.search); return Array.from(oParams.keys()).reduce(function(oResult, sKey) { oResult[sKey] = oParams.getAll(sKey); return oResult; }, {}); } /** * Gets all the relevant information for the framework. * @returns {Object} * @private */ function _getFrameworkInformation() { return { commonInformation: { version: Global.version, buildTime: Global.buildinfo.buildtime, lastChange: Global.buildinfo.lastchange, jquery: jQuery.fn.jquery, userAgent: navigator.userAgent, applicationHREF: window.location.href, documentTitle: document.title, documentMode: document.documentMode || '', debugMode: jQuery.sap.debug(), statistics: jQuery.sap.statistics() }, configurationBootstrap: window['sap-ui-config'] || Object.create(null), configurationComputed: { theme: configurationInfo.getTheme(), language: configurationInfo.getLanguage(), formatLocale: configurationInfo.getFormatLocale(), accessibility: configurationInfo.getAccessibility(), animation: configurationInfo.getAnimation(), rtl: configurationInfo.getRTL(), debug: configurationInfo.getDebug(), inspect: configurationInfo.getInspect(), originInfo: configurationInfo.getOriginInfo(), noDuplicateIds: configurationInfo.getNoDuplicateIds() }, libraries: _getLibraries(), loadedLibraries: _getLoadedLibraries(), loadedModules: LoaderExtensions.getAllRequiredModules().sort(), URLParameters: getURLParameters() }; } // ================================================================================ // Control tree Information // ================================================================================ /** * Name space for all methods related to control trees */ var controlTree = { /** * Creates data model of the rendered controls as a tree. * @param {Element} nodeElement - HTML DOM element from which the function will star searching. * @param {Array} resultArray - Array that will contains all the information. * @private */ _createRenderedTreeModel: function (nodeElement, resultArray) { var node = nodeElement; var childNode = node.firstElementChild; var results = resultArray; var subResult = results; var control = sap.ui.getCore().byId(node.id); if (node.getAttribute('data-sap-ui') && control) { results.push({ id: control.getId(), name: control.getMetadata().getName(), type: 'sap-ui-control', content: [] }); subResult = results[results.length - 1].content; } else if (node.getAttribute('data-sap-ui-area')) { results.push({ id: node.id, name: 'sap-ui-area', type: 'data-sap-ui', content: [] }); subResult = results[results.length - 1].content; } while (childNode) { this._createRenderedTreeModel(childNode, subResult); childNode = childNode.nextElementSibling; } } }; // ================================================================================ // Control Information // ================================================================================ /** * Name space for all information relevant for UI5 control */ var controlInformation = { // Control Properties Info // ================================================================================ /** * Creates an object with the control properties that are not inherited. * @param {Object} control - UI5 control. * @returns {Object} * @private */ _getOwnProperties: function (control) { var result = Object.create(null); var controlPropertiesFromMetadata = control.getMetadata().getProperties(); result.meta = Object.create(null); result.meta.controlName = control.getMetadata().getName(); result.properties = Object.create(null); Object.keys(controlPropertiesFromMetadata).forEach(function (key) { result.properties[key] = Object.create(null); result.properties[key].value = control.getProperty(key); result.properties[key].type = controlPropertiesFromMetadata[key].getType().getName ? controlPropertiesFromMetadata[key].getType().getName() : ''; }); return result; }, /** * Copies the inherited properties of a UI5 control from the metadata. * @param {Object} control - UI5 Control. * @param {Object} inheritedMetadata - UI5 control metadata. * @returns {Object} * @private */ _copyInheritedProperties: function (control, inheritedMetadata) { var inheritedMetadataProperties = inheritedMetadata.getProperties(); var result = Object.create(null); result.meta = Object.create(null); result.meta.controlName = inheritedMetadata.getName(); result.properties = Object.create(null); Object.keys(inheritedMetadataProperties).forEach(function (key) { result.properties[key] = Object.create(null); result.properties[key].value = inheritedMetadataProperties[key].get(control); result.properties[key].type = inheritedMetadataProperties[key].getType().getName ? inheritedMetadataProperties[key].getType().getName() : ''; }); return result; }, /** * Creates an array with the control properties that are inherited. * @param {Object} control - UI5 control. * @returns {Array} * @private */ _getInheritedProperties: function (control) { var result = []; var inheritedMetadata = control.getMetadata().getParent(); while (inheritedMetadata instanceof ElementMetadata) { result.push(this._copyInheritedProperties(control, inheritedMetadata)); inheritedMetadata = inheritedMetadata.getParent(); } return result; }, /** * Creates an object with all control properties. * @param {string} controlId * @returns {Object} * @private */ _getProperties: function (controlId) { var control = sap.ui.getCore().byId(controlId); var properties = Object.create(null); if (control) { properties.own = this._getOwnProperties(control); properties.inherited = this._getInheritedProperties(control); } return properties; }, // Binding Info // ================================================================================ /** * Creates an object with the context model of a UI5 control. * @param {Object} control * @param {string} controlProperty * @returns {Object} * @private */ _getModelFromContext: function (control, controlProperty) { var bindingContext = control.getBinding(controlProperty); var bindingContextModel = bindingContext.getModel(); var bindingInfoParts = (control.getBindingInfo(controlProperty).parts) ? control.getBindingInfo(controlProperty).parts : []; var modelNames = []; for (var i = 0; i < bindingInfoParts.length; i++) { modelNames.push(bindingInfoParts[i].model); } var model = { names: modelNames, path: bindingContext.getPath() }; if (bindingContextModel) { model.mode = bindingContextModel.getDefaultBindingMode(); model.type = bindingContextModel.getMetadata().getName(); model.data = bindingContextModel.getData ? bindingContextModel.getData('/') : undefined; } return model; }, /** * Creates an object with the properties bindings of a UI5 control. * @param {Object} control * @returns {Object} * @private */ _getBindDataForProperties: function (control) { var properties = control.getMetadata().getAllProperties(); var propertiesBindingData = Object.create(null); for (var key in properties) { if (properties.hasOwnProperty(key) && control.getBinding(key)) { propertiesBindingData[key] = Object.create(null); propertiesBindingData[key].path = control.getBinding(key).getPath(); propertiesBindingData[key].value = control.getBinding(key).getValue(); propertiesBindingData[key].type = control.getMetadata().getProperty(key).getType().getName ? control.getMetadata().getProperty(key).getType().getName() : ''; propertiesBindingData[key].mode = control.getBinding(key).getBindingMode(); propertiesBindingData[key].model = this._getModelFromContext(control, key); } } return propertiesBindingData; }, /** * Creates an object with the agregations bindings of a UI5 control. * @param {Object} control * @returns {Object} * @private */ _getBindDataForAggregations: function (control) { var aggregations = control.getMetadata().getAllAggregations(); var aggregationsBindingData = Object.create(null); for (var key in aggregations) { if (aggregations.hasOwnProperty(key) && control.getBinding(key)) { aggregationsBindingData[key] = Object.create(null); aggregationsBindingData[key].model = this._getModelFromContext(control, key); } } return aggregationsBindingData; } }; // ================================================================================ // Public API // ================================================================================ /** * Global object that provide common information for all support tools * @type {{getFrameworkInformation: Function, getRenderedControlTree: Function, getControlProperties: Function, getControlBindingInformation: Function}} */ return { /** * Common information about the framework * @returns {*} */ getFrameworkInformation: _getFrameworkInformation, /** * Array model of the rendered control as a tree. * @returns {Array} */ getRenderedControlTree: function () { var renderedControlTreeModel = []; controlTree._createRenderedTreeModel(document.body, renderedControlTreeModel); return renderedControlTreeModel; }, /** * Gets all control properties. * @param {string} controlId * @returns {Object} */ getControlProperties: function (controlId) { return controlInformation._getProperties(controlId); }, /** * Gets control binding information. * @param {string} controlId * @returns {Object} */ getControlBindings: function (controlId) { var result = Object.create(null); var control = sap.ui.getCore().byId(controlId); var bindingContext; if (!control) { return result; } bindingContext = control.getBindingContext(); result.meta = Object.create(null); result.contextPath = bindingContext ? bindingContext.getPath() : null; result.aggregations = controlInformation._getBindDataForAggregations(control); result.properties = controlInformation._getBindDataForProperties(control); return result; } }; });