ngx-dsxlibrary 1.0.60 → 1.0.62

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.
@@ -337,7 +337,7 @@ class AlertaService {
337
337
  alertaHtmlSuccess(titleAlert, messageHtml, options = {}) {
338
338
  // Valores por defecto (se pueden sobrescribir mediante options)
339
339
  const { icono = 'icon/check02.png', // Ruta relativa de la imagen en assets/dsxResource/
340
- icon = 'success', // Tipo de icono SweetAlert2
340
+ icon, // Tipo de icono SweetAlert2 (ahora opcional)
341
341
  showConfirmButton = false, // Mostrar botón de confirmación
342
342
  confirmButtonText = 'Ok', // Texto del botón de confirmación
343
343
  timer = 2000, // Tiempo de auto-cierre en ms (0 = desactivado)
@@ -348,7 +348,6 @@ class AlertaService {
348
348
  // Configuración base de SweetAlert
349
349
  const alertConfig = {
350
350
  title: titleAlert,
351
- icon,
352
351
  html: messageHtml,
353
352
  draggable: true,
354
353
  showConfirmButton,
@@ -360,6 +359,10 @@ class AlertaService {
360
359
  imageHeight: showImage ? imageHeight : undefined,
361
360
  imageAlt: showImage ? 'image alert' : undefined,
362
361
  };
362
+ // Solo agrega el icono si está definido
363
+ if (icon !== undefined) {
364
+ alertConfig.icon = icon;
365
+ }
363
366
  // Precargar imagen solo si es necesario
364
367
  if (showImage && icono) {
365
368
  return this.preloadImage(icono).then(() => Swal.fire(alertConfig));
@@ -462,19 +465,54 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImpor
462
465
 
463
466
  /**
464
467
  * Servicio para gestionar los parámetros de seguridad de la aplicación.
465
- * Permite cargar los parámetros desde la API, mantenerlos en memoria, y acceder
466
- * a sus valores de forma segura evitando `undefined` en los componentes.
468
+ * Permite cargar los parámetros desde la API, mantenerlos en memoria, acceder y comparar valores de forma segura.
469
+ * Utiliza tipado genérico para los nombres de parámetros y cache interno para optimizar consultas repetidas.
470
+ *
471
+ * @template T Tipo de los nombres de parámetros permitidos (usualmente un union type de string)
467
472
  */
468
473
  class ParameterValuesService {
469
- /** Parámetros iniciales inyectados mediante INITIAL_PARAMETERS */
474
+ /**
475
+ * Parámetros iniciales inyectados mediante INITIAL_PARAMETERS.
476
+ * Se usan para validar y mapear los parámetros recibidos de la API.
477
+ */
470
478
  initialParameters = inject(INITIAL_PARAMETERS);
471
- /** Servicio que contiene el método getParameterSecurity() */
479
+ /**
480
+ * Cache interno para optimizar la comparación de valores de parámetros.
481
+ * La clave es una combinación de nombre e índice, el valor es el resultado de la consulta.
482
+ */
483
+ parameterCache = new Map();
484
+ alertedParams = new Set();
485
+ /**
486
+ * Servicio que contiene el método getParameterSecurity() para obtener los parámetros desde la API.
487
+ */
472
488
  apiService = inject(SecurityService);
473
- /** Señal que contiene los parámetros cargados */
474
- _dataParameter = signal(this.initialParameters, ...(ngDevMode ? [{ debugName: "_dataParameter" }] : []));
475
- /** Flag que indica si ya se cargaron los parámetros desde la API */
489
+ /**
490
+ * Señal reactiva que contiene los parámetros cargados y permite actualizaciones automáticas.
491
+ */
492
+ _dataParameter = signal(this.initializeData(), ...(ngDevMode ? [{ debugName: "_dataParameter" }] : []));
493
+ /**
494
+ * Flag que indica si ya se cargaron los parámetros desde la API.
495
+ */
476
496
  _loaded = false;
477
- /** ===================== GETTERS/SETTERS ===================== */
497
+ /**
498
+ * Inicializa los datos de parámetros usando los valores inyectados.
499
+ * @returns Array de parámetros iniciales tipados
500
+ */
501
+ initializeData() {
502
+ return this.initialParameters.map((param) => this.createMyParameterValue(param.parameterName, param.values));
503
+ }
504
+ /**
505
+ * Crea una instancia de MyParameterValues tipada y segura.
506
+ * @param parameterName Nombre del parámetro
507
+ * @param values Valores asociados al parámetro
508
+ * @returns Objeto MyParameterValues
509
+ */
510
+ createMyParameterValue(parameterName, values) {
511
+ return {
512
+ parameterName,
513
+ values: [...values],
514
+ };
515
+ }
478
516
  /**
479
517
  * Devuelve los parámetros actuales como un array de solo lectura.
480
518
  */
@@ -493,7 +531,6 @@ class ParameterValuesService {
493
531
  }
494
532
  this._dataParameter.set(values);
495
533
  }
496
- /** ===================== MÉTODOS PRINCIPALES ===================== */
497
534
  /**
498
535
  * Carga los parámetros desde la API.
499
536
  * Si ya se cargaron y force=false, devuelve la copia en memoria.
@@ -527,7 +564,53 @@ class ParameterValuesService {
527
564
  refreshParameters() {
528
565
  return this.loadParameters(true);
529
566
  }
530
- /** ===================== MÉTODOS PRIVADOS ===================== */
567
+ /**
568
+ * Crea una copia segura y mutable de los parámetros actuales.
569
+ * @returns Array de parámetros
570
+ */
571
+ createSafeCopy() {
572
+ return this.dataParameter.map((item) => this.createMyParameterValue(item.parameterName, [...item.values]));
573
+ }
574
+ /**
575
+ * Mapea los parámetros recibidos de la API a objetos tipados y seguros.
576
+ * @param apiParameters Parámetros recibidos desde la API
577
+ * @returns Array de MyParameterValues
578
+ */
579
+ mapToMyParameterValues(apiParameters) {
580
+ const initialNames = this.initialParameters.map((p) => p.parameterName);
581
+ return apiParameters
582
+ .filter((param) => initialNames.includes(param.parameterName))
583
+ .map((param) => {
584
+ // Función de conversión type-safe
585
+ return this.convertToTypedParameter(param);
586
+ })
587
+ .filter((param) => param !== null);
588
+ }
589
+ /**
590
+ * Convierte un parámetro de la API a un objeto tipado, validando el nombre.
591
+ * @param param Parámetro recibido de la API
592
+ * @returns Objeto MyParameterValues o null si no es válido
593
+ */
594
+ convertToTypedParameter(param) {
595
+ const initialParam = this.initialParameters.find((p) => p.parameterName === param.parameterName);
596
+ if (!initialParam) {
597
+ return null;
598
+ }
599
+ // Conversión segura con verificación
600
+ if (this.isValidParameterName(param.parameterName)) {
601
+ return this.createMyParameterValue(param.parameterName, param.parameterValues?.map((v) => v.value) ?? []);
602
+ }
603
+ return null;
604
+ }
605
+ /**
606
+ * Verifica si un nombre de parámetro es válido según los parámetros iniciales.
607
+ * @param name Nombre a validar
608
+ * @returns true si es válido
609
+ */
610
+ isValidParameterName(name) {
611
+ // Verifica que el nombre esté en los parámetros iniciales
612
+ return this.initialParameters.some((param) => param.parameterName === name);
613
+ }
531
614
  /**
532
615
  * Valida que los parámetros devueltos por la API coincidan con los iniciales.
533
616
  * Muestra errores o advertencias en consola si existen diferencias.
@@ -546,21 +629,6 @@ class ParameterValuesService {
546
629
  console.warn(`Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`);
547
630
  }
548
631
  }
549
- /**
550
- * Transforma un array de ParameterSecurity en MyParameterValues
551
- * @param apiParameters Parámetros recibidos desde la API
552
- * @returns Array de MyParameterValues
553
- */
554
- mapToMyParameterValues(apiParameters) {
555
- const initialNames = this.initialParameters.map((p) => p.parameterName);
556
- return apiParameters
557
- .filter((param) => initialNames.includes(param.parameterName))
558
- .map((param) => ({
559
- parameterName: param.parameterName,
560
- values: param.parameterValues?.map((v) => v.value) ?? [],
561
- }));
562
- }
563
- /** ===================== HELPERS SEGUROS ===================== */
564
632
  /**
565
633
  * Obtiene un valor específico de un parámetro.
566
634
  * Devuelve `defaultValue` si no existe o el índice es inválido.
@@ -577,14 +645,35 @@ class ParameterValuesService {
577
645
  return param.values[index];
578
646
  }
579
647
  /**
580
- * Compara un valor específico con un valor esperado.
648
+ * Compara un valor específico con un valor esperado, usando cache para optimizar llamadas repetidas.
581
649
  * @param parameterName Nombre del parámetro
582
650
  * @param expectedValue Valor esperado
583
651
  * @param index Índice del valor dentro del array (default: 0)
584
652
  * @returns true si coincide, false en caso contrario
585
653
  */
586
654
  isParameterValue(parameterName, expectedValue, index = 0) {
587
- return this.getValue(parameterName, index) === expectedValue;
655
+ const cacheKey = `${String(parameterName)}_${index}`;
656
+ // Validación: si el parámetro no existe, muestra mensaje solo una vez y corta el flujo
657
+ const paramExists = this.dataParameter.some((p) => p.parameterName === parameterName);
658
+ if (!paramExists) {
659
+ if (!this.alertedParams.has(parameterName)) {
660
+ window.alert(`Error: El parámetro '${parameterName}' no existe.`);
661
+ this.alertedParams.add(parameterName);
662
+ }
663
+ return false;
664
+ }
665
+ if (!this.parameterCache.has(cacheKey)) {
666
+ //console.log('Parametro: ' + parameterName);
667
+ const value = this.getValue(parameterName, index);
668
+ this.parameterCache.set(cacheKey, value);
669
+ }
670
+ return this.parameterCache.get(cacheKey) === expectedValue;
671
+ }
672
+ /**
673
+ * Limpia el cache interno de comparaciones de parámetros.
674
+ */
675
+ clearParameterCache() {
676
+ this.parameterCache.clear();
588
677
  }
589
678
  /**
590
679
  * Verifica si un parámetro tiene al menos un valor.
@@ -614,7 +703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImpor
614
703
  }] });
615
704
 
616
705
  class NavbarDsxComponent {
617
- _securityService = inject(SecurityService);
706
+ //private _securityService = inject(SecurityService);
618
707
  _parameterSecurityService = inject(ParameterValuesService);
619
708
  _alertaService = inject(AlertaService);
620
709
  logoWidth = input('300', ...(ngDevMode ? [{ debugName: "logoWidth" }] : []));
@@ -659,7 +748,7 @@ class NavbarDsxComponent {
659
748
  console.error('Error al actualizar parámetros de SeguridadIT', err);
660
749
  this._alertaService.toastrAlerts(3, 'SeguridadIT', 'Error al actualizar parámetros!', 2);
661
750
  },
662
- complete: () => '',
751
+ complete: () => this._parameterSecurityService.clearParameterCache(),
663
752
  });
664
753
  }
665
754
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: NavbarDsxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -1040,13 +1129,6 @@ function createInitialCache(cacheKeys) {
1040
1129
  return Object.fromEntries(Object.values(cacheKeys).map((key) => [key, false]));
1041
1130
  }
1042
1131
 
1043
- const INITIAL_PARAMETERS_FOR_TYPE = [
1044
- 'pCreate',
1045
- 'pRead',
1046
- 'pUpdate',
1047
- 'pDelete',
1048
- ];
1049
-
1050
1132
  class DsxAddToolsModule {
1051
1133
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: DsxAddToolsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1052
1134
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.6", ngImport: i0, type: DsxAddToolsModule, imports: [JsonValuesDebujComponent], exports: [CommonModule,