Commit 70f4b98e8960f55ed396f81b5bfdbc27da907e5e

Authored by Luis Suarez
Exists in develop

Merge branch 'develop' of http://git.focasoftware.com/angular/autoservicio-axion into develop

bajando version mas reciente
Showing 45 changed files   Show diff stats
... ... @@ -17,7 +17,7 @@ function createWindow() {
17 17 win.setFullScreen(true);
18 18  
19 19 // uncomment below to open the //DevTools.
20   - win.webContents.openDevTools()
  20 + // win.webContents.openDevTools()
21 21  
22 22 // Event when the window is closed.
23 23 win.on('closed', function () {
... ... @@ -4200,9 +4200,9 @@
4200 4200 }
4201 4201 },
4202 4202 "defer-to-connect": {
4203   - "version": "1.1.1",
4204   - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz",
4205   - "integrity": "sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==",
  4203 + "version": "1.1.3",
  4204 + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
  4205 + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
4206 4206 "dev": true
4207 4207 },
4208 4208 "define-properties": {
... ... @@ -4473,9 +4473,9 @@
4473 4473 "dev": true
4474 4474 },
4475 4475 "electron": {
4476   - "version": "7.1.6",
4477   - "resolved": "https://registry.npmjs.org/electron/-/electron-7.1.6.tgz",
4478   - "integrity": "sha512-0QSxQYYzSrBRbctKgAWS79k/I+vm95I7bz/zTuF0Qv4PvTtQf5hK21q6wtyKVPPJFFXnmSyvfQ2ce6iktfgK8g==",
  4476 + "version": "7.1.11",
  4477 + "resolved": "https://registry.npmjs.org/electron/-/electron-7.1.11.tgz",
  4478 + "integrity": "sha512-YDXfnovKY+8iZ5ISQh1kRqYIRKbpOSxGXCx2WVxPFPutEQ7Q/Xzr3h4GePEY25/NXMytMfhKaAZAYjtWUm3r9Q==",
4479 4479 "dev": true,
4480 4480 "requires": {
4481 4481 "@electron/get": "^1.0.1",
... ... @@ -4484,9 +4484,9 @@
4484 4484 },
4485 4485 "dependencies": {
4486 4486 "@types/node": {
4487   - "version": "12.12.21",
4488   - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.21.tgz",
4489   - "integrity": "sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA==",
  4487 + "version": "12.12.26",
  4488 + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz",
  4489 + "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==",
4490 4490 "dev": true
4491 4491 }
4492 4492 }
... ... @@ -5596,9 +5596,9 @@
5596 5596 },
5597 5597 "dependencies": {
5598 5598 "core-js": {
5599   - "version": "3.6.0",
5600   - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.0.tgz",
5601   - "integrity": "sha512-AHPTNKzyB+YwgDWoSOCaid9PUSEF6781vsfiK8qUz62zRR448/XgK2NtCbpiUGizbep8Lrpt0Du19PpGGZvw3Q==",
  5599 + "version": "3.6.4",
  5600 + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
  5601 + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==",
5602 5602 "dev": true,
5603 5603 "optional": true
5604 5604 }
1 1 {
2 2 "name": "autoservicio-axion",
3   - "version": "0.0.1",
  3 + "version": "1.0.0",
4 4 "main": "main.js",
5 5 "scripts": {
6 6 "ng": "ng",
7 7 "start": "ng serve --port 4206 --host 0.0.0.0 --disableHostCheck",
8 8 "build": "ng build",
9   - "build-prod": "ng build --prod --aot=true --build--optimizer=true",
  9 + "build-prod": "ng build --prod",
10 10 "test": "ng test",
11 11 "lint": "ng lint",
12 12 "e2e": "ng e2e",
13 13 "electron": "electron .",
14   - "electron-build": "ng build --prod --aot=true --build--optimizer=true && electron .",
15   - "build-exe": "electron-packager . --platform=win32 --arch=x64"
  14 + "electron-build": "ng build --prod && electron .",
  15 + "build-exe": "electron-packager . --platform=win32 --arch=x64 --asar --icon=src/favicon.ico"
16 16 },
17 17 "private": true,
18 18 "dependencies": {
... ... @@ -50,7 +50,7 @@
50 50 "@types/node": "~8.9.4",
51 51 "codelyzer": "^5.0.0",
52 52 "devtron": "^1.4.0",
53   - "electron": "^7.1.6",
  53 + "electron": "^7.1.11",
54 54 "jasmine-core": "~3.4.0",
55 55 "jasmine-spec-reporter": "~4.2.1",
56 56 "karma": "~4.1.0",
src/app/interfaces/IArticulo.ts
... ... @@ -30,6 +30,7 @@ export interface IArticulo {
30 30 CODP?: number;
31 31 SECA?: number;
32 32 SECP?: number;
  33 + MKT_DESC?: string;
33 34 }
34 35  
35 36 export interface ICodigoBarra {
src/app/interfaces/IComanda.ts
... ... @@ -20,6 +20,7 @@ export interface IComandaDetalle {
20 20 idArticulo: number;
21 21 componentes: IComponente[];
22 22 seeDetalle?: boolean;
  23 + MKT_DESC?: string;
23 24 }
24 25  
25 26 export interface IComponente {
src/app/modules/carrito/carrito.component.ts
... ... @@ -14,7 +14,7 @@ import { ANIMATIONS } from 'src/app/utils/animations';
14 14 animations: [ANIMATIONS.EnterLeaveX]
15 15 })
16 16 export class CarritoComponent implements OnInit, OnDestroy {
17   - urlImagenes = `${APP_SETTINGS.apiDeboSuite}/imagenes/`;
  17 + urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`;
18 18 maxCantidad = 50;
19 19 modalRef: BsModalRef;
20 20  
src/app/modules/comanda/comanda.component.html
... ... @@ -18,7 +18,7 @@
18 18 <div class="card-body p-2">
19 19 <div class="row justify-content-between">
20 20 <img
21   - src="../../../assets/img/para-llevar-fondo-sombra.png"
  21 + src="assets/img/para-llevar-fondo-sombra.png"
22 22 class="w-25 h-25 float-left ml-0 mt-n3"
23 23 *ngIf="comanda.paraLlevar == true">
24 24 <div></div>
... ... @@ -50,12 +50,12 @@
50 50 }">
51 51 <!-- DETALLE Y CANTIDAD -->
52 52 <p>
53   - <small>{{detalle.DetLar}}</small><br>
  53 + <small>{{detalle.MKT_DESC ? detalle.MKT_DESC.toUpperCase() : detalle.DetArt.toUpperCase()}}</small><br>
54 54 <small>CANT.{{detalle.cantidad}}</small>
55 55 </p>
56 56 <div *ngFor="let componente of detalle.componentes">
57 57 <p *ngIf="componente.DetArt !== 'Producto ingrediente general'">
58   - <small>{{componente.DetArt.toUpperCase()}}</small>
  58 + <small>{{componente.DetArt.toLowerCase()}}</small>
59 59 </p>
60 60 </div>
61 61 </div>
... ... @@ -72,13 +72,13 @@
72 72 (click)="updateComanda(comanda, 2, 'En elaboracion')">
73 73 <div class="row justify-content-between">
74 74 <div></div>
75   - <p class="ml-4" style="color: #fff;">Elaborar</p>
  75 + <p class="ml-4 text-white">Elaborar</p>
76 76 <img
77   - draggable="false"
78   - ondragstart="return false;"
79   - (contextmenu)="false"
80   - class="icon-30 mr-2"
81   - src="assets/img/ir.svg">
  77 + draggable="false"
  78 + ondragstart="return false;"
  79 + (contextmenu)="false"
  80 + class="icon-30 mr-2"
  81 + src="assets/img/ir.svg">
82 82 </div>
83 83 </button>
84 84 <button
src/app/modules/info-formas-pago/info-formas-pago.component.html
... ... @@ -69,7 +69,7 @@
69 69 src="assets/img/icono-cajero.svg">
70 70 </div>
71 71 <div class="modal-body text-center h1 mt-2 mb-4">
72   - Por favor, hacรฉ tu pedido en la caja.
  72 + hacรฉ tu pedido<br>en caja.
73 73 </div>
74 74 </div>
75 75 </ng-template>
src/app/modules/info-formas-pago/info-formas-pago.component.ts
... ... @@ -22,7 +22,7 @@ export class InfoFormasPagoComponent implements OnInit, OnDestroy {
22 22 }
23 23  
24 24 openGoCaja(templateRef: TemplateRef<any>) {
25   - const modalRef = this.modalService.show(templateRef, { class: 'modal-promo modal-dialog-centered' });
  25 + const modalRef = this.modalService.show(templateRef, { class: 'modal-lg modal-dialog-centered' });
26 26 this.timer = setTimeout(() => {
27 27 modalRef.hide();
28 28 }, 3000);
src/app/modules/mensaje-final/mensaje-final.component.html
... ... @@ -24,7 +24,7 @@
24 24 (contextmenu)="false"
25 25 class="img-in-top px-4 bg-white"
26 26 src="assets/img/ticket.svg">
27   - <p class="h6 mb-2"><small>PRESENTร EL TICKET EN CAJA Y AGUARDร TU PEDIDO</small></p>
  27 + <p class="h6 mb-2"><small>NO TE VAYAS SIN TU TICKET.<br>PRESENTALO AL RETIRAR TU PEDIDO.</small></p>
28 28 <p class="h2 text-primary">Nรบmero de pedido {{articuloService.idComanda}}</p>
29 29 </div>
30 30 </div>
src/app/modules/mensaje-final/mensaje-final.component.ts
... ... @@ -18,7 +18,7 @@ export class MensajeFinalComponent implements OnInit {
18 18 ngOnInit() {
19 19 this.timer = setTimeout(() => {
20 20 this.goToSplash();
21   - }, 10000);
  21 + }, 15000);
22 22 this.mediaPantalla();
23 23 }
24 24  
src/app/modules/pago-electronico/pago-electronico.component.ts
1   -import { Component, OnInit } from '@angular/core';
  1 +import { Component, OnInit, OnDestroy } from '@angular/core';
2 2 import { ArticuloService } from 'src/app/services/articulo/articulo.service';
3 3 import { Router } from '@angular/router';
4 4 import { APP_SETTINGS } from 'src/etc/AppSettings';
  5 +import { BsModalService } from 'ngx-bootstrap/modal';
  6 +import { ErrorFormaPagoComponent } from 'src/app/shared/error-forma-pago/error-forma-pago.component';
  7 +import { Subscription } from 'rxjs';
5 8  
6 9 @Component({
7 10 selector: 'app-pago-electronico',
8 11 templateUrl: './pago-electronico.component.html',
9 12 styleUrls: ['./pago-electronico.component.scss']
10 13 })
11   -export class PagoElectronicoComponent implements OnInit {
12   - urlQr = `${APP_SETTINGS.apiDeboSuite}/qr/${APP_SETTINGS.deploy}/${APP_SETTINGS.codigoP}/tienda/${APP_SETTINGS.terminal}`;
  14 +export class PagoElectronicoComponent implements OnInit, OnDestroy {
  15 + urlQr = `${APP_SETTINGS.apiImagenes}/qr/${APP_SETTINGS.deploy}/${APP_SETTINGS.codigoP}/tienda/${APP_SETTINGS.terminal}`;
  16 + subscription: Subscription;
13 17  
14 18 constructor(
15 19 private articuloService: ArticuloService,
16 20 private router: Router,
  21 + private modalService: BsModalService,
17 22 ) { }
18 23  
19 24 ngOnInit() {
... ... @@ -25,13 +30,26 @@ export class PagoElectronicoComponent implements OnInit {
25 30 pedidoAnombreDe: ''
26 31 };
27 32 dataPago.pedidoAnombreDe = '';
28   - this.articuloService.pay(dataPago)
  33 + this.subscription = this.articuloService.pay(dataPago)
29 34 .subscribe((res: any) => {
30 35 this.articuloService.idComanda = res.data;
31 36 this.router.navigate(['mensaje-final']);
32   - }, err => console.error(err));
  37 + }, (err) => {
  38 + this.modalService.show(ErrorFormaPagoComponent, {
  39 + class: 'modal-lg modal-dialog-centered',
  40 + ignoreBackdropClick: true,
  41 + });
  42 + });
33 43 this.mediaPantalla();
34 44 }
  45 +
  46 + ngOnDestroy() {
  47 + if (this.subscription) this.subscription.unsubscribe();
  48 + for (let i = 1; i <= this.modalService.getModalsCount(); i++) {
  49 + this.modalService.hide(i);
  50 + }
  51 + }
  52 +
35 53 mediaPantalla() {
36 54 if ($('body').hasClass('media-pantalla')) {
37 55 $('.qr-mt').addClass('media-pantalla');
src/app/modules/pago-electronico/pago-electronico.module.ts
... ... @@ -3,13 +3,16 @@ import { CommonModule } from &#39;@angular/common&#39;;
3 3  
4 4 import { PagoElectronicoRoutingModule } from './pago-electronico-routing.module';
5 5 import { PagoElectronicoComponent } from './pago-electronico.component';
  6 +import { PagoTarjetaModule } from '../pago-tarjeta/pago-tarjeta.module';
6 7  
7 8  
8 9 @NgModule({
9 10 declarations: [PagoElectronicoComponent],
10 11 imports: [
11 12 CommonModule,
12   - PagoElectronicoRoutingModule
13   - ]
  13 + PagoElectronicoRoutingModule,
  14 + PagoTarjetaModule,
  15 + ],
  16 + entryComponents: []
14 17 })
15 18 export class PagoElectronicoModule { }
src/app/modules/pago-tarjeta/pago-tarjeta.component.html
... ... @@ -18,9 +18,9 @@
18 18 (contextmenu)="false"
19 19 class="img-in-top px-4 bg-white"
20 20 src="assets/img/icono-tarjetas.svg">
21   - <p class="h6 m-0">AHORA</p>
  21 + <p class="h6 m-0">AHORA ESPERร QUE SE ACTIVE EL POSNET</p>
22 22 <p class="h2 mb-3 text-secondary">
23   - introducรญ o insertรก tu tarjeta
  23 + deslizรก tu tarjeta
24 24 </p>
25 25 <p class="h6 m-0">Y SEGUร LAS INSTRUCCIONES DEL LECTOR</p>
26 26 </div>
... ... @@ -57,3 +57,14 @@
57 57 </div>
58 58 </div>
59 59 </div>
  60 +
  61 +<ng-template #template>
  62 + <div class="modal-body rounded bg-primary">
  63 + <h1 class="text-white text-center my-4">Por favor,<br>esperรก un momento</h1>
  64 + <div class="d-flex justify-content-center mt-2 mb-4">
  65 + <div class="spinner-border text-white text-center" role="status">
  66 + <span class="sr-only">Loading...</span>
  67 + </div>
  68 + </div>
  69 + </div>
  70 +</ng-template>
src/app/modules/pago-tarjeta/pago-tarjeta.component.scss
... ... @@ -52,3 +52,8 @@
52 52 .pago-tarjeta.media-pantalla{
53 53 margin-top: 50px !important;
54 54 }
  55 +
  56 +.spinner-border {
  57 + width: 5rem;
  58 + height: 5rem;
  59 +}
src/app/modules/pago-tarjeta/pago-tarjeta.component.ts
1   -import { Component, OnInit } from '@angular/core';
  1 +import { Component, OnInit, TemplateRef, OnDestroy, ViewChild } from '@angular/core';
2 2 import { ArticuloService } from 'src/app/services/articulo/articulo.service';
3 3 import { Router } from '@angular/router';
  4 +import { BsModalService } from 'ngx-bootstrap/modal';
  5 +import { ErrorFormaPagoComponent } from 'src/app/shared/error-forma-pago/error-forma-pago.component';
  6 +import { Subscription } from 'rxjs';
4 7  
5 8 @Component({
6 9 selector: 'app-pago-tarjeta',
7 10 templateUrl: './pago-tarjeta.component.html',
8 11 styleUrls: ['./pago-tarjeta.component.scss']
9 12 })
10   -export class PagoTarjetaComponent implements OnInit {
  13 +export class PagoTarjetaComponent implements OnInit, OnDestroy {
  14 + timer: any;
  15 + @ViewChild('template', {static: true}) public template: TemplateRef<any>;
  16 + subscription: Subscription;
11 17  
12 18 constructor(
13 19 private articuloService: ArticuloService,
14 20 private router: Router,
  21 + private modalService: BsModalService,
15 22 ) { }
16 23  
17 24 ngOnInit() {
... ... @@ -19,20 +26,41 @@ export class PagoTarjetaComponent implements OnInit {
19 26 this.router.navigate(['']);
20 27 return;
21 28 }
  29 + this.openModalEspera(this.template);
22 30 const dataPago = {
23 31 pedidoAnombreDe: ''
24 32 };
25   - this.articuloService.pay(dataPago)
  33 + this.subscription = this.articuloService.pay(dataPago)
26 34 .subscribe((res: any) => {
27 35 this.articuloService.idComanda = res.data;
28 36 this.router.navigate(['mensaje-final']);
29   - }, err => console.error(err));
  37 + }, (err) => {
  38 + this.modalService.show(ErrorFormaPagoComponent, {
  39 + class: 'modal-lg modal-dialog-centered',
  40 + ignoreBackdropClick: true,
  41 + });
  42 + });
30 43 this.mediaPantalla();
31 44 }
32 45  
  46 + ngOnDestroy() {
  47 + if (this.subscription) this.subscription.unsubscribe();
  48 + if (this.timer) clearTimeout(this.timer);
  49 + for (let i = 1; i <= this.modalService.getModalsCount(); i++) {
  50 + this.modalService.hide(i);
  51 + }
  52 + }
  53 +
33 54 mediaPantalla() {
34 55 if ($('body').hasClass('media-pantalla')) {
35 56 $('.pago-tarjeta').addClass('media-pantalla');
36 57 }
37 58 }
  59 +
  60 + openModalEspera(templateRef: TemplateRef<any>) {
  61 + const modalRef = this.modalService.show(templateRef, { class: 'modal-lg modal-dialog-centered' });
  62 + this.timer = setTimeout(() => {
  63 + modalRef.hide();
  64 + }, 6000);
  65 + }
38 66 }
src/app/modules/pago-tarjeta/pago-tarjeta.module.ts
... ... @@ -3,13 +3,20 @@ import { CommonModule } from &#39;@angular/common&#39;;
3 3  
4 4 import { PagoTarjetaRoutingModule } from './pago-tarjeta-routing.module';
5 5 import { PagoTarjetaComponent } from './pago-tarjeta.component';
  6 +import { ErrorFormaPagoComponent } from 'src/app/shared/error-forma-pago/error-forma-pago.component';
  7 +import { ModalModule } from 'ngx-bootstrap/modal';
6 8  
7 9  
8 10 @NgModule({
9   - declarations: [PagoTarjetaComponent],
  11 + declarations: [
  12 + PagoTarjetaComponent,
  13 + ErrorFormaPagoComponent,
  14 + ],
10 15 imports: [
11 16 CommonModule,
12   - PagoTarjetaRoutingModule
13   - ]
  17 + PagoTarjetaRoutingModule,
  18 + ModalModule.forRoot(),
  19 + ],
  20 + entryComponents: [ErrorFormaPagoComponent]
14 21 })
15 22 export class PagoTarjetaModule { }
src/app/modules/pedidos-salientes/pedidos-salientes.component.html
... ... @@ -5,7 +5,7 @@
5 5 ondragstart="return false;"
6 6 (contextmenu)="false"
7 7 class="w-60 h-auto d-block mx-auto"
8   - src="../../../assets/img/logo-spot.svg">
  8 + src="assets/img/logo-spot.svg">
9 9 </div>
10 10 </div>
11 11 <div class="row mt-n5 mx-0 justify-content-around h-75">
src/app/modules/seleccion-articulos/filtro-categorias/filtro-categorias.component.html
... ... @@ -27,7 +27,7 @@
27 27 ondragstart="return false;"
28 28 (contextmenu)="false"
29 29 class="col-12 img-fluid align-self-end d-none
30   - d-sm-block rounded-circle w-100 h-auto"
  30 + d-sm-block rounded-circle h-50"
31 31 src="assets/img/logo-spot.svg">
32 32 <small class="col-12 px-0 my-1 h-100 h-md-25 align-self-end text-center text-truncate">Todos</small>
33 33 </div>
... ... @@ -43,8 +43,7 @@
43 43 draggable="false"
44 44 ondragstart="return false;"
45 45 (contextmenu)="false"
46   - class="col-12 img-fluid align-self-end d-none
47   - d-sm-block rounded-circle w-100 h-auto"
  46 + class="d-none d-sm-block rounded-circle w-auto h-75"
48 47 src="{{urlImagenes}}{{categoria.path_imagen}}"
49 48 onerror="this.src='assets/img/imagen-no-encontrada.jpg'">
50 49 <small class="col-12 px-1 my-1 h-100 h-md-25 align-self-end text-center text-truncate">{{categoria.detalle}}</small>
src/app/modules/seleccion-articulos/filtro-categorias/filtro-categorias.component.ts
... ... @@ -18,7 +18,7 @@ export class FiltroCategoriasComponent implements OnInit {
18 18 categoriaActive = null;
19 19 allActive = true;
20 20 queMostrar = 'todos';
21   - urlImagenes = `${APP_SETTINGS.apiDeboSuite}/imagenes/`;
  21 + urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`;
22 22  
23 23 constructor(
24 24 private categoriaService: CategoriaService,
src/app/modules/seleccion-articulos/seleccion-articulos.component.html
... ... @@ -28,6 +28,14 @@
28 28 <div
29 29 class="col-7 col-sm-9 col-xl-10 pb-3 h-100 align-self-center scroll-y-visible"
30 30 (scroll)="scrollEvent($event)">
  31 + <!-- SPINNER -->
  32 + <div
  33 + class="d-flex justify-content-center"
  34 + *ngIf="loading">
  35 + <div class="spinner-border text-primary mt-5" role="status">
  36 + <span class="sr-only">Loading...</span>
  37 + </div>
  38 + </div>
31 39 <div class="row row-cols-1 row-cols-sm-3 row-cols-xl-6">
32 40 <!-- ARTICULO -->
33 41 <div
src/app/modules/seleccion-articulos/seleccion-articulos.component.scss
... ... @@ -11,3 +11,8 @@
11 11 .d-contents {
12 12 display: contents !important;
13 13 }
  14 +
  15 +.spinner-border {
  16 + width: 10rem;
  17 + height: 10rem;
  18 +}
src/app/modules/seleccion-articulos/seleccion-articulos.component.ts
... ... @@ -20,9 +20,9 @@ import { ANIMATIONS } from &#39;src/app/utils/animations&#39;;
20 20 animations: [ANIMATIONS.EnterLeaveY]
21 21 })
22 22 export class SeleccionArticulosComponent implements OnInit, AfterViewInit, OnDestroy {
23   - showSpinner = true;
  23 + loading = true;
24 24 timeoutHandler: any;
25   - urlImagenes = `${APP_SETTINGS.apiDeboSuite}/imagenes/`;
  25 + urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`;
26 26 articulos: IArticulo[] = [];
27 27 auxArticulos: IArticulo[] = [];
28 28 showQuantity = 100;
... ... @@ -67,7 +67,6 @@ export class SeleccionArticulosComponent implements OnInit, AfterViewInit, OnDes
67 67 localStorage.setItem('articulos', JSON.stringify(result));
68 68 this.setProductos();
69 69 }, (error) => {
70   - this.showSpinner = false;
71 70 console.error(error);
72 71 });
73 72 }
... ... @@ -75,6 +74,7 @@ export class SeleccionArticulosComponent implements OnInit, AfterViewInit, OnDes
75 74 setProductos() {
76 75 this.articulos = JSON.parse(localStorage.getItem('articulos'));
77 76 this.filterItems();
  77 + this.loading = false;
78 78 }
79 79  
80 80 filterItems() {
... ... @@ -129,24 +129,32 @@ export class SeleccionArticulosComponent implements OnInit, AfterViewInit, OnDes
129 129 }
130 130  
131 131 openModalPromos(articulo: IArticulo) {
  132 + if (this.modalRef) return;
  133 + this.articuloService.setArticulosSinImagen([articulo]);
132 134 this.modalRef = this.modalService.show(PromocionComponent, {
133 135 initialState: { articulosPromo: [articulo] },
134   - class: 'modal-promo modal-dialog-centered'
  136 + class: 'modal-dialog-centered',
  137 + ignoreBackdropClick: true,
135 138 });
  139 + this.modalRef.content.onClose
  140 + .subscribe(() => this.modalRef = null);
136 141 this.mediaPantalla();
137 142 }
138 143  
139 144 openModalSinonimos(sinonimosData: ISinonimo[], articulo: IArticulo) {
  145 + if (this.modalRef) return;
140 146 this.modalRef = this.modalService.show(SinonimoComponent, {
141 147 initialState: {
142 148 sinonimos: sinonimosData,
143 149 articulo
144 150 },
145   - class: 'modal-promo modal-dialog-centered'
  151 + class: 'modal-dialog-centered',
  152 + ignoreBackdropClick: true,
146 153 });
147 154  
148 155 this.modalRef.content.onClose
149 156 .subscribe((res: any) => {
  157 + this.modalRef = null;
150 158 for (const a of articulo.productos) {
151 159 for (const aRes of res.articulos) {
152 160 if (a.idSinonimo === aRes.ID_SIN) {
src/app/services/articulo/articulo.service.ts
... ... @@ -57,7 +57,7 @@ export class ArticuloService {
57 57 setArticulo(articulo: IArticulo) {
58 58 articulo.cantidad = 1;
59 59 for (const articuloCarrito of this.carrito) {
60   - if (articuloCarrito.id === articulo.id && !articulo.productos.length) {
  60 + if (articuloCarrito.id === articulo.id && !articulo.productos) {
61 61 articuloCarrito.cantidad++;
62 62 this.calcularTotal();
63 63 return;
... ... @@ -87,10 +87,14 @@ export class ArticuloService {
87 87 pedidoAnombreDe: dataPago.pedidoAnombreDe,
88 88 numeroPlanilla: APP_SETTINGS.numeroPlanilla,
89 89 pedidoParaLlevar: localStorage.getItem('pedidoParaLlevar'),
  90 + terminal: APP_SETTINGS.terminal
90 91 })
91 92 .subscribe((data) => {
92 93 observer.next(data);
93 94 observer.complete();
  95 + }, err => {
  96 + observer.error(err);
  97 + observer.complete();
94 98 });
95 99 });
96 100 });
... ... @@ -100,6 +104,7 @@ export class ArticuloService {
100 104 this.articuloAcargar = undefined;
101 105 this.promoAcargar = undefined;
102 106 this.carrito = [];
  107 + this.calcularTotal();
103 108 }
104 109  
105 110 setArticulosSinImagen(articulos: IArticulo[]) {
src/app/services/inactive-screen/inactive-screen.service.ts
... ... @@ -13,7 +13,11 @@ export class InactiveScreenService {
13 13  
14 14 startTimeOutInactividad() {
15 15 this.timerReposo = setTimeout(() => {
16   - this.router.navigate(['cancelar-compra']);
  16 + if (this.router.url === '/pago-electronico' || this.router.url === '/pago-tarjeta') {
  17 + this.startTimeOutInactividad();
  18 + } else {
  19 + this.router.navigate(['cancelar-compra']);
  20 + }
17 21 }, 90000);
18 22 }
19 23 }
src/app/shared/cancelar-compra/cancelar-compra.component.html
1 1 <div class="row justify-content-center mt-2 h-15">
2   - <img class="h-100 w-auto my-auto" src="../../../assets/img/logo-spot.svg">
  2 + <img class="h-100 w-auto my-auto" src="assets/img/logo-spot.svg">
3 3 </div>
4 4 <div class="row mx-auto h-70">
5 5 <div class="col-12 align-self-center">
6 6 <div class="row mt-5 mx-0 justify-content-around">
7 7 <div class="col-12 col-sm-8 col-md-6 col-lg-4">
8 8 <div class="p-3 bg-white text-center shadow-lg rounded">
9   - <p class="mt-4 h4">NECESITA</p>
  9 + <p class="mt-4 h4">NECESITรS</p>
10 10 <p class="font-weight-bold text-secondary my-4 h2">mรกs tiempo</p>
11   - <p class="mb-4 h4">PARA SU PEDIDO?</p>
  11 + <p class="mb-4 h4">PARA TU PEDIDO?</p>
12 12 </div>
13 13 </div>
14 14 </div>
src/app/shared/cancelar-compra/cancelar-compra.component.ts
... ... @@ -32,7 +32,7 @@ export class CancelarCompraComponent implements OnInit, OnDestroy {
32 32 }
33 33  
34 34 limpiarCarritoYvolver() {
35   - this.articuloService.carrito = [];
  35 + this.articuloService.cleanShoppingCar();
36 36 this.router.navigate(['/']);
37 37 }
38 38 }
src/app/shared/confirmacion/confirmacion.component.html
1   -<div class="modal-header bg-primary rounded-top pt-4 px-2">
2   - <div class="row mx-0 w-100 justify-content-between">
3   - <div class="col-8">
4   - <p *ngIf="titleMessage" class="h3 text-white">{{titleMessage}}</p>
5   - </div>
6   - </div>
7   - <div *ngIf="imagenPath" class="col-4 align-self-center">
  1 +<div class="bg-primary rounded">
  2 + <div class="modal-header">
8 3 <img
9   - draggable="false"
10   - ondragstart="return false;"
11   - (contextmenu)="false"
12   - src="{{urlImagenes}}{{imagenPath}}"
13   - onerror="this.src='assets/img/imagen-no-encontrada.jpg'"
14   - class="card-img-top img-fluid rounded-circle">
15   - </div>
16   -</div>
17   -<div class=" col-12 modal-body bg-primary rounded-bottom pb-3 px-2">
18   - <div class="row justify-content-between mx-0 w-100">
19   - <div class="col-8">
20   - <p *ngIf="footerMessageFirst" class="text-white"><small>{{footerMessageFirst}}</small></p >
21   - <h1 *ngIf="footerMessageSecond" class="text-white mb-4">{{footerMessageSecond}}</h1>
  4 + draggable="false"
  5 + ondragstart="return false;"
  6 + (contextmenu)="false"
  7 + (click)="close()"
  8 + class="btn-effect icon-30 mt-2 mr-2 position-absolute right-0 top-0 z-index"
  9 + src="assets/img/icono-cancelar-blanco.svg">
  10 + <div class="row no-gutters w-100 justify-content-between">
  11 + <div class="col align-self-center">
  12 + <p *ngIf="titleMessage" class="h3 text-white">{{titleMessage}}</p>
  13 + </div>
  14 + <div *ngIf="imagenPath" class="col-4 px-3 pt-3 align-self-center">
  15 + <img
  16 + draggable="false"
  17 + ondragstart="return false;"
  18 + (contextmenu)="false"
  19 + src="{{urlImagenes}}{{imagenPath}}"
  20 + onerror="this.src='assets/img/imagen-no-encontrada.jpg'"
  21 + class="d-block mx-auto img-fluid rounded-circle">
  22 + </div>
22 23 </div>
23   - <div class="col-4">
24   - <div
25   - class="mx-0"
26   - (click)="confirmarArticulo()">
27   - <div class="col-auto bg-white badge-pill">
28   - <div class="row justify-content-between">
29   - <div *ngIf="footerConfirmation" class="col-auto px-0 align-self-center text-primary pl-3">
30   - <p class="font-weight-bold">{{footerConfirmation | currency}}</p>
31   - </div>
32   - <div class="col-auto px-0">
33   - <img
34   - draggable="false"
35   - ondragstart="return false;"
36   - (contextmenu)="false"
37   - class="d-block ml-auto my-1 icon-30 pr-2"
38   - src="assets/img/ir-color.svg">
39   - </div>
  24 + </div>
  25 + <div class="modal-body">
  26 + <div class="row justify-content-between mx-0 w-100">
  27 + <div class="col-7 col-md-8 pl-0 align-self-center">
  28 + <p *ngIf="footerMessageFirst" class="text-white"><small>{{footerMessageFirst}}</small></p >
  29 + <p *ngIf="footerMessageSecond" class="h1 text-white">{{footerMessageSecond}}</p>
  30 + </div>
  31 + <div class="col-5 col-md-4 align-self-center">
  32 + <div
  33 + class="row justify-content-between bg-white badge-pill btn-effect"
  34 + *ngIf="footerConfirmation"
  35 + (click)="confirmar()">
  36 + <div class="col-auto px-0 align-self-center text-primary pl-3">
  37 + <p class="font-weight-bold">{{footerConfirmation | currency}}</p>
  38 + </div>
  39 + <div class="col-auto px-0">
  40 + <img
  41 + draggable="false"
  42 + ondragstart="return false;"
  43 + (contextmenu)="false"
  44 + class="d-block ml-auto my-1 icon-20"
  45 + src="assets/img/ir-color.svg">
40 46 </div>
41 47 </div>
42   - </div>
43   - <div *ngIf="footerClose" class="bg-white badge-pill mt-2">
44   - <div class="row justify-content-between">
45   - <div
46   - class="col-auto mx-0 "
47   - (click)="close()">
48   - <p class="font-weight-bold text-center text-primary">{{footerClose}}</p>
  48 + <div
  49 + *ngIf="footerClose"
  50 + class="row justify-content-center bg-white badge-pill btn-effect mt-2"
  51 + (click)="close()">
  52 + <div class="col-auto px-0 ml-auto">
  53 + <p class="font-weight-bold text-primary">{{footerClose}}</p>
49 54 </div>
50   - <i class="fas fa-undo-alt text-info mr-3 my-auto"></i>
  55 + <i class="fas fa-undo-alt text-info ml-auto my-auto"></i>
51 56 </div>
52 57 </div>
53 58 </div>
src/app/shared/confirmacion/confirmacion.component.ts
... ... @@ -17,7 +17,7 @@ export class ConfirmacionComponent implements OnInit {
17 17 footerConfirmation: number;
18 18 footerClose: string;
19 19 onClose: Subject<any>;
20   - urlImagenes = `${APP_SETTINGS.apiDeboSuite}/imagenes/`;
  20 + urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`;
21 21  
22 22 constructor(
23 23 public modalRef: BsModalRef,
... ... @@ -29,12 +29,13 @@ export class ConfirmacionComponent implements OnInit {
29 29 ngOnInit() {
30 30 }
31 31  
32   - confirmarArticulo() {
33   - this.onClose.next();
  32 + confirmar() {
  33 + this.onClose.next(true);
34 34 this.modalRef.hide();
35 35 }
36 36  
37 37 close() {
  38 + this.onClose.next();
38 39 this.modalRef.hide();
39 40 }
40 41  
src/app/shared/error-forma-pago/error-forma-pago.component.html
... ... @@ -0,0 +1,17 @@
  1 +<div class="bg-primary text-center rounded">
  2 + <div class="modal-body">
  3 + <p class="h1 text-white text-center mx-3">Algo saliรณ mal, intentalo de nuevo o</p>
  4 + <p class="h1 text-white text-center mx-3 mb-3">probรก con otra forma de pago</p>
  5 + <div
  6 + class="d-inline-block py-1 btn-effect bg-white badge-pill"
  7 + (click)="continuar()">
  8 + CONTINUAR
  9 + <img
  10 + draggable="false"
  11 + ondragstart="return false;"
  12 + (contextmenu)="false"
  13 + class="icon-30"
  14 + src="assets/img/ir-color.svg">
  15 + </div>
  16 + </div>
  17 +</div>
src/app/shared/error-forma-pago/error-forma-pago.component.scss
src/app/shared/error-forma-pago/error-forma-pago.component.spec.ts
... ... @@ -0,0 +1,25 @@
  1 +import { async, ComponentFixture, TestBed } from '@angular/core/testing';
  2 +
  3 +import { ErrorFormaPagoComponent } from './error-forma-pago.component';
  4 +
  5 +describe('ErrorFormaPagoComponent', () => {
  6 + let component: ErrorFormaPagoComponent;
  7 + let fixture: ComponentFixture<ErrorFormaPagoComponent>;
  8 +
  9 + beforeEach(async(() => {
  10 + TestBed.configureTestingModule({
  11 + declarations: [ ErrorFormaPagoComponent ]
  12 + })
  13 + .compileComponents();
  14 + }));
  15 +
  16 + beforeEach(() => {
  17 + fixture = TestBed.createComponent(ErrorFormaPagoComponent);
  18 + component = fixture.componentInstance;
  19 + fixture.detectChanges();
  20 + });
  21 +
  22 + it('should create', () => {
  23 + expect(component).toBeTruthy();
  24 + });
  25 +});
src/app/shared/error-forma-pago/error-forma-pago.component.ts
... ... @@ -0,0 +1,24 @@
  1 +import { Component, OnInit } from '@angular/core';
  2 +import { Location } from '@angular/common';
  3 +import { BsModalRef } from 'ngx-bootstrap/modal';
  4 +
  5 +@Component({
  6 + selector: 'app-error-forma-pago',
  7 + templateUrl: './error-forma-pago.component.html',
  8 + styleUrls: ['./error-forma-pago.component.scss']
  9 +})
  10 +export class ErrorFormaPagoComponent implements OnInit {
  11 +
  12 + constructor(
  13 + private location: Location,
  14 + private modalRef: BsModalRef,
  15 + ) { }
  16 +
  17 + ngOnInit() { }
  18 +
  19 + continuar() {
  20 + this.location.back();
  21 + this.modalRef.hide();
  22 + }
  23 +
  24 +}
src/app/shared/footer/footer.component.ts
... ... @@ -30,7 +30,6 @@ export class FooterComponent implements OnInit {
30 30 .carrito-articulo,
31 31 .carrito-content,
32 32 .pago-tarjeta,
33   - .modal-promo,
34 33 .modal-content,
35 34 .qr-mt`)
36 35 .toggleClass('media-pantalla');
src/app/shared/header-publicidad/header-publicidad.component.html
1   -<div class="row mx-0" id="headerPublicidad" #headerPublicidad
  1 +<div class="row mx-0 btn-effect" id="headerPublicidad" #headerPublicidad
2 2 [ngClass]="headerPublicidad.classList.contains('media-pantalla')
3 3 ? 'h-31' : 'h-20'" id="boxCarrito">
4 4 <div class="col-12 p-3 h-100" id="headerPad">
src/app/shared/header-publicidad/header-publicidad.component.ts
... ... @@ -18,9 +18,10 @@ import * as _ from &#39;lodash&#39;;
18 18 styleUrls: ['./header-publicidad.component.scss']
19 19 })
20 20 export class HeaderPublicidadComponent implements OnInit {
21   - urlImagenes = `${APP_SETTINGS.apiDeboSuite}/imagenes/`;
  21 + urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`;
22 22 publicidades: IPublicidad[] = [];
23 23 modalRef: BsModalRef;
  24 + modalSinonimo: BsModalRef;
24 25  
25 26 constructor(
26 27 private publicidadService: PublicidadService,
... ... @@ -59,29 +60,34 @@ export class HeaderPublicidadComponent implements OnInit {
59 60 }
60 61  
61 62 openModalPromos(articulo: IArticulo) {
  63 + if (this.modalRef) return;
62 64 this.modalRef = this.modalService.show(PromocionComponent,
63 65 {
64 66 initialState: {
65 67 idArticulo: articulo.id
66 68 },
67   - class: 'modal-promo modal-dialog-centered'
  69 + class: 'modal-dialog-centered'
68 70 });
69 71 }
70 72  
71 73 openModalConfirmacion(articulo: IArticulo) {
  74 + if (this.modalRef) return;
  75 + this.articuloService.setArticulosSinImagen([articulo]);
72 76 this.modalRef = this.modalService.show(ConfirmacionComponent,
73 77 {
74 78 initialState: {
75 79 titleMessage: articulo.DET_LAR,
76 80 imagenPath: articulo.imagenes.length ? articulo.imagenes[0].imagen : 'assets/img/imagen-no-encontrada.jpg',
77   - footerMessageFirst: `ยฟDESEA AGREGAR ESTE ARTรCULO`,
78   - footerMessageSecond: `a su carrito?`,
79   - footerConfirmation: articulo.PreVen,
80   - footerClose: `volver`
  81 + footerMessageFirst: `ยฟQUERร‰S AGREGAR ESTE COMBO`,
  82 + footerMessageSecond: `a tu carrito?`,
  83 + footerConfirmation: articulo.PreVen
81 84 },
82   - class: 'modal-promo modal-dialog-centered'
  85 + ignoreBackdropClick: true,
  86 + class: 'modal-dialog-centered'
83 87 });
84   - this.modalRef.content.onClose.subscribe(() => {
  88 + this.modalRef.content.onClose.subscribe((resClose) => {
  89 + this.modalRef = null;
  90 + if (!resClose) return;
85 91 this.sinonimoService.getSinonimos(articulo.CodSec, articulo.CodArt)
86 92 .subscribe((res: ISinonimo[]) => {
87 93 if (res.length) {
... ... @@ -102,14 +108,15 @@ export class HeaderPublicidadComponent implements OnInit {
102 108 }
103 109  
104 110 openModalSinonimos(sinonimosData: ISinonimo[], articulo: IArticulo) {
105   - const modalSinonimo = this.modalService.show(SinonimoComponent, {
  111 + if (this.modalSinonimo) return;
  112 + this.modalSinonimo = this.modalService.show(SinonimoComponent, {
106 113 initialState: {
107 114 sinonimos: sinonimosData,
108 115 articulo
109 116 },
110   - class: 'modal-promo modal-dialog-centered'
  117 + class: 'modal-dialog-centered'
111 118 });
112   - modalSinonimo.content.onClose
  119 + this.modalSinonimo.content.onClose
113 120 .subscribe((res: any) => {
114 121 for (const a of articulo.productos) {
115 122 for (const aRes of res.articulos) {
src/app/shared/promocion/promocion.component.html
1   -<!-- <div class="d-flex justify-content-center"
2   - *ngIf="loading">
3   - <div class="spinner-border text-primary" role="status">
4   - <span class="sr-only">Loading...</span>
5   - </div>
6   -</div> -->
7   -<div class="modal-header bg-primary rounded-top pt-4 px-2" *ngIf="articulosPromo.length">
8   - <img
9   - draggable="false"
10   - ondragstart="return false;"
11   - (contextmenu)="false"
12   - (click)="selectPromo(articulosPromo[0])"
13   - class="btn-effect mt-n3 icon-30 mr-2 position-absolute right-0"
14   - src="assets/img/icono-cancelar-blanco.svg">
15   - <div class="row mx-0 w-100 justify-content-between mt-3">
16   - <div class="col-8">
17   - <p class="h3 mt-n2 text-white">{{articulosPromo[0].DetArt}}</p>
18   - </div>
19   - <div class="col-4 align-self-center">
20   - <div
21   - class="row mx-0 justify-content-between bg-white badge-pill"
22   - (click)="selectPromo(articulosPromo[0])">
23   - <div class="col px-0 align-self-center text-primary">
24   - <p class="font-weight-bold">{{articulosPromo[0].PreVen | currency}}</p>
25   - </div>
26   - <div class="col-3 px-0">
27   - <img
28   - draggable="false"
29   - ondragstart="return false;"
30   - (contextmenu)="false"
31   - class="d-block ml-auto py-1 icon-30 mr-2 pt-2"
32   - src="assets/img/ir-color.svg">
33   - </div>
  1 +<div class="bg-primary rounded">
  2 + <div class="modal-header" *ngIf="articulosPromo.length">
  3 + <img
  4 + draggable="false"
  5 + ondragstart="return false;"
  6 + (contextmenu)="false"
  7 + (click)="selectPromo(articulosPromo[0])"
  8 + class="btn-effect icon-30 mt-2 mr-2 position-absolute top-0 right-0 z-index"
  9 + src="assets/img/icono-cancelar-blanco.svg">
  10 + <div class="row w-100 no-gutters justify-content-between">
  11 + <div class="col align-self-center">
  12 + <p class="h3 text-white">{{articulosPromo[0].MKT_DESC ? articulosPromo[0].MKT_DESC.toUpperCase() : articulosPromo[0].DetArt.toUpperCase()}}</p>
34 13 </div>
35   - </div>
36   - </div>
37   -</div>
38   -<div class="modal-body bg-primary rounded-bottom pb-3 px-2" *ngIf="articulosPromo.length">
39   - <div class="row mx-0 w-100">
40   - <div class="col-9">
41   - <p class="text-white"><small>ยฟTE GUSTARรA LLEVAR ESTE ARTรCULO</small></p>
42   - <h1 class="text-white mb-4">en un combo?</h1>
43   - </div>
44   - <div class="col-3">
45   - <img
46   - draggable="false"
47   - ondragstart="return false;"
48   - (contextmenu)="false"
49   - src="{{urlImagenes}}{{articulosPromo[0].imagenes[0].imagen}}"
50   - onerror="this.src='assets/img/imagen-no-encontrada.jpg'"
51   - class="card-img-top img-fluid rounded-circle">
52   - </div>
53   - </div>
54   - <div
55   - class="row mx-0 lista-promociones scroll-y-visible"
56   - (scroll)="scrollEvent($event)">
57   - <div class="col-12">
58   - <div *ngFor="let promo of promociones">
  14 + <div class="col-auto align-self-center mt-4 pl-2">
59 15 <div
60   - class="mx-0 mb-2 btn-effect bg-white badge-pill text-primary"
61   - (click)="selectPromo(promo)">
62   - <div class="d-flex">
63   - <p class="text-truncate mr-auto my-auto"><small>{{promo.DetArt}}</small></p>
64   - <p class="font-weight-bold my-auto pr-2">
65   - <span>{{promo.PreVen | currency}}</span>
66   - </p>
  16 + class="row mx-0 justify-content-between bg-white badge-pill btn-effect"
  17 + (click)="selectPromo(articulosPromo[0])">
  18 + <div class="col-auto align-self-center text-primary">
  19 + <p class="font-weight-bold">{{articulosPromo[0].PreVen | currency}}</p>
  20 + </div>
  21 + <div class="col-auto px-0">
67 22 <img
68 23 draggable="false"
69 24 ondragstart="return false;"
70 25 (contextmenu)="false"
71   - class="d-block ml-auto py-1 icon-30 mr-2 pt-2"
  26 + class="d-block ml-auto my-1 icon-20"
72 27 src="assets/img/ir-color.svg">
73 28 </div>
74 29 </div>
75 30 </div>
76 31 </div>
77 32 </div>
  33 + <div class="modal-body" *ngIf="articulosPromo.length">
  34 + <div class="row no-gutters w-100">
  35 + <div class="col-9 col-9 align-self-center">
  36 + <p class="text-white"><small>ยฟTE GUSTARรA LLEVAR ESTE ARTรCULO</small></p>
  37 + <p class="h1 text-white">en un combo?</p>
  38 + </div>
  39 + <div class="col-3">
  40 + <img
  41 + draggable="false"
  42 + ondragstart="return false;"
  43 + (contextmenu)="false"
  44 + src="{{urlImagenes}}{{articulosPromo[0].imagenes[0].imagen}}"
  45 + onerror="this.src='assets/img/imagen-no-encontrada.jpg'"
  46 + class="card-img-top img-fluid rounded-circle">
  47 + </div>
  48 + </div>
  49 + <div
  50 + class="d-flex justify-content-center mt-2"
  51 + *ngIf="loading">
  52 + <div class="spinner-border text-white" role="status">
  53 + <span class="sr-only">Loading...</span>
  54 + </div>
  55 + </div>
  56 + <div
  57 + class="row mt-3 no-gutters lista-promociones scroll-y-visible"
  58 + (scroll)="scrollEvent($event)">
  59 + <div class="col-12">
  60 + <div *ngFor="let promo of promociones; let i = index">
  61 + <div
  62 + [ngClass]="{ 'mt-2': i !== 0 }"
  63 + class="btn-effect bg-white badge-pill text-primary"
  64 + (click)="selectPromo(promo)">
  65 + <div class="d-flex">
  66 + <p class="text-truncate mr-auto my-auto"><small>{{promo.MKT_DESC ? promo.MKT_DESC.toUpperCase() : promo.DetArt.toUpperCase()}}</small></p>
  67 + <p class="font-weight-bold ml-auto my-auto pr-2">
  68 + <span>{{promo.PreVen | currency}}</span>
  69 + </p>
  70 + <img
  71 + draggable="false"
  72 + ondragstart="return false;"
  73 + (contextmenu)="false"
  74 + class="d-block py-1 icon-30"
  75 + src="assets/img/ir-color.svg">
  76 + </div>
  77 + </div>
  78 + </div>
  79 + </div>
  80 + </div>
  81 + </div>
78 82 </div>
src/app/shared/promocion/promocion.component.ts
... ... @@ -20,10 +20,13 @@ export class PromocionComponent implements OnInit {
20 20 articulosPromo: IArticulo[] = [];
21 21 promociones: IArticulo[] = [];
22 22 onClose: Subject<any>;
23   - urlImagenes = `${APP_SETTINGS.apiDeboSuite}/imagenes/`;
  23 + urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`;
  24 + loading = true;
  25 + modalSinonimo: BsModalRef;
  26 + isPromoSelected = false;
24 27  
25 28 constructor(
26   - public modalPromocion: BsModalRef,
  29 + private modalPromocion: BsModalRef,
27 30 private modalService: BsModalService,
28 31 private articuloService: ArticuloService,
29 32 private promocionService: PromocionService,
... ... @@ -38,6 +41,8 @@ export class PromocionComponent implements OnInit {
38 41 }
39 42  
40 43 selectPromo(promo: IArticulo) {
  44 + if (this.isPromoSelected) return;
  45 + this.isPromoSelected = true;
41 46 this.sinonimoService.getSinonimos(promo.CodSec, promo.CodArt)
42 47 .subscribe((res: ISinonimo[]) => {
43 48 if (res.length) {
... ... @@ -51,6 +56,7 @@ export class PromocionComponent implements OnInit {
51 56 } else {
52 57 promo.cantidad = 1;
53 58 this.articuloService.setArticulo(promo);
  59 + this.onClose.next();
54 60 this.modalPromocion.hide();
55 61 }
56 62 }, err => console.error(err));
... ... @@ -58,16 +64,24 @@ export class PromocionComponent implements OnInit {
58 64 }
59 65  
60 66 openModalSinonimos(sinonimosData: ISinonimo[], articulo: IArticulo) {
61   - const modalSinonimo = this.modalService.show(SinonimoComponent, {
  67 + if (this.modalSinonimo) return;
  68 + this.modalSinonimo = this.modalService.show(SinonimoComponent, {
62 69 initialState: {
63 70 sinonimos: sinonimosData,
64 71 articulo
65 72 },
66   - class: 'modal-promo modal-dialog-centered'
  73 + class: 'modal-dialog-centered',
  74 + ignoreBackdropClick: true,
67 75 });
68 76  
69   - modalSinonimo.content.onClose
  77 + this.modalSinonimo.content.onClose
70 78 .subscribe((res: any) => {
  79 + this.modalSinonimo = null;
  80 + if (!res) {
  81 + this.onClose.next();
  82 + this.modalPromocion.hide();
  83 + return;
  84 + }
71 85 for (const a of articulo.productos) {
72 86 for (const aRes of res.articulos) {
73 87 if (a.idSinonimo === aRes.ID_SIN) {
... ... @@ -83,6 +97,7 @@ export class PromocionComponent implements OnInit {
83 97 }
84 98 }
85 99 this.articuloService.setArticulo(articulo);
  100 + this.onClose.next();
86 101 this.modalPromocion.hide();
87 102 });
88 103 }
... ... @@ -93,6 +108,7 @@ export class PromocionComponent implements OnInit {
93 108 this.promocionService.getPromociones(sector, codigo)
94 109 .subscribe((res: IArticulo[]) => {
95 110 this.promociones = res;
  111 + this.loading = false;
96 112 }, error => { console.error(error); });
97 113 }
98 114  
src/app/shared/sinonimo/sinonimo.component.html
1 1 <div class="bg-primary rounded text-white">
2 2 <div class="modal-header">
3   - <p class="col-7 h4 px-0 align-self-center">{{articulo.DetArt}}</p>
4   - <div class="col-5 pr-0 text-right">
  3 + <img
  4 + draggable="false"
  5 + ondragstart="return false;"
  6 + (contextmenu)="false"
  7 + (click)="close()"
  8 + class="btn-effect icon-30 mt-2 mr-2 position-absolute right-0 top-0 z-index"
  9 + src="assets/img/icono-cancelar-blanco.svg">
  10 + <p class="col-7 h4 px-0 align-self-center">{{ articulo.MKT_DESC ? articulo.MKT_DESC.toUpperCase() : articulo.DetArt.toUpperCase() }}</p>
  11 + <div class="col-5 pt-4 pr-0 text-right">
5 12 <p *ngFor="let s of sinonimos; let i = index">
6 13 <span
7 14 class="btn-effect"
src/app/shared/sinonimo/sinonimo.component.ts
... ... @@ -17,6 +17,7 @@ export class SinonimoComponent implements OnInit {
17 17 onClose: Subject<any>;
18 18 articulosSelected: IArticulo[] = [];
19 19 articulo: IArticulo;
  20 + isSinonimoSelected = false;
20 21  
21 22 constructor(
22 23 private modalRef: BsModalRef,
... ... @@ -50,6 +51,8 @@ export class SinonimoComponent implements OnInit {
50 51  
51 52 continue() {
52 53 if (!this.isValid) return;
  54 + if (this.isSinonimoSelected) return;
  55 + this.isSinonimoSelected = true;
53 56 const ID_SINS = [];
54 57 const observables = [];
55 58  
... ... @@ -77,7 +80,12 @@ export class SinonimoComponent implements OnInit {
77 80  
78 81 scrollTo(index: number) {
79 82 const el = document.getElementById(index.toString());
80   - el.scrollIntoView({ behavior: 'smooth', block: 'center' });
  83 + el.scrollIntoView({ behavior: 'smooth' });
  84 + }
  85 +
  86 + close() {
  87 + this.modalRef.hide();
  88 + this.onClose.next();
81 89 }
82 90  
83 91 }
src/assets/img/x-amarilla.svg
... ... @@ -0,0 +1,19 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
  3 +<!-- Creator: CorelDRAW X7 -->
  4 +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="28.6378mm" height="28.6378mm" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
  5 +viewBox="0 0 1704 1704"
  6 + xmlns:xlink="http://www.w3.org/1999/xlink">
  7 + <defs>
  8 + <style type="text/css">
  9 + <![CDATA[
  10 + .fil0 {fill:#F4B223;fill-rule:nonzero}
  11 + ]]>
  12 + </style>
  13 + </defs>
  14 + <g id="Capa_x0020_1">
  15 + <metadata id="CorelCorpID_0Corel-Layer"/>
  16 + <polygon class="fil0" points="510,422 852,790 1194,422 1252,471 910,852 1252,1233 1194,1283 852,914 510,1283 452,1233 794,852 452,471 "/>
  17 + <path class="fil0" d="M852 0c235,0 448,95 603,250 154,154 249,367 249,602 0,235 -95,448 -249,603 -155,154 -368,249 -603,249 -235,0 -448,-95 -602,-249 -155,-155 -250,-368 -250,-603 0,-235 95,-448 250,-602 154,-155 367,-250 602,-250zm562 290c-144,-143 -343,-232 -562,-232 -219,0 -418,89 -562,232 -143,144 -232,343 -232,562 0,219 89,418 232,562 144,144 343,232 562,232 219,0 418,-88 562,-232 144,-144 232,-343 232,-562 0,-219 -88,-418 -232,-562z"/>
  18 + </g>
  19 +</svg>
src/etc/AppSettings.ejemplo.ts
1 1 // export const APP_SETTINGS = {
2 2 // apiDeboSuite: 'http://localhost:1515',
  3 +// apiImagenes: 'http://10.231.45.220:1515',
3 4 // puntoVenta: 9998,
4 5 // numeroPlanilla: 1111,
5 6 // codigoP: 99996,
src/scss/scroll.scss
... ... @@ -2,6 +2,7 @@
2 2  
3 3 .scroll-y {
4 4 overflow-y: auto;
  5 + overflow-x: hidden;
5 6 scrollbar-width: none;
6 7 &::-webkit-scrollbar {
7 8 display: none;
... ... @@ -10,6 +11,7 @@
10 11  
11 12 .scroll-y-visible {
12 13 overflow-y: auto;
  14 + overflow-x: hidden;
13 15 &::-webkit-scrollbar {
14 16 width: 0.75em;
15 17 }
... ... @@ -37,6 +39,7 @@
37 39  
38 40 .scroll-x {
39 41 overflow-x: auto;
  42 + overflow-y: hidden;
40 43 scrollbar-width: none;
41 44 &::-webkit-scrollbar {
42 45 display: none;
src/scss/styles-bootstrap.scss
... ... @@ -69,10 +69,8 @@ $border-radius-sm: 0.5rem;
69 69 background-color: #0000004d;
70 70 }
71 71  
72   -.modal-promo > div {
  72 +.modal-content {
73 73 border: none !important;
74   - border-radius: $border-radius;
75   - margin-left: 10px !important;
76 74 }
77 75  
78 76 .modal-content.media-pantalla {
... ... @@ -62,6 +62,10 @@ p {
62 62 right: 0;
63 63 }
64 64  
  65 +.top-0 {
  66 + top: 0;
  67 +}
  68 +
65 69 .left-0 {
66 70 left: 0;
67 71 }
... ... @@ -94,3 +98,7 @@ p {
94 98 .modal-content {
95 99 background: transparent !important;
96 100 }
  101 +
  102 +.z-index {
  103 + z-index: 1000;
  104 +}