UNPKG

@openui5/sap.ui.core

Version:

OpenUI5 Core Library sap.ui.core

272 lines (244 loc) 10.1 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([ './Component', 'sap/base/Log', 'sap/base/util/extend', 'sap/base/util/ObjectPath', "sap/base/util/isEmptyObject", './Core' // provides sap.ui.getCore() ], function(Component, Log, extend, ObjectPath, isEmptyObject /*, Core */) { "use strict"; // keys for configuration sections var CONFIG_VIEW_REPLACEMENTS = "sap.ui.viewReplacements", CONFIG_VIEW_EXTENSIONS = "sap.ui.viewExtensions", CONFIG_VIEW_MODIFICATIONS = "sap.ui.viewModifications", CONFIG_CONTROLLER_EXTENSIONS = "sap.ui.controllerExtensions", CONFIG_CONTROLLER_REPLACEMENTS = "sap.ui.controllerReplacements"; // map of component configurations var mComponentConfigs = {}; /** * Finds the config in the given type and use the check function to validate * if the correct entry has been found! * @param {string} sType Name of the config section * @param {string|sap.ui.base.ManagedObject} vObject Component ID or ManagedObject * @param {function} fnCheck Check function */ function findConfig(sType, vObject, fnCheck) { var sComponentId = vObject && typeof vObject === "string" ? vObject : (vObject && Component.getOwnerIdFor(vObject)); if (sComponentId) { // if a component name is given only the component customizing // configuration is checked - the customizing configuration is // merged in case of extending components - so the configuration // should be available properly var oComponent = Component.get(sComponentId); var sComponentName = oComponent && oComponent.getMetadata().getComponentName(); // starting with manifest first we need to check the instance // specific configuration first and fallback to the general // customizing configuration of the component var oConfig = mComponentConfigs[sComponentName + "::" + sComponentId]; if (oConfig && oConfig[sType] && fnCheck(oConfig[sType])) { return false; } else { oConfig = mComponentConfigs[sComponentName]; if (oConfig && oConfig[sType] && fnCheck(oConfig[sType])) { return false; } } } else { // TODO: checking order of components? for (sComponentName in mComponentConfigs) { oConfig = mComponentConfigs[sComponentName]; if (oConfig && oConfig[sType] && fnCheck(oConfig[sType])) { break; } } } } /** * The static object <code>CustomizingConfiguration</code> contains configuration * for view replacements, view extensions and custom properties. The configuration * will be added from component metadata objects once the component gets activated. * By deactivating the component the customizing configuration of the component * gets removed again. * * @author SAP SE * @version 1.87.1 * @constructor * @private * @since 1.15.1 * @alias sap.ui.core.CustomizingConfiguration */ var CustomizingConfiguration = { /** * logging of customizing configuration * @private */ log: function() { if (window.console) { window.console.log(mComponentConfigs); } }, /** * Activates the Customizing of a component by registering the component * configuration in the central customizing configuration. * @param {string} sComponentName the name of the component * @private */ activateForComponent: function(sComponentName) { Log.info("CustomizingConfiguration: activateForComponent('" + sComponentName + "')"); var sFullComponentName = sComponentName + ".Component"; sap.ui.requireSync(sFullComponentName.replace(/\./g, "/")); var oCustomizingConfig = ObjectPath.get(sFullComponentName).getMetadata().getCustomizing(); mComponentConfigs[sComponentName] = oCustomizingConfig; Log.debug("CustomizingConfiguration: customizing configuration for component '" + sComponentName + "' loaded: " + JSON.stringify(oCustomizingConfig)); }, /** * Deactivates the Customizing of a component by removing the component * configuration in the central Customizing configuration. * @param {string} sComponentName Name of the component * @private */ deactivateForComponent: function(sComponentName) { if (mComponentConfigs[sComponentName]) { Log.info("CustomizingConfiguration: deactivateForComponent('" + sComponentName + "')"); delete mComponentConfigs[sComponentName]; } }, /** * Activates the Customizing of a component instance by registering the component * configuration in the central Customizing configuration. * @param {sap.ui.core.Component} oComponent the component instance * @private */ activateForComponentInstance: function(oComponent) { Log.info("CustomizingConfiguration: activateForComponentInstance('" + oComponent.getId() + "')"); var sComponentName = oComponent.getMetadata().getComponentName(), sKey = sComponentName + "::" + oComponent.getId(), oCustomizingConfig = oComponent.getManifest()["sap.ui5"] && oComponent.getManifest()["sap.ui5"]["extends"] && oComponent.getManifest()["sap.ui5"]["extends"]["extensions"]; mComponentConfigs[sKey] = oCustomizingConfig; Log.debug("CustomizingConfiguration: customizing configuration for component '" + sKey + "' loaded: " + JSON.stringify(oCustomizingConfig)); }, /** * Deactivates the Customizing of a component instance by removing the component * configuration in the central Customizing configuration. * @param {sap.ui.core.Component} oComponent the component instance * @private */ deactivateForComponentInstance: function(oComponent) { var sComponentName = oComponent.getMetadata().getComponentName(), sKey = sComponentName + "::" + oComponent.getId(); if (mComponentConfigs[sKey]) { Log.info("CustomizingConfiguration: deactivateForComponent('" + sKey + "')"); delete mComponentConfigs[sKey]; } }, /** * returns the configuration of the replacement View or undefined * @private */ getViewReplacement: function(sViewName, vObject) { var oResultConfig; // TODO: checking order of components? findConfig(CONFIG_VIEW_REPLACEMENTS, vObject, function(oConfig) { oResultConfig = oConfig[sViewName]; return !!oResultConfig; }); return oResultConfig; }, /** * returns the configuration of the given extension point or undefined * @private */ getViewExtension: function(sViewName, sExtensionPointName, vObject) { // FIXME: currently ONE extension wins, but they should be somehow merged - but how to define the order? var oResultConfig; // TODO: checking order of components? findConfig(CONFIG_VIEW_EXTENSIONS, vObject, function(oConfig) { oResultConfig = oConfig[sViewName] && oConfig[sViewName][sExtensionPointName]; return !!oResultConfig; }); return oResultConfig; }, /** * returns the configuration of the controller extensions for the given * controller name * @private */ getControllerExtension: function(sControllerName, vObject) { var oResultConfig; findConfig(CONFIG_CONTROLLER_EXTENSIONS, vObject, function(oConfig) { oResultConfig = oConfig[sControllerName]; return !!oResultConfig; }); return oResultConfig; }, /** * returns the configuration of the controller replacement for the given * controller name * @private */ getControllerReplacement: function(sControllerName, vObject) { var oResultConfig; findConfig(CONFIG_CONTROLLER_REPLACEMENTS, vObject, function(oConfig) { oResultConfig = oConfig[sControllerName]; return !!oResultConfig; }); return oResultConfig; }, /** * currently returns an object (or undefined) because we assume there is * only one property modified and only once * @private */ getCustomProperties: function(sViewName, sControlId, vObject) { // TODO: Fragments and Views are mixed here var mSettings; // TODO: checking order of components? findConfig(CONFIG_VIEW_MODIFICATIONS, vObject, function(oConfig) { var oSettings = oConfig[sViewName] && oConfig[sViewName][sControlId]; var oUsedSettings = {}; var bValidConfigFound = false; var vValue, sName; if (oSettings) { for (sName in oSettings) { vValue = oSettings[sName]; if (sName === "visible") { bValidConfigFound = true; oUsedSettings[sName] = vValue; Log.info("Customizing: custom value for property '" + sName + "' of control '" + sControlId + "' in View '" + sViewName + "' applied: " + vValue); } else { Log.warning("Customizing: custom value for property '" + sName + "' of control '" + sControlId + "' in View '" + sViewName + "' ignored: only the 'visible' property can be customized."); } } if (bValidConfigFound) { // initialize only when there is actually something to add mSettings = mSettings || {}; // merge with any previous calls to findConfig in case of multiple definition sections extend(mSettings, oUsedSettings); // FIXME: this currently overrides customizations from different components in random order } } }); return mSettings; }, hasCustomProperties: function(sViewName, vObject) { var mSettings = {}; findConfig(CONFIG_VIEW_MODIFICATIONS, vObject, function(oConfig) { if (!!oConfig[sViewName]) { mSettings = oConfig[sViewName]; } }); return !isEmptyObject(mSettings); } }; // when the customizing is disabled all the functions will be noop if (sap.ui.getCore().getConfiguration().getDisableCustomizing()) { Log.info("CustomizingConfiguration: disabling Customizing now"); for (var sName in CustomizingConfiguration) { if (typeof CustomizingConfiguration[sName] === "function") { CustomizingConfiguration[sName] = function() {}; } } } return CustomizingConfiguration; }, /* bExport= */ true);