File

feature-libs/product-configurator/rulebased/components/previous-next-buttons/configurator-previous-next-buttons.component.ts

Metadata

changeDetection ChangeDetectionStrategy.OnPush
selector cx-configurator-previous-next-buttons
templateUrl ./configurator-previous-next-buttons.component.html

Index

Properties
Methods

Constructor

constructor(configuratorGroupsService: ConfiguratorGroupsService, configuratorCommonsService: ConfiguratorCommonsService, configRouterExtractorService: ConfiguratorRouterExtractorService, configUtils: ConfiguratorStorefrontUtilsService)
Parameters :
Name Type Optional
configuratorGroupsService ConfiguratorGroupsService No
configuratorCommonsService ConfiguratorCommonsService No
configRouterExtractorService ConfiguratorRouterExtractorService No
configUtils ConfiguratorStorefrontUtilsService No

Methods

Protected focusFirstAttribute
focusFirstAttribute()
Returns : void
isFirstGroup
isFirstGroup(owner: CommonConfigurator.Owner)
Parameters :
Name Type Optional
owner CommonConfigurator.Owner No
Returns : Observable<boolean>
isLastGroup
isLastGroup(owner: CommonConfigurator.Owner)
Parameters :
Name Type Optional
owner CommonConfigurator.Owner No
Returns : Observable<boolean>
onNext
onNext(configuration: Configurator.Configuration)
Parameters :
Name Type Optional
configuration Configurator.Configuration No
Returns : void
onPrevious
onPrevious(configuration: Configurator.Configuration)
Parameters :
Name Type Optional
configuration Configurator.Configuration No
Returns : void

Properties

configuration$
Type : Observable<Configurator.Configuration>
Default value : this.configRouterExtractorService .extractRouterData() .pipe( switchMap((routerData) => this.configuratorCommonsService.getConfiguration(routerData.owner) ) )
import { ChangeDetectionStrategy, Component } from '@angular/core';
import {
  CommonConfigurator,
  ConfiguratorRouterExtractorService,
} from '@spartacus/product-configurator/common';
import { Observable } from 'rxjs';
import { delay, filter, map, switchMap, take } from 'rxjs/operators';
import { ConfiguratorCommonsService } from '../../core/facade/configurator-commons.service';
import { ConfiguratorGroupsService } from '../../core/facade/configurator-groups.service';
import { Configurator } from '../../core/model/configurator.model';
import { ConfiguratorStorefrontUtilsService } from '../service/configurator-storefront-utils.service';

@Component({
  selector: 'cx-configurator-previous-next-buttons',
  templateUrl: './configurator-previous-next-buttons.component.html',
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ConfiguratorPreviousNextButtonsComponent {
  configuration$: Observable<Configurator.Configuration> =
    this.configRouterExtractorService
      .extractRouterData()
      .pipe(
        switchMap((routerData) =>
          this.configuratorCommonsService.getConfiguration(routerData.owner)
        )
      );

  constructor(
    protected configuratorGroupsService: ConfiguratorGroupsService,
    protected configuratorCommonsService: ConfiguratorCommonsService,
    protected configRouterExtractorService: ConfiguratorRouterExtractorService,
    protected configUtils: ConfiguratorStorefrontUtilsService
  ) {}

  onPrevious(configuration: Configurator.Configuration): void {
    this.configuratorGroupsService
      .getPreviousGroupId(configuration.owner)
      .pipe(take(1))
      .subscribe((groupId) => {
        if (groupId) {
          this.configuratorGroupsService.navigateToGroup(
            configuration,
            groupId
          );
          this.focusFirstAttribute();
        }
      });

    this.configUtils.scrollToConfigurationElement(
      '.VariantConfigurationTemplate, .CpqConfigurationTemplate'
    );
  }

  onNext(configuration: Configurator.Configuration): void {
    this.configuratorGroupsService
      .getNextGroupId(configuration.owner)
      .pipe(take(1))
      .subscribe((groupId) => {
        if (groupId) {
          this.configuratorGroupsService.navigateToGroup(
            configuration,
            groupId
          );
          this.focusFirstAttribute();
        }
      });

    this.configUtils.scrollToConfigurationElement(
      '.VariantConfigurationTemplate, .CpqConfigurationTemplate'
    );
  }

  isFirstGroup(owner: CommonConfigurator.Owner): Observable<boolean> {
    return this.configuratorGroupsService
      .getPreviousGroupId(owner)
      .pipe(map((group) => !group));
  }

  isLastGroup(owner: CommonConfigurator.Owner): Observable<boolean> {
    return this.configuratorGroupsService
      .getNextGroupId(owner)
      .pipe(map((group) => !group));
  }

  protected focusFirstAttribute(): void {
    this.configRouterExtractorService
      .extractRouterData()
      .pipe(
        switchMap((routerData) =>
          this.configuratorCommonsService
            .isConfigurationLoading(routerData.owner)
            .pipe(
              filter((isLoading) => isLoading),
              take(1),
              switchMap(() =>
                this.configuratorCommonsService
                  .isConfigurationLoading(routerData.owner)
                  .pipe(
                    filter((isLoading) => !isLoading),
                    take(1),
                    delay(0) //we need to consider the re-rendering of the page
                  )
              )
            )
        )
      )
      .subscribe(() => this.configUtils.focusFirstAttribute());
  }
}
<ng-container *ngIf="configuration$ | async as configuration">
  <ng-container *ngIf="configuration?.groups?.length > 1">
    <button
      class="cx-btn btn btn-action"
      [disabled]="isFirstGroup(configuration.owner) | async"
      (click)="onPrevious(configuration)"
    >
      {{ 'configurator.button.previous' | cxTranslate }}
    </button>
    <button
      class="cx-btn btn btn-secondary"
      [disabled]="isLastGroup(configuration.owner) | async"
      (click)="onNext(configuration)"
    >
      {{ 'configurator.button.next' | cxTranslate }}
    </button>
  </ng-container>
</ng-container>
Legend
Html element
Component
Html element with directive

result-matching ""

    No results matching ""