UNPKG

@openui5/sap.m

Version:

OpenUI5 UI Library sap.m

453 lines (386 loc) 13.3 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/ui/core/ControlBehavior", "./library", "sap/ui/Device", "sap/ui/core/InvisibleText", "sap/ui/core/InvisibleRenderer", "sap/ui/core/Configuration", "sap/ui/core/Lib"], function(ControlBehavior, library, Device, InvisibleText, InvisibleRenderer, Configuration, Library) { "use strict"; // shortcut for sap.m.ListType var ListItemType = library.ListType; // shortcut for sap.m.ListMode var ListMode = library.ListMode; /** * ListitemBase renderer. * * @namespace */ var ListItemBaseRenderer = { apiVersion: 2 }; ListItemBaseRenderer.renderInvisible = function(rm, oLI) { InvisibleRenderer.render(rm, oLI, oLI.TagName); }; /** * Renders the highlight state. * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI An object representation of the control that is rendered. * @protected */ ListItemBaseRenderer.renderHighlight = function(rm, oLI) { var sHighlight = oLI.getHighlight(); if (sHighlight == "None") { return; } rm.openStart("div"); rm.class("sapMLIBHighlight"); rm.class("sapMLIBHighlight" + sHighlight); rm.openEnd(); rm.close("div"); }; ListItemBaseRenderer.isModeMatched = function(sMode, iOrder) { var mOrderConfig = (sap.ui.require("sap/m/ListBaseRenderer") || {}).ModeOrder || {}; return mOrderConfig[sMode] == iOrder; }; /** * Renders the mode when item mode is in correct order * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI an object representation of the control that should be rendered. * @param {int} [iOrder] expected order for the rendering * @protected */ ListItemBaseRenderer.renderMode = function(rm, oLI, iOrder) { var sMode = oLI.getMode(); if (!this.isModeMatched(sMode, iOrder)) { return; } var oModeControl = oLI.getModeControl(true); if (oModeControl) { this.renderModeContent(rm, oLI, oModeControl); } }; ListItemBaseRenderer.renderModeContent = function(rm, oLI, oModeControl) { this.decorateMode(oModeControl, oLI); rm.renderControl(oModeControl); }; ListItemBaseRenderer.decorateMode = function(oModeControl, oLI) { // remove animation classes to avoid unexpected re-rendering behavior oModeControl.removeStyleClass("sapMLIBSelectAnimation sapMLIBUnselectAnimation"); // determine whether animation is necessary or not if (ControlBehavior.getAnimationMode() === Configuration.AnimationMode.none || !oLI.getListProperty("modeAnimationOn")) { return; } var sMode = oLI.getMode(), sLastListMode = oLI.getListProperty("lastMode"); // determine whether list mode is changed or not if (!sLastListMode || sLastListMode == sMode) { return; } if (sMode == ListMode.None) { oModeControl.addStyleClass("sapMLIBUnselectAnimation"); } else { oModeControl.addStyleClass("sapMLIBSelectAnimation"); } }; /** * Renders counter if it is not empty * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI An object representation of the control that is rendered. * @protected */ ListItemBaseRenderer.renderCounter = function(rm, oLI) { var iCounter = oLI.getCounter(); if (iCounter) { this.renderCounterContent(rm, oLI, iCounter); } }; ListItemBaseRenderer.renderCounterContent = function(rm, oLI, iCounter) { rm.openStart("div", oLI.getId() + "-counter"); rm.attr("aria-label", Library.getResourceBundleFor("sap.m").getText("LIST_ITEM_COUNTER", iCounter)); rm.class("sapMLIBCounter"); rm.openEnd(); rm.text(iCounter); rm.close("div"); }; /** * Renders type for the list item * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI an object representation of the control that should be rendered. * @protected */ ListItemBaseRenderer.renderType = function(rm, oLI) { var oTypeControl = oLI.getTypeControl(true); if (oTypeControl) { rm.renderControl(oTypeControl); } }; /** * Renders list item HTML starting tag * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI an object representation of the control that should be rendered. * @protected */ ListItemBaseRenderer.openItemTag = function(rm, oLI) { rm.openStart(oLI.TagName, oLI); }; /** * Renders list item HTML closing tag * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI an object representation of the control that should be rendered. * @protected */ ListItemBaseRenderer.closeItemTag = function(rm, oLI) { rm.close(oLI.TagName); }; ListItemBaseRenderer.renderTabIndex = function(rm, oLI) { rm.attr("tabindex", "-1"); }; ListItemBaseRenderer.renderTooltip = function(rm, oLI) { var sTooltip = oLI.getTooltip_AsString(); if (sTooltip) { rm.attr("title", sTooltip); } }; /** * Adds the classes needed to recognize the element as focusable. * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer * @param {sap.m.ListItemBase} [oLI] an object representation of the control that should be rendered * @protected */ ListItemBaseRenderer.addFocusableClasses = function(rm, oLI) { if (Device.system.desktop) { rm.class("sapMLIBFocusable"); this.addLegacyOutlineClass(rm, oLI); } }; /** * Adds the classes for legacy browsers, which do not support normal outlines. * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer * @param {sap.m.ListItemBase} [oLI] an object representation of the control that should be rendered * @protected */ ListItemBaseRenderer.addLegacyOutlineClass = function(rm, oLI) {}; /** * Creates an invisible aria node for the given message bundle text * in the static UIArea and returns its id for ARIA announcements * * This method should be used when text is reached frequently. * * @param {string} sKey key of the announcement * @param {string} [sBundleText] key of the announcement * @returns {string} id of the generated invisible aria node * @protected */ ListItemBaseRenderer.getAriaAnnouncement = function(sKey, sBundleText) { return InvisibleText.getStaticId("sap.m", sBundleText || "LIST_ITEM_" + sKey.toUpperCase()); }; /** * Returns aria accessibility role * * @param {sap.m.ListItemBase} oLI an object representation of the control * @returns {string} * @protected */ ListItemBaseRenderer.getAriaRole = function(oLI) { return "listitem"; }; /** * Returns the inner aria labelledby ids for the accessibility * * @param {sap.m.ListItemBase} oLI an object representation of the control * @returns {string|undefined} * @protected */ ListItemBaseRenderer.getAriaLabelledBy = function(oLI) { if (!oLI.getContentAnnouncement && oLI.getAriaLabelledBy().length) { return oLI.getId(); } }; /** * Returns the inner aria describedby ids for the accessibility * * @param {sap.m.ListItemBase} oLI an object representation of the control * @returns {string|undefined} * @protected */ ListItemBaseRenderer.getAriaDescribedBy = function(oLI) { if (oLI.getContentAnnouncement) { return ""; } var aDescribedBy = [], sType = oLI.getType(); if (oLI.getListProperty("showUnread") && oLI.getUnread()) { aDescribedBy.push(this.getAriaAnnouncement("unread")); } if (oLI.getMode() == ListMode.Delete) { aDescribedBy.push(this.getAriaAnnouncement("delete")); } if (sType == ListItemType.Navigation) { aDescribedBy.push(this.getAriaAnnouncement("navigation")); } else { if (sType == ListItemType.Detail || sType == ListItemType.DetailAndActive) { aDescribedBy.push(this.getAriaAnnouncement("detail")); } if (sType == ListItemType.Active || sType == ListItemType.DetailAndActive) { aDescribedBy.push(this.getAriaAnnouncement("active")); } } return aDescribedBy.join(" "); }; /** * Returns the accessibility state of the control * * @param {sap.m.ListItemBase} oLI an object representation of the control * @protected */ ListItemBaseRenderer.getAccessibilityState = function(oLI) { var sAriaLabelledBy = this.getAriaLabelledBy(oLI), sAriaDescribedBy = this.getAriaDescribedBy(oLI), sRole = this.getAriaRole(oLI), mAccessibilityState = { role: sRole }; if (sAriaLabelledBy) { mAccessibilityState.labelledby = { value: sAriaLabelledBy.trim(), append: true }; } if (sAriaDescribedBy) { mAccessibilityState.describedby = { value: sAriaDescribedBy.trim(), append: true }; } if (oLI.getNavigated()) { mAccessibilityState.current = true; } if (sRole === "listitem") { mAccessibilityState.selected = null; if (oLI.isGroupHeader()) { mAccessibilityState.role = "group"; mAccessibilityState.roledescription = oLI.getAccessibilityType(Library.getResourceBundleFor("sap.m")); var aGroupedItems = oLI.getGroupedItems(); if (aGroupedItems && aGroupedItems.length) { mAccessibilityState.owns = aGroupedItems.join(" "); } } } else if (oLI.isSelectable()) { mAccessibilityState.selected = oLI.getSelected(); } return mAccessibilityState; }; /** * Hook for rendering list item contents * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI an object representation of the control that should be rendered. * @protected */ ListItemBaseRenderer.renderLIContent = function(rm, oLI) { }; /** * Hook for changing list item attributes * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI an object representation of the control that should be rendered. * @protected */ ListItemBaseRenderer.renderLIAttributes = function(rm, oLI) { }; /** * Renders the former part of the item. * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI An object representation of the control that is rendered. * @protected */ ListItemBaseRenderer.renderContentFormer = function(rm, oLI) { this.renderHighlight(rm, oLI); this.renderMode(rm, oLI, -1); }; /** * Renders the latter part of the item. * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI An object representation of the control that is rendered. * @protected */ ListItemBaseRenderer.renderContentLatter = function(rm, oLI) { this.renderCounter(rm, oLI); this.renderType(rm, oLI); this.renderMode(rm, oLI, 1); this.renderNavigated(rm, oLI); }; ListItemBaseRenderer.renderLIContentWrapper = function(rm, oLI) { rm.openStart("div", oLI.getId() + "-content").class("sapMLIBContent").openEnd(); this.renderLIContent(rm, oLI); rm.close("div"); }; ListItemBaseRenderer.renderNavigated = function(rm, oLI) { if (!oLI.getNavigated()) { return; } rm.openStart("div"); rm.class("sapMLIBNavigated"); rm.openEnd(); rm.close("div"); }; /** * Renders the HTML for the given control, using the provided. * * {@link sap.ui.core.RenderManager}. * * @param {sap.ui.core.RenderManager} rm The RenderManager that can be used for writing to the Render-Output-Buffer. * @param {sap.m.ListItemBase} oLI an object representation of the control that should be rendered. * @public */ ListItemBaseRenderer.render = function(rm, oLI) { // render invisible placeholder if (!oLI.getVisible()) { this.renderInvisible(rm, oLI); return false; } // start this.openItemTag(rm, oLI); // classes rm.class("sapMLIB"); rm.class("sapMLIB-CTX"); rm.class("sapMLIBShowSeparator"); rm.class("sapMLIBType" + oLI.getType()); if (oLI.isActionable(true)) { rm.class("sapMLIBActionable"); rm.class("sapMLIBHoverable"); } if (oLI.getSelected()) { rm.class("sapMLIBSelected"); } if (oLI.getListProperty("showUnread") && oLI.getUnread()) { rm.class("sapMLIBUnread"); } this.addFocusableClasses(rm, oLI); // attributes this.renderTooltip(rm, oLI); this.renderTabIndex(rm, oLI); // handle accessibility states if (ControlBehavior.isAccessibilityEnabled()) { rm.accessibilityState(oLI, this.getAccessibilityState(oLI)); } // item attributes hook this.renderLIAttributes(rm, oLI); rm.openEnd(); this.renderContentFormer(rm, oLI); this.renderLIContentWrapper(rm, oLI); this.renderContentLatter(rm, oLI); this.closeItemTag(rm, oLI); }; return ListItemBaseRenderer; }, /* bExport= */ true);