UNPKG

@openui5/sap.m

Version:

OpenUI5 UI Library sap.m

223 lines (187 loc) 9.43 kB
/*! * UI development toolkit for HTML5 (OpenUI5) * (c) Copyright 2009-2022 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ sap.ui.define(["sap/ui/fl/Utils", "sap/base/util/uid", 'sap/ui/base/ManagedObjectObserver', 'sap/ui/base/ManagedObject'], function(FlexUtils, uid, ManagedObjectObserver, ManagedObject) { "use strict"; /** * Change handler for combining sap.m.Button(s) in a sap.m.MenuButton inside sap.m.Bar * * @alias sap.m.changeHandler.CombineButtons * @author SAP SE * @version 1.60.39 * @experimental Since 1.48 */ var CombineButtons = { }; /** * Combines sap.m.Button(s) in a sap.m.MenuButton * * @param {sap.ui.fl.Change} oChange Change wrapper object with instructions to be applied on the control map * @param {sap.m.Bar} oControl Containing the buttons * @param {object} mPropertyBag Map of properties * @param {object} mPropertyBag.modifier Modifier for the controls * @return {boolean} true if change could be applied * * @public */ CombineButtons.applyChange = function(oChange, oControl, mPropertyBag) { if (mPropertyBag.modifier.targets !== "jsControlTree") { throw new Error("Combine buttons change can't be applied on XML tree"); } var oChangeDefinition = oChange.getDefinition(), oModifier = mPropertyBag.modifier, oView = FlexUtils.getViewForControl(oControl), oSourceControl = oModifier.bySelector(oChangeDefinition.content.combineButtonSelectors[0], mPropertyBag.appComponent), oAppComponent = mPropertyBag.appComponent, oParent = oModifier.getParent(oSourceControl), iAggregationIndex, sParentAggregation, aButtons, bIsRtl = sap.ui.getCore().getConfiguration().getRTL(), oMenu, oMenuButton, aMenuButtonName = [], oRevertData = { menuButtonId: "", parentAggregation: "", insertIndex: 0 }; aButtons = oChangeDefinition.content.combineButtonSelectors.map(function (oCombineButtonSelector) { return oModifier.bySelector(oCombineButtonSelector, oAppComponent); }); sParentAggregation = aButtons[0].sParentAggregationName; oRevertData.parentAggregation = sParentAggregation; iAggregationIndex = oModifier.findIndexInParentAggregation(oSourceControl); oRevertData.insertIndex = iAggregationIndex; oMenu = oModifier.createControl("sap.m.Menu", mPropertyBag.appComponent, oView, oChangeDefinition.content.menuIdSelector); aButtons.forEach(function (oButton, index) { var oIdToSave, oMenuItem, oBindingInfo = oButton.getBindingInfo("enabled"), aCustomData = oButton.getAggregation("customData"), oSelector = oChangeDefinition.content.buttonsIdForSave[index], sButtonText = oModifier.getProperty(oButton, "text"); oMenuItem = oModifier.createControl("sap.m.MenuItem", mPropertyBag.appComponent, oView, oSelector); oModifier.setProperty(oMenuItem, "text", oButton.mProperties.text); oModifier.setProperty(oMenuItem, "icon", oButton.mProperties.icon); oModifier.setProperty(oMenuItem, "enabled", oButton.mProperties.enabled); oMenuItem.attachPress(function(oEvent) { return oButton.firePress(oEvent); }); oButton.getAggregation = function (sAggregationName, oDefaultForCreation) { if (sAggregationName === "customData") { var oCustomData = ManagedObject.prototype.getAggregation.call(oButton, "customData"), oMenuItemCustomData = oMenuItem ? ManagedObject.prototype.getAggregation.call(oMenuItem, "customData") : []; // in case oMenuItemCustomData is null return empty object oMenuItemCustomData = (oMenuItemCustomData) ? oMenuItemCustomData : []; return (oCustomData && oCustomData.length) ? oCustomData : oMenuItemCustomData; } else { return ManagedObject.prototype.getAggregation.apply(this, arguments); } }; // observe the Button enabled property so in case it is changed the new value should be applied to the MenuItem also new ManagedObjectObserver(function (oChanges) { oModifier.setProperty(oMenuItem, "enabled", oChanges.current); if (oBindingInfo) { oMenuItem.bindProperty("enabled", oBindingInfo); } }).observe(oButton, { properties: ["enabled"] }); if (oBindingInfo) { oMenuItem.bindProperty("enabled", oBindingInfo); } if (sButtonText) { bIsRtl ? aMenuButtonName.unshift(sButtonText) : aMenuButtonName.push(sButtonText); } // add suffix to the id, so we can get the original ids of the combined buttons // when we want to split the menu // the suffix is used in SplitMenuButton file oSelector.id = oSelector.id + "-originalButtonId"; // create CustomData, holding the original ids of the combined buttons oIdToSave = oModifier.createControl("sap.ui.core.CustomData", mPropertyBag.appComponent, oView, oSelector); oModifier.setProperty(oIdToSave, "key", "originalButtonId"); oModifier.setProperty(oIdToSave, "value", oModifier.getId(oButton)); if (aCustomData && aCustomData.length > 0) { aCustomData.forEach(function (oCustomData, index) { oModifier.insertAggregation(oMenuItem, "customData", oCustomData, index); }); } oModifier.removeAggregation(oParent, sParentAggregation, oButton); // adding each button control to the menuItem's dependents aggregation // this way we can save all relevant information it may have oModifier.insertAggregation(oMenuItem, "dependents", oButton); oModifier.insertAggregation(oMenuItem, "customData", oIdToSave, 0); oModifier.insertAggregation(oMenu, "items", oMenuItem, index); }); oMenuButton = oModifier.createControl("sap.m.MenuButton", mPropertyBag.appComponent, oView, oChangeDefinition.content.menuButtonIdSelector); oRevertData.menuButtonId = oModifier.getId(oMenuButton); oModifier.setProperty(oMenuButton, "text", aMenuButtonName.join("/")); oModifier.insertAggregation(oMenuButton, "menu", oMenu, 0); oModifier.insertAggregation(oParent, sParentAggregation, oMenuButton, iAggregationIndex); oChange.setRevertData(oRevertData); return true; }; /** * Reverts applied change * * @param {sap.ui.fl.Change} oChange change wrapper object with instructions to be applied on the control map * @param {sap.m.IBar} oControl Bar - Bar that matches the change selector for applying the change * @param {object} mPropertyBag - Property bag containing the modifier and the view * @param {object} mPropertyBag.modifier - modifier for the controls * @param {object} mPropertyBag.view - application view * @return {boolean} True if successful * @public */ CombineButtons.revertChange = function(oChange, oControl, mPropertyBag) { var oModifier = mPropertyBag.modifier, oRevertData = oChange.getRevertData(), oChangeDefinition = oChange.getDefinition(), sParentAggregation = oRevertData.parentAggregation, iAggregationIndex = oRevertData.insertIndex, oMenuButton = oModifier.bySelector(oRevertData.menuButtonId, mPropertyBag.appComponent), oParent = oModifier.getParent(oMenuButton), aButtonsIds = oChangeDefinition.content.combineButtonSelectors; for (var i = 0; i < aButtonsIds.length; i++) { var oButton = oModifier.bySelector(aButtonsIds[i], mPropertyBag.appComponent); oModifier.insertAggregation(oParent, sParentAggregation, oButton, iAggregationIndex + i); } oModifier.removeAggregation(oParent, sParentAggregation, oMenuButton); oMenuButton.destroy(); oChange.resetRevertData(); return true; }; /** * Completes the change by adding change handler specific content * * @param {sap.ui.fl.Change} oChange Change wrapper object to be completed * @param {object} oSpecificChangeInfo Specific info object * @param {object} oSpecificChangeInfo.combineFieldIds Ids of selected buttons * to be combined * @param {object} mPropertyBag Map of properties * @param {object} mPropertyBag.modifier Modifier for the controls * * @public */ CombineButtons.completeChangeContent = function(oChange, oSpecificChangeInfo, mPropertyBag) { var oModifier = mPropertyBag.modifier, oAppComponent = mPropertyBag.appComponent, oChangeDefinition = oChange.getDefinition(), aCombineButtonIds = oSpecificChangeInfo.combineFieldIds; if (aCombineButtonIds && aCombineButtonIds.length >= 2) { oChange.addDependentControl(aCombineButtonIds, "combinedButtons", mPropertyBag); oChangeDefinition.content.combineButtonSelectors = aCombineButtonIds.map(function(sCombineButtonId) { return oModifier.getSelector(sCombineButtonId, oAppComponent); }); // generate ids for Menu and MenuButton oChangeDefinition.content.menuButtonIdSelector = oModifier.getSelector(oAppComponent.createId(uid()), oAppComponent); oChangeDefinition.content.menuIdSelector = oModifier.getSelector(oAppComponent.createId(uid()), oAppComponent); // generate id for menu button items oChangeDefinition.content.buttonsIdForSave = aCombineButtonIds.map(function() { return oModifier.getSelector(oAppComponent.createId(uid()), oAppComponent); }); } else { throw new Error("Combine buttons action cannot be completed: oSpecificChangeInfo.combineFieldIds attribute required"); } }; return CombineButtons; }, /* bExport= */true);