UNPKG

@openui5/sap.m

Version:

OpenUI5 UI Library sap.m

159 lines (138 loc) 4.66 kB
/* * OpenUI5 * (c) Copyright 2026 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ sap.ui.define([ "sap/ui/core/Element", "./PluginBase", "../library", "sap/ui/base/ManagedObjectObserver" ], function( Element, PluginBase, library, ManagedObjectObserver ) { "use strict"; const ContextMenuScope = library.plugins.ContextMenuScope; /** * Constructs an instance of sap.m.plugins.ContextMenuSetting * * @class Provides configuration options and an extended behavior for the context menu that is applied to the related control. * @extends sap.ui.core.Element * @author SAP SE * @version 1.146.0 * @public * @since 1.121 * @alias sap.m.plugins.ContextMenuSetting * @borrows sap.m.plugins.PluginBase.findOn as findOn */ const ContextMenuSetting = PluginBase.extend("sap.m.plugins.ContextMenuSetting", {metadata: { library: "sap.m", properties: { /** * Defines the scope of the context menu actions. * * The scope of the context menu is visually represented to the user by providing a clear indication of the affected items. * The visual cues help users understand the potential impact of their actions. * * <b>Note:</b> The scope visualization is only supported if a <code>sap.m.Menu</code> is used as context menu. */ scope: {type: "sap.m.plugins.ContextMenuScope", group: "Behavior", defaultValue: ContextMenuScope.Default} }, events: {} }}); ContextMenuSetting.findOn = PluginBase.findOn; ContextMenuSetting.prototype.init = function(oControl) { this._oObserver = new ManagedObjectObserver(this._observeChanges.bind(this)); }; ContextMenuSetting.prototype.exit = function() { PluginBase.prototype.exit.call(this); this._oObserver.destroy(); this._oObserver = null; }; ContextMenuSetting.prototype._observeChanges = function(mChange) { if (mChange.mutation == "insert") { this._monkeypatch(mChange.child); } else { this._cleanupMonkeypatch(mChange.child); } }; /** * Overrides the original openAsContextMenu * * @param {sap.ui.core.IContextMenu} oMenu Context Menu. */ ContextMenuSetting.prototype._monkeypatch = function(oMenu) { if (!oMenu || !oMenu.isA("sap.m.Menu")) { return; } const that = this; this._original_openAsContextMenu = oMenu.openAsContextMenu; oMenu.openAsContextMenu = function(oEvent, vActiveItem) { const oRetVal = that._original_openAsContextMenu.apply(this, arguments); if (that.getScope() !== ContextMenuScope.Selection) { return oRetVal; } const oControl = that.getControl(); const aItems = that.getConfig("items", oControl); if (vActiveItem instanceof HTMLElement) { vActiveItem = Element.closestTo(vActiveItem, true); } const bActiveItemSelected = that.getConfig("isItemSelected", oControl, vActiveItem); aItems.forEach((oItem) => { const bItemSelected = that.getConfig("isItemSelected", oControl, oItem); if (oItem !== vActiveItem && !(bActiveItemSelected && bItemSelected)) { oItem.addStyleClass("sapMContextMenuSettingContentOpacity"); } }); this.attachEventOnce("closed", () => { aItems.forEach((oItem) => { oItem.removeStyleClass("sapMContextMenuSettingContentOpacity"); }); }); return oRetVal; }; }; ContextMenuSetting.prototype._cleanupMonkeypatch = function(oMenu) { if (oMenu && this._original_openAsContextMenu) { oMenu.openAsContextMenu = this._original_openAsContextMenu; this._original_openAsContextMenu = null; } }; ContextMenuSetting.prototype.onActivate = function(oControl) { const sAggr = this.getConfig("contextMenuAggregation"); this._monkeypatch(oControl.getAggregation(sAggr)); this._oObserver.observe(oControl, {aggregations: [sAggr]}); }; ContextMenuSetting.prototype.onDeactivate = function(oControl) { const sAggr = this.getConfig("contextMenuAggregation"); this._cleanupMonkeypatch(oControl.getAggregation(sAggr)); this._oObserver?.unobserve(oControl, {aggregations: [sAggr]}); }; /** * Plugin-specific control configurations. */ PluginBase.setConfigs({ "sap.m.ListBase": { items: function(oList) { return oList.getItems(); }, isItemSelected: function(oTable, oItem) { return oItem.getSelected(); }, contextMenuAggregation: "contextMenu" }, "sap.ui.table.Table": { items: function(oTable) { return oTable.getRows(); }, isItemSelected: function(oTable, oItem) { return oTable._getSelectionPlugin().isSelected(oItem); }, contextMenuAggregation: "contextMenu" } }, ContextMenuSetting); return ContextMenuSetting; });