@openui5/sap.m
Version:
OpenUI5 UI Library sap.m
859 lines (738 loc) • 26.7 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2009-2023 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
// Provides control sap.m.Avatar.
sap.ui.define([
"sap/ui/core/Control",
"sap/ui/core/IconPool",
"./AvatarRenderer",
"sap/ui/events/KeyCodes",
"sap/base/Log",
"sap/ui/core/Icon",
"./library",
"sap/ui/core/library",
'sap/ui/core/InvisibleText',
'sap/m/imageUtils/getCacheBustedUrl'
], function(Control, IconPool, AvatarRenderer, KeyCodes, Log, Icon, library, coreLibrary, InvisibleText, getCacheBustedUrl) {
"use strict";
// shortcut for sap.m.AvatarType
var AvatarType = library.AvatarType;
// shortcut for sap.m.AvatarImageFitType
var AvatarImageFitType = library.AvatarImageFitType;
// shortcut for sap.m.AvatarColor
var AvatarColor = library.AvatarColor;
// shortcut for sap.m.AvatarSize
var AvatarSize = library.AvatarSize;
// shortcut for sap.m.AvatarShape
var AvatarShape = library.AvatarShape;
// shortcut for sap.ui.core.aria.HasPopup
var AriaHasPopup = coreLibrary.aria.HasPopup;
// shortcut for sap.ui.core.ValueState
var ValueState = coreLibrary.ValueState;
// shortcut for Accent colors keys only (from AvatarColor enum)
var AccentColors = Object.keys(AvatarColor).filter(function (sCurrColor) {
return sCurrColor.indexOf("Accent") !== -1;
});
/**
* Constructor for a new <code>Avatar</code>.
*
* @param {string} [sId] ID for the new control, generated automatically if no ID is given
* @param {object} [mSettings] Initial settings for the new control
*
* @class
* An image-like control that has different display options for representing images, initials,
* and icons.
*
* <h3>Overview</h3>
*
* The <code>Avatar</code> control allows the usage of different content, shapes, and sizes
* depending on the use case.
*
* The content types that can be displayed are either images, icons, or initials. The shape
* can be circular or square. There are several predefined sizes, as well as an option to
* set a custom size.
*
* <h3>Usage</h3>
*
* Up to three Latin letters can be displayed as initials in an <code>Avatar</code>. If there
* are more than three letters, or if there's a non-Latin character present, a default image
* placeholder will be created.
*
* There are two options for how the displayed image can fit inside the
* available area:
* <ul>
* <li>Cover - the image is scaled to cover all of the available area</li>
* <li>Contain - the image is scaled as large as possible while both
* its height and width fit inside the avalable area</li>
* </ul>
* <b>Note:</b> To set a custom size for the <code>Avatar</code>, you have to choose the <code>Custom</code>
* value for the <code>displaySize</code> property. Then, you have to set both the
* <code>customDisplaySize</code> and <code>customFontSize</code> properties.
*
* @extends sap.ui.core.Control
*
* @author SAP SE
* @version 1.117.4
*
* @constructor
* @public
* @since 1.73
* @see {@link fiori:https://experience.sap.com/fiori-design-web/avatar/ Avatar}
* @alias sap.m.Avatar
*/
var Avatar = Control.extend("sap.m.Avatar", {
metadata: {
library: "sap.m",
properties: {
/**
* Determines the path to the desired image or icon.
*/
src: {type: "sap.ui.core.URI", group: "Data", defaultValue: null},
/**
* Defines the displayed initials. They should consist of only 1,2 or 3 latin letters.
*/
initials: {type: "string", group: "Data", defaultValue: null},
/**
* Defines the shape of the <code>Avatar</code>.
*/
displayShape: {type: "sap.m.AvatarShape", group: "Appearance", defaultValue: AvatarShape.Circle},
/**
* Sets a predefined display size of the <code>Avatar</code>.
*/
displaySize: {type: "sap.m.AvatarSize", group: "Appearance", defaultValue: AvatarSize.S},
/**
* Specifies custom display size of the <code>Avatar</code>.
*
*<b>Note:</b> It takes effect if the <code>displaySize</code> property is set to <code>Custom</code>.
*/
customDisplaySize: {type: "sap.ui.core.CSSSize", group: "Appearance", defaultValue: "3rem"},
/**
* Specifies custom font size of the <code>Avatar</code>.
*
*<b>Note:</b> It takes effect if the <code>displaySize</code> property is set to <code>Custom</code>.
*/
customFontSize: {type: "sap.ui.core.CSSSize", group: "Appearance", defaultValue: "1.125rem"},
/**
* Specifies how an image would fit in the <code>Avatar</code>.
*/
imageFitType: {type: "sap.m.AvatarImageFitType", group: "Appearance", defaultValue: AvatarImageFitType.Cover},
/**
* Defines the fallback icon displayed in case of wrong image src and no initials set.
*
* <b>Notes:</b>
* <ul>
* <li>If not set, a default fallback icon is displayed depending on the set <code>displayShape</code> property.</li>
* <li>Accepted values are only icons from the SAP icon font.</li>
* </ul>
*/
fallbackIcon: {type: "string", group: "Data", defaultValue: null},
/**
* Determines the background color of the control.
*/
backgroundColor: {type: "sap.m.AvatarColor", group: "Appearance", defaultValue: AvatarColor.Accent6},
/**
* Determines whether the control is displayed with border.
*/
showBorder: {type: "boolean", group: "Appearance", defaultValue: false},
/**
* Defines what type of icon is displayed as visual affordance. It can be predefined or custom.
*
* The predefined icons are recommended for:
* <ul>
* <li>Suggesting a zooming action: <code>sap-icon://zoom-in</code></li>
* <li>Suggesting an image change: <code>sap-icon://camera</code></li>
* <li>Suggesting an editing action: <code>sap-icon://edit</code></li>
* </ul>
*
* @since 1.77
*/
badgeIcon: {type: "sap.ui.core.URI", group: "Appearance", defaultValue: ""},
/**
* Defines a custom tooltip for the <code>badgeIcon</code>. If set, it overrides the available default values.
*
* If not set, default tooltips are used as follows:
* <ul>
* <li>Specific default tooltips are displayed for each of the predefined <code>badgeIcons</code>.</li>
* <li>For any other icons, the displayed tooltip is the same as the main control tooltip.</li>
* <ul>
*
* @since 1.77
*/
badgeTooltip: {type: "string", group: "Data", defaultValue: null},
/**
* Defines whether the <code>sap.m.Avatar</code> is used for decorative purposes and is ignored by accessibility tools.
*
* <b>Note:</b> This property doesn't take effect if <code>sap.m.Avatar</code> has a <code>press</code> handler.
*
* @since 1.97
*/
decorative : {type : "boolean", group : "Accessibility", defaultValue : false},
/**
* Specifies the value of the <code>aria-haspopup</code> attribute
*
* If the value is <code>None</code>, the attribute will not be rendered. Otherwise it will be rendered with the selected value.
*
* NOTE: Use this property only when an avatar is related to a popover/popup. The value needs to be equal to the main/root role of the popup - e.g. dialog,
* menu or list (examples: if you have dialog -> dialog, if you have menu -> menu; if you have list -> list; if you have dialog containing a list -> dialog).
* Do not use it, if you open a standard sap.m.Dialog, MessageBox or other type of dialogs displayed as on overlay over the application.
*
* @since 1.99.0
*/
ariaHasPopup : {type : "sap.ui.core.aria.HasPopup", group : "Accessibility", defaultValue : AriaHasPopup.None},
/**
* Visualizes the validation state of the badge, e.g. <code>Error</code>, <code>Warning</code>,
* <code>Success</code>, <code>Information</code>.
* @since 1.116.0
*/
badgeValueState: {
type: "sap.ui.core.ValueState",
group: "Appearance",
defaultValue: ValueState.None
},
/**
* Determines whether the <code>Avatar</code> is enabled (default is set to <code>true</code>).
* A disabled <code>Button</code> has different colors depending on the {@link sap.m.AvatarColor AvatarColor}.
* @since 1.117.0
*/
enabled : {type : "boolean", group : "Behavior", defaultValue : true}
},
aggregations : {
/**
* A <code>sap.m.LightBox</code> instance, that will be opened automatically when the user interacts with the <code>Avatar</code> control.
*
* The <code>press</code> event will still be fired.
* @public
*/
detailBox: {type: 'sap.m.LightBox', multiple: false, bindable: "bindable"},
/**
* A <code>sap.ui.core.Icon</code> instance that shows the badge icon of the <code>Avatar</code> control.
* @private
*/
_badge: {type: "sap.ui.core.Icon", multiple: false, visibility: "hidden"},
/**
* A <code>sap.ui.core.Icon</code> instance that shows the icon of the <code>Avatar</code> control.
* @private
*/
_icon: {type: "sap.ui.core.Icon", multiple: false, visibility: "hidden"}
},
associations : {
/**
* Association to controls / ids which describe this control (see WAI-ARIA attribute aria-describedby).
*/
ariaDescribedBy : {type : "sap.ui.core.Control", multiple : true, singularName : "ariaDescribedBy"},
/**
* Association to controls / ids which label this control (see WAI-ARIA attribute aria-labelledBy).
*/
ariaLabelledBy: {type : "sap.ui.core.Control", multiple : true, singularName : "ariaLabelledBy"}
},
events : {
/**
* Fired when the user selects the control.
*/
press: {}
},
dnd: { draggable: true, droppable: false },
designtime: "sap/m/designtime/Avatar.designtime"
},
renderer: AvatarRenderer
});
/**
* This is the URI for the default icon, when <code>displayShape</code> is <code>Circle</code>.
*
* @type {string}
*/
Avatar.DEFAULT_CIRCLE_PLACEHOLDER = "sap-icon://person-placeholder";
/**
* This is the URI for the default icon, when <code>displayShape</code> is <code>Square</code>.
*
* @type {string}
*/
Avatar.DEFAULT_SQUARE_PLACEHOLDER = "sap-icon://product";
/**
* The predefined values for tooltip, when <code>badgeIcon</code> is set.
*
* @type {string}
*/
Avatar.AVATAR_BADGE_TOOLTIP = {
"sap-icon://zoom-in" : sap.ui.getCore().getLibraryResourceBundle("sap.m").getText("AVATAR_TOOLTIP_ZOOMIN"),
"sap-icon://camera": sap.ui.getCore().getLibraryResourceBundle("sap.m").getText("AVATAR_TOOLTIP_CAMERA"),
"sap-icon://edit": sap.ui.getCore().getLibraryResourceBundle("sap.m").getText("AVATAR_TOOLTIP_EDIT")
};
Avatar.prototype.init = function () {
// Property holding the actual display type of the avatar
this._sActualType = null;
// Property that determines if the created icon is going to be the default one
this._bIsDefaultIcon = true;
this._sImageFallbackType = null;
// Property holding the currently picked random background color of the avatar, if any
this._sPickedRandomColor = null;
//Reference to badge hidden aggregation
this._badgeRef = null;
};
Avatar.prototype.onBeforeRendering = function () {
if (this._getImageCustomData() && !this._iCacheBustingValue) {
this._setNewCacheBustingValue();
}
};
Avatar.prototype.onAfterRendering = function() {
this._checkInitialsHolderWidth();
};
Avatar.prototype.onThemeChanged = function() {
this._checkInitialsHolderWidth();
};
Avatar.prototype.exit = function () {
if (this._fnLightBoxOpen) {
this._fnLightBoxOpen = null;
}
if (this._badgeRef) {
this._badgeRef.destroy();
}
if (this._oInvisibleText) {
this._oInvisibleText.destroy();
this._oInvisibleText = null;
}
this._sPickedRandomColor = null;
};
/**
* Sets the <code>detailBox</code> aggregation.
* @param {sap.m.LightBox|undefined} oLightBox - Instance of the <code>LightBox</code> control or undefined
* @returns {this} <code>this</code> for chaining
* @override
* @public
*/
Avatar.prototype.setDetailBox = function (oLightBox) {
var oCurrentDetailBox = this.getDetailBox();
if (oLightBox) {
// In case someone try's to set the same LightBox twice we don't do anything
if (oLightBox === oCurrentDetailBox) {
return this;
}
// If we already have a LightBox detach old one's event
if (oCurrentDetailBox) {
this.detachPress(this._fnLightBoxOpen, oCurrentDetailBox);
}
// Bind the LightBox open method to the press event of the Avatar
this._fnLightBoxOpen = oLightBox.open;
this.attachPress(this._fnLightBoxOpen, oLightBox);
} else if (this._fnLightBoxOpen) {
// If there was a LightBox - cleanup
this.detachPress(this._fnLightBoxOpen, oCurrentDetailBox);
this._fnLightBoxOpen = null;
}
return this.setAggregation("detailBox", oLightBox);
};
Avatar.prototype.setBadgeValueState = function(sValue) {
Object.keys(ValueState).forEach(function(val){
this.toggleStyleClass('sapFAvatar' + val, val === sValue);
}.bind(this));
this.setProperty("badgeValueState", sValue, true);
return this;
};
/*
* @override
*/
Avatar.prototype.clone = function () {
var oClone = Control.prototype.clone.apply(this, arguments),
oCloneDetailBox = oClone.getDetailBox();
// Handle press event if DetailBox is available
if (oCloneDetailBox) {
// Detach the old event
oClone.detachPress(this._fnLightBoxOpen, this.getDetailBox());
// Attach new event with the cloned detail box
oClone._fnLightBoxOpen = oCloneDetailBox.open;
oClone.attachPress(oClone._fnLightBoxOpen, oCloneDetailBox);
}
return oClone;
};
Avatar.prototype.attachPress = function() {
Array.prototype.unshift.apply(arguments, ["press"]);
Control.prototype.attachEvent.apply(this, arguments);
if (this.hasListeners("press")) {
this.$().attr("tabindex", "0");
this.$().attr("role", "button");
}
return this;
};
Avatar.prototype.detachPress = function() {
Array.prototype.unshift.apply(arguments, ["press"]);
Control.prototype.detachEvent.apply(this, arguments);
if (!this.hasListeners("press")) {
this.$().removeAttr("tabindex");
this.$().attr("role", "img");
}
return this;
};
/**
* Called when the <code>Avatar</code> is selected.
*
* @private
*/
Avatar.prototype.ontap = function () {
this._handlePress();
};
/**
* @param {jQuery.Event} oEvent - the keyboard event.
* @private
*/
Avatar.prototype.onkeydown = function (oEvent) {
if (oEvent.which === KeyCodes.SHIFT || oEvent.which === KeyCodes.ESCAPE) {
this._bShouldInterupt = this._bSpacePressed;
}
if (oEvent.which === KeyCodes.SPACE) {
this._bSpacePressed = true;
// To prevent the browser scrolling.
oEvent.preventDefault();
}
if (oEvent.which === KeyCodes.ENTER) {
this._handlePress();
}
};
/**
* Handles the key up event for SPACE.
*
* @param {jQuery.Event} oEvent - the keyboard event.
* @private
*/
Avatar.prototype.onkeyup = function (oEvent) {
if (oEvent.which === KeyCodes.SPACE) {
if (!this._bShouldInterupt) {
this._handlePress();
}
this._bShouldInterupt = false;
this._bSpacePressed = false;
//stop the propagation, it is handled by the control
oEvent.stopPropagation();
}
};
Avatar.prototype._handlePress = function () {
if (!this.getEnabled()) {
return;
}
this.firePress({/* no parameters */});
if (this.hasListeners("press")) {
this.isPressed = !this.isPressed;
this.toggleStyleClass("sapMAvatarPressed", this._isPressed);
}
};
/**
* Checks the validity of the <code>initials</code> parameter and returns <code>true</code> if the
* initials are correct.
*
* @param {string} sInitials The initials value
* @returns {boolean} The initials are valid or not
* @private
*/
Avatar.prototype._areInitialsValid = function (sInitials) {
var validInitials = /^[a-zA-Z\xc0-\xd6\xd8-\xdc\xe0-\xf6\xf8-\xfc]{1,3}$/;
if (!validInitials.test(sInitials)) {
Log.warning("Initials should consist of only 1,2 or 3 latin letters", this);
this._sActualType = AvatarType.Icon;
this._bIsDefaultIcon = true;
return false;
}
return true;
};
/**
* Validates the <code>src</code> parameter, and sets the actual type appropriately.
*
* @param {string} sSrc
* @returns {this}
* @private
*/
Avatar.prototype._validateSrc = function (sSrc) {
if (IconPool.isIconURI(sSrc)) {
this._sActualType = AvatarType.Icon;
this._bIsDefaultIcon = IconPool.getIconInfo(sSrc) ? false : true;
} else {
this._bIsDefaultIcon = true;
this._sActualType = AvatarType.Image;
// we perform this action in order to validate the image source and
// take further actions depending on that
this.preloadedImage = new window.Image();
this.preloadedImage.src = sSrc;
this.preloadedImage.onload = this._onImageLoad.bind(this);
this.preloadedImage.onerror = this._onImageError.bind(this);
}
return this;
};
/**
* Validates the <code>src</code> parameter, and returns sap.ui.core.Icon object.
*
* @param {string} sSrc
* @returns {sap.ui.core.Icon|null}
* @private
*/
Avatar.prototype._getDisplayIcon = function (sSrc) {
return IconPool.isIconURI(sSrc) && IconPool.getIconInfo(sSrc) ?
IconPool.createControlByURI({
src: sSrc
}) : null;
};
/**
* Validates the entered parameters, and returns what the actual display type parameter would be.
*
* @returns {sap.m.AvatarType}
* @private
*/
Avatar.prototype._getActualDisplayType = function () {
var sSrc = this._getAvatarSrc(),
sInitials = this.getInitials();
if (sSrc) {
this._validateSrc(sSrc);
} else if (sInitials && this._areInitialsValid(sInitials)) {
this._sActualType = AvatarType.Initials;
} else {
Log.warning("No src and initials were provided", this);
this._sActualType = AvatarType.Icon;
this._bIsDefaultIcon = true;
}
return this._sActualType;
};
/**
* Indicates what type of fallback we should show if there is invalid image source.
*
* @returns {sap.m.AvatarType}
* @private
*/
Avatar.prototype._getImageFallbackType = function () {
var sInitials = this.getInitials();
this._sImageFallbackType = sInitials && this._areInitialsValid(sInitials) ?
AvatarType.Initials : AvatarType.Icon;
return this._sImageFallbackType;
};
/**
* Returns the path for the default icon, based on the value of the <code>DisplayShape</code> property.
*
* @param {sap.m.AvatarShape} sDisplayShape
* @returns {string} the default icon
* @private
*/
Avatar.prototype._getDefaultIconPath = function (sDisplayShape) {
var sDefaultIconPath = null,
sFallbackIcon = this.getFallbackIcon();
if (sFallbackIcon && IconPool.isIconURI(sFallbackIcon)) {
sDefaultIconPath = sFallbackIcon;
} else if (sDisplayShape === AvatarShape.Circle) {
sDefaultIconPath = Avatar.DEFAULT_CIRCLE_PLACEHOLDER;
} else if (sDisplayShape === AvatarShape.Square) {
sDefaultIconPath = Avatar.DEFAULT_SQUARE_PLACEHOLDER;
}
return sDefaultIconPath;
};
/**
* Returns a control of type <code>Icon</code> and changes the <code>src</code> value if the
* <code>Icon</code> control was already created.
*
* @returns {sap.ui.core.Control}
* @private
*/
Avatar.prototype._getIcon = function () {
var sSrc = this.getSrc(),
oIcon = this.getAggregation("_icon"),
sDisplayShape = this.getDisplayShape();
if (this._bIsDefaultIcon) {
sSrc = this._getDefaultIconPath(sDisplayShape);
}
if (!oIcon) {
oIcon = IconPool.createControlByURI({
alt: "Image placeholder",
src: sSrc
});
this.setAggregation("_icon", oIcon);
} else if (oIcon.getSrc() !== sSrc) {
oIcon.setSrc(sSrc);
}
return oIcon;
};
Avatar.prototype._getDefaultTooltip = function() {
return sap.ui.getCore().getLibraryResourceBundle("sap.m").getText("AVATAR_TOOLTIP");
};
Avatar.prototype._getBadgeIconSource = function() {
var sBadgeIconPath;
if (this.getDetailBox()) {
sBadgeIconPath = "sap-icon://zoom-in";
} else if (this.getBadgeIcon() !== "") {
if (this._getDisplayIcon(this.getBadgeIcon())) {
sBadgeIconPath = this.getBadgeIcon();
} else {
Log.warning("No valid Icon URI source for badge affordance was provided");
}
}
return sBadgeIconPath;
};
Avatar.prototype._getBadgeTooltip = function() {
var sBadgeTooltip = this._getDefaultTooltip(),
sBadgeIcon = this.getBadgeIcon();
if (this.getBadgeTooltip()) {
sBadgeTooltip = this.getBadgeTooltip();
} else if ( sBadgeIcon && Avatar.AVATAR_BADGE_TOOLTIP[this.getBadgeIcon()]) {
sBadgeTooltip = Avatar.AVATAR_BADGE_TOOLTIP[sBadgeIcon];
}
return sBadgeTooltip;
};
Avatar.prototype._getBadge = function () {
var sBadgeIconSrc = this._getBadgeIconSource(),
sBadgeTooltip = this._getBadgeTooltip();
if (!sBadgeIconSrc) {return;}
if (!this._badgeRef) {
this.setAggregation("_badge", new Icon({
src: sBadgeIconSrc,
tooltip: sBadgeTooltip
}));
}
this._badgeRef = this.getAggregation("_badge");
return this._badgeRef;
};
/**
* We use this callback to make sure we hide fallback content if our original image source
* is loaded.
*
* @private
*/
Avatar.prototype._onImageLoad = function() {
//we need to remove fallback content
delete this.preloadedImage;
};
/**
* We use the negative callback to clean the useless property.
*
* @private
*/
Avatar.prototype._onImageError = function() {
var sFallBackType = this._getImageFallbackType();
this.$().removeClass("sapFAvatarImage")
.addClass("sapFAvatar" + sFallBackType);
delete this.preloadedImage;
};
/**
* Returns the actual background color.
*
* @returns {sap.m.AvatarColor} The actual background color
* @private
*/
Avatar.prototype._getActualBackgroundColor = function() {
var sBackground = this.getBackgroundColor();
if (sBackground === AvatarColor.Random) {
// If the last time the "backgroundColor" property was "Random", we return the last rolled color.
// This is needed in order to prevent picking different colors on re-rendering
// of the control if the property keeps being "Random".
if (this._sPickedRandomColor) {
return this._sPickedRandomColor;
}
// Picking a random Accent property from the AvatarColor enum
// << 0 truncates the digits after the decimal (it's the same as Math.trunc())
sBackground = this._sPickedRandomColor = AvatarColor[AccentColors[AccentColors.length * Math.random() << 0]];
} else {
// In case the "backgroundColor" is different from "Random", we set the
// this._sPickedRandomColor to "null". This is needed in order to generate
// a new random color the next time "backgroundColor" is "Random".
this._sPickedRandomColor = null;
}
return sBackground;
};
// Checks the scrollWidth of the initials holder inside the control.
// This is related with the initials property and the case where there are 3 letter initials,
// which width is bigger than the initials holder`s width.
Avatar.prototype._checkInitialsHolderWidth = function() {
var $this = this.$(),
iInitials = this.getInitials().length;
this.$oInitialsHolder = $this.children(".sapFAvatarInitialsHolder");
if (this.$oInitialsHolder.length !== 0 && iInitials === 3) {
var iAvatarWidth = $this[0].offsetWidth,
iInitialsHolderWidth = this.$oInitialsHolder[0].offsetWidth;
if (iInitialsHolderWidth > iAvatarWidth) {
this._wideInitialsIcon();
}
}
};
// In case when there are 3 initials set to the avatar and they are overflowing,
// we want to show icon inatead of the initials.
Avatar.prototype._wideInitialsIcon = function() {
var $this = this.$(),
$oHiddenIcon = $this.children(".sapFAvatarHiddenIcon");
$oHiddenIcon.removeClass("sapFAvatarHiddenIcon");
this.$oInitialsHolder.css("display", "none");
$this.removeClass("sapFAvatarInitials");
$this.addClass("sapFAvatarIcon");
};
Avatar.prototype._getInvisibleText = function() {
if (!this._oInvisibleText && this.sInitials) {
this._oInvisibleText = new InvisibleText({ id: this.getId() + "-InvisibleText"});
this._oInvisibleText.setText(this.sInitials).toStatic();
}
return this._oInvisibleText;
};
Avatar.prototype._getAriaLabelledBy = function () {
var aLabelledBy = this.getAriaLabelledBy(),
sInitialsAriaLabelledBy;
this.sInitials = this.getInitials();
if (this.sInitials && aLabelledBy.length > 0) {
sInitialsAriaLabelledBy = this._getInvisibleText().getId();
aLabelledBy.push(sInitialsAriaLabelledBy);
}
return aLabelledBy;
};
/**
* Retrieves the custom data object for the Avatar control.
*
* @function
* @param {sap.m.Avatar} oAvatar - The Avatar control to retrieve the custom data for.
* @returns {sap.m.ImageCustomData|undefined} The custom data object or undefined if no custom data is found.
* @private
*/
Avatar.prototype._getImageCustomData = function (oAvatar) {
var oImageCustomData = this.getCustomData().filter(function (item) {
return item.isA("sap.m.ImageCustomData");
});
return oImageCustomData.length ? oImageCustomData[0] : undefined;
};
/**
* Sets the cache busting value for the Avatar control.
* This is needed in order to force the browser to reload the image.
*
* @function
* @private
*/
Avatar.prototype._setNewCacheBustingValue = function () {
if (this._getImageCustomData()) {
this._iCacheBustingValue = Date.now();
}
};
/**
* Returns the Avatar control's source URL with cache busting applied if necessary, based on the ImageCustomData configuration.
* If cache busting is applied, the source URL is updated; otherwise, the original source URL is returned.
*
* @function
* @returns {string} sSrc - The Avatar control's source URL
* @private
*/
Avatar.prototype._getAvatarSrc = function () {
var aImageCustomData = this._getImageCustomData(),
sSrc = this.getSrc();
if (aImageCustomData && sSrc) {
var oConfig = {
sUrl: sSrc,
sParamName: aImageCustomData.getParamName(),
sParamValue: this._iCacheBustingValue
};
return getCacheBustedUrl(oConfig);
}
return sSrc;
};
/**
* Refreshes the cache busting value for the Avatar and invalidates the control.
* It can be used when you have applied ImageCustomData to the Avatar control and you want to force the browser to reload the image.
*
* @function
* @experimental
* @private
* @ui5-restricted sap.fe
*/
Avatar.prototype.refreshAvatarCacheBusting = function () {
this._setNewCacheBustingValue();
this.invalidate();
};
return Avatar;
});