ng-easycommerce-v18 0.3.12-beta.1 → 0.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/esm2022/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.mjs +5 -1
- package/esm2022/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.mjs +5 -1
- package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +6 -2
- package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +24 -2
- package/esm2022/lib/ec-components/product-ec/product-ec.component.mjs +95 -5
- package/fesm2022/ng-easycommerce-v18.mjs +125 -3
- package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
- package/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.d.ts +2 -0
- package/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.d.ts +2 -0
- package/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.d.ts +5 -0
- package/lib/ec-components/header-ec/header-ec.component.d.ts +5 -0
- package/lib/ec-components/product-ec/product-ec.component.d.ts +10 -1
- package/package.json +1 -1
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { Component, EventEmitter, inject, Input, Output, Injector } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, inject, Input, Output, Injector, signal, } from '@angular/core';
|
|
2
2
|
import { CoreConstantsService } from '../../constants';
|
|
3
|
-
import { AnalyticsService, ChannelService, AuthService } from '../../ec-services';
|
|
3
|
+
import { AnalyticsService, ChannelService, AuthService, CartService, ToastService } from '../../ec-services';
|
|
4
4
|
import { Router, RouterLink } from '@angular/router';
|
|
5
5
|
import { CommonModule } from '@angular/common';
|
|
6
6
|
import { PriceEcComponent } from "../widgets-ec/price-ec/price-ec.component";
|
|
7
7
|
import { TranslateModule } from '@ngx-translate/core';
|
|
8
|
+
import { FormsModule } from '@angular/forms';
|
|
8
9
|
import * as i0 from "@angular/core";
|
|
9
10
|
import * as i1 from "@angular/common";
|
|
10
11
|
import * as i2 from "@ngx-translate/core";
|
|
@@ -15,6 +16,10 @@ import * as i2 from "@ngx-translate/core";
|
|
|
15
16
|
export class ProductEcComponent {
|
|
16
17
|
injector = inject(Injector);
|
|
17
18
|
routerService = inject(Router);
|
|
19
|
+
_cartService = inject(CartService);
|
|
20
|
+
_toastService = inject(ToastService);
|
|
21
|
+
isAddingToCart = signal(false);
|
|
22
|
+
quantity = signal(1);
|
|
18
23
|
/**
|
|
19
24
|
* Navega al detalle del producto y sube al inicio de la página
|
|
20
25
|
* @param productId ID del producto
|
|
@@ -87,12 +92,97 @@ export class ProductEcComponent {
|
|
|
87
92
|
const discount = ((originalPrice - salePrice) / originalPrice) * 100;
|
|
88
93
|
return Math.round(discount);
|
|
89
94
|
}
|
|
95
|
+
plus(stock, multipleQuantity) {
|
|
96
|
+
console.log('Aumentando cantidad');
|
|
97
|
+
const current = Number(this.quantity()); // <-- fuerza a número
|
|
98
|
+
if (multipleQuantity && multipleQuantity > 0) {
|
|
99
|
+
stock
|
|
100
|
+
? (current < stock
|
|
101
|
+
? this.quantity.set(current + multipleQuantity)
|
|
102
|
+
: this._toastService.show('out-of-stock-actually'))
|
|
103
|
+
: this.quantity.set(current + multipleQuantity);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
stock
|
|
107
|
+
? (current < stock
|
|
108
|
+
? this.quantity.set(current + 1)
|
|
109
|
+
: this._toastService.show('out-of-stock-actually'))
|
|
110
|
+
: this.quantity.set(current + 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
less(multipleQuantity) {
|
|
114
|
+
console.log('Disminuyendo cantidad');
|
|
115
|
+
const current = Number(this.quantity()); // <-- fuerza a número
|
|
116
|
+
if (multipleQuantity && multipleQuantity > 0) {
|
|
117
|
+
current > multipleQuantity
|
|
118
|
+
? this.quantity.set(current - multipleQuantity)
|
|
119
|
+
: null;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
current > 1 ? this.quantity.set(current - 1) : null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
addToCart() {
|
|
126
|
+
console.log('Añadiendo al carrito');
|
|
127
|
+
if (this.isAddingToCart() || this.quantity() <= 0)
|
|
128
|
+
return;
|
|
129
|
+
// Verificar que tenemos el producto y sus variantes
|
|
130
|
+
if (!this.product || !this.product.variants || this.product.variants.length === 0) {
|
|
131
|
+
this._toastService.show('cant-buy');
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// Verificar stock
|
|
135
|
+
const firstVariant = this.product.variants[0];
|
|
136
|
+
if (!firstVariant.stock || firstVariant.stock <= 0) {
|
|
137
|
+
this._toastService.show('out-of-stock');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Verificar que no se supere el stock disponible
|
|
141
|
+
if (this.quantity() > firstVariant.stock) {
|
|
142
|
+
this._toastService.show('out-of-stock-actually');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.isAddingToCart.set(true);
|
|
146
|
+
try {
|
|
147
|
+
// Agregar al carrito usando CartService directamente
|
|
148
|
+
this._cartService.addToCart(this.product, this.quantity(), firstVariant.code);
|
|
149
|
+
console.log('Producto agregado al carrito exitosamente');
|
|
150
|
+
// Resetear cantidad a 1 después de agregar al carrito
|
|
151
|
+
this.quantity.set(1);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Error al agregar al carrito:', error);
|
|
155
|
+
this._toastService.show('cant-buy');
|
|
156
|
+
}
|
|
157
|
+
setTimeout(() => {
|
|
158
|
+
this.isAddingToCart.set(false);
|
|
159
|
+
}, 2000);
|
|
160
|
+
}
|
|
161
|
+
checkStock(stock) {
|
|
162
|
+
if (this.quantity() >= stock)
|
|
163
|
+
this.quantity.set(stock);
|
|
164
|
+
}
|
|
165
|
+
onQuantityChange(event) {
|
|
166
|
+
const target = event.target;
|
|
167
|
+
const value = +target.value;
|
|
168
|
+
// Validar que el valor sea mayor a 0
|
|
169
|
+
if (value > 0) {
|
|
170
|
+
this.quantity.set(value);
|
|
171
|
+
// Validar contra el stock disponible
|
|
172
|
+
const maxStock = this.product?.variants?.[0]?.stock || this.product?.stock || 0;
|
|
173
|
+
this.checkStock(maxStock);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Si el valor es 0 o negativo, resetear a 1
|
|
177
|
+
this.quantity.set(1);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
90
180
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
91
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ProductEcComponent, isStandalone: true, selector: "app-product-ec", inputs: { product: "product", isProductBox: "isProductBox", isCollection: "isCollection" }, outputs: { loaded: "loaded" }, ngImport: i0, template: "<a [routerLink]=\"['/product', product.id]\" class=\"text-decoration-none producto\">\r\n <!-- Marca especial y descuento -->\r\n <!-- <div *ngIf=\"product.saleprice || (product.special_mark && product.special_mark !== null && product.special_mark !== undefined && product.special_mark.length >0)\"\r\n class=\"marcas\">\r\n <div *ecProductStock=\"product\" [ecProductMini]=\"product.special_mark\"></div>\r\n <ng-container *ngIf=\"shouldShowPrice\">\r\n <div *ecProductStock=\"product\" [ngClass]=\"{'tag-dsc float-right': product.saleprice}\"\r\n [ecProductOff]=\"product\">\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <!-- Imagen del producto -->\r\n <div class=\"foto\">\r\n @if(product.picturesdefault){\r\n @if (product.picturesdefault && product.picturesdefault.length > 1 ) {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n <img [src]=\"mediaUrl + product.picturesdefault[1]\" alt=\"Imagen secundaria\" class=\"w-100 pic02\" />\r\n } @else {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n }\r\n }\r\n </div>\r\n <!-- Precio -->\r\n\r\n\r\n <!-- Nombre del producto -->\r\n <h6 class=\"title\">{{ product.name | titlecase }}</h6>\r\n\r\n <div class=\"sku\" [innerHTML]=\"product.shortdetails\"></div>\r\n\r\n @if (shouldShowPrice) {\r\n <app-price-ec [price]=\"product.price\" [saleprice]=\"product.saleprice\" class=\"\" />\r\n }\r\n @if(!hidePrices){\r\n @if(!showPricesOnlyToLoggedUsers || isAuthenticated$){\r\n\r\n <div class=\"fixBottom\">\r\n\r\n <!-- Bot\u00F3n de acciones -->\r\n <!-- <ng-container *ecProductStock=\"product; else noStock\"> -->\r\n <!-- Cuando no tiene marca especial o es de tipo 'standard' -->\r\n @if (!product.special_mark || product.special_mark.length === 0 || product.special_mark[0]?.type ===\r\n 'standard') {\r\n <button class=\"btn standard\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n <ng-container *ngIf=\"isCollection; else normalText\">\r\n <span> {{(\"buy\" | translate) | uppercase}} </span>\r\n </ng-container>\r\n <ng-template #normalText>\r\n {{(\"buy\" | translate) | uppercase}}\r\n </ng-template>\r\n </button>\r\n }@else {\r\n <!-- Caso 1: Agotado o Disponible muy pronto -->\r\n @if (product.special_mark[0]?.type === 'out_of_stock' || product.special_mark[0]?.type === 'coming_soon') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0].name | uppercase }} </span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>}\r\n <!-- Caso 2: Contacto por WhatsApp -->\r\n @if (product.special_mark[0].type === 'whatsapp_contact') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\"\r\n (click)=\"openWhatsApp(product.special_mark[0]?.whatsappContact)\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n\r\n </button>\r\n }\r\n <!-- Caso 3: Solicitar m\u00E1s informaci\u00F3n -->\r\n @if (product.special_mark[0]?.type === 'more_info') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }}\r\n</a>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "component", type: PriceEcComponent, selector: "app-price-ec", inputs: ["price", "saleprice", "basePrice", "taxeAmount", "taxes", "priceSize", "showTaxLegendOnly", "disableTaxInfo", "customPriceTemplate", "customSalePriceTemplate", "customSimplePriceTemplate", "customSimpleSalePriceTemplate", "customTaxTemplate", "customOnlyTaxLabelTemplate"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
|
|
181
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ProductEcComponent, isStandalone: true, selector: "app-product-ec", inputs: { product: "product", isProductBox: "isProductBox", isCollection: "isCollection" }, outputs: { loaded: "loaded" }, ngImport: i0, template: "<a [routerLink]=\"['/product', product.id]\" class=\"text-decoration-none producto\">\r\n <!-- Marca especial y descuento -->\r\n <!-- <div *ngIf=\"product.saleprice || (product.special_mark && product.special_mark !== null && product.special_mark !== undefined && product.special_mark.length >0)\"\r\n class=\"marcas\">\r\n <div *ecProductStock=\"product\" [ecProductMini]=\"product.special_mark\"></div>\r\n <ng-container *ngIf=\"shouldShowPrice\">\r\n <div *ecProductStock=\"product\" [ngClass]=\"{'tag-dsc float-right': product.saleprice}\"\r\n [ecProductOff]=\"product\">\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <!-- Imagen del producto -->\r\n <div class=\"foto\">\r\n @if(product.picturesdefault){\r\n @if (product.picturesdefault && product.picturesdefault.length > 1 ) {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n <img [src]=\"mediaUrl + product.picturesdefault[1]\" alt=\"Imagen secundaria\" class=\"w-100 pic02\" />\r\n } @else {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n }\r\n }\r\n </div>\r\n <!-- Precio -->\r\n\r\n\r\n <!-- Nombre del producto -->\r\n <h6 class=\"title\">{{ product.name | titlecase }}</h6>\r\n\r\n <div class=\"sku\" [innerHTML]=\"product.shortdetails\"></div>\r\n\r\n @if (shouldShowPrice) {\r\n <app-price-ec [price]=\"product.price\" [saleprice]=\"product.saleprice\" class=\"\" />\r\n }\r\n @if(!hidePrices){\r\n @if(!showPricesOnlyToLoggedUsers || isAuthenticated$){\r\n\r\n <div class=\"fixBottom\">\r\n\r\n <!-- Bot\u00F3n de acciones -->\r\n <!-- <ng-container *ecProductStock=\"product; else noStock\"> -->\r\n <!-- Cuando no tiene marca especial o es de tipo 'standard' -->\r\n @if (!product.special_mark || product.special_mark.length === 0 || product.special_mark[0]?.type ===\r\n 'standard') {\r\n <button class=\"btn standard\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n <ng-container *ngIf=\"isCollection; else normalText\">\r\n <span> {{(\"buy\" | translate) | uppercase}} </span>\r\n </ng-container>\r\n <ng-template #normalText>\r\n {{(\"buy\" | translate) | uppercase}}\r\n </ng-template>\r\n </button>\r\n }@else {\r\n <!-- Caso 1: Agotado o Disponible muy pronto -->\r\n @if (product.special_mark[0]?.type === 'out_of_stock' || product.special_mark[0]?.type === 'coming_soon') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0].name | uppercase }} </span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>}\r\n <!-- Caso 2: Contacto por WhatsApp -->\r\n @if (product.special_mark[0].type === 'whatsapp_contact') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\"\r\n (click)=\"openWhatsApp(product.special_mark[0]?.whatsappContact)\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n\r\n </button>\r\n }\r\n <!-- Caso 3: Solicitar m\u00E1s informaci\u00F3n -->\r\n @if (product.special_mark[0]?.type === 'more_info') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }}\r\n</a>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "component", type: PriceEcComponent, selector: "app-price-ec", inputs: ["price", "saleprice", "basePrice", "taxeAmount", "taxes", "priceSize", "showTaxLegendOnly", "disableTaxInfo", "customPriceTemplate", "customSalePriceTemplate", "customSimplePriceTemplate", "customSimpleSalePriceTemplate", "customTaxTemplate", "customOnlyTaxLabelTemplate"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }] });
|
|
92
182
|
}
|
|
93
183
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductEcComponent, decorators: [{
|
|
94
184
|
type: Component,
|
|
95
|
-
args: [{ selector: 'app-product-ec', standalone: true, imports: [CommonModule, PriceEcComponent, RouterLink, TranslateModule], template: "<a [routerLink]=\"['/product', product.id]\" class=\"text-decoration-none producto\">\r\n <!-- Marca especial y descuento -->\r\n <!-- <div *ngIf=\"product.saleprice || (product.special_mark && product.special_mark !== null && product.special_mark !== undefined && product.special_mark.length >0)\"\r\n class=\"marcas\">\r\n <div *ecProductStock=\"product\" [ecProductMini]=\"product.special_mark\"></div>\r\n <ng-container *ngIf=\"shouldShowPrice\">\r\n <div *ecProductStock=\"product\" [ngClass]=\"{'tag-dsc float-right': product.saleprice}\"\r\n [ecProductOff]=\"product\">\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <!-- Imagen del producto -->\r\n <div class=\"foto\">\r\n @if(product.picturesdefault){\r\n @if (product.picturesdefault && product.picturesdefault.length > 1 ) {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n <img [src]=\"mediaUrl + product.picturesdefault[1]\" alt=\"Imagen secundaria\" class=\"w-100 pic02\" />\r\n } @else {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n }\r\n }\r\n </div>\r\n <!-- Precio -->\r\n\r\n\r\n <!-- Nombre del producto -->\r\n <h6 class=\"title\">{{ product.name | titlecase }}</h6>\r\n\r\n <div class=\"sku\" [innerHTML]=\"product.shortdetails\"></div>\r\n\r\n @if (shouldShowPrice) {\r\n <app-price-ec [price]=\"product.price\" [saleprice]=\"product.saleprice\" class=\"\" />\r\n }\r\n @if(!hidePrices){\r\n @if(!showPricesOnlyToLoggedUsers || isAuthenticated$){\r\n\r\n <div class=\"fixBottom\">\r\n\r\n <!-- Bot\u00F3n de acciones -->\r\n <!-- <ng-container *ecProductStock=\"product; else noStock\"> -->\r\n <!-- Cuando no tiene marca especial o es de tipo 'standard' -->\r\n @if (!product.special_mark || product.special_mark.length === 0 || product.special_mark[0]?.type ===\r\n 'standard') {\r\n <button class=\"btn standard\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n <ng-container *ngIf=\"isCollection; else normalText\">\r\n <span> {{(\"buy\" | translate) | uppercase}} </span>\r\n </ng-container>\r\n <ng-template #normalText>\r\n {{(\"buy\" | translate) | uppercase}}\r\n </ng-template>\r\n </button>\r\n }@else {\r\n <!-- Caso 1: Agotado o Disponible muy pronto -->\r\n @if (product.special_mark[0]?.type === 'out_of_stock' || product.special_mark[0]?.type === 'coming_soon') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0].name | uppercase }} </span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>}\r\n <!-- Caso 2: Contacto por WhatsApp -->\r\n @if (product.special_mark[0].type === 'whatsapp_contact') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\"\r\n (click)=\"openWhatsApp(product.special_mark[0]?.whatsappContact)\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n\r\n </button>\r\n }\r\n <!-- Caso 3: Solicitar m\u00E1s informaci\u00F3n -->\r\n @if (product.special_mark[0]?.type === 'more_info') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }}\r\n</a>" }]
|
|
185
|
+
args: [{ selector: 'app-product-ec', standalone: true, imports: [CommonModule, PriceEcComponent, RouterLink, TranslateModule, FormsModule], template: "<a [routerLink]=\"['/product', product.id]\" class=\"text-decoration-none producto\">\r\n <!-- Marca especial y descuento -->\r\n <!-- <div *ngIf=\"product.saleprice || (product.special_mark && product.special_mark !== null && product.special_mark !== undefined && product.special_mark.length >0)\"\r\n class=\"marcas\">\r\n <div *ecProductStock=\"product\" [ecProductMini]=\"product.special_mark\"></div>\r\n <ng-container *ngIf=\"shouldShowPrice\">\r\n <div *ecProductStock=\"product\" [ngClass]=\"{'tag-dsc float-right': product.saleprice}\"\r\n [ecProductOff]=\"product\">\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <!-- Imagen del producto -->\r\n <div class=\"foto\">\r\n @if(product.picturesdefault){\r\n @if (product.picturesdefault && product.picturesdefault.length > 1 ) {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n <img [src]=\"mediaUrl + product.picturesdefault[1]\" alt=\"Imagen secundaria\" class=\"w-100 pic02\" />\r\n } @else {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n }\r\n }\r\n </div>\r\n <!-- Precio -->\r\n\r\n\r\n <!-- Nombre del producto -->\r\n <h6 class=\"title\">{{ product.name | titlecase }}</h6>\r\n\r\n <div class=\"sku\" [innerHTML]=\"product.shortdetails\"></div>\r\n\r\n @if (shouldShowPrice) {\r\n <app-price-ec [price]=\"product.price\" [saleprice]=\"product.saleprice\" class=\"\" />\r\n }\r\n @if(!hidePrices){\r\n @if(!showPricesOnlyToLoggedUsers || isAuthenticated$){\r\n\r\n <div class=\"fixBottom\">\r\n\r\n <!-- Bot\u00F3n de acciones -->\r\n <!-- <ng-container *ecProductStock=\"product; else noStock\"> -->\r\n <!-- Cuando no tiene marca especial o es de tipo 'standard' -->\r\n @if (!product.special_mark || product.special_mark.length === 0 || product.special_mark[0]?.type ===\r\n 'standard') {\r\n <button class=\"btn standard\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n <ng-container *ngIf=\"isCollection; else normalText\">\r\n <span> {{(\"buy\" | translate) | uppercase}} </span>\r\n </ng-container>\r\n <ng-template #normalText>\r\n {{(\"buy\" | translate) | uppercase}}\r\n </ng-template>\r\n </button>\r\n }@else {\r\n <!-- Caso 1: Agotado o Disponible muy pronto -->\r\n @if (product.special_mark[0]?.type === 'out_of_stock' || product.special_mark[0]?.type === 'coming_soon') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0].name | uppercase }} </span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>}\r\n <!-- Caso 2: Contacto por WhatsApp -->\r\n @if (product.special_mark[0].type === 'whatsapp_contact') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\"\r\n (click)=\"openWhatsApp(product.special_mark[0]?.whatsappContact)\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n\r\n </button>\r\n }\r\n <!-- Caso 3: Solicitar m\u00E1s informaci\u00F3n -->\r\n @if (product.special_mark[0]?.type === 'more_info') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }}\r\n</a>" }]
|
|
96
186
|
}], ctorParameters: () => [], propDecorators: { product: [{
|
|
97
187
|
type: Input,
|
|
98
188
|
args: [{
|
|
@@ -105,4 +195,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
105
195
|
}], isCollection: [{
|
|
106
196
|
type: Input
|
|
107
197
|
}] } });
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9wcm9kdWN0LWVjL3Byb2R1Y3QtZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvcHJvZHVjdC1lYy9wcm9kdWN0LWVjLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUN0RDs7O0dBR0c7QUFRSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3ZCLFFBQVEsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV2Qzs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxTQUFpQjtRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsRUFB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YixDQUFDO1FBRUQsc0ZBQXNGO1FBQ3RGLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRXJFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDO3dHQTNGVyxrQkFBa0I7NEZBQWxCLGtCQUFrQixxTUNuQi9CLCtpSUF1RkkseUREeEVPLFlBQVksMlZBQUUsZ0JBQWdCLG9WQUFFLFVBQVUsbU9BQUUsZUFBZTs7NEZBSXpELGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDQyxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQzt3REE4QnRFLE9BQU87c0JBSE4sS0FBSzt1QkFBQzt3QkFDTixRQUFRLEVBQUUsSUFBSTtxQkFDZDtnQkFLUSxZQUFZO3NCQUFwQixLQUFLO2dCQUlJLE1BQU07c0JBQWYsTUFBTTtnQkFFRSxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IENvcmVDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSwgQ2hhbm5lbFNlcnZpY2UsIEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZWMtc2VydmljZXMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBQcmljZUVjQ29tcG9uZW50IH0gZnJvbSBcIi4uL3dpZGdldHMtZWMvcHJpY2UtZWMvcHJpY2UtZWMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG4vKipcclxuICogQ29tcG9uZW50ZSBxdWUgc2UgZW5jYXJnYSBkZSBtYW5lamFyIHVuIHByb2R1Y3RvLlxyXG4gKiBAY2xhc3MgUHJvZHVjdEVjQ29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2FwcC1wcm9kdWN0LWVjJyxcclxuXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFByaWNlRWNDb21wb25lbnQsIFJvdXRlckxpbmssIFRyYW5zbGF0ZU1vZHVsZV0sXHJcblx0dGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3QtZWMuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsOiAnLi9wcm9kdWN0LWVjLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvZHVjdEVjQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHRwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuXHRwcml2YXRlIHJvdXRlclNlcnZpY2UgPSBpbmplY3QoUm91dGVyKTtcclxuXHJcblx0LyoqXHJcblx0ICogTmF2ZWdhIGFsIGRldGFsbGUgZGVsIHByb2R1Y3RvIHkgc3ViZSBhbCBpbmljaW8gZGUgbGEgcMOhZ2luYVxyXG5cdCAqIEBwYXJhbSBwcm9kdWN0SWQgSUQgZGVsIHByb2R1Y3RvXHJcblx0ICovXHJcblx0bmF2aWdhdGVUb1Byb2R1Y3QocHJvZHVjdElkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdHRoaXMucm91dGVyU2VydmljZS5uYXZpZ2F0ZShbJy9wcm9kdWN0JywgcHJvZHVjdElkXSkudGhlbigoKSA9PiB7XHJcblx0XHRcdC8vIFNjcm9sbCBzdWF2ZSBhbCBpbmljaW8gZGUgbGEgcMOhZ2luYVxyXG5cdFx0XHR3aW5kb3cuc2Nyb2xsVG8oe1xyXG5cdFx0XHRcdHRvcDogMCxcclxuXHRcdFx0XHRsZWZ0OiAwLFxyXG5cdFx0XHRcdGJlaGF2aW9yOiAnc21vb3RoJ1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdG9zIGRlbCBwcm9kdWN0by5cclxuXHQgKi9cclxuXHRASW5wdXQoe1xyXG5cdFx0cmVxdWlyZWQ6IHRydWVcclxuXHR9KVxyXG5cdHByb2R1Y3QhOiBQcm9kdWN0O1xyXG5cdC8qKlxyXG5cdCAqIFNlIHVzYSBwYXJhIHNhYmVyIHNpIGVsIHByb2R1Y3RvIGVzIGRlIHRpcG8gQm94IG8gbm8geSBkZWZpbmlyIGxhIHZpc3RhIGFkZWN1YWRhLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIGlzUHJvZHVjdEJveDogYm9vbGVhbiA9IHRydWU7XHJcblx0LyoqXHJcblx0ICogQ29uc3RhbnRlcyBkZWwgY29yZVxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKSBsb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcblx0QElucHV0KCkgaXNDb2xsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5sb2FkZWQuZW1pdCh0aGlzLnByb2R1Y3QuaWQpO1xyXG5cclxuXHR9XHJcblx0cHVibGljIHNob3dQcmljZXNPbmx5VG9Mb2dnZWRVc2VyczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHB1YmxpYyBoaWRlUHJpY2VzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdHByaXZhdGUgX2F1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSA9IGluamVjdChBdXRoU2VydmljZSlcclxuXHRwdWJsaWMgaXNBdXRoZW50aWNhdGVkJCA9IHRoaXMuX2F1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0dGhpcy5pbmplY3Rvci5nZXQoQ2hhbm5lbFNlcnZpY2UpLmNoYW5uZWwkLnN1YnNjcmliZShjaGFubmVsID0+IHtcclxuXHRcdFx0dGhpcy5zaG93UHJpY2VzT25seVRvTG9nZ2VkVXNlcnMgPSAhIWNoYW5uZWwuc2hvd1ByaWNlc09ubHlUb0xvZ2dlZFVzZXJzO1xyXG5cdFx0XHR0aGlzLmhpZGVQcmljZXMgPSAhIWNoYW5uZWwuaGlkZVByaWNlcztcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRwcml2YXRlIGNvbnN0czogQ29yZUNvbnN0YW50c1NlcnZpY2UgPSBpbmplY3QoQ29yZUNvbnN0YW50c1NlcnZpY2UpXHJcblx0cHJpdmF0ZSBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlID0gaW5qZWN0KEFuYWx5dGljc1NlcnZpY2UpXHJcblx0cHJpdmF0ZSByb3V0ZXI6IFJvdXRlciA9IGluamVjdChSb3V0ZXIpXHJcblx0LyoqXHJcblx0ICogVVJMIHBhcmEgbGFzIGltYWdlbmVzIGRlbCBwcm9kdWN0by5cclxuXHQgKi9cclxuXHRwdWJsaWMgbWVkaWFVcmw6IHN0cmluZyA9IHRoaXMuY29uc3RzLm1lZGlhVXJsKClcclxuXHRvcGVuV2hhdHNBcHAodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdGlmICh1cmwpIHtcclxuXHRcdFx0d2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRnZXQgc2hvdWxkU2hvd1ByaWNlKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuICF0aGlzLnByb2R1Y3Q/LnNwZWNpYWxfbWFyayB8fCB0aGlzLnByb2R1Y3Quc3BlY2lhbF9tYXJrLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdPy5zaG93UHJpY2U7XHJcblx0fVxyXG5cclxuXHRnZXQgaGFzRGlzY291bnQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5wcm9kdWN0LnNhbGVwcmljZSAmJiB0aGlzLnByb2R1Y3Quc2FsZXByaWNlICE9PSB0aGlzLnByb2R1Y3QucHJpY2U7XHJcblx0fVxyXG5cclxuXHRnZXQgZGlzY291bnRQZXJjZW50YWdlKCk6IG51bWJlciB8IG51bGwge1xyXG5cdFx0aWYgKCF0aGlzLmhhc0Rpc2NvdW50KSB7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG9yaWdpbmFsUHJpY2UgPSBwYXJzZUZsb2F0KHRoaXMucHJvZHVjdC5wcmljZT8udG9TdHJpbmcoKSB8fCAnMCcpO1xyXG5cdFx0Y29uc3Qgc2FsZVByaWNlID0gcGFyc2VGbG9hdCh0aGlzLnByb2R1Y3Quc2FsZXByaWNlPy50b1N0cmluZygpIHx8ICcwJyk7XHJcblxyXG5cdFx0Ly8gVmFsaWRhciBxdWUgbG9zIHByZWNpb3Mgc2VhbiB2w6FsaWRvc1xyXG5cdFx0aWYgKG9yaWdpbmFsUHJpY2UgPD0gMCB8fCBzYWxlUHJpY2UgPD0gMCB8fCBzYWxlUHJpY2UgPj0gb3JpZ2luYWxQcmljZSkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDYWxjdWxhciBlbCBwb3JjZW50YWplOiAoKHByZWNpb19vcmlnaW5hbCAtIHByZWNpb19vZmVydGEpIC8gcHJlY2lvX29yaWdpbmFsKSAqIDEwMFxyXG5cdFx0Y29uc3QgZGlzY291bnQgPSAoKG9yaWdpbmFsUHJpY2UgLSBzYWxlUHJpY2UpIC8gb3JpZ2luYWxQcmljZSkgKiAxMDA7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGgucm91bmQoZGlzY291bnQpO1xyXG5cdH1cclxufVxyXG4iLCI8YSBbcm91dGVyTGlua109XCJbJy9wcm9kdWN0JywgcHJvZHVjdC5pZF1cIiBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi1ub25lIHByb2R1Y3RvXCI+XHJcbiAgICA8IS0tIE1hcmNhIGVzcGVjaWFsIHkgZGVzY3VlbnRvIC0tPlxyXG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwicHJvZHVjdC5zYWxlcHJpY2UgfHwgKHByb2R1Y3Quc3BlY2lhbF9tYXJrICYmIHByb2R1Y3Quc3BlY2lhbF9tYXJrICE9PSBudWxsICYmIHByb2R1Y3Quc3BlY2lhbF9tYXJrICE9PSB1bmRlZmluZWQgJiYgcHJvZHVjdC5zcGVjaWFsX21hcmsubGVuZ3RoID4wKVwiXHJcbiAgICAgICAgY2xhc3M9XCJtYXJjYXNcIj5cclxuICAgICAgICA8ZGl2ICplY1Byb2R1Y3RTdG9jaz1cInByb2R1Y3RcIiBbZWNQcm9kdWN0TWluaV09XCJwcm9kdWN0LnNwZWNpYWxfbWFya1wiPjwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93UHJpY2VcIj5cclxuICAgICAgICAgICAgPGRpdiAqZWNQcm9kdWN0U3RvY2s9XCJwcm9kdWN0XCIgW25nQ2xhc3NdPVwieyd0YWctZHNjIGZsb2F0LXJpZ2h0JzogcHJvZHVjdC5zYWxlcHJpY2V9XCJcclxuICAgICAgICAgICAgICAgIFtlY1Byb2R1Y3RPZmZdPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICA8IS0tIEltYWdlbiBkZWwgcHJvZHVjdG8gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm90b1wiPlxyXG4gICAgICAgIEBpZihwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdCl7XHJcbiAgICAgICAgQGlmIChwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdCAmJiBwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdC5sZW5ndGggPiAxICkge1xyXG4gICAgICAgIDxpbWcgW3NyY109XCJtZWRpYVVybCArIHByb2R1Y3QucGljdHVyZXNkZWZhdWx0WzBdXCIgYWx0PVwiSW1hZ2VuIHByaW5jaXBhbFwiIGNsYXNzPVwidy0xMDAgcGljMDFcIiAvPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJtZWRpYVVybCArIHByb2R1Y3QucGljdHVyZXNkZWZhdWx0WzFdXCIgYWx0PVwiSW1hZ2VuIHNlY3VuZGFyaWFcIiBjbGFzcz1cInctMTAwIHBpYzAyXCIgLz5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8aW1nIFtzcmNdPVwibWVkaWFVcmwgKyBwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdFswXVwiIGFsdD1cIkltYWdlbiBwcmluY2lwYWxcIiBjbGFzcz1cInctMTAwIHBpYzAxXCIgLz5cclxuICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIFByZWNpbyAtLT5cclxuXHJcblxyXG4gICAgPCEtLSBOb21icmUgZGVsIHByb2R1Y3RvIC0tPlxyXG4gICAgPGg2IGNsYXNzPVwidGl0bGVcIj57eyBwcm9kdWN0Lm5hbWUgfCB0aXRsZWNhc2UgfX08L2g2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJza3VcIiBbaW5uZXJIVE1MXT1cInByb2R1Y3Quc2hvcnRkZXRhaWxzXCI+PC9kaXY+XHJcblxyXG4gICAgQGlmIChzaG91bGRTaG93UHJpY2UpIHtcclxuICAgIDxhcHAtcHJpY2UtZWMgW3ByaWNlXT1cInByb2R1Y3QucHJpY2VcIiBbc2FsZXByaWNlXT1cInByb2R1Y3Quc2FsZXByaWNlXCIgY2xhc3M9XCJcIiAvPlxyXG4gICAgfVxyXG4gICAgQGlmKCFoaWRlUHJpY2VzKXtcclxuICAgIEBpZighc2hvd1ByaWNlc09ubHlUb0xvZ2dlZFVzZXJzIHx8IGlzQXV0aGVudGljYXRlZCQpe1xyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmaXhCb3R0b21cIj5cclxuXHJcbiAgICAgICAgPCEtLSBCb3TDs24gZGUgYWNjaW9uZXMgLS0+XHJcbiAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICplY1Byb2R1Y3RTdG9jaz1cInByb2R1Y3Q7IGVsc2Ugbm9TdG9ja1wiPiAtLT5cclxuICAgICAgICA8IS0tIEN1YW5kbyBubyB0aWVuZSBtYXJjYSBlc3BlY2lhbCBvIGVzIGRlIHRpcG8gJ3N0YW5kYXJkJyAtLT5cclxuICAgICAgICBAaWYgKCFwcm9kdWN0LnNwZWNpYWxfbWFyayB8fCBwcm9kdWN0LnNwZWNpYWxfbWFyay5sZW5ndGggPT09IDAgfHwgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/LnR5cGUgPT09XHJcbiAgICAgICAgJ3N0YW5kYXJkJykge1xyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gc3RhbmRhcmRcIiBbbmdDbGFzc109XCJpc0NvbGxlY3Rpb24gPyAncHgtMiB3LTEwMCBkLXNtLWJsb2NrJyA6ICdweS0yIHB4LTQnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NvbGxlY3Rpb247IGVsc2Ugbm9ybWFsVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+IHt7KFwiYnV5XCIgfCB0cmFuc2xhdGUpIHwgdXBwZXJjYXNlfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxUZXh0PlxyXG4gICAgICAgICAgICAgICAge3soXCJidXlcIiB8IHRyYW5zbGF0ZSkgfCB1cHBlcmNhc2V9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgPCEtLSBDYXNvIDE6IEFnb3RhZG8gbyBEaXNwb25pYmxlIG11eSBwcm9udG8gLS0+XHJcbiAgICAgICAgQGlmIChwcm9kdWN0LnNwZWNpYWxfbWFya1swXT8udHlwZSA9PT0gJ291dF9vZl9zdG9jaycgfHwgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/LnR5cGUgPT09ICdjb21pbmdfc29vbicpIHtcclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgW25nQ2xhc3NdPVwiaXNDb2xsZWN0aW9uID8gJ3B4LTIgdy0xMDAgZC1zbS1ibG9jaycgOiAncHktMiBweC00J1wiPlxyXG4gICAgICAgICAgICBAaWYoaXNDb2xsZWN0aW9uKXtcclxuICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0ubmFtZSB8IHVwcGVyY2FzZSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgIHt7IHByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdPy5uYW1lIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2J1dHRvbj59XHJcbiAgICAgICAgPCEtLSBDYXNvIDI6IENvbnRhY3RvIHBvciBXaGF0c0FwcCAtLT5cclxuICAgICAgICBAaWYgKHByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdLnR5cGUgPT09ICd3aGF0c2FwcF9jb250YWN0Jykge1xyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBbbmdDbGFzc109XCJpc0NvbGxlY3Rpb24gPyAncHgtMiB3LTEwMCBkLXNtLWJsb2NrJyA6ICdweS0yIHB4LTQnXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5XaGF0c0FwcChwcm9kdWN0LnNwZWNpYWxfbWFya1swXT8ud2hhdHNhcHBDb250YWN0KVwiPlxyXG4gICAgICAgICAgICBAaWYoaXNDb2xsZWN0aW9uKXtcclxuICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/Lm5hbWUgfCB1cHBlcmNhc2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgIHt7IHByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdPy5uYW1lIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDwhLS0gQ2FzbyAzOiBTb2xpY2l0YXIgbcOhcyBpbmZvcm1hY2nDs24gLS0+XHJcbiAgICAgICAgQGlmIChwcm9kdWN0LnNwZWNpYWxfbWFya1swXT8udHlwZSA9PT0gJ21vcmVfaW5mbycpIHtcclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgW25nQ2xhc3NdPVwiaXNDb2xsZWN0aW9uID8gJ3B4LTIgdy0xMDAgZC1zbS1ibG9jaycgOiAncHktMiBweC00J1wiPlxyXG4gICAgICAgICAgICBAaWYoaXNDb2xsZWN0aW9uKXtcclxuICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/Lm5hbWUgfCB1cHBlcmNhc2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgIHt7IHByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdPy5uYW1lIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9fVxyXG48L2E+Il19
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9wcm9kdWN0LWVjL3Byb2R1Y3QtZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvcHJvZHVjdC1lYy9wcm9kdWN0LWVjLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFFBQVEsRUFBa0IsTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBRTFILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3RyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBQzdDOzs7R0FHRztBQVFILE1BQU0sT0FBTyxrQkFBa0I7SUFDdkIsUUFBUSxHQUFhLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLFlBQVks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LFNBQVM7K0JBQ0MsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDO3dEQW1DbkYsT0FBTztzQkFITixLQUFLO3VCQUFDO3dCQUNOLFFBQVEsRUFBRSxJQUFJO3FCQUNkO2dCQUtRLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUksTUFBTTtzQkFBZixNQUFNO2dCQUVFLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEluamVjdG9yLCBXcml0YWJsZVNpZ25hbCwgc2lnbmFsLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IENvcmVDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSwgQ2hhbm5lbFNlcnZpY2UsIEF1dGhTZXJ2aWNlLCBDYXJ0U2VydmljZSwgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZWMtc2VydmljZXMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBQcmljZUVjQ29tcG9uZW50IH0gZnJvbSBcIi4uL3dpZGdldHMtZWMvcHJpY2UtZWMvcHJpY2UtZWMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuLyoqXHJcbiAqIENvbXBvbmVudGUgcXVlIHNlIGVuY2FyZ2EgZGUgbWFuZWphciB1biBwcm9kdWN0by5cclxuICogQGNsYXNzIFByb2R1Y3RFY0NvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdhcHAtcHJvZHVjdC1lYycsXHJcblx0c3RhbmRhbG9uZTogdHJ1ZSxcclxuXHRpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBQcmljZUVjQ29tcG9uZW50LCBSb3V0ZXJMaW5rLCBUcmFuc2xhdGVNb2R1bGUsIEZvcm1zTW9kdWxlXSxcclxuXHR0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1lYy5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmw6ICcuL3Byb2R1Y3QtZWMuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cdHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xyXG5cdHByaXZhdGUgcm91dGVyU2VydmljZSA9IGluamVjdChSb3V0ZXIpO1xyXG5cdHByaXZhdGUgX2NhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSA9IGluamVjdChDYXJ0U2VydmljZSk7XHJcblx0cHJpdmF0ZSBfdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcclxuXHJcblx0cHVibGljIGlzQWRkaW5nVG9DYXJ0OiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcblx0cHVibGljIHF1YW50aXR5OiBXcml0YWJsZVNpZ25hbDxudW1iZXI+ID0gc2lnbmFsKDEpO1xyXG5cclxuXHQvKipcclxuXHQgKiBOYXZlZ2EgYWwgZGV0YWxsZSBkZWwgcHJvZHVjdG8geSBzdWJlIGFsIGluaWNpbyBkZSBsYSBww6FnaW5hXHJcblx0ICogQHBhcmFtIHByb2R1Y3RJZCBJRCBkZWwgcHJvZHVjdG9cclxuXHQgKi9cclxuXHRuYXZpZ2F0ZVRvUHJvZHVjdChwcm9kdWN0SWQ6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0dGhpcy5yb3V0ZXJTZXJ2aWNlLm5hdmlnYXRlKFsnL3Byb2R1Y3QnLCBwcm9kdWN0SWRdKS50aGVuKCgpID0+IHtcclxuXHRcdFx0Ly8gU2Nyb2xsIHN1YXZlIGFsIGluaWNpbyBkZSBsYSBww6FnaW5hXHJcblx0XHRcdHdpbmRvdy5zY3JvbGxUbyh7XHJcblx0XHRcdFx0dG9wOiAwLFxyXG5cdFx0XHRcdGxlZnQ6IDAsXHJcblx0XHRcdFx0YmVoYXZpb3I6ICdzbW9vdGgnXHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRGF0b3MgZGVsIHByb2R1Y3RvLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCh7XHJcblx0XHRyZXF1aXJlZDogdHJ1ZVxyXG5cdH0pXHJcblx0cHJvZHVjdCE6IFByb2R1Y3Q7XHJcblx0LyoqXHJcblx0ICogU2UgdXNhIHBhcmEgc2FiZXIgc2kgZWwgcHJvZHVjdG8gZXMgZGUgdGlwbyBCb3ggbyBubyB5IGRlZmluaXIgbGEgdmlzdGEgYWRlY3VhZGEuXHJcblx0ICovXHJcblx0QElucHV0KCkgaXNQcm9kdWN0Qm94OiBib29sZWFuID0gdHJ1ZTtcclxuXHQvKipcclxuXHQgKiBDb25zdGFudGVzIGRlbCBjb3JlXHJcblx0ICovXHJcblx0QE91dHB1dCgpIGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuXHRASW5wdXQoKSBpc0NvbGxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLmxvYWRlZC5lbWl0KHRoaXMucHJvZHVjdC5pZCk7XHJcblxyXG5cdH1cclxuXHRwdWJsaWMgc2hvd1ByaWNlc09ubHlUb0xvZ2dlZFVzZXJzOiBib29sZWFuID0gZmFsc2U7XHJcblx0cHVibGljIGhpZGVQcmljZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0cHJpdmF0ZSBfYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKVxyXG5cdHB1YmxpYyBpc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy5fYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHR0aGlzLmluamVjdG9yLmdldChDaGFubmVsU2VydmljZSkuY2hhbm5lbCQuc3Vic2NyaWJlKGNoYW5uZWwgPT4ge1xyXG5cdFx0XHR0aGlzLnNob3dQcmljZXNPbmx5VG9Mb2dnZWRVc2VycyA9ICEhY2hhbm5lbC5zaG93UHJpY2VzT25seVRvTG9nZ2VkVXNlcnM7XHJcblx0XHRcdHRoaXMuaGlkZVByaWNlcyA9ICEhY2hhbm5lbC5oaWRlUHJpY2VzO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHByaXZhdGUgY29uc3RzOiBDb3JlQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChDb3JlQ29uc3RhbnRzU2VydmljZSlcclxuXHRwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UgPSBpbmplY3QoQW5hbHl0aWNzU2VydmljZSlcclxuXHRwcml2YXRlIHJvdXRlcjogUm91dGVyID0gaW5qZWN0KFJvdXRlcilcclxuXHQvKipcclxuXHQgKiBVUkwgcGFyYSBsYXMgaW1hZ2VuZXMgZGVsIHByb2R1Y3RvLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBtZWRpYVVybDogc3RyaW5nID0gdGhpcy5jb25zdHMubWVkaWFVcmwoKVxyXG5cdG9wZW5XaGF0c0FwcCh1cmw6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0aWYgKHVybCkge1xyXG5cdFx0XHR3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGdldCBzaG91bGRTaG93UHJpY2UoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gIXRoaXMucHJvZHVjdD8uc3BlY2lhbF9tYXJrIHx8IHRoaXMucHJvZHVjdC5zcGVjaWFsX21hcmsubGVuZ3RoID09PSAwIHx8IHRoaXMucHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/LnNob3dQcmljZTtcclxuXHR9XHJcblxyXG5cdGdldCBoYXNEaXNjb3VudCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLnByb2R1Y3Quc2FsZXByaWNlICYmIHRoaXMucHJvZHVjdC5zYWxlcHJpY2UgIT09IHRoaXMucHJvZHVjdC5wcmljZTtcclxuXHR9XHJcblxyXG5cdGdldCBkaXNjb3VudFBlcmNlbnRhZ2UoKTogbnVtYmVyIHwgbnVsbCB7XHJcblx0XHRpZiAoIXRoaXMuaGFzRGlzY291bnQpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgb3JpZ2luYWxQcmljZSA9IHBhcnNlRmxvYXQodGhpcy5wcm9kdWN0LnByaWNlPy50b1N0cmluZygpIHx8ICcwJyk7XHJcblx0XHRjb25zdCBzYWxlUHJpY2UgPSBwYXJzZUZsb2F0KHRoaXMucHJvZHVjdC5zYWxlcHJpY2U/LnRvU3RyaW5nKCkgfHwgJzAnKTtcclxuXHJcblx0XHQvLyBWYWxpZGFyIHF1ZSBsb3MgcHJlY2lvcyBzZWFuIHbDoWxpZG9zXHJcblx0XHRpZiAob3JpZ2luYWxQcmljZSA8PSAwIHx8IHNhbGVQcmljZSA8PSAwIHx8IHNhbGVQcmljZSA+PSBvcmlnaW5hbFByaWNlKSB7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENhbGN1bGFyIGVsIHBvcmNlbnRhamU6ICgocHJlY2lvX29yaWdpbmFsIC0gcHJlY2lvX29mZXJ0YSkgLyBwcmVjaW9fb3JpZ2luYWwpICogMTAwXHJcblx0XHRjb25zdCBkaXNjb3VudCA9ICgob3JpZ2luYWxQcmljZSAtIHNhbGVQcmljZSkgLyBvcmlnaW5hbFByaWNlKSAqIDEwMDtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5yb3VuZChkaXNjb3VudCk7XHJcblx0fVxyXG5cdHBsdXMoc3RvY2s/OiBudW1iZXIsIG11bHRpcGxlUXVhbnRpdHk/OiBudW1iZXIpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdBdW1lbnRhbmRvIGNhbnRpZGFkJyk7XHJcblx0XHRjb25zdCBjdXJyZW50ID0gTnVtYmVyKHRoaXMucXVhbnRpdHkoKSk7IC8vIDwtLSBmdWVyemEgYSBuw7ptZXJvXHJcblx0XHRpZiAobXVsdGlwbGVRdWFudGl0eSAmJiBtdWx0aXBsZVF1YW50aXR5ID4gMCkge1xyXG5cdFx0XHRzdG9ja1xyXG5cdFx0XHRcdD8gKGN1cnJlbnQgPCBzdG9ja1xyXG5cdFx0XHRcdFx0PyB0aGlzLnF1YW50aXR5LnNldChjdXJyZW50ICsgbXVsdGlwbGVRdWFudGl0eSlcclxuXHRcdFx0XHRcdDogdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jay1hY3R1YWxseScpKVxyXG5cdFx0XHRcdDogdGhpcy5xdWFudGl0eS5zZXQoY3VycmVudCArIG11bHRpcGxlUXVhbnRpdHkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c3RvY2tcclxuXHRcdFx0XHQ/IChjdXJyZW50IDwgc3RvY2tcclxuXHRcdFx0XHRcdD8gdGhpcy5xdWFudGl0eS5zZXQoY3VycmVudCArIDEpXHJcblx0XHRcdFx0XHQ6IHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKSlcclxuXHRcdFx0XHQ6IHRoaXMucXVhbnRpdHkuc2V0KGN1cnJlbnQgKyAxKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGxlc3MobXVsdGlwbGVRdWFudGl0eT86IG51bWJlcikge1xyXG5cdFx0Y29uc29sZS5sb2coJ0Rpc21pbnV5ZW5kbyBjYW50aWRhZCcpO1xyXG5cdFx0Y29uc3QgY3VycmVudCA9IE51bWJlcih0aGlzLnF1YW50aXR5KCkpOyAvLyA8LS0gZnVlcnphIGEgbsO6bWVyb1xyXG5cdFx0aWYgKG11bHRpcGxlUXVhbnRpdHkgJiYgbXVsdGlwbGVRdWFudGl0eSA+IDApIHtcclxuXHRcdFx0Y3VycmVudCA+IG11bHRpcGxlUXVhbnRpdHlcclxuXHRcdFx0XHQ/IHRoaXMucXVhbnRpdHkuc2V0KGN1cnJlbnQgLSBtdWx0aXBsZVF1YW50aXR5KVxyXG5cdFx0XHRcdDogbnVsbDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGN1cnJlbnQgPiAxID8gdGhpcy5xdWFudGl0eS5zZXQoY3VycmVudCAtIDEpIDogbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFkZFRvQ2FydCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdBw7FhZGllbmRvIGFsIGNhcnJpdG8nKTtcclxuXHRcdGlmICh0aGlzLmlzQWRkaW5nVG9DYXJ0KCkgfHwgdGhpcy5xdWFudGl0eSgpIDw9IDApIHJldHVybjtcclxuXHJcblx0XHQvLyBWZXJpZmljYXIgcXVlIHRlbmVtb3MgZWwgcHJvZHVjdG8geSBzdXMgdmFyaWFudGVzXHJcblx0XHRpZiAoIXRoaXMucHJvZHVjdCB8fCAhdGhpcy5wcm9kdWN0LnZhcmlhbnRzIHx8IHRoaXMucHJvZHVjdC52YXJpYW50cy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0dGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ2NhbnQtYnV5Jyk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBWZXJpZmljYXIgc3RvY2tcclxuXHRcdGNvbnN0IGZpcnN0VmFyaWFudCA9IHRoaXMucHJvZHVjdC52YXJpYW50c1swXTtcclxuXHRcdGlmICghZmlyc3RWYXJpYW50LnN0b2NrIHx8IGZpcnN0VmFyaWFudC5zdG9jayA8PSAwKSB7XHJcblx0XHRcdHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFZlcmlmaWNhciBxdWUgbm8gc2Ugc3VwZXJlIGVsIHN0b2NrIGRpc3BvbmlibGVcclxuXHRcdGlmICh0aGlzLnF1YW50aXR5KCkgPiBmaXJzdFZhcmlhbnQuc3RvY2spIHtcclxuXHRcdFx0dGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jay1hY3R1YWxseScpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc0FkZGluZ1RvQ2FydC5zZXQodHJ1ZSk7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Ly8gQWdyZWdhciBhbCBjYXJyaXRvIHVzYW5kbyBDYXJ0U2VydmljZSBkaXJlY3RhbWVudGVcclxuXHRcdFx0dGhpcy5fY2FydFNlcnZpY2UuYWRkVG9DYXJ0KHRoaXMucHJvZHVjdCwgdGhpcy5xdWFudGl0eSgpLCBmaXJzdFZhcmlhbnQuY29kZSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdQcm9kdWN0byBhZ3JlZ2FkbyBhbCBjYXJyaXRvIGV4aXRvc2FtZW50ZScpO1xyXG5cclxuXHRcdFx0Ly8gUmVzZXRlYXIgY2FudGlkYWQgYSAxIGRlc3B1w6lzIGRlIGFncmVnYXIgYWwgY2Fycml0b1xyXG5cdFx0XHR0aGlzLnF1YW50aXR5LnNldCgxKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFsIGFncmVnYXIgYWwgY2Fycml0bzonLCBlcnJvcik7XHJcblx0XHRcdHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdjYW50LWJ1eScpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmlzQWRkaW5nVG9DYXJ0LnNldChmYWxzZSk7XHJcblx0XHR9LCAyMDAwKTtcclxuXHR9XHJcblx0Y2hlY2tTdG9jayhzdG9jazogbnVtYmVyKSB7XHJcblx0XHRpZiAodGhpcy5xdWFudGl0eSgpID49IHN0b2NrKVxyXG5cdFx0XHR0aGlzLnF1YW50aXR5LnNldChzdG9jayk7XHJcblx0fVxyXG5cclxuXHRvblF1YW50aXR5Q2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG5cdFx0Y29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcblx0XHRjb25zdCB2YWx1ZSA9ICt0YXJnZXQudmFsdWU7XHJcblxyXG5cdFx0Ly8gVmFsaWRhciBxdWUgZWwgdmFsb3Igc2VhIG1heW9yIGEgMFxyXG5cdFx0aWYgKHZhbHVlID4gMCkge1xyXG5cdFx0XHR0aGlzLnF1YW50aXR5LnNldCh2YWx1ZSk7XHJcblx0XHRcdC8vIFZhbGlkYXIgY29udHJhIGVsIHN0b2NrIGRpc3BvbmlibGVcclxuXHRcdFx0Y29uc3QgbWF4U3RvY2sgPSB0aGlzLnByb2R1Y3Q/LnZhcmlhbnRzPy5bMF0/LnN0b2NrIHx8IHRoaXMucHJvZHVjdD8uc3RvY2sgfHwgMDtcclxuXHRcdFx0dGhpcy5jaGVja1N0b2NrKG1heFN0b2NrKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIFNpIGVsIHZhbG9yIGVzIDAgbyBuZWdhdGl2bywgcmVzZXRlYXIgYSAxXHJcblx0XHRcdHRoaXMucXVhbnRpdHkuc2V0KDEpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCI8YSBbcm91dGVyTGlua109XCJbJy9wcm9kdWN0JywgcHJvZHVjdC5pZF1cIiBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi1ub25lIHByb2R1Y3RvXCI+XHJcbiAgICA8IS0tIE1hcmNhIGVzcGVjaWFsIHkgZGVzY3VlbnRvIC0tPlxyXG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwicHJvZHVjdC5zYWxlcHJpY2UgfHwgKHByb2R1Y3Quc3BlY2lhbF9tYXJrICYmIHByb2R1Y3Quc3BlY2lhbF9tYXJrICE9PSBudWxsICYmIHByb2R1Y3Quc3BlY2lhbF9tYXJrICE9PSB1bmRlZmluZWQgJiYgcHJvZHVjdC5zcGVjaWFsX21hcmsubGVuZ3RoID4wKVwiXHJcbiAgICAgICAgY2xhc3M9XCJtYXJjYXNcIj5cclxuICAgICAgICA8ZGl2ICplY1Byb2R1Y3RTdG9jaz1cInByb2R1Y3RcIiBbZWNQcm9kdWN0TWluaV09XCJwcm9kdWN0LnNwZWNpYWxfbWFya1wiPjwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93UHJpY2VcIj5cclxuICAgICAgICAgICAgPGRpdiAqZWNQcm9kdWN0U3RvY2s9XCJwcm9kdWN0XCIgW25nQ2xhc3NdPVwieyd0YWctZHNjIGZsb2F0LXJpZ2h0JzogcHJvZHVjdC5zYWxlcHJpY2V9XCJcclxuICAgICAgICAgICAgICAgIFtlY1Byb2R1Y3RPZmZdPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICA8IS0tIEltYWdlbiBkZWwgcHJvZHVjdG8gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm90b1wiPlxyXG4gICAgICAgIEBpZihwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdCl7XHJcbiAgICAgICAgQGlmIChwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdCAmJiBwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdC5sZW5ndGggPiAxICkge1xyXG4gICAgICAgIDxpbWcgW3NyY109XCJtZWRpYVVybCArIHByb2R1Y3QucGljdHVyZXNkZWZhdWx0WzBdXCIgYWx0PVwiSW1hZ2VuIHByaW5jaXBhbFwiIGNsYXNzPVwidy0xMDAgcGljMDFcIiAvPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJtZWRpYVVybCArIHByb2R1Y3QucGljdHVyZXNkZWZhdWx0WzFdXCIgYWx0PVwiSW1hZ2VuIHNlY3VuZGFyaWFcIiBjbGFzcz1cInctMTAwIHBpYzAyXCIgLz5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8aW1nIFtzcmNdPVwibWVkaWFVcmwgKyBwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdFswXVwiIGFsdD1cIkltYWdlbiBwcmluY2lwYWxcIiBjbGFzcz1cInctMTAwIHBpYzAxXCIgLz5cclxuICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIFByZWNpbyAtLT5cclxuXHJcblxyXG4gICAgPCEtLSBOb21icmUgZGVsIHByb2R1Y3RvIC0tPlxyXG4gICAgPGg2IGNsYXNzPVwidGl0bGVcIj57eyBwcm9kdWN0Lm5hbWUgfCB0aXRsZWNhc2UgfX08L2g2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJza3VcIiBbaW5uZXJIVE1MXT1cInByb2R1Y3Quc2hvcnRkZXRhaWxzXCI+PC9kaXY+XHJcblxyXG4gICAgQGlmIChzaG91bGRTaG93UHJpY2UpIHtcclxuICAgIDxhcHAtcHJpY2UtZWMgW3ByaWNlXT1cInByb2R1Y3QucHJpY2VcIiBbc2FsZXByaWNlXT1cInByb2R1Y3Quc2FsZXByaWNlXCIgY2xhc3M9XCJcIiAvPlxyXG4gICAgfVxyXG4gICAgQGlmKCFoaWRlUHJpY2VzKXtcclxuICAgIEBpZighc2hvd1ByaWNlc09ubHlUb0xvZ2dlZFVzZXJzIHx8IGlzQXV0aGVudGljYXRlZCQpe1xyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmaXhCb3R0b21cIj5cclxuXHJcbiAgICAgICAgPCEtLSBCb3TDs24gZGUgYWNjaW9uZXMgLS0+XHJcbiAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICplY1Byb2R1Y3RTdG9jaz1cInByb2R1Y3Q7IGVsc2Ugbm9TdG9ja1wiPiAtLT5cclxuICAgICAgICA8IS0tIEN1YW5kbyBubyB0aWVuZSBtYXJjYSBlc3BlY2lhbCBvIGVzIGRlIHRpcG8gJ3N0YW5kYXJkJyAtLT5cclxuICAgICAgICBAaWYgKCFwcm9kdWN0LnNwZWNpYWxfbWFyayB8fCBwcm9kdWN0LnNwZWNpYWxfbWFyay5sZW5ndGggPT09IDAgfHwgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/LnR5cGUgPT09XHJcbiAgICAgICAgJ3N0YW5kYXJkJykge1xyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gc3RhbmRhcmRcIiBbbmdDbGFzc109XCJpc0NvbGxlY3Rpb24gPyAncHgtMiB3LTEwMCBkLXNtLWJsb2NrJyA6ICdweS0yIHB4LTQnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NvbGxlY3Rpb247IGVsc2Ugbm9ybWFsVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+IHt7KFwiYnV5XCIgfCB0cmFuc2xhdGUpIHwgdXBwZXJjYXNlfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxUZXh0PlxyXG4gICAgICAgICAgICAgICAge3soXCJidXlcIiB8IHRyYW5zbGF0ZSkgfCB1cHBlcmNhc2V9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgPCEtLSBDYXNvIDE6IEFnb3RhZG8gbyBEaXNwb25pYmxlIG11eSBwcm9udG8gLS0+XHJcbiAgICAgICAgQGlmIChwcm9kdWN0LnNwZWNpYWxfbWFya1swXT8udHlwZSA9PT0gJ291dF9vZl9zdG9jaycgfHwgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/LnR5cGUgPT09ICdjb21pbmdfc29vbicpIHtcclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgW25nQ2xhc3NdPVwiaXNDb2xsZWN0aW9uID8gJ3B4LTIgdy0xMDAgZC1zbS1ibG9jaycgOiAncHktMiBweC00J1wiPlxyXG4gICAgICAgICAgICBAaWYoaXNDb2xsZWN0aW9uKXtcclxuICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0ubmFtZSB8IHVwcGVyY2FzZSB9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgIHt7IHByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdPy5uYW1lIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2J1dHRvbj59XHJcbiAgICAgICAgPCEtLSBDYXNvIDI6IENvbnRhY3RvIHBvciBXaGF0c0FwcCAtLT5cclxuICAgICAgICBAaWYgKHByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdLnR5cGUgPT09ICd3aGF0c2FwcF9jb250YWN0Jykge1xyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBbbmdDbGFzc109XCJpc0NvbGxlY3Rpb24gPyAncHgtMiB3LTEwMCBkLXNtLWJsb2NrJyA6ICdweS0yIHB4LTQnXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5XaGF0c0FwcChwcm9kdWN0LnNwZWNpYWxfbWFya1swXT8ud2hhdHNhcHBDb250YWN0KVwiPlxyXG4gICAgICAgICAgICBAaWYoaXNDb2xsZWN0aW9uKXtcclxuICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/Lm5hbWUgfCB1cHBlcmNhc2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgIHt7IHByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdPy5uYW1lIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDwhLS0gQ2FzbyAzOiBTb2xpY2l0YXIgbcOhcyBpbmZvcm1hY2nDs24gLS0+XHJcbiAgICAgICAgQGlmIChwcm9kdWN0LnNwZWNpYWxfbWFya1swXT8udHlwZSA9PT0gJ21vcmVfaW5mbycpIHtcclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgW25nQ2xhc3NdPVwiaXNDb2xsZWN0aW9uID8gJ3B4LTIgdy0xMDAgZC1zbS1ibG9jaycgOiAncHktMiBweC00J1wiPlxyXG4gICAgICAgICAgICBAaWYoaXNDb2xsZWN0aW9uKXtcclxuICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC5zcGVjaWFsX21hcmtbMF0/Lm5hbWUgfCB1cHBlcmNhc2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgIHt7IHByb2R1Y3Quc3BlY2lhbF9tYXJrWzBdPy5uYW1lIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9fVxyXG48L2E+Il19
|
|
@@ -14,7 +14,7 @@ import { ToastrService } from 'ngx-toastr';
|
|
|
14
14
|
import moment from 'moment';
|
|
15
15
|
import { StorageMap } from '@ngx-pwa/local-storage';
|
|
16
16
|
import * as i1$3 from '@angular/forms';
|
|
17
|
-
import { Validators, FormBuilder, NG_VALUE_ACCESSOR, ReactiveFormsModule
|
|
17
|
+
import { Validators, FormsModule, FormBuilder, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
|
|
18
18
|
import { register } from 'swiper/element/bundle';
|
|
19
19
|
import { register as register$1 } from 'swiper/element';
|
|
20
20
|
import * as i1$4 from '@angular/platform-browser';
|
|
@@ -6154,6 +6154,11 @@ class HeaderEcComponent extends MenuEcComponent {
|
|
|
6154
6154
|
hidePrices = false;
|
|
6155
6155
|
__authService = inject(AuthService);
|
|
6156
6156
|
_channelService = inject(ChannelService);
|
|
6157
|
+
changeDetector = inject(ChangeDetectorRef);
|
|
6158
|
+
appRouter = inject(Router);
|
|
6159
|
+
platformId = inject(PLATFORM_ID);
|
|
6160
|
+
// Observable del estado de autenticación
|
|
6161
|
+
logged$;
|
|
6157
6162
|
isAuthenticated$ = this.__authService.isAuthenticated();
|
|
6158
6163
|
constructor() {
|
|
6159
6164
|
super();
|
|
@@ -6171,6 +6176,22 @@ class HeaderEcComponent extends MenuEcComponent {
|
|
|
6171
6176
|
this.channel = this.coreConstantsService.getChannel();
|
|
6172
6177
|
this.onWindowScroll();
|
|
6173
6178
|
this.detectRouteChange(); // Llamamos a la función que detecta el cambio de ruta
|
|
6179
|
+
// Usar el Observable del AuthService
|
|
6180
|
+
this.logged$ = this.__authService.loggedIn$;
|
|
6181
|
+
// Suscribirse al Observable y forzar detección de cambios cuando sea necesario
|
|
6182
|
+
this.logged$.subscribe(isLoggedIn => {
|
|
6183
|
+
this.changeDetector.detectChanges();
|
|
6184
|
+
});
|
|
6185
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
6186
|
+
this.appRouter.events.subscribe(evt => {
|
|
6187
|
+
if (evt instanceof NavigationEnd) {
|
|
6188
|
+
// Forzar detección de cambios después de navegación
|
|
6189
|
+
setTimeout(() => {
|
|
6190
|
+
this.changeDetector.detectChanges();
|
|
6191
|
+
}, 100);
|
|
6192
|
+
}
|
|
6193
|
+
});
|
|
6194
|
+
}
|
|
6174
6195
|
}
|
|
6175
6196
|
ngAfterViewInit() {
|
|
6176
6197
|
this.setupMobileMenu(); // Inicializamos el menú móvil
|
|
@@ -6874,6 +6895,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
6874
6895
|
class ProductEcComponent {
|
|
6875
6896
|
injector = inject(Injector);
|
|
6876
6897
|
routerService = inject(Router);
|
|
6898
|
+
_cartService = inject(CartService);
|
|
6899
|
+
_toastService = inject(ToastService);
|
|
6900
|
+
isAddingToCart = signal(false);
|
|
6901
|
+
quantity = signal(1);
|
|
6877
6902
|
/**
|
|
6878
6903
|
* Navega al detalle del producto y sube al inicio de la página
|
|
6879
6904
|
* @param productId ID del producto
|
|
@@ -6946,12 +6971,97 @@ class ProductEcComponent {
|
|
|
6946
6971
|
const discount = ((originalPrice - salePrice) / originalPrice) * 100;
|
|
6947
6972
|
return Math.round(discount);
|
|
6948
6973
|
}
|
|
6974
|
+
plus(stock, multipleQuantity) {
|
|
6975
|
+
console.log('Aumentando cantidad');
|
|
6976
|
+
const current = Number(this.quantity()); // <-- fuerza a número
|
|
6977
|
+
if (multipleQuantity && multipleQuantity > 0) {
|
|
6978
|
+
stock
|
|
6979
|
+
? (current < stock
|
|
6980
|
+
? this.quantity.set(current + multipleQuantity)
|
|
6981
|
+
: this._toastService.show('out-of-stock-actually'))
|
|
6982
|
+
: this.quantity.set(current + multipleQuantity);
|
|
6983
|
+
}
|
|
6984
|
+
else {
|
|
6985
|
+
stock
|
|
6986
|
+
? (current < stock
|
|
6987
|
+
? this.quantity.set(current + 1)
|
|
6988
|
+
: this._toastService.show('out-of-stock-actually'))
|
|
6989
|
+
: this.quantity.set(current + 1);
|
|
6990
|
+
}
|
|
6991
|
+
}
|
|
6992
|
+
less(multipleQuantity) {
|
|
6993
|
+
console.log('Disminuyendo cantidad');
|
|
6994
|
+
const current = Number(this.quantity()); // <-- fuerza a número
|
|
6995
|
+
if (multipleQuantity && multipleQuantity > 0) {
|
|
6996
|
+
current > multipleQuantity
|
|
6997
|
+
? this.quantity.set(current - multipleQuantity)
|
|
6998
|
+
: null;
|
|
6999
|
+
}
|
|
7000
|
+
else {
|
|
7001
|
+
current > 1 ? this.quantity.set(current - 1) : null;
|
|
7002
|
+
}
|
|
7003
|
+
}
|
|
7004
|
+
addToCart() {
|
|
7005
|
+
console.log('Añadiendo al carrito');
|
|
7006
|
+
if (this.isAddingToCart() || this.quantity() <= 0)
|
|
7007
|
+
return;
|
|
7008
|
+
// Verificar que tenemos el producto y sus variantes
|
|
7009
|
+
if (!this.product || !this.product.variants || this.product.variants.length === 0) {
|
|
7010
|
+
this._toastService.show('cant-buy');
|
|
7011
|
+
return;
|
|
7012
|
+
}
|
|
7013
|
+
// Verificar stock
|
|
7014
|
+
const firstVariant = this.product.variants[0];
|
|
7015
|
+
if (!firstVariant.stock || firstVariant.stock <= 0) {
|
|
7016
|
+
this._toastService.show('out-of-stock');
|
|
7017
|
+
return;
|
|
7018
|
+
}
|
|
7019
|
+
// Verificar que no se supere el stock disponible
|
|
7020
|
+
if (this.quantity() > firstVariant.stock) {
|
|
7021
|
+
this._toastService.show('out-of-stock-actually');
|
|
7022
|
+
return;
|
|
7023
|
+
}
|
|
7024
|
+
this.isAddingToCart.set(true);
|
|
7025
|
+
try {
|
|
7026
|
+
// Agregar al carrito usando CartService directamente
|
|
7027
|
+
this._cartService.addToCart(this.product, this.quantity(), firstVariant.code);
|
|
7028
|
+
console.log('Producto agregado al carrito exitosamente');
|
|
7029
|
+
// Resetear cantidad a 1 después de agregar al carrito
|
|
7030
|
+
this.quantity.set(1);
|
|
7031
|
+
}
|
|
7032
|
+
catch (error) {
|
|
7033
|
+
console.error('Error al agregar al carrito:', error);
|
|
7034
|
+
this._toastService.show('cant-buy');
|
|
7035
|
+
}
|
|
7036
|
+
setTimeout(() => {
|
|
7037
|
+
this.isAddingToCart.set(false);
|
|
7038
|
+
}, 2000);
|
|
7039
|
+
}
|
|
7040
|
+
checkStock(stock) {
|
|
7041
|
+
if (this.quantity() >= stock)
|
|
7042
|
+
this.quantity.set(stock);
|
|
7043
|
+
}
|
|
7044
|
+
onQuantityChange(event) {
|
|
7045
|
+
const target = event.target;
|
|
7046
|
+
const value = +target.value;
|
|
7047
|
+
// Validar que el valor sea mayor a 0
|
|
7048
|
+
if (value > 0) {
|
|
7049
|
+
this.quantity.set(value);
|
|
7050
|
+
// Validar contra el stock disponible
|
|
7051
|
+
const maxStock = this.product?.variants?.[0]?.stock || this.product?.stock || 0;
|
|
7052
|
+
this.checkStock(maxStock);
|
|
7053
|
+
}
|
|
7054
|
+
else {
|
|
7055
|
+
// Si el valor es 0 o negativo, resetear a 1
|
|
7056
|
+
this.quantity.set(1);
|
|
7057
|
+
}
|
|
7058
|
+
}
|
|
6949
7059
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6950
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ProductEcComponent, isStandalone: true, selector: "app-product-ec", inputs: { product: "product", isProductBox: "isProductBox", isCollection: "isCollection" }, outputs: { loaded: "loaded" }, ngImport: i0, template: "<a [routerLink]=\"['/product', product.id]\" class=\"text-decoration-none producto\">\r\n <!-- Marca especial y descuento -->\r\n <!-- <div *ngIf=\"product.saleprice || (product.special_mark && product.special_mark !== null && product.special_mark !== undefined && product.special_mark.length >0)\"\r\n class=\"marcas\">\r\n <div *ecProductStock=\"product\" [ecProductMini]=\"product.special_mark\"></div>\r\n <ng-container *ngIf=\"shouldShowPrice\">\r\n <div *ecProductStock=\"product\" [ngClass]=\"{'tag-dsc float-right': product.saleprice}\"\r\n [ecProductOff]=\"product\">\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <!-- Imagen del producto -->\r\n <div class=\"foto\">\r\n @if(product.picturesdefault){\r\n @if (product.picturesdefault && product.picturesdefault.length > 1 ) {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n <img [src]=\"mediaUrl + product.picturesdefault[1]\" alt=\"Imagen secundaria\" class=\"w-100 pic02\" />\r\n } @else {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n }\r\n }\r\n </div>\r\n <!-- Precio -->\r\n\r\n\r\n <!-- Nombre del producto -->\r\n <h6 class=\"title\">{{ product.name | titlecase }}</h6>\r\n\r\n <div class=\"sku\" [innerHTML]=\"product.shortdetails\"></div>\r\n\r\n @if (shouldShowPrice) {\r\n <app-price-ec [price]=\"product.price\" [saleprice]=\"product.saleprice\" class=\"\" />\r\n }\r\n @if(!hidePrices){\r\n @if(!showPricesOnlyToLoggedUsers || isAuthenticated$){\r\n\r\n <div class=\"fixBottom\">\r\n\r\n <!-- Bot\u00F3n de acciones -->\r\n <!-- <ng-container *ecProductStock=\"product; else noStock\"> -->\r\n <!-- Cuando no tiene marca especial o es de tipo 'standard' -->\r\n @if (!product.special_mark || product.special_mark.length === 0 || product.special_mark[0]?.type ===\r\n 'standard') {\r\n <button class=\"btn standard\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n <ng-container *ngIf=\"isCollection; else normalText\">\r\n <span> {{(\"buy\" | translate) | uppercase}} </span>\r\n </ng-container>\r\n <ng-template #normalText>\r\n {{(\"buy\" | translate) | uppercase}}\r\n </ng-template>\r\n </button>\r\n }@else {\r\n <!-- Caso 1: Agotado o Disponible muy pronto -->\r\n @if (product.special_mark[0]?.type === 'out_of_stock' || product.special_mark[0]?.type === 'coming_soon') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0].name | uppercase }} </span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>}\r\n <!-- Caso 2: Contacto por WhatsApp -->\r\n @if (product.special_mark[0].type === 'whatsapp_contact') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\"\r\n (click)=\"openWhatsApp(product.special_mark[0]?.whatsappContact)\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n\r\n </button>\r\n }\r\n <!-- Caso 3: Solicitar m\u00E1s informaci\u00F3n -->\r\n @if (product.special_mark[0]?.type === 'more_info') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }}\r\n</a>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "component", type: PriceEcComponent, selector: "app-price-ec", inputs: ["price", "saleprice", "basePrice", "taxeAmount", "taxes", "priceSize", "showTaxLegendOnly", "disableTaxInfo", "customPriceTemplate", "customSalePriceTemplate", "customSimplePriceTemplate", "customSimpleSalePriceTemplate", "customTaxTemplate", "customOnlyTaxLabelTemplate"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] });
|
|
7060
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ProductEcComponent, isStandalone: true, selector: "app-product-ec", inputs: { product: "product", isProductBox: "isProductBox", isCollection: "isCollection" }, outputs: { loaded: "loaded" }, ngImport: i0, template: "<a [routerLink]=\"['/product', product.id]\" class=\"text-decoration-none producto\">\r\n <!-- Marca especial y descuento -->\r\n <!-- <div *ngIf=\"product.saleprice || (product.special_mark && product.special_mark !== null && product.special_mark !== undefined && product.special_mark.length >0)\"\r\n class=\"marcas\">\r\n <div *ecProductStock=\"product\" [ecProductMini]=\"product.special_mark\"></div>\r\n <ng-container *ngIf=\"shouldShowPrice\">\r\n <div *ecProductStock=\"product\" [ngClass]=\"{'tag-dsc float-right': product.saleprice}\"\r\n [ecProductOff]=\"product\">\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <!-- Imagen del producto -->\r\n <div class=\"foto\">\r\n @if(product.picturesdefault){\r\n @if (product.picturesdefault && product.picturesdefault.length > 1 ) {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n <img [src]=\"mediaUrl + product.picturesdefault[1]\" alt=\"Imagen secundaria\" class=\"w-100 pic02\" />\r\n } @else {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n }\r\n }\r\n </div>\r\n <!-- Precio -->\r\n\r\n\r\n <!-- Nombre del producto -->\r\n <h6 class=\"title\">{{ product.name | titlecase }}</h6>\r\n\r\n <div class=\"sku\" [innerHTML]=\"product.shortdetails\"></div>\r\n\r\n @if (shouldShowPrice) {\r\n <app-price-ec [price]=\"product.price\" [saleprice]=\"product.saleprice\" class=\"\" />\r\n }\r\n @if(!hidePrices){\r\n @if(!showPricesOnlyToLoggedUsers || isAuthenticated$){\r\n\r\n <div class=\"fixBottom\">\r\n\r\n <!-- Bot\u00F3n de acciones -->\r\n <!-- <ng-container *ecProductStock=\"product; else noStock\"> -->\r\n <!-- Cuando no tiene marca especial o es de tipo 'standard' -->\r\n @if (!product.special_mark || product.special_mark.length === 0 || product.special_mark[0]?.type ===\r\n 'standard') {\r\n <button class=\"btn standard\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n <ng-container *ngIf=\"isCollection; else normalText\">\r\n <span> {{(\"buy\" | translate) | uppercase}} </span>\r\n </ng-container>\r\n <ng-template #normalText>\r\n {{(\"buy\" | translate) | uppercase}}\r\n </ng-template>\r\n </button>\r\n }@else {\r\n <!-- Caso 1: Agotado o Disponible muy pronto -->\r\n @if (product.special_mark[0]?.type === 'out_of_stock' || product.special_mark[0]?.type === 'coming_soon') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0].name | uppercase }} </span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>}\r\n <!-- Caso 2: Contacto por WhatsApp -->\r\n @if (product.special_mark[0].type === 'whatsapp_contact') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\"\r\n (click)=\"openWhatsApp(product.special_mark[0]?.whatsappContact)\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n\r\n </button>\r\n }\r\n <!-- Caso 3: Solicitar m\u00E1s informaci\u00F3n -->\r\n @if (product.special_mark[0]?.type === 'more_info') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }}\r\n</a>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "component", type: PriceEcComponent, selector: "app-price-ec", inputs: ["price", "saleprice", "basePrice", "taxeAmount", "taxes", "priceSize", "showTaxLegendOnly", "disableTaxInfo", "customPriceTemplate", "customSalePriceTemplate", "customSimplePriceTemplate", "customSimpleSalePriceTemplate", "customTaxTemplate", "customOnlyTaxLabelTemplate"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }] });
|
|
6951
7061
|
}
|
|
6952
7062
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductEcComponent, decorators: [{
|
|
6953
7063
|
type: Component,
|
|
6954
|
-
args: [{ selector: 'app-product-ec', standalone: true, imports: [CommonModule, PriceEcComponent, RouterLink, TranslateModule], template: "<a [routerLink]=\"['/product', product.id]\" class=\"text-decoration-none producto\">\r\n <!-- Marca especial y descuento -->\r\n <!-- <div *ngIf=\"product.saleprice || (product.special_mark && product.special_mark !== null && product.special_mark !== undefined && product.special_mark.length >0)\"\r\n class=\"marcas\">\r\n <div *ecProductStock=\"product\" [ecProductMini]=\"product.special_mark\"></div>\r\n <ng-container *ngIf=\"shouldShowPrice\">\r\n <div *ecProductStock=\"product\" [ngClass]=\"{'tag-dsc float-right': product.saleprice}\"\r\n [ecProductOff]=\"product\">\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <!-- Imagen del producto -->\r\n <div class=\"foto\">\r\n @if(product.picturesdefault){\r\n @if (product.picturesdefault && product.picturesdefault.length > 1 ) {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n <img [src]=\"mediaUrl + product.picturesdefault[1]\" alt=\"Imagen secundaria\" class=\"w-100 pic02\" />\r\n } @else {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n }\r\n }\r\n </div>\r\n <!-- Precio -->\r\n\r\n\r\n <!-- Nombre del producto -->\r\n <h6 class=\"title\">{{ product.name | titlecase }}</h6>\r\n\r\n <div class=\"sku\" [innerHTML]=\"product.shortdetails\"></div>\r\n\r\n @if (shouldShowPrice) {\r\n <app-price-ec [price]=\"product.price\" [saleprice]=\"product.saleprice\" class=\"\" />\r\n }\r\n @if(!hidePrices){\r\n @if(!showPricesOnlyToLoggedUsers || isAuthenticated$){\r\n\r\n <div class=\"fixBottom\">\r\n\r\n <!-- Bot\u00F3n de acciones -->\r\n <!-- <ng-container *ecProductStock=\"product; else noStock\"> -->\r\n <!-- Cuando no tiene marca especial o es de tipo 'standard' -->\r\n @if (!product.special_mark || product.special_mark.length === 0 || product.special_mark[0]?.type ===\r\n 'standard') {\r\n <button class=\"btn standard\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n <ng-container *ngIf=\"isCollection; else normalText\">\r\n <span> {{(\"buy\" | translate) | uppercase}} </span>\r\n </ng-container>\r\n <ng-template #normalText>\r\n {{(\"buy\" | translate) | uppercase}}\r\n </ng-template>\r\n </button>\r\n }@else {\r\n <!-- Caso 1: Agotado o Disponible muy pronto -->\r\n @if (product.special_mark[0]?.type === 'out_of_stock' || product.special_mark[0]?.type === 'coming_soon') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0].name | uppercase }} </span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>}\r\n <!-- Caso 2: Contacto por WhatsApp -->\r\n @if (product.special_mark[0].type === 'whatsapp_contact') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\"\r\n (click)=\"openWhatsApp(product.special_mark[0]?.whatsappContact)\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n\r\n </button>\r\n }\r\n <!-- Caso 3: Solicitar m\u00E1s informaci\u00F3n -->\r\n @if (product.special_mark[0]?.type === 'more_info') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }}\r\n</a>" }]
|
|
7064
|
+
args: [{ selector: 'app-product-ec', standalone: true, imports: [CommonModule, PriceEcComponent, RouterLink, TranslateModule, FormsModule], template: "<a [routerLink]=\"['/product', product.id]\" class=\"text-decoration-none producto\">\r\n <!-- Marca especial y descuento -->\r\n <!-- <div *ngIf=\"product.saleprice || (product.special_mark && product.special_mark !== null && product.special_mark !== undefined && product.special_mark.length >0)\"\r\n class=\"marcas\">\r\n <div *ecProductStock=\"product\" [ecProductMini]=\"product.special_mark\"></div>\r\n <ng-container *ngIf=\"shouldShowPrice\">\r\n <div *ecProductStock=\"product\" [ngClass]=\"{'tag-dsc float-right': product.saleprice}\"\r\n [ecProductOff]=\"product\">\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <!-- Imagen del producto -->\r\n <div class=\"foto\">\r\n @if(product.picturesdefault){\r\n @if (product.picturesdefault && product.picturesdefault.length > 1 ) {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n <img [src]=\"mediaUrl + product.picturesdefault[1]\" alt=\"Imagen secundaria\" class=\"w-100 pic02\" />\r\n } @else {\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"Imagen principal\" class=\"w-100 pic01\" />\r\n }\r\n }\r\n </div>\r\n <!-- Precio -->\r\n\r\n\r\n <!-- Nombre del producto -->\r\n <h6 class=\"title\">{{ product.name | titlecase }}</h6>\r\n\r\n <div class=\"sku\" [innerHTML]=\"product.shortdetails\"></div>\r\n\r\n @if (shouldShowPrice) {\r\n <app-price-ec [price]=\"product.price\" [saleprice]=\"product.saleprice\" class=\"\" />\r\n }\r\n @if(!hidePrices){\r\n @if(!showPricesOnlyToLoggedUsers || isAuthenticated$){\r\n\r\n <div class=\"fixBottom\">\r\n\r\n <!-- Bot\u00F3n de acciones -->\r\n <!-- <ng-container *ecProductStock=\"product; else noStock\"> -->\r\n <!-- Cuando no tiene marca especial o es de tipo 'standard' -->\r\n @if (!product.special_mark || product.special_mark.length === 0 || product.special_mark[0]?.type ===\r\n 'standard') {\r\n <button class=\"btn standard\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n <ng-container *ngIf=\"isCollection; else normalText\">\r\n <span> {{(\"buy\" | translate) | uppercase}} </span>\r\n </ng-container>\r\n <ng-template #normalText>\r\n {{(\"buy\" | translate) | uppercase}}\r\n </ng-template>\r\n </button>\r\n }@else {\r\n <!-- Caso 1: Agotado o Disponible muy pronto -->\r\n @if (product.special_mark[0]?.type === 'out_of_stock' || product.special_mark[0]?.type === 'coming_soon') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0].name | uppercase }} </span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>}\r\n <!-- Caso 2: Contacto por WhatsApp -->\r\n @if (product.special_mark[0].type === 'whatsapp_contact') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\"\r\n (click)=\"openWhatsApp(product.special_mark[0]?.whatsappContact)\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n\r\n </button>\r\n }\r\n <!-- Caso 3: Solicitar m\u00E1s informaci\u00F3n -->\r\n @if (product.special_mark[0]?.type === 'more_info') {\r\n <button class=\"btn\" [ngClass]=\"isCollection ? 'px-2 w-100 d-sm-block' : 'py-2 px-4'\">\r\n @if(isCollection){\r\n <span>{{ product.special_mark[0]?.name | uppercase }}</span>\r\n }@else {\r\n {{ product.special_mark[0]?.name | uppercase }}\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }}\r\n</a>" }]
|
|
6955
7065
|
}], ctorParameters: () => [], propDecorators: { product: [{
|
|
6956
7066
|
type: Input,
|
|
6957
7067
|
args: [{
|
|
@@ -7951,6 +8061,7 @@ class LoginFormEcComponent {
|
|
|
7951
8061
|
_formBuilder = inject(FormBuilder);
|
|
7952
8062
|
_toastService = inject(ToastService);
|
|
7953
8063
|
_router = inject(Router);
|
|
8064
|
+
showPassword = false;
|
|
7954
8065
|
/**
|
|
7955
8066
|
* Parametro para indicar si tras loguear
|
|
7956
8067
|
* debe redireccionar o no.
|
|
@@ -8039,6 +8150,9 @@ class LoginFormEcComponent {
|
|
|
8039
8150
|
? resolverFunction()
|
|
8040
8151
|
: this._router.navigateByUrl(this.redirectTo);
|
|
8041
8152
|
}
|
|
8153
|
+
togglePassword() {
|
|
8154
|
+
this.showPassword = !this.showPassword;
|
|
8155
|
+
}
|
|
8042
8156
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoginFormEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
8043
8157
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LoginFormEcComponent, isStandalone: true, selector: "app-login-form-ec", inputs: { redirect: "redirect", redirectTo: "redirectTo", inCart: "inCart" }, outputs: { ready: "ready" }, ngImport: i0, template: "<div class=\"d-flex flex-column position-relative\">\r\n <h1 class=\"right-line ff-ubuntu-light mb-4\"><span>Ingresar</span></h1>\r\n <p class=\"ff-ubuntu-light font-sm pr-4 mb-4\">\r\n Si ya est\u00E1s registrado. Ingresa en tu cuenta con tu email y la\r\n contrase\u00F1a adecuada.\r\n </p>\r\n <div class=\"w-md-50 w-100 text-center\">\r\n <form [formGroup]=\"loginForm()\" (submit)=\"login($event)\">\r\n <input class=\"form-control mb-4 radius-0\" type=\"email\" formControlName=\"username\"\r\n placeholder=\"Correo Electr\u00F3nico\">\r\n <input class=\"form-control mb-4 radius-0\" type=\"password\" formControlName=\"password\"\r\n placeholder=\"Contrase\u00F1a\">\r\n\r\n <div class=\"row d-flex flex-column\">\r\n <div class=\"col-12 mb-4\">\r\n <button type=\"submit\"\r\n class=\"bg-gray border-0 px-4 py-2 color-white ff-ubuntu-light\">INGRESAR</button>\r\n </div>\r\n <div class=\"col-12 d-flex justify-content-center align-items-center\">\r\n <a [routerLink]=\"'/auth/forgot-password'\" class=\"font-md ff-ubuntu-light\">\r\n \u00BFOlvid\u00F3 su contrase\u00F1a?\r\n </a>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n @if(loading){\r\n <app-loading-section-ec></app-loading-section-ec>\r\n }\r\n</div>", styles: [""], dependencies: [{ kind: "component", type: LoadingSectionEcComponent, selector: "app-loading-section-ec" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
8044
8158
|
}
|
|
@@ -8138,6 +8252,7 @@ class RegisterFormEcComponent {
|
|
|
8138
8252
|
_analyticsService = inject(AnalyticsService);
|
|
8139
8253
|
_formBuilder = inject(FormBuilder);
|
|
8140
8254
|
channelConfigService = inject(ChannelService);
|
|
8255
|
+
showPassword = false;
|
|
8141
8256
|
/**
|
|
8142
8257
|
* Indica si debe redireccionar o se queda en la misma pantalla
|
|
8143
8258
|
*/
|
|
@@ -8253,6 +8368,9 @@ class RegisterFormEcComponent {
|
|
|
8253
8368
|
this.register_loading = false;
|
|
8254
8369
|
}
|
|
8255
8370
|
}
|
|
8371
|
+
togglePassword() {
|
|
8372
|
+
this.showPassword = !this.showPassword;
|
|
8373
|
+
}
|
|
8256
8374
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RegisterFormEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
8257
8375
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: RegisterFormEcComponent, isStandalone: true, selector: "app-register-form-ec", inputs: { redirect: "redirect" }, outputs: { ready: "ready" }, ngImport: i0, template: "<div class=\"w-100 pl-md-5 position-relative\" id=\"register\">\r\n <div class=\"py-2\">\r\n <h5>CREAR CUENTA</h5>\r\n </div>\r\n <form id=\"registro\" [formGroup]=\"registerForm\" (submit)=\"register($event)\">\r\n <div class=\"form-group\">\r\n <label for=\"\" class=\"form-label\">NOMBRE</label>\r\n <input formControlName=\"firstName\" class=\"form-control rounded-0\" type=\"text\" placeholder=\"Nombre\">\r\n </div>\r\n <div class=\"form-group\">\r\n <label for=\"\" class=\"form-label\">APELLIDO</label>\r\n <input formControlName=\"lastName\" class=\"form-control rounded-0\" type=\"text\" placeholder=\"Apellido\">\r\n </div>\r\n <div class=\"form-group\">\r\n <label for=\"\" class=\"\">CORREO ELECTRONICO</label>\r\n <input formControlName=\"email\" email required class=\"form-control rounded-0\" type=\"email\"\r\n placeholder=\"Correo electr\u00F3nico\">\r\n </div>\r\n <div class=\"form-group\">\r\n <label for=\"\" class=\"form-label\">CONTRASE\u00D1A</label>\r\n <input formControlName=\"plainPassword\" required class=\"form-control rounded-0\" type=\"password\"\r\n placeholder=\"Contrase\u00F1a\">\r\n </div>\r\n <div class=\"form-group\">\r\n <label for=\"\" class=\"form-label\">REPETIR CONTRASE\u00D1A</label>\r\n <input formControlName=\"plainPassword2\" required class=\"form-control rounded-0\" type=\"password\"\r\n placeholder=\"Repetir contrase\u00F1a\">\r\n </div>\r\n\r\n <div class=\"custom-control d-flex flex-row form-check custom-checkbox mr-sm-2 mt-4 mb-2\">\r\n <input type=\"checkbox\" formControlName=\"terms\" required class=\"custom-control-input form-check-input\" name=\"Color2\"\r\n id=\"Color2\">\r\n <label class=\"custom-control-label ff-ubuntu-light font-sm form-check-label\" for=\"Color2\"> He\r\n le\u00EDdo y acepto las pol\u00EDticas de privacidad y los t\u00E9rminos y\r\n condiciones</label>\r\n </div>\r\n\r\n <div class=\"custom-control d-flex flex-row form-check custom-checkbox mr-sm-2 mb-4\">\r\n <input type=\"checkbox\" formControlName=\"newsletter\" class=\"custom-control-input form-check-input\" name=\"Color3\" id=\"Color3\">\r\n <label class=\"custom-control-label form-check-label ff-ubuntu-light font-sm\" for=\"Color3\">\r\n Suscripci\u00F3n al Newsletter</label>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <button [disabled]=\"registerForm.invalid\" type=\"submit\"\r\n class=\"btn btn-primary px-5 py-2 h-fit\">CREAR</button>\r\n </div>\r\n </div>\r\n </form>\r\n @if(loading){\r\n <app-loading-section-ec />\r\n }\r\n \r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.CheckboxRequiredValidator, selector: "input[type=checkbox][required][formControlName],input[type=checkbox][required][formControl],input[type=checkbox][required][ngModel]" }, { kind: "directive", type: i1$3.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: LoadingSectionEcComponent, selector: "app-loading-section-ec" }] });
|
|
8258
8376
|
}
|
|
@@ -9007,6 +9125,7 @@ class CartItemEcComponent {
|
|
|
9007
9125
|
_cartService = inject(CartService);
|
|
9008
9126
|
_toastService = inject(ToastService);
|
|
9009
9127
|
_constants = inject(CoreConstantsService);
|
|
9128
|
+
parametersService = inject(ParametersService);
|
|
9010
9129
|
mediaUrl = this._constants.mediaUrl();
|
|
9011
9130
|
quantity = 0;
|
|
9012
9131
|
variantsToShow = ['TALLA', 'COLOR'];
|
|
@@ -9093,6 +9212,9 @@ class CartItemEcComponent {
|
|
|
9093
9212
|
}
|
|
9094
9213
|
return false; // Solo se ejecuta si no se cumple la condición
|
|
9095
9214
|
}
|
|
9215
|
+
// PARAMETROS
|
|
9216
|
+
parameters$ = this.parametersService.getParameters();
|
|
9217
|
+
hasParams = this.parametersService.hasParams;
|
|
9096
9218
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CartItemEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9097
9219
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CartItemEcComponent, isStandalone: true, selector: "app-cart-item-ec", inputs: { item: "item", inSidebar: "inSidebar" }, ngImport: i0, template: "@if(!inSidebar){\r\n<p>cart-item-ec works!</p>\r\n}@else{\r\n\r\n<div class=\"row\">\r\n <div class=\"col-3\">\r\n @let product= item.product;\r\n @if(item.variant_id && product.variants.length>0){\r\n <img [src]=\"mediaUrl + product.variants[0].images[0]\" alt=\"\" class=\"img-fluid\">\r\n }@else{\r\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"\" class=\"img-fluid\">\r\n }\r\n </div>\r\n <div class=\"col-7\">\r\n <div class=\"info d-flex flex-column align-items-start\">\r\n @if (item.product.special_mark?.length > 0 || item.product.saleprice) {\r\n <div class=\"marcas\">\r\n <img [src]=\"mediaUrl + (item.product.special_mark?.[0]?.images[0] || '')\" alt=\"\">\r\n\r\n @if (item.product.saleprice) {\r\n <div class=\"tag-dsc\">\r\n {{\r\n createDiscountMessage(item.product.saleprice,\r\n item.product.price)\r\n }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n <a class=\"title text-dark text-decoration-none m-0 p-0 h6 mb-0\"\r\n [routerLink]=\"['/product', item.variant_id]\">{{\r\n item.product.name | titlecase\r\n }}</a>\r\n <div class=\"qty1\">\r\n <span>{{ item.product.id}}</span>\r\n </div>\r\n <div class=\"price h6 fw-bold mb-0 pb-0\">{{ item.product.price | ecCurrencySymbol\r\n }}</div>\r\n @if(getVariants(item); as options){\r\n <div class=\"d-flex align-items-center p-0\">\r\n @for(option of options; track $index){\r\n <span class=\"me-1\"> {{option.name | titlecase}}:</span>\r\n @if(option.name == 'COLOR'){\r\n <div class=\"p-2 rounded\" [style.background]=\"'#' + option.value\"></div>\r\n }@else{\r\n <b>{{option.value}}</b>\r\n }\r\n }\r\n </div>\r\n }\r\n <div class=\"campoCantidad mt-2\">\r\n <div class=\"numero\">\r\n <button (click)=\"less(item.product.variants[0]?.stock)\" class=\"btn btn-outline-secondary\"\r\n type=\"button\" id=\"button-addon1\">\r\n <i class=\"fa fa-minus\" aria-hidden=\"true\"></i>\r\n </button>\r\n <input type=\"text\" class=\"form-control text-center\" placeholder=\"\"\r\n aria-label=\"Example text with button addon\" aria-describedby=\"button-addon1\"\r\n [value]=\"item.quantity\" min=\"1\" step=\"1\" [(ngModel)]=\"quantity\"\r\n (change)=\"updateQuantity(item.product.variants[0]?.stock)\">\r\n <button (click)=\"plus(item.product.variants[0]?.stock)\" class=\"btn btn-outline-secondary\"\r\n type=\"button\" id=\"button-addon1\">\r\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-2\">\r\n <a (click)=\"deleteCartItem()\" class=\"btn botBorrar\"><i class=\"fa fa-trash\" aria-hidden=\"true\"></i></a>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n}", styles: [""], dependencies: [{ kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: EcCurrencySymbolPipe, name: "ecCurrencySymbol" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
9098
9220
|
}
|