ngx-dsxlibrary 1.0.1 → 1.0.3

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.
@@ -212,9 +212,9 @@ class AlertaService {
212
212
  alertaHtmlSuccess(titleAlert, message) {
213
213
  Swal.fire({
214
214
  title: titleAlert,
215
- imageUrl: 'https://firebasestorage.googleapis.com/v0/b/seguridadintegrada-36204.appspot.com/o/Logos%2FSuccess.png?alt=media&token=275135d6-277e-4619-baa5-f76da95ca0eb',
216
- imageWidth: 150,
217
- imageHeight: 120,
215
+ imageUrl: 'assets/icon/check02.png',
216
+ imageWidth: 125,
217
+ imageHeight: 125,
218
218
  imageAlt: 'success 200',
219
219
  html: `
220
220
  <strong>Alerta: </strong><b class='text-success'>${message}</b>
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-dsxlibrary.mjs","sources":["../../../projects/ngx-dsx/src/lib/tokens/environment.token.ts","../../../projects/ngx-dsx/src/lib/services/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.ts","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.html","../../../projects/ngx-dsx/src/lib/services/authorize.service.ts","../../../projects/ngx-dsx/src/lib/services/security.service.ts","../../../projects/ngx-dsx/src/lib/services/alerta.service.ts","../../../projects/ngx-dsx/src/lib/services/error-handler.service.ts","../../../projects/ngx-dsx/src/lib/interceptors/http-authorize.interceptor.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.html","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.ts","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.html","../../../projects/ngx-dsx/src/lib/pipe/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsxlibrary.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport interface EnvironmentConfig {\r\n production: boolean;\r\n myAppUrl: string;\r\n tokenName: string;\r\n tokenNameRF: string;\r\n sessionStatus: string;\r\n refreshTokenExpiry: string;\r\n}\r\n\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig'\r\n);\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SpinnerLoadingService {\r\n // Creamos una señal para el estado de visibilidad\r\n spinnerVisible = signal(false);\r\n\r\n constructor() {}\r\n\r\n // Método para mostrar el spinner\r\n show() {\r\n this.spinnerVisible.set(true);\r\n }\r\n\r\n // Método para ocultar el spinner\r\n hide() {\r\n this.spinnerVisible.set(false);\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading',\r\n imports: [],\r\n templateUrl: './loading.component.html',\r\n styleUrl: './loading.component.scss',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">Desarollo Software Xela</p>\r\n</div>\r\n}\r\n","import { inject, Injectable, isDevMode } from '@angular/core';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CookieService } from 'ngx-cookie-service';\r\nimport { ENVIRONMENT, EnvironmentConfig } from '../tokens/environment.token';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n _cookieService = inject(CookieService);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n\r\n // Función para obtener opciones de cookies estándar\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isProduction,\r\n sameSite: isProduction ? 'None' : 'Lax', // sameSite: 'None',\r\n };\r\n if (isProduction) {\r\n cookieOptions.domain = '.itgtxela.com';\r\n }\r\n return cookieOptions;\r\n }\r\n // Función para establecer una cookie\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n this._cookieService.set(name, value, options);\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n //return localStorage.getItem(environment.tokenName);\r\n }\r\n\r\n getTokenRefresh(): string | null {\r\n //USO EN MODO DESARROLLO\r\n if (isDevMode()) {\r\n const tokenRefresh: string = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n const tokens: ModelToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c',\r\n refreshTokenExpiry: new Date(),\r\n };\r\n !!tokenRefresh ? null : this.tokenReload(tokens);\r\n }\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n //return localStorage.getItem(environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate\r\n );\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: ModelToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n const refreshTokenExpiryDate = new Date();\r\n refreshTokenExpiryDate.setDate(refreshTokenExpiryDate.getDate() + 7); // Refresh token expiry: 7 days\r\n\r\n // Guardar el access token y refresh token\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n\r\n // Almacenar la fecha de expiración del refresh token en localStorage\r\n const expiryDate = new Date(tokens.refreshTokenExpiry).toISOString();\r\n localStorage.setItem(this.environment.refreshTokenExpiry, expiryDate);\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ENVIRONMENT, EnvironmentConfig } from '../tokens/environment.token';\r\nimport { ModelToken } from '../models/src/token.model';\r\nimport { SeguridadITParameter } from '../models/src/securityParameter.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n private http = inject(HttpClient);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private urlApi: string = `${this.environment.myAppUrl}api/authorize`;\r\n\r\n tokenRefresh(refreshToken: string): Observable<ModelToken> {\r\n const body = { refreshToken }; // Enviar el token en formato JSON\r\n return this.http.post<ModelToken>(`${this.urlApi}/TokenRefresh/`, body, {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Asegúrate de que se está enviando como JSON\r\n }),\r\n });\r\n }\r\n\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false\r\n ): Observable<SeguridadITParameter> {\r\n const params = new HttpParams().set('invalidCacheParam', invalidCacheParam);\r\n return this.http.get<SeguridadITParameter>(\r\n `${this.urlApi}/securityParameter/`,\r\n { params }\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n //Update: 2024-10-28 14:58 Arrendamientos\r\n\r\n private toastrService = inject(ToastrService);\r\n /**\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 5. bottom-center 6. bottom-right\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n alertaHtml(titleAlert: string, message: string): void {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: 'assets/image/notFound01.png',\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i class='text-red-300'>${message}</i> <span class='text-blue-600'> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: 2500,\r\n });\r\n }\r\n\r\n alertaHtmlSuccess(titleAlert: string, message: string): void {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl:\r\n 'https://firebasestorage.googleapis.com/v0/b/seguridadintegrada-36204.appspot.com/o/Logos%2FSuccess.png?alt=media&token=275135d6-277e-4619-baa5-f76da95ca0eb',\r\n imageWidth: 150,\r\n imageHeight: 120,\r\n imageAlt: 'success 200',\r\n html: `\r\n <strong>Alerta: </strong><b class='text-success'>${message}</b>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: 2000,\r\n });\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `assets/icon/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n alertConfirm(title: string, text: string, icono: string): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed)\r\n );\r\n }\r\n\r\n //notifyAlertSuccess(message: string) {\r\n // this._notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top'\r\n // }\r\n // });\r\n //}\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n}\r\n","import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { throwError } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\nimport { ErrorModel } from '../models/src/error.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n\r\n handleErrorResponse(error: HttpErrorResponse) {\r\n const err: ErrorModel = error as ErrorModel;\r\n const technicalMessage = `Error status: ${error.status}, Message: ${error.message}, URL: ${error.url}`;\r\n\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage =\r\n 'Solicitud incorrecta (400). Verifica los datos ingresados o validaciones existentes.';\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = 'Acceso no autorizado (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage = 'Un error inesperado ha ocurrido.';\r\n break;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n this._serviceAlerta.alertaHtml(\r\n 'Servicios de Errores',\r\n '<i>Código:</i> ' +\r\n err.status +\r\n ' <i>Message:</i> ' +\r\n userMessage +\r\n `. (${error.error})`\r\n );\r\n\r\n // Imprimir el mensaje técnico\r\n if (isDevMode()) {\r\n console.error(err);\r\n }\r\n\r\n // Retornar el error para continuar con el flujo de manejo de errores\r\n return throwError(() => new Error(technicalMessage));\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { catchError, finalize, Observable, switchMap } from 'rxjs';\r\nimport { inject } from '@angular/core';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n//Update: 2024-01-29 12:00\r\n\r\nlet _activeRequest = 0;\r\n//let isRefreshing = false; // Estado de si se está refrescando el token\r\nlet pendingRequests: any[] = []; // Cola de solicitudes pendientes\r\n\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n //console.log('------ INGRESO A HTTPINTERCEPTOR -------');\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n //Variables\r\n const _token = _authorizeService.getToken();\r\n const _tokenRefresh = _authorizeService.getTokenRefresh();\r\n\r\n //Generar la petición con el token\r\n const authReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_token}`,\r\n },\r\n });\r\n\r\n if (_activeRequest == 0) {\r\n _spinnerService.show();\r\n }\r\n\r\n _activeRequest++;\r\n\r\n return next(authReq).pipe(\r\n catchError((error: HttpErrorResponse): Observable<HttpEvent<any>> => {\r\n // Si el error es 401\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Si no hay refreshToken, finalizar la sesión\r\n if (!_tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco no está disponible.',\r\n })\r\n );\r\n }\r\n\r\n // Intentar refrescar el token si no se está haciendo ya\r\n if (!_authorizeService.isRefreshing) {\r\n // Marcamos que se está refrescando el token\r\n _authorizeService.isRefreshing = true;\r\n\r\n // Intentar refrescar el token\r\n return _securityService.tokenRefresh(_tokenRefresh).pipe(\r\n switchMap((response: ModelToken) => {\r\n if (!response.token || !response.tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco ha expirado.',\r\n })\r\n );\r\n }\r\n\r\n // Recargar el token en el servicio\r\n _authorizeService.tokenReload(response);\r\n\r\n // Generar una nueva solicitud con el token actualizado\r\n const newReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n });\r\n\r\n // Refresco completado\r\n _authorizeService.isRefreshing = false;\r\n\r\n pendingRequests.forEach((pendingReq) => {\r\n const clonedReq = pendingReq.authReq.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_authorizeService.getToken()}`,\r\n },\r\n });\r\n\r\n // Volver a ejecutar las solicitudes pendientes con el nuevo token\r\n next(clonedReq).subscribe({\r\n next: pendingReq.next,\r\n error: pendingReq.error,\r\n complete: pendingReq.complete,\r\n });\r\n });\r\n pendingRequests = []; // Limpiar la cola\r\n\r\n return next(newReq); // Procesar la solicitud original con el nuevo token\r\n }),\r\n catchError((refreshError: HttpErrorResponse) => {\r\n // Finalizamos el refresco si hay error\r\n _authorizeService.isRefreshing = false;\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'Error al refrescar el token. Redirigiendo al login.',\r\n })\r\n );\r\n }),\r\n finalize(() => {\r\n _authorizeService.isRefreshing = false;\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, añadir la solicitud a la cola\r\n return new Observable((observer) => {\r\n pendingRequests.push({\r\n authReq,\r\n next: observer.next.bind(observer),\r\n error: observer.error.bind(observer),\r\n complete: observer.complete.bind(observer),\r\n });\r\n });\r\n }\r\n }\r\n // Si no es un error 401, manejar otros errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n _spinnerService.hide();\r\n }\r\n })\r\n );\r\n};\r\n","import { Component, Input } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n imports: [TagModule],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.scss',\r\n})\r\nexport class AppMessageErrorComponent {\r\n // Control de formulario que se pasa como input\r\n @Input() control!: AbstractControl | null;\r\n @Input() form: FormGroup | null = null;\r\n}\r\n","@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como máximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor mínimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor máximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpModule } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpModule],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<string>('light');\r\n\r\n options: Record<'currency' | 'integer', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n transform(value: any): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría\r\n\r\n // Aplica estilo y colores básicos para diferenciar claves y valores\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\".*?\"):/g, '<span class=\"json-key\">$1</span>:')\r\n .replace(/:\\s(\".*?\")/g, ': <span class=\"json-string\">$1</span>')\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/:\\s(\\d+)/g, ': <span class=\"json-number\">$1</span>');\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/tokens/environment.token';\r\nexport * from './lib/components/loading/loading.component';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/services/security.service';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/components';\r\nexport * from './lib/models';\r\nexport * from './lib/pipe';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-dsxlibrary.mjs","sources":["../../../projects/ngx-dsx/src/lib/tokens/environment.token.ts","../../../projects/ngx-dsx/src/lib/services/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.ts","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.html","../../../projects/ngx-dsx/src/lib/services/authorize.service.ts","../../../projects/ngx-dsx/src/lib/services/security.service.ts","../../../projects/ngx-dsx/src/lib/services/alerta.service.ts","../../../projects/ngx-dsx/src/lib/services/error-handler.service.ts","../../../projects/ngx-dsx/src/lib/interceptors/http-authorize.interceptor.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.html","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.ts","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.html","../../../projects/ngx-dsx/src/lib/pipe/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsxlibrary.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport interface EnvironmentConfig {\r\n production: boolean;\r\n myAppUrl: string;\r\n tokenName: string;\r\n tokenNameRF: string;\r\n sessionStatus: string;\r\n refreshTokenExpiry: string;\r\n}\r\n\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig'\r\n);\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SpinnerLoadingService {\r\n // Creamos una señal para el estado de visibilidad\r\n spinnerVisible = signal(false);\r\n\r\n constructor() {}\r\n\r\n // Método para mostrar el spinner\r\n show() {\r\n this.spinnerVisible.set(true);\r\n }\r\n\r\n // Método para ocultar el spinner\r\n hide() {\r\n this.spinnerVisible.set(false);\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading',\r\n imports: [],\r\n templateUrl: './loading.component.html',\r\n styleUrl: './loading.component.scss',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">Desarollo Software Xela</p>\r\n</div>\r\n}\r\n","import { inject, Injectable, isDevMode } from '@angular/core';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CookieService } from 'ngx-cookie-service';\r\nimport { ENVIRONMENT, EnvironmentConfig } from '../tokens/environment.token';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n _cookieService = inject(CookieService);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n\r\n // Función para obtener opciones de cookies estándar\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isProduction,\r\n sameSite: isProduction ? 'None' : 'Lax', // sameSite: 'None',\r\n };\r\n if (isProduction) {\r\n cookieOptions.domain = '.itgtxela.com';\r\n }\r\n return cookieOptions;\r\n }\r\n // Función para establecer una cookie\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n this._cookieService.set(name, value, options);\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n //return localStorage.getItem(environment.tokenName);\r\n }\r\n\r\n getTokenRefresh(): string | null {\r\n //USO EN MODO DESARROLLO\r\n if (isDevMode()) {\r\n const tokenRefresh: string = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n const tokens: ModelToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c',\r\n refreshTokenExpiry: new Date(),\r\n };\r\n !!tokenRefresh ? null : this.tokenReload(tokens);\r\n }\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n //return localStorage.getItem(environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate\r\n );\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: ModelToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n const refreshTokenExpiryDate = new Date();\r\n refreshTokenExpiryDate.setDate(refreshTokenExpiryDate.getDate() + 7); // Refresh token expiry: 7 days\r\n\r\n // Guardar el access token y refresh token\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n\r\n // Almacenar la fecha de expiración del refresh token en localStorage\r\n const expiryDate = new Date(tokens.refreshTokenExpiry).toISOString();\r\n localStorage.setItem(this.environment.refreshTokenExpiry, expiryDate);\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ENVIRONMENT, EnvironmentConfig } from '../tokens/environment.token';\r\nimport { ModelToken } from '../models/src/token.model';\r\nimport { SeguridadITParameter } from '../models/src/securityParameter.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n private http = inject(HttpClient);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private urlApi: string = `${this.environment.myAppUrl}api/authorize`;\r\n\r\n tokenRefresh(refreshToken: string): Observable<ModelToken> {\r\n const body = { refreshToken }; // Enviar el token en formato JSON\r\n return this.http.post<ModelToken>(`${this.urlApi}/TokenRefresh/`, body, {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Asegúrate de que se está enviando como JSON\r\n }),\r\n });\r\n }\r\n\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false\r\n ): Observable<SeguridadITParameter> {\r\n const params = new HttpParams().set('invalidCacheParam', invalidCacheParam);\r\n return this.http.get<SeguridadITParameter>(\r\n `${this.urlApi}/securityParameter/`,\r\n { params }\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n //Update: 2024-10-28 14:58 Arrendamientos\r\n\r\n private toastrService = inject(ToastrService);\r\n /**\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 5. bottom-center 6. bottom-right\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n alertaHtml(titleAlert: string, message: string): void {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: 'assets/image/notFound01.png',\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i class='text-red-300'>${message}</i> <span class='text-blue-600'> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: 2500,\r\n });\r\n }\r\n\r\n alertaHtmlSuccess(titleAlert: string, message: string): void {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: 'assets/icon/check02.png',\r\n imageWidth: 125,\r\n imageHeight: 125,\r\n imageAlt: 'success 200',\r\n html: `\r\n <strong>Alerta: </strong><b class='text-success'>${message}</b>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: 2000,\r\n });\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `assets/icon/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n alertConfirm(title: string, text: string, icono: string): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed)\r\n );\r\n }\r\n\r\n //notifyAlertSuccess(message: string) {\r\n // this._notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top'\r\n // }\r\n // });\r\n //}\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n}\r\n","import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { throwError } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\nimport { ErrorModel } from '../models/src/error.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n\r\n handleErrorResponse(error: HttpErrorResponse) {\r\n const err: ErrorModel = error as ErrorModel;\r\n const technicalMessage = `Error status: ${error.status}, Message: ${error.message}, URL: ${error.url}`;\r\n\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage =\r\n 'Solicitud incorrecta (400). Verifica los datos ingresados o validaciones existentes.';\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = 'Acceso no autorizado (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage = 'Un error inesperado ha ocurrido.';\r\n break;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n this._serviceAlerta.alertaHtml(\r\n 'Servicios de Errores',\r\n '<i>Código:</i> ' +\r\n err.status +\r\n ' <i>Message:</i> ' +\r\n userMessage +\r\n `. (${error.error})`\r\n );\r\n\r\n // Imprimir el mensaje técnico\r\n if (isDevMode()) {\r\n console.error(err);\r\n }\r\n\r\n // Retornar el error para continuar con el flujo de manejo de errores\r\n return throwError(() => new Error(technicalMessage));\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { catchError, finalize, Observable, switchMap } from 'rxjs';\r\nimport { inject } from '@angular/core';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n//Update: 2024-01-29 12:00\r\n\r\nlet _activeRequest = 0;\r\n//let isRefreshing = false; // Estado de si se está refrescando el token\r\nlet pendingRequests: any[] = []; // Cola de solicitudes pendientes\r\n\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n //console.log('------ INGRESO A HTTPINTERCEPTOR -------');\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n //Variables\r\n const _token = _authorizeService.getToken();\r\n const _tokenRefresh = _authorizeService.getTokenRefresh();\r\n\r\n //Generar la petición con el token\r\n const authReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_token}`,\r\n },\r\n });\r\n\r\n if (_activeRequest == 0) {\r\n _spinnerService.show();\r\n }\r\n\r\n _activeRequest++;\r\n\r\n return next(authReq).pipe(\r\n catchError((error: HttpErrorResponse): Observable<HttpEvent<any>> => {\r\n // Si el error es 401\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Si no hay refreshToken, finalizar la sesión\r\n if (!_tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco no está disponible.',\r\n })\r\n );\r\n }\r\n\r\n // Intentar refrescar el token si no se está haciendo ya\r\n if (!_authorizeService.isRefreshing) {\r\n // Marcamos que se está refrescando el token\r\n _authorizeService.isRefreshing = true;\r\n\r\n // Intentar refrescar el token\r\n return _securityService.tokenRefresh(_tokenRefresh).pipe(\r\n switchMap((response: ModelToken) => {\r\n if (!response.token || !response.tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco ha expirado.',\r\n })\r\n );\r\n }\r\n\r\n // Recargar el token en el servicio\r\n _authorizeService.tokenReload(response);\r\n\r\n // Generar una nueva solicitud con el token actualizado\r\n const newReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n });\r\n\r\n // Refresco completado\r\n _authorizeService.isRefreshing = false;\r\n\r\n pendingRequests.forEach((pendingReq) => {\r\n const clonedReq = pendingReq.authReq.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_authorizeService.getToken()}`,\r\n },\r\n });\r\n\r\n // Volver a ejecutar las solicitudes pendientes con el nuevo token\r\n next(clonedReq).subscribe({\r\n next: pendingReq.next,\r\n error: pendingReq.error,\r\n complete: pendingReq.complete,\r\n });\r\n });\r\n pendingRequests = []; // Limpiar la cola\r\n\r\n return next(newReq); // Procesar la solicitud original con el nuevo token\r\n }),\r\n catchError((refreshError: HttpErrorResponse) => {\r\n // Finalizamos el refresco si hay error\r\n _authorizeService.isRefreshing = false;\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'Error al refrescar el token. Redirigiendo al login.',\r\n })\r\n );\r\n }),\r\n finalize(() => {\r\n _authorizeService.isRefreshing = false;\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, añadir la solicitud a la cola\r\n return new Observable((observer) => {\r\n pendingRequests.push({\r\n authReq,\r\n next: observer.next.bind(observer),\r\n error: observer.error.bind(observer),\r\n complete: observer.complete.bind(observer),\r\n });\r\n });\r\n }\r\n }\r\n // Si no es un error 401, manejar otros errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n _spinnerService.hide();\r\n }\r\n })\r\n );\r\n};\r\n","import { Component, Input } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n imports: [TagModule],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.scss',\r\n})\r\nexport class AppMessageErrorComponent {\r\n // Control de formulario que se pasa como input\r\n @Input() control!: AbstractControl | null;\r\n @Input() form: FormGroup | null = null;\r\n}\r\n","@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como máximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor mínimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor máximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpModule } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpModule],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<string>('light');\r\n\r\n options: Record<'currency' | 'integer', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n transform(value: any): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría\r\n\r\n // Aplica estilo y colores básicos para diferenciar claves y valores\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\".*?\"):/g, '<span class=\"json-key\">$1</span>:')\r\n .replace(/:\\s(\".*?\")/g, ': <span class=\"json-string\">$1</span>')\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/:\\s(\\d+)/g, ': <span class=\"json-number\">$1</span>');\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/tokens/environment.token';\r\nexport * from './lib/components/loading/loading.component';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/services/security.service';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/components';\r\nexport * from './lib/models';\r\nexport * from './lib/pipe';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-dsxlibrary",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Libreria para control de código automatizado.",
5
5
  "author": "DevSoftXela <cfuentes1985@hotmail.com>",
6
6
  "peerDependencies": {
@@ -21,10 +21,6 @@
21
21
  "types": "./index.d.ts",
22
22
  "default": "./fesm2022/ngx-dsxlibrary.mjs"
23
23
  },
24
- "./src/lib/interceptors": {
25
- "types": "./src/lib/interceptors/index.d.ts",
26
- "default": "./fesm2022/ngx-dsxlibrary-src-lib-interceptors.mjs"
27
- },
28
24
  "./src/lib/components": {
29
25
  "types": "./src/lib/components/index.d.ts",
30
26
  "default": "./fesm2022/ngx-dsxlibrary-src-lib-components.mjs"
@@ -33,6 +29,10 @@
33
29
  "types": "./src/lib/models/index.d.ts",
34
30
  "default": "./fesm2022/ngx-dsxlibrary-src-lib-models.mjs"
35
31
  },
32
+ "./src/lib/interceptors": {
33
+ "types": "./src/lib/interceptors/index.d.ts",
34
+ "default": "./fesm2022/ngx-dsxlibrary-src-lib-interceptors.mjs"
35
+ },
36
36
  "./src/lib/pipe": {
37
37
  "types": "./src/lib/pipe/index.d.ts",
38
38
  "default": "./fesm2022/ngx-dsxlibrary-src-lib-pipe.mjs"
@@ -1,76 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { Input, Component, input } from '@angular/core';
3
- import * as i1 from 'primeng/tag';
4
- import { TagModule } from 'primeng/tag';
5
- import * as i1$1 from 'ngx-countup';
6
- import { CountUpModule } from 'ngx-countup';
7
-
8
- class AppMessageErrorComponent {
9
- // Control de formulario que se pasa como input
10
- control;
11
- form = null;
12
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AppMessageErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.0", type: AppMessageErrorComponent, isStandalone: true, selector: "app-message-error", inputs: { control: "control", form: "form" }, ngImport: i0, template: "@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como m\u00E1ximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor m\u00EDnimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor m\u00E1ximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una direcci\u00F3n de correo\r\n v\u00E1lida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error a\u00FAn no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: TagModule }, { kind: "component", type: i1.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }] });
14
- }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AppMessageErrorComponent, decorators: [{
16
- type: Component,
17
- args: [{ selector: 'app-message-error', imports: [TagModule], template: "@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como m\u00E1ximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor m\u00EDnimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor m\u00E1ximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una direcci\u00F3n de correo\r\n v\u00E1lida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error a\u00FAn no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n" }]
18
- }], propDecorators: { control: [{
19
- type: Input
20
- }], form: [{
21
- type: Input
22
- }] } });
23
-
24
- class KpicardComponent {
25
- //type = input.required<string>();
26
- option = input.required();
27
- label = input.required();
28
- iconType = input('fa-regular fa-bell');
29
- color = input();
30
- valor = input(0);
31
- theme = input('light');
32
- options = {
33
- currency: {
34
- startVal: 0,
35
- duration: 0.5,
36
- prefix: 'Q',
37
- decimalPlaces: 2, // Decimales
38
- useGrouping: true, // Separador de miles
39
- separator: ',', // Carácter separador
40
- decimal: '.', // Carácter decimal
41
- suffix: ' GTQ', // Sufijo
42
- scrollSpyDelay: 200, // Retardo antes de la animación
43
- enableScrollSpy: true,
44
- scrollSpyOnce: true,
45
- },
46
- integer: {
47
- startVal: 0,
48
- duration: 0.5,
49
- prefix: 'Cant. ',
50
- decimalPlaces: 2, // Decimales
51
- useGrouping: true, // Separador de miles
52
- separator: ',', // Carácter separador
53
- decimal: '.', // Carácter decimal
54
- scrollSpyDelay: 200, // Retardo antes de la animación
55
- enableScrollSpy: true,
56
- scrollSpyOnce: true,
57
- },
58
- };
59
- // ✅ Método auxiliar para obtener la opción con seguridad
60
- getSelectedOption() {
61
- return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`
62
- }
63
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: KpicardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
64
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.0", type: KpicardComponent, isStandalone: true, selector: "app-kpicard", inputs: { option: { classPropertyName: "option", publicName: "option", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, iconType: { classPropertyName: "iconType", publicName: "iconType", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, valor: { classPropertyName: "valor", publicName: "valor", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n", styles: [".icon{float:right;font-size:500%;position:absolute;top:0rem;right:-.3rem;opacity:.2}.icon-light{color:#000}.icon-dark{color:#fff}#container{width:1200px;display:flex}.grey-dark{background:#495057;color:#efefef}.red-gradient{background:linear-gradient(180deg,#cf5252,#790909 80%);color:#fff}.red{background:#a83b3b;color:#fff}.purple{background:#886ab5;color:#fff}.orange{background:#ffc241;color:#fff}.kpi-card{overflow:hidden;position:relative;box-shadow:1px 1px 3px #000000bf;display:inline-block;float:left;padding:1em;border-radius:.3em;font-family:sans-serif;width:240px;min-width:180px;margin-left:.5em;margin-top:.5em}.card-value-light{display:block;font-size:200%;font-weight:bolder;background:linear-gradient(45deg,#00fffc,#a200ff,#0094ff);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 0 5px rgba(0,255,252,.3),0 0 10px rgba(162,0,255,.2),0 0 15px rgba(0,148,255,.1)}.card-value-dark{display:block;font-size:200%;font-weight:bolder;background:linear-gradient(45deg,#ff7e5f,#feb47b,#ff6a00);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 0 5px rgba(255,126,95,.5),0 0 10px rgba(254,180,123,.4),0 0 15px rgba(255,106,0,.3)}.card-text-light{display:block;font-family:Orbitron,sans-serif;font-size:90%;padding-left:.2em;color:#495057}.card-text-dark{display:block;font-family:Orbitron,sans-serif;font-size:90%;padding-left:.2em;color:#d5d7d8}\n"], dependencies: [{ kind: "ngmodule", type: CountUpModule }, { kind: "directive", type: i1$1.CountUpDirective, selector: "[countUp]", inputs: ["countUp", "options", "reanimateOnClick"], outputs: ["complete"] }] });
65
- }
66
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: KpicardComponent, decorators: [{
67
- type: Component,
68
- args: [{ selector: 'app-kpicard', imports: [CountUpModule], template: "<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n", styles: [".icon{float:right;font-size:500%;position:absolute;top:0rem;right:-.3rem;opacity:.2}.icon-light{color:#000}.icon-dark{color:#fff}#container{width:1200px;display:flex}.grey-dark{background:#495057;color:#efefef}.red-gradient{background:linear-gradient(180deg,#cf5252,#790909 80%);color:#fff}.red{background:#a83b3b;color:#fff}.purple{background:#886ab5;color:#fff}.orange{background:#ffc241;color:#fff}.kpi-card{overflow:hidden;position:relative;box-shadow:1px 1px 3px #000000bf;display:inline-block;float:left;padding:1em;border-radius:.3em;font-family:sans-serif;width:240px;min-width:180px;margin-left:.5em;margin-top:.5em}.card-value-light{display:block;font-size:200%;font-weight:bolder;background:linear-gradient(45deg,#00fffc,#a200ff,#0094ff);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 0 5px rgba(0,255,252,.3),0 0 10px rgba(162,0,255,.2),0 0 15px rgba(0,148,255,.1)}.card-value-dark{display:block;font-size:200%;font-weight:bolder;background:linear-gradient(45deg,#ff7e5f,#feb47b,#ff6a00);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 0 5px rgba(255,126,95,.5),0 0 10px rgba(254,180,123,.4),0 0 15px rgba(255,106,0,.3)}.card-text-light{display:block;font-family:Orbitron,sans-serif;font-size:90%;padding-left:.2em;color:#495057}.card-text-dark{display:block;font-family:Orbitron,sans-serif;font-size:90%;padding-left:.2em;color:#d5d7d8}\n"] }]
69
- }] });
70
-
71
- /**
72
- * Generated bundle index. Do not edit.
73
- */
74
-
75
- export { AppMessageErrorComponent, KpicardComponent };
76
- //# sourceMappingURL=ngx-dsx-src-lib-components.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-dsx-src-lib-components.mjs","sources":["../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.html","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.ts","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.html","../../../projects/ngx-dsx/src/lib/components/ngx-dsx-src-lib-components.ts"],"sourcesContent":["import { Component, Input } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n imports: [TagModule],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.scss',\r\n})\r\nexport class AppMessageErrorComponent {\r\n // Control de formulario que se pasa como input\r\n @Input() control!: AbstractControl | null;\r\n @Input() form: FormGroup | null = null;\r\n}\r\n","@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como máximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor mínimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor máximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpModule } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpModule],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<string>('light');\r\n\r\n options: Record<'currency' | 'integer', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- //# sourceMappingURL=ngx-dsx-src-lib-interceptors.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-dsx-src-lib-interceptors.mjs","sources":["../../../projects/ngx-dsx/src/lib/interceptors/ngx-dsx-src-lib-interceptors.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;AAEG"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- //# sourceMappingURL=ngx-dsx-src-lib-models.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-dsx-src-lib-models.mjs","sources":["../../../projects/ngx-dsx/src/lib/models/ngx-dsx-src-lib-models.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;AAEG"}
@@ -1,35 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { Pipe } from '@angular/core';
3
-
4
- class JsonHighlightPipe {
5
- transform(value) {
6
- if (!value) {
7
- return '';
8
- }
9
- const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría
10
- // Aplica estilo y colores básicos para diferenciar claves y valores
11
- return json
12
- .replace(/&/g, '&amp;')
13
- .replace(/</g, '&lt;')
14
- .replace(/>/g, '&gt;')
15
- .replace(/(".*?"):/g, '<span class="json-key">$1</span>:')
16
- .replace(/:\s(".*?")/g, ': <span class="json-string">$1</span>')
17
- .replace(/\b(true|false|null)\b/g, '<span class="json-boolean">$1</span>')
18
- .replace(/:\s(\d+)/g, ': <span class="json-number">$1</span>');
19
- }
20
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: JsonHighlightPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
21
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.0", ngImport: i0, type: JsonHighlightPipe, isStandalone: true, name: "jsonHighlight" });
22
- }
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: JsonHighlightPipe, decorators: [{
24
- type: Pipe,
25
- args: [{
26
- name: 'jsonHighlight',
27
- }]
28
- }] });
29
-
30
- /**
31
- * Generated bundle index. Do not edit.
32
- */
33
-
34
- export { JsonHighlightPipe };
35
- //# sourceMappingURL=ngx-dsx-src-lib-pipe.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-dsx-src-lib-pipe.mjs","sources":["../../../projects/ngx-dsx/src/lib/pipe/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/lib/pipe/ngx-dsx-src-lib-pipe.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n transform(value: any): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría\r\n\r\n // Aplica estilo y colores básicos para diferenciar claves y valores\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\".*?\"):/g, '<span class=\"json-key\">$1</span>:')\r\n .replace(/:\\s(\".*?\")/g, ': <span class=\"json-string\">$1</span>')\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/:\\s(\\d+)/g, ': <span class=\"json-number\">$1</span>');\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAKa,iBAAiB,CAAA;AAC5B,IAAA,SAAS,CAAC,KAAU,EAAA;QAClB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;;AAGX,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;;AAG5C,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,IAAI,EAAE,OAAO;AACrB,aAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,aAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,aAAA,OAAO,CAAC,WAAW,EAAE,mCAAmC;AACxD,aAAA,OAAO,CAAC,aAAa,EAAE,uCAAuC;AAC9D,aAAA,OAAO,CAAC,wBAAwB,EAAE,sCAAsC;AACxE,aAAA,OAAO,CAAC,WAAW,EAAE,uCAAuC,CAAC;;uGAhBvD,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,eAAe;AACtB,iBAAA;;;ACJD;;AAEG;;;;"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- //# sourceMappingURL=ngx-dsx-src-lib-services.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-dsx-src-lib-services.mjs","sources":["../../../projects/ngx-dsx/src/lib/services/ngx-dsx-src-lib-services.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;AAEG"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- //# sourceMappingURL=ngx-dsx-src-lib-tokens.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-dsx-src-lib-tokens.mjs","sources":["../../../projects/ngx-dsx/src/lib/tokens/ngx-dsx-src-lib-tokens.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;AAEG"}
@@ -1,553 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { InjectionToken, signal, Injectable, inject, Component, isDevMode, Input, input, Pipe } from '@angular/core';
3
- import { HttpClient, HttpHeaders, HttpParams, HttpStatusCode, HttpErrorResponse } from '@angular/common/http';
4
- import { throwError, catchError, switchMap, finalize, Observable } from 'rxjs';
5
- import { JwtHelperService } from '@auth0/angular-jwt';
6
- import { CookieService } from 'ngx-cookie-service';
7
- import { ToastrService } from 'ngx-toastr';
8
- import Swal from 'sweetalert2';
9
- import * as i1 from 'primeng/tag';
10
- import { TagModule } from 'primeng/tag';
11
- import * as i1$1 from 'ngx-countup';
12
- import { CountUpModule } from 'ngx-countup';
13
-
14
- const ENVIRONMENT = new InjectionToken('EnvironmentConfig');
15
-
16
- class SpinnerLoadingService {
17
- // Creamos una señal para el estado de visibilidad
18
- spinnerVisible = signal(false);
19
- constructor() { }
20
- // Método para mostrar el spinner
21
- show() {
22
- this.spinnerVisible.set(true);
23
- }
24
- // Método para ocultar el spinner
25
- hide() {
26
- this.spinnerVisible.set(false);
27
- }
28
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: SpinnerLoadingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
29
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: SpinnerLoadingService, providedIn: 'root' });
30
- }
31
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: SpinnerLoadingService, decorators: [{
32
- type: Injectable,
33
- args: [{
34
- providedIn: 'root',
35
- }]
36
- }], ctorParameters: () => [] });
37
-
38
- class LoadingComponent {
39
- // Accedemos directamente a la señal del servicio
40
- _spinnerService = inject(SpinnerLoadingService);
41
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: LoadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
42
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.0", type: LoadingComponent, isStandalone: true, selector: "app-loading", ngImport: i0, template: "<!-- Actualizaci\u00F3n 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">Desarollo Software Xela</p>\r\n</div>\r\n}\r\n", styles: ["@charset \"UTF-8\";.spinner-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#000c;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:9999}.loader{display:flex;justify-content:center;align-items:center;position:relative;cursor:not-allowed;scale:.7}.central{display:flex;justify-content:center;align-items:center;position:relative;width:10em;height:10em;border-radius:50%;box-shadow:.5em 1em 1em #8a2be2,-.5em .5em 1em #00f,.5em -.5em 1em purple,-.5em -.5em 1em #0ff;background-color:#0000004d}.external-shadow{width:10em;height:10em;border-radius:50%;display:flex;justify-content:center;align-items:center;position:relative;box-shadow:.5em .5em 3em #8a2be2,-.5em .5em 3em #00f,.5em -.5em 3em purple,-.5em -.5em 3em #0ff;z-index:999;animation:rotate 3s linear infinite;background-color:#21212180}@keyframes rotate{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}.spinner-image{width:70%;height:70%;border-radius:50%;object-fit:cover;position:absolute;z-index:1000}.loading-text{font-family:Montserrat,sans-serif;text-transform:uppercase;letter-spacing:3px;background:linear-gradient(45deg,#0ff,#f0f);-webkit-background-clip:text;background-clip:text;color:transparent}@keyframes pulse{0%,to{opacity:.7}50%{opacity:1}}\n"] });
43
- }
44
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: LoadingComponent, decorators: [{
45
- type: Component,
46
- args: [{ selector: 'app-loading', imports: [], template: "<!-- Actualizaci\u00F3n 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">Desarollo Software Xela</p>\r\n</div>\r\n}\r\n", styles: ["@charset \"UTF-8\";.spinner-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#000c;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:9999}.loader{display:flex;justify-content:center;align-items:center;position:relative;cursor:not-allowed;scale:.7}.central{display:flex;justify-content:center;align-items:center;position:relative;width:10em;height:10em;border-radius:50%;box-shadow:.5em 1em 1em #8a2be2,-.5em .5em 1em #00f,.5em -.5em 1em purple,-.5em -.5em 1em #0ff;background-color:#0000004d}.external-shadow{width:10em;height:10em;border-radius:50%;display:flex;justify-content:center;align-items:center;position:relative;box-shadow:.5em .5em 3em #8a2be2,-.5em .5em 3em #00f,.5em -.5em 3em purple,-.5em -.5em 3em #0ff;z-index:999;animation:rotate 3s linear infinite;background-color:#21212180}@keyframes rotate{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}.spinner-image{width:70%;height:70%;border-radius:50%;object-fit:cover;position:absolute;z-index:1000}.loading-text{font-family:Montserrat,sans-serif;text-transform:uppercase;letter-spacing:3px;background:linear-gradient(45deg,#0ff,#f0f);-webkit-background-clip:text;background-clip:text;color:transparent}@keyframes pulse{0%,to{opacity:.7}50%{opacity:1}}\n"] }]
47
- }] });
48
-
49
- class AuthorizeService {
50
- environment = inject(ENVIRONMENT);
51
- _cookieService = inject(CookieService);
52
- helperJwt = new JwtHelperService();
53
- _isRefreshing = false;
54
- // Función para obtener opciones de cookies estándar
55
- getCookieOptions(expiryDate) {
56
- const isProduction = this.environment.production;
57
- const cookieOptions = {
58
- path: '/',
59
- expires: expiryDate,
60
- secure: isProduction,
61
- sameSite: isProduction ? 'None' : 'Lax', // sameSite: 'None',
62
- };
63
- if (isProduction) {
64
- cookieOptions.domain = '.itgtxela.com';
65
- }
66
- return cookieOptions;
67
- }
68
- // Función para establecer una cookie
69
- setCookie(name, value, expiryDate) {
70
- const options = this.getCookieOptions(expiryDate);
71
- this._cookieService.set(name, value, options);
72
- }
73
- get isRefreshing() {
74
- return this._isRefreshing;
75
- }
76
- set isRefreshing(value) {
77
- this._isRefreshing = value;
78
- }
79
- getToken() {
80
- return this._cookieService.get(this.environment.tokenName);
81
- //return localStorage.getItem(environment.tokenName);
82
- }
83
- getTokenRefresh() {
84
- //USO EN MODO DESARROLLO
85
- if (isDevMode()) {
86
- const tokenRefresh = this._cookieService.get(this.environment.tokenNameRF);
87
- const tokens = {
88
- token: '',
89
- tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c',
90
- refreshTokenExpiry: new Date(),
91
- };
92
- !!tokenRefresh ? null : this.tokenReload(tokens);
93
- }
94
- return this._cookieService.get(this.environment.tokenNameRF);
95
- //return localStorage.getItem(environment.tokenNameRF);
96
- }
97
- // Actualizar valores de status
98
- setLastActivity() {
99
- const tokenExpiryDate = new Date();
100
- // Expira en 30 minutos
101
- tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);
102
- this.setCookie(this.environment.sessionStatus, Date.now().toString(), tokenExpiryDate);
103
- }
104
- // Almacenar los tokens en cookies
105
- tokenReload(tokens) {
106
- const tokenExpiryDate = new Date();
107
- tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins
108
- const refreshTokenExpiryDate = new Date();
109
- refreshTokenExpiryDate.setDate(refreshTokenExpiryDate.getDate() + 7); // Refresh token expiry: 7 days
110
- // Guardar el access token y refresh token
111
- this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);
112
- this.setCookie(this.environment.tokenNameRF, tokens.tokenRefresh, refreshTokenExpiryDate);
113
- // Guardar el estado de sesión
114
- this.setLastActivity();
115
- // Almacenar la fecha de expiración del refresh token en localStorage
116
- const expiryDate = new Date(tokens.refreshTokenExpiry).toISOString();
117
- localStorage.setItem(this.environment.refreshTokenExpiry, expiryDate);
118
- }
119
- getTokenValid(token) {
120
- // Devuelve true si el token NO ha expirado
121
- return !this.helperJwt.isTokenExpired(token);
122
- }
123
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AuthorizeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
124
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AuthorizeService, providedIn: 'root' });
125
- }
126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AuthorizeService, decorators: [{
127
- type: Injectable,
128
- args: [{
129
- providedIn: 'root',
130
- }]
131
- }] });
132
-
133
- class SecurityService {
134
- http = inject(HttpClient);
135
- environment = inject(ENVIRONMENT);
136
- urlApi = `${this.environment.myAppUrl}api/authorize`;
137
- tokenRefresh(refreshToken) {
138
- const body = { refreshToken }; // Enviar el token en formato JSON
139
- return this.http.post(`${this.urlApi}/TokenRefresh/`, body, {
140
- headers: new HttpHeaders({
141
- 'Content-Type': 'application/json', // Asegúrate de que se está enviando como JSON
142
- }),
143
- });
144
- }
145
- getParameterSecurity(invalidCacheParam = false) {
146
- const params = new HttpParams().set('invalidCacheParam', invalidCacheParam);
147
- return this.http.get(`${this.urlApi}/securityParameter/`, { params });
148
- }
149
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: SecurityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
150
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: SecurityService, providedIn: 'root' });
151
- }
152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: SecurityService, decorators: [{
153
- type: Injectable,
154
- args: [{
155
- providedIn: 'root',
156
- }]
157
- }] });
158
-
159
- class AlertaService {
160
- //Update: 2024-10-28 14:58 Arrendamientos
161
- toastrService = inject(ToastrService);
162
- /**
163
- * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 5. bottom-center 6. bottom-right
164
- * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error
165
- * @param {number} toastrTimer - Tiempo de la alerta default 3000
166
- * @param {string} toastrTitle - Titulo de la alerta
167
- * @param {string} toastrMessage - Mensaje de la alerta
168
- * @returns - Retonar una alerta toastr
169
- * */
170
- toastrAlerts(toastrType, toastrTitle, toastrMessage, toastrAlign = 1, toastrTimer = 3000) {
171
- const alignMessage = [
172
- { id: 0, align: 'toast-top-left' },
173
- { id: 1, align: 'toast-top-center' },
174
- { id: 2, align: 'toast-top-right' },
175
- { id: 3, align: 'toast-bottom-left' },
176
- { id: 4, align: 'toast-bottom-center' },
177
- { id: 5, align: 'toast-bottom-right' },
178
- ];
179
- const valueAlign = alignMessage.find((c) => c.id == toastrAlign)?.align;
180
- const toastrMethods = {
181
- 1: this.toastrService.success.bind(this.toastrService),
182
- 2: this.toastrService.info.bind(this.toastrService),
183
- 3: this.toastrService.warning.bind(this.toastrService),
184
- 4: this.toastrService.error.bind(this.toastrService),
185
- };
186
- const showToast = toastrMethods[toastrType];
187
- if (showToast) {
188
- showToast(toastrMessage, toastrTitle, {
189
- enableHtml: true,
190
- closeButton: true,
191
- progressBar: true,
192
- positionClass: valueAlign,
193
- timeOut: toastrTimer,
194
- });
195
- }
196
- }
197
- alertaHtml(titleAlert, message) {
198
- Swal.fire({
199
- title: titleAlert,
200
- imageUrl: 'assets/image/notFound01.png',
201
- imageWidth: 145,
202
- imageHeight: 125,
203
- imageAlt: 'error 404',
204
- html: `
205
- <strong>ALERTA: </strong><i class='text-red-300'>${message}</i> <span class='text-blue-600'> comuniquese con el administrador. </span>
206
- `,
207
- showConfirmButton: false,
208
- timerProgressBar: true,
209
- timer: 2500,
210
- });
211
- }
212
- alertaHtmlSuccess(titleAlert, message) {
213
- Swal.fire({
214
- title: titleAlert,
215
- imageUrl: 'https://firebasestorage.googleapis.com/v0/b/seguridadintegrada-36204.appspot.com/o/Logos%2FSuccess.png?alt=media&token=275135d6-277e-4619-baa5-f76da95ca0eb',
216
- imageWidth: 150,
217
- imageHeight: 120,
218
- imageAlt: 'success 200',
219
- html: `
220
- <strong>Alerta: </strong><b class='text-success'>${message}</b>
221
- `,
222
- showConfirmButton: false,
223
- timerProgressBar: true,
224
- timer: 2000,
225
- });
226
- }
227
- preloadImage(icono) {
228
- return new Promise((resolve, reject) => {
229
- const img = new Image();
230
- img.src = `assets/icon/${icono}`;
231
- img.onload = () => resolve();
232
- img.onerror = (err) => reject(err);
233
- });
234
- }
235
- alertConfirm(title, text, icono) {
236
- return this.preloadImage(icono).then(() => Swal.fire({
237
- title: title,
238
- html: text,
239
- footer: '<strong>DevSoftXela</strong> 2025',
240
- imageUrl: `assets/icon/${icono}`,
241
- imageWidth: 150,
242
- imageHeight: 150,
243
- imageAlt: 'icon',
244
- showCloseButton: true,
245
- showCancelButton: true,
246
- confirmButtonColor: '#3085d6',
247
- cancelButtonColor: '#d33',
248
- confirmButtonText: `<i class="fa fa-thumbs-up"></i> Aceptar!`,
249
- cancelButtonText: `<i class="fa fa-thumbs-down"></i> Cancelar`,
250
- }).then((result) => result.isConfirmed));
251
- }
252
- //notifyAlertSuccess(message: string) {
253
- // this._notyf.success({
254
- // message: message,
255
- // duration: 1500,
256
- // position: {
257
- // x: 'center',
258
- // y: 'top'
259
- // }
260
- // });
261
- //}
262
- toastrHttpResponse(response) {
263
- const time = 3000;
264
- const align = 'toast-top-center';
265
- if (response.isSuccess) {
266
- this.toastrService.success(response.statusMessage, response.title, {
267
- enableHtml: true,
268
- closeButton: true,
269
- progressBar: true,
270
- positionClass: align,
271
- timeOut: time,
272
- });
273
- }
274
- else {
275
- this.toastrService.error(response.statusMessage, response.title, {
276
- enableHtml: true,
277
- closeButton: true,
278
- progressBar: true,
279
- positionClass: align,
280
- timeOut: time,
281
- });
282
- }
283
- }
284
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AlertaService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
285
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AlertaService, providedIn: 'root' });
286
- }
287
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AlertaService, decorators: [{
288
- type: Injectable,
289
- args: [{
290
- providedIn: 'root',
291
- }]
292
- }] });
293
-
294
- class ErrorHandlerService {
295
- _serviceAlerta = inject(AlertaService);
296
- handleErrorResponse(error) {
297
- const err = error;
298
- const technicalMessage = `Error status: ${error.status}, Message: ${error.message}, URL: ${error.url}`;
299
- let userMessage = 'Ha ocurrido un error inesperado.';
300
- switch (error.status) {
301
- case HttpStatusCode.BadRequest:
302
- userMessage =
303
- 'Solicitud incorrecta (400). Verifica los datos ingresados o validaciones existentes.';
304
- break;
305
- case HttpStatusCode.Unauthorized:
306
- userMessage = 'Acceso no autorizado (401). Por favor inicia sesión.';
307
- break;
308
- case HttpStatusCode.Forbidden:
309
- userMessage = 'No tienes permisos para realizar esta acción (403).';
310
- break;
311
- case HttpStatusCode.NotFound:
312
- userMessage = 'No se encontró el recurso solicitado (404).';
313
- break;
314
- case HttpStatusCode.Conflict: // Capturar error de concurrencia
315
- userMessage =
316
- 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';
317
- break;
318
- case HttpStatusCode.InternalServerError:
319
- userMessage =
320
- 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';
321
- break;
322
- default:
323
- userMessage = 'Un error inesperado ha ocurrido.';
324
- break;
325
- }
326
- // Mostrar mensaje para el usuario
327
- this._serviceAlerta.alertaHtml('Servicios de Errores', '<i>Código:</i> ' +
328
- err.status +
329
- ' <i>Message:</i> ' +
330
- userMessage +
331
- `. (${error.error})`);
332
- // Imprimir el mensaje técnico
333
- if (isDevMode()) {
334
- console.error(err);
335
- }
336
- // Retornar el error para continuar con el flujo de manejo de errores
337
- return throwError(() => new Error(technicalMessage));
338
- }
339
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: ErrorHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
340
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: ErrorHandlerService, providedIn: 'root' });
341
- }
342
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: ErrorHandlerService, decorators: [{
343
- type: Injectable,
344
- args: [{
345
- providedIn: 'root',
346
- }]
347
- }] });
348
-
349
- //Update: 2024-01-29 12:00
350
- let _activeRequest = 0;
351
- //let isRefreshing = false; // Estado de si se está refrescando el token
352
- let pendingRequests = []; // Cola de solicitudes pendientes
353
- const httpAuthorizeInterceptor = (req, next) => {
354
- //console.log('------ INGRESO A HTTPINTERCEPTOR -------');
355
- const _authorizeService = inject(AuthorizeService);
356
- const _securityService = inject(SecurityService);
357
- const _spinnerService = inject(SpinnerLoadingService);
358
- const _handleErrorService = inject(ErrorHandlerService);
359
- //Variables
360
- const _token = _authorizeService.getToken();
361
- const _tokenRefresh = _authorizeService.getTokenRefresh();
362
- //Generar la petición con el token
363
- const authReq = req.clone({
364
- setHeaders: {
365
- Authorization: `Bearer ${_token}`,
366
- },
367
- });
368
- if (_activeRequest == 0) {
369
- _spinnerService.show();
370
- }
371
- _activeRequest++;
372
- return next(authReq).pipe(catchError((error) => {
373
- // Si el error es 401
374
- if (error.status === HttpStatusCode.Unauthorized) {
375
- // Si no hay refreshToken, finalizar la sesión
376
- if (!_tokenRefresh) {
377
- _spinnerService.hide();
378
- return _handleErrorService.handleErrorResponse(new HttpErrorResponse({
379
- status: 401,
380
- statusText: 'No autorizado. El token de refresco no está disponible.',
381
- }));
382
- }
383
- // Intentar refrescar el token si no se está haciendo ya
384
- if (!_authorizeService.isRefreshing) {
385
- // Marcamos que se está refrescando el token
386
- _authorizeService.isRefreshing = true;
387
- // Intentar refrescar el token
388
- return _securityService.tokenRefresh(_tokenRefresh).pipe(switchMap((response) => {
389
- if (!response.token || !response.tokenRefresh) {
390
- _spinnerService.hide();
391
- return _handleErrorService.handleErrorResponse(new HttpErrorResponse({
392
- status: 401,
393
- statusText: 'No autorizado. El token de refresco ha expirado.',
394
- }));
395
- }
396
- // Recargar el token en el servicio
397
- _authorizeService.tokenReload(response);
398
- // Generar una nueva solicitud con el token actualizado
399
- const newReq = req.clone({
400
- setHeaders: {
401
- Authorization: `Bearer ${response.token}`,
402
- },
403
- });
404
- // Refresco completado
405
- _authorizeService.isRefreshing = false;
406
- pendingRequests.forEach((pendingReq) => {
407
- const clonedReq = pendingReq.authReq.clone({
408
- setHeaders: {
409
- Authorization: `Bearer ${_authorizeService.getToken()}`,
410
- },
411
- });
412
- // Volver a ejecutar las solicitudes pendientes con el nuevo token
413
- next(clonedReq).subscribe({
414
- next: pendingReq.next,
415
- error: pendingReq.error,
416
- complete: pendingReq.complete,
417
- });
418
- });
419
- pendingRequests = []; // Limpiar la cola
420
- return next(newReq); // Procesar la solicitud original con el nuevo token
421
- }), catchError((refreshError) => {
422
- // Finalizamos el refresco si hay error
423
- _authorizeService.isRefreshing = false;
424
- _spinnerService.hide();
425
- return _handleErrorService.handleErrorResponse(new HttpErrorResponse({
426
- status: 401,
427
- statusText: 'Error al refrescar el token. Redirigiendo al login.',
428
- }));
429
- }), finalize(() => {
430
- _authorizeService.isRefreshing = false;
431
- }));
432
- }
433
- else {
434
- // Si ya se está refrescando, añadir la solicitud a la cola
435
- return new Observable((observer) => {
436
- pendingRequests.push({
437
- authReq,
438
- next: observer.next.bind(observer),
439
- error: observer.error.bind(observer),
440
- complete: observer.complete.bind(observer),
441
- });
442
- });
443
- }
444
- }
445
- // Si no es un error 401, manejar otros errores
446
- return _handleErrorService.handleErrorResponse(error);
447
- }), finalize(() => {
448
- _activeRequest--;
449
- if (_activeRequest === 0) {
450
- _spinnerService.hide();
451
- }
452
- }));
453
- };
454
-
455
- class AppMessageErrorComponent {
456
- // Control de formulario que se pasa como input
457
- control;
458
- form = null;
459
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AppMessageErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
460
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.0", type: AppMessageErrorComponent, isStandalone: true, selector: "app-message-error", inputs: { control: "control", form: "form" }, ngImport: i0, template: "@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como m\u00E1ximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor m\u00EDnimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor m\u00E1ximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una direcci\u00F3n de correo\r\n v\u00E1lida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error a\u00FAn no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: TagModule }, { kind: "component", type: i1.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }] });
461
- }
462
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: AppMessageErrorComponent, decorators: [{
463
- type: Component,
464
- args: [{ selector: 'app-message-error', imports: [TagModule], template: "@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como m\u00E1ximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor m\u00EDnimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor m\u00E1ximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una direcci\u00F3n de correo\r\n v\u00E1lida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error a\u00FAn no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n" }]
465
- }], propDecorators: { control: [{
466
- type: Input
467
- }], form: [{
468
- type: Input
469
- }] } });
470
-
471
- class KpicardComponent {
472
- //type = input.required<string>();
473
- option = input.required();
474
- label = input.required();
475
- iconType = input('fa-regular fa-bell');
476
- color = input();
477
- valor = input(0);
478
- theme = input('light');
479
- options = {
480
- currency: {
481
- startVal: 0,
482
- duration: 0.5,
483
- prefix: 'Q',
484
- decimalPlaces: 2, // Decimales
485
- useGrouping: true, // Separador de miles
486
- separator: ',', // Carácter separador
487
- decimal: '.', // Carácter decimal
488
- suffix: ' GTQ', // Sufijo
489
- scrollSpyDelay: 200, // Retardo antes de la animación
490
- enableScrollSpy: true,
491
- scrollSpyOnce: true,
492
- },
493
- integer: {
494
- startVal: 0,
495
- duration: 0.5,
496
- prefix: 'Cant. ',
497
- decimalPlaces: 2, // Decimales
498
- useGrouping: true, // Separador de miles
499
- separator: ',', // Carácter separador
500
- decimal: '.', // Carácter decimal
501
- scrollSpyDelay: 200, // Retardo antes de la animación
502
- enableScrollSpy: true,
503
- scrollSpyOnce: true,
504
- },
505
- };
506
- // ✅ Método auxiliar para obtener la opción con seguridad
507
- getSelectedOption() {
508
- return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`
509
- }
510
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: KpicardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
511
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.0", type: KpicardComponent, isStandalone: true, selector: "app-kpicard", inputs: { option: { classPropertyName: "option", publicName: "option", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, iconType: { classPropertyName: "iconType", publicName: "iconType", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, valor: { classPropertyName: "valor", publicName: "valor", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n", styles: [".icon{float:right;font-size:500%;position:absolute;top:0rem;right:-.3rem;opacity:.2}.icon-light{color:#000}.icon-dark{color:#fff}#container{width:1200px;display:flex}.grey-dark{background:#495057;color:#efefef}.red-gradient{background:linear-gradient(180deg,#cf5252,#790909 80%);color:#fff}.red{background:#a83b3b;color:#fff}.purple{background:#886ab5;color:#fff}.orange{background:#ffc241;color:#fff}.kpi-card{overflow:hidden;position:relative;box-shadow:1px 1px 3px #000000bf;display:inline-block;float:left;padding:1em;border-radius:.3em;font-family:sans-serif;width:240px;min-width:180px;margin-left:.5em;margin-top:.5em}.card-value-light{display:block;font-size:200%;font-weight:bolder;background:linear-gradient(45deg,#00fffc,#a200ff,#0094ff);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 0 5px rgba(0,255,252,.3),0 0 10px rgba(162,0,255,.2),0 0 15px rgba(0,148,255,.1)}.card-value-dark{display:block;font-size:200%;font-weight:bolder;background:linear-gradient(45deg,#ff7e5f,#feb47b,#ff6a00);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 0 5px rgba(255,126,95,.5),0 0 10px rgba(254,180,123,.4),0 0 15px rgba(255,106,0,.3)}.card-text-light{display:block;font-family:Orbitron,sans-serif;font-size:90%;padding-left:.2em;color:#495057}.card-text-dark{display:block;font-family:Orbitron,sans-serif;font-size:90%;padding-left:.2em;color:#d5d7d8}\n"], dependencies: [{ kind: "ngmodule", type: CountUpModule }, { kind: "directive", type: i1$1.CountUpDirective, selector: "[countUp]", inputs: ["countUp", "options", "reanimateOnClick"], outputs: ["complete"] }] });
512
- }
513
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: KpicardComponent, decorators: [{
514
- type: Component,
515
- args: [{ selector: 'app-kpicard', imports: [CountUpModule], template: "<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n", styles: [".icon{float:right;font-size:500%;position:absolute;top:0rem;right:-.3rem;opacity:.2}.icon-light{color:#000}.icon-dark{color:#fff}#container{width:1200px;display:flex}.grey-dark{background:#495057;color:#efefef}.red-gradient{background:linear-gradient(180deg,#cf5252,#790909 80%);color:#fff}.red{background:#a83b3b;color:#fff}.purple{background:#886ab5;color:#fff}.orange{background:#ffc241;color:#fff}.kpi-card{overflow:hidden;position:relative;box-shadow:1px 1px 3px #000000bf;display:inline-block;float:left;padding:1em;border-radius:.3em;font-family:sans-serif;width:240px;min-width:180px;margin-left:.5em;margin-top:.5em}.card-value-light{display:block;font-size:200%;font-weight:bolder;background:linear-gradient(45deg,#00fffc,#a200ff,#0094ff);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 0 5px rgba(0,255,252,.3),0 0 10px rgba(162,0,255,.2),0 0 15px rgba(0,148,255,.1)}.card-value-dark{display:block;font-size:200%;font-weight:bolder;background:linear-gradient(45deg,#ff7e5f,#feb47b,#ff6a00);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:0 0 5px rgba(255,126,95,.5),0 0 10px rgba(254,180,123,.4),0 0 15px rgba(255,106,0,.3)}.card-text-light{display:block;font-family:Orbitron,sans-serif;font-size:90%;padding-left:.2em;color:#495057}.card-text-dark{display:block;font-family:Orbitron,sans-serif;font-size:90%;padding-left:.2em;color:#d5d7d8}\n"] }]
516
- }] });
517
-
518
- class JsonHighlightPipe {
519
- transform(value) {
520
- if (!value) {
521
- return '';
522
- }
523
- const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría
524
- // Aplica estilo y colores básicos para diferenciar claves y valores
525
- return json
526
- .replace(/&/g, '&amp;')
527
- .replace(/</g, '&lt;')
528
- .replace(/>/g, '&gt;')
529
- .replace(/(".*?"):/g, '<span class="json-key">$1</span>:')
530
- .replace(/:\s(".*?")/g, ': <span class="json-string">$1</span>')
531
- .replace(/\b(true|false|null)\b/g, '<span class="json-boolean">$1</span>')
532
- .replace(/:\s(\d+)/g, ': <span class="json-number">$1</span>');
533
- }
534
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: JsonHighlightPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
535
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.0", ngImport: i0, type: JsonHighlightPipe, isStandalone: true, name: "jsonHighlight" });
536
- }
537
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: JsonHighlightPipe, decorators: [{
538
- type: Pipe,
539
- args: [{
540
- name: 'jsonHighlight',
541
- }]
542
- }] });
543
-
544
- /*
545
- * Public API Surface of ngx-dsx
546
- */
547
-
548
- /**
549
- * Generated bundle index. Do not edit.
550
- */
551
-
552
- export { AlertaService, AppMessageErrorComponent, AuthorizeService, ENVIRONMENT, JsonHighlightPipe, KpicardComponent, LoadingComponent, SecurityService, httpAuthorizeInterceptor };
553
- //# sourceMappingURL=ngx-dsx.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-dsx.mjs","sources":["../../../projects/ngx-dsx/src/lib/tokens/environment.token.ts","../../../projects/ngx-dsx/src/lib/services/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.ts","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.html","../../../projects/ngx-dsx/src/lib/services/authorize.service.ts","../../../projects/ngx-dsx/src/lib/services/security.service.ts","../../../projects/ngx-dsx/src/lib/services/alerta.service.ts","../../../projects/ngx-dsx/src/lib/services/error-handler.service.ts","../../../projects/ngx-dsx/src/lib/interceptors/http-authorize.interceptor.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.html","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.ts","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.html","../../../projects/ngx-dsx/src/lib/pipe/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsx.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport interface EnvironmentConfig {\r\n production: boolean;\r\n myAppUrl: string;\r\n tokenName: string;\r\n tokenNameRF: string;\r\n sessionStatus: string;\r\n refreshTokenExpiry: string;\r\n}\r\n\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig'\r\n);\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SpinnerLoadingService {\r\n // Creamos una señal para el estado de visibilidad\r\n spinnerVisible = signal(false);\r\n\r\n constructor() {}\r\n\r\n // Método para mostrar el spinner\r\n show() {\r\n this.spinnerVisible.set(true);\r\n }\r\n\r\n // Método para ocultar el spinner\r\n hide() {\r\n this.spinnerVisible.set(false);\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading',\r\n imports: [],\r\n templateUrl: './loading.component.html',\r\n styleUrl: './loading.component.scss',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">Desarollo Software Xela</p>\r\n</div>\r\n}\r\n","import { inject, Injectable, isDevMode } from '@angular/core';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CookieService } from 'ngx-cookie-service';\r\nimport { ENVIRONMENT, EnvironmentConfig } from '../tokens/environment.token';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n _cookieService = inject(CookieService);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n\r\n // Función para obtener opciones de cookies estándar\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isProduction,\r\n sameSite: isProduction ? 'None' : 'Lax', // sameSite: 'None',\r\n };\r\n if (isProduction) {\r\n cookieOptions.domain = '.itgtxela.com';\r\n }\r\n return cookieOptions;\r\n }\r\n // Función para establecer una cookie\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n this._cookieService.set(name, value, options);\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n //return localStorage.getItem(environment.tokenName);\r\n }\r\n\r\n getTokenRefresh(): string | null {\r\n //USO EN MODO DESARROLLO\r\n if (isDevMode()) {\r\n const tokenRefresh: string = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n const tokens: ModelToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c',\r\n refreshTokenExpiry: new Date(),\r\n };\r\n !!tokenRefresh ? null : this.tokenReload(tokens);\r\n }\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n //return localStorage.getItem(environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate\r\n );\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: ModelToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n const refreshTokenExpiryDate = new Date();\r\n refreshTokenExpiryDate.setDate(refreshTokenExpiryDate.getDate() + 7); // Refresh token expiry: 7 days\r\n\r\n // Guardar el access token y refresh token\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n\r\n // Almacenar la fecha de expiración del refresh token en localStorage\r\n const expiryDate = new Date(tokens.refreshTokenExpiry).toISOString();\r\n localStorage.setItem(this.environment.refreshTokenExpiry, expiryDate);\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ENVIRONMENT, EnvironmentConfig } from '../tokens/environment.token';\r\nimport { ModelToken } from '../models/src/token.model';\r\nimport { SeguridadITParameter } from '../models/src/securityParameter.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n private http = inject(HttpClient);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private urlApi: string = `${this.environment.myAppUrl}api/authorize`;\r\n\r\n tokenRefresh(refreshToken: string): Observable<ModelToken> {\r\n const body = { refreshToken }; // Enviar el token en formato JSON\r\n return this.http.post<ModelToken>(`${this.urlApi}/TokenRefresh/`, body, {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Asegúrate de que se está enviando como JSON\r\n }),\r\n });\r\n }\r\n\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false\r\n ): Observable<SeguridadITParameter> {\r\n const params = new HttpParams().set('invalidCacheParam', invalidCacheParam);\r\n return this.http.get<SeguridadITParameter>(\r\n `${this.urlApi}/securityParameter/`,\r\n { params }\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n //Update: 2024-10-28 14:58 Arrendamientos\r\n\r\n private toastrService = inject(ToastrService);\r\n /**\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 5. bottom-center 6. bottom-right\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n alertaHtml(titleAlert: string, message: string): void {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: 'assets/image/notFound01.png',\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i class='text-red-300'>${message}</i> <span class='text-blue-600'> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: 2500,\r\n });\r\n }\r\n\r\n alertaHtmlSuccess(titleAlert: string, message: string): void {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl:\r\n 'https://firebasestorage.googleapis.com/v0/b/seguridadintegrada-36204.appspot.com/o/Logos%2FSuccess.png?alt=media&token=275135d6-277e-4619-baa5-f76da95ca0eb',\r\n imageWidth: 150,\r\n imageHeight: 120,\r\n imageAlt: 'success 200',\r\n html: `\r\n <strong>Alerta: </strong><b class='text-success'>${message}</b>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: 2000,\r\n });\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `assets/icon/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n alertConfirm(title: string, text: string, icono: string): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed)\r\n );\r\n }\r\n\r\n //notifyAlertSuccess(message: string) {\r\n // this._notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top'\r\n // }\r\n // });\r\n //}\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n}\r\n","import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { throwError } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\nimport { ErrorModel } from '../models/src/error.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n\r\n handleErrorResponse(error: HttpErrorResponse) {\r\n const err: ErrorModel = error as ErrorModel;\r\n const technicalMessage = `Error status: ${error.status}, Message: ${error.message}, URL: ${error.url}`;\r\n\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage =\r\n 'Solicitud incorrecta (400). Verifica los datos ingresados o validaciones existentes.';\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = 'Acceso no autorizado (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage = 'Un error inesperado ha ocurrido.';\r\n break;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n this._serviceAlerta.alertaHtml(\r\n 'Servicios de Errores',\r\n '<i>Código:</i> ' +\r\n err.status +\r\n ' <i>Message:</i> ' +\r\n userMessage +\r\n `. (${error.error})`\r\n );\r\n\r\n // Imprimir el mensaje técnico\r\n if (isDevMode()) {\r\n console.error(err);\r\n }\r\n\r\n // Retornar el error para continuar con el flujo de manejo de errores\r\n return throwError(() => new Error(technicalMessage));\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { catchError, finalize, Observable, switchMap } from 'rxjs';\r\nimport { inject } from '@angular/core';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n//Update: 2024-01-29 12:00\r\n\r\nlet _activeRequest = 0;\r\n//let isRefreshing = false; // Estado de si se está refrescando el token\r\nlet pendingRequests: any[] = []; // Cola de solicitudes pendientes\r\n\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n //console.log('------ INGRESO A HTTPINTERCEPTOR -------');\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n //Variables\r\n const _token = _authorizeService.getToken();\r\n const _tokenRefresh = _authorizeService.getTokenRefresh();\r\n\r\n //Generar la petición con el token\r\n const authReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_token}`,\r\n },\r\n });\r\n\r\n if (_activeRequest == 0) {\r\n _spinnerService.show();\r\n }\r\n\r\n _activeRequest++;\r\n\r\n return next(authReq).pipe(\r\n catchError((error: HttpErrorResponse): Observable<HttpEvent<any>> => {\r\n // Si el error es 401\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Si no hay refreshToken, finalizar la sesión\r\n if (!_tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco no está disponible.',\r\n })\r\n );\r\n }\r\n\r\n // Intentar refrescar el token si no se está haciendo ya\r\n if (!_authorizeService.isRefreshing) {\r\n // Marcamos que se está refrescando el token\r\n _authorizeService.isRefreshing = true;\r\n\r\n // Intentar refrescar el token\r\n return _securityService.tokenRefresh(_tokenRefresh).pipe(\r\n switchMap((response: ModelToken) => {\r\n if (!response.token || !response.tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco ha expirado.',\r\n })\r\n );\r\n }\r\n\r\n // Recargar el token en el servicio\r\n _authorizeService.tokenReload(response);\r\n\r\n // Generar una nueva solicitud con el token actualizado\r\n const newReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n });\r\n\r\n // Refresco completado\r\n _authorizeService.isRefreshing = false;\r\n\r\n pendingRequests.forEach((pendingReq) => {\r\n const clonedReq = pendingReq.authReq.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_authorizeService.getToken()}`,\r\n },\r\n });\r\n\r\n // Volver a ejecutar las solicitudes pendientes con el nuevo token\r\n next(clonedReq).subscribe({\r\n next: pendingReq.next,\r\n error: pendingReq.error,\r\n complete: pendingReq.complete,\r\n });\r\n });\r\n pendingRequests = []; // Limpiar la cola\r\n\r\n return next(newReq); // Procesar la solicitud original con el nuevo token\r\n }),\r\n catchError((refreshError: HttpErrorResponse) => {\r\n // Finalizamos el refresco si hay error\r\n _authorizeService.isRefreshing = false;\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'Error al refrescar el token. Redirigiendo al login.',\r\n })\r\n );\r\n }),\r\n finalize(() => {\r\n _authorizeService.isRefreshing = false;\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, añadir la solicitud a la cola\r\n return new Observable((observer) => {\r\n pendingRequests.push({\r\n authReq,\r\n next: observer.next.bind(observer),\r\n error: observer.error.bind(observer),\r\n complete: observer.complete.bind(observer),\r\n });\r\n });\r\n }\r\n }\r\n // Si no es un error 401, manejar otros errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n _spinnerService.hide();\r\n }\r\n })\r\n );\r\n};\r\n","import { Component, Input } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n imports: [TagModule],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.scss',\r\n})\r\nexport class AppMessageErrorComponent {\r\n // Control de formulario que se pasa como input\r\n @Input() control!: AbstractControl | null;\r\n @Input() form: FormGroup | null = null;\r\n}\r\n","@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como máximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor mínimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor máximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpModule } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpModule],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<string>('light');\r\n\r\n options: Record<'currency' | 'integer', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n transform(value: any): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría\r\n\r\n // Aplica estilo y colores básicos para diferenciar claves y valores\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\".*?\"):/g, '<span class=\"json-key\">$1</span>:')\r\n .replace(/:\\s(\".*?\")/g, ': <span class=\"json-string\">$1</span>')\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/:\\s(\\d+)/g, ': <span class=\"json-number\">$1</span>');\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/tokens/environment.token';\r\nexport * from './lib/components/loading/loading.component';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/services/security.service';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/components';\r\nexport * from './lib/models';\r\nexport * from './lib/pipe';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
package/ngx-dsx-1.0.0.tgz DELETED
Binary file
Binary file