File
Implements
Metadata
| changeDetection |
ChangeDetectionStrategy.OnPush |
| selector |
cx-variant-style-icons |
| styleUrls |
./product-variant-style-icons.component.scss |
| templateUrl |
./product-variant-style-icons.component.html |
Index
Properties
|
|
|
Methods
|
|
|
Inputs
|
|
|
|
variants
|
Type : VariantOption[]
|
|
|
Methods
|
Private
getVariantName
|
getVariantName(variantOptionQualifiers: VariantOptionQualifier[])
|
|
|
Parameters :
| Name |
Type |
Optional |
| variantOptionQualifiers |
VariantOptionQualifier[]
|
No
|
|
|
getVariantThumbnailUrl
|
getVariantThumbnailUrl(variantOptionQualifiers: VariantOptionQualifier[])
|
|
|
Parameters :
| Name |
Type |
Optional |
| variantOptionQualifiers |
VariantOptionQualifier[]
|
No
|
|
|
ngOnDestroy
|
ngOnDestroy()
|
|
|
|
|
|
Private
setVariantsNames
|
setVariantsNames()
|
|
|
|
|
|
Readonly
product$
|
Type : Observable<Product>
|
Default value : this.productListItemContext?.product$ ?? EMPTY
|
|
|
|
Readonly
ProductListOutlets
|
Default value : ProductListOutlets
|
|
|
|
Protected
subscriptions
|
Default value : new Subscription()
|
|
|
|
variantNames
|
Type : literal type
|
Default value : {}
|
|
|
|
variants
|
Type : VariantOption[]
|
Decorators :
@Input()
|
|
|
import {
ChangeDetectionStrategy,
Component,
Input,
OnDestroy,
OnInit,
Optional,
} from '@angular/core';
import {
OccConfig,
Product,
VariantOption,
VariantOptionQualifier,
VariantQualifier,
} from '@spartacus/core';
import {
ProductListItemContext,
ProductListOutlets,
} from '@spartacus/storefront';
import { EMPTY, Observable, Subscription } from 'rxjs';
@Component({
selector: 'cx-variant-style-icons',
templateUrl: './product-variant-style-icons.component.html',
styleUrls: ['./product-variant-style-icons.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ProductVariantStyleIconsComponent implements OnInit, OnDestroy {
constructor(
private config: OccConfig,
@Optional()
protected productListItemContext?: ProductListItemContext
) {}
protected subscriptions = new Subscription();
readonly ProductListOutlets = ProductListOutlets;
readonly product$: Observable<Product> =
this.productListItemContext?.product$ ?? EMPTY;
@Input()
variants: VariantOption[];
variantNames: { [key: string]: string } = {};
ngOnInit() {
this.setVariantsNames();
this.subscriptions.add(
this.product$.subscribe((product: Product) => {
if (product.variantOptions && product.variantOptions.length) {
this.variants = product.variantOptions;
this.setVariantsNames();
}
})
);
}
private setVariantsNames() {
this.variants?.forEach((variant) => {
if (variant.code && variant.variantOptionQualifiers) {
this.variantNames[variant.code] =
this.getVariantName(variant.variantOptionQualifiers) || '';
}
});
}
getVariantThumbnailUrl(
variantOptionQualifiers: VariantOptionQualifier[]
): string {
const thumbnail = variantOptionQualifiers.find(
(item) => item.qualifier === VariantQualifier.THUMBNAIL
);
return thumbnail
? `${this.config?.backend?.occ?.baseUrl}${thumbnail.image?.url}`
: '';
}
private getVariantName(
variantOptionQualifiers: VariantOptionQualifier[]
): string | undefined {
const rollupProperty = variantOptionQualifiers.find(
(item) => item.qualifier === VariantQualifier.ROLLUP_PROPERTY
);
const property = rollupProperty
? variantOptionQualifiers.find(
(item) => item.qualifier === rollupProperty.value
)
: null;
return property ? property.value : '';
}
ngOnDestroy(): void {
this.subscriptions.unsubscribe();
}
}
<ul class="variant-list" *ngIf="variants && variants.length">
<li *ngFor="let v of variants">
<img
[attr.src]="getVariantThumbnailUrl(v.variantOptionQualifiers)"
[attr.title]="variantNames[v.code]"
[attr.alt]="variantNames[v.code]"
/>
</li>
</ul>
ul {
padding: 0;
white-space: nowrap;
overflow: hidden;
li {
display: inline;
img {
width: 50px;
}
}
}
Legend
Html element with directive