tickera-angular-components 0.0.1-dev.188 → 0.0.1-dev.190

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.
@@ -547,6 +547,8 @@ const PERFORMANCES_API_ROUTES = {
547
547
  seatEventsTicketAdmin: (id) => `/performances/${id}/seat-events/ticket/admin`,
548
548
  seatEvents: (id) => `/performances/${id}/seat-events`,
549
549
  myQrToken: (ticketUuid) => `/performances/tickets/${ticketUuid}/my-qr-token`,
550
+ ticketPdf: (ticketUuid) => `/performances/tickets/${ticketUuid}/pdf`,
551
+ myTicketPdf: (ticketUuid) => `/performances/tickets/${ticketUuid}/my-pdf`,
550
552
  };
551
553
 
552
554
  const PRICE_ZONES_API_ROUTES = {
@@ -2657,6 +2659,12 @@ class ApiService {
2657
2659
  .get(`${this.apiUrl}${path}`, { headers })
2658
2660
  .pipe(catchError(this.handleError.bind(this)));
2659
2661
  }
2662
+ getBlob(path) {
2663
+ const headers = this.getHeaders(undefined);
2664
+ return this.http
2665
+ .get(`${this.apiUrl}${path}`, { headers, responseType: 'blob' })
2666
+ .pipe(catchError(this.handleError.bind(this)));
2667
+ }
2660
2668
  post(path, body) {
2661
2669
  const headers = this.getHeaders(this.validateContentType(body));
2662
2670
  return this.http
@@ -4843,6 +4851,12 @@ class TicketQrService {
4843
4851
  fetchMyQrToken(ticketUuid) {
4844
4852
  return this.apiService.get(PERFORMANCES_API_ROUTES.myQrToken(ticketUuid));
4845
4853
  }
4854
+ downloadTicketPdf(ticketUuid) {
4855
+ return this.apiService.getBlob(PERFORMANCES_API_ROUTES.ticketPdf(ticketUuid));
4856
+ }
4857
+ downloadMyTicketPdf(ticketUuid) {
4858
+ return this.apiService.getBlob(PERFORMANCES_API_ROUTES.myTicketPdf(ticketUuid));
4859
+ }
4846
4860
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketQrService, deps: [{ token: ApiService }], target: i0.ɵɵFactoryTarget.Injectable });
4847
4861
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketQrService, providedIn: 'root' });
4848
4862
  }
@@ -10501,6 +10515,7 @@ class TicketQrComponent {
10501
10515
  error = signal(false, ...(ngDevMode ? [{ debugName: "error" }] : []));
10502
10516
  refreshing = signal(false, ...(ngDevMode ? [{ debugName: "refreshing" }] : []));
10503
10517
  countdown = signal(0, ...(ngDevMode ? [{ debugName: "countdown" }] : []));
10518
+ downloading = signal(false, ...(ngDevMode ? [{ debugName: "downloading" }] : []));
10504
10519
  destroy$ = new Subject();
10505
10520
  refreshTimeout = null;
10506
10521
  countdownInterval = null;
@@ -10545,6 +10560,28 @@ class TicketQrComponent {
10545
10560
  this.clearTimers();
10546
10561
  this.fetchAndRender();
10547
10562
  }
10563
+ downloadPdf() {
10564
+ if (!isPlatformBrowser(this.platformId) || this.downloading())
10565
+ return;
10566
+ this.downloading.set(true);
10567
+ const request = this.isCustomer
10568
+ ? this.ticketQrService.downloadMyTicketPdf(this.ticketUuid)
10569
+ : this.ticketQrService.downloadTicketPdf(this.ticketUuid);
10570
+ request.pipe(takeUntil$1(this.destroy$)).subscribe({
10571
+ next: (blob) => {
10572
+ this.downloading.set(false);
10573
+ const url = URL.createObjectURL(blob);
10574
+ const anchor = document.createElement('a');
10575
+ anchor.href = url;
10576
+ anchor.download = `boleta-${this.ticketUuid}.pdf`;
10577
+ document.body.appendChild(anchor);
10578
+ anchor.click();
10579
+ anchor.remove();
10580
+ URL.revokeObjectURL(url);
10581
+ },
10582
+ error: () => this.downloading.set(false),
10583
+ });
10584
+ }
10548
10585
  clearTimers() {
10549
10586
  if (this.refreshTimeout) {
10550
10587
  clearTimeout(this.refreshTimeout);
@@ -10623,11 +10660,11 @@ class TicketQrComponent {
10623
10660
  });
10624
10661
  }
10625
10662
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketQrComponent, deps: [{ token: TicketQrService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
10626
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: TicketQrComponent, isStandalone: true, selector: "performance-ticket-qr", inputs: { ticketUuid: "ticketUuid", isCustomer: "isCustomer" }, viewQueries: [{ propertyName: "qrCanvas", first: true, predicate: ["qrCanvas"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"ticket-qr\">\n @if (loading()) {\n <div class=\"ticket-qr__loader\">\n <span class=\"ticket-qr__loader-text\">Cargando QR...</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"ticket-qr__container\">\n <app-alert text=\"Error al cargar el c\u00F3digo QR\" type=\"error\" />\n <app-button text=\"Reintentar\" (clicked)=\"retry()\" [disabled]=\"loading()\" />\n </div>\n }\n\n <div [class.hidden]=\"loading() || error()\" class=\"ticket-qr__container\">\n <div class=\"transition-opacity duration-300\" [class.opacity-50]=\"refreshing()\">\n <canvas #qrCanvas class=\"ticket-qr__canvas\" width=\"256\" height=\"256\"></canvas>\n </div>\n <span class=\"ticket-qr__updating-text\">\n {{ countdown() > 0 ? `Actualizando en ${countdown()}` : '0s' }}\n </span>\n </div>\n</div>\n", styles: [".ticket-qr{align-items:center;display:flex;flex-flow:column nowrap;gap:.75rem;height:auto;padding:1rem;width:100%}.ticket-qr__loader{align-items:center;background-color:#f3f4f6;border-radius:.5rem;display:flex;flex-flow:column nowrap;height:16rem;justify-content:center;width:16rem}.ticket-qr__loader-text{color:#9ca3af;font-size:.875rem}.ticket-qr__container{align-items:center;display:flex;flex-flow:column nowrap;gap:.75rem;width:100%}.ticket-qr__container.hidden{display:none}.ticket-qr__canvas{box-shadow:0 0 10px #0003;border-radius:.5rem}.ticket-qr__updating-text{color:#9ca3af;font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AppButtonComponent, selector: "app-button", inputs: ["disabled", "loading", "type", "variant", "text", "size", "loadingText", "icon", "tooltip"], outputs: ["clicked"] }, { kind: "component", type: AppAlertComponent, selector: "app-alert", inputs: ["type", "text", "closeable", "size"] }] });
10663
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: TicketQrComponent, isStandalone: true, selector: "performance-ticket-qr", inputs: { ticketUuid: "ticketUuid", isCustomer: "isCustomer" }, viewQueries: [{ propertyName: "qrCanvas", first: true, predicate: ["qrCanvas"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"ticket-qr\">\n @if (loading()) {\n <div class=\"ticket-qr__loader\">\n <span class=\"ticket-qr__loader-text\">Cargando QR...</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"ticket-qr__container\">\n <app-alert text=\"Error al cargar el c\u00F3digo QR\" type=\"error\" />\n <app-button text=\"Reintentar\" (clicked)=\"retry()\" [disabled]=\"loading()\" />\n </div>\n }\n\n <div [class.hidden]=\"loading() || error()\" class=\"ticket-qr__container\">\n <div class=\"transition-opacity duration-300\" [class.opacity-50]=\"refreshing()\">\n <canvas #qrCanvas class=\"ticket-qr__canvas\" width=\"256\" height=\"256\"></canvas>\n </div>\n <span class=\"ticket-qr__updating-text\">\n {{ countdown() > 0 ? `Actualizando en ${countdown()}` : '0s' }}\n </span>\n <app-button\n text=\"Descargar QR en PDF\"\n [disabled]=\"loading() || downloading()\"\n (clicked)=\"downloadPdf()\"\n />\n </div>\n</div>\n", styles: [".ticket-qr{align-items:center;display:flex;flex-flow:column nowrap;gap:.75rem;height:auto;padding:1rem;width:100%}.ticket-qr__loader{align-items:center;background-color:#f3f4f6;border-radius:.5rem;display:flex;flex-flow:column nowrap;height:16rem;justify-content:center;width:16rem}.ticket-qr__loader-text{color:#9ca3af;font-size:.875rem}.ticket-qr__container{align-items:center;display:flex;flex-flow:column nowrap;gap:.75rem;width:100%}.ticket-qr__container.hidden{display:none}.ticket-qr__canvas{box-shadow:0 0 10px #0003;border-radius:.5rem}.ticket-qr__updating-text{color:#9ca3af;font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AppButtonComponent, selector: "app-button", inputs: ["disabled", "loading", "type", "variant", "text", "size", "loadingText", "icon", "tooltip"], outputs: ["clicked"] }, { kind: "component", type: AppAlertComponent, selector: "app-alert", inputs: ["type", "text", "closeable", "size"] }] });
10627
10664
  }
10628
10665
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketQrComponent, decorators: [{
10629
10666
  type: Component,
10630
- args: [{ selector: 'performance-ticket-qr', standalone: true, imports: [CommonModule, AppButtonComponent, AppAlertComponent], template: "<div class=\"ticket-qr\">\n @if (loading()) {\n <div class=\"ticket-qr__loader\">\n <span class=\"ticket-qr__loader-text\">Cargando QR...</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"ticket-qr__container\">\n <app-alert text=\"Error al cargar el c\u00F3digo QR\" type=\"error\" />\n <app-button text=\"Reintentar\" (clicked)=\"retry()\" [disabled]=\"loading()\" />\n </div>\n }\n\n <div [class.hidden]=\"loading() || error()\" class=\"ticket-qr__container\">\n <div class=\"transition-opacity duration-300\" [class.opacity-50]=\"refreshing()\">\n <canvas #qrCanvas class=\"ticket-qr__canvas\" width=\"256\" height=\"256\"></canvas>\n </div>\n <span class=\"ticket-qr__updating-text\">\n {{ countdown() > 0 ? `Actualizando en ${countdown()}` : '0s' }}\n </span>\n </div>\n</div>\n", styles: [".ticket-qr{align-items:center;display:flex;flex-flow:column nowrap;gap:.75rem;height:auto;padding:1rem;width:100%}.ticket-qr__loader{align-items:center;background-color:#f3f4f6;border-radius:.5rem;display:flex;flex-flow:column nowrap;height:16rem;justify-content:center;width:16rem}.ticket-qr__loader-text{color:#9ca3af;font-size:.875rem}.ticket-qr__container{align-items:center;display:flex;flex-flow:column nowrap;gap:.75rem;width:100%}.ticket-qr__container.hidden{display:none}.ticket-qr__canvas{box-shadow:0 0 10px #0003;border-radius:.5rem}.ticket-qr__updating-text{color:#9ca3af;font-size:.875rem}\n"] }]
10667
+ args: [{ selector: 'performance-ticket-qr', standalone: true, imports: [CommonModule, AppButtonComponent, AppAlertComponent], template: "<div class=\"ticket-qr\">\n @if (loading()) {\n <div class=\"ticket-qr__loader\">\n <span class=\"ticket-qr__loader-text\">Cargando QR...</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"ticket-qr__container\">\n <app-alert text=\"Error al cargar el c\u00F3digo QR\" type=\"error\" />\n <app-button text=\"Reintentar\" (clicked)=\"retry()\" [disabled]=\"loading()\" />\n </div>\n }\n\n <div [class.hidden]=\"loading() || error()\" class=\"ticket-qr__container\">\n <div class=\"transition-opacity duration-300\" [class.opacity-50]=\"refreshing()\">\n <canvas #qrCanvas class=\"ticket-qr__canvas\" width=\"256\" height=\"256\"></canvas>\n </div>\n <span class=\"ticket-qr__updating-text\">\n {{ countdown() > 0 ? `Actualizando en ${countdown()}` : '0s' }}\n </span>\n <app-button\n text=\"Descargar QR en PDF\"\n [disabled]=\"loading() || downloading()\"\n (clicked)=\"downloadPdf()\"\n />\n </div>\n</div>\n", styles: [".ticket-qr{align-items:center;display:flex;flex-flow:column nowrap;gap:.75rem;height:auto;padding:1rem;width:100%}.ticket-qr__loader{align-items:center;background-color:#f3f4f6;border-radius:.5rem;display:flex;flex-flow:column nowrap;height:16rem;justify-content:center;width:16rem}.ticket-qr__loader-text{color:#9ca3af;font-size:.875rem}.ticket-qr__container{align-items:center;display:flex;flex-flow:column nowrap;gap:.75rem;width:100%}.ticket-qr__container.hidden{display:none}.ticket-qr__canvas{box-shadow:0 0 10px #0003;border-radius:.5rem}.ticket-qr__updating-text{color:#9ca3af;font-size:.875rem}\n"] }]
10631
10668
  }], ctorParameters: () => [{ type: TicketQrService }, { type: Object, decorators: [{
10632
10669
  type: Inject,
10633
10670
  args: [PLATFORM_ID]