UNPKG

@openui5/sap.ui.core

Version:

OpenUI5 Core Library sap.ui.core

208 lines (173 loc) 6.54 kB
/*! * OpenUI5 * (c) Copyright 2009-2023 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ sap.ui.define(["sap/base/Log"], function(Log) { "use strict"; /** * Provide methods for sap.ui.core.routing.Target in sync mode * @private * @experimental * @since 1.33 * @deprecated Since 1.90. Use a {@link sap.ui.core.routing.async.Target async.Target} instead */ return { /** * Creates a view and puts it in an aggregation of a control that has been defined in the {@link #constructor}. * * This method can be used to display a target without changing the browser hash. If the browser hash should be changed, * the {@link sap.ui.core.routing.Router#navTo} method should be used instead * * @param {*} [vData] an object that will be passed to the display event in the data property. If the target has parents, the data will also be passed to them. * @returns {object} The place info * @private */ display : function (vData) { var oParentInfo; if (this._oParent) { oParentInfo = this._oParent.display(vData); } return this._place(oParentInfo, vData); }, /** * Suspends the object which is loaded by the target. * * Currently this function doesn't do anything because the sync * version of the Target can only load Views but no Components. * * @return {sap.ui.core.routing.Target} The 'this' to chain the call * @private */ suspend : function () { // the sync target can only load view and not component // therefore it's not needed to do anything in this function return this; }, /** * Resumes the object which is loaded by the target. * * Currently this function doesn't do anything because the sync * version of the Target can only load Views but no Components. * * @return {sap.ui.core.routing.Target} The 'this' to chain the call * @private */ resume : function () { // the sync target can only load view and not component // therefore it's not needed to do anything in this function return this; }, /** * Places the target on the screen * * @param {object} [oParentInfo] The information about the target parent * @param {*} vData An object that will be passed to the display event in the data property * @returns {object | undefined} The place info if the placement was successful, if not <code>undefined</code> is returned * @private */ _place : function (oParentInfo, vData) { var oOptions = this._oOptions; oParentInfo = oParentInfo || {}; var oView, oControl = oParentInfo.oTargetControl, oViewContainingTheControl = oParentInfo.oTargetParent; // validate config and log errors if necessary if (!this._isValid(oParentInfo, true)) { return undefined; } //no parent view - see if there is a targetParent in the config if (!oViewContainingTheControl && oOptions.rootView) { oViewContainingTheControl = sap.ui.getCore().byId(oOptions.rootView); if (!oViewContainingTheControl) { Log.error("Did not find the root view with the id " + oOptions.rootView, this); return undefined; } } // Find the control in the parent if (oOptions.controlId) { if (oViewContainingTheControl) { //controlId was specified - ask the parents view for it oControl = oViewContainingTheControl.byId(oOptions.controlId); } if (!oControl) { //Test if control exists in core (without prefix) since it was not found in the parent or root view oControl = sap.ui.getCore().byId(oOptions.controlId); } if (!oControl) { Log.error("Control with ID " + oOptions.controlId + " could not be found", this); return undefined; } } var oAggregationInfo = oControl.getMetadata().getJSONKeys()[oOptions.controlAggregation]; if (!oAggregationInfo) { Log.error("Control " + oOptions.controlId + " does not have an aggregation called " + oOptions.controlAggregation, this); return undefined; } //Set view for content var sViewName = this._getEffectiveObjectName(oOptions.viewName); var oViewOptions = { name : sViewName, type : oOptions.viewType, id : oOptions.viewId }; oView = this._oCache._get(oViewOptions, "View", // Hook in the route for deprecated global view id, it has to be supported to stay compatible this._bUseRawViewId); // adapt the container before placing the view into it to make the rendering occur together with the next // aggregation modification. this._beforePlacingViewIntoContainer({ container: oControl, view: oView, data: vData }); this._bindTitleInTitleProvider(oView); this._addTitleProviderAsDependent(oView); if (oOptions.clearControlAggregation === true) { oControl[oAggregationInfo._sRemoveAllMutator](); } Log.info("Did place the view '" + sViewName + "' with the id '" + oView.getId() + "' into the aggregation '" + oOptions.controlAggregation + "' of a control with the id '" + oControl.getId() + "'", this); oControl[oAggregationInfo._sMutator](oView); this.fireDisplay({ view : oView, control : oControl, data: vData }); return { oTargetParent : oView, oTargetControl : oControl }; }, /** * Validates the target options, will also be called from the route but route will not log errors * * @param {object} [oParentInfo] The information about the target parent * @param {boolean} [bLog] Determines if the validation should log errors * @returns {boolean} <code>True</code>, if the target is valid, <code>False</code> if not * @private */ _isValid : function (oParentInfo, bLog) { var oOptions = this._oOptions, oControl = oParentInfo && oParentInfo.oTargetControl, bHasTargetControl = (oControl || oOptions.controlId), bIsValid = true, sLogMessage = ""; if (!bHasTargetControl) { sLogMessage = "The target " + oOptions._name + " has no controlId set and no parent so the target cannot be displayed."; bIsValid = false; } if (!oOptions.controlAggregation) { sLogMessage = "The target " + oOptions._name + " has a control id or a parent but no 'controlAggregation' was set, so the target could not be displayed."; bIsValid = false; } if (!oOptions.viewName) { sLogMessage = "The target " + oOptions._name + " no viewName defined."; bIsValid = false; } if (bLog && sLogMessage) { Log.error(sLogMessage, this); } return bIsValid; } }; });