File

feature-libs/checkout/components/components/schedule-replenishment-order/schedule-replenishment-order.component.ts

Implements

OnInit OnDestroy

Metadata

changeDetection ChangeDetectionStrategy.OnPush
selector cx-schedule-replenishment-order
templateUrl ./schedule-replenishment-order.component.html

Index

Properties
Methods

Constructor

constructor(checkoutService: CheckoutFacade, checkoutReplenishmentFormService: CheckoutReplenishmentFormService)
Parameters :
Name Type Optional
checkoutService CheckoutFacade No
checkoutReplenishmentFormService CheckoutReplenishmentFormService No

Methods

changeDayOfTheMonth
changeDayOfTheMonth(dayOfMonth: string)
Parameters :
Name Type Optional
dayOfMonth string No
Returns : void
changeNumberOfDays
changeNumberOfDays(nDays: string)
Parameters :
Name Type Optional
nDays string No
Returns : void
changeNumberOfWeeks
changeNumberOfWeeks(nWeeks: string)
Parameters :
Name Type Optional
nWeeks string No
Returns : void
changeOrderType
changeOrderType(orderType: ORDER_TYPE)
Parameters :
Name Type Optional
orderType ORDER_TYPE No
Returns : void
changeRecurrencePeriodType
changeRecurrencePeriodType(type: string)
Parameters :
Name Type Optional
type string No
Returns : void
changeRepeatDays
changeRepeatDays(day: DaysOfWeek, isChecked: boolean)
Parameters :
Name Type Optional
day DaysOfWeek No
isChecked boolean No
Returns : void
changeReplenishmentStartDate
changeReplenishmentStartDate(date: string)
Parameters :
Name Type Optional
date string No
Returns : void
Private createNumberStringArray
createNumberStringArray(n: number)
Parameters :
Name Type Optional
n number No
Returns : string[]
hasDaysOfWeekChecked
hasDaysOfWeekChecked(day: DaysOfWeek)
Parameters :
Name Type Optional
day DaysOfWeek No
Returns : boolean
Private initConfig
initConfig()
Returns : void
ngOnDestroy
ngOnDestroy()
Returns : void
ngOnInit
ngOnInit()
Returns : void

Properties

currentDate
Type : string | undefined
currentDaysOfWeek
Type : DaysOfWeek[]
Default value : []
daysOfWeek
Default value : Object.values(DaysOfWeek)
iconTypes
Default value : ICON_TYPE
isMonthly
Type : Boolean
Default value : false
isWeekly
Type : Boolean
Default value : false
numberOfDays
Type : string[]
numberOfWeeks
Type : string[]
orderTypes
Default value : ORDER_TYPE
recurrencePeriodType
Default value : Object.values(recurrencePeriod)
scheduleReplenishmentFormData
Type : ScheduleReplenishmentForm
selectedOrderType$
Type : Observable<ORDER_TYPE>
Default value : this.checkoutService.getCurrentOrderType()
Private subscription
Type : Subscription
Default value : new Subscription()
import {
  ChangeDetectionStrategy,
  Component,
  OnDestroy,
  OnInit,
} from '@angular/core';
import { CheckoutFacade } from '@spartacus/checkout/root';
import {
  DaysOfWeek,
  ORDER_TYPE,
  recurrencePeriod,
  ScheduleReplenishmentForm,
} from '@spartacus/core';
import { ICON_TYPE } from '@spartacus/storefront';
import { Observable, Subscription } from 'rxjs';
import { CheckoutReplenishmentFormService } from '../../services/checkout-replenishment-form-service';

@Component({
  selector: 'cx-schedule-replenishment-order',
  templateUrl: './schedule-replenishment-order.component.html',
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ScheduleReplenishmentOrderComponent implements OnInit, OnDestroy {
  private subscription: Subscription = new Subscription();

  iconTypes = ICON_TYPE;
  orderTypes = ORDER_TYPE;
  daysOfWeek = Object.values(DaysOfWeek);
  recurrencePeriodType = Object.values(recurrencePeriod);

  selectedOrderType$: Observable<ORDER_TYPE> =
    this.checkoutService.getCurrentOrderType();

  isMonthly: Boolean = false;
  isWeekly: Boolean = false;
  currentDaysOfWeek: DaysOfWeek[] = [];
  numberOfDays: string[];
  numberOfWeeks: string[];
  currentDate: string | undefined;
  scheduleReplenishmentFormData: ScheduleReplenishmentForm;

  constructor(
    protected checkoutService: CheckoutFacade,
    protected checkoutReplenishmentFormService: CheckoutReplenishmentFormService
  ) {}

  ngOnInit(): void {
    this.subscription.add(
      this.checkoutReplenishmentFormService
        .getScheduleReplenishmentFormData()
        .subscribe((data) => {
          this.scheduleReplenishmentFormData = data;
        })
    );

    this.initConfig();
  }

  changeOrderType(orderType: ORDER_TYPE): void {
    this.checkoutService.setOrderType(orderType);
  }

  changeNumberOfDays(nDays: string): void {
    this.checkoutReplenishmentFormService.setScheduleReplenishmentFormData({
      ...this.scheduleReplenishmentFormData,
      numberOfDays: nDays,
    });
  }

  changeNumberOfWeeks(nWeeks: string): void {
    this.checkoutReplenishmentFormService.setScheduleReplenishmentFormData({
      ...this.scheduleReplenishmentFormData,
      numberOfWeeks: nWeeks,
    });
  }

  changeRecurrencePeriodType(type: string): void {
    this.isWeekly = type === recurrencePeriod.WEEKLY;
    this.isMonthly = type === recurrencePeriod.MONTHLY;

    this.numberOfDays = this.isMonthly
      ? this.createNumberStringArray(31)
      : this.createNumberStringArray(30);

    this.checkoutReplenishmentFormService.setScheduleReplenishmentFormData({
      ...this.scheduleReplenishmentFormData,
      recurrencePeriod: type,
    });
  }

  changeDayOfTheMonth(dayOfMonth: string): void {
    this.checkoutReplenishmentFormService.setScheduleReplenishmentFormData({
      ...this.scheduleReplenishmentFormData,
      nthDayOfMonth: dayOfMonth,
    });
  }

  changeReplenishmentStartDate(date: string): void {
    if (Boolean(date)) {
      this.checkoutReplenishmentFormService.setScheduleReplenishmentFormData({
        ...this.scheduleReplenishmentFormData,
        replenishmentStartDate: date,
      });
    }
  }

  changeRepeatDays(day: DaysOfWeek, isChecked: boolean): void {
    if (isChecked) {
      this.currentDaysOfWeek = [...this.currentDaysOfWeek];

      this.currentDaysOfWeek.push(day);

      this.checkoutReplenishmentFormService.setScheduleReplenishmentFormData({
        ...this.scheduleReplenishmentFormData,
        daysOfWeek: this.currentDaysOfWeek,
      });
    } else {
      const foundDay = this.currentDaysOfWeek.find((data) => day === data);

      if (!foundDay) return;

      const index = this.currentDaysOfWeek.indexOf(foundDay);
      this.currentDaysOfWeek.splice(index, 1);

      this.checkoutReplenishmentFormService.setScheduleReplenishmentFormData({
        ...this.scheduleReplenishmentFormData,
        daysOfWeek: this.currentDaysOfWeek,
      });
    }
  }

  hasDaysOfWeekChecked(day: DaysOfWeek): boolean {
    return this.currentDaysOfWeek.includes(day);
  }

  private initConfig(): void {
    this.isMonthly =
      this.scheduleReplenishmentFormData.recurrencePeriod ===
      recurrencePeriod.MONTHLY;

    this.isWeekly =
      this.scheduleReplenishmentFormData.recurrencePeriod ===
      recurrencePeriod.WEEKLY;

    this.currentDaysOfWeek = [
      ...(this.scheduleReplenishmentFormData.daysOfWeek ?? []),
    ];

    this.numberOfDays = this.isMonthly
      ? this.createNumberStringArray(31)
      : this.createNumberStringArray(30);

    this.numberOfWeeks = this.createNumberStringArray(12);

    this.currentDate =
      this.scheduleReplenishmentFormData.replenishmentStartDate;
  }

  private createNumberStringArray(n: number): string[] {
    return Array(n)
      .fill(0)
      .map((_, y) => (y + 1).toString());
  }

  ngOnDestroy(): void {
    this.subscription.unsubscribe();
  }
}
<div class="cx-order-type-card">
  <div class="cx-label-container">
    <h5 class="cx-order-replenishment-header">
      {{ 'checkoutReview.autoReplenishOrder' | cxTranslate }}
    </h5>
    <cx-icon [type]="iconTypes.CLOCK"></cx-icon>
  </div>
  <div
    class="cx-order-type-container form-check"
    *ngFor="let type of orderTypes | keyvalue"
  >
    <input
      id="orderType-{{ type.value }}"
      class="scaled-input form-check-input"
      role="radio"
      type="radio"
      formControlName="orderType"
      aria-checked="true"
      (change)="changeOrderType(type.value)"
      [value]="type.value"
      [checked]="type.value == (selectedOrderType$ | async)"
    />
    <label
      class="order-type-label form-check-label form-radio-label"
      for="orderType-{{ type.value }}"
    >
      <div class="order-type">
        {{ 'checkoutReview.orderType_' + type?.value | cxTranslate }}
      </div>
    </label>
  </div>
  <ng-container
    *ngIf="
      scheduleReplenishmentFormData &&
      (selectedOrderType$ | async) === orderTypes.SCHEDULE_REPLENISHMENT_ORDER
    "
  >
    <div class="cx-replenishment-form-data-container">
      <div *ngIf="!isMonthly" class="cx-days">
        <span class="form-data-label">{{
          'checkoutReview.every' | cxTranslate
        }}</span>
        <ng-container *ngIf="isWeekly; else isDaily">
          <select
            class="form-control"
            (change)="changeNumberOfWeeks($event.target.value)"
          >
            <option
              *ngFor="let nWeeks of numberOfWeeks"
              [value]="nWeeks"
              [selected]="
                nWeeks === scheduleReplenishmentFormData.numberOfWeeks
              "
            >
              {{ nWeeks }}
            </option>
          </select>
        </ng-container>
        <ng-template #isDaily>
          <select
            class="form-control"
            (change)="changeNumberOfDays($event.target.value)"
          >
            <option
              *ngFor="let nDays of numberOfDays"
              [value]="nDays"
              [selected]="nDays === scheduleReplenishmentFormData.numberOfDays"
            >
              {{ nDays }}
            </option>
          </select>
        </ng-template>
      </div>
      <div class="cx-month">
        <span *ngIf="isMonthly" class="form-data-label">{{
          'checkoutReview.every' | cxTranslate
        }}</span>
        <select
          class="form-control"
          (change)="changeRecurrencePeriodType($event.target.value)"
        >
          <option
            *ngFor="let type of recurrencePeriodType"
            [value]="type"
            [selected]="type === scheduleReplenishmentFormData.recurrencePeriod"
          >
            {{ 'checkoutReview.recurrencePeriodType_' + type | cxTranslate }}
          </option>
        </select>
      </div>
      <div *ngIf="isMonthly" class="cx-dayMonth">
        <span class="form-data-label">{{
          'checkoutReview.dayOfMonth' | cxTranslate
        }}</span>
        <div class="cx-day-of-month">
          <select
            class="form-control"
            (change)="changeDayOfTheMonth($event.target.value)"
          >
            <option
              *ngFor="let nDays of numberOfDays"
              [value]="nDays"
              [selected]="nDays === scheduleReplenishmentFormData.nthDayOfMonth"
            >
              {{ nDays }}
            </option>
          </select>
        </div>
      </div>
    </div>

    <div class="cx-replenishment-form-data-container">
      <span class="form-data-label">{{
        'checkoutReview.startOn' | cxTranslate
      }}</span>
      <div class="cx-replenishment-date">
        <input
          type="date"
          placeholder="yyyy-mm-dd"
          [value]="currentDate"
          (change)="changeReplenishmentStartDate($event.target.value)"
        />
      </div>
    </div>

    <div
      *ngIf="isWeekly"
      class="cx-replenishment-form-data-container cx-repeat-days-container"
    >
      <span class="cx-repeat-days form-data-label">{{
        'checkoutReview.repeatOnDays' | cxTranslate
      }}</span>
      <div *ngFor="let day of daysOfWeek" class="form-check">
        <label for="day-{{ day }}" class="cx-week-day">{{
          day | titlecase
        }}</label
        ><input
          id="day-{{ day }}"
          type="checkbox"
          class="form-check-input"
          [checked]="hasDaysOfWeekChecked(day)"
          (change)="changeRepeatDays(day, $event.target.checked)"
        />
      </div>
    </div>
  </ng-container>
</div>
Legend
Html element
Component
Html element with directive

result-matching ""

    No results matching ""