File
Metadata
| changeDetection |
ChangeDetectionStrategy.OnPush |
| selector |
cx-product-variant-style-selector |
| templateUrl |
./product-variant-style-selector.component.html |
Index
Properties
|
|
|
Methods
|
|
|
Inputs
|
|
|
Methods
|
changeStyle
|
changeStyle(code: string)
|
|
|
Parameters :
| Name |
Type |
Optional |
| code |
string
|
No
|
Returns : null
|
|
getVariantOptionValue
|
getVariantOptionValue(qualifiers: VariantOptionQualifier[])
|
|
|
Parameters :
| Name |
Type |
Optional |
| qualifiers |
VariantOptionQualifier[]
|
No
|
|
|
getVariantThumbnailUrl
|
getVariantThumbnailUrl(variantOptionQualifiers: VariantOptionQualifier[])
|
|
|
Parameters :
| Name |
Type |
Optional |
| variantOptionQualifiers |
VariantOptionQualifier[]
|
No
|
|
|
variantQualifier
|
Default value : VariantQualifier
|
|
|
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import {
OccConfig,
BaseOption,
VariantQualifier,
VariantOptionQualifier,
Product,
ProductService,
ProductScope,
RoutingService,
} from '@spartacus/core';
import { filter, take } from 'rxjs/operators';
@Component({
selector: 'cx-product-variant-style-selector',
templateUrl: './product-variant-style-selector.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ProductVariantStyleSelectorComponent {
constructor(
private config: OccConfig,
private productService: ProductService,
private routingService: RoutingService
) {}
variantQualifier = VariantQualifier;
@Input()
variants: BaseOption;
getVariantOptionValue(qualifiers: VariantOptionQualifier[]) {
const obj = qualifiers.find((q) => q.qualifier === VariantQualifier.STYLE);
return obj ? obj.value : '';
}
getVariantThumbnailUrl(
variantOptionQualifiers: VariantOptionQualifier[]
): string {
const qualifier = variantOptionQualifiers.find((item) => item.image);
return qualifier
? `${this.config?.backend?.occ?.baseUrl}${qualifier.image?.url}`
: '';
}
changeStyle(code: string): null {
if (code) {
this.productService
.get(code, ProductScope.LIST)
.pipe(
// below call might looks redundant but in fact this data is going to be loaded anyways
// we're just calling it earlier and storing
filter((p) => !!p),
take(1)
)
.subscribe((product: Product) => {
this.routingService.go({
cxRoute: 'product',
params: product,
});
});
}
return null;
}
}
<ng-container>
<div class="variant-selector">
<div *ngIf="variants.selected" class="variant-name">
{{ 'productVariants.style' | cxTranslate }}:
<span class="style-name">{{
getVariantOptionValue(variants?.selected.variantOptionQualifiers)
}}</span>
</div>
<ul class="variant-list">
<li
*ngFor="let v of variants?.options"
[ngClass]="{ 'selected-variant': v.code === variants?.selected?.code }"
>
<button class="variant-button" (click)="changeStyle(v.code)">
<img
src="{{ getVariantThumbnailUrl(v.variantOptionQualifiers) }}"
title="{{ getVariantOptionValue(v.variantOptionQualifiers) }}"
alt="{{ getVariantOptionValue(v.variantOptionQualifiers) }}"
/>
</button>
</li>
</ul>
</div>
</ng-container>
Legend
Html element with directive