File

feature-libs/product/variants/root/components/variant-style-icons/product-variant-style-icons.component.ts

Implements

OnInit OnDestroy

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

Constructor

constructor(config: OccConfig, productListItemContext?: ProductListItemContext)
Parameters :
Name Type Optional
config OccConfig No
productListItemContext ProductListItemContext Yes

Inputs

variants
Type : VariantOption[]

Methods

Private getVariantName
getVariantName(variantOptionQualifiers: VariantOptionQualifier[])
Parameters :
Name Type Optional
variantOptionQualifiers VariantOptionQualifier[] No
Returns : string | undefined
getVariantThumbnailUrl
getVariantThumbnailUrl(variantOptionQualifiers: VariantOptionQualifier[])
Parameters :
Name Type Optional
variantOptionQualifiers VariantOptionQualifier[] No
Returns : string
ngOnDestroy
ngOnDestroy()
Returns : void
ngOnInit
ngOnInit()
Returns : void
Private setVariantsNames
setVariantsNames()
Returns : void

Properties

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>

./product-variant-style-icons.component.scss

ul {
  padding: 0;
  white-space: nowrap;
  overflow: hidden;
  li {
    display: inline;
    img {
      width: 50px;
    }
  }
}
Legend
Html element
Component
Html element with directive

result-matching ""

    No results matching ""