ngx-dsxlibrary 1.0.59 → 1.0.60
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.
- package/fesm2022/ngx-dsxlibrary.mjs +172 -68
- package/fesm2022/ngx-dsxlibrary.mjs.map +1 -1
- package/index.d.ts +77 -5
- package/ngx-dsxlibrary-1.0.60.tgz +0 -0
- package/package.json +12 -12
- package/src/lib/models/index.d.ts +1 -19
- package/ngx-dsxlibrary-1.0.59.tgz +0 -0
|
@@ -14,8 +14,8 @@ import * as i1$2 from 'primeng/menubar';
|
|
|
14
14
|
import { MenubarModule } from 'primeng/menubar';
|
|
15
15
|
import { ToastrService } from 'ngx-toastr';
|
|
16
16
|
import Swal from 'sweetalert2';
|
|
17
|
+
import { of, retry, delay, map, throwError, catchError, switchMap, finalize, Observable } from 'rxjs';
|
|
17
18
|
import { HttpClient, HttpHeaders, HttpParams, HttpStatusCode, HttpErrorResponse } from '@angular/common/http';
|
|
18
|
-
import { throwError, catchError, switchMap, finalize, Observable } from 'rxjs';
|
|
19
19
|
import { JwtHelperService } from '@auth0/angular-jwt';
|
|
20
20
|
import { CookieService } from 'ngx-cookie-service';
|
|
21
21
|
import { CommonModule } from '@angular/common';
|
|
@@ -211,11 +211,11 @@ class LoadingComponent {
|
|
|
211
211
|
// Accedemos directamente a la señal del servicio
|
|
212
212
|
_spinnerService = inject(SpinnerLoadingService);
|
|
213
213
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: LoadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
214
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: LoadingComponent, isStandalone: true, selector: "app-loading", ngImport: i0, template: "<!-- Actualizaci\u00F3n 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/dsxResource/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">©DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n", styles: [".spinner-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#
|
|
214
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.6", type: LoadingComponent, isStandalone: true, selector: "app-loading", ngImport: i0, template: "<!-- Actualizaci\u00F3n 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/dsxResource/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">©DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n", styles: [".spinner-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#000000e6;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:9999}.loader{display:flex;justify-content:center;align-items:center;position:relative;cursor:not-allowed;scale:.8}.central{display:flex;justify-content:center;align-items:center;position:relative;width:10em;height:10em;border-radius:50%;box-shadow:.5em 1em 1em #8a2be2,-.5em .5em 1em #00f,.5em -.5em 1em purple,-.5em -.5em 1em #0ff;background-color:#0003}.external-shadow{width:10em;height:10em;border-radius:50%;display:flex;justify-content:center;align-items:center;position:relative;box-shadow:.5em .5em 3em #8a2be2,-.5em .5em 3em #00f,.5em -.5em 3em purple,-.5em -.5em 3em #0ff;z-index:999;animation:rotate 3s linear infinite;background-color:#21212180}@keyframes rotate{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}.spinner-image{width:70%;height:70%;border-radius:50%;object-fit:cover;position:absolute;z-index:1000}.loading-text{font-family:Montserrat,sans-serif;text-transform:uppercase;letter-spacing:3px;background:linear-gradient(45deg,#0ff,#f0f);-webkit-background-clip:text;background-clip:text;color:transparent;margin-top:1em}@keyframes pulse{0%,to{opacity:.7}50%{opacity:1}}\n"] });
|
|
215
215
|
}
|
|
216
216
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: LoadingComponent, decorators: [{
|
|
217
217
|
type: Component,
|
|
218
|
-
args: [{ selector: 'app-loading', imports: [], template: "<!-- Actualizaci\u00F3n 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/dsxResource/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">©DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n", styles: [".spinner-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#
|
|
218
|
+
args: [{ selector: 'app-loading', imports: [], template: "<!-- Actualizaci\u00F3n 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/dsxResource/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">©DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n", styles: [".spinner-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#000000e6;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:9999}.loader{display:flex;justify-content:center;align-items:center;position:relative;cursor:not-allowed;scale:.8}.central{display:flex;justify-content:center;align-items:center;position:relative;width:10em;height:10em;border-radius:50%;box-shadow:.5em 1em 1em #8a2be2,-.5em .5em 1em #00f,.5em -.5em 1em purple,-.5em -.5em 1em #0ff;background-color:#0003}.external-shadow{width:10em;height:10em;border-radius:50%;display:flex;justify-content:center;align-items:center;position:relative;box-shadow:.5em .5em 3em #8a2be2,-.5em .5em 3em #00f,.5em -.5em 3em purple,-.5em -.5em 3em #0ff;z-index:999;animation:rotate 3s linear infinite;background-color:#21212180}@keyframes rotate{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}.spinner-image{width:70%;height:70%;border-radius:50%;object-fit:cover;position:absolute;z-index:1000}.loading-text{font-family:Montserrat,sans-serif;text-transform:uppercase;letter-spacing:3px;background:linear-gradient(45deg,#0ff,#f0f);-webkit-background-clip:text;background-clip:text;color:transparent;margin-top:1em}@keyframes pulse{0%,to{opacity:.7}50%{opacity:1}}\n"] }]
|
|
219
219
|
}], ctorParameters: () => [] });
|
|
220
220
|
|
|
221
221
|
class AlertaService {
|
|
@@ -267,6 +267,7 @@ class AlertaService {
|
|
|
267
267
|
return this.preloadImage(icono).then(() => Swal.fire({
|
|
268
268
|
title: title,
|
|
269
269
|
html: text,
|
|
270
|
+
//theme: 'borderless',
|
|
270
271
|
footer: '<strong>DevSoftXela</strong> 2025',
|
|
271
272
|
imageUrl: `assets/dsxResource/${icono}`,
|
|
272
273
|
imageWidth: 150,
|
|
@@ -415,65 +416,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImpor
|
|
|
415
416
|
|
|
416
417
|
const INITIAL_PARAMETERS = new InjectionToken('InitialParameters');
|
|
417
418
|
|
|
418
|
-
class ParameterValuesService {
|
|
419
|
-
// Inyecta INITIAL_PARAMETERS usando inject()
|
|
420
|
-
initialParameters = inject(INITIAL_PARAMETERS);
|
|
421
|
-
// Inicializa con valores predeterminados usando una Signal
|
|
422
|
-
_dataParameter = signal(this.initialParameters, ...(ngDevMode ? [{ debugName: "_dataParameter" }] : []));
|
|
423
|
-
// Getter para acceder a los valores actuales
|
|
424
|
-
get dataParameter() {
|
|
425
|
-
return this._dataParameter();
|
|
426
|
-
}
|
|
427
|
-
// Setter para actualizar los valores
|
|
428
|
-
set dataParameter(values) {
|
|
429
|
-
this._dataParameter.set(values);
|
|
430
|
-
}
|
|
431
|
-
getAllParameterValues(data) {
|
|
432
|
-
// Verifica si los datos de la API son válidos
|
|
433
|
-
if (!data || !data.parameterSecurity) {
|
|
434
|
-
console.error('Los datos proporcionados desde la API no son válidos.');
|
|
435
|
-
return [];
|
|
436
|
-
}
|
|
437
|
-
// Obtén los parámetros iniciales y de la API
|
|
438
|
-
const initialParameters = this._dataParameter();
|
|
439
|
-
const apiParameters = data.parameterSecurity;
|
|
440
|
-
// Compara las cantidades
|
|
441
|
-
if (initialParameters.length !== apiParameters.length) {
|
|
442
|
-
console.warn(`Advertencia: La cantidad de parámetros inicializados (${initialParameters.length}) no coincide con la cantidad de parámetros cargados desde la API (${apiParameters.length}).`);
|
|
443
|
-
}
|
|
444
|
-
// Validación de nombres de parámetros
|
|
445
|
-
const initialParameterNames = initialParameters.map((p) => p.parameterName);
|
|
446
|
-
const apiParameterNames = apiParameters.map((p) => p.parameterName);
|
|
447
|
-
// Encuentra parámetros faltantes o adicionales
|
|
448
|
-
const missingParameters = initialParameterNames.filter((name) => !apiParameterNames.includes(name));
|
|
449
|
-
const extraParameters = apiParameterNames.filter((name) => !initialParameterNames.includes(name));
|
|
450
|
-
// Reporta discrepancias
|
|
451
|
-
if (missingParameters.length > 0) {
|
|
452
|
-
console.error(`Error: Los siguientes parámetros no se encontraron en la API: ${missingParameters.join(', ')}`);
|
|
453
|
-
}
|
|
454
|
-
if (extraParameters.length > 0) {
|
|
455
|
-
console.warn(`Advertencia: La API devolvió parámetros no esperados: ${extraParameters.join(', ')}`);
|
|
456
|
-
}
|
|
457
|
-
// Transforma los datos de la API al formato MyParameterValues
|
|
458
|
-
return apiParameters
|
|
459
|
-
.filter((param) => initialParameterNames.includes(param.parameterName))
|
|
460
|
-
.map((param) => ({
|
|
461
|
-
parameterName: param.parameterName,
|
|
462
|
-
values: param.parameterValues
|
|
463
|
-
? param.parameterValues.map((v) => v.value)
|
|
464
|
-
: [],
|
|
465
|
-
}));
|
|
466
|
-
}
|
|
467
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: ParameterValuesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
468
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: ParameterValuesService, providedIn: 'root' });
|
|
469
|
-
}
|
|
470
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: ParameterValuesService, decorators: [{
|
|
471
|
-
type: Injectable,
|
|
472
|
-
args: [{
|
|
473
|
-
providedIn: 'root',
|
|
474
|
-
}]
|
|
475
|
-
}] });
|
|
476
|
-
|
|
477
419
|
class SecurityService {
|
|
478
420
|
// Inyecta el servicio HttpClient para realizar peticiones HTTP
|
|
479
421
|
http = inject(HttpClient);
|
|
@@ -518,6 +460,159 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImpor
|
|
|
518
460
|
}]
|
|
519
461
|
}] });
|
|
520
462
|
|
|
463
|
+
/**
|
|
464
|
+
* 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.
|
|
467
|
+
*/
|
|
468
|
+
class ParameterValuesService {
|
|
469
|
+
/** Parámetros iniciales inyectados mediante INITIAL_PARAMETERS */
|
|
470
|
+
initialParameters = inject(INITIAL_PARAMETERS);
|
|
471
|
+
/** Servicio que contiene el método getParameterSecurity() */
|
|
472
|
+
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 */
|
|
476
|
+
_loaded = false;
|
|
477
|
+
/** ===================== GETTERS/SETTERS ===================== */
|
|
478
|
+
/**
|
|
479
|
+
* Devuelve los parámetros actuales como un array de solo lectura.
|
|
480
|
+
*/
|
|
481
|
+
get dataParameter() {
|
|
482
|
+
return this._dataParameter();
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Setter privado para actualizar los parámetros.
|
|
486
|
+
* Solo puede ser usado dentro del servicio para mantener la integridad de los datos.
|
|
487
|
+
* @param values Array de parámetros a almacenar
|
|
488
|
+
*/
|
|
489
|
+
setDataParameter(values) {
|
|
490
|
+
if (!Array.isArray(values)) {
|
|
491
|
+
console.error('Error: valores inválidos para dataParameter');
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
this._dataParameter.set(values);
|
|
495
|
+
}
|
|
496
|
+
/** ===================== MÉTODOS PRINCIPALES ===================== */
|
|
497
|
+
/**
|
|
498
|
+
* Carga los parámetros desde la API.
|
|
499
|
+
* Si ya se cargaron y force=false, devuelve la copia en memoria.
|
|
500
|
+
* @param force Indica si se debe forzar la recarga desde la API (default: false)
|
|
501
|
+
* @returns Observable que emite los parámetros cargados como MyParameterValues[]
|
|
502
|
+
*/
|
|
503
|
+
loadParameters(force = false) {
|
|
504
|
+
if (this._loaded && !force) {
|
|
505
|
+
return of([...this.dataParameter]); // copia mutable
|
|
506
|
+
}
|
|
507
|
+
return this.apiService.getParameterSecurity(force).pipe(retry({
|
|
508
|
+
count: 3,
|
|
509
|
+
delay: (error, retryCount) => {
|
|
510
|
+
console.warn(`Reintentando carga de parámetros (${retryCount})...`, error);
|
|
511
|
+
// espera progresiva
|
|
512
|
+
return of(null).pipe(delay(1000 * retryCount));
|
|
513
|
+
},
|
|
514
|
+
}), map((response) => {
|
|
515
|
+
const apiParameters = response.parameterSecurity ?? [];
|
|
516
|
+
this.validateParameters(apiParameters);
|
|
517
|
+
const values = this.mapToMyParameterValues(apiParameters);
|
|
518
|
+
this.setDataParameter(values);
|
|
519
|
+
this._loaded = true;
|
|
520
|
+
return values;
|
|
521
|
+
}));
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Fuerza la recarga de los parámetros desde la API.
|
|
525
|
+
* @returns Observable que emite los parámetros actualizados
|
|
526
|
+
*/
|
|
527
|
+
refreshParameters() {
|
|
528
|
+
return this.loadParameters(true);
|
|
529
|
+
}
|
|
530
|
+
/** ===================== MÉTODOS PRIVADOS ===================== */
|
|
531
|
+
/**
|
|
532
|
+
* Valida que los parámetros devueltos por la API coincidan con los iniciales.
|
|
533
|
+
* Muestra errores o advertencias en consola si existen diferencias.
|
|
534
|
+
* @param apiParameters Parámetros recibidos desde la API
|
|
535
|
+
*/
|
|
536
|
+
validateParameters(apiParameters) {
|
|
537
|
+
const initialNames = this.initialParameters.map((p) => p.parameterName);
|
|
538
|
+
const apiNames = apiParameters.map((p) => p.parameterName);
|
|
539
|
+
const missing = initialNames.filter((name) => !apiNames.includes(name));
|
|
540
|
+
const extra = apiNames.filter((name) => !initialNames.includes(name));
|
|
541
|
+
if (missing.length)
|
|
542
|
+
console.error(`Faltan en API: ${missing.join(', ')}`);
|
|
543
|
+
if (extra.length)
|
|
544
|
+
console.warn(`Extra en API: ${extra.join(', ')}`);
|
|
545
|
+
if (initialNames.length !== apiNames.length) {
|
|
546
|
+
console.warn(`Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
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
|
+
/**
|
|
565
|
+
* Obtiene un valor específico de un parámetro.
|
|
566
|
+
* Devuelve `defaultValue` si no existe o el índice es inválido.
|
|
567
|
+
* @param parameterName Nombre del parámetro
|
|
568
|
+
* @param index Índice del valor dentro del array (default: 0)
|
|
569
|
+
* @param defaultValue Valor por defecto si no existe
|
|
570
|
+
* @returns Valor del parámetro o defaultValue
|
|
571
|
+
*/
|
|
572
|
+
getValue(parameterName, index = 0, defaultValue = null) {
|
|
573
|
+
const param = this.dataParameter.find((p) => p.parameterName === parameterName);
|
|
574
|
+
if (!param || index < 0 || index >= param.values.length) {
|
|
575
|
+
return defaultValue;
|
|
576
|
+
}
|
|
577
|
+
return param.values[index];
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Compara un valor específico con un valor esperado.
|
|
581
|
+
* @param parameterName Nombre del parámetro
|
|
582
|
+
* @param expectedValue Valor esperado
|
|
583
|
+
* @param index Índice del valor dentro del array (default: 0)
|
|
584
|
+
* @returns true si coincide, false en caso contrario
|
|
585
|
+
*/
|
|
586
|
+
isParameterValue(parameterName, expectedValue, index = 0) {
|
|
587
|
+
return this.getValue(parameterName, index) === expectedValue;
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Verifica si un parámetro tiene al menos un valor.
|
|
591
|
+
* @param parameterName Nombre del parámetro
|
|
592
|
+
* @returns true si tiene al menos un valor, false si no tiene
|
|
593
|
+
*/
|
|
594
|
+
hasAnyValue(parameterName) {
|
|
595
|
+
return this.getAllValues(parameterName).length > 0;
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Devuelve todos los valores de un parámetro.
|
|
599
|
+
* @param parameterName Nombre del parámetro
|
|
600
|
+
* @returns Array de valores
|
|
601
|
+
*/
|
|
602
|
+
getAllValues(parameterName) {
|
|
603
|
+
return (this.dataParameter.find((p) => p.parameterName === parameterName)
|
|
604
|
+
?.values ?? []);
|
|
605
|
+
}
|
|
606
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: ParameterValuesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
607
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: ParameterValuesService, providedIn: 'root' });
|
|
608
|
+
}
|
|
609
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: ParameterValuesService, decorators: [{
|
|
610
|
+
type: Injectable,
|
|
611
|
+
args: [{
|
|
612
|
+
providedIn: 'root',
|
|
613
|
+
}]
|
|
614
|
+
}] });
|
|
615
|
+
|
|
521
616
|
class NavbarDsxComponent {
|
|
522
617
|
_securityService = inject(SecurityService);
|
|
523
618
|
_parameterSecurityService = inject(ParameterValuesService);
|
|
@@ -555,13 +650,15 @@ class NavbarDsxComponent {
|
|
|
555
650
|
localStorage.setItem('theme', theme);
|
|
556
651
|
}
|
|
557
652
|
actualizarSeguridadIT() {
|
|
558
|
-
this.
|
|
559
|
-
next: (
|
|
560
|
-
const values = this._parameterSecurityService.getAllParameterValues(response);
|
|
561
|
-
this._parameterSecurityService.dataParameter = values;
|
|
653
|
+
this._parameterSecurityService.refreshParameters().subscribe({
|
|
654
|
+
next: (values) => {
|
|
562
655
|
this._alertaService.toastrAlerts(2, 'SeguridadIT', 'Parametro actualizado!', 2);
|
|
656
|
+
console.log('Parámetros cargados:', values);
|
|
657
|
+
},
|
|
658
|
+
error: (err) => {
|
|
659
|
+
console.error('Error al actualizar parámetros de SeguridadIT', err);
|
|
660
|
+
this._alertaService.toastrAlerts(3, 'SeguridadIT', 'Error al actualizar parámetros!', 2);
|
|
563
661
|
},
|
|
564
|
-
error: (err) => console.log(err),
|
|
565
662
|
complete: () => '',
|
|
566
663
|
});
|
|
567
664
|
}
|
|
@@ -853,7 +950,7 @@ const httpAuthorizeInterceptor = (req, next) => {
|
|
|
853
950
|
_activeRequest++;
|
|
854
951
|
// Función para controlar el spinner.hide()
|
|
855
952
|
const hideSpinner = () => {
|
|
856
|
-
//
|
|
953
|
+
// Se debe comentarizar para evitar que se oculte el spinner inmediatamente
|
|
857
954
|
_spinnerService.hide();
|
|
858
955
|
};
|
|
859
956
|
return next(authReq).pipe(catchError((error) => {
|
|
@@ -943,6 +1040,13 @@ function createInitialCache(cacheKeys) {
|
|
|
943
1040
|
return Object.fromEntries(Object.values(cacheKeys).map((key) => [key, false]));
|
|
944
1041
|
}
|
|
945
1042
|
|
|
1043
|
+
const INITIAL_PARAMETERS_FOR_TYPE = [
|
|
1044
|
+
'pCreate',
|
|
1045
|
+
'pRead',
|
|
1046
|
+
'pUpdate',
|
|
1047
|
+
'pDelete',
|
|
1048
|
+
];
|
|
1049
|
+
|
|
946
1050
|
class DsxAddToolsModule {
|
|
947
1051
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.6", ngImport: i0, type: DsxAddToolsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
948
1052
|
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.6", ngImport: i0, type: DsxAddToolsModule, imports: [JsonValuesDebujComponent], exports: [CommonModule,
|
|
@@ -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/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/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/parameter-values.service.ts","../../../projects/ngx-dsx/src/lib/services/security.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 { Component, Input } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n imports: [TagModule],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.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 }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpModule } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpModule],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer' | '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 [options]=\"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 { 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, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\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, 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 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 // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/dsxResource/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">©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} from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n/**\r\n * Configuración personalizable para las alertas visuales\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'.\r\n * Ejemplo: 'success-icon.png'. Por defecto usa 'icon/check02.png'.\r\n *\r\n * @property icon - Tipo de icono SweetAlert2 incorporado. Valores posibles:\r\n * 'success' | 'error' | 'warning' | 'info' | 'question'.\r\n * Por defecto: 'success'.\r\n *\r\n * @property showConfirmButton - Determina si se muestra el botón de confirmación.\r\n * Cuando es true, desactiva el cierre automático.\r\n * Por defecto: false.\r\n *\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación.\r\n * Por defecto: 'Ok'.\r\n *\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta.\r\n * Se ignora si showConfirmButton es true.\r\n * Por defecto: 2000 (2 segundos).\r\n *\r\n * @property imageWidth - Ancho en píxeles para la imagen personalizada.\r\n * Por defecto: 125.\r\n *\r\n * @property imageHeight - Alto en píxeles para la imagen personalizada.\r\n * Por defecto: 125.\r\n *\r\n * @property showImage - Controla si se muestra la imagen personalizada.\r\n * Cuando es false, solo se muestra el icono de SweetAlert2.\r\n * Por defecto: true.\r\n *\r\n * @example\r\n * // Ejemplo de configuración básica\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 * // Ejemplo de alerta con botón de confirmación\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}\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 * @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 = `assets/dsxResource/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n alertConfirm(title: string, text: string, icono: string): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `assets/dsxResource/${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: `assets/dsxResource/${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 con múltiples opciones de configuración\r\n *\r\n * @param titleAlert Título principal de la alerta (requerido)\r\n * @param messageHtml Mensaje en formato HTML (requerido)\r\n * @param options Opciones configurables de la alerta (opcional)\r\n *\r\n * @returns Promise<SweetAlertResult> que se resuelve cuando el usuario interactúa con la alerta\r\n * o cuando se cierra automáticamente. Puedes usar .then() para manejar la respuesta.\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\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\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 // Valores por defecto (se pueden sobrescribir mediante options)\r\n const {\r\n icono = 'icon/check02.png', // Ruta relativa de la imagen en assets/dsxResource/\r\n icon = 'success', // Tipo de icono SweetAlert2\r\n showConfirmButton = false, // Mostrar botón de confirmación\r\n confirmButtonText = 'Ok', // Texto del botón de confirmación\r\n timer = 2000, // Tiempo de auto-cierre en ms (0 = desactivado)\r\n imageWidth = 125, // Ancho de la imagen en px\r\n imageHeight = 125, // Alto de la imagen en px\r\n showImage = true, // Mostrar imagen personalizada\r\n } = options;\r\n\r\n // Configuración base de SweetAlert\r\n const alertConfig: SweetAlertOptions = {\r\n title: titleAlert,\r\n icon,\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 ? `assets/dsxResource/${icono}` : undefined,\r\n imageWidth: showImage ? imageWidth : undefined,\r\n imageHeight: showImage ? imageHeight : undefined,\r\n imageAlt: showImage ? 'image alert' : undefined,\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 //notifyAlertSuccess(message: string) {\r\n // this._notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top'\r\n // }\r\n // });\r\n //}\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { MyParameterValues } from '../models/src/securityParameter.model';\r\n\r\nexport const INITIAL_PARAMETERS = new InjectionToken<MyParameterValues[]>(\r\n 'InitialParameters'\r\n);\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { INITIAL_PARAMETERS } from '../injections/parameterSecurity';\r\nimport {\r\n MyParameterValues,\r\n SeguridadITParameter,\r\n} from '../models/src/securityParameter.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ParameterValuesService {\r\n // Inyecta INITIAL_PARAMETERS usando inject()\r\n private initialParameters = inject(INITIAL_PARAMETERS);\r\n\r\n // Inicializa con valores predeterminados usando una Signal\r\n private _dataParameter = signal<MyParameterValues[]>(this.initialParameters);\r\n\r\n // Getter para acceder a los valores actuales\r\n get dataParameter(): MyParameterValues[] {\r\n return this._dataParameter();\r\n }\r\n\r\n // Setter para actualizar los valores\r\n set dataParameter(values: MyParameterValues[]) {\r\n this._dataParameter.set(values);\r\n }\r\n\r\n getAllParameterValues(data: SeguridadITParameter): MyParameterValues[] {\r\n // Verifica si los datos de la API son válidos\r\n if (!data || !data.parameterSecurity) {\r\n console.error('Los datos proporcionados desde la API no son válidos.');\r\n return [];\r\n }\r\n\r\n // Obtén los parámetros iniciales y de la API\r\n const initialParameters = this._dataParameter();\r\n const apiParameters = data.parameterSecurity;\r\n\r\n // Compara las cantidades\r\n if (initialParameters.length !== apiParameters.length) {\r\n console.warn(\r\n `Advertencia: La cantidad de parámetros inicializados (${initialParameters.length}) no coincide con la cantidad de parámetros cargados desde la API (${apiParameters.length}).`\r\n );\r\n }\r\n\r\n // Validación de nombres de parámetros\r\n const initialParameterNames = initialParameters.map((p) => p.parameterName);\r\n const apiParameterNames = apiParameters.map((p) => p.parameterName);\r\n\r\n // Encuentra parámetros faltantes o adicionales\r\n const missingParameters = initialParameterNames.filter(\r\n (name) => !apiParameterNames.includes(name)\r\n );\r\n const extraParameters = apiParameterNames.filter(\r\n (name) => !initialParameterNames.includes(name)\r\n );\r\n\r\n // Reporta discrepancias\r\n if (missingParameters.length > 0) {\r\n console.error(\r\n `Error: Los siguientes parámetros no se encontraron en la API: ${missingParameters.join(\r\n ', '\r\n )}`\r\n );\r\n }\r\n\r\n if (extraParameters.length > 0) {\r\n console.warn(\r\n `Advertencia: La API devolvió parámetros no esperados: ${extraParameters.join(\r\n ', '\r\n )}`\r\n );\r\n }\r\n\r\n // Transforma los datos de la API al formato MyParameterValues\r\n return apiParameters\r\n .filter((param) => initialParameterNames.includes(param.parameterName))\r\n .map((param) => ({\r\n parameterName: param.parameterName,\r\n values: param.parameterValues\r\n ? param.parameterValues.map((v) => v.value)\r\n : [],\r\n }));\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { SeguridadITParameter } from '../models/src/securityParameter.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 { 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 { MyParameterValues } from '../../models/src/securityParameter.model';\r\nimport { AlertaService } from '../../services/alerta.service';\r\nimport { ParameterValuesService } from '../../services/parameter-values.service';\r\nimport { SecurityService } from '../../services/security.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 _securityService = inject(SecurityService);\r\n _parameterSecurityService = inject(ParameterValuesService);\r\n _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._securityService.getParameterSecurity(true).subscribe({\r\n next: (response) => {\r\n const values = this._parameterSecurityService.getAllParameterValues(\r\n response\r\n ) as MyParameterValues[];\r\n this._parameterSecurityService.dataParameter = values;\r\n this._alertaService.toastrAlerts(\r\n 2,\r\n 'SeguridadIT',\r\n 'Parametro actualizado!',\r\n 2\r\n );\r\n },\r\n error: (err) => console.log(err),\r\n complete: () => '',\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 { ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n _cookieService = inject(CookieService);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n\r\n // Función para obtener opciones de cookies estándar\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isProduction,\r\n sameSite: isProduction ? 'None' : 'Lax', // sameSite: 'None',\r\n };\r\n if (isProduction) {\r\n cookieOptions.domain = '.itgtxela.com';\r\n }\r\n return cookieOptions;\r\n }\r\n // Función para establecer una cookie\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n this._cookieService.set(name, value, options);\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n //return localStorage.getItem(environment.tokenName);\r\n }\r\n\r\n getTokenRefresh(): string | null {\r\n //USO EN MODO DESARROLLO\r\n if (isDevMode()) {\r\n const tokenRefresh: string = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n const tokens: ModelToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c',\r\n refreshTokenExpiry: new Date(),\r\n };\r\n !!tokenRefresh ? null : this.tokenReload(tokens);\r\n }\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n //return localStorage.getItem(environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate\r\n );\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: ModelToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n const refreshTokenExpiryDate = new Date();\r\n refreshTokenExpiryDate.setDate(refreshTokenExpiryDate.getDate() + 7); // Refresh token expiry: 7 days\r\n\r\n // Guardar el access token y refresh token\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n\r\n // Almacenar la fecha de expiración del refresh token en localStorage\r\n const expiryDate = new Date(tokens.refreshTokenExpiry).toISOString();\r\n localStorage.setItem(this.environment.refreshTokenExpiry, expiryDate);\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n}\r\n","import { 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","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { catchError, finalize, Observable, switchMap } from 'rxjs';\r\nimport { inject } from '@angular/core';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n//Update: 2024-01-29 12:00\r\n\r\nlet _activeRequest = 0;\r\n//let isRefreshing = false; // Estado de si se está refrescando el token\r\nlet pendingRequests: any[] = []; // Cola de solicitudes pendientes\r\n\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n //console.log('------ INGRESO A HTTPINTERCEPTOR -------');\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n //Variables\r\n const _token = _authorizeService.getToken();\r\n const _tokenRefresh = _authorizeService.getTokenRefresh();\r\n\r\n //Generar la petición con el token\r\n const authReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_token}`,\r\n },\r\n });\r\n\r\n if (_activeRequest == 0) {\r\n _spinnerService.show();\r\n }\r\n\r\n _activeRequest++;\r\n\r\n // Función para controlar el spinner.hide()\r\n const hideSpinner = () => {\r\n // Solo oculta si NO está en modo depuración\r\n _spinnerService.hide();\r\n };\r\n\r\n return next(authReq).pipe(\r\n catchError((error: HttpErrorResponse): Observable<HttpEvent<any>> => {\r\n // Si el error es 401\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Si no hay refreshToken, finalizar la sesión\r\n if (!_tokenRefresh) {\r\n hideSpinner();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco no está disponible.',\r\n })\r\n );\r\n }\r\n\r\n // Intentar refrescar el token si no se está haciendo ya\r\n if (!_authorizeService.isRefreshing) {\r\n // Marcamos que se está refrescando el token\r\n _authorizeService.isRefreshing = true;\r\n\r\n // Intentar refrescar el token\r\n return _securityService.tokenRefresh(_tokenRefresh).pipe(\r\n switchMap((response: ModelToken) => {\r\n if (!response.token || !response.tokenRefresh) {\r\n hideSpinner();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco ha expirado.',\r\n })\r\n );\r\n }\r\n\r\n // Recargar el token en el servicio\r\n _authorizeService.tokenReload(response);\r\n\r\n // Generar una nueva solicitud con el token actualizado\r\n const newReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n });\r\n\r\n // Refresco completado\r\n _authorizeService.isRefreshing = false;\r\n\r\n pendingRequests.forEach((pendingReq) => {\r\n const clonedReq = pendingReq.authReq.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_authorizeService.getToken()}`,\r\n },\r\n });\r\n\r\n // Volver a ejecutar las solicitudes pendientes con el nuevo token\r\n next(clonedReq).subscribe({\r\n next: pendingReq.next,\r\n error: pendingReq.error,\r\n complete: pendingReq.complete,\r\n });\r\n });\r\n pendingRequests = []; // Limpiar la cola\r\n\r\n return next(newReq); // Procesar la solicitud original con el nuevo token\r\n }),\r\n catchError((refreshError: HttpErrorResponse) => {\r\n // Finalizamos el refresco si hay error\r\n _authorizeService.isRefreshing = false;\r\n hideSpinner();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'Error al refrescar el token. Redirigiendo al login.',\r\n })\r\n );\r\n }),\r\n finalize(() => {\r\n _authorizeService.isRefreshing = false;\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, añadir la solicitud a la cola\r\n return new Observable((observer) => {\r\n pendingRequests.push({\r\n authReq,\r\n next: observer.next.bind(observer),\r\n error: observer.error.bind(observer),\r\n complete: observer.complete.bind(observer),\r\n });\r\n });\r\n }\r\n }\r\n // Si no es un error 401, manejar otros errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n hideSpinner();\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\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [JsonValuesDebujComponent],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n JsonValuesDebujComponent,\r\n ReactiveFormsModule,\r\n ],\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 { MessageService } from 'primeng/api';\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 { FieldsetModule } from 'primeng/fieldset';\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 { 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 FieldsetModule,\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 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: [MessageService],\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)}/GetListar/${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)}/GetID/${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)}/PutSave`,\r\n values\r\n );\r\n }\r\n\r\n delete(\r\n endpoint: string,\r\n values: T,\r\n softDelete: boolean = true\r\n ): Observable<ResponseHttpModel> {\r\n return this.http.put<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/PutDelete/${softDelete}`,\r\n values\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 moment from 'moment-timezone';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport {\r\n FechasConversion,\r\n FilterOption,\r\n TipoFechaConversion,\r\n typeModel,\r\n} from '../models/src/extensions.model';\r\nimport { FieldConfig } from '../models/src/field-config.model';\r\nimport { AlertaService } from './alerta.service';\r\nimport { Observable } from 'rxjs';\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\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 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 modelo 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 - Un array de 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'` o `'zh'`).\r\n * @param fieldName - (Opcional) El nombre de un campo específico en el formulario que contiene los datos. Si no se proporciona, se obtendrán todos los valores del formulario.\r\n * @returns Un objeto del tipo `typeModel<T>` que contiene un array `values` con los datos procesados y las conversiones de fecha aplicadas.\r\n * @throws Error - Si el campo especificado no existe en el formulario, o si un campo de fecha especificado no existe en los datos.\r\n */\r\n sanitizarModelo<T>(\r\n form: any,\r\n campos: FechasConversion[],\r\n fieldName?: string\r\n ): typeModel<T> {\r\n // Obtén los valores del formulario: un campo específico o todos los valores\r\n const rawData = fieldName\r\n ? form.get(fieldName)?.getRawValue()\r\n : form.getRawValue();\r\n\r\n if (!rawData) {\r\n const errorMessage = fieldName\r\n ? `El campo \"${fieldName}\" no existe en el formulario.`\r\n : `El formulario no tiene valores.`;\r\n throw new Error(errorMessage);\r\n }\r\n\r\n // Procesa los valores sin envolver en un arreglo\r\n const updatedValue = { ...rawData }; // Esto es un objeto, no un array\r\n\r\n // Itera sobre los campos de fecha especificados para realizar las conversiones\r\n campos.forEach(({ nombre, tipo }) => {\r\n // Verifica si el campo de fecha existe en el valor\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el valor.`);\r\n }\r\n\r\n // Realiza la conversión de la fecha si tiene un valor\r\n updatedValue[nombre] = updatedValue[nombre]\r\n ? this.convertirFecha(updatedValue[nombre], tipo) // Llama a la función genérica de conversión\r\n : null;\r\n });\r\n\r\n // Retorna el objeto con los valores procesados, no un arreglo\r\n return updatedValue; // Devuelves un objeto con los valores, no un array\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. Actualmente soporta:\r\n * - `'short'`: Convierte la fecha a un formato corto (día/mes/año).\r\n * - `'zh'`: Convierte la fecha considerando la zona horaria configurada.\r\n * @returns La fecha convertida como string según el tipo especificado.\r\n * @throws Error - Si el tipo de conversión no es válido o soportado.\r\n */\r\n private convertirFecha(\r\n fecha: string,\r\n tipo: TipoFechaConversion\r\n ): 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 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 *\r\n * @param message - Texto que se desea mostrar en consola\r\n * solo se visualiza en desarrollo para evitar mostrar información innecesaria en producción\r\n */\r\n logIfNotProduction(message: any): void {\r\n if (!this.environment.production) {\r\n console.log(message);\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 * 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","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/json-values-debuj/json-values-debuj.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/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/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"],"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/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/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/models/src/securityParameter.model.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 { Component, Input } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n imports: [TagModule],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.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 }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpModule } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpModule],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer' | '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 [options]=\"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 { 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, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\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, 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 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 // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/dsxResource/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">©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} from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n/**\r\n * Configuración personalizable para las alertas visuales\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'.\r\n * Ejemplo: 'success-icon.png'. Por defecto usa 'icon/check02.png'.\r\n *\r\n * @property icon - Tipo de icono SweetAlert2 incorporado. Valores posibles:\r\n * 'success' | 'error' | 'warning' | 'info' | 'question'.\r\n * Por defecto: 'success'.\r\n *\r\n * @property showConfirmButton - Determina si se muestra el botón de confirmación.\r\n * Cuando es true, desactiva el cierre automático.\r\n * Por defecto: false.\r\n *\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación.\r\n * Por defecto: 'Ok'.\r\n *\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta.\r\n * Se ignora si showConfirmButton es true.\r\n * Por defecto: 2000 (2 segundos).\r\n *\r\n * @property imageWidth - Ancho en píxeles para la imagen personalizada.\r\n * Por defecto: 125.\r\n *\r\n * @property imageHeight - Alto en píxeles para la imagen personalizada.\r\n * Por defecto: 125.\r\n *\r\n * @property showImage - Controla si se muestra la imagen personalizada.\r\n * Cuando es false, solo se muestra el icono de SweetAlert2.\r\n * Por defecto: true.\r\n *\r\n * @example\r\n * // Ejemplo de configuración básica\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 * // Ejemplo de alerta con botón de confirmación\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}\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 * @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 = `assets/dsxResource/${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: `assets/dsxResource/${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: `assets/dsxResource/${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 con múltiples opciones de configuración\r\n *\r\n * @param titleAlert Título principal de la alerta (requerido)\r\n * @param messageHtml Mensaje en formato HTML (requerido)\r\n * @param options Opciones configurables de la alerta (opcional)\r\n *\r\n * @returns Promise<SweetAlertResult> que se resuelve cuando el usuario interactúa con la alerta\r\n * o cuando se cierra automáticamente. Puedes usar .then() para manejar la respuesta.\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\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\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 // Valores por defecto (se pueden sobrescribir mediante options)\r\n const {\r\n icono = 'icon/check02.png', // Ruta relativa de la imagen en assets/dsxResource/\r\n icon = 'success', // Tipo de icono SweetAlert2\r\n showConfirmButton = false, // Mostrar botón de confirmación\r\n confirmButtonText = 'Ok', // Texto del botón de confirmación\r\n timer = 2000, // Tiempo de auto-cierre en ms (0 = desactivado)\r\n imageWidth = 125, // Ancho de la imagen en px\r\n imageHeight = 125, // Alto de la imagen en px\r\n showImage = true, // Mostrar imagen personalizada\r\n } = options;\r\n\r\n // Configuración base de SweetAlert\r\n const alertConfig: SweetAlertOptions = {\r\n title: titleAlert,\r\n icon,\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 ? `assets/dsxResource/${icono}` : undefined,\r\n imageWidth: showImage ? imageWidth : undefined,\r\n imageHeight: showImage ? imageHeight : undefined,\r\n imageAlt: showImage ? 'image alert' : undefined,\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 //notifyAlertSuccess(message: string) {\r\n // this._notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top'\r\n // }\r\n // });\r\n //}\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { MyParameterValues } from '../models/src/securityParameter.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/securityParameter.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 { count, delay, map, Observable, of, retry } from 'rxjs';\r\nimport { INITIAL_PARAMETERS } from '../injections/parameterSecurity';\r\nimport {\r\n MyParameterValues,\r\n ParameterName,\r\n ParameterSecurity,\r\n} from '../models/src/securityParameter.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, y acceder\r\n * a sus valores de forma segura evitando `undefined` en los componentes.\r\n */\r\nexport class ParameterValuesService {\r\n /** Parámetros iniciales inyectados mediante INITIAL_PARAMETERS */\r\n private initialParameters = inject(INITIAL_PARAMETERS);\r\n\r\n /** Servicio que contiene el método getParameterSecurity() */\r\n private apiService = inject(SecurityService);\r\n\r\n /** Señal que contiene los parámetros cargados */\r\n private _dataParameter = signal<MyParameterValues[]>(this.initialParameters);\r\n\r\n /** Flag que indica si ya se cargaron los parámetros desde la API */\r\n private _loaded = false;\r\n\r\n /** ===================== GETTERS/SETTERS ===================== */\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[]> {\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[]): 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 /** ===================== MÉTODOS PRINCIPALES ===================== */\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[]> {\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 retry({\r\n count: 3,\r\n delay: (error, retryCount) => {\r\n console.warn(\r\n `Reintentando carga de parámetros (${retryCount})...`,\r\n error\r\n );\r\n // espera progresiva\r\n return of(null).pipe(delay(1000 * retryCount));\r\n },\r\n }),\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 = true;\r\n return values;\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[]> {\r\n return this.loadParameters(true);\r\n }\r\n\r\n /** ===================== MÉTODOS PRIVADOS ===================== */\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) console.error(`Faltan en API: ${missing.join(', ')}`);\r\n if (extra.length) console.warn(`Extra en API: ${extra.join(', ')}`);\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 * Transforma un array de ParameterSecurity en MyParameterValues\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[] {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n return apiParameters\r\n .filter((param) => initialNames.includes(param.parameterName))\r\n .map((param) => ({\r\n parameterName: param.parameterName,\r\n values: param.parameterValues?.map((v) => v.value) ?? [],\r\n }));\r\n }\r\n\r\n /** ===================== HELPERS SEGUROS ===================== */\r\n\r\n /**\r\n * Obtiene un valor específico de un parámetro.\r\n * Devuelve `defaultValue` si no existe o el índice es inválido.\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\r\n * @returns Valor del parámetro o defaultValue\r\n */\r\n getValue<T = any>(\r\n parameterName: ParameterName,\r\n index = 0,\r\n defaultValue: T | null = null\r\n ): T {\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n if (!param || index < 0 || index >= param.values.length) {\r\n return defaultValue as T;\r\n }\r\n return param.values[index] as T;\r\n }\r\n\r\n /**\r\n * Compara un valor específico con un valor esperado.\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<T = any>(\r\n parameterName: ParameterName,\r\n expectedValue: T,\r\n index = 0\r\n ): boolean {\r\n return this.getValue<T>(parameterName, index) === expectedValue;\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: ParameterName): 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<T = any>(parameterName: ParameterName): T[] {\r\n return (this.dataParameter.find((p) => p.parameterName === parameterName)\r\n ?.values ?? []) as T[];\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 { MyParameterValues } from '../../models/src/securityParameter.model';\r\nimport { AlertaService } from '../../services/alerta.service';\r\nimport { ParameterValuesService } from '../../services/parameter-values.service';\r\nimport { SecurityService } from '../../services/security.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 _securityService = inject(SecurityService);\r\n _parameterSecurityService = inject(ParameterValuesService);\r\n _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: () => '',\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 { ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n _cookieService = inject(CookieService);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n\r\n // Función para obtener opciones de cookies estándar\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isProduction,\r\n sameSite: isProduction ? 'None' : 'Lax', // sameSite: 'None',\r\n };\r\n if (isProduction) {\r\n cookieOptions.domain = '.itgtxela.com';\r\n }\r\n return cookieOptions;\r\n }\r\n // Función para establecer una cookie\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n this._cookieService.set(name, value, options);\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n //return localStorage.getItem(environment.tokenName);\r\n }\r\n\r\n getTokenRefresh(): string | null {\r\n //USO EN MODO DESARROLLO\r\n if (isDevMode()) {\r\n const tokenRefresh: string = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n const tokens: ModelToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c',\r\n refreshTokenExpiry: new Date(),\r\n };\r\n !!tokenRefresh ? null : this.tokenReload(tokens);\r\n }\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n //return localStorage.getItem(environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate\r\n );\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: ModelToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n const refreshTokenExpiryDate = new Date();\r\n refreshTokenExpiryDate.setDate(refreshTokenExpiryDate.getDate() + 7); // Refresh token expiry: 7 days\r\n\r\n // Guardar el access token y refresh token\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n\r\n // Almacenar la fecha de expiración del refresh token en localStorage\r\n const expiryDate = new Date(tokens.refreshTokenExpiry).toISOString();\r\n localStorage.setItem(this.environment.refreshTokenExpiry, expiryDate);\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n}\r\n","import { 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","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { catchError, finalize, Observable, switchMap } from 'rxjs';\r\nimport { inject } from '@angular/core';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n//Update: 2024-01-29 12:00\r\n\r\nlet _activeRequest = 0;\r\n//let isRefreshing = false; // Estado de si se está refrescando el token\r\nlet pendingRequests: any[] = []; // Cola de solicitudes pendientes\r\n\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n //console.log('------ INGRESO A HTTPINTERCEPTOR -------');\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n //Variables\r\n const _token = _authorizeService.getToken();\r\n const _tokenRefresh = _authorizeService.getTokenRefresh();\r\n\r\n //Generar la petición con el token\r\n const authReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_token}`,\r\n },\r\n });\r\n\r\n if (_activeRequest == 0) {\r\n _spinnerService.show();\r\n }\r\n\r\n _activeRequest++;\r\n\r\n // Función para controlar el spinner.hide()\r\n const hideSpinner = () => {\r\n // Se debe comentarizar para evitar que se oculte el spinner inmediatamente\r\n _spinnerService.hide();\r\n };\r\n\r\n return next(authReq).pipe(\r\n catchError((error: HttpErrorResponse): Observable<HttpEvent<any>> => {\r\n // Si el error es 401\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Si no hay refreshToken, finalizar la sesión\r\n if (!_tokenRefresh) {\r\n hideSpinner();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco no está disponible.',\r\n })\r\n );\r\n }\r\n\r\n // Intentar refrescar el token si no se está haciendo ya\r\n if (!_authorizeService.isRefreshing) {\r\n // Marcamos que se está refrescando el token\r\n _authorizeService.isRefreshing = true;\r\n\r\n // Intentar refrescar el token\r\n return _securityService.tokenRefresh(_tokenRefresh).pipe(\r\n switchMap((response: ModelToken) => {\r\n if (!response.token || !response.tokenRefresh) {\r\n hideSpinner();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco ha expirado.',\r\n })\r\n );\r\n }\r\n\r\n // Recargar el token en el servicio\r\n _authorizeService.tokenReload(response);\r\n\r\n // Generar una nueva solicitud con el token actualizado\r\n const newReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n });\r\n\r\n // Refresco completado\r\n _authorizeService.isRefreshing = false;\r\n\r\n pendingRequests.forEach((pendingReq) => {\r\n const clonedReq = pendingReq.authReq.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_authorizeService.getToken()}`,\r\n },\r\n });\r\n\r\n // Volver a ejecutar las solicitudes pendientes con el nuevo token\r\n next(clonedReq).subscribe({\r\n next: pendingReq.next,\r\n error: pendingReq.error,\r\n complete: pendingReq.complete,\r\n });\r\n });\r\n pendingRequests = []; // Limpiar la cola\r\n\r\n return next(newReq); // Procesar la solicitud original con el nuevo token\r\n }),\r\n catchError((refreshError: HttpErrorResponse) => {\r\n // Finalizamos el refresco si hay error\r\n _authorizeService.isRefreshing = false;\r\n hideSpinner();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'Error al refrescar el token. Redirigiendo al login.',\r\n })\r\n );\r\n }),\r\n finalize(() => {\r\n _authorizeService.isRefreshing = false;\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, añadir la solicitud a la cola\r\n return new Observable((observer) => {\r\n pendingRequests.push({\r\n authReq,\r\n next: observer.next.bind(observer),\r\n error: observer.error.bind(observer),\r\n complete: observer.complete.bind(observer),\r\n });\r\n });\r\n }\r\n }\r\n // Si no es un error 401, manejar otros errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n hideSpinner();\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","const INITIAL_PARAMETERS_FOR_TYPE = [\r\n 'pCreate',\r\n 'pRead',\r\n 'pUpdate',\r\n 'pDelete',\r\n] as const;\r\n\r\nexport interface ParameterValue {\r\n value: number;\r\n}\r\n\r\nexport interface ParameterSecurity {\r\n parameterName: string;\r\n parameterValues: ParameterValue[];\r\n}\r\n\r\nexport interface SeguridadITParameter {\r\n sistemaId: number;\r\n sistema: string;\r\n parameterBase: string | null;\r\n parameterSecurity: ParameterSecurity[];\r\n}\r\n\r\nexport interface MyParameterValues {\r\n parameterName: string;\r\n values: (string | number | boolean)[];\r\n}\r\n\r\n// Creamos un tipo con los nombres\r\nexport type ParameterName = (typeof INITIAL_PARAMETERS_FOR_TYPE)[number];\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\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [JsonValuesDebujComponent],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n JsonValuesDebujComponent,\r\n ReactiveFormsModule,\r\n ],\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 { MessageService } from 'primeng/api';\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 { FieldsetModule } from 'primeng/fieldset';\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 { 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 FieldsetModule,\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 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: [MessageService],\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)}/GetListar/${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)}/GetID/${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)}/PutSave`,\r\n values\r\n );\r\n }\r\n\r\n delete(\r\n endpoint: string,\r\n values: T,\r\n softDelete: boolean = true\r\n ): Observable<ResponseHttpModel> {\r\n return this.http.put<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/PutDelete/${softDelete}`,\r\n values\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 moment from 'moment-timezone';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport {\r\n FechasConversion,\r\n FilterOption,\r\n TipoFechaConversion,\r\n typeModel,\r\n} from '../models/src/extensions.model';\r\nimport { FieldConfig } from '../models/src/field-config.model';\r\nimport { AlertaService } from './alerta.service';\r\nimport { Observable } from 'rxjs';\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\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 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 modelo 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 - Un array de 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'` o `'zh'`).\r\n * @param fieldName - (Opcional) El nombre de un campo específico en el formulario que contiene los datos. Si no se proporciona, se obtendrán todos los valores del formulario.\r\n * @returns Un objeto del tipo `typeModel<T>` que contiene un array `values` con los datos procesados y las conversiones de fecha aplicadas.\r\n * @throws Error - Si el campo especificado no existe en el formulario, o si un campo de fecha especificado no existe en los datos.\r\n */\r\n sanitizarModelo<T>(\r\n form: any,\r\n campos: FechasConversion[],\r\n fieldName?: string\r\n ): typeModel<T> {\r\n // Obtén los valores del formulario: un campo específico o todos los valores\r\n const rawData = fieldName\r\n ? form.get(fieldName)?.getRawValue()\r\n : form.getRawValue();\r\n\r\n if (!rawData) {\r\n const errorMessage = fieldName\r\n ? `El campo \"${fieldName}\" no existe en el formulario.`\r\n : `El formulario no tiene valores.`;\r\n throw new Error(errorMessage);\r\n }\r\n\r\n // Procesa los valores sin envolver en un arreglo\r\n const updatedValue = { ...rawData }; // Esto es un objeto, no un array\r\n\r\n // Itera sobre los campos de fecha especificados para realizar las conversiones\r\n campos.forEach(({ nombre, tipo }) => {\r\n // Verifica si el campo de fecha existe en el valor\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el valor.`);\r\n }\r\n\r\n // Realiza la conversión de la fecha si tiene un valor\r\n updatedValue[nombre] = updatedValue[nombre]\r\n ? this.convertirFecha(updatedValue[nombre], tipo) // Llama a la función genérica de conversión\r\n : null;\r\n });\r\n\r\n // Retorna el objeto con los valores procesados, no un arreglo\r\n return updatedValue; // Devuelves un objeto con los valores, no un array\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. Actualmente soporta:\r\n * - `'short'`: Convierte la fecha a un formato corto (día/mes/año).\r\n * - `'zh'`: Convierte la fecha considerando la zona horaria configurada.\r\n * @returns La fecha convertida como string según el tipo especificado.\r\n * @throws Error - Si el tipo de conversión no es válido o soportado.\r\n */\r\n private convertirFecha(\r\n fecha: string,\r\n tipo: TipoFechaConversion\r\n ): 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 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 *\r\n * @param message - Texto que se desea mostrar en consola\r\n * solo se visualiza en desarrollo para evitar mostrar información innecesaria en producción\r\n */\r\n logIfNotProduction(message: any): void {\r\n if (!this.environment.production) {\r\n console.log(message);\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 * 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","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/json-values-debuj/json-values-debuj.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/securityParameter.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/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"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -207,6 +207,7 @@ declare class AlertaService {
|
|
|
207
207
|
static ɵprov: i0.ɵɵInjectableDeclaration<AlertaService>;
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
+
declare const INITIAL_PARAMETERS_FOR_TYPE: readonly ["pCreate", "pRead", "pUpdate", "pDelete"];
|
|
210
211
|
interface ParameterValue {
|
|
211
212
|
value: number;
|
|
212
213
|
}
|
|
@@ -222,15 +223,86 @@ interface SeguridadITParameter {
|
|
|
222
223
|
}
|
|
223
224
|
interface MyParameterValues {
|
|
224
225
|
parameterName: string;
|
|
225
|
-
values: number[];
|
|
226
|
+
values: (string | number | boolean)[];
|
|
226
227
|
}
|
|
228
|
+
type ParameterName = (typeof INITIAL_PARAMETERS_FOR_TYPE)[number];
|
|
227
229
|
|
|
228
230
|
declare class ParameterValuesService {
|
|
231
|
+
/** Parámetros iniciales inyectados mediante INITIAL_PARAMETERS */
|
|
229
232
|
private initialParameters;
|
|
233
|
+
/** Servicio que contiene el método getParameterSecurity() */
|
|
234
|
+
private apiService;
|
|
235
|
+
/** Señal que contiene los parámetros cargados */
|
|
230
236
|
private _dataParameter;
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
237
|
+
/** Flag que indica si ya se cargaron los parámetros desde la API */
|
|
238
|
+
private _loaded;
|
|
239
|
+
/** ===================== GETTERS/SETTERS ===================== */
|
|
240
|
+
/**
|
|
241
|
+
* Devuelve los parámetros actuales como un array de solo lectura.
|
|
242
|
+
*/
|
|
243
|
+
get dataParameter(): Readonly<MyParameterValues[]>;
|
|
244
|
+
/**
|
|
245
|
+
* Setter privado para actualizar los parámetros.
|
|
246
|
+
* Solo puede ser usado dentro del servicio para mantener la integridad de los datos.
|
|
247
|
+
* @param values Array de parámetros a almacenar
|
|
248
|
+
*/
|
|
249
|
+
private setDataParameter;
|
|
250
|
+
/** ===================== MÉTODOS PRINCIPALES ===================== */
|
|
251
|
+
/**
|
|
252
|
+
* Carga los parámetros desde la API.
|
|
253
|
+
* Si ya se cargaron y force=false, devuelve la copia en memoria.
|
|
254
|
+
* @param force Indica si se debe forzar la recarga desde la API (default: false)
|
|
255
|
+
* @returns Observable que emite los parámetros cargados como MyParameterValues[]
|
|
256
|
+
*/
|
|
257
|
+
loadParameters(force?: boolean): Observable<MyParameterValues[]>;
|
|
258
|
+
/**
|
|
259
|
+
* Fuerza la recarga de los parámetros desde la API.
|
|
260
|
+
* @returns Observable que emite los parámetros actualizados
|
|
261
|
+
*/
|
|
262
|
+
refreshParameters(): Observable<MyParameterValues[]>;
|
|
263
|
+
/** ===================== MÉTODOS PRIVADOS ===================== */
|
|
264
|
+
/**
|
|
265
|
+
* Valida que los parámetros devueltos por la API coincidan con los iniciales.
|
|
266
|
+
* Muestra errores o advertencias en consola si existen diferencias.
|
|
267
|
+
* @param apiParameters Parámetros recibidos desde la API
|
|
268
|
+
*/
|
|
269
|
+
private validateParameters;
|
|
270
|
+
/**
|
|
271
|
+
* Transforma un array de ParameterSecurity en MyParameterValues
|
|
272
|
+
* @param apiParameters Parámetros recibidos desde la API
|
|
273
|
+
* @returns Array de MyParameterValues
|
|
274
|
+
*/
|
|
275
|
+
private mapToMyParameterValues;
|
|
276
|
+
/** ===================== HELPERS SEGUROS ===================== */
|
|
277
|
+
/**
|
|
278
|
+
* Obtiene un valor específico de un parámetro.
|
|
279
|
+
* Devuelve `defaultValue` si no existe o el índice es inválido.
|
|
280
|
+
* @param parameterName Nombre del parámetro
|
|
281
|
+
* @param index Índice del valor dentro del array (default: 0)
|
|
282
|
+
* @param defaultValue Valor por defecto si no existe
|
|
283
|
+
* @returns Valor del parámetro o defaultValue
|
|
284
|
+
*/
|
|
285
|
+
getValue<T = any>(parameterName: ParameterName, index?: number, defaultValue?: T | null): T;
|
|
286
|
+
/**
|
|
287
|
+
* Compara un valor específico con un valor esperado.
|
|
288
|
+
* @param parameterName Nombre del parámetro
|
|
289
|
+
* @param expectedValue Valor esperado
|
|
290
|
+
* @param index Índice del valor dentro del array (default: 0)
|
|
291
|
+
* @returns true si coincide, false en caso contrario
|
|
292
|
+
*/
|
|
293
|
+
isParameterValue<T = any>(parameterName: ParameterName, expectedValue: T, index?: number): boolean;
|
|
294
|
+
/**
|
|
295
|
+
* Verifica si un parámetro tiene al menos un valor.
|
|
296
|
+
* @param parameterName Nombre del parámetro
|
|
297
|
+
* @returns true si tiene al menos un valor, false si no tiene
|
|
298
|
+
*/
|
|
299
|
+
hasAnyValue(parameterName: ParameterName): boolean;
|
|
300
|
+
/**
|
|
301
|
+
* Devuelve todos los valores de un parámetro.
|
|
302
|
+
* @param parameterName Nombre del parámetro
|
|
303
|
+
* @returns Array de valores
|
|
304
|
+
*/
|
|
305
|
+
getAllValues<T = any>(parameterName: ParameterName): T[];
|
|
234
306
|
static ɵfac: i0.ɵɵFactoryDeclaration<ParameterValuesService, never>;
|
|
235
307
|
static ɵprov: i0.ɵɵInjectableDeclaration<ParameterValuesService>;
|
|
236
308
|
}
|
|
@@ -695,4 +767,4 @@ declare function nitValidator(control: AbstractControl): ValidationErrors | null
|
|
|
695
767
|
declare function cuiValidator(control: AbstractControl): ValidationErrors | null;
|
|
696
768
|
|
|
697
769
|
export { AlertaService, AppMessageErrorComponent, AuthorizeService, CACHE_KEYS, CacheService, DsxAddToolsModule, ENVIRONMENT, EndpointService, INITIAL_PARAMETERS, JsonHighlightPipe, JsonValuesDebujComponent, KpicardComponent, LoadingComponent, NavbarDsxComponent, OnlyRangoPatternDirective, ParameterValuesService, PrimeNgModule, SecurityService, SelectAllOnFocusDirective, TruncatePipe, UtilityAddService, atLeastOneFieldRequiredValidator, createInitialCache, createTypedCacheProvider, cuiValidator, dateMinMaxValidator, dateRangeValidator, httpAuthorizeInterceptor, nitValidator };
|
|
698
|
-
export type { Column, EnvironmentConfig, ExportColumn, FechasConversion, FieldConfig, FilterOption, InferCacheKeyType, InferCacheOptions, MyParameterValues, ParameterSecurity, ParameterValue, ResponseHttpModel, SeguridadITParameter, T, TipoFechaConversion, typeModel };
|
|
770
|
+
export type { Column, EnvironmentConfig, ExportColumn, FechasConversion, FieldConfig, FilterOption, InferCacheKeyType, InferCacheOptions, MyParameterValues, ParameterName, ParameterSecurity, ParameterValue, ResponseHttpModel, SeguridadITParameter, T, TipoFechaConversion, typeModel };
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngx-dsxlibrary",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.60",
|
|
4
4
|
"description": "Libreria para control de código automatizado.",
|
|
5
5
|
"author": "DevSoftXela",
|
|
6
6
|
"dependencies": {
|
|
@@ -21,6 +21,10 @@
|
|
|
21
21
|
"types": "./src/lib/components/index.d.ts",
|
|
22
22
|
"default": "./fesm2022/ngx-dsxlibrary-src-lib-components.mjs"
|
|
23
23
|
},
|
|
24
|
+
"./src/lib/injections": {
|
|
25
|
+
"types": "./src/lib/injections/index.d.ts",
|
|
26
|
+
"default": "./fesm2022/ngx-dsxlibrary-src-lib-injections.mjs"
|
|
27
|
+
},
|
|
24
28
|
"./src/lib/directives": {
|
|
25
29
|
"types": "./src/lib/directives/index.d.ts",
|
|
26
30
|
"default": "./fesm2022/ngx-dsxlibrary-src-lib-directives.mjs"
|
|
@@ -29,29 +33,25 @@
|
|
|
29
33
|
"types": "./src/lib/interceptors/index.d.ts",
|
|
30
34
|
"default": "./fesm2022/ngx-dsxlibrary-src-lib-interceptors.mjs"
|
|
31
35
|
},
|
|
32
|
-
"./src/lib/injections": {
|
|
33
|
-
"types": "./src/lib/injections/index.d.ts",
|
|
34
|
-
"default": "./fesm2022/ngx-dsxlibrary-src-lib-injections.mjs"
|
|
35
|
-
},
|
|
36
36
|
"./src/lib/models": {
|
|
37
37
|
"types": "./src/lib/models/index.d.ts",
|
|
38
38
|
"default": "./fesm2022/ngx-dsxlibrary-src-lib-models.mjs"
|
|
39
39
|
},
|
|
40
|
-
"./src/lib/pipe": {
|
|
41
|
-
"types": "./src/lib/pipe/index.d.ts",
|
|
42
|
-
"default": "./fesm2022/ngx-dsxlibrary-src-lib-pipe.mjs"
|
|
43
|
-
},
|
|
44
40
|
"./src/lib/modules": {
|
|
45
41
|
"types": "./src/lib/modules/index.d.ts",
|
|
46
42
|
"default": "./fesm2022/ngx-dsxlibrary-src-lib-modules.mjs"
|
|
47
43
|
},
|
|
48
|
-
"./src/lib/
|
|
49
|
-
"types": "./src/lib/
|
|
50
|
-
"default": "./fesm2022/ngx-dsxlibrary-src-lib-
|
|
44
|
+
"./src/lib/pipe": {
|
|
45
|
+
"types": "./src/lib/pipe/index.d.ts",
|
|
46
|
+
"default": "./fesm2022/ngx-dsxlibrary-src-lib-pipe.mjs"
|
|
51
47
|
},
|
|
52
48
|
"./src/lib/services": {
|
|
53
49
|
"types": "./src/lib/services/index.d.ts",
|
|
54
50
|
"default": "./fesm2022/ngx-dsxlibrary-src-lib-services.mjs"
|
|
51
|
+
},
|
|
52
|
+
"./src/lib/validations": {
|
|
53
|
+
"types": "./src/lib/validations/index.d.ts",
|
|
54
|
+
"default": "./fesm2022/ngx-dsxlibrary-src-lib-validations.mjs"
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
}
|
|
@@ -59,23 +59,5 @@ interface ResponseHttpModel {
|
|
|
59
59
|
isAdmin: boolean;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
interface ParameterValue {
|
|
63
|
-
value: number;
|
|
64
|
-
}
|
|
65
|
-
interface ParameterSecurity {
|
|
66
|
-
parameterName: string;
|
|
67
|
-
parameterValues: ParameterValue[];
|
|
68
|
-
}
|
|
69
|
-
interface SeguridadITParameter {
|
|
70
|
-
sistemaId: number;
|
|
71
|
-
sistema: string;
|
|
72
|
-
parameterBase: string | null;
|
|
73
|
-
parameterSecurity: ParameterSecurity[];
|
|
74
|
-
}
|
|
75
|
-
interface MyParameterValues {
|
|
76
|
-
parameterName: string;
|
|
77
|
-
values: number[];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
62
|
export { createInitialCache };
|
|
81
|
-
export type { Column, ExportColumn, FechasConversion, FieldConfig, FilterOption, InferCacheKeyType, InferCacheOptions,
|
|
63
|
+
export type { Column, ExportColumn, FechasConversion, FieldConfig, FilterOption, InferCacheKeyType, InferCacheOptions, ResponseHttpModel, T, TipoFechaConversion, typeModel };
|
|
Binary file
|