feat: implement variant selection in cart and product components for enhanced user experience
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';
|
||||
import { QuantitySelectorComponent } from '../quantity-selector/quantity-selector.component';
|
||||
import { IconButtonComponent } from '../icon-button/icon-button.component';
|
||||
import {
|
||||
VariantSelectorComponent,
|
||||
VariantSelectorVariant,
|
||||
} from '../variant-selector/variant-selector.component';
|
||||
|
||||
export interface CartItemAttribute {
|
||||
label: string;
|
||||
@@ -10,10 +14,10 @@ export interface CartItemAttribute {
|
||||
@Component({
|
||||
selector: 'app-cart-item',
|
||||
standalone: true,
|
||||
imports: [QuantitySelectorComponent, IconButtonComponent],
|
||||
imports: [QuantitySelectorComponent, IconButtonComponent, VariantSelectorComponent],
|
||||
templateUrl: './cart-item.component.html',
|
||||
styleUrl: './cart-item.component.scss',
|
||||
changeDetection: ChangeDetectionStrategy.OnPush
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class CartItemComponent {
|
||||
readonly imageUrl = input<string | null>(null);
|
||||
@@ -22,6 +26,8 @@ export class CartItemComponent {
|
||||
readonly discountedPrice = input<number>(0);
|
||||
readonly discountPercentage = input<number | null>(null);
|
||||
readonly attributes = input<CartItemAttribute[]>([]);
|
||||
readonly variants = input<VariantSelectorVariant[]>([]);
|
||||
readonly selectedVariant = input<unknown>(null);
|
||||
readonly quantity = input<number>(1);
|
||||
readonly readonly = input<boolean>(false);
|
||||
readonly quantityDisabled = input<boolean>(false);
|
||||
@@ -31,6 +37,11 @@ export class CartItemComponent {
|
||||
readonly remove = output<void>();
|
||||
readonly increase = output<void>();
|
||||
readonly decrease = output<void>();
|
||||
readonly variantChange = output<number>();
|
||||
|
||||
protected readonly hasVariantSelectors = computed(() =>
|
||||
this.variants().some((variant) => Object.keys(variant.values).length > 0),
|
||||
);
|
||||
|
||||
protected onQuantityChange(newQuantity: number): void {
|
||||
if (this.quantityDisabled()) return;
|
||||
@@ -49,12 +60,20 @@ export class CartItemComponent {
|
||||
this.decrease.emit();
|
||||
}
|
||||
|
||||
protected onVariantChange(variant: unknown): void {
|
||||
if (!this.quantityDisabled() && typeof variant === 'number') {
|
||||
this.variantChange.emit(variant);
|
||||
}
|
||||
}
|
||||
|
||||
protected readonly formattedOriginalPrice = computed(() => {
|
||||
const price = this.originalPrice();
|
||||
return price === null ? null : this.formatCurrency(price);
|
||||
});
|
||||
|
||||
protected readonly formattedDiscountedPrice = computed(() => this.formatCurrency(this.discountedPrice()));
|
||||
protected readonly formattedDiscountedPrice = computed(() =>
|
||||
this.formatCurrency(this.discountedPrice()),
|
||||
);
|
||||
|
||||
private formatCurrency(value: number): string {
|
||||
const rounded = Math.round(value);
|
||||
|
||||
Reference in New Issue
Block a user