/*! * UI development toolkit for HTML5 (OpenUI5) * (c) Copyright 2009-2018 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ // Provides class sap.m.InstanceManager sap.ui.define(["sap/base/assert", "sap/base/Log", "sap/ui/thirdparty/jquery"], function(assert, Log, jQuery) { "use strict"; /** * Provides methods to manage instances. This is specifically designed for managing the opened Popover, Dialog, ActionSheet, * and it's possible to close all of the opened Popover, Dialog, ActionSheet in history handling. * * As InstanceManager is a static class, a jQuery.sap.require("sap.m.InstanceManager"); statement * must be explicitly executed before the class can be used. Example: *
	 *   jQuery.sap.require("sap.m.InstanceManager");
	 *   sap.m.InstanceManager.closeAllPopovers();
	 * 
* * @namespace * @alias sap.m.InstanceManager * @public * @since 1.9.2 */ var InstanceManager = {}; var mRegistry = {}, aEmptyArray = []; var sPopoverCategoryId = "_POPOVER_", sDialogCategoryId = "_DIALOG_", sLightBoxCategoryId = "_LIGHTBOX_"; /** * Adds an instance to the given category. If the instance is already added to the same category, it won't be added again. * * @param {string} sCategoryId The category's id. * @param {object} oInstance The instance that will be added to the given category. * @returns {sap.m.InstanceManager} Enable method chaining. * @protected * @function */ InstanceManager.addInstance = function(sCategoryId, oInstance) { assert(sCategoryId, "In sap.m.InstanceManager.addInstance method, the parameter sCategoryId can't be null or empty string"); assert(oInstance instanceof Object, "In sap.m.InstanceManager.addInstance method, the parameter oInstance should be an object"); if (!mRegistry[sCategoryId]) { mRegistry[sCategoryId] = []; } if (mRegistry[sCategoryId].indexOf(oInstance) === -1) { mRegistry[sCategoryId].push(oInstance); } return this; }; /** * Removes a managed instance from the given category. * * @param {string} sCategoryId The category's id. * @param {object} oInstance The instance that will be removed from the given category. * @returns {object} The removed instance or null. If the instance isn't managed, this method returns null instead of the instance object. * @protected * @function */ InstanceManager.removeInstance = function(sCategoryId, oInstance) { var aCategory = mRegistry[sCategoryId], i; assert(sCategoryId, "In sap.m.InstanceManager.removeInstance method, the parameter sCategoryId can't be null or empty string"); assert(oInstance instanceof Object, "In sap.m.InstanceManager.removeInstance method, the parameter oInstance should be an object"); if (!aCategory) { Log.warning("Can't remove control from a non-managed category id: " + sCategoryId); return null; } i = aCategory.indexOf(oInstance); return (i === -1) ? null : aCategory.splice(i, 1); }; /** * Returns an array of managed instances in the given category. * * @param {string} sCategoryId The category's id. * @returns {object} Managed instances in the given category. * @protected * @function */ InstanceManager.getInstancesByCategoryId = function(sCategoryId) { assert(sCategoryId, "In sap.m.InstanceManager.getInstancesByCategoryId method, the parameter sCategoryId can't be null or empty string"); return mRegistry[sCategoryId] || aEmptyArray; }; /** * Checks if an instance is managed under the given category. * * @param {string} sCategoryId The category that the instance is supposed to be in. * @param {object} oInstance The instance that needs to be checked. * @returns {boolean} Whether the instance is managed in the given category. * @protected * @function */ InstanceManager.isInstanceManaged = function(sCategoryId, oInstance) { assert(sCategoryId, "In sap.m.InstanceManager.isInstanceManaged method, the parameter sCategoryId can't be null or empty string"); assert(oInstance instanceof Object, "In sap.m.InstanceManager.isInstanceManaged method, the parameter oInstance should be an object"); var aCategory = mRegistry[sCategoryId]; if (!aCategory || !oInstance) { return false; } return aCategory.indexOf(oInstance) !== -1; }; /** * Returns if there's no managed instance in the given category. * * @param {string} sCategoryId The category's id. * @returns {boolean} Whether the category is empty. * @protected */ InstanceManager.isCategoryEmpty = function(sCategoryId) { assert(sCategoryId, "In sap.m.InstanceManager.isCategoryEmpty method, the parameter sCategoryId can't be null or empty string"); var aCategory = mRegistry[sCategoryId]; return !aCategory || aCategory.length === 0; }; /** * Adds a control to predefined popover category in instance manager. * * @param {sap.ui.core.Control} oPopover Popover to be added to instance manager. Custom popover which doesn't inherit from sap.m.Popover can also be added as long as it has a close method. * @returns {sap.m.InstanceManager} Enable method chaining. * @protected */ InstanceManager.addPopoverInstance = function(oPopover){ if (typeof oPopover.close === "function") { InstanceManager.addInstance(sPopoverCategoryId, oPopover); } else { Log.warning("In method addPopoverInstance: the parameter doesn't have a close method and can't be managed."); } return this; }; /** * Adds a control to predefined dialog category in instance manager. * * @param {sap.ui.core.Control} oDialog Dialog to be added to instance manager. Dialog which doesn't inherit from sap.m.Dialog can also be added as long as it has a close method. * @returns {sap.m.InstanceManager} Enable method chaining. * @protected */ InstanceManager.addDialogInstance = function(oDialog){ if (typeof oDialog.close === "function" ) { InstanceManager.addInstance(sDialogCategoryId, oDialog); } else { Log.warning("In method addDialogInstance: the parameter doesn't have a close method and can't be managed."); } return this; }; /** * Adds a control to predefined lightbox category in instance manager. * * @param {sap.m.LigthBox} oLightBox Dialog to be added to instance manager. Dialog which doesn't inherit from sap.m.Dialog can also be added as long as it has a close method. * @returns {sap.m.InstanceManager} Enable method chaining. * @protected */ InstanceManager.addLightBoxInstance = function(oLightBox){ if (typeof oLightBox.close === "function" ) { InstanceManager.addInstance(sLightBoxCategoryId, oLightBox); } else { Log.warning("In method addLightBoxInstance: the parameter doesn't have a close method and can't be managed."); } return this; }; /** * Removes control from predefined popover category in instance manager. * * @param {sap.ui.core.Control} oPopover to be removed from instance manager. * @returns {sap.ui.core.Control} The removed popover or null. If the popover isn't managed, this method returns null instead of the removed popover. * @protected */ InstanceManager.removePopoverInstance = function(oPopover){ return InstanceManager.removeInstance(sPopoverCategoryId, oPopover); }; /** * Removes control from predefined dialog category in instance manager. * * @param {sap.ui.core.Control} oDialog to be removed from instance manager. * @returns {sap.ui.core.Control} The removed popover or null. If the popover isn't managed, this method returns null instead of the removed popover. * @protected * @function */ InstanceManager.removeDialogInstance = function(oDialog){ return InstanceManager.removeInstance(sDialogCategoryId, oDialog); }; /** * Removes control from predefined lightbox category in instance manager. * * @param {sap.m.LightBox} oLightBox to be removed from instance manager. * @returns {sap.m.LightBox|null} The removed popover or null. If the LightBox isn't managed, this method returns null instead of the removed LightBox. * @protected */ InstanceManager.removeLightBoxInstance = function(oLightBox){ return InstanceManager.removeInstance(sLightBoxCategoryId, oLightBox); }; /** * Returns true if there's at least one popover managed in the predefined popover category, otherwise it returns false. * * @returns {boolean} Whether there's popover(s) open. * @public */ InstanceManager.hasOpenPopover = function(){ return !InstanceManager.isCategoryEmpty(sPopoverCategoryId); }; /** * Returns true if there's at least one dialog managed in the predefined dialog category, otherwise it returns false. * * @returns {boolean} Whether there's dialog(s) open. * @public */ InstanceManager.hasOpenDialog = function(){ return !InstanceManager.isCategoryEmpty(sDialogCategoryId); }; /** * Returns true if there's at least one LightBox managed in the predefined lightbox category, otherwise it returns false. * * @returns {boolean} Whether there's LightBox(es) is/are open. * @public */ InstanceManager.hasOpenLightBox = function(){ return !InstanceManager.isCategoryEmpty(sLightBoxCategoryId); }; /** * Checks if the given dialog instance is managed under the dialog category. * For dialog instances, managed means the dialog is open. * * This function is specially provided for customized controls which doesn't have the possibility to check whether it's open. * If the given dialog is an instance of sap.m.Dialog, sap.m.ActionSheet, the isOpen() method on the instance is * preferred to be called than this function. * * @param {sap.ui.core.Control} oDialog The dialog that is checked for the openness. * @returns {boolean} Whether the given dialog is open. * @public */ InstanceManager.isDialogOpen = function(oDialog){ return InstanceManager.isInstanceManaged(sDialogCategoryId, oDialog); }; /** * Check if the given popover instance is managed under the popover category. * For popover instances, managed means the popover is open. * * This function is specially provided for customized controls which doesn't have the possibility to check whether it's open. * If the given popover is an instance of sap.m.Popover, sap.m.ActionSheet, the isOpen() method on the instance is * preferred to be called than this function. * * @param {sap.ui.core.Control} oPopover The popover that is checked for the openness. * @returns {boolean} Whether the given popover is open. * @public */ InstanceManager.isPopoverOpen = function(oPopover){ return InstanceManager.isInstanceManaged(sPopoverCategoryId, oPopover); }; /** * Check if the given LightBox instance is managed under the LightBox category. * For LightBox instances, 'managed' means the LightBox is open. * * This function is specially intended for controls that don't provide a way to check whether they're open. * If the given lightbox is an instance of sap.m.LightBox, its isOpen() should be called * instead of this function. * * @param {sap.m.LightBox} oLightBox The LightBox that is checked. * @returns {boolean} Whether the given popover is open. * @public */ InstanceManager.isLightBoxOpen = function(oLightBox){ return InstanceManager.isInstanceManaged(sLightBoxCategoryId, oLightBox); }; /** * Gets all of the open popovers. If there's no popover open, an empty array is returned. * * @returns {sap.ui.core.Control[]} The open popovers. * @public */ InstanceManager.getOpenPopovers = function(){ return InstanceManager.getInstancesByCategoryId(sPopoverCategoryId); }; /** * Gets all of the open dialogs. If there's no dialog open, an empty array is returned. * * @returns {sap.ui.core.Control[]} The open dialogs. * @public */ InstanceManager.getOpenDialogs = function(){ return InstanceManager.getInstancesByCategoryId(sDialogCategoryId); }; /** * Gets all of the open LightBoxes. If there's no dialog open, an empty array is returned. * * @returns {sap.m.LightBox[]} The opened LightBoxes. * @public */ InstanceManager.getOpenLightBoxes = function(){ return InstanceManager.getInstancesByCategoryId(sLightBoxCategoryId); }; /** * Closes all open popovers. * * @public * @returns {sap.m.InstanceManager} Enable method chaining. */ InstanceManager.closeAllPopovers = function(){ var aIntances = InstanceManager.getOpenPopovers(), i; for (i = 0 ; i < aIntances.length ; i++) { aIntances[i].close(); } return this; }; /** * Closes all of the open dialogs. * * @param {function} fnCallback * @public * @returns {sap.m.InstanceManager} Enable method chaining. */ InstanceManager.closeAllDialogs = function(fnCallback) { var oDeferred, aDeferred = [], aIntances = InstanceManager.getOpenDialogs(), dialog, i; for (i = 0 ; i < aIntances.length; i++) { dialog = aIntances[i]; if (fnCallback) { oDeferred = new jQuery.Deferred().done(); aDeferred.push(oDeferred); /*eslint-disable no-loop-func */ dialog.attachEvent("afterClose", (function(def){ return function() { def.resolve(); }; }(oDeferred))); /*eslint-enable no-loop-func */ } dialog.close(); } if (fnCallback) { jQuery.when.apply(this, aDeferred).then(fnCallback); } return this; }; /** * Closes all open lightboxes. * * @public * @returns {sap.m.InstanceManager} Enable method chaining. */ InstanceManager.closeAllLightBoxes = function(){ var aIntances = InstanceManager.getOpenLightBoxes(), iLength = aIntances.length, index; for (index = 0; index < iLength; index += 1) { aIntances[index].close(); } return this; }; return InstanceManager; }, /* bExport= */ true);