feature-libs/checkout/components/components/schedule-replenishment-order/schedule-replenishment-order.component.ts
| changeDetection | ChangeDetectionStrategy.OnPush |
| selector | cx-schedule-replenishment-order |
| templateUrl | ./schedule-replenishment-order.component.html |
Properties |
Methods |
constructor(checkoutService: CheckoutFacade, checkoutReplenishmentFormService: CheckoutReplenishmentFormService)
|
|||||||||
|
Parameters :
|
| changeDayOfTheMonth | ||||||
changeDayOfTheMonth(dayOfMonth: string)
|
||||||
|
Parameters :
Returns :
void
|
| changeNumberOfDays | ||||||
changeNumberOfDays(nDays: string)
|
||||||
|
Parameters :
Returns :
void
|
| changeNumberOfWeeks | ||||||
changeNumberOfWeeks(nWeeks: string)
|
||||||
|
Parameters :
Returns :
void
|
| changeOrderType | ||||||
changeOrderType(orderType: ORDER_TYPE)
|
||||||
|
Parameters :
Returns :
void
|
| changeRecurrencePeriodType | ||||||
changeRecurrencePeriodType(type: string)
|
||||||
|
Parameters :
Returns :
void
|
| changeRepeatDays | |||||||||
changeRepeatDays(day: DaysOfWeek, isChecked: boolean)
|
|||||||||
|
Parameters :
Returns :
void
|
| changeReplenishmentStartDate | ||||||
changeReplenishmentStartDate(date: string)
|
||||||
|
Parameters :
Returns :
void
|
| Private createNumberStringArray | ||||||
createNumberStringArray(n: number)
|
||||||
|
Parameters :
Returns :
string[]
|
| hasDaysOfWeekChecked | ||||||
hasDaysOfWeekChecked(day: DaysOfWeek)
|
||||||
|
Parameters :
Returns :
boolean
|
| Private initConfig |
initConfig()
|
|
Returns :
void
|
| ngOnDestroy |
ngOnDestroy()
|
|
Returns :
void
|
| ngOnInit |
ngOnInit()
|
|
Returns :
void
|
| 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>