ngx-dsxlibrary 1.21.12 → 1.21.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1271,7 +1271,7 @@ const httpAuthorizeInterceptor = (req, next) => {
1271
1271
  finalize(() => {
1272
1272
  _activeRequest--;
1273
1273
  if (_activeRequest === 0) {
1274
- //_spinnerService.hide();
1274
+ _spinnerService.hide();
1275
1275
  }
1276
1276
  }));
1277
1277
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-dsxlibrary.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/services/icon-dsx.service.ts","../../../projects/ngx-dsx/src/lib/components/icon-dsx/icon-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/icon-dsx/icon-dsx.component.html","../../../projects/ngx-dsx/src/lib/pipe/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/lib/injections/environment.token.ts","../../../projects/ngx-dsx/src/lib/components/json-values-debuj/json-values-debuj.component.ts","../../../projects/ngx-dsx/src/lib/components/json-values-debuj/json-values-debuj.component.html","../../../projects/ngx-dsx/src/lib/services/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/loading-lottie/loading-lottie.component.ts","../../../projects/ngx-dsx/src/lib/components/loading-lottie/loading-lottie.component.html","../../../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/alerta.service.ts","../../../projects/ngx-dsx/src/lib/injections/parameterSecurity.ts","../../../projects/ngx-dsx/src/lib/services/security.service.ts","../../../projects/ngx-dsx/src/lib/services/parameter-values.service.ts","../../../projects/ngx-dsx/src/lib/components/navbar-dsx/navbar-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/navbar-dsx/navbar-dsx.component.html","../../../projects/ngx-dsx/src/lib/directives/only-rango-pattern.directive.ts","../../../projects/ngx-dsx/src/lib/directives/select-all-on-focus.directive.ts","../../../projects/ngx-dsx/src/lib/injections/cache.token.ts","../../../projects/ngx-dsx/src/lib/services/authorize.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/models/src/cache.types.ts","../../../projects/ngx-dsx/src/lib/modules/src/dsx-add-tools.module.ts","../../../projects/ngx-dsx/src/lib/modules/src/prime-ng.module.ts","../../../projects/ngx-dsx/src/lib/pipe/truncate.pipe.ts","../../../projects/ngx-dsx/src/lib/services/cache.service.ts","../../../projects/ngx-dsx/src/lib/services/cache.provider.ts","../../../projects/ngx-dsx/src/lib/services/endpoint.service.ts","../../../projects/ngx-dsx/src/lib/services/utility-add.service.ts","../../../projects/ngx-dsx/src/lib/validations/addons.validators.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsxlibrary.ts"],"sourcesContent":["import { DecimalPipe } from '@angular/common';\r\nimport { 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, DecimalPipe],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.css',\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?.['invalidNIT']){\r\n <strong>{{ control?.errors?.['invalidNIT']?.message }}</strong\r\n >. }@else if(control?.errors?.['invalidCUI']){\r\n <strong>{{ control?.errors?.['invalidCUI']?.message }}</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 | number:'1.2-2' }}</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 { CountUpDirective } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpDirective],\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' | 'percent'>();\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<\r\n | 'light'\r\n | 'dark'\r\n | 'aqua'\r\n | 'sunset'\r\n | 'mint'\r\n | 'peach'\r\n | 'plasma'\r\n | 'nebula'\r\n >('light');\r\n\r\n options: Record<'currency' | 'integer' | 'percent', 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 percent: {\r\n startVal: 0,\r\n duration: 0.5,\r\n suffix: '%',\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()} ${theme()}-theme`\">\r\n <div class=\"kpi-container\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [countUpOptions]=\"getSelectedOption()\"\r\n [class]=\"`card-value-${theme()}`\"\r\n >0</span\r\n >\r\n <span [class]=\"`card-text-${theme()}`\">{{ label() }}</span>\r\n </div>\r\n <i [class]=\"`${iconType()} icon icon-${theme()}`\"></i>\r\n</div>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { map, Observable, shareReplay } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class IconDsxService {\r\n private cache = new Map<string, Observable<SafeHtml>>();\r\n\r\n constructor(private http: HttpClient, private sanitizer: DomSanitizer) {}\r\n\r\n /** Carga SVG desde assets/dsxResource/material-design-icons/outlined */\r\n getIcon(name: string): Observable<SafeHtml> {\r\n if (this.cache.has(name)) {\r\n return this.cache.get(name)!;\r\n }\r\n\r\n const iconPath = `mdio/${name}.svg`;\r\n\r\n const request$ = this.http.get(iconPath, { responseType: 'text' }).pipe(\r\n map((svg) => this.sanitizer.bypassSecurityTrustHtml(svg)),\r\n shareReplay(1)\r\n );\r\n\r\n this.cache.set(name, request$);\r\n return request$;\r\n }\r\n}\r\n","import { AsyncPipe } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { SafeHtml } from '@angular/platform-browser';\r\nimport { Observable } from 'rxjs';\r\nimport { IconDsxService } from '../../services/icon-dsx.service';\r\n\r\n@Component({\r\n selector: 'icon-dsx',\r\n imports: [AsyncPipe],\r\n templateUrl: './icon-dsx.component.html',\r\n styleUrl: './icon-dsx.component.css',\r\n})\r\nexport class IconDsxComponent {\r\n @Input() name!: string;\r\n\r\n svg$!: Observable<SafeHtml>; // 👈 AHORA es un Observable\r\n\r\n constructor(private iconService: IconDsxService) {}\r\n\r\n ngOnInit(): void {\r\n this.svg$ = this.iconService.getIcon(this.name); // 👈 AHORA CUADRA CON EL async\r\n }\r\n}\r\n","<span class=\"dsx-icon\" [innerHTML]=\"svg$ | async\"></span>\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 para diferenciar claves, valores, booleanos, números, etc.\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?)/g, (match) => {\r\n // Si es una clave (tiene dos puntos al final)\r\n if (/:$/.test(match)) {\r\n return `<span class=\"json-key\">${match}</span>`;\r\n }\r\n // Si es un string (no tiene dos puntos)\r\n return `<span class=\"json-string\">${match}</span>`;\r\n })\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"json-number\">$1</span>')\r\n .replace(/[{}\\[\\]]/g, '<span class=\"json-bracket\">$&</span>')\r\n .replace(/,/g, '<span class=\"json-comma\">$&</span>')\r\n .replace(/:/g, '<span class=\"json-colon\">$&</span>');\r\n }\r\n}\r\n","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 { Component, inject, Input, signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { JsonHighlightPipe } from '../../pipe/json-highlight.pipe';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\n\r\n@Component({\r\n selector: 'app-json-values-debuj',\r\n imports: [JsonHighlightPipe],\r\n templateUrl: './json-values-debuj.component.html',\r\n styleUrl: './json-values-debuj.component.css',\r\n})\r\nexport class JsonValuesDebujComponent {\r\n @Input() form!: FormGroup;\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n // Señal reactiva para indicar si estamos en modo de desarrollo\r\n private readonly isDevSignal = signal<boolean>(!this.environment.production);\r\n\r\n // Método para verificar el estado de desarrollo\r\n isDev(): boolean {\r\n return this.isDevSignal();\r\n }\r\n}\r\n","@if(isDev()){\r\n<div class=\"custom-container\">\r\n <pre\r\n class=\"custom-pre\"\r\n [innerHTML]=\"form.getRawValue() | jsonHighlight\"\r\n ></pre>\r\n</div>\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, effect, inject, input } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\nimport { AnimationOptions, LottieComponent } from 'ngx-lottie';\r\n\r\n@Component({\r\n selector: 'app-loading-lottie',\r\n imports: [LottieComponent],\r\n templateUrl: './loading-lottie.component.html',\r\n styleUrl: './loading-lottie.component.css',\r\n})\r\nexport class LoadingLottieComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n jsonUrl = input<string>('Loader_Liquid4');\r\n size = input<string>('250px');\r\n options: AnimationOptions = { path: '' };\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n effect(() => {\r\n this.options = {\r\n path: `jsonlottie/${this.jsonUrl() + '.json'}`,\r\n };\r\n });\r\n }\r\n}\r\n","@if(_spinnerService.spinnerVisible()){\r\n<div class=\"loader-container\">\r\n <ng-lottie [options]=\"options\" [width]=\"size()\" [height]=\"size()\"></ng-lottie>\r\n <p class=\"loading-text\">&copy;DevsoftXela {{ currentYear }}</p>\r\n</div>\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.css',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n }\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=\"/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">&copy;DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal, {\r\n SweetAlertIcon,\r\n SweetAlertOptions,\r\n SweetAlertResult,\r\n SweetAlertTheme,\r\n} from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n/**\r\n * Opciones configurables para personalizar el comportamiento y apariencia de las alertas visuales.\r\n *\r\n * Permite definir iconos, imágenes, botones, temporizadores y temas para las alertas SweetAlert2.\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'. Ejemplo: 'success-icon.png'. Por defecto: 'icon/check02.png'.\r\n * @property icon - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional.\r\n * @property showConfirmButton - Si es true, muestra el botón de confirmación y desactiva el cierre automático. Por defecto: false.\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación. Por defecto: 'Ok'.\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta. Ignorado si showConfirmButton es true. Por defecto: 2000.\r\n * @property imageWidth - Ancho en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property imageHeight - Alto en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property showImage - Si es true, muestra la imagen personalizada; si es false, solo el icono SweetAlert2. Por defecto: true.\r\n * @property theme - Tema visual de SweetAlert2 (por ejemplo, 'dark', 'minimal', etc). Opcional.\r\n *\r\n * @example\r\n * // Alerta con icono personalizado y cierre automático\r\n * const options: AlertOptions = {\r\n * icono: 'custom-icon.png',\r\n * icon: 'warning',\r\n * timer: 3000\r\n * };\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón y sin imagen\r\n * const confirmOptions: AlertOptions = {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Aceptar',\r\n * showImage: false\r\n * };\r\n */\r\ninterface AlertOptions {\r\n icono?: string;\r\n icon?: SweetAlertIcon;\r\n showConfirmButton?: boolean;\r\n confirmButtonText?: string;\r\n timer?: number;\r\n imageWidth?: number;\r\n imageHeight?: number;\r\n showImage?: boolean;\r\n theme?: SweetAlertTheme;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n private toastrService = inject(ToastrService);\r\n\r\n /**\r\n * Tema visual por defecto para todas las alertas SweetAlert2.\r\n * Puedes cambiarlo desde tu app llamando a setDefaultTheme().\r\n */\r\n private defaultTheme: SweetAlertTheme | undefined = undefined;\r\n\r\n /**\r\n * Permite establecer el theme global para todas las alertas SweetAlert2.\r\n * @param theme - Valor de theme válido para SweetAlert2 (por ejemplo: 'dark', 'minimal', etc).\r\n */\r\n setDefaultTheme(theme: SweetAlertTheme) {\r\n this.defaultTheme = theme;\r\n }\r\n\r\n /**\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\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 4. bottom-center 5. bottom-right\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\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 private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `/${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 //theme: 'borderless',\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `/${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 alertaHtml(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'icon/notFound01.png',\r\n timer: number = 3500\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `/${icono}`,\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i>${message}</i> <span> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n * Muestra una alerta visual personalizada usando SweetAlert2.\r\n *\r\n * Permite configurar el mensaje, el título, el icono, la imagen, el botón de confirmación,\r\n * el temporizador y el tema visual, entre otras opciones.\r\n *\r\n * @param titleAlert - Título principal de la alerta (obligatorio).\r\n * @param messageHtml - Mensaje en formato HTML (obligatorio).\r\n * @param options - Opciones configurables de la alerta (opcional). Permite personalizar icono, imagen, botón, temporizador, etc.\r\n * @returns Promise<SweetAlertResult> que se resuelve cuando el usuario interactúa con la alerta o cuando se cierra automáticamente.\r\n *\r\n * @example\r\n * // Alerta básica con icono de éxito y cierre automático\r\n * alertaHtmlSuccess('Operación exitosa', 'Los datos se guardaron correctamente');\r\n *\r\n * @example\r\n * // Alerta de error con imagen personalizada y temporizador\r\n * alertaHtmlSuccess('Error crítico', 'No se pudo conectar al servidor', {\r\n * icono: 'error-icon.png',\r\n * icon: 'error',\r\n * timer: 5000\r\n * });\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón personalizado y sin imagen\r\n * alertaHtmlSuccess('Confirmar acción', '¿Está seguro de eliminar este registro?', {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Sí, eliminar',\r\n * icon: 'warning',\r\n * showImage: false\r\n * }).then((result) => {\r\n * if (result.isConfirmed) {\r\n * // Lógica cuando el usuario confirma\r\n * }\r\n * });\r\n */\r\n alertaHtmlSuccess(\r\n titleAlert: string,\r\n messageHtml: string,\r\n options: AlertOptions = {}\r\n ): Promise<SweetAlertResult> {\r\n const {\r\n icono = 'icon/check02.png',\r\n icon,\r\n showConfirmButton = false,\r\n confirmButtonText = 'Ok',\r\n timer = 2000,\r\n imageWidth = 125,\r\n imageHeight = 125,\r\n showImage = true,\r\n theme, // Puede venir por options o usar el global\r\n } = options;\r\n\r\n // Usa el theme global si no se especifica uno en options\r\n const alertTheme = theme !== undefined ? theme : this.defaultTheme;\r\n\r\n // Configuración base de SweetAlert\r\n const alertConfig: SweetAlertOptions = {\r\n title: titleAlert,\r\n html: messageHtml,\r\n draggable: true,\r\n showConfirmButton,\r\n confirmButtonText,\r\n timer: showConfirmButton ? undefined : timer, // Timer solo si no hay botón\r\n timerProgressBar: !showConfirmButton && timer > 0,\r\n imageUrl: showImage && icono ? `/${icono}` : undefined,\r\n imageWidth: showImage ? imageWidth : undefined,\r\n imageHeight: showImage ? imageHeight : undefined,\r\n imageAlt: showImage ? 'image alert' : undefined,\r\n // Aplica el theme global o el específico\r\n ...(alertTheme !== undefined && { theme: alertTheme }),\r\n };\r\n // Solo agrega el icono si está definido\r\n if (icon !== undefined) {\r\n alertConfig.icon = icon;\r\n }\r\n\r\n // Precargar imagen solo si es necesario\r\n if (showImage && icono) {\r\n return this.preloadImage(icono).then(() => Swal.fire(alertConfig));\r\n }\r\n\r\n return Swal.fire(alertConfig);\r\n }\r\n\r\n // private configureTimer(\r\n // config: SweetAlertOptions,\r\n // showConfirmButton: boolean,\r\n // timer: number\r\n // ) {\r\n // if (!showConfirmButton && timer > 0) {\r\n // config.timer = timer;\r\n // config.timerProgressBar = true;\r\n // }\r\n // }\r\n\r\n // No se puede utilizar por conflicto con primeng\r\n // notyfAlert(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 /**\r\n * Muestra un mensaje tipo toast usando PrimeNG MessageService.\r\n *\r\n * @param severity - Tipo de severidad del mensaje. Valores posibles:\r\n * 'success' | 'info' | 'warn' | 'error' | 'contrast' | 'secondary'.\r\n * Por defecto: 'success'.\r\n * @param title - Título del mensaje (aparece como summary).\r\n * @param message - Detalle del mensaje (aparece como detail).\r\n * @param time - Duración en milisegundos que el mensaje estará visible. Por defecto: 1500 ms.\r\n *\r\n * @example\r\n * // Mensaje de éxito\r\n * alertaService.showPrimeMessage('success', 'Operación exitosa', 'El registro fue guardado correctamente');\r\n *\r\n * @example\r\n * // Mensaje de advertencia personalizado\r\n * alertaService.showPrimeMessage('warn', 'Advertencia', 'Faltan campos obligatorios', 3000);\r\n */\r\n // showPrimeMessage(\r\n // title: string,\r\n // message: string,\r\n // severity:\r\n // | 'success'\r\n // | 'info'\r\n // | 'warn'\r\n // | 'error'\r\n // | 'contrast'\r\n // | 'secondary' = 'success',\r\n // time: number = 1500\r\n // ) {\r\n // this.primeMessageService.add({\r\n // severity: severity,\r\n // summary: title,\r\n // detail: message,\r\n // life: time,\r\n // });\r\n // }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { MyParameterValues } from '../models/src/parameterSecurity.model';\r\n\r\nexport const INITIAL_PARAMETERS = new InjectionToken<MyParameterValues[]>(\r\n 'InitialParameters'\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 {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { SeguridadITParameter } from '../models/src/parameterSecurity.model';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n // Inyecta el servicio HttpClient para realizar peticiones HTTP\r\n private http = inject(HttpClient);\r\n\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n // Construye la URL base de la API utilizando la URL de la aplicación desde la configuración del entorno\r\n private urlApi: string = `${this.environment.myAppUrl}api/auth`;\r\n\r\n /**\r\n * Método para obtener un nuevo token de acceso utilizando un refresh token.\r\n * @param refreshToken El refresh token que se utilizará para obtener un nuevo token de acceso.\r\n * @returns Un Observable que emite un objeto de tipo ModelToken.\r\n */\r\n tokenRefresh(refreshToken: string): Observable<ModelToken> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n\r\n // Realiza una solicitud POST al endpoint de refresco de token\r\n return this.http.post<ModelToken>(`${this.urlApi}/token-refresh/`, body, {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n });\r\n }\r\n\r\n /**\r\n * Método para obtener los parámetros de seguridad.\r\n * @param invalidCacheParam Indica si se debe invalidar la caché (opcional, por defecto es false).\r\n * @returns Un Observable que emite un objeto de tipo SeguridadITParameter.\r\n */\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false\r\n ): Observable<SeguridadITParameter> {\r\n // Crea los parámetros de la solicitud, incluyendo el parámetro invalidCacheParam,\r\n // parametro diseñado para invalidar la caché a traves del filtro\r\n const params = new HttpParams().set(\r\n 'invalidCacheParam',\r\n invalidCacheParam.toString()\r\n );\r\n\r\n // Realiza una solicitud GET al endpoint de parámetros de seguridad\r\n return this.http.get<SeguridadITParameter>(\r\n `${this.urlApi}/security-parameter/`,\r\n { params }\r\n );\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n catchError,\r\n delay,\r\n map,\r\n Observable,\r\n of,\r\n retry,\r\n throwError,\r\n} from 'rxjs';\r\nimport { INITIAL_PARAMETERS } from '../injections/parameterSecurity';\r\nimport {\r\n MyParameterValues,\r\n ParameterSecurity,\r\n} from '../models/src/parameterSecurity.model';\r\nimport { SecurityService } from './security.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio para gestionar los parámetros de seguridad de la aplicación.\r\n * Permite cargar los parámetros desde la API, mantenerlos en memoria, acceder y comparar valores de forma segura.\r\n * Utiliza tipado genérico para los nombres de parámetros y cache interno para optimizar consultas repetidas.\r\n *\r\n * @template T Tipo de los nombres de parámetros permitidos (usualmente un union type de string)\r\n */\r\nexport class ParameterValuesService<T extends string = string> {\r\n /**\r\n * Parámetros iniciales inyectados mediante INITIAL_PARAMETERS.\r\n * Se usan para validar y mapear los parámetros recibidos de la API.\r\n */\r\n private initialParameters = inject(INITIAL_PARAMETERS);\r\n\r\n /**\r\n * Cache interno para optimizar la comparación de valores de parámetros.\r\n * La clave es una combinación de nombre e índice, el valor es el resultado de la consulta.\r\n */\r\n private parameterCache = new Map<string, any>();\r\n\r\n private alertedParams = new Set<string>();\r\n private alertedParamsIsParameterValue = new Set<string>();\r\n\r\n /**\r\n * Servicio que contiene el método getParameterSecurity() para obtener los parámetros desde la API.\r\n */\r\n private apiService = inject(SecurityService);\r\n\r\n /**\r\n * Señal reactiva que contiene los parámetros cargados y permite actualizaciones automáticas.\r\n */\r\n private _dataParameter = signal<MyParameterValues<T>[]>(\r\n this.initializeData()\r\n );\r\n\r\n /**\r\n * Flag que indica si ya se cargaron los parámetros desde la API.\r\n */\r\n private _loaded = signal(false);\r\n get loaded() {\r\n return this._loaded();\r\n }\r\n\r\n /**\r\n * Inicializa los datos de parámetros usando los valores inyectados.\r\n * @returns Array de parámetros iniciales tipados\r\n */\r\n private initializeData(): MyParameterValues<T>[] {\r\n return this.initialParameters.map((param) =>\r\n this.createMyParameterValue(param.parameterName as T, param.values)\r\n );\r\n }\r\n\r\n /**\r\n * Crea una instancia de MyParameterValues tipada y segura.\r\n * @param parameterName Nombre del parámetro\r\n * @param values Valores asociados al parámetro\r\n * @returns Objeto MyParameterValues\r\n */\r\n private createMyParameterValue(\r\n parameterName: T,\r\n values: any[]\r\n ): MyParameterValues<T> {\r\n return {\r\n parameterName,\r\n values: [...values],\r\n };\r\n }\r\n\r\n /**\r\n * Devuelve los parámetros actuales como un array de solo lectura.\r\n */\r\n get dataParameter(): Readonly<MyParameterValues<T>[]> {\r\n return this._dataParameter();\r\n }\r\n\r\n /**\r\n * Setter privado para actualizar los parámetros.\r\n * Solo puede ser usado dentro del servicio para mantener la integridad de los datos.\r\n * @param values Array de parámetros a almacenar\r\n */\r\n private setDataParameter(values: MyParameterValues<T>[]): void {\r\n if (!Array.isArray(values)) {\r\n console.error('Error: valores inválidos para dataParameter');\r\n return;\r\n }\r\n this._dataParameter.set(values);\r\n }\r\n\r\n /**\r\n * Carga los parámetros desde la API.\r\n * Si ya se cargaron y force=false, devuelve la copia en memoria.\r\n * @param force Indica si se debe forzar la recarga desde la API (default: false)\r\n * @returns Observable que emite los parámetros cargados como MyParameterValues[]\r\n */\r\n loadParameters(force = false): Observable<MyParameterValues<T>[]> {\r\n if (this._loaded() && !force) {\r\n return of([...this.dataParameter]); // copia mutable\r\n }\r\n\r\n return this.apiService.getParameterSecurity(force).pipe(\r\n map((response) => {\r\n const apiParameters = response.parameterSecurity ?? [];\r\n this.validateParameters(apiParameters);\r\n const values = this.mapToMyParameterValues(apiParameters);\r\n this.setDataParameter(values);\r\n this._loaded.set(true);\r\n return values;\r\n }),\r\n // 👇 fallback si falla la llamada pero ya teníamos data\r\n catchError((error) => {\r\n if (this._loaded() && this.dataParameter.length > 0) {\r\n return of([...this.dataParameter]);\r\n }\r\n this._loaded.set(false);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fuerza la recarga de los parámetros desde la API.\r\n * @returns Observable que emite los parámetros actualizados\r\n */\r\n refreshParameters(): Observable<MyParameterValues<T>[]> {\r\n return this.loadParameters(true);\r\n }\r\n\r\n /**\r\n * Crea una copia segura y mutable de los parámetros actuales.\r\n * @returns Array de parámetros\r\n */\r\n private createSafeCopy(): MyParameterValues<T>[] {\r\n return this.dataParameter.map((item) =>\r\n this.createMyParameterValue(item.parameterName, [...item.values])\r\n );\r\n }\r\n\r\n /**\r\n * Mapea los parámetros recibidos de la API a objetos tipados y seguros.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n * @returns Array de MyParameterValues\r\n */\r\n private mapToMyParameterValues(\r\n apiParameters: ParameterSecurity[]\r\n ): MyParameterValues<T>[] {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n\r\n return apiParameters\r\n .filter((param) => initialNames.includes(param.parameterName))\r\n .map((param) => {\r\n // Función de conversión type-safe\r\n return this.convertToTypedParameter(param);\r\n })\r\n .filter((param): param is MyParameterValues<T> => param !== null);\r\n }\r\n\r\n /**\r\n * Convierte un parámetro de la API a un objeto tipado, validando el nombre.\r\n * @param param Parámetro recibido de la API\r\n * @returns Objeto MyParameterValues o null si no es válido\r\n */\r\n private convertToTypedParameter(\r\n param: ParameterSecurity\r\n ): MyParameterValues<T> | null {\r\n const initialParam = this.initialParameters.find(\r\n (p) => p.parameterName === param.parameterName\r\n );\r\n\r\n if (!initialParam) {\r\n return null;\r\n }\r\n\r\n // Conversión segura con verificación\r\n if (this.isValidParameterName(param.parameterName)) {\r\n return this.createMyParameterValue(\r\n param.parameterName as T,\r\n param.parameterValues?.map((v) => v.value) ?? []\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Verifica si un nombre de parámetro es válido según los parámetros iniciales.\r\n * @param name Nombre a validar\r\n * @returns true si es válido\r\n */\r\n private isValidParameterName(name: string): name is T {\r\n // Verifica que el nombre esté en los parámetros iniciales\r\n return this.initialParameters.some((param) => param.parameterName === name);\r\n }\r\n\r\n /**\r\n * Valida que los parámetros devueltos por la API coincidan con los iniciales.\r\n * Muestra errores o advertencias en consola si existen diferencias.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n */\r\n private validateParameters(apiParameters: ParameterSecurity[]): void {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n const apiNames = apiParameters.map((p) => p.parameterName);\r\n\r\n const missing = initialNames.filter((name) => !apiNames.includes(name));\r\n const extra = apiNames.filter((name) => !initialNames.includes(name));\r\n\r\n if (missing.length) {\r\n console.warn(`Faltan en API: ${missing.join(', ')}`);\r\n const ok = confirm(`Faltan en API: ${missing.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (extra.length) {\r\n console.warn(`Extra en API: ${extra.join(', ')}`);\r\n const ok = confirm(`Extra en API: ${extra.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (initialNames.length !== apiNames.length) {\r\n console.warn(\r\n `Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor específico de un parámetro.\r\n * Devuelve `defaultValue` si no existe el parámetro o el índice es inválido.\r\n * Valida que el parámetro exista antes de acceder a su valor.\r\n * @param parameterName Nombre del parámetro\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @param defaultValue Valor por defecto si no existe (default: null)\r\n * @returns Valor del parámetro o defaultValue si no existe o el índice es inválido\r\n */\r\n getValue<U = any>(\r\n parameterName: T,\r\n index = 0,\r\n defaultValue: U | null = null\r\n ): U {\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParams.has(parameterName)) {\r\n alert(`Advertencia: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParams.add(parameterName);\r\n }\r\n return defaultValue as U;\r\n }\r\n\r\n if (index < 0 || index >= param.values.length) {\r\n alert(\r\n `Advertencia: Índice ${index} fuera de rango para el parámetro '${parameterName}'.`\r\n );\r\n return defaultValue as U;\r\n }\r\n\r\n return param.values[index] as U;\r\n }\r\n\r\n /**\r\n * Compara un valor específico con un valor esperado, usando cache para optimizar llamadas repetidas.\r\n * @param parameterName Nombre del parámetro\r\n * @param expectedValue Valor esperado\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @returns true si coincide, false en caso contrario\r\n */\r\n isParameterValue<U = any>(\r\n parameterName: T,\r\n expectedValue: U,\r\n index = 0\r\n ): boolean {\r\n const cacheKey = `${String(parameterName)}_${index}`;\r\n\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParamsIsParameterValue.has(parameterName)) {\r\n alert(`Error: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParamsIsParameterValue.add(parameterName);\r\n }\r\n return false;\r\n }\r\n\r\n if (!this.parameterCache.has(cacheKey)) {\r\n const value = this.getValue<U>(parameterName, index);\r\n this.parameterCache.set(cacheKey, value);\r\n }\r\n\r\n return this.parameterCache.get(cacheKey) === expectedValue;\r\n }\r\n\r\n /**\r\n * Limpia el cache interno de comparaciones de parámetros.\r\n */\r\n clearParameterCache(): void {\r\n this.parameterCache.clear();\r\n }\r\n\r\n /**\r\n * Verifica si un parámetro tiene al menos un valor.\r\n * @param parameterName Nombre del parámetro\r\n * @returns true si tiene al menos un valor, false si no tiene\r\n */\r\n hasAnyValue(parameterName: T): boolean {\r\n return this.getAllValues(parameterName).length > 0;\r\n }\r\n\r\n /**\r\n * Devuelve todos los valores de un parámetro.\r\n * @param parameterName Nombre del parámetro\r\n * @returns Array de valores\r\n */\r\n getAllValues<U = any>(parameterName: T): U[] {\r\n return (this.dataParameter.find((p) => p.parameterName === parameterName)\r\n ?.values ?? []) as U[];\r\n }\r\n}\r\n","import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { AlertaService } from '../../services/alerta.service';\r\nimport { ParameterValuesService } from '../../services/parameter-values.service';\r\n\r\n@Component({\r\n selector: 'app-navbar-dsx',\r\n imports: [MenubarModule, ImageModule, ButtonModule, FormsModule],\r\n templateUrl: './navbar-dsx.component.html',\r\n styleUrl: './navbar-dsx.component.css',\r\n})\r\nexport class NavbarDsxComponent implements OnInit {\r\n //private _securityService = inject(SecurityService);\r\n private _parameterSecurityService = inject(ParameterValuesService);\r\n private _alertaService = inject(AlertaService);\r\n logoWidth = input<string>('300');\r\n appVersion = input<string>('V1.0.0');\r\n urlLogo = input<string>('assets/image/logoApp.png');\r\n // Estado del interruptor (tema claro/oscuro)\r\n checked: boolean = false;\r\n\r\n ngOnInit(): void {\r\n // Inicializa el tema al cargar el componente\r\n this.initializeTheme();\r\n //throw new Error('Method not implemented.');\r\n }\r\n\r\n // Inicializa el tema y el estado del interruptor\r\n initializeTheme(): void {\r\n const savedTheme = localStorage.getItem('theme') || 'light'; // Obtén el tema guardado o usa 'light' por defecto\r\n this.checked = savedTheme === 'dark'; // Actualiza el estado del interruptor\r\n this.applyTheme(savedTheme); // Aplica el tema\r\n }\r\n\r\n // Cambia el tema y actualiza el estado del interruptor\r\n onThemeChange(isDarkMode: boolean): void {\r\n // Determina el tema basado en el estado del interruptor\r\n const theme = isDarkMode ? 'dark' : 'light';\r\n // Aplica el tema\r\n this.applyTheme(theme);\r\n }\r\n\r\n // Aplica el tema y guarda la preferencia en localStorage\r\n applyTheme(theme: string): void {\r\n const html = document.documentElement;\r\n\r\n // Elimina las clases previas y agrega la nueva clase\r\n html.classList.remove('my-app-dark', 'my-app-light');\r\n html.classList.add(theme === 'dark' ? 'my-app-dark' : 'my-app-light');\r\n\r\n // Guarda el tema en localStorage\r\n localStorage.setItem('theme', theme);\r\n }\r\n\r\n actualizarSeguridadIT() {\r\n this._parameterSecurityService.refreshParameters().subscribe({\r\n next: (values) => {\r\n this._alertaService.toastrAlerts(\r\n 2,\r\n 'SeguridadIT',\r\n 'Parametro actualizado!',\r\n 2\r\n );\r\n //console.log('Parámetros cargados:', values);\r\n },\r\n error: (err) => {\r\n console.error('Error al actualizar parámetros de SeguridadIT', err);\r\n this._alertaService.toastrAlerts(\r\n 3,\r\n 'SeguridadIT',\r\n 'Error al actualizar parámetros!',\r\n 2\r\n );\r\n },\r\n complete: () => this._parameterSecurityService.clearParameterCache(),\r\n });\r\n }\r\n}\r\n","<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n [src]=\"urlLogo()\"\r\n alt=\"Image\"\r\n [width]=\"logoWidth()\"\r\n />\r\n <span class=\"version-text\">{{ appVersion() }}</span>\r\n </ng-template>\r\n <ng-template #end>\r\n <div>\r\n <p-button\r\n class=\"mr-2\"\r\n label=\"Permisos\"\r\n variant=\"text\"\r\n severity=\"info\"\r\n (click)=\"actualizarSeguridadIT()\"\r\n >\r\n <span class=\"material-symbols-outlined mr-1\">local_police</span>\r\n </p-button>\r\n <label class=\"ui-switch\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"checked\"\r\n (click)=\"onThemeChange(!checked ? true : false)\"\r\n />\r\n <div class=\"slider\">\r\n <div class=\"circle\"></div>\r\n </div>\r\n </label>\r\n <!-- <p-inputSwitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-inputSwitch> -->\r\n </div>\r\n </ng-template>\r\n</p-menubar>\r\n","import { Directive, ElementRef, HostListener } from '@angular/core';\r\n\r\n/**\r\n * Directiva que permite solo la entrada de:\r\n * - Dígitos (0-9)\r\n * - Separadores punto (.)\r\n * - Rango con guión (-)\r\n *\r\n * Ejemplos válidos:\r\n * - 1.2.3\r\n * - 4-6\r\n * - 1.3.5-9\r\n *\r\n * Restringe:\r\n * - Letras\r\n * - Espacios\r\n * - Caracteres especiales\r\n * - Doble punto (..), doble guión (--), o combinaciones como (.-)\r\n */\r\n@Directive({\r\n selector: '[appOnlyRangoPattern]',\r\n})\r\nexport class OnlyRangoPatternDirective {\r\n constructor(private el: ElementRef<HTMLInputElement>) {}\r\n\r\n /**\r\n * Expresión regular para permitir caracteres válidos individualmente (tecla por tecla).\r\n */\r\n private keyRegex: RegExp = /^[0-9.\\-]$/;\r\n\r\n /**\r\n * Escucha el evento de teclado y permite únicamente teclas válidas.\r\n * También evita combinaciones inválidas como `..`, `--`, `.1`, etc.\r\n */\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const input = this.el.nativeElement;\r\n const currentValue = input.value;\r\n const cursorPos = input.selectionStart ?? 0;\r\n const nextValue =\r\n currentValue.slice(0, cursorPos) +\r\n event.key +\r\n currentValue.slice(cursorPos);\r\n\r\n const allowedKeys = [\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Tab',\r\n 'Home',\r\n 'End',\r\n ];\r\n\r\n if (allowedKeys.includes(event.key)) return;\r\n\r\n if (!this.keyRegex.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir más de un punto o guión seguido, o combinaciones como \".-\", \"-.\", etc.\r\n if (/(\\.\\.|--|-\\.)|(\\.-)/.test(nextValue)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir iniciar con punto o guión\r\n if (cursorPos === 0 && (event.key === '.' || event.key === '-')) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Previene el pegado de cadenas que no cumplan con la estructura válida.\r\n * Solo permite: número o número separados por punto o guión correctamente.\r\n */\r\n @HostListener('paste', ['$event'])\r\n onPaste(event: ClipboardEvent): void {\r\n const pasted = event.clipboardData?.getData('text') ?? '';\r\n const sanitized = pasted.trim();\r\n\r\n // Patrón completo de cadena válida: ej. 1.2.3.4-6\r\n const pattern = /^(\\d+(-\\d+)?)(\\.\\d+(-\\d+)?)*$/;\r\n\r\n if (!pattern.test(sanitized)) {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appSelectAllOnFocus]',\r\n})\r\nexport class SelectAllOnFocusDirective {\r\n @HostListener('onFocus', ['$event'])\r\n @HostListener('focus', ['$event'])\r\n selectAll(event: Event): void {\r\n const htmlInput = event.target as HTMLInputElement;\r\n if (htmlInput) {\r\n htmlInput.select();\r\n }\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const CACHE_KEYS = new InjectionToken<Record<string, string>>(\r\n 'CACHE_KEYS'\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 {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { jwtSecurityModel, ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n _cookieService = inject(CookieService);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\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 /**\r\n * Obtiene el Refresh Token almacenado en cookies.\r\n *\r\n * - En modo desarrollo (isDevMode):\r\n * Si no existe un refresh token en cookies, genera uno temporal\r\n * para evitar errores durante pruebas locales.\r\n *\r\n * - En modo producción:\r\n * Simplemente devuelve el refresh token real almacenado por el backend.\r\n *\r\n * @returns string | null - El refresh token o null si no existe.\r\n */\r\n getTokenRefresh(): string | null {\r\n // 🔹 MODO DESARROLLO: asegura que siempre haya un token de prueba\r\n if (isDevMode()) {\r\n const tokenRefresh = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n\r\n // Si no existe un refresh token, generamos uno de desarrollo\r\n if (!tokenRefresh) {\r\n const devTokens: ModelToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c', // Token dummy para testing\r\n refreshTokenExpiry: new Date(),\r\n };\r\n\r\n // Carga y guarda las cookies necesarias\r\n this.tokenReload(devTokens);\r\n }\r\n }\r\n\r\n // 🔹 DEVUELVE el refresh token real o de desarrollo\r\n return this._cookieService.get(this.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 /**\r\n * Obtiene los valores principales del JWT almacenado (usuario, roles y estado).\r\n *\r\n * Este getter:\r\n * - Lee el access token desde cookies.\r\n * - Devuelve un objeto tipado (jwtSecurityModel).\r\n * - Decodifica el token para obtener `unique_name` y `role`.\r\n * - Determina si el token está expirado usando JwtHelperService.\r\n *\r\n * Si no existe token:\r\n * - Devuelve un objeto vacío con valores en null y `isTokenExpired = true`.\r\n *\r\n * Uso:\r\n * const info = this.authorize.getTokenValues;\r\n */\r\n get getTokenValues(): jwtSecurityModel {\r\n // Obtener el token almacenado\r\n const token = this.getToken();\r\n\r\n // Si no existe token → devolver estructura vacía\r\n if (!token) {\r\n return {\r\n userName: null,\r\n role: null,\r\n isTokenExpired: true,\r\n };\r\n }\r\n\r\n // Decodificar JWT\r\n const decoded = this.helperJwt.decodeToken(token) || {};\r\n\r\n return {\r\n userName: decoded.unique_name ?? null,\r\n\r\n // JWT puede traer role como string o como array → convertir a array\r\n role: decoded.role\r\n ? Array.isArray(decoded.role)\r\n ? decoded.role\r\n : [decoded.role]\r\n : null,\r\n\r\n // Validación de expiración del JWT\r\n isTokenExpired: this.helperJwt.isTokenExpired(token),\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, timer } 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 `.<strong class=\"alertMessageDsx\"> (${error.error})</strong>`\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","// Interceptor HTTP para manejar autorización y refresco de tokens en peticiones HTTP.\r\n// Permite agregar el token de autorización, manejar errores 401 y refrescar el token automáticamente.\r\nimport {\r\n HttpErrorResponse,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport {\r\n BehaviorSubject,\r\n catchError,\r\n EMPTY,\r\n filter,\r\n finalize,\r\n switchMap,\r\n take,\r\n} from 'rxjs';\r\nimport { ModelToken } from '../models/src/token.model';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\n\r\n// Lleva el conteo de peticiones activas para mostrar/ocultar el spinner\r\nlet _activeRequest = 0;\r\n// Indica si se está realizando un refresh de token\r\nlet isRefreshing = false;\r\n// Subject para emitir el nuevo token tras el refresh\r\nlet refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\n/**\r\n * Interceptor principal para autorización HTTP.\r\n * - Agrega el token de autorización a cada petición.\r\n * - Muestra/oculta el spinner de carga según el número de peticiones activas.\r\n * - Maneja errores 401 (Unauthorized) refrescando el token si es posible.\r\n * - Repite la petición original tras refrescar el token.\r\n */\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\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 const _token = _authorizeService.getToken();\r\n\r\n let authReq = req;\r\n\r\n // Si la URL de la petición es inválida, retorna un observable vacío\r\n // Surgio a partir de angular V21\r\n if (!req.url || req.url.trim() === '' || req.url === '/') {\r\n return EMPTY;\r\n }\r\n\r\n if (_token) {\r\n authReq = req.clone({\r\n setHeaders: { Authorization: `Bearer ${_token}` },\r\n });\r\n }\r\n\r\n // Para depuración: muestra el token agregado\r\n //console.log('Interceptor - Token agregado a la petición:', authReq);\r\n\r\n // Muestra el spinner si es la primera petición activa\r\n if (_activeRequest === 0) {\r\n _spinnerService.show();\r\n }\r\n _activeRequest++;\r\n\r\n // Ejecuta la petición HTTP\r\n return next(authReq).pipe(\r\n // Manejo de errores en la respuesta\r\n catchError((error: HttpErrorResponse) => {\r\n // Si el error es 401 (no autorizado), intenta refrescar el token\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n const refreshToken = _authorizeService.getTokenRefresh();\r\n // Si no hay refresh token, delega el manejo del error\r\n if (!refreshToken) {\r\n return _handleErrorService.handleErrorResponse(error);\r\n }\r\n\r\n // Si no se está refrescando el token, inicia el proceso de refresh\r\n if (!isRefreshing) {\r\n isRefreshing = true;\r\n refreshTokenSubject.next(null);\r\n\r\n // Solicita el refresh del token\r\n return _securityService.tokenRefresh(refreshToken).pipe(\r\n switchMap((response: ModelToken) => {\r\n isRefreshing = false;\r\n _authorizeService.tokenReload(response); // Actualiza el token en el servicio\r\n refreshTokenSubject.next(response.token); // Emite el nuevo token\r\n\r\n // Repite la petición original con el nuevo token\r\n return next(\r\n req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n })\r\n );\r\n }),\r\n catchError((err) => {\r\n isRefreshing = false;\r\n refreshTokenSubject.error(err); // Emite el error en el subject\r\n return _handleErrorService.handleErrorResponse(err);\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, espera a que el subject emita el nuevo token\r\n return refreshTokenSubject.pipe(\r\n filter((token) => token != null), // Espera a que el token sea válido\r\n take(1), // Toma solo la primera emisión válida\r\n switchMap((token) =>\r\n next(\r\n req.clone({\r\n setHeaders: { Authorization: `Bearer ${token}` },\r\n })\r\n )\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Para otros errores, delega al servicio de manejo de errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n // Al finalizar la petición (éxito o error), actualiza el conteo y oculta el spinner si corresponde\r\n // comentarizar el hide para verificar el spinner en la aplicacion final\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","export type InferCacheKeyType<T extends Record<string, string>> = keyof T;\r\n\r\n/**\r\n * Transforma un tipo de mapa `T` cuyas claves son simbólicas\r\n * y cuyos valores son nombres de propiedades reales de caché,\r\n * a un objeto donde esas propiedades reales son claves booleanas.\r\n *\r\n * @example\r\n * ```ts\r\n * type T = { cliente: 'invalidateCacheCliente' };\r\n * InferCacheOptions<T> // { invalidateCacheCliente: boolean }\r\n * ```\r\n */\r\nexport type InferCacheOptions<T extends Record<string, string>> = {\r\n [K in keyof T as T[K]]: boolean;\r\n};\r\n\r\nexport function createInitialCache<T extends Record<string, string>>(\r\n cacheKeys: T\r\n): {\r\n -readonly [K in keyof T as T[K]]: boolean;\r\n} {\r\n return Object.fromEntries(\r\n Object.values(cacheKeys).map((key) => [key, false])\r\n ) as any;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { JsonValuesDebujComponent } from '../../components/json-values-debuj/json-values-debuj.component';\r\nimport { IconDsxComponent } from '../../components/icon-dsx/icon-dsx.component';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [IconDsxComponent, JsonValuesDebujComponent],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n IconDsxComponent,\r\n JsonValuesDebujComponent,\r\n ReactiveFormsModule,\r\n ],\r\n providers: [],\r\n})\r\nexport class DsxAddToolsModule {}\r\n","import { NgModule } from '@angular/core';\r\n\r\n//PrimeNG\r\nimport { AccordionModule } from 'primeng/accordion';\r\nimport { AutoCompleteModule } from 'primeng/autocomplete';\r\nimport { AutoFocusModule } from 'primeng/autofocus';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { AvatarGroupModule } from 'primeng/avatargroup';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { FieldsetModule } from 'primeng/fieldset';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { InputMaskModule } from 'primeng/inputmask';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { PanelMenuModule } from 'primeng/panelmenu';\r\nimport { PasswordModule } from 'primeng/password';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\nimport { StepperModule } from 'primeng/stepper';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { TextareaModule } from 'primeng/textarea';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { ToggleButtonModule } from 'primeng/togglebutton';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\nconst PRIME_NG_MODULES = [\r\n AccordionModule,\r\n AutoCompleteModule,\r\n AutoFocusModule,\r\n AvatarGroupModule,\r\n AvatarModule,\r\n ButtonModule,\r\n CheckboxModule,\r\n DatePickerModule,\r\n DialogModule,\r\n DividerModule,\r\n DrawerModule,\r\n FieldsetModule,\r\n FileUploadModule,\r\n FloatLabelModule,\r\n IconFieldModule,\r\n ImageModule,\r\n InputIconModule,\r\n InputMaskModule,\r\n InputNumberModule,\r\n InputTextModule,\r\n MenubarModule,\r\n MessageModule,\r\n MultiSelectModule,\r\n PanelMenuModule,\r\n PasswordModule,\r\n RadioButtonModule,\r\n RippleModule,\r\n SelectModule,\r\n SplitButtonModule,\r\n StepperModule,\r\n TableModule,\r\n TabsModule,\r\n TagModule,\r\n TextareaModule,\r\n ToastModule,\r\n ToggleButtonModule,\r\n TooltipModule,\r\n];\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n exports: [...PRIME_NG_MODULES],\r\n providers: [],\r\n})\r\nexport class PrimeNgModule {}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'truncate',\r\n standalone: true,\r\n})\r\nexport class TruncatePipe implements PipeTransform {\r\n /**\r\n * Transforma una cadena de texto truncándola según los parámetros proporcionados.\r\n *\r\n * @param value - La cadena de texto que se desea truncar.\r\n * @param limit - El número máximo de caracteres permitidos. Por defecto es 100. Si no se encuentra un espacio dentro del límite, usa el límite original (15).\r\n * @param completeWords - Si es true, evita cortar palabras a la mitad. Por defecto es false.\r\n * @param ellipsis - La cadena que se añadirá al final del texto truncado. Por defecto es '...'.\r\n * @returns La cadena truncada con el ellipsis añadido, si es necesario.\r\n */\r\n transform(\r\n value: string,\r\n limit: number = 20,\r\n completeWords: boolean = false,\r\n ellipsis: string = '...'\r\n ): string {\r\n // Si el valor es nulo o indefinido, devuelve una cadena vacía para evitar errores.\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n // Si completeWords es true, ajusta el límite para no cortar palabras.\r\n if (completeWords) {\r\n // Encuentra el último espacio dentro del límite para evitar cortar palabras.\r\n limit = value.slice(0, limit).lastIndexOf(' ');\r\n\r\n // Si no se encuentra un espacio dentro del límite, usa el límite original.\r\n if (limit < 0) {\r\n limit = 15; // Valor por defecto si no hay espacios.\r\n }\r\n }\r\n\r\n // Trunca el texto y añade el ellipsis si la longitud del texto supera el límite.\r\n return value.length > limit ? value.slice(0, limit) + ellipsis : value;\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { CACHE_KEYS } from '../injections/cache.token';\r\nimport { InferCacheOptions } from '../models/src/cache.types';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n\r\n/**\r\n * Servicio genérico para el manejo de caché reactivo basado en claves definidas por el consumidor.\r\n *\r\n * Este servicio utiliza señales (`signal`) para almacenar el estado de invalidación de caché\r\n * y permite marcar ciertas entradas como inválidas mediante una llamada a `invalidate`.\r\n *\r\n * ---\r\n * ## Uso básico\r\n * Si no se especifica el tipo genérico `T`, el servicio funcionará con un mapa genérico\r\n * `Record<string, string>` sin autocompletado.\r\n *\r\n * ```ts\r\n * const cacheService = inject(CacheService);\r\n * cacheService.invalidate(['cualquierClave']);\r\n * ```\r\n *\r\n * ---\r\n * ## Uso tipado (recomendado)\r\n * 1. Definir las claves de caché en el proyecto consumidor:\r\n * ```ts\r\n * export const INITIAL_CACHE_KEYS = {\r\n * cliente: 'invalidateCacheCliente',\r\n * empresa: 'invalidateCacheEmpresa'\r\n * } as const;\r\n *\r\n * export type ValueCacheKeys = typeof INITIAL_CACHE_KEYS;\r\n * ```\r\n *\r\n * 2. Proveer estas claves en `AppModule` o un módulo raíz:\r\n * ```ts\r\n * providers: [\r\n * { provide: CACHE_KEYS, useValue: INITIAL_CACHE_KEYS }\r\n * ]\r\n * ```\r\n *\r\n * 3. Inyectar el servicio especificando el tipo:\r\n * ```ts\r\n * const cacheService = inject<CacheService<ValueCacheKeys>>(CacheService);\r\n *\r\n * cacheService.options.invalidateCacheCliente; // ✅ boolean con autocompletado\r\n * cacheService.invalidate(['cliente']); // marca como invalidado\r\n * ```\r\n *\r\n * @typeParam T - Objeto con claves simbólicas (`keyof T`) como `cliente`, `empresa`,\r\n * y valores string literales usados como claves reales de caché.\r\n * Por defecto: `Record<string, string>`.\r\n */\r\nexport class CacheService<\r\n T extends Record<string, string> = Record<string, string>\r\n> {\r\n /**\r\n * Mapa de claves simbólicas a claves reales de caché.\r\n * Se inyecta desde el proyecto consumidor mediante `CACHE_KEYS`.\r\n */\r\n private keys = inject(CACHE_KEYS) as T;\r\n\r\n /**\r\n * Servicio de alerta utilizado para mostrar notificaciones al usuario.\r\n */\r\n private alert = inject(AlertaService);\r\n\r\n /**\r\n * Estado reactivo que contiene un objeto donde cada propiedad (clave real de caché)\r\n * tiene un valor booleano que indica si el caché ha sido invalidado (`true`)\r\n * o sigue siendo válido (`false`).\r\n *\r\n * Este estado es tipado automáticamente en función de los valores de `T`.\r\n */\r\n private _options = signal<InferCacheOptions<T>>(\r\n Object.fromEntries(\r\n Object.values(this.keys).map((k) => [k, false])\r\n ) as InferCacheOptions<T>\r\n );\r\n\r\n /**\r\n * Obtiene el estado actual del caché.\r\n * Cada propiedad representa una clave real de caché con su valor booleano.\r\n */\r\n get options(): InferCacheOptions<T> {\r\n return this._options();\r\n }\r\n\r\n /**\r\n * Invalida una o más claves simbólicas, marcando su correspondiente\r\n * propiedad de caché como `true` (invalidada).\r\n *\r\n * @param keysToInvalidate - Lista de claves simbólicas (`keyof T`) a invalidar.\r\n *\r\n * @example\r\n * ```ts\r\n * cacheService.invalidate(['cliente', 'empresa']);\r\n * ```\r\n */\r\n invalidate(keysToInvalidate: (keyof T)[] | null = null): void {\r\n if (!keysToInvalidate?.length) return;\r\n\r\n const current: InferCacheOptions<T> = { ...this._options() };\r\n\r\n keysToInvalidate.forEach((key) => {\r\n const prop = this.keys[key] as keyof InferCacheOptions<T>;\r\n current[prop] = true as InferCacheOptions<T>[typeof prop];\r\n });\r\n\r\n this._options.set(current);\r\n\r\n this.alert.toastrAlerts(\r\n 2,\r\n 'Estado',\r\n 'Datos actualizados (cache).',\r\n 2,\r\n 1000\r\n );\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport { CacheService } from './cache.service';\r\n\r\nexport function createTypedCacheProvider<T extends Record<string, string>>(\r\n tokenName: string\r\n): { token: InjectionToken<CacheService<T>>; provider: Provider } {\r\n const token = new InjectionToken<CacheService<T>>(tokenName);\r\n\r\n const provider: Provider = {\r\n provide: token,\r\n useFactory: () => new CacheService<T>(),\r\n deps: [],\r\n };\r\n\r\n return { token, provider };\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class EndpointService<T> {\r\n private http = inject(HttpClient);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private getUrl(endpoint: string): string {\r\n return `${this.environment.myAppUrl}api/${endpoint}`;\r\n }\r\n\r\n list(endpoint: string, invalidateCache: boolean = false): Observable<T[]> {\r\n return this.http.get<T[]>(\r\n `${this.getUrl(endpoint)}/listar/${invalidateCache}`\r\n );\r\n }\r\n\r\n edit(endpoint: string, id: number): Observable<T> {\r\n return this.http.get<T>(`${this.getUrl(endpoint)}/get-id/${id}`);\r\n }\r\n\r\n save(endpoint: string, values: T): Observable<ResponseHttpModel> {\r\n return this.http.put<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/save`,\r\n values\r\n );\r\n }\r\n\r\n delete(\r\n endpoint: string,\r\n id: number,\r\n softDelete: boolean = true\r\n ): Observable<ResponseHttpModel> {\r\n return this.http.delete<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/delete/${id}/${softDelete}`\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport moment from 'moment-timezone';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ResponseHttpModel } from '../models';\r\nimport {\r\n FechasConversion,\r\n FilterOption,\r\n TipoFechaConversion,\r\n} from '../models/src/extensions.model';\r\nimport { FieldConfig } from '../models/src/field-config.model';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UtilityAddService {\r\n private _serviceAlerta = inject(AlertaService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private _router = inject(Router);\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto formateada según la zona horaria especificada.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en la zona horaria especificada o null si la fecha es null.\r\n */\r\n convertirFechaSegunZonaHoraria(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Cambia esto a la zona horaria que desees\r\n const zonaHoraria = 'America/Guatemala';\r\n return moment(fecha).tz(zonaHoraria).format();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a un objeto Date en formato ISO, opcionalmente ajustando la hora al inicio del día.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {Date | null} - La fecha convertida en formato Date o null si la fecha es null.\r\n */\r\n convertirFechaISOString(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): Date | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toDate();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena en formato ISO 8601.\r\n *\r\n * @param {string | Date} fecha - La fecha a convertir. Puede ser un string o un objeto Date.\r\n * @param {boolean} initHour - Si es true, ajusta la hora al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha en formato ISO 8601 (ejemplo: '2025-09-05T00:00:00.000Z') o null si la fecha es inválida.\r\n *\r\n * @example\r\n * // Fecha como string\r\n * service.convertirFechaISO8601('2025-09-05'); // '2025-09-05T00:00:00.000Z'\r\n * // Fecha como Date y ajustando al inicio del día\r\n * service.convertirFechaISO8601(new Date(), true); // '2025-09-05T00:00:00.000Z'\r\n */\r\n convertirFechaISO8601(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toISOString();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato corto (YYYY-MM-DD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha formateada en formato corto (YYYY-MM-DD) o null si la fecha es null.\r\n */\r\n convertirFechaShort(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n const fechaMoment = moment(fecha).format('YYYY-MM-DD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto que representa solo la hora (HH:mm).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La hora formateada (HH:mm) o null si la fecha es null.\r\n */\r\n convertirFechaTime(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('HH:mm');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato timestamp (YYYYMMDD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en formato timestamp (YYYYMMDD) o null si la fecha es null.\r\n */\r\n convertirTimeStampString(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('YYYYMMDD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Crea un FormGroup tipado a partir de una configuración de campos.\r\n *\r\n * @param {FormBuilder} fb - Instancia de FormBuilder para crear el FormGroup.\r\n * @param {FieldConfig<T>} config - Configuración de los campos del formulario.\r\n * @param {ValidatorFn[]} groupValidators - Validadores adicionales a nivel de grupo.\r\n * @returns {FormGroup} - El FormGroup creado.\r\n */\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidators?: ValidatorFn[]\r\n ): FormGroup {\r\n const formGroup: { [key in keyof T]?: FormControl } = {};\r\n\r\n // Crear controles de formulario individuales\r\n for (const key in config) {\r\n if (Object.prototype.hasOwnProperty.call(config, key)) {\r\n const { value, disabled = false, validators = [] } = config[key];\r\n formGroup[key] = new FormControl({ value, disabled }, validators);\r\n }\r\n }\r\n\r\n // Crear el FormGroup con validadores adicionales a nivel de grupo si existen\r\n const group = fb.group(\r\n formGroup,\r\n groupValidators ? { validators: groupValidators } : {}\r\n );\r\n\r\n return group;\r\n }\r\n\r\n /**\r\n * Sanitiza un formulario obteniendo valores de un formulario, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del modelo a procesar.\r\n * @param form - El formulario reactivo de Angular del que se obtendrán los valores.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar. Cada objeto debe contener:\r\n * - `nombre`: El nombre del campo de fecha en el modelo.\r\n * - `tipo`: El tipo de conversión que se debe aplicar (por ejemplo, `'short'`, `'zh'`, `'iso').\r\n * @returns Un objeto del tipo `T` con los datos procesados y las conversiones de fecha aplicadas.\r\n * @throws Error - Si el campo de fecha especificado no existe en los datos del formulario.\r\n *\r\n * @example\r\n * // Procesar varios campos de fecha\r\n * const precioValues = service.sanitizarModelo<ItemPrecioModel>(\r\n * form,\r\n * { nombre: 'fechaInicio', tipo: 'short' },\r\n * { nombre: 'fechaFin', tipo: 'zh' }\r\n * );\r\n */\r\n sanitizarForm<T>(form: any, ...campos: FechasConversion[]): T {\r\n // Obtén todos los valores del formulario\r\n const rawData = form.getRawValue();\r\n\r\n if (!rawData) {\r\n throw new Error('El formulario no tiene valores.');\r\n }\r\n\r\n // Procesa los valores sin envolver en un arreglo\r\n const updatedValue = { ...rawData };\r\n\r\n // Itera sobre los campos de fecha especificados para realizar las conversiones\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el valor.`);\r\n }\r\n updatedValue[nombre] = updatedValue[nombre]\r\n ? this.convertirFecha(updatedValue[nombre], tipo)\r\n : null;\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Sanitiza un objeto plano, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del objeto a procesar.\r\n * @param values - El objeto con los datos.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar.\r\n * @returns Un objeto del tipo T con las conversiones de fecha aplicadas.\r\n */\r\n sanitizarModel<T extends Record<string, any>>(\r\n values: T,\r\n ...campos: FechasConversion[]\r\n ): T {\r\n // Crear una copia del objeto para no modificar el original\r\n const updatedValue: Record<string, any> = { ...values };\r\n\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el objeto.`);\r\n }\r\n\r\n const valorActual = updatedValue[nombre];\r\n\r\n if (\r\n valorActual !== null &&\r\n valorActual !== undefined &&\r\n valorActual !== ''\r\n ) {\r\n updatedValue[nombre] = this.convertirFecha(valorActual, tipo);\r\n } else {\r\n updatedValue[nombre] = null;\r\n }\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Convierte una fecha al formato especificado.\r\n *\r\n * @param fecha - La fecha en formato string que se desea convertir.\r\n * Debe estar en un formato reconocible por `Date` o en ISO 8601.\r\n * @param tipo - El tipo de conversión a realizar. Soporta:\r\n * - `'short'`: Devuelve la fecha en formato corto (YYYY-MM-DD).\r\n * - `'zh'`: Devuelve la fecha ajustada a la zona horaria configurada.\r\n * - `'iso'`: Devuelve la fecha como objeto Date en formato ISO.\r\n * - `'iso8601'`: Devuelve la fecha como string en formato ISO 8601.\r\n * @returns La fecha convertida como string o Date según el tipo especificado, o null si la fecha es inválida.\r\n * @throws Error - Si el tipo de conversión no es válido o soportado.\r\n *\r\n * @example\r\n * // Formato corto\r\n * service.convertirFecha('2025-08-21', 'short'); // '2025-08-21'\r\n * // Zona horaria\r\n * service.convertirFecha('2025-08-21', 'zh'); // '2025-08-21T00:00:00-06:00' (ejemplo)\r\n * // Formato ISO (Date)\r\n * service.convertirFecha('2025-08-21', 'iso'); // Date { ... }\r\n * // Formato ISO 8601 (string)\r\n * service.convertirFecha('2025-08-21', 'iso8601'); // '2025-08-21T00:00:00.000Z'\r\n */\r\n private convertirFecha(\r\n fecha: string,\r\n tipo: TipoFechaConversion\r\n ): Date | string | null {\r\n switch (tipo) {\r\n case 'short':\r\n // Implementación para el formato corto\r\n return this.convertirFechaShort(fecha);\r\n case 'zh':\r\n // Implementación para zonas horarias\r\n return this.convertirFechaSegunZonaHoraria(fecha);\r\n case 'iso': {\r\n return this.convertirFechaISOString(fecha);\r\n }\r\n case 'iso8601': {\r\n return this.convertirFechaISO8601(fecha);\r\n }\r\n default:\r\n throw new Error(`Tipo de conversión desconocido: ${tipo}`);\r\n }\r\n }\r\n\r\n /**\r\n * Maneja la respuesta de un archivo descargable\r\n * @param fileObservable Observable que emite el Blob del archivo\r\n * @param actionId 0 para abrir en nueva ventana, 1 para descargar\r\n * @param fileName Nombre del archivo sin extensión\r\n */\r\n handleFileResponse(\r\n fileObservable: Observable<Blob>,\r\n actionId: number,\r\n fileName: string\r\n ): void {\r\n fileObservable.subscribe({\r\n next: (fileBlob: Blob) => {\r\n const fileUrl = URL.createObjectURL(fileBlob);\r\n const fileExtension = this.getFileExtension(fileBlob.type);\r\n\r\n if (this.isExcelFile(fileBlob.type)) {\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n } else {\r\n this.handleNonExcelFiles(fileUrl, actionId, fileName, fileExtension);\r\n }\r\n\r\n this.revokeObjectUrl(fileUrl);\r\n },\r\n error: (err) => console.error('Error al manejar el archivo:', err),\r\n });\r\n }\r\n\r\n private isExcelFile(fileType: string): boolean {\r\n return fileType.includes(\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n );\r\n }\r\n\r\n private getFileExtension(fileType: string): string {\r\n return fileType.includes('pdf') ? '.pdf' : '.xlsx';\r\n }\r\n\r\n private handleNonExcelFiles(\r\n fileUrl: string,\r\n actionId: number,\r\n fileName: string,\r\n fileExtension: string\r\n ): void {\r\n switch (actionId) {\r\n case 0: // Abrir en nueva ventana\r\n window.open(fileUrl, '_blank');\r\n break;\r\n case 1: // Descargar archivo\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n break;\r\n }\r\n }\r\n\r\n private forceDownload(fileUrl: string, fullFileName: string): void {\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n downloadLink.download = fullFileName;\r\n downloadLink.click();\r\n }\r\n\r\n private revokeObjectUrl(fileUrl: string): void {\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(fileUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Muestra información en consola solo en desarrollo, permitiendo múltiples argumentos como console.log nativo.\r\n *\r\n * @param args - Argumentos a mostrar en consola (texto, objetos, etc).\r\n * @example\r\n * logIfNotProduction('Datos:', response);\r\n * logIfNotProduction('Error:', error, { extra: true });\r\n */\r\n logIfNotProduction(...args: any[]): void {\r\n if (!this.environment.production) {\r\n console.log(...args);\r\n }\r\n }\r\n\r\n /**\r\n * Marca todos los controles de un formulario como \"tocados\" y muestra un mensaje de alerta.\r\n * @param form - El formulario que se va a validar.\r\n */\r\n checkFormValid(form: FormGroup): void {\r\n // Marca todos los controles como tocados\r\n form.markAllAsTouched();\r\n\r\n // Muestra un mensaje de alerta\r\n this._serviceAlerta.toastrAlerts(\r\n 3,\r\n 'Formulario',\r\n 'Validaciones pendientes',\r\n 2\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene valores únicos de un campo específico de un array de objetos\r\n * @param data Array de objetos de tipo T\r\n * @param field Campo del objeto del cual extraer valores únicos\r\n * @returns FilterOption[] Listado filtrado, tipado y ordenado alfabéticamente\r\n */\r\n getUniqueValues<T>(data: T[], field: keyof T): FilterOption[] {\r\n const uniqueValues = data.reduce((acc: FilterOption[], current) => {\r\n const fieldValue = current[field];\r\n\r\n if (\r\n typeof fieldValue === 'string' &&\r\n !acc.some((item) => item.value === fieldValue)\r\n ) {\r\n acc.push({\r\n value: fieldValue,\r\n field: field.toString(),\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return uniqueValues.sort((a, b) => a.value.localeCompare(b.value));\r\n }\r\n\r\n /**\r\n * Helper function para parsear fechas para filtro de primeNg en table\r\n * @param date - Fecha en formato string, Date o null/undefined\r\n * @returns Date | null - Objeto Date válido o null\r\n */\r\n parseDate(date: string | Date | null): Date | null {\r\n if (!date) return null;\r\n return typeof date === 'string' ? new Date(date) : date;\r\n }\r\n\r\n /**\r\n * Función pura que procesa una cadena de texto conteniendo números individuales y/o rangos numéricos,\r\n * devolviendo un array con todos los números expandidos.\r\n *\r\n * @param input - Cadena de texto con el formato: número[.número][.inicio-fin][...]\r\n * @returns Array de números con todos los valores individuales y rangos expandidos\r\n *\r\n * @example\r\n * // Uso básico\r\n * const result = parseNumericRanges('1.5.7.10-12');\r\n * // Retorna: [1, 5, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Con espacios y caracteres especiales\r\n * const result = parseNumericRanges(' 3. 5-7 .10-12abc');\r\n * // Retorna: [3, 5, 6, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Rangos invertidos (serán ignorados)\r\n * const result = parseNumericRanges('10-8');\r\n * // Retorna: [] (array vacío)\r\n *\r\n * @note\r\n * Características especiales:\r\n * - Elimina automáticamente espacios y caracteres no numéricos\r\n * - Los números deben estar separados por puntos (.)\r\n * - Los rangos deben usar guión (-) sin espacios entre números\r\n * - Es tolerante a formatos inconsistentes\r\n * - Omite elementos inválidos sin generar errores\r\n */\r\n parseNumericRanges(input: string): number[] {\r\n const cleanString = input.replace(/[^\\d.\\- ]/g, '').replace(/\\s+/g, '');\r\n\r\n const parts = cleanString.split('.');\r\n const result: number[] = [];\r\n\r\n for (const part of parts) {\r\n if (!part) continue;\r\n\r\n if (part.includes('-')) {\r\n const [startStr, endStr] = part.split('-');\r\n const start = parseInt(startStr, 10);\r\n const end = parseInt(endStr, 10);\r\n\r\n if (!isNaN(start) && !isNaN(end) && start <= end) {\r\n for (let i = start; i <= end; i++) {\r\n result.push(i);\r\n }\r\n }\r\n } else {\r\n const number = parseInt(part, 10);\r\n if (!isNaN(number)) {\r\n result.push(number);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adaptador para procesar eventos de input y extraer rangos numéricos.\r\n *\r\n * @param event - Objeto Event del DOM, preferiblemente de un elemento input\r\n * @returns Array de números generado a partir del valor del input\r\n *\r\n * @example\r\n * // Uso en template Angular\r\n * <input (input)=\"processNumericRangesFromEvent($event)\">\r\n *\r\n * @example\r\n * // Uso directo\r\n * const result = processNumericRangesFromEvent(inputEvent);\r\n *\r\n * @note\r\n * Esta función es un wrapper que:\r\n * - Extrae el valor del input del evento\r\n * - Delega el procesamiento a parseNumericRanges()\r\n * - Mantiene compatibilidad con eventos de diferentes frameworks\r\n *\r\n * @dependencies\r\n * Requiere que el evento tenga la propiedad target.value (standard DOM)\r\n * Para otros tipos de eventos (ej. Angular Material) puede necesitar ajustes\r\n */\r\n processNumericRangesFromEvent(event: Event): number[] {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n return this.parseNumericRanges(inputValue);\r\n }\r\n\r\n /**\r\n * Maneja la respuesta estándar de una operación HTTP, mostrando alertas y realizando acciones comunes en formularios.\r\n *\r\n * @param response - Respuesta de la operación (debe tener isSuccess, title, statusMessage).\r\n * @param urlHome - Ruta a la que se navega si la operación es exitosa y el id es mayor a 0.\r\n * @param form - Formulario reactivo a resetear si la operación es exitosa.\r\n * @param getForm - Función para recargar el formulario (por ejemplo, para obtener datos actualizados).\r\n * @param id - Identificador usado para decidir si se navega a urlHome tras éxito.\r\n *\r\n * @example\r\n * // Uso típico en un componente\r\n * this.utilityAddService.handleResponse(\r\n * response,\r\n * '/home',\r\n * this.form,\r\n * () => this.getForm(),\r\n * this.id\r\n * );\r\n *\r\n * @description\r\n * - Si response.isSuccess es true:\r\n * - Muestra alerta tipo toastr.\r\n * - Si id > 0, navega a urlHome.\r\n * - Resetea el formulario y ejecuta getForm().\r\n * - Si response.isSuccess es false:\r\n * - Muestra alerta visual personalizada con icono de error.\r\n */\r\n public handleResponse(\r\n response: ResponseHttpModel,\r\n urlHome: string,\r\n form: FormGroup,\r\n getForm: () => void,\r\n id: number\r\n ): void {\r\n try {\r\n this.logIfNotProduction('handleResponse - response:', response);\r\n if (response.isSuccess) {\r\n this._serviceAlerta.toastrAlerts(\r\n 1,\r\n response.title,\r\n response.statusMessage,\r\n 2\r\n );\r\n if (id > 0) {\r\n this._router.navigate([urlHome]);\r\n }\r\n getForm();\r\n form?.reset();\r\n } else {\r\n this._serviceAlerta.alertaHtmlSuccess(\r\n response.title,\r\n response.statusMessage,\r\n {\r\n icono: 'icon2/hard_drive_error.png',\r\n showConfirmButton: true,\r\n }\r\n );\r\n }\r\n } catch (error) {\r\n this.logIfNotProduction('Error en handleResponse:', error);\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Error',\r\n error instanceof Error ? error.message : String(error),\r\n 2\r\n );\r\n }\r\n }\r\n}\r\n","import { AbstractControl, FormGroup, ValidationErrors } from '@angular/forms';\r\n\r\n/**\r\n * Valida que el control contenga un rango de fechas válido (dos fechas no nulas y válidas).\r\n */\r\nexport function dateRangeValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const dates: Date[] = control.value;\r\n\r\n // Verificar si el valor es un array con exactamente dos elementos\r\n if (Array.isArray(dates) && dates.length === 2) {\r\n const [startDate, endDate] = dates;\r\n\r\n // Verificar que las fechas sean válidas y no nulas\r\n if (\r\n startDate &&\r\n endDate &&\r\n !isNaN(new Date(startDate).getTime()) &&\r\n !isNaN(new Date(endDate).getTime())\r\n ) {\r\n return null; // Válido\r\n } else {\r\n return {\r\n invalidDateRange: {\r\n message: 'Ambas fechas deben ser válidas y no nulas.',\r\n requiredLength: 2,\r\n },\r\n }; // Error si alguna fecha es nula o inválida\r\n }\r\n }\r\n\r\n return null; // Si el control no contiene un array válido, no hay error\r\n}\r\n\r\n/**\r\n * Valida que una fecha única esté dentro de un rango mínimo y máximo.\r\n * @param minDate Fecha mínima permitida.\r\n * @param maxDate Fecha máxima permitida.\r\n */\r\nexport function dateMinMaxValidator(minDate: Date, maxDate: Date) {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const date: Date = control.value;\r\n\r\n // Verificar si el valor es una fecha válida\r\n if (date && !isNaN(new Date(date).getTime())) {\r\n const currentDate = new Date(date);\r\n\r\n // Validar si la fecha está fuera del rango permitido\r\n if (currentDate < minDate || currentDate > maxDate) {\r\n return {\r\n dateNotRange: {\r\n message: `La fecha debe estar entre ${minDate.toLocaleDateString()} y ${maxDate.toLocaleDateString()}`,\r\n minDate: minDate.toISOString(),\r\n maxDate: maxDate.toISOString(),\r\n },\r\n };\r\n }\r\n\r\n return null; // Fecha válida y dentro del rango\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\n/**\r\n * Valida que al menos uno de los campos especificados esté lleno.\r\n * @param fields Los nombres de los campos a validar.\r\n */\r\nexport function atLeastOneFieldRequiredValidator(fields: string[]) {\r\n return (formGroup: AbstractControl): ValidationErrors | null => {\r\n // Obtener el FormGroup para poder acceder a los controles\r\n const form = formGroup as FormGroup;\r\n\r\n // Verificar si al menos uno de los campos tiene un valor\r\n const isAnyFieldFilled = fields.some((field) => {\r\n const control = form.get(field);\r\n return control?.value !== null && control?.value !== '';\r\n });\r\n\r\n // Si al menos un campo tiene un valor, la validación es exitosa\r\n if (isAnyFieldFilled) {\r\n return null; // Validación pasada\r\n } else {\r\n // Construir el mensaje dinámico con los campos no llenados\r\n const emptyFields = fields.filter((field) => {\r\n const control = form.get(field);\r\n return control?.value === null || control?.value === '';\r\n });\r\n\r\n const fieldNames = emptyFields.join(', ');\r\n const message = `Debe completar al menos uno de los siguientes campos: ${fieldNames}.`;\r\n\r\n // Si ninguno tiene valor, devolver el mensaje con el error\r\n return {\r\n atLeastOneRequired: {\r\n message: message,\r\n },\r\n };\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un NIT (Número de Identificación Tributaria) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del NIT.\r\n * @returns Un objeto de error si el NIT no es válido, o `null` si el NIT es válido.\r\n */\r\nexport function nitValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const nit = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!nit) {\r\n return null;\r\n }\r\n\r\n // Validar el NIT utilizando la función NITCorrecto\r\n const esValido = NITCorrecto(nit);\r\n\r\n // Si el NIT no es válido, retornar un objeto de error con el formato deseado\r\n if (!esValido) {\r\n return {\r\n invalidNIT: {\r\n message: 'El NIT ingresado no es válido.', // Mensaje de error personalizado\r\n requiredLength: nit.length, // Longitud del NIT ingresado (opcional)\r\n },\r\n };\r\n }\r\n\r\n // Si el NIT es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función auxiliar para validar un NIT según un algoritmo específico.\r\n *\r\n * @param nit - El NIT a validar.\r\n * @returns `true` si el NIT es válido, `false` en caso contrario.\r\n */\r\nfunction NITCorrecto(nit: string): boolean {\r\n try {\r\n const largo = nit.length;\r\n // Invertir el NIT (excepto el último dígito) para facilitar el cálculo\r\n const validar = nit\r\n .substring(0, largo - 1)\r\n .split('')\r\n .reverse()\r\n .join('');\r\n const cadena = validar.split('');\r\n const comparador = nit.substring(largo - 1, largo); // Último dígito del NIT\r\n let posicion = 2; // Factor de ponderación inicial\r\n let sumaValidar = 0; // Acumulador para la suma ponderada\r\n\r\n // Calcular la suma ponderada de los dígitos del NIT\r\n for (const c of cadena) {\r\n sumaValidar += parseInt(c, 10) * posicion;\r\n posicion += 1;\r\n }\r\n\r\n // Calcular el residuo de la operación de validación\r\n const residuo = operacionValidar(11 - operacionValidar(sumaValidar));\r\n\r\n // Validar el NIT según el residuo y el último dígito\r\n if (residuo === 10 && comparador.toUpperCase() === 'K') {\r\n return true; // El NIT es válido si el residuo es 10 y el último dígito es 'K'\r\n } else if (residuo.toString() === comparador) {\r\n return true; // El NIT es válido si el residuo coincide con el último dígito\r\n } else {\r\n return false; // El NIT no es válido\r\n }\r\n } catch (error) {\r\n // Si ocurre un error durante la validación, el NIT no es válido\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Función auxiliar para calcular el residuo de una operación aritmética.\r\n *\r\n * @param valor - El valor sobre el cual se calculará el residuo.\r\n * @returns El residuo de la división del valor entre 11.\r\n */\r\nfunction operacionValidar(valor: number): number {\r\n return valor % 11;\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un CUI (Código Único de Identificación) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del CUI.\r\n * @returns Un objeto de error si el CUI no es válido, o `null` si el CUI es válido.\r\n */\r\nexport function cuiValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const cui = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!cui) {\r\n return null;\r\n }\r\n\r\n // Validar el CUI\r\n const esValido = CUICorrecto(cui);\r\n\r\n // Si el CUI no es válido, retornar un objeto de error\r\n if (!esValido) {\r\n return {\r\n invalidCUI: {\r\n message: 'El CUI ingresado no es válido.',\r\n requiredLength: 13,\r\n actualLength: cui.length,\r\n },\r\n };\r\n }\r\n\r\n // Si el CUI es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función que implementa el algoritmo de validación del CUI\r\n * @param cui Número de CUI a validar (debe tener 13 dígitos)\r\n * @returns boolean indicando si el CUI es válido\r\n */\r\nfunction CUICorrecto(cui: string | number): boolean {\r\n // Convertir a string si es número\r\n const cuiStr = typeof cui === 'number' ? cui.toString() : cui;\r\n\r\n // Validar longitud y que sean solo dígitos\r\n if (cuiStr.length !== 13 || !/^\\d+$/.test(cuiStr)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const primeros8 = cuiStr.substring(0, 8);\r\n const digitoVerificador = parseInt(cuiStr.substring(8, 9), 10);\r\n let suma = 0;\r\n\r\n // Calcular la suma ponderada\r\n for (let i = 0; i < primeros8.length; i++) {\r\n const digito = parseInt(primeros8[i], 10);\r\n suma += digito * (i + 2); // Los pesos son 2, 3, 4, ..., 9\r\n }\r\n\r\n // Calcular residuo y validar\r\n const residuo = suma % 11;\r\n return residuo === digitoVerificador;\r\n } catch (error) {\r\n console.error('Error validando CUI:', error);\r\n return false;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/components';\r\nexport * from './lib/components/icon-dsx/icon-dsx.component';\r\nexport * from './lib/components/json-values-debuj/json-values-debuj.component';\r\nexport * from './lib/components/loading-lottie/loading-lottie.component';\r\nexport * from './lib/components/loading/loading.component';\r\nexport * from './lib/components/navbar-dsx/navbar-dsx.component';\r\nexport * from './lib/directives/only-rango-pattern.directive';\r\nexport * from './lib/directives/select-all-on-focus.directive';\r\nexport * from './lib/injections/cache.token';\r\nexport * from './lib/injections/environment.token';\r\nexport * from './lib/injections/parameterSecurity';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/models';\r\nexport * from './lib/models/src/parameterSecurity.model';\r\nexport * from './lib/modules/src/dsx-add-tools.module';\r\nexport * from './lib/modules/src/prime-ng.module';\r\nexport * from './lib/pipe';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/services/cache.provider';\r\nexport * from './lib/services/cache.service';\r\nexport * from './lib/services/endpoint.service';\r\nexport * from './lib/services/error-handler.service';\r\nexport * from './lib/services/parameter-values.service';\r\nexport * from './lib/services/security.service';\r\nexport * from './lib/services/utility-add.service';\r\nexport * from './lib/validations/addons.validators';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.IconDsxService","i2"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-dsxlibrary.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/services/icon-dsx.service.ts","../../../projects/ngx-dsx/src/lib/components/icon-dsx/icon-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/icon-dsx/icon-dsx.component.html","../../../projects/ngx-dsx/src/lib/pipe/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/lib/injections/environment.token.ts","../../../projects/ngx-dsx/src/lib/components/json-values-debuj/json-values-debuj.component.ts","../../../projects/ngx-dsx/src/lib/components/json-values-debuj/json-values-debuj.component.html","../../../projects/ngx-dsx/src/lib/services/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/loading-lottie/loading-lottie.component.ts","../../../projects/ngx-dsx/src/lib/components/loading-lottie/loading-lottie.component.html","../../../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/alerta.service.ts","../../../projects/ngx-dsx/src/lib/injections/parameterSecurity.ts","../../../projects/ngx-dsx/src/lib/services/security.service.ts","../../../projects/ngx-dsx/src/lib/services/parameter-values.service.ts","../../../projects/ngx-dsx/src/lib/components/navbar-dsx/navbar-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/navbar-dsx/navbar-dsx.component.html","../../../projects/ngx-dsx/src/lib/directives/only-rango-pattern.directive.ts","../../../projects/ngx-dsx/src/lib/directives/select-all-on-focus.directive.ts","../../../projects/ngx-dsx/src/lib/injections/cache.token.ts","../../../projects/ngx-dsx/src/lib/services/authorize.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/models/src/cache.types.ts","../../../projects/ngx-dsx/src/lib/modules/src/dsx-add-tools.module.ts","../../../projects/ngx-dsx/src/lib/modules/src/prime-ng.module.ts","../../../projects/ngx-dsx/src/lib/pipe/truncate.pipe.ts","../../../projects/ngx-dsx/src/lib/services/cache.service.ts","../../../projects/ngx-dsx/src/lib/services/cache.provider.ts","../../../projects/ngx-dsx/src/lib/services/endpoint.service.ts","../../../projects/ngx-dsx/src/lib/services/utility-add.service.ts","../../../projects/ngx-dsx/src/lib/validations/addons.validators.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsxlibrary.ts"],"sourcesContent":["import { DecimalPipe } from '@angular/common';\r\nimport { 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, DecimalPipe],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.css',\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?.['invalidNIT']){\r\n <strong>{{ control?.errors?.['invalidNIT']?.message }}</strong\r\n >. }@else if(control?.errors?.['invalidCUI']){\r\n <strong>{{ control?.errors?.['invalidCUI']?.message }}</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 | number:'1.2-2' }}</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 { CountUpDirective } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpDirective],\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' | 'percent'>();\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<\r\n | 'light'\r\n | 'dark'\r\n | 'aqua'\r\n | 'sunset'\r\n | 'mint'\r\n | 'peach'\r\n | 'plasma'\r\n | 'nebula'\r\n >('light');\r\n\r\n options: Record<'currency' | 'integer' | 'percent', 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 percent: {\r\n startVal: 0,\r\n duration: 0.5,\r\n suffix: '%',\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()} ${theme()}-theme`\">\r\n <div class=\"kpi-container\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [countUpOptions]=\"getSelectedOption()\"\r\n [class]=\"`card-value-${theme()}`\"\r\n >0</span\r\n >\r\n <span [class]=\"`card-text-${theme()}`\">{{ label() }}</span>\r\n </div>\r\n <i [class]=\"`${iconType()} icon icon-${theme()}`\"></i>\r\n</div>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { map, Observable, shareReplay } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class IconDsxService {\r\n private cache = new Map<string, Observable<SafeHtml>>();\r\n\r\n constructor(private http: HttpClient, private sanitizer: DomSanitizer) {}\r\n\r\n /** Carga SVG desde assets/dsxResource/material-design-icons/outlined */\r\n getIcon(name: string): Observable<SafeHtml> {\r\n if (this.cache.has(name)) {\r\n return this.cache.get(name)!;\r\n }\r\n\r\n const iconPath = `mdio/${name}.svg`;\r\n\r\n const request$ = this.http.get(iconPath, { responseType: 'text' }).pipe(\r\n map((svg) => this.sanitizer.bypassSecurityTrustHtml(svg)),\r\n shareReplay(1)\r\n );\r\n\r\n this.cache.set(name, request$);\r\n return request$;\r\n }\r\n}\r\n","import { AsyncPipe } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { SafeHtml } from '@angular/platform-browser';\r\nimport { Observable } from 'rxjs';\r\nimport { IconDsxService } from '../../services/icon-dsx.service';\r\n\r\n@Component({\r\n selector: 'icon-dsx',\r\n imports: [AsyncPipe],\r\n templateUrl: './icon-dsx.component.html',\r\n styleUrl: './icon-dsx.component.css',\r\n})\r\nexport class IconDsxComponent {\r\n @Input() name!: string;\r\n\r\n svg$!: Observable<SafeHtml>; // 👈 AHORA es un Observable\r\n\r\n constructor(private iconService: IconDsxService) {}\r\n\r\n ngOnInit(): void {\r\n this.svg$ = this.iconService.getIcon(this.name); // 👈 AHORA CUADRA CON EL async\r\n }\r\n}\r\n","<span class=\"dsx-icon\" [innerHTML]=\"svg$ | async\"></span>\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 para diferenciar claves, valores, booleanos, números, etc.\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?)/g, (match) => {\r\n // Si es una clave (tiene dos puntos al final)\r\n if (/:$/.test(match)) {\r\n return `<span class=\"json-key\">${match}</span>`;\r\n }\r\n // Si es un string (no tiene dos puntos)\r\n return `<span class=\"json-string\">${match}</span>`;\r\n })\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"json-number\">$1</span>')\r\n .replace(/[{}\\[\\]]/g, '<span class=\"json-bracket\">$&</span>')\r\n .replace(/,/g, '<span class=\"json-comma\">$&</span>')\r\n .replace(/:/g, '<span class=\"json-colon\">$&</span>');\r\n }\r\n}\r\n","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 { Component, inject, Input, signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { JsonHighlightPipe } from '../../pipe/json-highlight.pipe';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\n\r\n@Component({\r\n selector: 'app-json-values-debuj',\r\n imports: [JsonHighlightPipe],\r\n templateUrl: './json-values-debuj.component.html',\r\n styleUrl: './json-values-debuj.component.css',\r\n})\r\nexport class JsonValuesDebujComponent {\r\n @Input() form!: FormGroup;\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n // Señal reactiva para indicar si estamos en modo de desarrollo\r\n private readonly isDevSignal = signal<boolean>(!this.environment.production);\r\n\r\n // Método para verificar el estado de desarrollo\r\n isDev(): boolean {\r\n return this.isDevSignal();\r\n }\r\n}\r\n","@if(isDev()){\r\n<div class=\"custom-container\">\r\n <pre\r\n class=\"custom-pre\"\r\n [innerHTML]=\"form.getRawValue() | jsonHighlight\"\r\n ></pre>\r\n</div>\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, effect, inject, input } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\nimport { AnimationOptions, LottieComponent } from 'ngx-lottie';\r\n\r\n@Component({\r\n selector: 'app-loading-lottie',\r\n imports: [LottieComponent],\r\n templateUrl: './loading-lottie.component.html',\r\n styleUrl: './loading-lottie.component.css',\r\n})\r\nexport class LoadingLottieComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n jsonUrl = input<string>('Loader_Liquid4');\r\n size = input<string>('250px');\r\n options: AnimationOptions = { path: '' };\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n effect(() => {\r\n this.options = {\r\n path: `jsonlottie/${this.jsonUrl() + '.json'}`,\r\n };\r\n });\r\n }\r\n}\r\n","@if(_spinnerService.spinnerVisible()){\r\n<div class=\"loader-container\">\r\n <ng-lottie [options]=\"options\" [width]=\"size()\" [height]=\"size()\"></ng-lottie>\r\n <p class=\"loading-text\">&copy;DevsoftXela {{ currentYear }}</p>\r\n</div>\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.css',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n }\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=\"/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">&copy;DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal, {\r\n SweetAlertIcon,\r\n SweetAlertOptions,\r\n SweetAlertResult,\r\n SweetAlertTheme,\r\n} from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n/**\r\n * Opciones configurables para personalizar el comportamiento y apariencia de las alertas visuales.\r\n *\r\n * Permite definir iconos, imágenes, botones, temporizadores y temas para las alertas SweetAlert2.\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'. Ejemplo: 'success-icon.png'. Por defecto: 'icon/check02.png'.\r\n * @property icon - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional.\r\n * @property showConfirmButton - Si es true, muestra el botón de confirmación y desactiva el cierre automático. Por defecto: false.\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación. Por defecto: 'Ok'.\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta. Ignorado si showConfirmButton es true. Por defecto: 2000.\r\n * @property imageWidth - Ancho en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property imageHeight - Alto en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property showImage - Si es true, muestra la imagen personalizada; si es false, solo el icono SweetAlert2. Por defecto: true.\r\n * @property theme - Tema visual de SweetAlert2 (por ejemplo, 'dark', 'minimal', etc). Opcional.\r\n *\r\n * @example\r\n * // Alerta con icono personalizado y cierre automático\r\n * const options: AlertOptions = {\r\n * icono: 'custom-icon.png',\r\n * icon: 'warning',\r\n * timer: 3000\r\n * };\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón y sin imagen\r\n * const confirmOptions: AlertOptions = {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Aceptar',\r\n * showImage: false\r\n * };\r\n */\r\ninterface AlertOptions {\r\n icono?: string;\r\n icon?: SweetAlertIcon;\r\n showConfirmButton?: boolean;\r\n confirmButtonText?: string;\r\n timer?: number;\r\n imageWidth?: number;\r\n imageHeight?: number;\r\n showImage?: boolean;\r\n theme?: SweetAlertTheme;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n private toastrService = inject(ToastrService);\r\n\r\n /**\r\n * Tema visual por defecto para todas las alertas SweetAlert2.\r\n * Puedes cambiarlo desde tu app llamando a setDefaultTheme().\r\n */\r\n private defaultTheme: SweetAlertTheme | undefined = undefined;\r\n\r\n /**\r\n * Permite establecer el theme global para todas las alertas SweetAlert2.\r\n * @param theme - Valor de theme válido para SweetAlert2 (por ejemplo: 'dark', 'minimal', etc).\r\n */\r\n setDefaultTheme(theme: SweetAlertTheme) {\r\n this.defaultTheme = theme;\r\n }\r\n\r\n /**\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\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 4. bottom-center 5. bottom-right\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\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 private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `/${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 //theme: 'borderless',\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `/${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 alertaHtml(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'icon/notFound01.png',\r\n timer: number = 3500\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `/${icono}`,\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i>${message}</i> <span> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n * Muestra una alerta visual personalizada usando SweetAlert2.\r\n *\r\n * Permite configurar el mensaje, el título, el icono, la imagen, el botón de confirmación,\r\n * el temporizador y el tema visual, entre otras opciones.\r\n *\r\n * @param titleAlert - Título principal de la alerta (obligatorio).\r\n * @param messageHtml - Mensaje en formato HTML (obligatorio).\r\n * @param options - Opciones configurables de la alerta (opcional). Permite personalizar icono, imagen, botón, temporizador, etc.\r\n * @returns Promise<SweetAlertResult> que se resuelve cuando el usuario interactúa con la alerta o cuando se cierra automáticamente.\r\n *\r\n * @example\r\n * // Alerta básica con icono de éxito y cierre automático\r\n * alertaHtmlSuccess('Operación exitosa', 'Los datos se guardaron correctamente');\r\n *\r\n * @example\r\n * // Alerta de error con imagen personalizada y temporizador\r\n * alertaHtmlSuccess('Error crítico', 'No se pudo conectar al servidor', {\r\n * icono: 'error-icon.png',\r\n * icon: 'error',\r\n * timer: 5000\r\n * });\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón personalizado y sin imagen\r\n * alertaHtmlSuccess('Confirmar acción', '¿Está seguro de eliminar este registro?', {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Sí, eliminar',\r\n * icon: 'warning',\r\n * showImage: false\r\n * }).then((result) => {\r\n * if (result.isConfirmed) {\r\n * // Lógica cuando el usuario confirma\r\n * }\r\n * });\r\n */\r\n alertaHtmlSuccess(\r\n titleAlert: string,\r\n messageHtml: string,\r\n options: AlertOptions = {}\r\n ): Promise<SweetAlertResult> {\r\n const {\r\n icono = 'icon/check02.png',\r\n icon,\r\n showConfirmButton = false,\r\n confirmButtonText = 'Ok',\r\n timer = 2000,\r\n imageWidth = 125,\r\n imageHeight = 125,\r\n showImage = true,\r\n theme, // Puede venir por options o usar el global\r\n } = options;\r\n\r\n // Usa el theme global si no se especifica uno en options\r\n const alertTheme = theme !== undefined ? theme : this.defaultTheme;\r\n\r\n // Configuración base de SweetAlert\r\n const alertConfig: SweetAlertOptions = {\r\n title: titleAlert,\r\n html: messageHtml,\r\n draggable: true,\r\n showConfirmButton,\r\n confirmButtonText,\r\n timer: showConfirmButton ? undefined : timer, // Timer solo si no hay botón\r\n timerProgressBar: !showConfirmButton && timer > 0,\r\n imageUrl: showImage && icono ? `/${icono}` : undefined,\r\n imageWidth: showImage ? imageWidth : undefined,\r\n imageHeight: showImage ? imageHeight : undefined,\r\n imageAlt: showImage ? 'image alert' : undefined,\r\n // Aplica el theme global o el específico\r\n ...(alertTheme !== undefined && { theme: alertTheme }),\r\n };\r\n // Solo agrega el icono si está definido\r\n if (icon !== undefined) {\r\n alertConfig.icon = icon;\r\n }\r\n\r\n // Precargar imagen solo si es necesario\r\n if (showImage && icono) {\r\n return this.preloadImage(icono).then(() => Swal.fire(alertConfig));\r\n }\r\n\r\n return Swal.fire(alertConfig);\r\n }\r\n\r\n // private configureTimer(\r\n // config: SweetAlertOptions,\r\n // showConfirmButton: boolean,\r\n // timer: number\r\n // ) {\r\n // if (!showConfirmButton && timer > 0) {\r\n // config.timer = timer;\r\n // config.timerProgressBar = true;\r\n // }\r\n // }\r\n\r\n // No se puede utilizar por conflicto con primeng\r\n // notyfAlert(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 /**\r\n * Muestra un mensaje tipo toast usando PrimeNG MessageService.\r\n *\r\n * @param severity - Tipo de severidad del mensaje. Valores posibles:\r\n * 'success' | 'info' | 'warn' | 'error' | 'contrast' | 'secondary'.\r\n * Por defecto: 'success'.\r\n * @param title - Título del mensaje (aparece como summary).\r\n * @param message - Detalle del mensaje (aparece como detail).\r\n * @param time - Duración en milisegundos que el mensaje estará visible. Por defecto: 1500 ms.\r\n *\r\n * @example\r\n * // Mensaje de éxito\r\n * alertaService.showPrimeMessage('success', 'Operación exitosa', 'El registro fue guardado correctamente');\r\n *\r\n * @example\r\n * // Mensaje de advertencia personalizado\r\n * alertaService.showPrimeMessage('warn', 'Advertencia', 'Faltan campos obligatorios', 3000);\r\n */\r\n // showPrimeMessage(\r\n // title: string,\r\n // message: string,\r\n // severity:\r\n // | 'success'\r\n // | 'info'\r\n // | 'warn'\r\n // | 'error'\r\n // | 'contrast'\r\n // | 'secondary' = 'success',\r\n // time: number = 1500\r\n // ) {\r\n // this.primeMessageService.add({\r\n // severity: severity,\r\n // summary: title,\r\n // detail: message,\r\n // life: time,\r\n // });\r\n // }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { MyParameterValues } from '../models/src/parameterSecurity.model';\r\n\r\nexport const INITIAL_PARAMETERS = new InjectionToken<MyParameterValues[]>(\r\n 'InitialParameters'\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 {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { SeguridadITParameter } from '../models/src/parameterSecurity.model';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n // Inyecta el servicio HttpClient para realizar peticiones HTTP\r\n private http = inject(HttpClient);\r\n\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n // Construye la URL base de la API utilizando la URL de la aplicación desde la configuración del entorno\r\n private urlApi: string = `${this.environment.myAppUrl}api/auth`;\r\n\r\n /**\r\n * Método para obtener un nuevo token de acceso utilizando un refresh token.\r\n * @param refreshToken El refresh token que se utilizará para obtener un nuevo token de acceso.\r\n * @returns Un Observable que emite un objeto de tipo ModelToken.\r\n */\r\n tokenRefresh(refreshToken: string): Observable<ModelToken> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n\r\n // Realiza una solicitud POST al endpoint de refresco de token\r\n return this.http.post<ModelToken>(`${this.urlApi}/token-refresh/`, body, {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n });\r\n }\r\n\r\n /**\r\n * Método para obtener los parámetros de seguridad.\r\n * @param invalidCacheParam Indica si se debe invalidar la caché (opcional, por defecto es false).\r\n * @returns Un Observable que emite un objeto de tipo SeguridadITParameter.\r\n */\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false\r\n ): Observable<SeguridadITParameter> {\r\n // Crea los parámetros de la solicitud, incluyendo el parámetro invalidCacheParam,\r\n // parametro diseñado para invalidar la caché a traves del filtro\r\n const params = new HttpParams().set(\r\n 'invalidCacheParam',\r\n invalidCacheParam.toString()\r\n );\r\n\r\n // Realiza una solicitud GET al endpoint de parámetros de seguridad\r\n return this.http.get<SeguridadITParameter>(\r\n `${this.urlApi}/security-parameter/`,\r\n { params }\r\n );\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n catchError,\r\n delay,\r\n map,\r\n Observable,\r\n of,\r\n retry,\r\n throwError,\r\n} from 'rxjs';\r\nimport { INITIAL_PARAMETERS } from '../injections/parameterSecurity';\r\nimport {\r\n MyParameterValues,\r\n ParameterSecurity,\r\n} from '../models/src/parameterSecurity.model';\r\nimport { SecurityService } from './security.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio para gestionar los parámetros de seguridad de la aplicación.\r\n * Permite cargar los parámetros desde la API, mantenerlos en memoria, acceder y comparar valores de forma segura.\r\n * Utiliza tipado genérico para los nombres de parámetros y cache interno para optimizar consultas repetidas.\r\n *\r\n * @template T Tipo de los nombres de parámetros permitidos (usualmente un union type de string)\r\n */\r\nexport class ParameterValuesService<T extends string = string> {\r\n /**\r\n * Parámetros iniciales inyectados mediante INITIAL_PARAMETERS.\r\n * Se usan para validar y mapear los parámetros recibidos de la API.\r\n */\r\n private initialParameters = inject(INITIAL_PARAMETERS);\r\n\r\n /**\r\n * Cache interno para optimizar la comparación de valores de parámetros.\r\n * La clave es una combinación de nombre e índice, el valor es el resultado de la consulta.\r\n */\r\n private parameterCache = new Map<string, any>();\r\n\r\n private alertedParams = new Set<string>();\r\n private alertedParamsIsParameterValue = new Set<string>();\r\n\r\n /**\r\n * Servicio que contiene el método getParameterSecurity() para obtener los parámetros desde la API.\r\n */\r\n private apiService = inject(SecurityService);\r\n\r\n /**\r\n * Señal reactiva que contiene los parámetros cargados y permite actualizaciones automáticas.\r\n */\r\n private _dataParameter = signal<MyParameterValues<T>[]>(\r\n this.initializeData()\r\n );\r\n\r\n /**\r\n * Flag que indica si ya se cargaron los parámetros desde la API.\r\n */\r\n private _loaded = signal(false);\r\n get loaded() {\r\n return this._loaded();\r\n }\r\n\r\n /**\r\n * Inicializa los datos de parámetros usando los valores inyectados.\r\n * @returns Array de parámetros iniciales tipados\r\n */\r\n private initializeData(): MyParameterValues<T>[] {\r\n return this.initialParameters.map((param) =>\r\n this.createMyParameterValue(param.parameterName as T, param.values)\r\n );\r\n }\r\n\r\n /**\r\n * Crea una instancia de MyParameterValues tipada y segura.\r\n * @param parameterName Nombre del parámetro\r\n * @param values Valores asociados al parámetro\r\n * @returns Objeto MyParameterValues\r\n */\r\n private createMyParameterValue(\r\n parameterName: T,\r\n values: any[]\r\n ): MyParameterValues<T> {\r\n return {\r\n parameterName,\r\n values: [...values],\r\n };\r\n }\r\n\r\n /**\r\n * Devuelve los parámetros actuales como un array de solo lectura.\r\n */\r\n get dataParameter(): Readonly<MyParameterValues<T>[]> {\r\n return this._dataParameter();\r\n }\r\n\r\n /**\r\n * Setter privado para actualizar los parámetros.\r\n * Solo puede ser usado dentro del servicio para mantener la integridad de los datos.\r\n * @param values Array de parámetros a almacenar\r\n */\r\n private setDataParameter(values: MyParameterValues<T>[]): void {\r\n if (!Array.isArray(values)) {\r\n console.error('Error: valores inválidos para dataParameter');\r\n return;\r\n }\r\n this._dataParameter.set(values);\r\n }\r\n\r\n /**\r\n * Carga los parámetros desde la API.\r\n * Si ya se cargaron y force=false, devuelve la copia en memoria.\r\n * @param force Indica si se debe forzar la recarga desde la API (default: false)\r\n * @returns Observable que emite los parámetros cargados como MyParameterValues[]\r\n */\r\n loadParameters(force = false): Observable<MyParameterValues<T>[]> {\r\n if (this._loaded() && !force) {\r\n return of([...this.dataParameter]); // copia mutable\r\n }\r\n\r\n return this.apiService.getParameterSecurity(force).pipe(\r\n map((response) => {\r\n const apiParameters = response.parameterSecurity ?? [];\r\n this.validateParameters(apiParameters);\r\n const values = this.mapToMyParameterValues(apiParameters);\r\n this.setDataParameter(values);\r\n this._loaded.set(true);\r\n return values;\r\n }),\r\n // 👇 fallback si falla la llamada pero ya teníamos data\r\n catchError((error) => {\r\n if (this._loaded() && this.dataParameter.length > 0) {\r\n return of([...this.dataParameter]);\r\n }\r\n this._loaded.set(false);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fuerza la recarga de los parámetros desde la API.\r\n * @returns Observable que emite los parámetros actualizados\r\n */\r\n refreshParameters(): Observable<MyParameterValues<T>[]> {\r\n return this.loadParameters(true);\r\n }\r\n\r\n /**\r\n * Crea una copia segura y mutable de los parámetros actuales.\r\n * @returns Array de parámetros\r\n */\r\n private createSafeCopy(): MyParameterValues<T>[] {\r\n return this.dataParameter.map((item) =>\r\n this.createMyParameterValue(item.parameterName, [...item.values])\r\n );\r\n }\r\n\r\n /**\r\n * Mapea los parámetros recibidos de la API a objetos tipados y seguros.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n * @returns Array de MyParameterValues\r\n */\r\n private mapToMyParameterValues(\r\n apiParameters: ParameterSecurity[]\r\n ): MyParameterValues<T>[] {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n\r\n return apiParameters\r\n .filter((param) => initialNames.includes(param.parameterName))\r\n .map((param) => {\r\n // Función de conversión type-safe\r\n return this.convertToTypedParameter(param);\r\n })\r\n .filter((param): param is MyParameterValues<T> => param !== null);\r\n }\r\n\r\n /**\r\n * Convierte un parámetro de la API a un objeto tipado, validando el nombre.\r\n * @param param Parámetro recibido de la API\r\n * @returns Objeto MyParameterValues o null si no es válido\r\n */\r\n private convertToTypedParameter(\r\n param: ParameterSecurity\r\n ): MyParameterValues<T> | null {\r\n const initialParam = this.initialParameters.find(\r\n (p) => p.parameterName === param.parameterName\r\n );\r\n\r\n if (!initialParam) {\r\n return null;\r\n }\r\n\r\n // Conversión segura con verificación\r\n if (this.isValidParameterName(param.parameterName)) {\r\n return this.createMyParameterValue(\r\n param.parameterName as T,\r\n param.parameterValues?.map((v) => v.value) ?? []\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Verifica si un nombre de parámetro es válido según los parámetros iniciales.\r\n * @param name Nombre a validar\r\n * @returns true si es válido\r\n */\r\n private isValidParameterName(name: string): name is T {\r\n // Verifica que el nombre esté en los parámetros iniciales\r\n return this.initialParameters.some((param) => param.parameterName === name);\r\n }\r\n\r\n /**\r\n * Valida que los parámetros devueltos por la API coincidan con los iniciales.\r\n * Muestra errores o advertencias en consola si existen diferencias.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n */\r\n private validateParameters(apiParameters: ParameterSecurity[]): void {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n const apiNames = apiParameters.map((p) => p.parameterName);\r\n\r\n const missing = initialNames.filter((name) => !apiNames.includes(name));\r\n const extra = apiNames.filter((name) => !initialNames.includes(name));\r\n\r\n if (missing.length) {\r\n console.warn(`Faltan en API: ${missing.join(', ')}`);\r\n const ok = confirm(`Faltan en API: ${missing.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (extra.length) {\r\n console.warn(`Extra en API: ${extra.join(', ')}`);\r\n const ok = confirm(`Extra en API: ${extra.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (initialNames.length !== apiNames.length) {\r\n console.warn(\r\n `Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor específico de un parámetro.\r\n * Devuelve `defaultValue` si no existe el parámetro o el índice es inválido.\r\n * Valida que el parámetro exista antes de acceder a su valor.\r\n * @param parameterName Nombre del parámetro\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @param defaultValue Valor por defecto si no existe (default: null)\r\n * @returns Valor del parámetro o defaultValue si no existe o el índice es inválido\r\n */\r\n getValue<U = any>(\r\n parameterName: T,\r\n index = 0,\r\n defaultValue: U | null = null\r\n ): U {\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParams.has(parameterName)) {\r\n alert(`Advertencia: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParams.add(parameterName);\r\n }\r\n return defaultValue as U;\r\n }\r\n\r\n if (index < 0 || index >= param.values.length) {\r\n alert(\r\n `Advertencia: Índice ${index} fuera de rango para el parámetro '${parameterName}'.`\r\n );\r\n return defaultValue as U;\r\n }\r\n\r\n return param.values[index] as U;\r\n }\r\n\r\n /**\r\n * Compara un valor específico con un valor esperado, usando cache para optimizar llamadas repetidas.\r\n * @param parameterName Nombre del parámetro\r\n * @param expectedValue Valor esperado\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @returns true si coincide, false en caso contrario\r\n */\r\n isParameterValue<U = any>(\r\n parameterName: T,\r\n expectedValue: U,\r\n index = 0\r\n ): boolean {\r\n const cacheKey = `${String(parameterName)}_${index}`;\r\n\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParamsIsParameterValue.has(parameterName)) {\r\n alert(`Error: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParamsIsParameterValue.add(parameterName);\r\n }\r\n return false;\r\n }\r\n\r\n if (!this.parameterCache.has(cacheKey)) {\r\n const value = this.getValue<U>(parameterName, index);\r\n this.parameterCache.set(cacheKey, value);\r\n }\r\n\r\n return this.parameterCache.get(cacheKey) === expectedValue;\r\n }\r\n\r\n /**\r\n * Limpia el cache interno de comparaciones de parámetros.\r\n */\r\n clearParameterCache(): void {\r\n this.parameterCache.clear();\r\n }\r\n\r\n /**\r\n * Verifica si un parámetro tiene al menos un valor.\r\n * @param parameterName Nombre del parámetro\r\n * @returns true si tiene al menos un valor, false si no tiene\r\n */\r\n hasAnyValue(parameterName: T): boolean {\r\n return this.getAllValues(parameterName).length > 0;\r\n }\r\n\r\n /**\r\n * Devuelve todos los valores de un parámetro.\r\n * @param parameterName Nombre del parámetro\r\n * @returns Array de valores\r\n */\r\n getAllValues<U = any>(parameterName: T): U[] {\r\n return (this.dataParameter.find((p) => p.parameterName === parameterName)\r\n ?.values ?? []) as U[];\r\n }\r\n}\r\n","import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { AlertaService } from '../../services/alerta.service';\r\nimport { ParameterValuesService } from '../../services/parameter-values.service';\r\n\r\n@Component({\r\n selector: 'app-navbar-dsx',\r\n imports: [MenubarModule, ImageModule, ButtonModule, FormsModule],\r\n templateUrl: './navbar-dsx.component.html',\r\n styleUrl: './navbar-dsx.component.css',\r\n})\r\nexport class NavbarDsxComponent implements OnInit {\r\n //private _securityService = inject(SecurityService);\r\n private _parameterSecurityService = inject(ParameterValuesService);\r\n private _alertaService = inject(AlertaService);\r\n logoWidth = input<string>('300');\r\n appVersion = input<string>('V1.0.0');\r\n urlLogo = input<string>('assets/image/logoApp.png');\r\n // Estado del interruptor (tema claro/oscuro)\r\n checked: boolean = false;\r\n\r\n ngOnInit(): void {\r\n // Inicializa el tema al cargar el componente\r\n this.initializeTheme();\r\n //throw new Error('Method not implemented.');\r\n }\r\n\r\n // Inicializa el tema y el estado del interruptor\r\n initializeTheme(): void {\r\n const savedTheme = localStorage.getItem('theme') || 'light'; // Obtén el tema guardado o usa 'light' por defecto\r\n this.checked = savedTheme === 'dark'; // Actualiza el estado del interruptor\r\n this.applyTheme(savedTheme); // Aplica el tema\r\n }\r\n\r\n // Cambia el tema y actualiza el estado del interruptor\r\n onThemeChange(isDarkMode: boolean): void {\r\n // Determina el tema basado en el estado del interruptor\r\n const theme = isDarkMode ? 'dark' : 'light';\r\n // Aplica el tema\r\n this.applyTheme(theme);\r\n }\r\n\r\n // Aplica el tema y guarda la preferencia en localStorage\r\n applyTheme(theme: string): void {\r\n const html = document.documentElement;\r\n\r\n // Elimina las clases previas y agrega la nueva clase\r\n html.classList.remove('my-app-dark', 'my-app-light');\r\n html.classList.add(theme === 'dark' ? 'my-app-dark' : 'my-app-light');\r\n\r\n // Guarda el tema en localStorage\r\n localStorage.setItem('theme', theme);\r\n }\r\n\r\n actualizarSeguridadIT() {\r\n this._parameterSecurityService.refreshParameters().subscribe({\r\n next: (values) => {\r\n this._alertaService.toastrAlerts(\r\n 2,\r\n 'SeguridadIT',\r\n 'Parametro actualizado!',\r\n 2\r\n );\r\n //console.log('Parámetros cargados:', values);\r\n },\r\n error: (err) => {\r\n console.error('Error al actualizar parámetros de SeguridadIT', err);\r\n this._alertaService.toastrAlerts(\r\n 3,\r\n 'SeguridadIT',\r\n 'Error al actualizar parámetros!',\r\n 2\r\n );\r\n },\r\n complete: () => this._parameterSecurityService.clearParameterCache(),\r\n });\r\n }\r\n}\r\n","<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n [src]=\"urlLogo()\"\r\n alt=\"Image\"\r\n [width]=\"logoWidth()\"\r\n />\r\n <span class=\"version-text\">{{ appVersion() }}</span>\r\n </ng-template>\r\n <ng-template #end>\r\n <div>\r\n <p-button\r\n class=\"mr-2\"\r\n label=\"Permisos\"\r\n variant=\"text\"\r\n severity=\"info\"\r\n (click)=\"actualizarSeguridadIT()\"\r\n >\r\n <span class=\"material-symbols-outlined mr-1\">local_police</span>\r\n </p-button>\r\n <label class=\"ui-switch\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"checked\"\r\n (click)=\"onThemeChange(!checked ? true : false)\"\r\n />\r\n <div class=\"slider\">\r\n <div class=\"circle\"></div>\r\n </div>\r\n </label>\r\n <!-- <p-inputSwitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-inputSwitch> -->\r\n </div>\r\n </ng-template>\r\n</p-menubar>\r\n","import { Directive, ElementRef, HostListener } from '@angular/core';\r\n\r\n/**\r\n * Directiva que permite solo la entrada de:\r\n * - Dígitos (0-9)\r\n * - Separadores punto (.)\r\n * - Rango con guión (-)\r\n *\r\n * Ejemplos válidos:\r\n * - 1.2.3\r\n * - 4-6\r\n * - 1.3.5-9\r\n *\r\n * Restringe:\r\n * - Letras\r\n * - Espacios\r\n * - Caracteres especiales\r\n * - Doble punto (..), doble guión (--), o combinaciones como (.-)\r\n */\r\n@Directive({\r\n selector: '[appOnlyRangoPattern]',\r\n})\r\nexport class OnlyRangoPatternDirective {\r\n constructor(private el: ElementRef<HTMLInputElement>) {}\r\n\r\n /**\r\n * Expresión regular para permitir caracteres válidos individualmente (tecla por tecla).\r\n */\r\n private keyRegex: RegExp = /^[0-9.\\-]$/;\r\n\r\n /**\r\n * Escucha el evento de teclado y permite únicamente teclas válidas.\r\n * También evita combinaciones inválidas como `..`, `--`, `.1`, etc.\r\n */\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const input = this.el.nativeElement;\r\n const currentValue = input.value;\r\n const cursorPos = input.selectionStart ?? 0;\r\n const nextValue =\r\n currentValue.slice(0, cursorPos) +\r\n event.key +\r\n currentValue.slice(cursorPos);\r\n\r\n const allowedKeys = [\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Tab',\r\n 'Home',\r\n 'End',\r\n ];\r\n\r\n if (allowedKeys.includes(event.key)) return;\r\n\r\n if (!this.keyRegex.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir más de un punto o guión seguido, o combinaciones como \".-\", \"-.\", etc.\r\n if (/(\\.\\.|--|-\\.)|(\\.-)/.test(nextValue)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir iniciar con punto o guión\r\n if (cursorPos === 0 && (event.key === '.' || event.key === '-')) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Previene el pegado de cadenas que no cumplan con la estructura válida.\r\n * Solo permite: número o número separados por punto o guión correctamente.\r\n */\r\n @HostListener('paste', ['$event'])\r\n onPaste(event: ClipboardEvent): void {\r\n const pasted = event.clipboardData?.getData('text') ?? '';\r\n const sanitized = pasted.trim();\r\n\r\n // Patrón completo de cadena válida: ej. 1.2.3.4-6\r\n const pattern = /^(\\d+(-\\d+)?)(\\.\\d+(-\\d+)?)*$/;\r\n\r\n if (!pattern.test(sanitized)) {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appSelectAllOnFocus]',\r\n})\r\nexport class SelectAllOnFocusDirective {\r\n @HostListener('onFocus', ['$event'])\r\n @HostListener('focus', ['$event'])\r\n selectAll(event: Event): void {\r\n const htmlInput = event.target as HTMLInputElement;\r\n if (htmlInput) {\r\n htmlInput.select();\r\n }\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const CACHE_KEYS = new InjectionToken<Record<string, string>>(\r\n 'CACHE_KEYS'\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 {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { jwtSecurityModel, ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n _cookieService = inject(CookieService);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\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 /**\r\n * Obtiene el Refresh Token almacenado en cookies.\r\n *\r\n * - En modo desarrollo (isDevMode):\r\n * Si no existe un refresh token en cookies, genera uno temporal\r\n * para evitar errores durante pruebas locales.\r\n *\r\n * - En modo producción:\r\n * Simplemente devuelve el refresh token real almacenado por el backend.\r\n *\r\n * @returns string | null - El refresh token o null si no existe.\r\n */\r\n getTokenRefresh(): string | null {\r\n // 🔹 MODO DESARROLLO: asegura que siempre haya un token de prueba\r\n if (isDevMode()) {\r\n const tokenRefresh = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n\r\n // Si no existe un refresh token, generamos uno de desarrollo\r\n if (!tokenRefresh) {\r\n const devTokens: ModelToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c', // Token dummy para testing\r\n refreshTokenExpiry: new Date(),\r\n };\r\n\r\n // Carga y guarda las cookies necesarias\r\n this.tokenReload(devTokens);\r\n }\r\n }\r\n\r\n // 🔹 DEVUELVE el refresh token real o de desarrollo\r\n return this._cookieService.get(this.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 /**\r\n * Obtiene los valores principales del JWT almacenado (usuario, roles y estado).\r\n *\r\n * Este getter:\r\n * - Lee el access token desde cookies.\r\n * - Devuelve un objeto tipado (jwtSecurityModel).\r\n * - Decodifica el token para obtener `unique_name` y `role`.\r\n * - Determina si el token está expirado usando JwtHelperService.\r\n *\r\n * Si no existe token:\r\n * - Devuelve un objeto vacío con valores en null y `isTokenExpired = true`.\r\n *\r\n * Uso:\r\n * const info = this.authorize.getTokenValues;\r\n */\r\n get getTokenValues(): jwtSecurityModel {\r\n // Obtener el token almacenado\r\n const token = this.getToken();\r\n\r\n // Si no existe token → devolver estructura vacía\r\n if (!token) {\r\n return {\r\n userName: null,\r\n role: null,\r\n isTokenExpired: true,\r\n };\r\n }\r\n\r\n // Decodificar JWT\r\n const decoded = this.helperJwt.decodeToken(token) || {};\r\n\r\n return {\r\n userName: decoded.unique_name ?? null,\r\n\r\n // JWT puede traer role como string o como array → convertir a array\r\n role: decoded.role\r\n ? Array.isArray(decoded.role)\r\n ? decoded.role\r\n : [decoded.role]\r\n : null,\r\n\r\n // Validación de expiración del JWT\r\n isTokenExpired: this.helperJwt.isTokenExpired(token),\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, timer } 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 `.<strong class=\"alertMessageDsx\"> (${error.error})</strong>`\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","// Interceptor HTTP para manejar autorización y refresco de tokens en peticiones HTTP.\r\n// Permite agregar el token de autorización, manejar errores 401 y refrescar el token automáticamente.\r\nimport {\r\n HttpErrorResponse,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport {\r\n BehaviorSubject,\r\n catchError,\r\n EMPTY,\r\n filter,\r\n finalize,\r\n switchMap,\r\n take,\r\n} from 'rxjs';\r\nimport { ModelToken } from '../models/src/token.model';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\n\r\n// Lleva el conteo de peticiones activas para mostrar/ocultar el spinner\r\nlet _activeRequest = 0;\r\n// Indica si se está realizando un refresh de token\r\nlet isRefreshing = false;\r\n// Subject para emitir el nuevo token tras el refresh\r\nlet refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\n/**\r\n * Interceptor principal para autorización HTTP.\r\n * - Agrega el token de autorización a cada petición.\r\n * - Muestra/oculta el spinner de carga según el número de peticiones activas.\r\n * - Maneja errores 401 (Unauthorized) refrescando el token si es posible.\r\n * - Repite la petición original tras refrescar el token.\r\n */\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\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 const _token = _authorizeService.getToken();\r\n\r\n let authReq = req;\r\n\r\n // Si la URL de la petición es inválida, retorna un observable vacío\r\n // Surgio a partir de angular V21\r\n if (!req.url || req.url.trim() === '' || req.url === '/') {\r\n return EMPTY;\r\n }\r\n\r\n if (_token) {\r\n authReq = req.clone({\r\n setHeaders: { Authorization: `Bearer ${_token}` },\r\n });\r\n }\r\n\r\n // Para depuración: muestra el token agregado\r\n //console.log('Interceptor - Token agregado a la petición:', authReq);\r\n\r\n // Muestra el spinner si es la primera petición activa\r\n if (_activeRequest === 0) {\r\n _spinnerService.show();\r\n }\r\n _activeRequest++;\r\n\r\n // Ejecuta la petición HTTP\r\n return next(authReq).pipe(\r\n // Manejo de errores en la respuesta\r\n catchError((error: HttpErrorResponse) => {\r\n // Si el error es 401 (no autorizado), intenta refrescar el token\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n const refreshToken = _authorizeService.getTokenRefresh();\r\n // Si no hay refresh token, delega el manejo del error\r\n if (!refreshToken) {\r\n return _handleErrorService.handleErrorResponse(error);\r\n }\r\n\r\n // Si no se está refrescando el token, inicia el proceso de refresh\r\n if (!isRefreshing) {\r\n isRefreshing = true;\r\n refreshTokenSubject.next(null);\r\n\r\n // Solicita el refresh del token\r\n return _securityService.tokenRefresh(refreshToken).pipe(\r\n switchMap((response: ModelToken) => {\r\n isRefreshing = false;\r\n _authorizeService.tokenReload(response); // Actualiza el token en el servicio\r\n refreshTokenSubject.next(response.token); // Emite el nuevo token\r\n\r\n // Repite la petición original con el nuevo token\r\n return next(\r\n req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n })\r\n );\r\n }),\r\n catchError((err) => {\r\n isRefreshing = false;\r\n refreshTokenSubject.error(err); // Emite el error en el subject\r\n return _handleErrorService.handleErrorResponse(err);\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, espera a que el subject emita el nuevo token\r\n return refreshTokenSubject.pipe(\r\n filter((token) => token != null), // Espera a que el token sea válido\r\n take(1), // Toma solo la primera emisión válida\r\n switchMap((token) =>\r\n next(\r\n req.clone({\r\n setHeaders: { Authorization: `Bearer ${token}` },\r\n })\r\n )\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Para otros errores, delega al servicio de manejo de errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n // Al finalizar la petición (éxito o error), actualiza el conteo y oculta el spinner si corresponde\r\n // comentarizar el hide para verificar el spinner en la aplicacion final\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","export type InferCacheKeyType<T extends Record<string, string>> = keyof T;\r\n\r\n/**\r\n * Transforma un tipo de mapa `T` cuyas claves son simbólicas\r\n * y cuyos valores son nombres de propiedades reales de caché,\r\n * a un objeto donde esas propiedades reales son claves booleanas.\r\n *\r\n * @example\r\n * ```ts\r\n * type T = { cliente: 'invalidateCacheCliente' };\r\n * InferCacheOptions<T> // { invalidateCacheCliente: boolean }\r\n * ```\r\n */\r\nexport type InferCacheOptions<T extends Record<string, string>> = {\r\n [K in keyof T as T[K]]: boolean;\r\n};\r\n\r\nexport function createInitialCache<T extends Record<string, string>>(\r\n cacheKeys: T\r\n): {\r\n -readonly [K in keyof T as T[K]]: boolean;\r\n} {\r\n return Object.fromEntries(\r\n Object.values(cacheKeys).map((key) => [key, false])\r\n ) as any;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { JsonValuesDebujComponent } from '../../components/json-values-debuj/json-values-debuj.component';\r\nimport { IconDsxComponent } from '../../components/icon-dsx/icon-dsx.component';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [IconDsxComponent, JsonValuesDebujComponent],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n IconDsxComponent,\r\n JsonValuesDebujComponent,\r\n ReactiveFormsModule,\r\n ],\r\n providers: [],\r\n})\r\nexport class DsxAddToolsModule {}\r\n","import { NgModule } from '@angular/core';\r\n\r\n//PrimeNG\r\nimport { AccordionModule } from 'primeng/accordion';\r\nimport { AutoCompleteModule } from 'primeng/autocomplete';\r\nimport { AutoFocusModule } from 'primeng/autofocus';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { AvatarGroupModule } from 'primeng/avatargroup';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { FieldsetModule } from 'primeng/fieldset';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { InputMaskModule } from 'primeng/inputmask';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { PanelMenuModule } from 'primeng/panelmenu';\r\nimport { PasswordModule } from 'primeng/password';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\nimport { StepperModule } from 'primeng/stepper';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { TextareaModule } from 'primeng/textarea';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { ToggleButtonModule } from 'primeng/togglebutton';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\nconst PRIME_NG_MODULES = [\r\n AccordionModule,\r\n AutoCompleteModule,\r\n AutoFocusModule,\r\n AvatarGroupModule,\r\n AvatarModule,\r\n ButtonModule,\r\n CheckboxModule,\r\n DatePickerModule,\r\n DialogModule,\r\n DividerModule,\r\n DrawerModule,\r\n FieldsetModule,\r\n FileUploadModule,\r\n FloatLabelModule,\r\n IconFieldModule,\r\n ImageModule,\r\n InputIconModule,\r\n InputMaskModule,\r\n InputNumberModule,\r\n InputTextModule,\r\n MenubarModule,\r\n MessageModule,\r\n MultiSelectModule,\r\n PanelMenuModule,\r\n PasswordModule,\r\n RadioButtonModule,\r\n RippleModule,\r\n SelectModule,\r\n SplitButtonModule,\r\n StepperModule,\r\n TableModule,\r\n TabsModule,\r\n TagModule,\r\n TextareaModule,\r\n ToastModule,\r\n ToggleButtonModule,\r\n TooltipModule,\r\n];\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n exports: [...PRIME_NG_MODULES],\r\n providers: [],\r\n})\r\nexport class PrimeNgModule {}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'truncate',\r\n standalone: true,\r\n})\r\nexport class TruncatePipe implements PipeTransform {\r\n /**\r\n * Transforma una cadena de texto truncándola según los parámetros proporcionados.\r\n *\r\n * @param value - La cadena de texto que se desea truncar.\r\n * @param limit - El número máximo de caracteres permitidos. Por defecto es 100. Si no se encuentra un espacio dentro del límite, usa el límite original (15).\r\n * @param completeWords - Si es true, evita cortar palabras a la mitad. Por defecto es false.\r\n * @param ellipsis - La cadena que se añadirá al final del texto truncado. Por defecto es '...'.\r\n * @returns La cadena truncada con el ellipsis añadido, si es necesario.\r\n */\r\n transform(\r\n value: string,\r\n limit: number = 20,\r\n completeWords: boolean = false,\r\n ellipsis: string = '...'\r\n ): string {\r\n // Si el valor es nulo o indefinido, devuelve una cadena vacía para evitar errores.\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n // Si completeWords es true, ajusta el límite para no cortar palabras.\r\n if (completeWords) {\r\n // Encuentra el último espacio dentro del límite para evitar cortar palabras.\r\n limit = value.slice(0, limit).lastIndexOf(' ');\r\n\r\n // Si no se encuentra un espacio dentro del límite, usa el límite original.\r\n if (limit < 0) {\r\n limit = 15; // Valor por defecto si no hay espacios.\r\n }\r\n }\r\n\r\n // Trunca el texto y añade el ellipsis si la longitud del texto supera el límite.\r\n return value.length > limit ? value.slice(0, limit) + ellipsis : value;\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { CACHE_KEYS } from '../injections/cache.token';\r\nimport { InferCacheOptions } from '../models/src/cache.types';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n\r\n/**\r\n * Servicio genérico para el manejo de caché reactivo basado en claves definidas por el consumidor.\r\n *\r\n * Este servicio utiliza señales (`signal`) para almacenar el estado de invalidación de caché\r\n * y permite marcar ciertas entradas como inválidas mediante una llamada a `invalidate`.\r\n *\r\n * ---\r\n * ## Uso básico\r\n * Si no se especifica el tipo genérico `T`, el servicio funcionará con un mapa genérico\r\n * `Record<string, string>` sin autocompletado.\r\n *\r\n * ```ts\r\n * const cacheService = inject(CacheService);\r\n * cacheService.invalidate(['cualquierClave']);\r\n * ```\r\n *\r\n * ---\r\n * ## Uso tipado (recomendado)\r\n * 1. Definir las claves de caché en el proyecto consumidor:\r\n * ```ts\r\n * export const INITIAL_CACHE_KEYS = {\r\n * cliente: 'invalidateCacheCliente',\r\n * empresa: 'invalidateCacheEmpresa'\r\n * } as const;\r\n *\r\n * export type ValueCacheKeys = typeof INITIAL_CACHE_KEYS;\r\n * ```\r\n *\r\n * 2. Proveer estas claves en `AppModule` o un módulo raíz:\r\n * ```ts\r\n * providers: [\r\n * { provide: CACHE_KEYS, useValue: INITIAL_CACHE_KEYS }\r\n * ]\r\n * ```\r\n *\r\n * 3. Inyectar el servicio especificando el tipo:\r\n * ```ts\r\n * const cacheService = inject<CacheService<ValueCacheKeys>>(CacheService);\r\n *\r\n * cacheService.options.invalidateCacheCliente; // ✅ boolean con autocompletado\r\n * cacheService.invalidate(['cliente']); // marca como invalidado\r\n * ```\r\n *\r\n * @typeParam T - Objeto con claves simbólicas (`keyof T`) como `cliente`, `empresa`,\r\n * y valores string literales usados como claves reales de caché.\r\n * Por defecto: `Record<string, string>`.\r\n */\r\nexport class CacheService<\r\n T extends Record<string, string> = Record<string, string>\r\n> {\r\n /**\r\n * Mapa de claves simbólicas a claves reales de caché.\r\n * Se inyecta desde el proyecto consumidor mediante `CACHE_KEYS`.\r\n */\r\n private keys = inject(CACHE_KEYS) as T;\r\n\r\n /**\r\n * Servicio de alerta utilizado para mostrar notificaciones al usuario.\r\n */\r\n private alert = inject(AlertaService);\r\n\r\n /**\r\n * Estado reactivo que contiene un objeto donde cada propiedad (clave real de caché)\r\n * tiene un valor booleano que indica si el caché ha sido invalidado (`true`)\r\n * o sigue siendo válido (`false`).\r\n *\r\n * Este estado es tipado automáticamente en función de los valores de `T`.\r\n */\r\n private _options = signal<InferCacheOptions<T>>(\r\n Object.fromEntries(\r\n Object.values(this.keys).map((k) => [k, false])\r\n ) as InferCacheOptions<T>\r\n );\r\n\r\n /**\r\n * Obtiene el estado actual del caché.\r\n * Cada propiedad representa una clave real de caché con su valor booleano.\r\n */\r\n get options(): InferCacheOptions<T> {\r\n return this._options();\r\n }\r\n\r\n /**\r\n * Invalida una o más claves simbólicas, marcando su correspondiente\r\n * propiedad de caché como `true` (invalidada).\r\n *\r\n * @param keysToInvalidate - Lista de claves simbólicas (`keyof T`) a invalidar.\r\n *\r\n * @example\r\n * ```ts\r\n * cacheService.invalidate(['cliente', 'empresa']);\r\n * ```\r\n */\r\n invalidate(keysToInvalidate: (keyof T)[] | null = null): void {\r\n if (!keysToInvalidate?.length) return;\r\n\r\n const current: InferCacheOptions<T> = { ...this._options() };\r\n\r\n keysToInvalidate.forEach((key) => {\r\n const prop = this.keys[key] as keyof InferCacheOptions<T>;\r\n current[prop] = true as InferCacheOptions<T>[typeof prop];\r\n });\r\n\r\n this._options.set(current);\r\n\r\n this.alert.toastrAlerts(\r\n 2,\r\n 'Estado',\r\n 'Datos actualizados (cache).',\r\n 2,\r\n 1000\r\n );\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport { CacheService } from './cache.service';\r\n\r\nexport function createTypedCacheProvider<T extends Record<string, string>>(\r\n tokenName: string\r\n): { token: InjectionToken<CacheService<T>>; provider: Provider } {\r\n const token = new InjectionToken<CacheService<T>>(tokenName);\r\n\r\n const provider: Provider = {\r\n provide: token,\r\n useFactory: () => new CacheService<T>(),\r\n deps: [],\r\n };\r\n\r\n return { token, provider };\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class EndpointService<T> {\r\n private http = inject(HttpClient);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private getUrl(endpoint: string): string {\r\n return `${this.environment.myAppUrl}api/${endpoint}`;\r\n }\r\n\r\n list(endpoint: string, invalidateCache: boolean = false): Observable<T[]> {\r\n return this.http.get<T[]>(\r\n `${this.getUrl(endpoint)}/listar/${invalidateCache}`\r\n );\r\n }\r\n\r\n edit(endpoint: string, id: number): Observable<T> {\r\n return this.http.get<T>(`${this.getUrl(endpoint)}/get-id/${id}`);\r\n }\r\n\r\n save(endpoint: string, values: T): Observable<ResponseHttpModel> {\r\n return this.http.put<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/save`,\r\n values\r\n );\r\n }\r\n\r\n delete(\r\n endpoint: string,\r\n id: number,\r\n softDelete: boolean = true\r\n ): Observable<ResponseHttpModel> {\r\n return this.http.delete<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/delete/${id}/${softDelete}`\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport moment from 'moment-timezone';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ResponseHttpModel } from '../models';\r\nimport {\r\n FechasConversion,\r\n FilterOption,\r\n TipoFechaConversion,\r\n} from '../models/src/extensions.model';\r\nimport { FieldConfig } from '../models/src/field-config.model';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UtilityAddService {\r\n private _serviceAlerta = inject(AlertaService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private _router = inject(Router);\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto formateada según la zona horaria especificada.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en la zona horaria especificada o null si la fecha es null.\r\n */\r\n convertirFechaSegunZonaHoraria(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Cambia esto a la zona horaria que desees\r\n const zonaHoraria = 'America/Guatemala';\r\n return moment(fecha).tz(zonaHoraria).format();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a un objeto Date en formato ISO, opcionalmente ajustando la hora al inicio del día.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {Date | null} - La fecha convertida en formato Date o null si la fecha es null.\r\n */\r\n convertirFechaISOString(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): Date | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toDate();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena en formato ISO 8601.\r\n *\r\n * @param {string | Date} fecha - La fecha a convertir. Puede ser un string o un objeto Date.\r\n * @param {boolean} initHour - Si es true, ajusta la hora al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha en formato ISO 8601 (ejemplo: '2025-09-05T00:00:00.000Z') o null si la fecha es inválida.\r\n *\r\n * @example\r\n * // Fecha como string\r\n * service.convertirFechaISO8601('2025-09-05'); // '2025-09-05T00:00:00.000Z'\r\n * // Fecha como Date y ajustando al inicio del día\r\n * service.convertirFechaISO8601(new Date(), true); // '2025-09-05T00:00:00.000Z'\r\n */\r\n convertirFechaISO8601(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toISOString();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato corto (YYYY-MM-DD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha formateada en formato corto (YYYY-MM-DD) o null si la fecha es null.\r\n */\r\n convertirFechaShort(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n const fechaMoment = moment(fecha).format('YYYY-MM-DD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto que representa solo la hora (HH:mm).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La hora formateada (HH:mm) o null si la fecha es null.\r\n */\r\n convertirFechaTime(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('HH:mm');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato timestamp (YYYYMMDD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en formato timestamp (YYYYMMDD) o null si la fecha es null.\r\n */\r\n convertirTimeStampString(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('YYYYMMDD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Crea un FormGroup tipado a partir de una configuración de campos.\r\n *\r\n * @param {FormBuilder} fb - Instancia de FormBuilder para crear el FormGroup.\r\n * @param {FieldConfig<T>} config - Configuración de los campos del formulario.\r\n * @param {ValidatorFn[]} groupValidators - Validadores adicionales a nivel de grupo.\r\n * @returns {FormGroup} - El FormGroup creado.\r\n */\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidators?: ValidatorFn[]\r\n ): FormGroup {\r\n const formGroup: { [key in keyof T]?: FormControl } = {};\r\n\r\n // Crear controles de formulario individuales\r\n for (const key in config) {\r\n if (Object.prototype.hasOwnProperty.call(config, key)) {\r\n const { value, disabled = false, validators = [] } = config[key];\r\n formGroup[key] = new FormControl({ value, disabled }, validators);\r\n }\r\n }\r\n\r\n // Crear el FormGroup con validadores adicionales a nivel de grupo si existen\r\n const group = fb.group(\r\n formGroup,\r\n groupValidators ? { validators: groupValidators } : {}\r\n );\r\n\r\n return group;\r\n }\r\n\r\n /**\r\n * Sanitiza un formulario obteniendo valores de un formulario, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del modelo a procesar.\r\n * @param form - El formulario reactivo de Angular del que se obtendrán los valores.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar. Cada objeto debe contener:\r\n * - `nombre`: El nombre del campo de fecha en el modelo.\r\n * - `tipo`: El tipo de conversión que se debe aplicar (por ejemplo, `'short'`, `'zh'`, `'iso').\r\n * @returns Un objeto del tipo `T` con los datos procesados y las conversiones de fecha aplicadas.\r\n * @throws Error - Si el campo de fecha especificado no existe en los datos del formulario.\r\n *\r\n * @example\r\n * // Procesar varios campos de fecha\r\n * const precioValues = service.sanitizarModelo<ItemPrecioModel>(\r\n * form,\r\n * { nombre: 'fechaInicio', tipo: 'short' },\r\n * { nombre: 'fechaFin', tipo: 'zh' }\r\n * );\r\n */\r\n sanitizarForm<T>(form: any, ...campos: FechasConversion[]): T {\r\n // Obtén todos los valores del formulario\r\n const rawData = form.getRawValue();\r\n\r\n if (!rawData) {\r\n throw new Error('El formulario no tiene valores.');\r\n }\r\n\r\n // Procesa los valores sin envolver en un arreglo\r\n const updatedValue = { ...rawData };\r\n\r\n // Itera sobre los campos de fecha especificados para realizar las conversiones\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el valor.`);\r\n }\r\n updatedValue[nombre] = updatedValue[nombre]\r\n ? this.convertirFecha(updatedValue[nombre], tipo)\r\n : null;\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Sanitiza un objeto plano, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del objeto a procesar.\r\n * @param values - El objeto con los datos.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar.\r\n * @returns Un objeto del tipo T con las conversiones de fecha aplicadas.\r\n */\r\n sanitizarModel<T extends Record<string, any>>(\r\n values: T,\r\n ...campos: FechasConversion[]\r\n ): T {\r\n // Crear una copia del objeto para no modificar el original\r\n const updatedValue: Record<string, any> = { ...values };\r\n\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el objeto.`);\r\n }\r\n\r\n const valorActual = updatedValue[nombre];\r\n\r\n if (\r\n valorActual !== null &&\r\n valorActual !== undefined &&\r\n valorActual !== ''\r\n ) {\r\n updatedValue[nombre] = this.convertirFecha(valorActual, tipo);\r\n } else {\r\n updatedValue[nombre] = null;\r\n }\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Convierte una fecha al formato especificado.\r\n *\r\n * @param fecha - La fecha en formato string que se desea convertir.\r\n * Debe estar en un formato reconocible por `Date` o en ISO 8601.\r\n * @param tipo - El tipo de conversión a realizar. Soporta:\r\n * - `'short'`: Devuelve la fecha en formato corto (YYYY-MM-DD).\r\n * - `'zh'`: Devuelve la fecha ajustada a la zona horaria configurada.\r\n * - `'iso'`: Devuelve la fecha como objeto Date en formato ISO.\r\n * - `'iso8601'`: Devuelve la fecha como string en formato ISO 8601.\r\n * @returns La fecha convertida como string o Date según el tipo especificado, o null si la fecha es inválida.\r\n * @throws Error - Si el tipo de conversión no es válido o soportado.\r\n *\r\n * @example\r\n * // Formato corto\r\n * service.convertirFecha('2025-08-21', 'short'); // '2025-08-21'\r\n * // Zona horaria\r\n * service.convertirFecha('2025-08-21', 'zh'); // '2025-08-21T00:00:00-06:00' (ejemplo)\r\n * // Formato ISO (Date)\r\n * service.convertirFecha('2025-08-21', 'iso'); // Date { ... }\r\n * // Formato ISO 8601 (string)\r\n * service.convertirFecha('2025-08-21', 'iso8601'); // '2025-08-21T00:00:00.000Z'\r\n */\r\n private convertirFecha(\r\n fecha: string,\r\n tipo: TipoFechaConversion\r\n ): Date | string | null {\r\n switch (tipo) {\r\n case 'short':\r\n // Implementación para el formato corto\r\n return this.convertirFechaShort(fecha);\r\n case 'zh':\r\n // Implementación para zonas horarias\r\n return this.convertirFechaSegunZonaHoraria(fecha);\r\n case 'iso': {\r\n return this.convertirFechaISOString(fecha);\r\n }\r\n case 'iso8601': {\r\n return this.convertirFechaISO8601(fecha);\r\n }\r\n default:\r\n throw new Error(`Tipo de conversión desconocido: ${tipo}`);\r\n }\r\n }\r\n\r\n /**\r\n * Maneja la respuesta de un archivo descargable\r\n * @param fileObservable Observable que emite el Blob del archivo\r\n * @param actionId 0 para abrir en nueva ventana, 1 para descargar\r\n * @param fileName Nombre del archivo sin extensión\r\n */\r\n handleFileResponse(\r\n fileObservable: Observable<Blob>,\r\n actionId: number,\r\n fileName: string\r\n ): void {\r\n fileObservable.subscribe({\r\n next: (fileBlob: Blob) => {\r\n const fileUrl = URL.createObjectURL(fileBlob);\r\n const fileExtension = this.getFileExtension(fileBlob.type);\r\n\r\n if (this.isExcelFile(fileBlob.type)) {\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n } else {\r\n this.handleNonExcelFiles(fileUrl, actionId, fileName, fileExtension);\r\n }\r\n\r\n this.revokeObjectUrl(fileUrl);\r\n },\r\n error: (err) => console.error('Error al manejar el archivo:', err),\r\n });\r\n }\r\n\r\n private isExcelFile(fileType: string): boolean {\r\n return fileType.includes(\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n );\r\n }\r\n\r\n private getFileExtension(fileType: string): string {\r\n return fileType.includes('pdf') ? '.pdf' : '.xlsx';\r\n }\r\n\r\n private handleNonExcelFiles(\r\n fileUrl: string,\r\n actionId: number,\r\n fileName: string,\r\n fileExtension: string\r\n ): void {\r\n switch (actionId) {\r\n case 0: // Abrir en nueva ventana\r\n window.open(fileUrl, '_blank');\r\n break;\r\n case 1: // Descargar archivo\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n break;\r\n }\r\n }\r\n\r\n private forceDownload(fileUrl: string, fullFileName: string): void {\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n downloadLink.download = fullFileName;\r\n downloadLink.click();\r\n }\r\n\r\n private revokeObjectUrl(fileUrl: string): void {\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(fileUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Muestra información en consola solo en desarrollo, permitiendo múltiples argumentos como console.log nativo.\r\n *\r\n * @param args - Argumentos a mostrar en consola (texto, objetos, etc).\r\n * @example\r\n * logIfNotProduction('Datos:', response);\r\n * logIfNotProduction('Error:', error, { extra: true });\r\n */\r\n logIfNotProduction(...args: any[]): void {\r\n if (!this.environment.production) {\r\n console.log(...args);\r\n }\r\n }\r\n\r\n /**\r\n * Marca todos los controles de un formulario como \"tocados\" y muestra un mensaje de alerta.\r\n * @param form - El formulario que se va a validar.\r\n */\r\n checkFormValid(form: FormGroup): void {\r\n // Marca todos los controles como tocados\r\n form.markAllAsTouched();\r\n\r\n // Muestra un mensaje de alerta\r\n this._serviceAlerta.toastrAlerts(\r\n 3,\r\n 'Formulario',\r\n 'Validaciones pendientes',\r\n 2\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene valores únicos de un campo específico de un array de objetos\r\n * @param data Array de objetos de tipo T\r\n * @param field Campo del objeto del cual extraer valores únicos\r\n * @returns FilterOption[] Listado filtrado, tipado y ordenado alfabéticamente\r\n */\r\n getUniqueValues<T>(data: T[], field: keyof T): FilterOption[] {\r\n const uniqueValues = data.reduce((acc: FilterOption[], current) => {\r\n const fieldValue = current[field];\r\n\r\n if (\r\n typeof fieldValue === 'string' &&\r\n !acc.some((item) => item.value === fieldValue)\r\n ) {\r\n acc.push({\r\n value: fieldValue,\r\n field: field.toString(),\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return uniqueValues.sort((a, b) => a.value.localeCompare(b.value));\r\n }\r\n\r\n /**\r\n * Helper function para parsear fechas para filtro de primeNg en table\r\n * @param date - Fecha en formato string, Date o null/undefined\r\n * @returns Date | null - Objeto Date válido o null\r\n */\r\n parseDate(date: string | Date | null): Date | null {\r\n if (!date) return null;\r\n return typeof date === 'string' ? new Date(date) : date;\r\n }\r\n\r\n /**\r\n * Función pura que procesa una cadena de texto conteniendo números individuales y/o rangos numéricos,\r\n * devolviendo un array con todos los números expandidos.\r\n *\r\n * @param input - Cadena de texto con el formato: número[.número][.inicio-fin][...]\r\n * @returns Array de números con todos los valores individuales y rangos expandidos\r\n *\r\n * @example\r\n * // Uso básico\r\n * const result = parseNumericRanges('1.5.7.10-12');\r\n * // Retorna: [1, 5, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Con espacios y caracteres especiales\r\n * const result = parseNumericRanges(' 3. 5-7 .10-12abc');\r\n * // Retorna: [3, 5, 6, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Rangos invertidos (serán ignorados)\r\n * const result = parseNumericRanges('10-8');\r\n * // Retorna: [] (array vacío)\r\n *\r\n * @note\r\n * Características especiales:\r\n * - Elimina automáticamente espacios y caracteres no numéricos\r\n * - Los números deben estar separados por puntos (.)\r\n * - Los rangos deben usar guión (-) sin espacios entre números\r\n * - Es tolerante a formatos inconsistentes\r\n * - Omite elementos inválidos sin generar errores\r\n */\r\n parseNumericRanges(input: string): number[] {\r\n const cleanString = input.replace(/[^\\d.\\- ]/g, '').replace(/\\s+/g, '');\r\n\r\n const parts = cleanString.split('.');\r\n const result: number[] = [];\r\n\r\n for (const part of parts) {\r\n if (!part) continue;\r\n\r\n if (part.includes('-')) {\r\n const [startStr, endStr] = part.split('-');\r\n const start = parseInt(startStr, 10);\r\n const end = parseInt(endStr, 10);\r\n\r\n if (!isNaN(start) && !isNaN(end) && start <= end) {\r\n for (let i = start; i <= end; i++) {\r\n result.push(i);\r\n }\r\n }\r\n } else {\r\n const number = parseInt(part, 10);\r\n if (!isNaN(number)) {\r\n result.push(number);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adaptador para procesar eventos de input y extraer rangos numéricos.\r\n *\r\n * @param event - Objeto Event del DOM, preferiblemente de un elemento input\r\n * @returns Array de números generado a partir del valor del input\r\n *\r\n * @example\r\n * // Uso en template Angular\r\n * <input (input)=\"processNumericRangesFromEvent($event)\">\r\n *\r\n * @example\r\n * // Uso directo\r\n * const result = processNumericRangesFromEvent(inputEvent);\r\n *\r\n * @note\r\n * Esta función es un wrapper que:\r\n * - Extrae el valor del input del evento\r\n * - Delega el procesamiento a parseNumericRanges()\r\n * - Mantiene compatibilidad con eventos de diferentes frameworks\r\n *\r\n * @dependencies\r\n * Requiere que el evento tenga la propiedad target.value (standard DOM)\r\n * Para otros tipos de eventos (ej. Angular Material) puede necesitar ajustes\r\n */\r\n processNumericRangesFromEvent(event: Event): number[] {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n return this.parseNumericRanges(inputValue);\r\n }\r\n\r\n /**\r\n * Maneja la respuesta estándar de una operación HTTP, mostrando alertas y realizando acciones comunes en formularios.\r\n *\r\n * @param response - Respuesta de la operación (debe tener isSuccess, title, statusMessage).\r\n * @param urlHome - Ruta a la que se navega si la operación es exitosa y el id es mayor a 0.\r\n * @param form - Formulario reactivo a resetear si la operación es exitosa.\r\n * @param getForm - Función para recargar el formulario (por ejemplo, para obtener datos actualizados).\r\n * @param id - Identificador usado para decidir si se navega a urlHome tras éxito.\r\n *\r\n * @example\r\n * // Uso típico en un componente\r\n * this.utilityAddService.handleResponse(\r\n * response,\r\n * '/home',\r\n * this.form,\r\n * () => this.getForm(),\r\n * this.id\r\n * );\r\n *\r\n * @description\r\n * - Si response.isSuccess es true:\r\n * - Muestra alerta tipo toastr.\r\n * - Si id > 0, navega a urlHome.\r\n * - Resetea el formulario y ejecuta getForm().\r\n * - Si response.isSuccess es false:\r\n * - Muestra alerta visual personalizada con icono de error.\r\n */\r\n public handleResponse(\r\n response: ResponseHttpModel,\r\n urlHome: string,\r\n form: FormGroup,\r\n getForm: () => void,\r\n id: number\r\n ): void {\r\n try {\r\n this.logIfNotProduction('handleResponse - response:', response);\r\n if (response.isSuccess) {\r\n this._serviceAlerta.toastrAlerts(\r\n 1,\r\n response.title,\r\n response.statusMessage,\r\n 2\r\n );\r\n if (id > 0) {\r\n this._router.navigate([urlHome]);\r\n }\r\n getForm();\r\n form?.reset();\r\n } else {\r\n this._serviceAlerta.alertaHtmlSuccess(\r\n response.title,\r\n response.statusMessage,\r\n {\r\n icono: 'icon2/hard_drive_error.png',\r\n showConfirmButton: true,\r\n }\r\n );\r\n }\r\n } catch (error) {\r\n this.logIfNotProduction('Error en handleResponse:', error);\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Error',\r\n error instanceof Error ? error.message : String(error),\r\n 2\r\n );\r\n }\r\n }\r\n}\r\n","import { AbstractControl, FormGroup, ValidationErrors } from '@angular/forms';\r\n\r\n/**\r\n * Valida que el control contenga un rango de fechas válido (dos fechas no nulas y válidas).\r\n */\r\nexport function dateRangeValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const dates: Date[] = control.value;\r\n\r\n // Verificar si el valor es un array con exactamente dos elementos\r\n if (Array.isArray(dates) && dates.length === 2) {\r\n const [startDate, endDate] = dates;\r\n\r\n // Verificar que las fechas sean válidas y no nulas\r\n if (\r\n startDate &&\r\n endDate &&\r\n !isNaN(new Date(startDate).getTime()) &&\r\n !isNaN(new Date(endDate).getTime())\r\n ) {\r\n return null; // Válido\r\n } else {\r\n return {\r\n invalidDateRange: {\r\n message: 'Ambas fechas deben ser válidas y no nulas.',\r\n requiredLength: 2,\r\n },\r\n }; // Error si alguna fecha es nula o inválida\r\n }\r\n }\r\n\r\n return null; // Si el control no contiene un array válido, no hay error\r\n}\r\n\r\n/**\r\n * Valida que una fecha única esté dentro de un rango mínimo y máximo.\r\n * @param minDate Fecha mínima permitida.\r\n * @param maxDate Fecha máxima permitida.\r\n */\r\nexport function dateMinMaxValidator(minDate: Date, maxDate: Date) {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const date: Date = control.value;\r\n\r\n // Verificar si el valor es una fecha válida\r\n if (date && !isNaN(new Date(date).getTime())) {\r\n const currentDate = new Date(date);\r\n\r\n // Validar si la fecha está fuera del rango permitido\r\n if (currentDate < minDate || currentDate > maxDate) {\r\n return {\r\n dateNotRange: {\r\n message: `La fecha debe estar entre ${minDate.toLocaleDateString()} y ${maxDate.toLocaleDateString()}`,\r\n minDate: minDate.toISOString(),\r\n maxDate: maxDate.toISOString(),\r\n },\r\n };\r\n }\r\n\r\n return null; // Fecha válida y dentro del rango\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\n/**\r\n * Valida que al menos uno de los campos especificados esté lleno.\r\n * @param fields Los nombres de los campos a validar.\r\n */\r\nexport function atLeastOneFieldRequiredValidator(fields: string[]) {\r\n return (formGroup: AbstractControl): ValidationErrors | null => {\r\n // Obtener el FormGroup para poder acceder a los controles\r\n const form = formGroup as FormGroup;\r\n\r\n // Verificar si al menos uno de los campos tiene un valor\r\n const isAnyFieldFilled = fields.some((field) => {\r\n const control = form.get(field);\r\n return control?.value !== null && control?.value !== '';\r\n });\r\n\r\n // Si al menos un campo tiene un valor, la validación es exitosa\r\n if (isAnyFieldFilled) {\r\n return null; // Validación pasada\r\n } else {\r\n // Construir el mensaje dinámico con los campos no llenados\r\n const emptyFields = fields.filter((field) => {\r\n const control = form.get(field);\r\n return control?.value === null || control?.value === '';\r\n });\r\n\r\n const fieldNames = emptyFields.join(', ');\r\n const message = `Debe completar al menos uno de los siguientes campos: ${fieldNames}.`;\r\n\r\n // Si ninguno tiene valor, devolver el mensaje con el error\r\n return {\r\n atLeastOneRequired: {\r\n message: message,\r\n },\r\n };\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un NIT (Número de Identificación Tributaria) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del NIT.\r\n * @returns Un objeto de error si el NIT no es válido, o `null` si el NIT es válido.\r\n */\r\nexport function nitValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const nit = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!nit) {\r\n return null;\r\n }\r\n\r\n // Validar el NIT utilizando la función NITCorrecto\r\n const esValido = NITCorrecto(nit);\r\n\r\n // Si el NIT no es válido, retornar un objeto de error con el formato deseado\r\n if (!esValido) {\r\n return {\r\n invalidNIT: {\r\n message: 'El NIT ingresado no es válido.', // Mensaje de error personalizado\r\n requiredLength: nit.length, // Longitud del NIT ingresado (opcional)\r\n },\r\n };\r\n }\r\n\r\n // Si el NIT es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función auxiliar para validar un NIT según un algoritmo específico.\r\n *\r\n * @param nit - El NIT a validar.\r\n * @returns `true` si el NIT es válido, `false` en caso contrario.\r\n */\r\nfunction NITCorrecto(nit: string): boolean {\r\n try {\r\n const largo = nit.length;\r\n // Invertir el NIT (excepto el último dígito) para facilitar el cálculo\r\n const validar = nit\r\n .substring(0, largo - 1)\r\n .split('')\r\n .reverse()\r\n .join('');\r\n const cadena = validar.split('');\r\n const comparador = nit.substring(largo - 1, largo); // Último dígito del NIT\r\n let posicion = 2; // Factor de ponderación inicial\r\n let sumaValidar = 0; // Acumulador para la suma ponderada\r\n\r\n // Calcular la suma ponderada de los dígitos del NIT\r\n for (const c of cadena) {\r\n sumaValidar += parseInt(c, 10) * posicion;\r\n posicion += 1;\r\n }\r\n\r\n // Calcular el residuo de la operación de validación\r\n const residuo = operacionValidar(11 - operacionValidar(sumaValidar));\r\n\r\n // Validar el NIT según el residuo y el último dígito\r\n if (residuo === 10 && comparador.toUpperCase() === 'K') {\r\n return true; // El NIT es válido si el residuo es 10 y el último dígito es 'K'\r\n } else if (residuo.toString() === comparador) {\r\n return true; // El NIT es válido si el residuo coincide con el último dígito\r\n } else {\r\n return false; // El NIT no es válido\r\n }\r\n } catch (error) {\r\n // Si ocurre un error durante la validación, el NIT no es válido\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Función auxiliar para calcular el residuo de una operación aritmética.\r\n *\r\n * @param valor - El valor sobre el cual se calculará el residuo.\r\n * @returns El residuo de la división del valor entre 11.\r\n */\r\nfunction operacionValidar(valor: number): number {\r\n return valor % 11;\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un CUI (Código Único de Identificación) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del CUI.\r\n * @returns Un objeto de error si el CUI no es válido, o `null` si el CUI es válido.\r\n */\r\nexport function cuiValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const cui = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!cui) {\r\n return null;\r\n }\r\n\r\n // Validar el CUI\r\n const esValido = CUICorrecto(cui);\r\n\r\n // Si el CUI no es válido, retornar un objeto de error\r\n if (!esValido) {\r\n return {\r\n invalidCUI: {\r\n message: 'El CUI ingresado no es válido.',\r\n requiredLength: 13,\r\n actualLength: cui.length,\r\n },\r\n };\r\n }\r\n\r\n // Si el CUI es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función que implementa el algoritmo de validación del CUI\r\n * @param cui Número de CUI a validar (debe tener 13 dígitos)\r\n * @returns boolean indicando si el CUI es válido\r\n */\r\nfunction CUICorrecto(cui: string | number): boolean {\r\n // Convertir a string si es número\r\n const cuiStr = typeof cui === 'number' ? cui.toString() : cui;\r\n\r\n // Validar longitud y que sean solo dígitos\r\n if (cuiStr.length !== 13 || !/^\\d+$/.test(cuiStr)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const primeros8 = cuiStr.substring(0, 8);\r\n const digitoVerificador = parseInt(cuiStr.substring(8, 9), 10);\r\n let suma = 0;\r\n\r\n // Calcular la suma ponderada\r\n for (let i = 0; i < primeros8.length; i++) {\r\n const digito = parseInt(primeros8[i], 10);\r\n suma += digito * (i + 2); // Los pesos son 2, 3, 4, ..., 9\r\n }\r\n\r\n // Calcular residuo y validar\r\n const residuo = suma % 11;\r\n return residuo === digitoVerificador;\r\n } catch (error) {\r\n console.error('Error validando CUI:', error);\r\n return false;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/components';\r\nexport * from './lib/components/icon-dsx/icon-dsx.component';\r\nexport * from './lib/components/json-values-debuj/json-values-debuj.component';\r\nexport * from './lib/components/loading-lottie/loading-lottie.component';\r\nexport * from './lib/components/loading/loading.component';\r\nexport * from './lib/components/navbar-dsx/navbar-dsx.component';\r\nexport * from './lib/directives/only-rango-pattern.directive';\r\nexport * from './lib/directives/select-all-on-focus.directive';\r\nexport * from './lib/injections/cache.token';\r\nexport * from './lib/injections/environment.token';\r\nexport * from './lib/injections/parameterSecurity';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/models';\r\nexport * from './lib/models/src/parameterSecurity.model';\r\nexport * from './lib/modules/src/dsx-add-tools.module';\r\nexport * from './lib/modules/src/prime-ng.module';\r\nexport * from './lib/pipe';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/services/cache.provider';\r\nexport * from './lib/services/cache.service';\r\nexport * from './lib/services/endpoint.service';\r\nexport * from './lib/services/error-handler.service';\r\nexport * from './lib/services/parameter-values.service';\r\nexport * from './lib/services/security.service';\r\nexport * from './lib/services/utility-add.service';\r\nexport * from './lib/validations/addons.validators';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.IconDsxService","i2"],"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.21.12",
3
+ "version": "1.21.13",
4
4
  "description": "Libreria para control de código automatizado.",
5
5
  "author": "DevSoftXela",
6
6
  "dependencies": {
Binary file