ngx-dsxlibrary 1.0.61 → 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.
@@ -465,19 +465,54 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImpor
465
465
 
466
466
  /**
467
467
  * Servicio para gestionar los parámetros de seguridad de la aplicación.
468
- * Permite cargar los parámetros desde la API, mantenerlos en memoria, y acceder
469
- * 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)
470
472
  */
471
473
  class ParameterValuesService {
472
- /** 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
+ */
473
478
  initialParameters = inject(INITIAL_PARAMETERS);
474
- /** 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
+ */
475
488
  apiService = inject(SecurityService);
476
- /** Señal que contiene los parámetros cargados */
477
- _dataParameter = signal(this.initialParameters, ...(ngDevMode ? [{ debugName: "_dataParameter" }] : []));
478
- /** 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
+ */
479
496
  _loaded = false;
480
- /** ===================== 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
+ }
481
516
  /**
482
517
  * Devuelve los parámetros actuales como un array de solo lectura.
483
518
  */
@@ -496,7 +531,6 @@ class ParameterValuesService {
496
531
  }
497
532
  this._dataParameter.set(values);
498
533
  }
499
- /** ===================== MÉTODOS PRINCIPALES ===================== */
500
534
  /**
501
535
  * Carga los parámetros desde la API.
502
536
  * Si ya se cargaron y force=false, devuelve la copia en memoria.
@@ -530,7 +564,53 @@ class ParameterValuesService {
530
564
  refreshParameters() {
531
565
  return this.loadParameters(true);
532
566
  }
533
- /** ===================== 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
+ }
534
614
  /**
535
615
  * Valida que los parámetros devueltos por la API coincidan con los iniciales.
536
616
  * Muestra errores o advertencias en consola si existen diferencias.
@@ -549,21 +629,6 @@ class ParameterValuesService {
549
629
  console.warn(`Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`);
550
630
  }
551
631
  }
552
- /**
553
- * Transforma un array de ParameterSecurity en MyParameterValues
554
- * @param apiParameters Parámetros recibidos desde la API
555
- * @returns Array de MyParameterValues
556
- */
557
- mapToMyParameterValues(apiParameters) {
558
- const initialNames = this.initialParameters.map((p) => p.parameterName);
559
- return apiParameters
560
- .filter((param) => initialNames.includes(param.parameterName))
561
- .map((param) => ({
562
- parameterName: param.parameterName,
563
- values: param.parameterValues?.map((v) => v.value) ?? [],
564
- }));
565
- }
566
- /** ===================== HELPERS SEGUROS ===================== */
567
632
  /**
568
633
  * Obtiene un valor específico de un parámetro.
569
634
  * Devuelve `defaultValue` si no existe o el índice es inválido.
@@ -580,14 +645,35 @@ class ParameterValuesService {
580
645
  return param.values[index];
581
646
  }
582
647
  /**
583
- * 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.
584
649
  * @param parameterName Nombre del parámetro
585
650
  * @param expectedValue Valor esperado
586
651
  * @param index Índice del valor dentro del array (default: 0)
587
652
  * @returns true si coincide, false en caso contrario
588
653
  */
589
654
  isParameterValue(parameterName, expectedValue, index = 0) {
590
- 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();
591
677
  }
592
678
  /**
593
679
  * Verifica si un parámetro tiene al menos un valor.
@@ -617,7 +703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImpor
617
703
  }] });
618
704
 
619
705
  class NavbarDsxComponent {
620
- _securityService = inject(SecurityService);
706
+ //private _securityService = inject(SecurityService);
621
707
  _parameterSecurityService = inject(ParameterValuesService);
622
708
  _alertaService = inject(AlertaService);
623
709
  logoWidth = input('300', ...(ngDevMode ? [{ debugName: "logoWidth" }] : []));
@@ -662,7 +748,7 @@ class NavbarDsxComponent {
662
748
  console.error('Error al actualizar parámetros de SeguridadIT', err);
663
749
  this._alertaService.toastrAlerts(3, 'SeguridadIT', 'Error al actualizar parámetros!', 2);
664
750
  },
665
- complete: () => '',
751
+ complete: () => this._parameterSecurityService.clearParameterCache(),
666
752
  });
667
753
  }
668
754
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: NavbarDsxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -1043,13 +1129,6 @@ function createInitialCache(cacheKeys) {
1043
1129
  return Object.fromEntries(Object.values(cacheKeys).map((key) => [key, false]));
1044
1130
  }
1045
1131
 
1046
- const INITIAL_PARAMETERS_FOR_TYPE = [
1047
- 'pCreate',
1048
- 'pRead',
1049
- 'pUpdate',
1050
- 'pDelete',
1051
- ];
1052
-
1053
1132
  class DsxAddToolsModule {
1054
1133
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: DsxAddToolsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1055
1134
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.6", ngImport: i0, type: DsxAddToolsModule, imports: [JsonValuesDebujComponent], exports: [CommonModule,