@openui5/sap.m
Version:
OpenUI5 UI Library sap.m
199 lines (169 loc) • 4.88 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(["sap/ui/core/Renderer", "sap/m/ListItemBaseRenderer"], function(Renderer, ListItemBaseRenderer) {
"use strict";
var TAG_WHITELIST = {
"svg": {
attributes: ["width", "height", "focusable", "preserveAspectRatio"]
},
"path": {
attributes: ["d", "fill", "transform", "stroke", "stroke-width"]
},
"line": {
attributes: ["x1", "x2", "y1", "y2", "stroke-width", "stroke", "stroke-dasharray", "stroke-linecap"]
}
},
bIsDOMParserSupported;
try {
var oParser = new DOMParser();
bIsDOMParserSupported = oParser.parseFromString("<svg />", "text/html") !== null;
} catch (ex) {
bIsDOMParserSupported = false;
}
var fnParseSvgString;
// Most browsers support DOMParser for text/html. Sadly our voter job uses phantomjs. This is a fix for phantomjs.
if (bIsDOMParserSupported) {
fnParseSvgString = function (sString) {
var oParser = new DOMParser(),
oDocument = oParser.parseFromString(sString, "text/html");
return oDocument.body.childNodes;
};
} else {
fnParseSvgString = function (sString) {
var oDocument = document.implementation.createHTMLDocument("");
oDocument.body.innerHTML = sString;
return oDocument.body.childNodes;
};
}
function every(aDomArray, fnCallback) {
var i;
if (!aDomArray) {
return true;
}
for (i = 0; i < aDomArray.length; i++) {
if (!fnCallback(aDomArray[i])) {
return false;
}
}
return true;
}
function isValidSvgNode(oNode) {
if (oNode.nodeType !== window.Node.ELEMENT_NODE) {
return true;
}
var sTagName = oNode.tagName.toLowerCase(),
oTag = TAG_WHITELIST[sTagName],
bTagsValid;
if (!oTag) {
return false;
}
bTagsValid = every(oNode.attributes, function (attribute) {
if (attribute.value === "") {
return true;
}
var sAttributeName = attribute.name.toLowerCase();
return oTag.attributes.indexOf(sAttributeName) >= 0;
});
if (!bTagsValid) {
return false;
}
if (!oTag.allowTextContenet && oNode.textContent.trim().length > 0) {
return false;
}
return every(oNode.childNodes, isValidSvgNode);
}
/**
* SelectionDetailsItemRenderer renderer.
* @namespace
*/
var SelectionDetailsListItemRenderer = Renderer.extend(ListItemBaseRenderer);
SelectionDetailsListItemRenderer.renderLIAttributes = function(oRm, oControl) {
oRm.addClass("sapMSDItem");
oRm.writeClasses();
};
SelectionDetailsListItemRenderer.renderLIContent = function(oRm, oControl) {
var aLines = oControl._getParentElement().getLines();
oRm.write("<div");
oRm.addClass("sapMSDItemLines");
oRm.writeClasses();
oRm.write(">");
for (var i = 0; i < aLines.length; i++) {
this.renderLine(oRm, oControl, aLines[i]);
}
oRm.write("</div>");
ListItemBaseRenderer.renderType(oRm, oControl);
};
SelectionDetailsListItemRenderer._isValidSvg = function (data) {
try {
var aNodes = fnParseSvgString(data);
if (aNodes.length === 0) {
return false;
}
return every(aNodes, isValidSvgNode);
} catch (ex) {
return false;
}
};
SelectionDetailsListItemRenderer.renderLine = function(oRm, oControl, line) {
var sUnit = line.getUnit().trim(),
sValue = line._getValueToRender(),
sDisplayValue = line.getDisplayValue(),
sLineMarker = line.getLineMarker();
oRm.write("<div");
oRm.addClass("sapMSDItemLine");
oRm.writeClasses();
oRm.write(">");
oRm.write("<div");
oRm.addClass("sapMSDItemLineMarkerContainer");
oRm.writeClasses();
oRm.write(">");
if (sLineMarker && SelectionDetailsListItemRenderer._isValidSvg(sLineMarker)) {
oRm.write(sLineMarker);
}
oRm.write("</div>");
oRm.write("<div");
oRm.addClass("sapMSDItemLineLabel");
oRm.writeClasses();
oRm.write(">");
oRm.writeEscaped(line.getLabel());
oRm.write("</div>");
oRm.write("<div");
oRm.addClass("sapMSDItemLineValue");
if (sUnit) {
oRm.addClass("sapMSDItemLineBold");
}
oRm.writeClasses();
oRm.write(">");
if (sDisplayValue) {
oRm.writeEscaped(sDisplayValue);
} else {
oRm.writeEscaped(sValue);
}
if (sUnit) {
oRm.write("<span");
oRm.addClass("sapMSDItemLineUnit");
oRm.writeClasses();
oRm.write(">");
oRm.write(" ");
oRm.writeEscaped(sUnit);
oRm.write("</span>");
}
oRm.write("</div>");
oRm.write("</div>");
};
SelectionDetailsListItemRenderer.renderType = function(oRm, oControl) {
var oToolbar = oControl._getParentElement().getAggregation("_overflowToolbar");
if (oToolbar) {
oRm.write("<div");
oRm.addClass("sapMSDItemActions");
oRm.writeClasses();
oRm.write(">");
oRm.renderControl(oToolbar);
oRm.write("</div>");
}
};
return SelectionDetailsListItemRenderer;
}, /* bExport= */ true);