ngx-dsxlibrary 1.0.10 → 1.0.12

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.
@@ -1,93 +1,4 @@
1
- /**
2
- * Valida que el control contenga un rango de fechas válido (dos fechas no nulas y válidas).
3
- */
4
- function dateRangeValidator(control) {
5
- const dates = control.value;
6
- // Verificar si el valor es un array con exactamente dos elementos
7
- if (Array.isArray(dates) && dates.length === 2) {
8
- const [startDate, endDate] = dates;
9
- // Verificar que las fechas sean válidas y no nulas
10
- if (startDate &&
11
- endDate &&
12
- !isNaN(new Date(startDate).getTime()) &&
13
- !isNaN(new Date(endDate).getTime())) {
14
- return null; // Válido
15
- }
16
- else {
17
- return {
18
- invalidDateRange: {
19
- message: 'Ambas fechas deben ser válidas y no nulas.',
20
- requiredLength: 2,
21
- },
22
- }; // Error si alguna fecha es nula o inválida
23
- }
24
- }
25
- return null; // Si el control no contiene un array válido, no hay error
26
- }
27
- /**
28
- * Valida que una fecha única esté dentro de un rango mínimo y máximo.
29
- * @param minDate Fecha mínima permitida.
30
- * @param maxDate Fecha máxima permitida.
31
- */
32
- function dateMinMaxValidator(minDate, maxDate) {
33
- return (control) => {
34
- const date = control.value;
35
- // Verificar si el valor es una fecha válida
36
- if (date && !isNaN(new Date(date).getTime())) {
37
- const currentDate = new Date(date);
38
- // Validar si la fecha está fuera del rango permitido
39
- if (currentDate < minDate || currentDate > maxDate) {
40
- return {
41
- dateNotRange: {
42
- message: `La fecha debe estar entre ${minDate.toLocaleDateString()} y ${maxDate.toLocaleDateString()}`,
43
- minDate: minDate.toISOString(),
44
- maxDate: maxDate.toISOString(),
45
- },
46
- };
47
- }
48
- return null; // Fecha válida y dentro del rango
49
- }
50
- return null;
51
- };
52
- }
53
- /**
54
- * Valida que al menos uno de los campos especificados esté lleno.
55
- * @param fields Los nombres de los campos a validar.
56
- */
57
- function atLeastOneFieldRequiredValidator(fields) {
58
- return (formGroup) => {
59
- // Obtener el FormGroup para poder acceder a los controles
60
- const form = formGroup;
61
- // Verificar si al menos uno de los campos tiene un valor
62
- const isAnyFieldFilled = fields.some((field) => {
63
- const control = form.get(field);
64
- return control?.value !== null && control?.value !== '';
65
- });
66
- // Si al menos un campo tiene un valor, la validación es exitosa
67
- if (isAnyFieldFilled) {
68
- return null; // Validación pasada
69
- }
70
- else {
71
- // Construir el mensaje dinámico con los campos no llenados
72
- const emptyFields = fields.filter((field) => {
73
- const control = form.get(field);
74
- return control?.value === null || control?.value === '';
75
- });
76
- const fieldNames = emptyFields.join(', ');
77
- const message = `Debe completar al menos uno de los siguientes campos: ${fieldNames}.`;
78
- // Si ninguno tiene valor, devolver el mensaje con el error
79
- return {
80
- atLeastOneRequired: {
81
- message: message,
82
- },
83
- };
84
- }
85
- };
86
- }
87
-
88
1
  /**
89
2
  * Generated bundle index. Do not edit.
90
3
  */
91
-
92
- export { atLeastOneFieldRequiredValidator, dateMinMaxValidator, dateRangeValidator };
93
4
  //# sourceMappingURL=ngx-dsxlibrary-src-lib-validations.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-dsxlibrary-src-lib-validations.mjs","sources":["../../../projects/ngx-dsx/src/lib/validations/addons.validators.ts","../../../projects/ngx-dsx/src/lib/validations/ngx-dsxlibrary-src-lib-validations.ts"],"sourcesContent":["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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAEA;;AAEG;AACG,SAAU,kBAAkB,CAChC,OAAwB,EAAA;AAExB,IAAA,MAAM,KAAK,GAAW,OAAO,CAAC,KAAK;;AAGnC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9C,QAAA,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,KAAK;;AAGlC,QAAA,IACE,SAAS;YACT,OAAO;YACP,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;AACrC,YAAA,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EACnC;YACA,OAAO,IAAI,CAAC;;aACP;YACL,OAAO;AACL,gBAAA,gBAAgB,EAAE;AAChB,oBAAA,OAAO,EAAE,4CAA4C;AACrD,oBAAA,cAAc,EAAE,CAAC;AAClB,iBAAA;AACF,aAAA,CAAC;;;IAIN,OAAO,IAAI,CAAC;AACd;AAEA;;;;AAIG;AACa,SAAA,mBAAmB,CAAC,OAAa,EAAE,OAAa,EAAA;IAC9D,OAAO,CAAC,OAAwB,KAA6B;AAC3D,QAAA,MAAM,IAAI,GAAS,OAAO,CAAC,KAAK;;AAGhC,QAAA,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE;AAC5C,YAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;;YAGlC,IAAI,WAAW,GAAG,OAAO,IAAI,WAAW,GAAG,OAAO,EAAE;gBAClD,OAAO;AACL,oBAAA,YAAY,EAAE;wBACZ,OAAO,EAAE,CAA6B,0BAAA,EAAA,OAAO,CAAC,kBAAkB,EAAE,CAAA,GAAA,EAAM,OAAO,CAAC,kBAAkB,EAAE,CAAE,CAAA;AACtG,wBAAA,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;AAC9B,wBAAA,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;AAC/B,qBAAA;iBACF;;YAGH,OAAO,IAAI,CAAC;;AAGd,QAAA,OAAO,IAAI;AACb,KAAC;AACH;AAEA;;;AAGG;AACG,SAAU,gCAAgC,CAAC,MAAgB,EAAA;IAC/D,OAAO,CAAC,SAA0B,KAA6B;;QAE7D,MAAM,IAAI,GAAG,SAAsB;;QAGnC,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAI;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/B,OAAO,OAAO,EAAE,KAAK,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,KAAK,EAAE;AACzD,SAAC,CAAC;;QAGF,IAAI,gBAAgB,EAAE;YACpB,OAAO,IAAI,CAAC;;aACP;;YAEL,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;gBAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC/B,OAAO,OAAO,EAAE,KAAK,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,KAAK,EAAE;AACzD,aAAC,CAAC;YAEF,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,OAAO,GAAG,CAAyD,sDAAA,EAAA,UAAU,GAAG;;YAGtF,OAAO;AACL,gBAAA,kBAAkB,EAAE;AAClB,oBAAA,OAAO,EAAE,OAAO;AACjB,iBAAA;aACF;;AAEL,KAAC;AACH;;ACtGA;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-dsxlibrary-src-lib-validations.mjs","sources":["../../../projects/ngx-dsx/src/lib/validations/ngx-dsxlibrary-src-lib-validations.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;AAEG"}
@@ -10,12 +10,14 @@ import * as i3 from 'primeng/button';
10
10
  import { ButtonModule } from 'primeng/button';
11
11
  import * as i2 from 'primeng/image';
12
12
  import { ImageModule } from 'primeng/image';
13
+ import * as i4 from 'primeng/inputswitch';
14
+ import { InputSwitchModule } from 'primeng/inputswitch';
13
15
  import * as i1$2 from 'primeng/menubar';
14
16
  import { MenubarModule } from 'primeng/menubar';
15
- import * as i4 from 'primeng/toggleswitch';
16
- import { ToggleSwitchModule } from 'primeng/toggleswitch';
17
17
  import { ToastrService } from 'ngx-toastr';
18
18
  import Swal from 'sweetalert2';
19
+ import { Notyf } from 'notyf';
20
+ import 'notyf/notyf.min.css';
19
21
  import { HttpClient, HttpHeaders, HttpParams, HttpStatusCode, HttpErrorResponse } from '@angular/common/http';
20
22
  import { throwError, catchError, switchMap, finalize, Observable } from 'rxjs';
21
23
  import { JwtHelperService } from '@auth0/angular-jwt';
@@ -175,7 +177,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImpor
175
177
  }] });
176
178
 
177
179
  class AlertaService {
178
- //Update: 2024-10-28 14:58 Arrendamientos
180
+ notyf;
181
+ constructor() {
182
+ this.notyf = new Notyf({
183
+ duration: 3000, // Duración de la notificación en milisegundos
184
+ position: {
185
+ x: 'right', // Posición horizontal (left, center, right)
186
+ y: 'top', // Posición vertical (top, bottom)
187
+ },
188
+ });
189
+ }
179
190
  toastrService = inject(ToastrService);
180
191
  /**
181
192
  * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 5. bottom-center 6. bottom-right
@@ -212,6 +223,15 @@ class AlertaService {
212
223
  });
213
224
  }
214
225
  }
226
+ /* Alertas NotyF */
227
+ // Método para mostrar una notificación de éxito
228
+ successNotyf(message) {
229
+ this.notyf.success(message);
230
+ }
231
+ // Método para mostrar una notificación de error
232
+ errorNotyf(message) {
233
+ this.notyf.error(message);
234
+ }
215
235
  preloadImage(icono) {
216
236
  return new Promise((resolve, reject) => {
217
237
  const img = new Image();
@@ -313,7 +333,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImpor
313
333
  args: [{
314
334
  providedIn: 'root',
315
335
  }]
316
- }] });
336
+ }], ctorParameters: () => [] });
317
337
 
318
338
  const INITIAL_PARAMETERS = new InjectionToken('InitialParameters');
319
339
 
@@ -437,7 +457,7 @@ class NavbarDsxComponent {
437
457
  });
438
458
  }
439
459
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: NavbarDsxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
440
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.0", type: NavbarDsxComponent, isStandalone: true, selector: "app-navbar-dsx", inputs: { logoWidth: { classPropertyName: "logoWidth", publicName: "logoWidth", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n src=\"assets/image/logoApp.png\"\r\n alt=\"Image\"\r\n width=\"logoWidth()\"\r\n />\r\n </ng-template>\r\n <ng-template #end>\r\n <div class=\"flex items-center me-5\">\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 <p-toggleswitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-toggleswitch>\r\n </div>\r\n </ng-template>\r\n</p-menubar>\r\n", styles: ["::ng-deep .p-menubar{padding:0!important;border:none!important;background:none!important}\n"], dependencies: [{ kind: "ngmodule", type: MenubarModule }, { kind: "component", type: i1$2.Menubar, selector: "p-menubar", inputs: ["model", "style", "styleClass", "autoZIndex", "baseZIndex", "autoDisplay", "autoHide", "breakpoint", "autoHideDelay", "id", "ariaLabel", "ariaLabelledBy"], outputs: ["onFocus", "onBlur"] }, { kind: "ngmodule", type: ImageModule }, { kind: "component", type: i2.Image, selector: "p-image", inputs: ["imageClass", "imageStyle", "styleClass", "style", "src", "srcSet", "sizes", "previewImageSrc", "previewImageSrcSet", "previewImageSizes", "alt", "width", "height", "loading", "appendTo", "preview", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide", "onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ToggleSwitchModule }, { kind: "component", type: i4.ToggleSwitch, selector: "p-toggleswitch, p-toggleSwitch, p-toggle-switch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
460
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.0", type: NavbarDsxComponent, isStandalone: true, selector: "app-navbar-dsx", inputs: { logoWidth: { classPropertyName: "logoWidth", publicName: "logoWidth", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n src=\"assets/image/logoApp.png\"\r\n alt=\"Image\"\r\n width=\"logoWidth()\"\r\n />\r\n </ng-template>\r\n <ng-template #end>\r\n <div class=\"flex items-center me-5\">\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 <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", styles: [""], dependencies: [{ kind: "ngmodule", type: MenubarModule }, { kind: "component", type: i1$2.Menubar, selector: "p-menubar", inputs: ["model", "style", "styleClass", "autoZIndex", "baseZIndex", "autoDisplay", "autoHide", "breakpoint", "autoHideDelay", "id", "ariaLabel", "ariaLabelledBy"], outputs: ["onFocus", "onBlur"] }, { kind: "ngmodule", type: ImageModule }, { kind: "component", type: i2.Image, selector: "p-image", inputs: ["imageClass", "imageStyle", "styleClass", "style", "src", "srcSet", "sizes", "previewImageSrc", "previewImageSrcSet", "previewImageSizes", "alt", "width", "height", "loading", "appendTo", "preview", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide", "onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: InputSwitchModule }, { kind: "component", type: i4.InputSwitch, selector: "p-inputSwitch, p-inputswitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
441
461
  }
442
462
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImport: i0, type: NavbarDsxComponent, decorators: [{
443
463
  type: Component,
@@ -445,9 +465,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.0", ngImpor
445
465
  MenubarModule,
446
466
  ImageModule,
447
467
  ButtonModule,
448
- ToggleSwitchModule,
468
+ InputSwitchModule,
449
469
  FormsModule,
450
- ], template: "<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n src=\"assets/image/logoApp.png\"\r\n alt=\"Image\"\r\n width=\"logoWidth()\"\r\n />\r\n </ng-template>\r\n <ng-template #end>\r\n <div class=\"flex items-center me-5\">\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 <p-toggleswitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-toggleswitch>\r\n </div>\r\n </ng-template>\r\n</p-menubar>\r\n", styles: ["::ng-deep .p-menubar{padding:0!important;border:none!important;background:none!important}\n"] }]
470
+ ], template: "<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n src=\"assets/image/logoApp.png\"\r\n alt=\"Image\"\r\n width=\"logoWidth()\"\r\n />\r\n </ng-template>\r\n <ng-template #end>\r\n <div class=\"flex items-center me-5\">\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 <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" }]
451
471
  }] });
452
472
 
453
473
  class AuthorizeService {
@@ -695,6 +715,93 @@ const httpAuthorizeInterceptor = (req, next) => {
695
715
  }));
696
716
  };
697
717
 
718
+ /**
719
+ * Valida que el control contenga un rango de fechas válido (dos fechas no nulas y válidas).
720
+ */
721
+ function dateRangeValidator(control) {
722
+ const dates = control.value;
723
+ // Verificar si el valor es un array con exactamente dos elementos
724
+ if (Array.isArray(dates) && dates.length === 2) {
725
+ const [startDate, endDate] = dates;
726
+ // Verificar que las fechas sean válidas y no nulas
727
+ if (startDate &&
728
+ endDate &&
729
+ !isNaN(new Date(startDate).getTime()) &&
730
+ !isNaN(new Date(endDate).getTime())) {
731
+ return null; // Válido
732
+ }
733
+ else {
734
+ return {
735
+ invalidDateRange: {
736
+ message: 'Ambas fechas deben ser válidas y no nulas.',
737
+ requiredLength: 2,
738
+ },
739
+ }; // Error si alguna fecha es nula o inválida
740
+ }
741
+ }
742
+ return null; // Si el control no contiene un array válido, no hay error
743
+ }
744
+ /**
745
+ * Valida que una fecha única esté dentro de un rango mínimo y máximo.
746
+ * @param minDate Fecha mínima permitida.
747
+ * @param maxDate Fecha máxima permitida.
748
+ */
749
+ function dateMinMaxValidator(minDate, maxDate) {
750
+ return (control) => {
751
+ const date = control.value;
752
+ // Verificar si el valor es una fecha válida
753
+ if (date && !isNaN(new Date(date).getTime())) {
754
+ const currentDate = new Date(date);
755
+ // Validar si la fecha está fuera del rango permitido
756
+ if (currentDate < minDate || currentDate > maxDate) {
757
+ return {
758
+ dateNotRange: {
759
+ message: `La fecha debe estar entre ${minDate.toLocaleDateString()} y ${maxDate.toLocaleDateString()}`,
760
+ minDate: minDate.toISOString(),
761
+ maxDate: maxDate.toISOString(),
762
+ },
763
+ };
764
+ }
765
+ return null; // Fecha válida y dentro del rango
766
+ }
767
+ return null;
768
+ };
769
+ }
770
+ /**
771
+ * Valida que al menos uno de los campos especificados esté lleno.
772
+ * @param fields Los nombres de los campos a validar.
773
+ */
774
+ function atLeastOneFieldRequiredValidator(fields) {
775
+ return (formGroup) => {
776
+ // Obtener el FormGroup para poder acceder a los controles
777
+ const form = formGroup;
778
+ // Verificar si al menos uno de los campos tiene un valor
779
+ const isAnyFieldFilled = fields.some((field) => {
780
+ const control = form.get(field);
781
+ return control?.value !== null && control?.value !== '';
782
+ });
783
+ // Si al menos un campo tiene un valor, la validación es exitosa
784
+ if (isAnyFieldFilled) {
785
+ return null; // Validación pasada
786
+ }
787
+ else {
788
+ // Construir el mensaje dinámico con los campos no llenados
789
+ const emptyFields = fields.filter((field) => {
790
+ const control = form.get(field);
791
+ return control?.value === null || control?.value === '';
792
+ });
793
+ const fieldNames = emptyFields.join(', ');
794
+ const message = `Debe completar al menos uno de los siguientes campos: ${fieldNames}.`;
795
+ // Si ninguno tiene valor, devolver el mensaje con el error
796
+ return {
797
+ atLeastOneRequired: {
798
+ message: message,
799
+ },
800
+ };
801
+ }
802
+ };
803
+ }
804
+
698
805
  /*
699
806
  * Public API Surface of ngx-dsx
700
807
  */
@@ -703,5 +810,5 @@ const httpAuthorizeInterceptor = (req, next) => {
703
810
  * Generated bundle index. Do not edit.
704
811
  */
705
812
 
706
- export { AlertaService, AppMessageErrorComponent, AuthorizeService, ENVIRONMENT, INITIAL_PARAMETERS, JsonHighlightPipe, JsonValuesDebujComponent, KpicardComponent, LoadingComponent, NavbarDsxComponent, ParameterValuesService, SecurityService, httpAuthorizeInterceptor };
813
+ export { AlertaService, AppMessageErrorComponent, AuthorizeService, ENVIRONMENT, INITIAL_PARAMETERS, JsonHighlightPipe, JsonValuesDebujComponent, KpicardComponent, LoadingComponent, NavbarDsxComponent, ParameterValuesService, SecurityService, atLeastOneFieldRequiredValidator, dateMinMaxValidator, dateRangeValidator, httpAuthorizeInterceptor };
707
814
  //# sourceMappingURL=ngx-dsxlibrary.mjs.map
@@ -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/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/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.scss',\r\n})\r\nexport class AppMessageErrorComponent {\r\n // Control de formulario que se pasa como input\r\n @Input() control!: AbstractControl | null;\r\n @Input() form: FormGroup | null = null;\r\n}\r\n","@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como máximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor mínimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor máximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpModule } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpModule],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<string>('light');\r\n\r\n options: Record<'currency' | 'integer', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n transform(value: any): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría\r\n\r\n // Aplica estilo y colores para diferenciar claves, valores, booleanos, números, etc.\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?)/g, (match) => {\r\n // Si es una clave (tiene dos puntos al final)\r\n if (/:$/.test(match)) {\r\n return `<span class=\"json-key\">${match}</span>`;\r\n }\r\n // Si es un string (no tiene dos puntos)\r\n return `<span class=\"json-string\">${match}</span>`;\r\n })\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"json-number\">$1</span>')\r\n .replace(/[{}\\[\\]]/g, '<span class=\"json-bracket\">$&</span>')\r\n .replace(/,/g, '<span class=\"json-comma\">$&</span>')\r\n .replace(/:/g, '<span class=\"json-colon\">$&</span>');\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface EnvironmentConfig {\r\n production: boolean;\r\n myAppUrl: string;\r\n tokenName: string;\r\n tokenNameRF: string;\r\n sessionStatus: string;\r\n refreshTokenExpiry: string;\r\n}\r\n\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig'\r\n);\r\n","import { Component, inject, Input, signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { JsonHighlightPipe } from '../../pipe/json-highlight.pipe';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\n\r\n@Component({\r\n selector: 'app-json-values-debuj',\r\n imports: [JsonHighlightPipe],\r\n templateUrl: './json-values-debuj.component.html',\r\n styleUrl: './json-values-debuj.component.css',\r\n})\r\nexport class JsonValuesDebujComponent {\r\n @Input() form!: FormGroup;\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n // Señal reactiva para indicar si estamos en modo de desarrollo\r\n private readonly isDevSignal = signal<boolean>(!this.environment.production);\r\n\r\n // Método para verificar el estado de desarrollo\r\n isDev(): boolean {\r\n return this.isDevSignal();\r\n }\r\n}\r\n","@if(isDev()){\r\n<div class=\"w-full overflow-auto bg-gray-100 p-2 rounded-lg mb-3\">\r\n <pre\r\n class=\"whitespace-pre-wrap break-words text-sm\"\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.scss',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">Desarollo Software Xela</p>\r\n</div>\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n //Update: 2024-10-28 14:58 Arrendamientos\r\n\r\n private toastrService = inject(ToastrService);\r\n /**\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 5. bottom-center 6. bottom-right\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `assets/icon/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n alertConfirm(title: string, text: string, icono: string): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed)\r\n );\r\n }\r\n\r\n alertaHtml(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'notFound01.png',\r\n timer: number = 2500\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i class='text-red-300'>${message}</i> <span class='text-blue-600'> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\r\n });\r\n }\r\n\r\n alertaHtmlSuccess(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'check02.png',\r\n timer: number = 2000\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 125,\r\n imageHeight: 125,\r\n imageAlt: 'success 200',\r\n html: `\r\n <strong>Alerta: </strong><b class='text-success'>${message}</b>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\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 // Método castear los valores de SeguridadITParameter a MyParameterValues\r\n getAllParameterValues(data: SeguridadITParameter): MyParameterValues[] {\r\n return data.parameterSecurity.map((param) => ({\r\n parameterName: param.parameterName,\r\n values: param.parameterValues.map((v) => v.value),\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/authorize`;\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}/TokenRefresh/`, 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}/securityParameter/`,\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 { ToggleSwitchModule } from 'primeng/toggleswitch';\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: [\r\n MenubarModule,\r\n ImageModule,\r\n ButtonModule,\r\n ToggleSwitchModule,\r\n FormsModule,\r\n ],\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<number>(325);\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=\"assets/image/logoApp.png\"\r\n alt=\"Image\"\r\n width=\"logoWidth()\"\r\n />\r\n </ng-template>\r\n <ng-template #end>\r\n <div class=\"flex items-center me-5\">\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 <p-toggleswitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-toggleswitch>\r\n </div>\r\n </ng-template>\r\n</p-menubar>\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 } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\nimport { ErrorModel } from '../models/src/error.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n\r\n handleErrorResponse(error: HttpErrorResponse) {\r\n const err: ErrorModel = error as ErrorModel;\r\n const technicalMessage = `Error status: ${error.status}, Message: ${error.message}, URL: ${error.url}`;\r\n\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage =\r\n 'Solicitud incorrecta (400). Verifica los datos ingresados o validaciones existentes.';\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = 'Acceso no autorizado (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage = 'Un error inesperado ha ocurrido.';\r\n break;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n this._serviceAlerta.alertaHtml(\r\n 'Servicios de Errores',\r\n '<i>Código:</i> ' +\r\n err.status +\r\n ' <i>Message:</i> ' +\r\n userMessage +\r\n `. (${error.error})`\r\n );\r\n\r\n // Imprimir el mensaje técnico\r\n if (isDevMode()) {\r\n console.error(err);\r\n }\r\n\r\n // Retornar el error para continuar con el flujo de manejo de errores\r\n return throwError(() => new Error(technicalMessage));\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { catchError, finalize, Observable, switchMap } from 'rxjs';\r\nimport { inject } from '@angular/core';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n//Update: 2024-01-29 12:00\r\n\r\nlet _activeRequest = 0;\r\n//let isRefreshing = false; // Estado de si se está refrescando el token\r\nlet pendingRequests: any[] = []; // Cola de solicitudes pendientes\r\n\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n //console.log('------ INGRESO A HTTPINTERCEPTOR -------');\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n //Variables\r\n const _token = _authorizeService.getToken();\r\n const _tokenRefresh = _authorizeService.getTokenRefresh();\r\n\r\n //Generar la petición con el token\r\n const authReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_token}`,\r\n },\r\n });\r\n\r\n if (_activeRequest == 0) {\r\n _spinnerService.show();\r\n }\r\n\r\n _activeRequest++;\r\n\r\n return next(authReq).pipe(\r\n catchError((error: HttpErrorResponse): Observable<HttpEvent<any>> => {\r\n // Si el error es 401\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Si no hay refreshToken, finalizar la sesión\r\n if (!_tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco no está disponible.',\r\n })\r\n );\r\n }\r\n\r\n // Intentar refrescar el token si no se está haciendo ya\r\n if (!_authorizeService.isRefreshing) {\r\n // Marcamos que se está refrescando el token\r\n _authorizeService.isRefreshing = true;\r\n\r\n // Intentar refrescar el token\r\n return _securityService.tokenRefresh(_tokenRefresh).pipe(\r\n switchMap((response: ModelToken) => {\r\n if (!response.token || !response.tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco ha expirado.',\r\n })\r\n );\r\n }\r\n\r\n // Recargar el token en el servicio\r\n _authorizeService.tokenReload(response);\r\n\r\n // Generar una nueva solicitud con el token actualizado\r\n const newReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n });\r\n\r\n // Refresco completado\r\n _authorizeService.isRefreshing = false;\r\n\r\n pendingRequests.forEach((pendingReq) => {\r\n const clonedReq = pendingReq.authReq.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_authorizeService.getToken()}`,\r\n },\r\n });\r\n\r\n // Volver a ejecutar las solicitudes pendientes con el nuevo token\r\n next(clonedReq).subscribe({\r\n next: pendingReq.next,\r\n error: pendingReq.error,\r\n complete: pendingReq.complete,\r\n });\r\n });\r\n pendingRequests = []; // Limpiar la cola\r\n\r\n return next(newReq); // Procesar la solicitud original con el nuevo token\r\n }),\r\n catchError((refreshError: HttpErrorResponse) => {\r\n // Finalizamos el refresco si hay error\r\n _authorizeService.isRefreshing = false;\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'Error al refrescar el token. Redirigiendo al login.',\r\n })\r\n );\r\n }),\r\n finalize(() => {\r\n _authorizeService.isRefreshing = false;\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, añadir la solicitud a la cola\r\n return new Observable((observer) => {\r\n pendingRequests.push({\r\n authReq,\r\n next: observer.next.bind(observer),\r\n error: observer.error.bind(observer),\r\n complete: observer.complete.bind(observer),\r\n });\r\n });\r\n }\r\n }\r\n // Si no es un error 401, manejar otros errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n _spinnerService.hide();\r\n }\r\n })\r\n );\r\n};\r\n","/*\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/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/pipe';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/services/parameter-values.service';\r\nexport * from './lib/services/security.service';\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/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/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/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.scss',\r\n})\r\nexport class AppMessageErrorComponent {\r\n // Control de formulario que se pasa como input\r\n @Input() control!: AbstractControl | null;\r\n @Input() form: FormGroup | null = null;\r\n}\r\n","@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como máximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor mínimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor máximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpModule } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpModule],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<string>('light');\r\n\r\n options: Record<'currency' | 'integer', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div class=\"kpi-card {{ color() }}\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [options]=\"getSelectedOption()\"\r\n [class]=\"theme() === 'light' ? 'card-value-light' : 'card-value-dark'\"\r\n >0</span\r\n >\r\n <span [class]=\"theme() === 'light' ? 'card-text-light' : 'card-text-dark'\">{{\r\n label()\r\n }}</span>\r\n <i\r\n [class]=\"\r\n theme() === 'light'\r\n ? iconType() + ' icon icon-light'\r\n : iconType() + ' icon icon-dark'\r\n \"\r\n ></i>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n transform(value: any): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría\r\n\r\n // Aplica estilo y colores para diferenciar claves, valores, booleanos, números, etc.\r\n return json\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?)/g, (match) => {\r\n // Si es una clave (tiene dos puntos al final)\r\n if (/:$/.test(match)) {\r\n return `<span class=\"json-key\">${match}</span>`;\r\n }\r\n // Si es un string (no tiene dos puntos)\r\n return `<span class=\"json-string\">${match}</span>`;\r\n })\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"json-number\">$1</span>')\r\n .replace(/[{}\\[\\]]/g, '<span class=\"json-bracket\">$&</span>')\r\n .replace(/,/g, '<span class=\"json-comma\">$&</span>')\r\n .replace(/:/g, '<span class=\"json-colon\">$&</span>');\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface EnvironmentConfig {\r\n production: boolean;\r\n myAppUrl: string;\r\n tokenName: string;\r\n tokenNameRF: string;\r\n sessionStatus: string;\r\n refreshTokenExpiry: string;\r\n}\r\n\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig'\r\n);\r\n","import { Component, inject, Input, signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { JsonHighlightPipe } from '../../pipe/json-highlight.pipe';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\n\r\n@Component({\r\n selector: 'app-json-values-debuj',\r\n imports: [JsonHighlightPipe],\r\n templateUrl: './json-values-debuj.component.html',\r\n styleUrl: './json-values-debuj.component.css',\r\n})\r\nexport class JsonValuesDebujComponent {\r\n @Input() form!: FormGroup;\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n // Señal reactiva para indicar si estamos en modo de desarrollo\r\n private readonly isDevSignal = signal<boolean>(!this.environment.production);\r\n\r\n // Método para verificar el estado de desarrollo\r\n isDev(): boolean {\r\n return this.isDevSignal();\r\n }\r\n}\r\n","@if(isDev()){\r\n<div class=\"w-full overflow-auto bg-gray-100 p-2 rounded-lg mb-3\">\r\n <pre\r\n class=\"whitespace-pre-wrap break-words text-sm\"\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.scss',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"assets/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">Desarollo Software Xela</p>\r\n</div>\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\nimport Swal from 'sweetalert2';\r\n// Importa Notyf\r\nimport { Notyf } from 'notyf';\r\n// Importa los estilos de Notyf\r\nimport 'notyf/notyf.min.css';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n private notyf: Notyf;\r\n\r\n constructor() {\r\n this.notyf = new Notyf({\r\n duration: 3000, // Duración de la notificación en milisegundos\r\n position: {\r\n x: 'right', // Posición horizontal (left, center, right)\r\n y: 'top', // Posición vertical (top, bottom)\r\n },\r\n });\r\n }\r\n\r\n private toastrService = inject(ToastrService);\r\n /**\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 5. bottom-center 6. bottom-right\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n /* Alertas NotyF */\r\n // Método para mostrar una notificación de éxito\r\n successNotyf(message: string) {\r\n this.notyf.success(message);\r\n }\r\n\r\n // Método para mostrar una notificación de error\r\n errorNotyf(message: string) {\r\n this.notyf.error(message);\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `assets/icon/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n alertConfirm(title: string, text: string, icono: string): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed)\r\n );\r\n }\r\n\r\n alertaHtml(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'notFound01.png',\r\n timer: number = 2500\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i class='text-red-300'>${message}</i> <span class='text-blue-600'> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\r\n });\r\n }\r\n\r\n alertaHtmlSuccess(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'check02.png',\r\n timer: number = 2000\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `assets/icon/${icono}`,\r\n imageWidth: 125,\r\n imageHeight: 125,\r\n imageAlt: 'success 200',\r\n html: `\r\n <strong>Alerta: </strong><b class='text-success'>${message}</b>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\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 // Método castear los valores de SeguridadITParameter a MyParameterValues\r\n getAllParameterValues(data: SeguridadITParameter): MyParameterValues[] {\r\n return data.parameterSecurity.map((param) => ({\r\n parameterName: param.parameterName,\r\n values: param.parameterValues.map((v) => v.value),\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/authorize`;\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}/TokenRefresh/`, 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}/securityParameter/`,\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 { InputSwitchModule } from 'primeng/inputswitch';\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: [\r\n MenubarModule,\r\n ImageModule,\r\n ButtonModule,\r\n InputSwitchModule,\r\n FormsModule,\r\n ],\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<number>(325);\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=\"assets/image/logoApp.png\"\r\n alt=\"Image\"\r\n width=\"logoWidth()\"\r\n />\r\n </ng-template>\r\n <ng-template #end>\r\n <div class=\"flex items-center me-5\">\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 <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 { 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 } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\nimport { ErrorModel } from '../models/src/error.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n\r\n handleErrorResponse(error: HttpErrorResponse) {\r\n const err: ErrorModel = error as ErrorModel;\r\n const technicalMessage = `Error status: ${error.status}, Message: ${error.message}, URL: ${error.url}`;\r\n\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage =\r\n 'Solicitud incorrecta (400). Verifica los datos ingresados o validaciones existentes.';\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = 'Acceso no autorizado (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage = 'Un error inesperado ha ocurrido.';\r\n break;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n this._serviceAlerta.alertaHtml(\r\n 'Servicios de Errores',\r\n '<i>Código:</i> ' +\r\n err.status +\r\n ' <i>Message:</i> ' +\r\n userMessage +\r\n `. (${error.error})`\r\n );\r\n\r\n // Imprimir el mensaje técnico\r\n if (isDevMode()) {\r\n console.error(err);\r\n }\r\n\r\n // Retornar el error para continuar con el flujo de manejo de errores\r\n return throwError(() => new Error(technicalMessage));\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { catchError, finalize, Observable, switchMap } from 'rxjs';\r\nimport { inject } from '@angular/core';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n//Update: 2024-01-29 12:00\r\n\r\nlet _activeRequest = 0;\r\n//let isRefreshing = false; // Estado de si se está refrescando el token\r\nlet pendingRequests: any[] = []; // Cola de solicitudes pendientes\r\n\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n //console.log('------ INGRESO A HTTPINTERCEPTOR -------');\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n //Variables\r\n const _token = _authorizeService.getToken();\r\n const _tokenRefresh = _authorizeService.getTokenRefresh();\r\n\r\n //Generar la petición con el token\r\n const authReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_token}`,\r\n },\r\n });\r\n\r\n if (_activeRequest == 0) {\r\n _spinnerService.show();\r\n }\r\n\r\n _activeRequest++;\r\n\r\n return next(authReq).pipe(\r\n catchError((error: HttpErrorResponse): Observable<HttpEvent<any>> => {\r\n // Si el error es 401\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n // Si no hay refreshToken, finalizar la sesión\r\n if (!_tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco no está disponible.',\r\n })\r\n );\r\n }\r\n\r\n // Intentar refrescar el token si no se está haciendo ya\r\n if (!_authorizeService.isRefreshing) {\r\n // Marcamos que se está refrescando el token\r\n _authorizeService.isRefreshing = true;\r\n\r\n // Intentar refrescar el token\r\n return _securityService.tokenRefresh(_tokenRefresh).pipe(\r\n switchMap((response: ModelToken) => {\r\n if (!response.token || !response.tokenRefresh) {\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'No autorizado. El token de refresco ha expirado.',\r\n })\r\n );\r\n }\r\n\r\n // Recargar el token en el servicio\r\n _authorizeService.tokenReload(response);\r\n\r\n // Generar una nueva solicitud con el token actualizado\r\n const newReq = req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n });\r\n\r\n // Refresco completado\r\n _authorizeService.isRefreshing = false;\r\n\r\n pendingRequests.forEach((pendingReq) => {\r\n const clonedReq = pendingReq.authReq.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${_authorizeService.getToken()}`,\r\n },\r\n });\r\n\r\n // Volver a ejecutar las solicitudes pendientes con el nuevo token\r\n next(clonedReq).subscribe({\r\n next: pendingReq.next,\r\n error: pendingReq.error,\r\n complete: pendingReq.complete,\r\n });\r\n });\r\n pendingRequests = []; // Limpiar la cola\r\n\r\n return next(newReq); // Procesar la solicitud original con el nuevo token\r\n }),\r\n catchError((refreshError: HttpErrorResponse) => {\r\n // Finalizamos el refresco si hay error\r\n _authorizeService.isRefreshing = false;\r\n _spinnerService.hide();\r\n return _handleErrorService.handleErrorResponse(\r\n new HttpErrorResponse({\r\n status: 401,\r\n statusText:\r\n 'Error al refrescar el token. Redirigiendo al login.',\r\n })\r\n );\r\n }),\r\n finalize(() => {\r\n _authorizeService.isRefreshing = false;\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, añadir la solicitud a la cola\r\n return new Observable((observer) => {\r\n pendingRequests.push({\r\n authReq,\r\n next: observer.next.bind(observer),\r\n error: observer.error.bind(observer),\r\n complete: observer.complete.bind(observer),\r\n });\r\n });\r\n }\r\n }\r\n // Si no es un error 401, manejar otros errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n _spinnerService.hide();\r\n }\r\n })\r\n );\r\n};\r\n","import { 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 * 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/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/pipe';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/services/parameter-values.service';\r\nexport * from './lib/services/security.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,6 +1,9 @@
1
1
  import { ResponseHttpModel } from '../models/src/response-http.model';
2
+ import 'notyf/notyf.min.css';
2
3
  import * as i0 from "@angular/core";
3
4
  export declare class AlertaService {
5
+ private notyf;
6
+ constructor();
4
7
  private toastrService;
5
8
  /**
6
9
  * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 5. bottom-center 6. bottom-right
@@ -11,6 +14,8 @@ export declare class AlertaService {
11
14
  * @returns - Retonar una alerta toastr
12
15
  * */
13
16
  toastrAlerts(toastrType: number, toastrTitle: string, toastrMessage: string, toastrAlign?: number, toastrTimer?: number): void;
17
+ successNotyf(message: string): void;
18
+ errorNotyf(message: string): void;
14
19
  private preloadImage;
15
20
  alertConfirm(title: string, text: string, icono: string): Promise<boolean>;
16
21
  alertaHtml(titleAlert: string, message: string, icono?: string, timer?: number): Promise<void>;
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-dsxlibrary",
3
- "version": "1.0.10",
3
+ "version": "1.0.12",
4
4
  "description": "Libreria para control de código automatizado.",
5
5
  "author": "DevSoftXela",
6
6
  "peerDependencies": {
@@ -25,9 +25,9 @@
25
25
  "types": "./src/lib/components/index.d.ts",
26
26
  "default": "./fesm2022/ngx-dsxlibrary-src-lib-components.mjs"
27
27
  },
28
- "./src/lib/injections": {
29
- "types": "./src/lib/injections/index.d.ts",
30
- "default": "./fesm2022/ngx-dsxlibrary-src-lib-injections.mjs"
28
+ "./src/lib/interceptors": {
29
+ "types": "./src/lib/interceptors/index.d.ts",
30
+ "default": "./fesm2022/ngx-dsxlibrary-src-lib-interceptors.mjs"
31
31
  },
32
32
  "./src/lib/models": {
33
33
  "types": "./src/lib/models/index.d.ts",
@@ -37,17 +37,17 @@
37
37
  "types": "./src/lib/pipe/index.d.ts",
38
38
  "default": "./fesm2022/ngx-dsxlibrary-src-lib-pipe.mjs"
39
39
  },
40
- "./src/lib/interceptors": {
41
- "types": "./src/lib/interceptors/index.d.ts",
42
- "default": "./fesm2022/ngx-dsxlibrary-src-lib-interceptors.mjs"
43
- },
44
- "./src/lib/validations": {
45
- "types": "./src/lib/validations/index.d.ts",
46
- "default": "./fesm2022/ngx-dsxlibrary-src-lib-validations.mjs"
40
+ "./src/lib/injections": {
41
+ "types": "./src/lib/injections/index.d.ts",
42
+ "default": "./fesm2022/ngx-dsxlibrary-src-lib-injections.mjs"
47
43
  },
48
44
  "./src/lib/services": {
49
45
  "types": "./src/lib/services/index.d.ts",
50
46
  "default": "./fesm2022/ngx-dsxlibrary-src-lib-services.mjs"
47
+ },
48
+ "./src/lib/validations": {
49
+ "types": "./src/lib/validations/index.d.ts",
50
+ "default": "./fesm2022/ngx-dsxlibrary-src-lib-validations.mjs"
51
51
  }
52
52
  }
53
53
  }
package/public-api.d.ts CHANGED
@@ -11,3 +11,4 @@ export * from './lib/services/alerta.service';
11
11
  export * from './lib/services/authorize.service';
12
12
  export * from './lib/services/parameter-values.service';
13
13
  export * from './lib/services/security.service';
14
+ export * from './lib/validations/addons.validators';
@@ -1 +1 @@
1
- export * from './addons.validators';
1
+ export {};
Binary file