feat(checkout): map editing policy to cart controls

This commit is contained in:
2026-08-20 10:56:33 -03:00
parent 00a01e1a8e
commit e1d9590905
7 changed files with 238 additions and 16 deletions

View File

@@ -6,7 +6,12 @@
<h2 class="m-0 text-uppercase fw-bold cart-title">{{ title() }}</h2>
<div class="d-flex align-items-center cart-header-actions">
@if (!readonly() && allowModify() && requireEditingMode() && items().length > 0) {
@if (
allowModify() &&
(!readonly() || showModifyWhenReadonly()) &&
requireEditingMode() &&
items().length > 0
) {
<button
class="btn btn-link p-0 border-0 cart-edit-btn"
type="button"

View File

@@ -55,10 +55,13 @@ export class CartComponent {
readonly readonly = input<boolean>(false);
readonly allowUpdateQuantity = input<boolean>(true);
readonly allowModify = input<boolean>(true);
readonly showModifyWhenReadonly = input<boolean>(false);
readonly requireEditingMode = input<boolean>(false);
readonly allowUpdateVariant = input<boolean>(true);
readonly allowDelete = input<boolean>(true);
readonly persistQuantityChanges = input<boolean>(true);
readonly persistVariantChanges = input<boolean>(true);
readonly persistDeleteChanges = input<boolean>(true);
readonly editingDisabled = input<boolean>(false);
readonly editing = model<boolean>(false);
@@ -68,6 +71,12 @@ export class CartComponent {
index: number;
quantity: number;
}>();
readonly itemVariantChange = output<{
item: CartItemMock;
index: number;
variantId: number;
}>();
readonly itemRemove = output<{ item: CartItemMock; index: number }>();
protected readonly quantityOverrides = signal<Record<number, number>>({});
protected readonly variantOverrides = signal<Record<number, number>>({});
@@ -179,6 +188,12 @@ export class CartComponent {
if (!item || !cartItemId || variantId === this.getItemVariant(item)) return;
this.itemVariantChange.emit({ item, index, variantId });
if (!this.persistVariantChanges()) {
return;
}
this.variantOverrides.update((overrides) => ({ ...overrides, [cartItemId]: variantId }));
this.cartService
.updateItemVariant(cartItemId, this.getItemQuantity(item), variantId)
@@ -221,7 +236,14 @@ export class CartComponent {
})
.subscribe((confirmed) => {
if (confirmed) {
this.removeItem(target.cartItemId);
const item = this.items()[index];
if (item) {
this.itemRemove.emit({ item, index });
}
if (this.persistDeleteChanges()) {
this.removeItem(target.cartItemId);
}
}
});
}