UNPKG

@openui5/sap.m

Version:

OpenUI5 UI Library sap.m

322 lines (266 loc) 8.26 kB
/*! * OpenUI5 * (c) Copyright 2009-2023 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ // Provides helper sap.m.BarInPageEnabler sap.ui.define(['sap/ui/base/Object', 'sap/m/library', "sap/base/Log"], function(Object, library, Log) { "use strict"; // shortcut for sap.m.IBarHTMLTag var IBarHTMLTag = library.IBarHTMLTag; var mContexts = { footer : { contextClass : "sapMFooter-CTX sapContrast sapContrastPlus", tag : "Footer", internalAriaLabel: "BAR_ARIA_DESCRIPTION_FOOTER" }, header : { contextClass : "sapMHeader-CTX", tag : "Header", internalAriaLabel: "BAR_ARIA_DESCRIPTION_HEADER" }, subheader : { contextClass : "sapMSubHeader-CTX", tag : "Header", internalAriaLabel: "BAR_ARIA_DESCRIPTION_SUBHEADER" } }; var IBAR_CSS_CLASS = "sapMIBar"; /** * @class Helper Class for implementing the IBar interface. Should be created once per IBar instance. * @version 1.22 * @protected * @alias sap.m.BarInPageEnabler */ var BarInPageEnabler = Object.extend("sap.m.BarInPageEnabler", /** @lends sap.m.BarInPageEnabler.prototype */ { /** * Determines whether the bar is sensitive to the container context. * * Implementation of the IBar interface. * @returns {boolean} isContextSensitive * @protected */ isContextSensitive : function() { return this.getDesign && this.getDesign() === "Auto"; }, /** * Sets the HTML tag of the root element. * @param {string} sNewTag The new root element * @returns {sap.m.IBar} <code>this</code> to allow method chaining * @protected */ setHTMLTag : function (sNewTag) { if (sNewTag === this.sTag) { return this; } this.sTag = sNewTag; return this; }, /** * Gets the HTML tag of the root domref. * @returns {string} the HTML-tag * @protected */ getHTMLTag : function () { if (!this.hasOwnProperty("sTag")) { //Div is the default this.sTag = IBarHTMLTag.Div; } return this.sTag; }, /** * @typedef {object} sap.m.BarContexts * @description The object contains the Bar contexts inside page. * @property {sap.m.BarContext} [footer] * @property {sap.m.BarContext} [header] * @property {sap.m.BarContext} [subheader] * @protected */ /** * @typedef {object} sap.m.BarContext * @description The object contains the available parameters for Bar`s context (footer, header or subheader). * @property {string} [contextClass] * @property {string} [internalAriaLabel] * @property {string} [tag] * @protected */ /** * * @returns {sap.m.BarContexts} with all available contexts. * @protected */ getContext : function () { return mContexts; }, /** * Gets accessibility role of the Root HTML element. * * @returns {string} Accessibility role * @private */ _getRootAccessibilityRole: function () { var sRootAccessibilityRole = this._sRootAccessibilityRole || "toolbar"; return sRootAccessibilityRole; }, /** * Sets accessibility role of the Root HTML element. * * @param {string} sRole AccessibilityRole of the root Element * @returns {sap.m.IBar} <code>this</code> to allow method chaining * @private */ _setRootAccessibilityRole: function (sRole) { this._sRootAccessibilityRole = sRole; return this; }, /** * Gets accessibility aria-level attribute of the Root HTML element. * * This is only needed if <code>sap.m.Bar</code> has role="heading" * @returns {string} aria-level attribute * @private */ _getRootAriaLevel: function () { var sAriaLevel = this.sAriaLevel; return sAriaLevel; }, /** * Sets accessibility aria-level attribute of the Root HTML element. * * This is only needed if <code>sap.m.Bar</code> has role="heading" * @param {string} sLevel aria-level attribute of the root Element * @returns {sap.m.IBar} <code>this</code> to allow method chaining * @private */ _setRootAriaLevel: function (sLevel) { this.sAriaLevel = sLevel; return this; }, /** * Sets classes and HTML tag according to the context of the page. * * Possible contexts are header, footer, subheader. * @param {string} sContext allowed values are header, footer, subheader. * @returns {sap.m.IBar} <code>this</code> for chaining * @protected */ applyTagAndContextClassFor : function (sContext) { this._applyTag(sContext); return this._applyContextClassFor(sContext); }, /** * Sets classes according to the context of the page. * * Possible contexts are header, footer, subheader. * @param {string} sContext allowed values are header, footer, subheader. * @returns {sap.m.IBar} <code>this</code> for chaining * @private * @ui5-restricted */ _applyContextClassFor : function (sContext) { var oOptions = this._getContextOptions(sContext); if (!oOptions) { return this; } if (!this.isContextSensitive) { Log.error("The bar control you are using does not implement all the members of the IBar interface", this); return this; } //If this class does not gets added by the renderer, add it here if (!this.getRenderer().shouldAddIBarContext()) { this.addStyleClass(IBAR_CSS_CLASS + "-CTX"); } if (this.isContextSensitive()) { this.addStyleClass(oOptions.contextClass); } return this; }, /** * Sets HTML tag according to the context of the page. * * Possible contexts are header, footer, subheader. * @param {string} sContext allowed values are header, footer, subheader. * @returns {sap.m.IBar} <code>this</code> for chaining * @private * @ui5-restricted */ _applyTag : function (sContext) { var oOptions = this._getContextOptions(sContext); if (!oOptions) { return this; } if (!this.setHTMLTag) { Log.error("The bar control you are using does not implement all the members of the IBar interface", this); return this; } this.setHTMLTag(oOptions.tag); return this; }, /** * Get context options of the Page. * * Possible contexts are header, footer, subheader. * @param {string} sContext allowed values are header, footer, subheader. * @returns {object|null} * @private */ _getContextOptions : function (sContext) { var oContext; if (this.getContext) { oContext = this.getContext(); } else { oContext = mContexts; } var oOptions = oContext[sContext]; if (!oOptions) { Log.error("The context " + sContext + " is not known", this); return null; } return oOptions; }, //Rendering /** * Renders the HTML for the given control, using the provided {@link sap.ui.core.RenderManager}. * @protected * @param {sap.ui.core.RenderManager} oRM the RenderManager that can be used for writing to the render output buffer. * @param {sap.ui.core.Control} oControl an object representation of the control that should be rendered. */ render : function(oRM, oControl) { var sTag = oControl.getHTMLTag().toLowerCase(); oRM.openStart(sTag, oControl); oRM.class(IBAR_CSS_CLASS); if (this.shouldAddIBarContext(oControl)) { oRM.class(IBAR_CSS_CLASS + "-CTX"); } // call the hooks BarInPageEnabler.renderTooltip(oRM, oControl); this.decorateRootElement(oRM, oControl); oRM.openEnd(); this.renderBarContent(oRM, oControl); oRM.close(sTag); } }); /** * Renders the tooltip for the given control * @protected * @param {sap.ui.core.RenderManager} oRM the RenderManager that can be used for writing to the render output buffer. * @param {sap.ui.core.Control} oControl an object representation of the control that should be rendered. */ BarInPageEnabler.renderTooltip = function(oRM, oControl) { var sTooltip = oControl.getTooltip_AsString(); if (sTooltip) { oRM.attr("title", sTooltip); } }; /** * Adds the sapMBarChildClass to a control. * @param {sap.ui.core.Control} oControl The sap.ui.core.Control to which the sapMBarChildClass will be added * @protected * @static */ BarInPageEnabler.addChildClassTo = function (oControl) { oControl.addStyleClass("sapMBarChild"); }; return BarInPageEnabler; });