@fundamental-ngx/core 0.60.1 → 0.60.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Pipe, InjectionToken, input, booleanAttribute, output, viewChild, signal, computed, inject, ElementRef,
|
|
2
|
+
import { Pipe, InjectionToken, input, booleanAttribute, output, viewChild, signal, computed, inject, ElementRef, HostAttributeToken, effect, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
|
|
3
3
|
import { getRandomColorAccent, ANY_LANGUAGE_LETTERS_REGEX } from '@fundamental-ngx/cdk/utils';
|
|
4
4
|
import { FD_DEFAULT_ICON_FONT_FAMILY, IconComponent } from '@fundamental-ngx/core/icon';
|
|
5
5
|
|
|
@@ -159,21 +159,29 @@ class AvatarComponent {
|
|
|
159
159
|
this._shouldShowDefaultIcon = signal(false, ...(ngDevMode ? [{ debugName: "_shouldShowDefaultIcon" }] : []));
|
|
160
160
|
/** @hidden Stored random color accent to prevent regeneration */
|
|
161
161
|
this._randomColorAccent = signal(getRandomColorAccent(), ...(ngDevMode ? [{ debugName: "_randomColorAccent" }] : []));
|
|
162
|
+
/** @hidden Track the currently loading/loaded image URL to prevent duplicate requests */
|
|
163
|
+
this._currentImageUrl = null;
|
|
164
|
+
/** @hidden Cache of successfully loaded image URLs to prevent re-requesting */
|
|
165
|
+
this._loadedImageCache = new Set();
|
|
162
166
|
/** @hidden */
|
|
163
167
|
this._elementRef = inject(ElementRef);
|
|
164
168
|
/** @hidden */
|
|
165
|
-
this._renderer = inject(Renderer2);
|
|
166
|
-
/** @hidden */
|
|
167
169
|
this._hostTabindex = inject(new HostAttributeToken('tabindex'), { optional: true });
|
|
168
170
|
// Effect to handle image changes
|
|
169
171
|
effect(() => {
|
|
170
172
|
const imageValue = this.image();
|
|
171
173
|
if (imageValue) {
|
|
172
|
-
|
|
173
|
-
this.
|
|
174
|
-
|
|
174
|
+
// Only reset loaded state if the URL actually changed
|
|
175
|
+
if (this._currentImageUrl !== imageValue) {
|
|
176
|
+
this._imageLoaded.set(false);
|
|
177
|
+
this._shouldShowDefaultIcon.set(false); // Reset default icon flag
|
|
178
|
+
this._verifyImageUrl(imageValue, this._onErrorCallback.bind(this));
|
|
179
|
+
}
|
|
180
|
+
// If URL is the same and already loaded, do nothing (use cache)
|
|
175
181
|
}
|
|
176
182
|
else {
|
|
183
|
+
// Image input cleared
|
|
184
|
+
this._currentImageUrl = null;
|
|
177
185
|
this._imageLoaded.set(false);
|
|
178
186
|
this._shouldShowDefaultIcon.set(false);
|
|
179
187
|
this._setBgImage(null);
|
|
@@ -198,11 +206,6 @@ class AvatarComponent {
|
|
|
198
206
|
this._randomColorAccent.set(getRandomColorAccent());
|
|
199
207
|
}
|
|
200
208
|
});
|
|
201
|
-
// Effect to apply background image to DOM
|
|
202
|
-
effect(() => {
|
|
203
|
-
const bgImage = this.bgImage();
|
|
204
|
-
this._renderer.setStyle(this._elementRef.nativeElement, 'background-image', bgImage);
|
|
205
|
-
});
|
|
206
209
|
}
|
|
207
210
|
/** @hidden */
|
|
208
211
|
onClick(event) {
|
|
@@ -240,18 +243,27 @@ class AvatarComponent {
|
|
|
240
243
|
}
|
|
241
244
|
/** @hidden */
|
|
242
245
|
_verifyImageUrl(srcValue, onErrorCallback) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
+
// Check if this URL was previously loaded successfully (component-level cache)
|
|
247
|
+
if (this._loadedImageCache.has(srcValue)) {
|
|
248
|
+
// Image was loaded before, reuse it
|
|
249
|
+
this._setBgImage(srcValue);
|
|
250
|
+
this._imageLoaded.set(true);
|
|
251
|
+
this._currentImageUrl = srcValue;
|
|
246
252
|
return;
|
|
247
253
|
}
|
|
254
|
+
// Track the current image URL
|
|
255
|
+
this._currentImageUrl = srcValue;
|
|
248
256
|
const img = new Image();
|
|
249
257
|
img.onload = () => {
|
|
250
258
|
// Only set background if image loads successfully
|
|
251
259
|
this._setBgImage(srcValue);
|
|
252
260
|
this._imageLoaded.set(true);
|
|
261
|
+
// Add to cache of successfully loaded images
|
|
262
|
+
this._loadedImageCache.add(srcValue);
|
|
263
|
+
};
|
|
264
|
+
img.onerror = () => {
|
|
265
|
+
onErrorCallback();
|
|
253
266
|
};
|
|
254
|
-
img.onerror = onErrorCallback;
|
|
255
267
|
img.src = srcValue;
|
|
256
268
|
}
|
|
257
269
|
/** @hidden */
|
|
@@ -315,7 +327,7 @@ class AvatarComponent {
|
|
|
315
327
|
this._shouldShowDefaultIcon.set(true);
|
|
316
328
|
}
|
|
317
329
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: AvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
318
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: AvatarComponent, isStandalone: true, selector: "fd-avatar", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, font: { classPropertyName: "font", publicName: "font", isSignal: true, isRequired: false, transformFunction: null }, glyph: { classPropertyName: "glyph", publicName: "glyph", isSignal: true, isRequired: false, transformFunction: null }, zoomGlyph: { classPropertyName: "zoomGlyph", publicName: "zoomGlyph", isSignal: true, isRequired: false, transformFunction: null }, circle: { classPropertyName: "circle", publicName: "circle", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, contain: { classPropertyName: "contain", publicName: "contain", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, tile: { classPropertyName: "tile", publicName: "tile", isSignal: true, isRequired: false, transformFunction: null }, border: { classPropertyName: "border", publicName: "border", isSignal: true, isRequired: false, transformFunction: null }, colorAccent: { classPropertyName: "colorAccent", publicName: "colorAccent", isSignal: true, isRequired: false, transformFunction: null }, colorIndication: { classPropertyName: "colorIndication", publicName: "colorIndication", isSignal: true, isRequired: false, transformFunction: null }, random: { classPropertyName: "random", publicName: "random", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, valueState: { classPropertyName: "valueState", publicName: "valueState", isSignal: true, isRequired: false, transformFunction: null }, image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, alterIcon: { classPropertyName: "alterIcon", publicName: "alterIcon", isSignal: true, isRequired: false, transformFunction: null }, backupImage: { classPropertyName: "backupImage", publicName: "backupImage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { avatarClicked: "avatarClicked", zoomGlyphClicked: "zoomGlyphClicked" }, host: { listeners: { "click": "onClick($event)", "keydown.enter": "onClick($event)", "keydown.space": "onClick($event)" }, properties: { "class": "cssClass()", "attr.tabindex": "tabindex()", "attr.id": "id()", "attr.aria-label": "ariaLabel()", "attr.aria-labelledby": "ariaLabelledby()", "attr.alt": "ariaLabel()", "attr.role": "role()" } }, providers: [
|
|
330
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: AvatarComponent, isStandalone: true, selector: "fd-avatar", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, font: { classPropertyName: "font", publicName: "font", isSignal: true, isRequired: false, transformFunction: null }, glyph: { classPropertyName: "glyph", publicName: "glyph", isSignal: true, isRequired: false, transformFunction: null }, zoomGlyph: { classPropertyName: "zoomGlyph", publicName: "zoomGlyph", isSignal: true, isRequired: false, transformFunction: null }, circle: { classPropertyName: "circle", publicName: "circle", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, transparent: { classPropertyName: "transparent", publicName: "transparent", isSignal: true, isRequired: false, transformFunction: null }, contain: { classPropertyName: "contain", publicName: "contain", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, tile: { classPropertyName: "tile", publicName: "tile", isSignal: true, isRequired: false, transformFunction: null }, border: { classPropertyName: "border", publicName: "border", isSignal: true, isRequired: false, transformFunction: null }, colorAccent: { classPropertyName: "colorAccent", publicName: "colorAccent", isSignal: true, isRequired: false, transformFunction: null }, colorIndication: { classPropertyName: "colorIndication", publicName: "colorIndication", isSignal: true, isRequired: false, transformFunction: null }, random: { classPropertyName: "random", publicName: "random", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, valueState: { classPropertyName: "valueState", publicName: "valueState", isSignal: true, isRequired: false, transformFunction: null }, image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, alterIcon: { classPropertyName: "alterIcon", publicName: "alterIcon", isSignal: true, isRequired: false, transformFunction: null }, backupImage: { classPropertyName: "backupImage", publicName: "backupImage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { avatarClicked: "avatarClicked", zoomGlyphClicked: "zoomGlyphClicked" }, host: { listeners: { "click": "onClick($event)", "keydown.enter": "onClick($event)", "keydown.space": "onClick($event)" }, properties: { "class": "cssClass()", "style.background-image": "bgImage()", "attr.tabindex": "tabindex()", "attr.id": "id()", "attr.aria-label": "ariaLabel()", "attr.aria-labelledby": "ariaLabelledby()", "attr.alt": "ariaLabel()", "attr.role": "role()" } }, providers: [
|
|
319
331
|
{
|
|
320
332
|
provide: FD_AVATAR_COMPONENT,
|
|
321
333
|
useExisting: AvatarComponent
|
|
@@ -331,6 +343,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
|
|
|
331
343
|
}
|
|
332
344
|
], host: {
|
|
333
345
|
'[class]': 'cssClass()',
|
|
346
|
+
'[style.background-image]': 'bgImage()',
|
|
334
347
|
'[attr.tabindex]': 'tabindex()',
|
|
335
348
|
'[attr.id]': 'id()',
|
|
336
349
|
'[attr.aria-label]': 'ariaLabel()',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fundamental-ngx-core-avatar.mjs","sources":["../../../../libs/core/avatar/avatar-icon.pipe.ts","../../../../libs/core/avatar/tokens.ts","../../../../libs/core/avatar/avatar.component.ts","../../../../libs/core/avatar/avatar.component.html","../../../../libs/core/avatar/avatar.module.ts","../../../../libs/core/avatar/fundamental-ngx-core-avatar.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { Nullable } from '@fundamental-ngx/cdk/utils';\nimport { AvatarValueStates } from './avatar-value-states.type';\n\n@Pipe({\n name: 'fdAvatarIcon',\n pure: true,\n standalone: true\n})\nexport class AvatarIconPipe implements PipeTransform {\n /**\n * Selects appropriate Avatar icon based on Avatar Value state and fallback icon.\n */\n transform(valueState: Nullable<AvatarValueStates>, fallbackIcon: Nullable<string>): string {\n let computedIcon = '';\n if (!valueState) {\n computedIcon = fallbackIcon || '';\n }\n switch (valueState) {\n case 'positive':\n computedIcon = 'sys-enter-2';\n break;\n case 'caution':\n computedIcon = 'warning';\n break;\n case 'negative':\n computedIcon = 'error';\n break;\n case 'information':\n computedIcon = 'information';\n break;\n }\n\n return `sap-icon--${computedIcon} ${valueState ? 'fd-avatar__zoom-icon--' + valueState : ''}`;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const FD_AVATAR_COMPONENT = new InjectionToken('FdAvatarComponent');\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostAttributeToken,\n inject,\n input,\n output,\n Renderer2,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n ANY_LANGUAGE_LETTERS_REGEX,\n ColorAccent,\n getRandomColorAccent,\n Nullable,\n Size\n} from '@fundamental-ngx/cdk/utils';\nimport { FD_DEFAULT_ICON_FONT_FAMILY, IconComponent, IconFont } from '@fundamental-ngx/core/icon';\nimport { AvatarIconPipe } from './avatar-icon.pipe';\nimport { AvatarValueStates } from './avatar-value-states.type';\nimport { FD_AVATAR_COMPONENT } from './tokens';\n\nlet avatarUniqueId = 0;\n\nconst ALTER_ICON_OPTIONS = {\n CONTENT: 'content',\n ALT: 'alt',\n BACKUP: 'backup',\n DEFAULT_ICON: 'default-icon'\n};\n\nexport type IndicationColor = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;\n\n@Component({\n selector: 'fd-avatar',\n templateUrl: './avatar.component.html',\n styleUrl: './avatar.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: FD_AVATAR_COMPONENT,\n useExisting: AvatarComponent\n }\n ],\n host: {\n '[class]': 'cssClass()',\n '[attr.tabindex]': 'tabindex()',\n '[attr.id]': 'id()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledby()',\n '[attr.alt]': 'ariaLabel()',\n '[attr.role]': 'role()',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event)'\n },\n imports: [AvatarIconPipe, IconComponent]\n})\nexport class AvatarComponent {\n /** Id of the Avatar. */\n readonly id = input('fd-avatar-' + ++avatarUniqueId);\n\n /** Aria-label for Avatar. */\n readonly ariaLabel = input<string | null | undefined>(null);\n\n /** Aria-Labelledby for element describing Avatar. */\n readonly ariaLabelledby = input<string | null | undefined>(null);\n\n /** Localized text for label */\n readonly label = input<string | null | undefined>(null);\n\n /** The size of the Avatar. Options include: *xs*, *s*, *m*, *l* and *xl*. */\n readonly size = input<Size>('l');\n\n /** Font family of the icon. */\n readonly font = input<IconFont>(FD_DEFAULT_ICON_FONT_FAMILY);\n\n /** The glyph name. */\n readonly glyph = input<string | null | undefined>(null);\n\n /** The glyph name for zoom icon. */\n readonly zoomGlyph = input<string | null | undefined>(null);\n\n /** Whether to apply a circle style to the Avatar. */\n readonly circle = input(false, { transform: booleanAttribute });\n\n /** Whether the Avatar should be interactive. */\n readonly interactive = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a transparent style to the Avatar. */\n readonly transparent = input(false, { transform: booleanAttribute });\n\n /** Whether to apply background size contain style to the Avatar */\n readonly contain = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a placeholder background style to the Avatar. */\n readonly placeholder = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a tile background style to the Avatar. */\n readonly tile = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a border to the Avatar. */\n readonly border = input(false, { transform: booleanAttribute });\n\n /** A number from 1 to 10 representing the background color of the Avatar.\n * This property will override the colorIndication property.\n */\n readonly colorAccent = input<ColorAccent | null | undefined>(null);\n\n /** A number from 1 to 10 representing the background color of the Avatar using the Indication Colors. */\n readonly colorIndication = input<IndicationColor | null | undefined>(null);\n\n /** Whether to apply random background color to the Avatar. */\n readonly random = input(false, { transform: booleanAttribute });\n\n /** Whether component should be focusable & clicable */\n readonly clickable = input(false, { transform: booleanAttribute });\n\n /** Value state of the Avatar. */\n readonly valueState = input<AvatarValueStates | null | undefined>(null);\n\n /** Background image resource: url or base64. */\n readonly image = input<string | null | undefined>(null);\n\n /** Backup options to use when image hasn't been loaded successfully.\n * Options separated with \"|\" symbol.\n * Possible options: content, alt, backup, default-icon\n */\n readonly alterIcon = input<string | null | undefined>(null);\n\n /** Backup image to load when image hasn't been loaded successfully.\n * Only applicable when using alterIcon input property.\n */\n readonly backupImage = input<string | null | undefined>(null);\n\n /** Event emitted when avatar clicked. Only fires if clickable input property set to true. */\n readonly avatarClicked = output<Event>();\n\n /** Event emitted when zoom icon clicked. Only fires if zoomGlyph input property is set. */\n readonly zoomGlyphClicked = output<void>();\n\n /** @hidden */\n protected readonly content = viewChild<ElementRef>('content');\n\n /** @hidden Internal state for background image */\n protected readonly bgImage = signal<string | null | undefined>(null);\n\n /** @hidden Internal state for computed abbreviation */\n protected readonly abbreviate = signal<string | null | undefined>(null);\n\n /** @hidden Computed tabindex based on clickable state */\n protected readonly tabindex = computed(() => {\n if (this._hostTabindex != null) {\n return this._hostTabindex;\n }\n return this.clickable() ? 0 : null;\n });\n\n /** @hidden Computed role attribute */\n protected readonly role = computed(() => (this.zoomGlyph() || this.clickable() ? 'button' : 'img'));\n\n /** @hidden If a default placeholder should be displayed */\n protected readonly showDefault = computed(\n () =>\n // Show default if explicitly requested OR if no content is available\n this._shouldShowDefaultIcon() ||\n (!this.abbreviate() && !this._imageLoaded() && !this.glyph() && !this.image())\n );\n\n /** @hidden Computed CSS classes */\n protected readonly cssClass = computed(() => {\n const colorAccentValue = this.colorAccent();\n const randomValue = this.random();\n const colorIndicationValue = this.colorIndication();\n\n return [\n 'fd-avatar',\n this.size() ? `fd-avatar--${this.size()}` : '',\n colorAccentValue && !randomValue ? `fd-avatar--accent-color-${colorAccentValue}` : '',\n randomValue ? `fd-avatar--accent-color-${this._randomColorAccent()}` : '',\n colorIndicationValue && colorAccentValue === null && !randomValue\n ? `fd-avatar--indication-color-${colorIndicationValue}`\n : '',\n this.circle() ? 'fd-avatar--circle' : '',\n this.border() ? 'fd-avatar--border' : '',\n this.interactive() ? 'fd-avatar--interactive' : '',\n this.transparent() ? 'fd-avatar--transparent' : '',\n this.contain() ? 'fd-avatar--background-contain' : '',\n this.placeholder() ? 'fd-avatar--placeholder' : '',\n this.tile() ? 'fd-avatar--tile' : ''\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n /** @hidden Internal state tracking if image loaded successfully */\n private readonly _imageLoaded = signal(false);\n\n /** @hidden Explicitly track when to show default icon (for failed images with no fallback) */\n private readonly _shouldShowDefaultIcon = signal(false);\n\n /** @hidden Stored random color accent to prevent regeneration */\n private readonly _randomColorAccent = signal<ColorAccent>(getRandomColorAccent());\n\n /** @hidden */\n private readonly _elementRef = inject(ElementRef);\n\n /** @hidden */\n private readonly _renderer = inject(Renderer2);\n\n /** @hidden */\n private readonly _hostTabindex = inject(new HostAttributeToken('tabindex'), { optional: true });\n\n /** @hidden */\n constructor() {\n // Effect to handle image changes\n effect(() => {\n const imageValue = this.image();\n if (imageValue) {\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(false); // Reset default icon flag\n this._verifyImageUrl(imageValue, this._onErrorCallback.bind(this));\n } else {\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(false);\n this._setBgImage(null);\n }\n });\n\n // Effect to handle label changes and compute abbreviation\n effect(() => {\n const labelValue = this.label();\n // Only generate abbreviation from label if there's no successful image\n if (labelValue && !this._imageLoaded()) {\n const abbreviation = this._generateAbbreviation(labelValue);\n this.abbreviate.set(abbreviation);\n } else if (!labelValue && !this._imageLoaded()) {\n // Clear abbreviation when label is removed (if no image)\n this.abbreviate.set(null);\n }\n });\n\n // Effect to regenerate random color when random property changes\n effect(() => {\n if (this.random()) {\n this._randomColorAccent.set(getRandomColorAccent());\n }\n });\n\n // Effect to apply background image to DOM\n effect(() => {\n const bgImage = this.bgImage();\n this._renderer.setStyle(this._elementRef.nativeElement, 'background-image', bgImage);\n });\n }\n\n /** @hidden */\n protected onClick(event: Event): void {\n if (!this.clickable()) {\n return;\n }\n\n event.preventDefault();\n\n this.avatarClicked.emit(event);\n\n if (this.zoomGlyph()) {\n this.zoomGlyphClicked.emit();\n }\n }\n\n /** @hidden */\n protected zoomClicked(event: Event): void {\n event.preventDefault();\n this._elementRef.nativeElement.focus();\n this.zoomGlyphClicked.emit();\n }\n\n /** @hidden Get the abbreviation string */\n private _generateAbbreviation(label: Nullable<string>): string | null {\n if (!label) {\n return null;\n }\n\n const maxLettersCount = 3;\n const words = label.split(' ').filter((word) => word.length > 0);\n\n if (words.length === 0 || words.length > maxLettersCount) {\n return null;\n }\n\n const abbreviate = words.map((word) => word[0]).join('');\n\n return abbreviate.match(ANY_LANGUAGE_LETTERS_REGEX) ? abbreviate : null;\n }\n\n /** @hidden */\n private _setBgImage(srcValue: Nullable<string>): void {\n this.bgImage.set(srcValue ? `url(${srcValue})` : null);\n }\n\n /** @hidden */\n private _verifyImageUrl(srcValue: string, onErrorCallback: () => void): void {\n const newBgImage = `url(${srcValue})`;\n\n // Don't load the same image if it's already loaded successfully\n if (this.bgImage() === newBgImage && this._imageLoaded()) {\n return;\n }\n\n const img = new Image();\n img.onload = () => {\n // Only set background if image loads successfully\n this._setBgImage(srcValue);\n this._imageLoaded.set(true);\n };\n img.onerror = onErrorCallback;\n img.src = srcValue;\n }\n\n /** @hidden */\n private _onErrorCallback(): void {\n const alterIconValue = this.alterIcon();\n if (!alterIconValue) {\n this._showDefaultIcon();\n return;\n }\n\n const options = alterIconValue.split('|');\n for (const option of options) {\n if (option === ALTER_ICON_OPTIONS.CONTENT) {\n const contentValue = this.content()?.nativeElement.textContent;\n if (this._trySetAbbreviation(contentValue)) {\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.ALT) {\n const altValue = this._elementRef.nativeElement.getAttribute('alt');\n if (this._trySetAbbreviation(altValue)) {\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.BACKUP) {\n const backupImageValue = this.backupImage();\n if (backupImageValue) {\n this._verifyImageUrl(backupImageValue, () => this._showDefaultIcon());\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.DEFAULT_ICON) {\n this._showDefaultIcon();\n return;\n }\n }\n\n // Fallback if no valid option matched\n this._showDefaultIcon();\n }\n\n /** @hidden Helper to try setting abbreviation from text */\n private _trySetAbbreviation(text: string | null | undefined): boolean {\n if (!text) {\n return false;\n }\n const trimmedText = text.trim();\n if (!trimmedText) {\n return false;\n }\n const abbreviation = this._generateAbbreviation(trimmedText);\n if (abbreviation) {\n this.abbreviate.set(abbreviation);\n this._setBgImage(null); // Clear background image when using abbreviation\n return true;\n }\n return false;\n }\n\n /** @hidden */\n private _showDefaultIcon(): void {\n this.abbreviate.set(null);\n this._setBgImage(null);\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(true);\n }\n}\n","@if (abbreviate()) {\n {{ abbreviate() }}\n}\n@if (zoomGlyph() || valueState()) {\n <i\n role=\"presentation\"\n class=\"fd-avatar__zoom-icon\"\n [class]=\"valueState() | fdAvatarIcon: zoomGlyph()\"\n (mousedown)=\"zoomClicked($event)\"\n >\n </i>\n}\n@if (glyph() || showDefault()) {\n <fd-icon\n class=\"fd-avatar__icon\"\n role=\"presentation\"\n [font]=\"font()\"\n [glyph]=\"glyph() || 'person-placeholder'\"\n ></fd-icon>\n}\n<div #content [style.display]=\"'none'\">\n <ng-content></ng-content>\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { AvatarComponent } from './avatar.component';\n\n/**\n * @deprecated\n * Use `AvatarComponent` import instead.\n */\n@NgModule({\n imports: [AvatarComponent],\n exports: [AvatarComponent]\n})\nexport class AvatarModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fundamental-ngx-core-avatar.mjs","sources":["../../../../libs/core/avatar/avatar-icon.pipe.ts","../../../../libs/core/avatar/tokens.ts","../../../../libs/core/avatar/avatar.component.ts","../../../../libs/core/avatar/avatar.component.html","../../../../libs/core/avatar/avatar.module.ts","../../../../libs/core/avatar/fundamental-ngx-core-avatar.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { Nullable } from '@fundamental-ngx/cdk/utils';\nimport { AvatarValueStates } from './avatar-value-states.type';\n\n@Pipe({\n name: 'fdAvatarIcon',\n pure: true,\n standalone: true\n})\nexport class AvatarIconPipe implements PipeTransform {\n /**\n * Selects appropriate Avatar icon based on Avatar Value state and fallback icon.\n */\n transform(valueState: Nullable<AvatarValueStates>, fallbackIcon: Nullable<string>): string {\n let computedIcon = '';\n if (!valueState) {\n computedIcon = fallbackIcon || '';\n }\n switch (valueState) {\n case 'positive':\n computedIcon = 'sys-enter-2';\n break;\n case 'caution':\n computedIcon = 'warning';\n break;\n case 'negative':\n computedIcon = 'error';\n break;\n case 'information':\n computedIcon = 'information';\n break;\n }\n\n return `sap-icon--${computedIcon} ${valueState ? 'fd-avatar__zoom-icon--' + valueState : ''}`;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const FD_AVATAR_COMPONENT = new InjectionToken('FdAvatarComponent');\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostAttributeToken,\n inject,\n input,\n output,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n ANY_LANGUAGE_LETTERS_REGEX,\n ColorAccent,\n getRandomColorAccent,\n Nullable,\n Size\n} from '@fundamental-ngx/cdk/utils';\nimport { FD_DEFAULT_ICON_FONT_FAMILY, IconComponent, IconFont } from '@fundamental-ngx/core/icon';\nimport { AvatarIconPipe } from './avatar-icon.pipe';\nimport { AvatarValueStates } from './avatar-value-states.type';\nimport { FD_AVATAR_COMPONENT } from './tokens';\n\nlet avatarUniqueId = 0;\n\nconst ALTER_ICON_OPTIONS = {\n CONTENT: 'content',\n ALT: 'alt',\n BACKUP: 'backup',\n DEFAULT_ICON: 'default-icon'\n};\n\nexport type IndicationColor = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;\n\n@Component({\n selector: 'fd-avatar',\n templateUrl: './avatar.component.html',\n styleUrl: './avatar.component.scss',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: FD_AVATAR_COMPONENT,\n useExisting: AvatarComponent\n }\n ],\n host: {\n '[class]': 'cssClass()',\n '[style.background-image]': 'bgImage()',\n '[attr.tabindex]': 'tabindex()',\n '[attr.id]': 'id()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledby()',\n '[attr.alt]': 'ariaLabel()',\n '[attr.role]': 'role()',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event)'\n },\n imports: [AvatarIconPipe, IconComponent]\n})\nexport class AvatarComponent {\n /** Id of the Avatar. */\n readonly id = input('fd-avatar-' + ++avatarUniqueId);\n\n /** Aria-label for Avatar. */\n readonly ariaLabel = input<string | null | undefined>(null);\n\n /** Aria-Labelledby for element describing Avatar. */\n readonly ariaLabelledby = input<string | null | undefined>(null);\n\n /** Localized text for label */\n readonly label = input<string | null | undefined>(null);\n\n /** The size of the Avatar. Options include: *xs*, *s*, *m*, *l* and *xl*. */\n readonly size = input<Size>('l');\n\n /** Font family of the icon. */\n readonly font = input<IconFont>(FD_DEFAULT_ICON_FONT_FAMILY);\n\n /** The glyph name. */\n readonly glyph = input<string | null | undefined>(null);\n\n /** The glyph name for zoom icon. */\n readonly zoomGlyph = input<string | null | undefined>(null);\n\n /** Whether to apply a circle style to the Avatar. */\n readonly circle = input(false, { transform: booleanAttribute });\n\n /** Whether the Avatar should be interactive. */\n readonly interactive = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a transparent style to the Avatar. */\n readonly transparent = input(false, { transform: booleanAttribute });\n\n /** Whether to apply background size contain style to the Avatar */\n readonly contain = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a placeholder background style to the Avatar. */\n readonly placeholder = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a tile background style to the Avatar. */\n readonly tile = input(false, { transform: booleanAttribute });\n\n /** Whether to apply a border to the Avatar. */\n readonly border = input(false, { transform: booleanAttribute });\n\n /** A number from 1 to 10 representing the background color of the Avatar.\n * This property will override the colorIndication property.\n */\n readonly colorAccent = input<ColorAccent | null | undefined>(null);\n\n /** A number from 1 to 10 representing the background color of the Avatar using the Indication Colors. */\n readonly colorIndication = input<IndicationColor | null | undefined>(null);\n\n /** Whether to apply random background color to the Avatar. */\n readonly random = input(false, { transform: booleanAttribute });\n\n /** Whether component should be focusable & clicable */\n readonly clickable = input(false, { transform: booleanAttribute });\n\n /** Value state of the Avatar. */\n readonly valueState = input<AvatarValueStates | null | undefined>(null);\n\n /** Background image resource: url or base64. */\n readonly image = input<string | null | undefined>(null);\n\n /** Backup options to use when image hasn't been loaded successfully.\n * Options separated with \"|\" symbol.\n * Possible options: content, alt, backup, default-icon\n */\n readonly alterIcon = input<string | null | undefined>(null);\n\n /** Backup image to load when image hasn't been loaded successfully.\n * Only applicable when using alterIcon input property.\n */\n readonly backupImage = input<string | null | undefined>(null);\n\n /** Event emitted when avatar clicked. Only fires if clickable input property set to true. */\n readonly avatarClicked = output<Event>();\n\n /** Event emitted when zoom icon clicked. Only fires if zoomGlyph input property is set. */\n readonly zoomGlyphClicked = output<void>();\n\n /** @hidden */\n protected readonly content = viewChild<ElementRef>('content');\n\n /** @hidden Internal state for background image */\n protected readonly bgImage = signal<string | null | undefined>(null);\n\n /** @hidden Internal state for computed abbreviation */\n protected readonly abbreviate = signal<string | null | undefined>(null);\n\n /** @hidden Computed tabindex based on clickable state */\n protected readonly tabindex = computed(() => {\n if (this._hostTabindex != null) {\n return this._hostTabindex;\n }\n return this.clickable() ? 0 : null;\n });\n\n /** @hidden Computed role attribute */\n protected readonly role = computed(() => (this.zoomGlyph() || this.clickable() ? 'button' : 'img'));\n\n /** @hidden If a default placeholder should be displayed */\n protected readonly showDefault = computed(\n () =>\n // Show default if explicitly requested OR if no content is available\n this._shouldShowDefaultIcon() ||\n (!this.abbreviate() && !this._imageLoaded() && !this.glyph() && !this.image())\n );\n\n /** @hidden Computed CSS classes */\n protected readonly cssClass = computed(() => {\n const colorAccentValue = this.colorAccent();\n const randomValue = this.random();\n const colorIndicationValue = this.colorIndication();\n\n return [\n 'fd-avatar',\n this.size() ? `fd-avatar--${this.size()}` : '',\n colorAccentValue && !randomValue ? `fd-avatar--accent-color-${colorAccentValue}` : '',\n randomValue ? `fd-avatar--accent-color-${this._randomColorAccent()}` : '',\n colorIndicationValue && colorAccentValue === null && !randomValue\n ? `fd-avatar--indication-color-${colorIndicationValue}`\n : '',\n this.circle() ? 'fd-avatar--circle' : '',\n this.border() ? 'fd-avatar--border' : '',\n this.interactive() ? 'fd-avatar--interactive' : '',\n this.transparent() ? 'fd-avatar--transparent' : '',\n this.contain() ? 'fd-avatar--background-contain' : '',\n this.placeholder() ? 'fd-avatar--placeholder' : '',\n this.tile() ? 'fd-avatar--tile' : ''\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n /** @hidden Internal state tracking if image loaded successfully */\n private readonly _imageLoaded = signal(false);\n\n /** @hidden Explicitly track when to show default icon (for failed images with no fallback) */\n private readonly _shouldShowDefaultIcon = signal(false);\n\n /** @hidden Stored random color accent to prevent regeneration */\n private readonly _randomColorAccent = signal<ColorAccent>(getRandomColorAccent());\n\n /** @hidden Track the currently loading/loaded image URL to prevent duplicate requests */\n private _currentImageUrl: string | null = null;\n\n /** @hidden Cache of successfully loaded image URLs to prevent re-requesting */\n private readonly _loadedImageCache = new Set<string>();\n\n /** @hidden */\n private readonly _elementRef = inject(ElementRef);\n\n /** @hidden */\n private readonly _hostTabindex = inject(new HostAttributeToken('tabindex'), { optional: true });\n\n /** @hidden */\n constructor() {\n // Effect to handle image changes\n effect(() => {\n const imageValue = this.image();\n if (imageValue) {\n // Only reset loaded state if the URL actually changed\n if (this._currentImageUrl !== imageValue) {\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(false); // Reset default icon flag\n this._verifyImageUrl(imageValue, this._onErrorCallback.bind(this));\n }\n // If URL is the same and already loaded, do nothing (use cache)\n } else {\n // Image input cleared\n this._currentImageUrl = null;\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(false);\n this._setBgImage(null);\n }\n });\n\n // Effect to handle label changes and compute abbreviation\n effect(() => {\n const labelValue = this.label();\n // Only generate abbreviation from label if there's no successful image\n if (labelValue && !this._imageLoaded()) {\n const abbreviation = this._generateAbbreviation(labelValue);\n this.abbreviate.set(abbreviation);\n } else if (!labelValue && !this._imageLoaded()) {\n // Clear abbreviation when label is removed (if no image)\n this.abbreviate.set(null);\n }\n });\n\n // Effect to regenerate random color when random property changes\n effect(() => {\n if (this.random()) {\n this._randomColorAccent.set(getRandomColorAccent());\n }\n });\n }\n\n /** @hidden */\n protected onClick(event: Event): void {\n if (!this.clickable()) {\n return;\n }\n\n event.preventDefault();\n\n this.avatarClicked.emit(event);\n\n if (this.zoomGlyph()) {\n this.zoomGlyphClicked.emit();\n }\n }\n\n /** @hidden */\n protected zoomClicked(event: Event): void {\n event.preventDefault();\n this._elementRef.nativeElement.focus();\n this.zoomGlyphClicked.emit();\n }\n\n /** @hidden Get the abbreviation string */\n private _generateAbbreviation(label: Nullable<string>): string | null {\n if (!label) {\n return null;\n }\n\n const maxLettersCount = 3;\n const words = label.split(' ').filter((word) => word.length > 0);\n\n if (words.length === 0 || words.length > maxLettersCount) {\n return null;\n }\n\n const abbreviate = words.map((word) => word[0]).join('');\n\n return abbreviate.match(ANY_LANGUAGE_LETTERS_REGEX) ? abbreviate : null;\n }\n\n /** @hidden */\n private _setBgImage(srcValue: Nullable<string>): void {\n this.bgImage.set(srcValue ? `url(${srcValue})` : null);\n }\n\n /** @hidden */\n private _verifyImageUrl(srcValue: string, onErrorCallback: () => void): void {\n // Check if this URL was previously loaded successfully (component-level cache)\n if (this._loadedImageCache.has(srcValue)) {\n // Image was loaded before, reuse it\n this._setBgImage(srcValue);\n this._imageLoaded.set(true);\n this._currentImageUrl = srcValue;\n return;\n }\n\n // Track the current image URL\n this._currentImageUrl = srcValue;\n\n const img = new Image();\n img.onload = () => {\n // Only set background if image loads successfully\n this._setBgImage(srcValue);\n this._imageLoaded.set(true);\n // Add to cache of successfully loaded images\n this._loadedImageCache.add(srcValue);\n };\n img.onerror = () => {\n onErrorCallback();\n };\n img.src = srcValue;\n }\n\n /** @hidden */\n private _onErrorCallback(): void {\n const alterIconValue = this.alterIcon();\n if (!alterIconValue) {\n this._showDefaultIcon();\n return;\n }\n\n const options = alterIconValue.split('|');\n for (const option of options) {\n if (option === ALTER_ICON_OPTIONS.CONTENT) {\n const contentValue = this.content()?.nativeElement.textContent;\n if (this._trySetAbbreviation(contentValue)) {\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.ALT) {\n const altValue = this._elementRef.nativeElement.getAttribute('alt');\n if (this._trySetAbbreviation(altValue)) {\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.BACKUP) {\n const backupImageValue = this.backupImage();\n if (backupImageValue) {\n this._verifyImageUrl(backupImageValue, () => this._showDefaultIcon());\n return;\n }\n } else if (option === ALTER_ICON_OPTIONS.DEFAULT_ICON) {\n this._showDefaultIcon();\n return;\n }\n }\n\n // Fallback if no valid option matched\n this._showDefaultIcon();\n }\n\n /** @hidden Helper to try setting abbreviation from text */\n private _trySetAbbreviation(text: string | null | undefined): boolean {\n if (!text) {\n return false;\n }\n const trimmedText = text.trim();\n if (!trimmedText) {\n return false;\n }\n const abbreviation = this._generateAbbreviation(trimmedText);\n if (abbreviation) {\n this.abbreviate.set(abbreviation);\n this._setBgImage(null); // Clear background image when using abbreviation\n return true;\n }\n return false;\n }\n\n /** @hidden */\n private _showDefaultIcon(): void {\n this.abbreviate.set(null);\n this._setBgImage(null);\n this._imageLoaded.set(false);\n this._shouldShowDefaultIcon.set(true);\n }\n}\n","@if (abbreviate()) {\n {{ abbreviate() }}\n}\n@if (zoomGlyph() || valueState()) {\n <i\n role=\"presentation\"\n class=\"fd-avatar__zoom-icon\"\n [class]=\"valueState() | fdAvatarIcon: zoomGlyph()\"\n (mousedown)=\"zoomClicked($event)\"\n >\n </i>\n}\n@if (glyph() || showDefault()) {\n <fd-icon\n class=\"fd-avatar__icon\"\n role=\"presentation\"\n [font]=\"font()\"\n [glyph]=\"glyph() || 'person-placeholder'\"\n ></fd-icon>\n}\n<div #content [style.display]=\"'none'\">\n <ng-content></ng-content>\n</div>\n","import { NgModule } from '@angular/core';\n\nimport { AvatarComponent } from './avatar.component';\n\n/**\n * @deprecated\n * Use `AvatarComponent` import instead.\n */\n@NgModule({\n imports: [AvatarComponent],\n exports: [AvatarComponent]\n})\nexport class AvatarModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fundamental-ngx/core",
|
|
3
|
-
"version": "0.60.
|
|
3
|
+
"version": "0.60.2",
|
|
4
4
|
"schematics": "./schematics/collection.json",
|
|
5
5
|
"ng-update": {
|
|
6
6
|
"migrations": "./schematics/migrations.json"
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"@angular/forms": "^21.0.0",
|
|
24
24
|
"@angular/platform-browser": "^21.0.0",
|
|
25
25
|
"@angular/router": "^21.0.0",
|
|
26
|
-
"@fundamental-ngx/cdk": "0.60.
|
|
27
|
-
"@fundamental-ngx/i18n": "0.60.
|
|
26
|
+
"@fundamental-ngx/cdk": "0.60.2",
|
|
27
|
+
"@fundamental-ngx/i18n": "0.60.2",
|
|
28
28
|
"@sap-theming/theming-base-content": "^11.32.0",
|
|
29
29
|
"fundamental-styles": "0.40.1",
|
|
30
30
|
"rxjs": "^7.8.0"
|
|
@@ -93,11 +93,13 @@ declare class AvatarComponent {
|
|
|
93
93
|
private readonly _shouldShowDefaultIcon;
|
|
94
94
|
/** @hidden Stored random color accent to prevent regeneration */
|
|
95
95
|
private readonly _randomColorAccent;
|
|
96
|
+
/** @hidden Track the currently loading/loaded image URL to prevent duplicate requests */
|
|
97
|
+
private _currentImageUrl;
|
|
98
|
+
/** @hidden Cache of successfully loaded image URLs to prevent re-requesting */
|
|
99
|
+
private readonly _loadedImageCache;
|
|
96
100
|
/** @hidden */
|
|
97
101
|
private readonly _elementRef;
|
|
98
102
|
/** @hidden */
|
|
99
|
-
private readonly _renderer;
|
|
100
|
-
/** @hidden */
|
|
101
103
|
private readonly _hostTabindex;
|
|
102
104
|
/** @hidden */
|
|
103
105
|
constructor();
|