@openui5/sap.m
Version:
OpenUI5 UI Library sap.m
210 lines (172 loc) • 6.07 kB
JavaScript
/*!
* 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([
'./FlexBoxStylingHelper',
'sap/m/library',
"sap/base/security/encodeXML",
"sap/base/Log"
],
function(FlexBoxStylingHelper, library, encodeXML, Log) {
"use strict";
// shortcut for sap.m.FlexDirection
var FlexDirection = library.FlexDirection;
// shortcut for sap.m.FlexRendertype
var FlexRendertype = library.FlexRendertype;
/**
* FlexBox renderer
* @namespace
*/
var FlexBoxRenderer = {};
/**
* Renders the HTML for the given control, using the provided {@link sap.ui.core.RenderManager}.
*
* @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
*/
FlexBoxRenderer.render = function(oRm, oControl) {
// Open FlexBox HTML element
if (oControl.getRenderType() === FlexRendertype.List) {
oRm.write('<ul');
} else {
oRm.write('<div');
}
oRm.writeControlData(oControl);
// Special treatment if FlexBox is itself an item of a parent FlexBox
var oParent = oControl.getParent();
if (oParent && oParent.isA("sap.m.FlexBox")) {
oRm.addClass("sapMFlexItem");
// Set layout properties for flex item
var oLayoutData = oControl.getLayoutData();
if (oLayoutData instanceof sap.m.FlexItemData) {
FlexBoxStylingHelper.setFlexItemStyles(oRm, oLayoutData);
}
// Wrap in list item
if (oParent.getRenderType() === FlexRendertype.List) {
oRm.write('<li');
}
} else if (oControl.getFitContainer()) {
oRm.addClass("sapMFlexBoxFit");
}
// Add classes for flex styling
oRm.addClass("sapMFlexBox");
if (oControl.getDisplayInline()) {
oRm.addClass("sapMFlexBoxInline");
}
if (oControl.getDirection() === FlexDirection.Column || oControl.getDirection() === FlexDirection.ColumnReverse) {
oRm.addClass("sapMVBox");
} else {
oRm.addClass("sapMHBox");
}
if (oControl.getDirection() === FlexDirection.RowReverse || oControl.getDirection() === FlexDirection.ColumnReverse) {
oRm.addClass("sapMFlexBoxReverse");
}
oRm.addClass("sapMFlexBoxJustify" + oControl.getJustifyContent());
oRm.addClass("sapMFlexBoxAlignItems" + oControl.getAlignItems());
oRm.addClass("sapMFlexBoxWrap" + oControl.getWrap());
oRm.addClass("sapMFlexBoxAlignContent" + oControl.getAlignContent());
oRm.addClass("sapMFlexBoxBG" + oControl.getBackgroundDesign());
oRm.writeClasses();
// Add inline styles
if (oControl.getHeight()) {
oRm.addStyle("height", oControl.getHeight());
}
if (oControl.getWidth()) {
oRm.addStyle("width", oControl.getWidth());
}
oRm.writeStyles();
// Add tooltip
var sTooltip = oControl.getTooltip_AsString();
if (sTooltip) {
oRm.writeAttributeEscaped("title", sTooltip);
}
// Close opening tag
oRm.write(">");
// Render the flex items
FlexBoxRenderer.renderItems(oControl, oRm);
// Close FlexBox HTML element
if (oControl.getRenderType() === FlexRendertype.List) {
oRm.write("</ul>");
} else {
oRm.write("</div>");
}
};
FlexBoxRenderer.renderItems = function(oControl, oRm) {
var aChildren = oControl.getItems(),
sWrapperTag = '';
for (var i = 0; i < aChildren.length; i++) {
// Don't wrap if it's a FlexBox control
if (aChildren[i].isA('sap.m.FlexBox') || oControl.getRenderType() === FlexRendertype.Bare) {
sWrapperTag = "";
} else if (oControl.getRenderType() === FlexRendertype.List) {
sWrapperTag = "li";
} else {
sWrapperTag = "div";
}
FlexBoxRenderer.renderItem(aChildren[i], sWrapperTag, oRm);
}
};
FlexBoxRenderer.renderItem = function(oItem, sWrapperTag, oRm) {
if (sWrapperTag) {
// Open wrapper
oRm.write('<' + sWrapperTag);
// ScrollContainer needs height:100% on the flex item
if (oItem instanceof sap.m.ScrollContainer) {
oRm.addClass("sapMFlexBoxScroll");
}
// Hide invisible items, but leave them in the DOM
if (!oItem.getVisible()) {
oRm.addClass("sapUiHiddenPlaceholder");
}
}
// Set layout properties
var oLayoutData = oItem.getLayoutData();
// If no layout data is set, create it so that an ID can be set on the wrapper
if (sWrapperTag && !oLayoutData) {
oItem.setAggregation("layoutData", new sap.m.FlexItemData(), true);
oLayoutData = oItem.getLayoutData();
}
if (!(oLayoutData instanceof sap.m.FlexItemData)) {
Log.warning(oLayoutData + " set on " + oItem + " is not of type sap.m.FlexItemData");
} else {
// FlexItemData is an element not a control, so we need to write id and style class ourselves if a wrapper tag is used
if (sWrapperTag && oLayoutData.getId()) {
oRm.writeAttributeEscaped("id", oLayoutData.getId());
}
// Add style class set by app
if (oLayoutData.getStyleClass()) {
FlexBoxRenderer.addItemClass(encodeXML(oLayoutData.getStyleClass()), oItem, sWrapperTag, oRm);
}
// Add classes relevant for flex item
FlexBoxRenderer.addItemClass("sapMFlexItemAlign" + oLayoutData.getAlignSelf(), oItem, sWrapperTag, oRm);
FlexBoxRenderer.addItemClass("sapMFlexBoxBG" + oLayoutData.getBackgroundDesign(), oItem, sWrapperTag, oRm);
// Set layout properties for flex item
if (sWrapperTag) {
FlexBoxStylingHelper.setFlexItemStyles(oRm, oLayoutData);
}
}
FlexBoxRenderer.addItemClass("sapMFlexItem", oItem, sWrapperTag, oRm);
// Write the styles and classes and close the wrapper tag
if (sWrapperTag) {
oRm.writeStyles();
oRm.writeClasses();
oRm.write(">");
}
// Render control
oRm.renderControl(oItem);
if (sWrapperTag) {
// Close wrapper
oRm.write('</' + sWrapperTag + '>');
}
};
FlexBoxRenderer.addItemClass = function(sClass, oItem, sWrapperTag, oRm) {
if (sWrapperTag) {
oRm.addClass(sClass);
} else {
oItem.addStyleClass(sClass);
}
};
return FlexBoxRenderer;
}, /* bExport= */ true);