@jvsoft/components 0.0.10 → 0.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.
Files changed (141) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/build.js +20 -0
  3. package/dialog-flotante/dialog-flotante.component.html +66 -0
  4. package/dialog-flotante/dialog-flotante.component.ts +115 -0
  5. package/dialog-flotante/dialog-flotante.interface.ts +13 -0
  6. package/dialog-flotante/index.ts +1 -0
  7. package/dialog-flotante/ng-package.json +5 -0
  8. package/{index.d.ts → index.ts} +8 -1
  9. package/lista-arbol/lista-arbol.component.html +66 -0
  10. package/lista-arbol/lista-arbol.component.ts +238 -0
  11. package/lista-arbol/lista-arbol.functions.ts +46 -0
  12. package/lista-arbol/ng-package.json +5 -0
  13. package/luces-navidad/christmas-tree.png +0 -0
  14. package/luces-navidad/index.ts +1 -0
  15. package/luces-navidad/luces-navidad.component.html +6 -0
  16. package/luces-navidad/luces-navidad.component.ts +24 -0
  17. package/luces-navidad/ng-package.json +5 -0
  18. package/mat-suffix-search-button/index.ts +1 -0
  19. package/mat-suffix-search-button/mat-suffix-search-button.component.html +5 -0
  20. package/mat-suffix-search-button/mat-suffix-search-button.component.ts +36 -0
  21. package/mat-suffix-search-button/ng-package.json +5 -0
  22. package/menu/index.ts +1 -0
  23. package/menu/menu.component.html +40 -0
  24. package/menu/menu.component.ts +88 -0
  25. package/menu/menu.interface.ts +16 -0
  26. package/menu/ng-package.json +5 -0
  27. package/ng-package.json +17 -0
  28. package/package.json +17 -42
  29. package/progress-spinner.zip +0 -0
  30. package/tabla-mantenimiento/classes/data-model.ts +150 -0
  31. package/tabla-mantenimiento/components/progress-bar/index.ts +1 -0
  32. package/tabla-mantenimiento/components/progress-bar/ng-package.json +5 -0
  33. package/tabla-mantenimiento/components/progress-bar/progress-bar.component.html +10 -0
  34. package/tabla-mantenimiento/components/progress-bar/progress-bar.component.ts +85 -0
  35. package/tabla-mantenimiento/components/progress-bar/public-api.ts +2 -0
  36. package/tabla-mantenimiento/index.ts +1 -0
  37. package/tabla-mantenimiento/interfaces/{archivo.d.ts → archivo.ts} +7 -4
  38. package/tabla-mantenimiento/interfaces/global/{boton-mantenimiento.d.ts → boton-mantenimiento.ts} +9 -3
  39. package/tabla-mantenimiento/interfaces/global/{columnas-tabla.d.ts → columnas-tabla.ts} +90 -13
  40. package/tabla-mantenimiento/interfaces/global/export-excel-servidor.ts +0 -0
  41. package/tabla-mantenimiento/interfaces/global/no-export.ts +11 -0
  42. package/tabla-mantenimiento/interfaces/global/{otros.d.ts → otros.ts} +15 -3
  43. package/tabla-mantenimiento/interfaces/implements/{incluye-tabla-mantenimiento.d.ts → incluye-tabla-mantenimiento.ts} +6 -4
  44. package/tabla-mantenimiento/interfaces/implements/{index.d.ts → index.ts} +1 -0
  45. package/tabla-mantenimiento/mat-row-keyboard-selection.directive.ts +97 -0
  46. package/tabla-mantenimiento/ng-package.json +5 -0
  47. package/tabla-mantenimiento/pipes/no-sanitize.pipe.ts +12 -0
  48. package/tabla-mantenimiento/pipes/zero-fill.pipe.ts +19 -0
  49. package/tabla-mantenimiento/{public-api.d.ts → public-api.ts} +3 -2
  50. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.html +22 -0
  51. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.ts +12 -0
  52. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.html +58 -0
  53. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.ts +19 -0
  54. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.html +40 -0
  55. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.ts +17 -0
  56. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.html +25 -0
  57. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.ts +14 -0
  58. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.html +28 -0
  59. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.ts +13 -0
  60. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.html +30 -0
  61. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.ts +38 -0
  62. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.html +97 -0
  63. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.ts +43 -0
  64. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.html +26 -0
  65. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.ts +36 -0
  66. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.ts +54 -0
  67. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.html +76 -0
  68. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.ts +67 -0
  69. package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.html +7 -0
  70. package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.ts +39 -0
  71. package/tabla-mantenimiento/tabla-mantenimiento.component.html +385 -0
  72. package/tabla-mantenimiento/tabla-mantenimiento.component.ts +951 -0
  73. package/tabla-mantenimiento/tabla-mantenimiento.functions.ts +57 -0
  74. package/tabla-mantenimiento/tabla-mantenimiento.service.ts +44 -0
  75. package/tabla-mantenimiento/table-util.ts +49 -0
  76. package/tabla-mantenimiento.zip +0 -0
  77. package/tsconfig.lib.json +16 -0
  78. package/tsconfig.lib.prod.json +11 -0
  79. package/tsconfig.spec.json +15 -0
  80. package/yarn-error.log +68 -0
  81. package/dialog-flotante/dialog-flotante.component.d.ts +0 -32
  82. package/dialog-flotante/dialog-flotante.interface.d.ts +0 -11
  83. package/dialog-flotante/index.d.ts +0 -5
  84. package/fesm2022/jvsoft-components-dialog-flotante.mjs +0 -130
  85. package/fesm2022/jvsoft-components-dialog-flotante.mjs.map +0 -1
  86. package/fesm2022/jvsoft-components-lista-arbol.mjs +0 -266
  87. package/fesm2022/jvsoft-components-lista-arbol.mjs.map +0 -1
  88. package/fesm2022/jvsoft-components-luces-navidad.mjs +0 -33
  89. package/fesm2022/jvsoft-components-luces-navidad.mjs.map +0 -1
  90. package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs +0 -47
  91. package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs.map +0 -1
  92. package/fesm2022/jvsoft-components-menu.mjs +0 -102
  93. package/fesm2022/jvsoft-components-menu.mjs.map +0 -1
  94. package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs +0 -91
  95. package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs.map +0 -1
  96. package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs +0 -1801
  97. package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs.map +0 -1
  98. package/fesm2022/jvsoft-components.mjs +0 -2309
  99. package/fesm2022/jvsoft-components.mjs.map +0 -1
  100. package/lista-arbol/index.d.ts +0 -5
  101. package/lista-arbol/lista-arbol.component.d.ts +0 -58
  102. package/lista-arbol/lista-arbol.functions.d.ts +0 -1
  103. package/luces-navidad/index.d.ts +0 -5
  104. package/luces-navidad/luces-navidad.component.d.ts +0 -11
  105. package/mat-suffix-search-button/index.d.ts +0 -5
  106. package/mat-suffix-search-button/mat-suffix-search-button.component.d.ts +0 -12
  107. package/menu/index.d.ts +0 -5
  108. package/menu/menu.component.d.ts +0 -25
  109. package/menu/menu.interface.d.ts +0 -16
  110. package/src/styles/base-jvsoft-components.css +0 -9
  111. package/tabla-mantenimiento/classes/data-model.d.ts +0 -25
  112. package/tabla-mantenimiento/components/progress-bar/index.d.ts +0 -5
  113. package/tabla-mantenimiento/components/progress-bar/progress-bar.component.d.ts +0 -30
  114. package/tabla-mantenimiento/components/progress-bar/public-api.d.ts +0 -1
  115. package/tabla-mantenimiento/index.d.ts +0 -5
  116. package/tabla-mantenimiento/interfaces/global/no-export.d.ts +0 -2
  117. package/tabla-mantenimiento/mat-row-keyboard-selection.directive.d.ts +0 -19
  118. package/tabla-mantenimiento/pipes/no-sanitize.pipe.d.ts +0 -10
  119. package/tabla-mantenimiento/pipes/zero-fill.pipe.d.ts +0 -8
  120. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-date/column-type-date.component.d.ts +0 -8
  121. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-icons/column-type-icons.component.d.ts +0 -9
  122. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-money/column-type-money.component.d.ts +0 -9
  123. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-number/column-type-number.component.d.ts +0 -8
  124. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-progressbar/column-type-progressbar.component.d.ts +0 -8
  125. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-sino/column-type-sino.component.d.ts +0 -9
  126. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type-text/column-type-text.component.d.ts +0 -8
  127. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.component.d.ts +0 -18
  128. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/column-type/column-type.module.d.ts +0 -23
  129. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.d.ts +0 -21
  130. package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.d.ts +0 -18
  131. package/tabla-mantenimiento/tabla-mantenimiento.component.d.ts +0 -147
  132. package/tabla-mantenimiento/tabla-mantenimiento.functions.d.ts +0 -5
  133. package/tabla-mantenimiento/tabla-mantenimiento.service.d.ts +0 -8
  134. package/tabla-mantenimiento/table-util.d.ts +0 -11
  135. /package/dialog-flotante/{public-api.d.ts → public-api.ts} +0 -0
  136. /package/lista-arbol/{public-api.d.ts → public-api.ts} +0 -0
  137. /package/luces-navidad/{public-api.d.ts → public-api.ts} +0 -0
  138. /package/mat-suffix-search-button/{public-api.d.ts → public-api.ts} +0 -0
  139. /package/menu/{public-api.d.ts → public-api.ts} +0 -0
  140. /package/tabla-mantenimiento/interfaces/global/{index.d.ts → index.ts} +0 -0
  141. /package/tabla-mantenimiento/interfaces/{index.d.ts → index.ts} +0 -0
@@ -1,2309 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { EventEmitter, Output, Input, Component, HostListener, Directive, ViewChild, Optional, inject, Pipe, NgModule, ContentChildren, ViewChildren, Injectable, ElementRef, HostBinding } from '@angular/core';
3
- import * as i3 from '@angular/material/dialog';
4
- import { MatDialogModule } from '@angular/material/dialog';
5
- import * as i4 from '@angular/material/icon';
6
- import { MatIconModule, MatIconRegistry, MatIcon } from '@angular/material/icon';
7
- import * as i1 from '@angular/common';
8
- import { CommonModule, DecimalPipe, NgIf, NgForOf } from '@angular/common';
9
- import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
10
- import * as i5 from '@angular/material/core';
11
- import { MatRipple, MatRippleModule } from '@angular/material/core';
12
- import * as i6 from '@angular/material/divider';
13
- import { MatDivider, MatDividerModule } from '@angular/material/divider';
14
- import { __decorate } from 'tslib';
15
- import { trigger, state, transition, style, animate } from '@angular/animations';
16
- import { TemplatePortal } from '@angular/cdk/portal';
17
- import * as i1$2 from '@angular/forms';
18
- import { Validators, FormControl, FormGroup, ReactiveFormsModule, FormsModule } from '@angular/forms';
19
- import * as i14 from '@angular/material/badge';
20
- import { MatBadgeModule } from '@angular/material/badge';
21
- import * as i5$1 from '@angular/material/checkbox';
22
- import { MatCheckboxModule } from '@angular/material/checkbox';
23
- import * as i2$1 from '@angular/material/menu';
24
- import { MatMenuModule, MatMenu } from '@angular/material/menu';
25
- import * as i9 from '@angular/material/paginator';
26
- import { MatPaginatorModule, MatPaginator, MAT_PAGINATOR_DEFAULT_OPTIONS } from '@angular/material/paginator';
27
- import * as i3$1 from '@angular/material/sort';
28
- import { MatSortModule, MatSort } from '@angular/material/sort';
29
- import * as i2 from '@angular/material/table';
30
- import { MatColumnDef, MatTable, MatTableModule, MatTableDataSource, MatFooterRow, MatRow } from '@angular/material/table';
31
- import * as i4$1 from '@angular/material/tooltip';
32
- import { MatTooltipModule } from '@angular/material/tooltip';
33
- import { untilDestroyed, UntilDestroy } from '@ngneat/until-destroy';
34
- import moment from 'moment';
35
- import { Subject, takeUntil, of, fromEvent } from 'rxjs';
36
- import { map, filter, take } from 'rxjs/operators';
37
- import shortHash from 'shorthash2';
38
- import * as i1$1 from '@angular/platform-browser';
39
- import { DomSanitizer } from '@angular/platform-browser';
40
- import * as XLSX from 'xlsx';
41
- import * as i2$2 from '@angular/cdk/overlay';
42
- import * as i3$2 from '@angular/material/tree';
43
- import { MatTreeModule } from '@angular/material/tree';
44
- import { NestedTreeControl } from '@angular/cdk/tree';
45
- import { DataModel as DataModel$1 } from '@jvsoft/utils';
46
-
47
- class DialogFlotanteComponent {
48
- cssClases = {};
49
- _sinTitulo = false;
50
- get sinTitulo() {
51
- return !!this._sinTitulo;
52
- }
53
- set sinTitulo(val) {
54
- this._sinTitulo = val == '';
55
- }
56
- _sinBarraDeAccion = false;
57
- get sinBarraDeAccion() {
58
- return !!this._sinBarraDeAccion;
59
- }
60
- set sinBarraDeAccion(val) {
61
- this._sinBarraDeAccion = val == '';
62
- }
63
- defaultBtnCerrar = { label: 'CERRAR', class: 'text-gray-700 border-gray-700' };
64
- _btnCerrar = this.defaultBtnCerrar;
65
- get btnCerrar() {
66
- return this._btnCerrar;
67
- }
68
- set btnCerrar(val) {
69
- if (val == null || val === '') {
70
- this._btnCerrar = this.defaultBtnCerrar;
71
- }
72
- else {
73
- this._btnCerrar = (typeof val === 'string' && val !== '') ? { ...this.defaultBtnCerrar, label: val } :
74
- (typeof val === 'boolean' && val) ? this.defaultBtnCerrar :
75
- val ?? this.defaultBtnCerrar;
76
- }
77
- }
78
- _btnCerrarBarra = true;
79
- get btnCerrarBarra() {
80
- return this._btnCerrarBarra;
81
- }
82
- set btnCerrarBarra(val) {
83
- this._btnCerrarBarra = val || true;
84
- }
85
- defaultBtnGuardar = {
86
- label: 'GUARDAR', class: 'text-blue-700 border-blue-700', icono: 'roundSave'
87
- };
88
- _btnGuardar = this.defaultBtnGuardar;
89
- get btnGuardar() {
90
- return this._btnGuardar;
91
- }
92
- set btnGuardar(val) {
93
- console.log(val);
94
- if (val == null || val === '') {
95
- this._btnGuardar = this.defaultBtnGuardar;
96
- }
97
- else {
98
- this._btnGuardar = (typeof val === 'string' && val !== '') ? { ...this.defaultBtnGuardar, label: val } :
99
- (typeof val === 'boolean' && val) ? this.defaultBtnGuardar :
100
- val ?? this.defaultBtnGuardar;
101
- }
102
- }
103
- iconoTitulo;
104
- matDialogRefActual;
105
- btnGuardarClick = new EventEmitter();
106
- btnCerrarClick = new EventEmitter();
107
- guardarDialogo() {
108
- this.btnGuardarClick.emit(true);
109
- }
110
- cerrarDialogo() {
111
- this.btnCerrarClick.emit(true);
112
- if (this.matDialogRefActual) {
113
- if (this.matDialogRefActual.componentInstance?.validarCerrarDialog) {
114
- this.matDialogRefActual.componentInstance?.validarCerrarDialog();
115
- }
116
- else {
117
- this.matDialogRefActual.close('Cerrado GDLG');
118
- }
119
- }
120
- }
121
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DialogFlotanteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
122
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: DialogFlotanteComponent, isStandalone: true, selector: "[jvsDialogFlotante]", inputs: { cssClases: "cssClases", sinTitulo: "sinTitulo", sinBarraDeAccion: "sinBarraDeAccion", btnCerrar: "btnCerrar", btnCerrarBarra: "btnCerrarBarra", btnGuardar: "btnGuardar", iconoTitulo: "iconoTitulo", matDialogRefActual: "matDialogRefActual" }, outputs: { btnGuardarClick: "btnGuardarClick", btnCerrarClick: "btnCerrarClick" }, host: { classAttribute: "jvs-dialog-flotante" }, ngImport: i0, template: "<ng-container *ngIf=\"sinTitulo; else conTitulo\">\n <ng-container [ngTemplateOutlet]=\"parteComun\"></ng-container>\n</ng-container>\n\n<ng-template #conTitulo>\n <div cdkDrag class=\"block h-full\" cdkDragRootElement=\".cdk-overlay-pane\" cdkDragBoundary=\"body\">\n <div class=\"flex-auto flex items-center justify-between hover:cursor-move gap-1\"\n [ngClass]=\"cssClases['titulo'] ?? 'bg-primary text-primary-contrast'\"\n mat-dialog-title cdkDragHandle>\n\n <mat-icon *ngIf=\"iconoTitulo\" class=\"flex-none icon-xs\" [svgIcon]=\"iconoTitulo\"></mat-icon>\n <ng-content select=\"[tituloImagen]\"></ng-content>\n <h5 class=\"flex-1 m-0\">\n <ng-content select=\"[titulo]\"></ng-content>\n </h5>\n <ng-content select=\"[selectTitulo]\"></ng-content>\n\n <ng-container *ngIf=\"btnCerrar || btnCerrarBarra\">\n <button matRipple class=\"flex items-center justify-center ml-2 h-6 w-6 bg-red-700 rounded-md text-white\"\n type=\"button\" [mat-dialog-close]=\"!matDialogRefActual\"\n (click)=\"matDialogRefActual ? cerrarDialogo() : null\">\n <mat-icon svgIcon=\"roundClose\"></mat-icon>\n </button>\n </ng-container>\n </div>\n\n <mat-divider class=\"flex-auto bg-primary\"></mat-divider>\n <ng-container [ngTemplateOutlet]=\"parteComun\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #parteComun>\n <mat-dialog-content class=\"flex-1\">\n <div class=\"contenedor-cuerpo\">\n <ng-content select=\"[cuerpo]\"></ng-content>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"flex-auto flex items-center justify-between gap-1 pt-0 mt-0\" *ngIf=\"!sinBarraDeAccion\">\n <div class=\"flex items-start justify-start gap-1\">\n <ng-content select=\"[pieIzquierda]\"></ng-content>\n </div>\n <div class=\"flex items-center justify-center gap-1\">\n <ng-content select=\"[pieCentro]\"></ng-content>\n </div>\n <div class=\"flex items-end justify-end gap-1\">\n <ng-content select=\"[pieDerecha]\"></ng-content>\n\n <!-- Bot\u00F3n Guardar -->\n <button matRipple *ngIf=\"btnGuardar\" type=\"submit\"\n class=\"boton-dialog-flotante\" [ngClass]=\"btnGuardar.class\"\n [class]=\"cssClases['btnGuardar']\" (click)=\"guardarDialogo()\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"btnGuardar?.icono ?? ''\"></mat-icon>\n <span>{{ btnGuardar.label }}</span>\n </button>\n\n <!-- Bot\u00F3n Cerrar -->\n <button matRipple *ngIf=\"btnCerrar\" type=\"button\"\n class=\"boton-dialog-flotante\" [ngClass]=\"btnCerrar.class\"\n [mat-dialog-close]=\"!matDialogRefActual\" (click)=\"matDialogRefActual ? cerrarDialogo() : null\">\n <mat-icon class=\"icon-xs\" svgIcon=\"roundClose\"></mat-icon>\n <span>{{ btnCerrar.label }}</span>\n </button>\n </div>\n </mat-dialog-actions>\n</ng-template>\n", styles: [".jvs-dialog-flotante{max-width:98vw}.jvs-dialog-flotante .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-form-field{color:unset}.jvs-dialog-flotante .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-checkbox__native-control:enabled:focus:focus:not(:checked):not(:indeterminate)~.mdc-checkbox__background{border-color:var(--color-prnpx tailwindcss init --fullimary-contrast)!important}.jvs-dialog-flotante fieldset{@apply w-full sm:w-auto rounded-sm bg-transparent pt-0 pb-1 px-1 border;}.jvs-dialog-flotante fieldset legend{@apply px-2 font-bold border-0 bg-transparent;width:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i3.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }] });
123
- }
124
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DialogFlotanteComponent, decorators: [{
125
- type: Component,
126
- args: [{ selector: '[jvsDialogFlotante]', imports: [
127
- CommonModule,
128
- MatIconModule,
129
- MatDialogModule,
130
- CdkDrag,
131
- CdkDragHandle,
132
- MatRipple,
133
- MatDivider,
134
- ], host: {
135
- class: 'jvs-dialog-flotante',
136
- }, template: "<ng-container *ngIf=\"sinTitulo; else conTitulo\">\n <ng-container [ngTemplateOutlet]=\"parteComun\"></ng-container>\n</ng-container>\n\n<ng-template #conTitulo>\n <div cdkDrag class=\"block h-full\" cdkDragRootElement=\".cdk-overlay-pane\" cdkDragBoundary=\"body\">\n <div class=\"flex-auto flex items-center justify-between hover:cursor-move gap-1\"\n [ngClass]=\"cssClases['titulo'] ?? 'bg-primary text-primary-contrast'\"\n mat-dialog-title cdkDragHandle>\n\n <mat-icon *ngIf=\"iconoTitulo\" class=\"flex-none icon-xs\" [svgIcon]=\"iconoTitulo\"></mat-icon>\n <ng-content select=\"[tituloImagen]\"></ng-content>\n <h5 class=\"flex-1 m-0\">\n <ng-content select=\"[titulo]\"></ng-content>\n </h5>\n <ng-content select=\"[selectTitulo]\"></ng-content>\n\n <ng-container *ngIf=\"btnCerrar || btnCerrarBarra\">\n <button matRipple class=\"flex items-center justify-center ml-2 h-6 w-6 bg-red-700 rounded-md text-white\"\n type=\"button\" [mat-dialog-close]=\"!matDialogRefActual\"\n (click)=\"matDialogRefActual ? cerrarDialogo() : null\">\n <mat-icon svgIcon=\"roundClose\"></mat-icon>\n </button>\n </ng-container>\n </div>\n\n <mat-divider class=\"flex-auto bg-primary\"></mat-divider>\n <ng-container [ngTemplateOutlet]=\"parteComun\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #parteComun>\n <mat-dialog-content class=\"flex-1\">\n <div class=\"contenedor-cuerpo\">\n <ng-content select=\"[cuerpo]\"></ng-content>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"flex-auto flex items-center justify-between gap-1 pt-0 mt-0\" *ngIf=\"!sinBarraDeAccion\">\n <div class=\"flex items-start justify-start gap-1\">\n <ng-content select=\"[pieIzquierda]\"></ng-content>\n </div>\n <div class=\"flex items-center justify-center gap-1\">\n <ng-content select=\"[pieCentro]\"></ng-content>\n </div>\n <div class=\"flex items-end justify-end gap-1\">\n <ng-content select=\"[pieDerecha]\"></ng-content>\n\n <!-- Bot\u00F3n Guardar -->\n <button matRipple *ngIf=\"btnGuardar\" type=\"submit\"\n class=\"boton-dialog-flotante\" [ngClass]=\"btnGuardar.class\"\n [class]=\"cssClases['btnGuardar']\" (click)=\"guardarDialogo()\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"btnGuardar?.icono ?? ''\"></mat-icon>\n <span>{{ btnGuardar.label }}</span>\n </button>\n\n <!-- Bot\u00F3n Cerrar -->\n <button matRipple *ngIf=\"btnCerrar\" type=\"button\"\n class=\"boton-dialog-flotante\" [ngClass]=\"btnCerrar.class\"\n [mat-dialog-close]=\"!matDialogRefActual\" (click)=\"matDialogRefActual ? cerrarDialogo() : null\">\n <mat-icon class=\"icon-xs\" svgIcon=\"roundClose\"></mat-icon>\n <span>{{ btnCerrar.label }}</span>\n </button>\n </div>\n </mat-dialog-actions>\n</ng-template>\n", styles: [".jvs-dialog-flotante{max-width:98vw}.jvs-dialog-flotante .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-form-field{color:unset}.jvs-dialog-flotante .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-checkbox__native-control:enabled:focus:focus:not(:checked):not(:indeterminate)~.mdc-checkbox__background{border-color:var(--color-prnpx tailwindcss init --fullimary-contrast)!important}.jvs-dialog-flotante fieldset{@apply w-full sm:w-auto rounded-sm bg-transparent pt-0 pb-1 px-1 border;}.jvs-dialog-flotante fieldset legend{@apply px-2 font-bold border-0 bg-transparent;width:auto}\n"] }]
137
- }], propDecorators: { cssClases: [{
138
- type: Input
139
- }], sinTitulo: [{
140
- type: Input
141
- }], sinBarraDeAccion: [{
142
- type: Input
143
- }], btnCerrar: [{
144
- type: Input
145
- }], btnCerrarBarra: [{
146
- type: Input
147
- }], btnGuardar: [{
148
- type: Input
149
- }], iconoTitulo: [{
150
- type: Input
151
- }], matDialogRefActual: [{
152
- type: Input
153
- }], btnGuardarClick: [{
154
- type: Output
155
- }], btnCerrarClick: [{
156
- type: Output
157
- }] } });
158
-
159
- function buscarEnArray(coleccion, idBuscar, dato) {
160
- if (!Array.isArray(coleccion) || coleccion.length === 0)
161
- return null; // 🔹 Validación de entrada
162
- return Array.isArray(idBuscar)
163
- ? coleccion.find(item => idBuscar.every((campo, idx) => item[campo] === dato[idx])) || null
164
- : coleccion.find(item => item[idBuscar] === dato) || null;
165
- }
166
- function formatearFecha(val, hora = '00:00:00') {
167
- if (val) {
168
- if (val.length <= 10) {
169
- val = val + ' ' + hora;
170
- }
171
- return new Date(val);
172
- }
173
- return val;
174
- }
175
- function esNumero(value) {
176
- return !isNaN(Number(value));
177
- }
178
- function capitalizarTexto(texto) {
179
- texto = texto.replace(/_/g, ' ');
180
- texto = texto.replace(/-/g, ' ');
181
- const textoCortado = texto.split(' ');
182
- const nText = [];
183
- textoCortado.forEach(textActual => {
184
- nText.push(textActual.charAt(0).toUpperCase() + textActual.slice(1));
185
- });
186
- return nText.join(' ');
187
- }
188
- function getBrowserName() {
189
- const agent = window.navigator.userAgent.toLowerCase();
190
- switch (true) {
191
- case agent.indexOf('edge') > -1:
192
- return 'edge';
193
- case agent.indexOf('opr') > -1 && !!window.opr:
194
- return 'opera';
195
- case agent.indexOf('chrome') > -1 && !!window.chrome:
196
- return 'chrome';
197
- case agent.indexOf('trident') > -1:
198
- return 'ie';
199
- case agent.indexOf('firefox') > -1:
200
- return 'firefox';
201
- case agent.indexOf('safari') > -1:
202
- return 'safari';
203
- default:
204
- return 'other';
205
- }
206
- }
207
-
208
- class DataModel {
209
- modelosChk = {}; // Usar any para valores dinámicos
210
- checkbox;
211
- constructor() {
212
- this.checkbox = new ForCheckboxModel(this);
213
- }
214
- generarId(row, campoValor, separador = '') {
215
- if (typeof campoValor == 'string') {
216
- campoValor = [campoValor];
217
- }
218
- return campoValor.map(data => row[data]).join(separador);
219
- }
220
- // Agrega controles al objeto modelosChk
221
- agregarControles(lista, idLista, limpiar = true, campoValor = null, campoValorSeparador = '') {
222
- if (limpiar) {
223
- this.modelosChk = {};
224
- }
225
- const asignarValor = (dat, idLista, campoValor, key) => {
226
- if (!key) {
227
- key = dat[idLista] + (campoValor.includes('.') ? '' : `.${campoValor}`);
228
- }
229
- const mat = campoValor.match(/^([in])[A-Z][a-zA-Z]+/);
230
- if (mat) {
231
- this.modelosChk[key] = dat[campoValor] * 1;
232
- }
233
- else {
234
- this.modelosChk[key] = dat[campoValor];
235
- }
236
- };
237
- lista.forEach(dat => {
238
- if (campoValor === null) {
239
- // Caso 1: Sin campoValor, se asigna false
240
- this.modelosChk[dat[idLista]] = false;
241
- }
242
- else if (typeof campoValor === 'string') {
243
- // Caso 2: campoValor es un string
244
- asignarValor(dat, idLista, campoValor, dat[idLista]);
245
- }
246
- else if (campoValorSeparador) {
247
- const idStr = this.generarId(dat, campoValor, campoValorSeparador);
248
- // Caso 2: campoValor es un string
249
- asignarValor(dat, idLista, '.', idStr);
250
- }
251
- else {
252
- // Caso 3: campoValor es un array de strings
253
- campoValor.forEach(data => asignarValor(dat, idLista, data));
254
- }
255
- });
256
- }
257
- // Establece el estado de un índice
258
- setState(idx, state) {
259
- this.modelosChk[idx] = state;
260
- }
261
- // Obtiene el estado de un índice
262
- getState(idx) {
263
- return this.modelosChk[idx];
264
- }
265
- getDataMultiple(idx) {
266
- const camposMod = Object.keys(this.modelosChk).filter(key => key.split('.')[0] == idx);
267
- const vRet = {};
268
- camposMod.forEach(key => {
269
- vRet[key.split('.')[1]] = this.modelosChk[key];
270
- });
271
- return vRet;
272
- }
273
- // Genera una lista basada en el estado de los índices
274
- generarLista(tipoRetorno = null, esCampoNumerico = false) {
275
- const strLista = [];
276
- const objLista = {};
277
- Object.keys(this.modelosChk).forEach(key => {
278
- if ((esCampoNumerico && esNumero(this.modelosChk[key])) ||
279
- (this.modelosChk[key])) {
280
- strLista.push(key);
281
- objLista[key] = this.modelosChk[key];
282
- }
283
- });
284
- if (tipoRetorno === 'array') {
285
- return strLista;
286
- }
287
- if (tipoRetorno === 'object') {
288
- return objLista;
289
- }
290
- return strLista.join(',');
291
- }
292
- generarFormGroupFromModelosChk(tipo) {
293
- const formGroupObj = {};
294
- let validadores = [];
295
- if (tipo == 'number') {
296
- validadores = [
297
- Validators.required,
298
- Validators.min(1)
299
- ];
300
- }
301
- Object.keys(this.modelosChk).forEach(key => {
302
- formGroupObj[key] = new FormControl(this.modelosChk[key], validadores);
303
- });
304
- return new FormGroup(formGroupObj);
305
- // return this.formBuilder.group(formGroupObj);
306
- }
307
- }
308
- class ForCheckboxModel {
309
- modeloCheck;
310
- constructor(modeloCheck) {
311
- this.modeloCheck = modeloCheck;
312
- }
313
- get cantidadActivos() {
314
- return Object.values(this.modeloCheck.modelosChk).filter(Boolean).length;
315
- }
316
- get existenActivados() {
317
- return this.cantidadActivos > 0;
318
- }
319
- get todosActivos() {
320
- const total = Object.keys(this.modeloCheck.modelosChk).length;
321
- const activos = this.cantidadActivos;
322
- return activos > 0 && total === activos;
323
- }
324
- get algunosActivos() {
325
- const total = Object.keys(this.modeloCheck.modelosChk).length;
326
- const activos = this.cantidadActivos;
327
- return activos > 0 && total !== activos;
328
- }
329
- establecerTodos(activo) {
330
- Object.keys(this.modeloCheck.modelosChk).forEach(idx => this.modeloCheck.modelosChk[idx] = activo);
331
- }
332
- }
333
-
334
- function tipoValorFuncion(datoParam, defaultValue, ...param) {
335
- if (datoParam === undefined || datoParam === null) {
336
- return defaultValue; // Retorna el valor por defecto si es undefined
337
- }
338
- if (typeof datoParam === 'function') {
339
- return datoParam(...param);
340
- }
341
- return datoParam;
342
- }
343
-
344
- class MatRowKeyboardSelectionDirective {
345
- el;
346
- rows;
347
- renderedData;
348
- tabla; // Entrada: Referencia a la tabla
349
- rowModel; // Entrada: Modelo de fila actual
350
- seleccionarSiguiente = new EventEmitter(); // Salida: Evento al seleccionar siguiente
351
- unsubscriber$ = new Subject();
352
- constructor(el) {
353
- this.el = el;
354
- }
355
- ngOnInit() {
356
- // Asignar tabindex si no está definido
357
- if (this.el.nativeElement.tabIndex < 0) {
358
- this.el.nativeElement.tabIndex = 0;
359
- }
360
- // Obtener la fuente de datos de la tabla
361
- const dataSource = this.tabla.dataSource;
362
- // Suscribirse a los cambios en los datos
363
- dataSource.connect().pipe(takeUntil(this.unsubscriber$)).subscribe(data => {
364
- this.renderedData = data;
365
- this.rows = Array.from(this.getTableRows());
366
- });
367
- }
368
- ngOnDestroy() {
369
- // Finalizar la suscripción al destruir la directiva
370
- this.unsubscriber$.next(null);
371
- this.unsubscriber$.complete();
372
- }
373
- onKeydown(event) {
374
- var element = event.target;
375
- if (element.tagName === "INPUT") {
376
- event.stopPropagation();
377
- }
378
- else {
379
- const currentIndex = this.renderedData.findIndex(row => row === this.rowModel);
380
- const eRef = event.target;
381
- this.rows = this.rows.filter(elem => elem.hasAttribute('id'));
382
- const arrayFilas = Array.from(this.rows);
383
- const fElem = arrayFilas.filter(elem => elem.id == eRef.id).pop();
384
- const cElemIdx = arrayFilas.findIndex(elem => elem == fElem);
385
- let newRow;
386
- // Controlar las teclas presionadas
387
- switch (event.key) {
388
- case 'ArrowDown':
389
- newRow = this.rows[cElemIdx + 1];
390
- break;
391
- case 'ArrowUp':
392
- newRow = this.rows[cElemIdx - 1];
393
- break;
394
- case 'Enter':
395
- case ' ':
396
- this.seleccionarSiguiente.next(this.renderedData[currentIndex]);
397
- event.preventDefault();
398
- break;
399
- }
400
- // Enfocar la nueva fila seleccionada
401
- if (newRow) {
402
- newRow.classList.add('estaFocus');
403
- newRow.focus();
404
- }
405
- }
406
- }
407
- getTableRows() {
408
- let el = this.el.nativeElement;
409
- // Recorrer los elementos padres hasta encontrar la tabla
410
- while (el && el.parentNode) {
411
- el = el.parentNode;
412
- // Verificar si es una tabla de material
413
- if (el.tagName && el.tagName.toLowerCase() === 'mat-table' || el.hasAttribute('mat-table')) {
414
- return el.querySelectorAll('mat-row, tr[mat-row]');
415
- }
416
- }
417
- return undefined;
418
- }
419
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatRowKeyboardSelectionDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
420
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.1.7", type: MatRowKeyboardSelectionDirective, isStandalone: true, selector: "[matRowKeyboardSelection]", inputs: { tabla: ["matRowKeyboardSelection", "tabla"], rowModel: "rowModel" }, outputs: { seleccionarSiguiente: "seleccionarSiguiente" }, host: { listeners: { "keydown": "onKeydown($event)" } }, ngImport: i0 });
421
- }
422
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatRowKeyboardSelectionDirective, decorators: [{
423
- type: Directive,
424
- args: [{
425
- selector: '[matRowKeyboardSelection]'
426
- }]
427
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { tabla: [{
428
- type: Input,
429
- args: ['matRowKeyboardSelection']
430
- }], rowModel: [{
431
- type: Input
432
- }], seleccionarSiguiente: [{
433
- type: Output
434
- }], onKeydown: [{
435
- type: HostListener,
436
- args: ['keydown', ['$event']]
437
- }] } });
438
-
439
- class ColumnTypeComponent {
440
- table;
441
- column;
442
- columnDef;
443
- columnTitleTemplate; // Permite personalizar títulos
444
- columnFooterTemplate; // Permite personalizar footer
445
- cellTemplate; // Se usa para el contenido de las celdas
446
- constructor(table) {
447
- this.table = table;
448
- }
449
- ngOnInit() {
450
- }
451
- ngAfterViewInit() {
452
- if (this.columnDef) {
453
- this.table.addColumnDef(this.columnDef);
454
- }
455
- }
456
- accionClick(item, event) {
457
- if (this.column.click) {
458
- this.column.click(item);
459
- event.stopPropagation();
460
- }
461
- return false;
462
- }
463
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeComponent, deps: [{ token: i2.MatTable, optional: true }], target: i0.ɵɵFactoryTarget.Component });
464
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeComponent, isStandalone: false, selector: "jvs-column-type", inputs: { column: "column", columnTitleTemplate: "columnTitleTemplate", columnFooterTemplate: "columnFooterTemplate", cellTemplate: "cellTemplate" }, viewQueries: [{ propertyName: "columnDef", first: true, predicate: MatColumnDef, descendants: true, static: true }], ngImport: i0, template: "<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <ng-container *ngIf=\"columnTitleTemplate; else defaultTitle\">\n <ng-container *ngTemplateOutlet=\"columnTitleTemplate; context: { column: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultTitle>\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </ng-template>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { row: row, column: column }\"></ng-container>\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n <ng-container *ngIf=\"columnFooterTemplate; else defaultFooter\">\n <ng-container *ngTemplateOutlet=\"columnFooterTemplate; context: { column: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultFooter>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </ng-template>\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }] });
465
- }
466
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeComponent, decorators: [{
467
- type: Component,
468
- args: [{ selector: 'jvs-column-type', standalone: false, template: "<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <ng-container *ngIf=\"columnTitleTemplate; else defaultTitle\">\n <ng-container *ngTemplateOutlet=\"columnTitleTemplate; context: { column: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultTitle>\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </ng-template>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { row: row, column: column }\"></ng-container>\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n <ng-container *ngIf=\"columnFooterTemplate; else defaultFooter\">\n <ng-container *ngTemplateOutlet=\"columnFooterTemplate; context: { column: column }\"></ng-container>\n </ng-container>\n <ng-template #defaultFooter>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </ng-template>\n </th>\n</ng-container>\n" }]
469
- }], ctorParameters: () => [{ type: i2.MatTable, decorators: [{
470
- type: Optional
471
- }] }], propDecorators: { column: [{
472
- type: Input,
473
- args: [{ required: true }]
474
- }], columnDef: [{
475
- type: ViewChild,
476
- args: [MatColumnDef, { static: true }]
477
- }], columnTitleTemplate: [{
478
- type: Input
479
- }], columnFooterTemplate: [{
480
- type: Input
481
- }], cellTemplate: [{
482
- type: Input
483
- }] } });
484
-
485
- class ColumnTypeNumberComponent extends ColumnTypeComponent {
486
- column = {};
487
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeNumberComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
488
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeNumberComponent, isStandalone: false, selector: "jvs-column-type-number", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "\n<ng-template #cellTemplate let-row=\"row\">\n\t\t\t\t<span *ngIf=\"column.property && row[column.property]\" class=\"!text-indigo-900 font-semibold\">\n\t\t\t\t\t{{ row[column.property] | number: (column.format ? column.format : '1.0-2') }}\n\t\t\t\t</span>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
489
- }
490
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeNumberComponent, decorators: [{
491
- type: Component,
492
- args: [{ selector: 'jvs-column-type-number', standalone: false, template: "\n<ng-template #cellTemplate let-row=\"row\">\n\t\t\t\t<span *ngIf=\"column.property && row[column.property]\" class=\"!text-indigo-900 font-semibold\">\n\t\t\t\t\t{{ row[column.property] | number: (column.format ? column.format : '1.0-2') }}\n\t\t\t\t</span>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n" }]
493
- }], propDecorators: { column: [{
494
- type: Input,
495
- args: [{ required: true }]
496
- }] } });
497
-
498
- class ColumnTypeDateComponent extends ColumnTypeComponent {
499
- column = {};
500
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeDateComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
501
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeDateComponent, isStandalone: false, selector: "jvs-column-type-date", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n {{ row[column.property] | date: (column.format ? column.format : 'dd/MM/yyyy') }}\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
502
- }
503
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeDateComponent, decorators: [{
504
- type: Component,
505
- args: [{ selector: 'jvs-column-type-date', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n {{ row[column.property] | date: (column.format ? column.format : 'dd/MM/yyyy') }}\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n" }]
506
- }], propDecorators: { column: [{
507
- type: Input,
508
- args: [{ required: true }]
509
- }] } });
510
-
511
- const YES_ICON = `
512
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M21 7L9 19l-5.5-5.5l1.41-1.41L9 16.17L19.59 5.59z"/></svg>
513
- `;
514
- const NO_ICON = `
515
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12z"/></svg>
516
- `;
517
- class ColumnTypeSinoComponent extends ColumnTypeComponent {
518
- column = {}; // 🟢 Solución
519
- constructor() {
520
- super(inject(MatTable)); // 🟢 Llamar al constructor del padre
521
- const iconRegistry = inject(MatIconRegistry);
522
- const sanitizer = inject(DomSanitizer);
523
- // Note that we provide the icon here as a string literal here due to a limitation in
524
- // Stackblitz. If you want to provide the icon from a URL, you can use:
525
- // `iconRegistry.addSvgIcon('thumbs-up', sanitizer.bypassSecurityTrustResourceUrl('icon.svg'));`
526
- iconRegistry.addSvgIconLiteralInNamespace('yes_no', 'yes', sanitizer.bypassSecurityTrustHtml(YES_ICON));
527
- iconRegistry.addSvgIconLiteralInNamespace('yes_no', 'no', sanitizer.bypassSecurityTrustHtml(NO_ICON));
528
- // iconRegistry.addSvgIconLiteral('yesIcon', sanitizer.bypassSecurityTrustHtml(YES_ICON));
529
- // iconRegistry.addSvgIconLiteral('noIcon', sanitizer.bypassSecurityTrustHtml(NO_ICON));
530
- }
531
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeSinoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
532
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeSinoComponent, isStandalone: false, selector: "jvs-column-type-sino", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <mat-icon *ngIf=\"[column.yesValue, 1, true].includes(row[column.property])\"\n [svgIcon]=\"column.yesIcon ?? 'yes_no:yes'\" class=\"icon-sm\"\n [matTooltip]=\"column.yesTooltip ?? undefined\"\n ></mat-icon>\n <mat-icon *ngIf=\"[column.noValue, 0, false].includes(row[column.property])\" [svgIcon]=\"column.noIcon ?? 'yes_no:no'\"\n class=\"icon-sm\"\n [matTooltip]=\"column.noTooltip ?? undefined\"\n ></mat-icon>\n <span class=\"cdk-visually-hidden\">{{ row[column.property] }}</span>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
533
- }
534
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeSinoComponent, decorators: [{
535
- type: Component,
536
- args: [{ selector: 'jvs-column-type-sino', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <mat-icon *ngIf=\"[column.yesValue, 1, true].includes(row[column.property])\"\n [svgIcon]=\"column.yesIcon ?? 'yes_no:yes'\" class=\"icon-sm\"\n [matTooltip]=\"column.yesTooltip ?? undefined\"\n ></mat-icon>\n <mat-icon *ngIf=\"[column.noValue, 0, false].includes(row[column.property])\" [svgIcon]=\"column.noIcon ?? 'yes_no:no'\"\n class=\"icon-sm\"\n [matTooltip]=\"column.noTooltip ?? undefined\"\n ></mat-icon>\n <span class=\"cdk-visually-hidden\">{{ row[column.property] }}</span>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n" }]
537
- }], ctorParameters: () => [], propDecorators: { column: [{
538
- type: Input,
539
- args: [{ required: true }]
540
- }] } });
541
-
542
- class ProgressBarComponent {
543
- objThis;
544
- porcentaje = 0;
545
- textoCentrado = false;
546
- _textoMostrar = '';
547
- get textoMostrar() { return this._textoMostrar; }
548
- set textoMostrar(val) { this._textoMostrar = val; }
549
- _formatoNumero = '';
550
- get formatoNumero() { return this._formatoNumero; }
551
- set formatoNumero(val) { this._formatoNumero = val ?? '1.0-0'; }
552
- _coloresValor = [];
553
- get coloresValor() { return this._coloresValor; }
554
- set coloresValor(val) {
555
- if (!val || !Array.isArray(val)) {
556
- this._coloresValor = [
557
- { valorMaximo: 1, class: 'p-0' },
558
- { valorMaximo: 40, class: 'bg-red-400 text-red-900' },
559
- // {valorMaximo: 35, class: 'bg-red-600 text-red-100'},
560
- { valorMaximo: 80, class: 'bg-yellow-600 text-yellow-100' },
561
- { valorMaximo: 100, class: 'bg-green-600 text-green-100' },
562
- ];
563
- }
564
- else {
565
- this._coloresValor = val;
566
- }
567
- }
568
- constructor() { }
569
- ngOnInit() {
570
- }
571
- colorEstilo() {
572
- let estiloFin = null;
573
- let claseFin = null;
574
- let encontro = false;
575
- this.coloresValor = this.ordenarPorPropiedad(this.coloresValor, 'valorMaximo');
576
- this.coloresValor.forEach(estilo => {
577
- if (!encontro && (this.porcentaje <= estilo.valorMaximo)) {
578
- // console.log(this.porcentaje, estilo, (this.porcentaje < estilo.valorMaximo));
579
- encontro = true;
580
- estiloFin = estilo.style;
581
- claseFin = estilo.class;
582
- }
583
- });
584
- return {
585
- style: estiloFin ?? '',
586
- class: claseFin ?? '',
587
- };
588
- }
589
- ordenarPorPropiedad(objData, propiedad, numeros = false) {
590
- if (numeros) {
591
- return objData.sort((a, b) => a[propiedad] - b[propiedad]);
592
- }
593
- return objData.sort((a, b) => (a[propiedad] > b[propiedad]) ? 1 : ((b[propiedad] > a[propiedad]) ? -1 : 0));
594
- }
595
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
596
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ProgressBarComponent, isStandalone: true, selector: "jvs-progress-bar", inputs: { objThis: "objThis", porcentaje: "porcentaje", textoCentrado: "textoCentrado", textoMostrar: "textoMostrar", formatoNumero: "formatoNumero", coloresValor: "coloresValor" }, host: { classAttribute: "jvs-progress-bar" }, ngImport: i0, template: "<div class=\"w-full bg-gray-200 text-gray-700 rounded-full\" [class.text-center]=\"textoCentrado\">\n\t<div class=\"text-xxs font-medium text-center p-1 leading-none rounded-full\"\n\t\t [ngClass]=\"colorEstilo().class ? colorEstilo().class : 'bg-blue-600 text-blue-100'\"\n\t\t [style]=\"colorEstilo().style ? colorEstilo().style : ''\"\n\t\t [style.width]=\"(textoCentrado ? 100 : porcentaje) + '%'\"\n\t>\n <span *ngIf=\"textoMostrar else defaultText;\" class=\"whitespace-nowrap\">{{ textoMostrar }}</span>\n <ng-template #defaultText>{{ porcentaje | number: formatoNumero }}%</ng-template>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
597
- }
598
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressBarComponent, decorators: [{
599
- type: Component,
600
- args: [{ selector: 'jvs-progress-bar', imports: [
601
- CommonModule,
602
- DecimalPipe
603
- ], host: {
604
- class: 'jvs-progress-bar',
605
- }, template: "<div class=\"w-full bg-gray-200 text-gray-700 rounded-full\" [class.text-center]=\"textoCentrado\">\n\t<div class=\"text-xxs font-medium text-center p-1 leading-none rounded-full\"\n\t\t [ngClass]=\"colorEstilo().class ? colorEstilo().class : 'bg-blue-600 text-blue-100'\"\n\t\t [style]=\"colorEstilo().style ? colorEstilo().style : ''\"\n\t\t [style.width]=\"(textoCentrado ? 100 : porcentaje) + '%'\"\n\t>\n <span *ngIf=\"textoMostrar else defaultText;\" class=\"whitespace-nowrap\">{{ textoMostrar }}</span>\n <ng-template #defaultText>{{ porcentaje | number: formatoNumero }}%</ng-template>\n </div>\n</div>\n" }]
606
- }], ctorParameters: () => [], propDecorators: { objThis: [{
607
- type: Input
608
- }], porcentaje: [{
609
- type: Input
610
- }], textoCentrado: [{
611
- type: Input
612
- }], textoMostrar: [{
613
- type: Input
614
- }], formatoNumero: [{
615
- type: Input
616
- }], coloresValor: [{
617
- type: Input
618
- }] } });
619
-
620
- class ColumnTypeProgressbarComponent extends ColumnTypeComponent {
621
- column = {};
622
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeProgressbarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
623
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeProgressbarComponent, isStandalone: false, selector: "jvs-column-type-progressbar", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <jvs-progress-bar\n [textoCentrado]=\"!!column.progressbar.textoCentrado\"\n [porcentaje]=\"column.progressbar.porcentaje(row)\"\n [coloresValor]=\"column.progressbar.coloresValor\"\n [formatoNumero]=\"column.progressbar.formatoNumero\"\n [textoMostrar]=\"column.progressbar.textoMostrar ? column.progressbar.textoMostrar(row) : ''\"\n ></jvs-progress-bar>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: ProgressBarComponent, selector: "jvs-progress-bar", inputs: ["objThis", "porcentaje", "textoCentrado", "textoMostrar", "formatoNumero", "coloresValor"] }] });
624
- }
625
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeProgressbarComponent, decorators: [{
626
- type: Component,
627
- args: [{ selector: 'jvs-column-type-progressbar', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <jvs-progress-bar\n [textoCentrado]=\"!!column.progressbar.textoCentrado\"\n [porcentaje]=\"column.progressbar.porcentaje(row)\"\n [coloresValor]=\"column.progressbar.coloresValor\"\n [formatoNumero]=\"column.progressbar.formatoNumero\"\n [textoMostrar]=\"column.progressbar.textoMostrar ? column.progressbar.textoMostrar(row) : ''\"\n ></jvs-progress-bar>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n" }]
628
- }], propDecorators: { column: [{
629
- type: Input,
630
- args: [{ required: true }]
631
- }] } });
632
-
633
- class NoSanitizePipe {
634
- domSanitizer;
635
- constructor(domSanitizer) {
636
- this.domSanitizer = domSanitizer;
637
- }
638
- transform(html) {
639
- return this.domSanitizer.bypassSecurityTrustHtml(html);
640
- }
641
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: NoSanitizePipe, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
642
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: NoSanitizePipe, isStandalone: true, name: "noSanitize" });
643
- }
644
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: NoSanitizePipe, decorators: [{
645
- type: Pipe,
646
- args: [{ name: 'noSanitize' }]
647
- }], ctorParameters: () => [{ type: i1$1.DomSanitizer }] });
648
-
649
- class ZeroFillPipe {
650
- transform(value, digitos, ...args) {
651
- let s = value + '';
652
- while (s.length < digitos) {
653
- s = '0' + s;
654
- }
655
- return s;
656
- }
657
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
658
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, isStandalone: true, name: "zeroFill" });
659
- }
660
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, decorators: [{
661
- type: Pipe,
662
- args: [{
663
- name: 'zeroFill',
664
- }]
665
- }] });
666
- function zeroFill(value, digitos, ...args) {
667
- return new ZeroFillPipe().transform(value, digitos, args);
668
- }
669
-
670
- // export * from './progress-spinner.service';
671
-
672
- class ColumnTypeTextComponent extends ColumnTypeComponent {
673
- column = {}; // 🟢 Solución
674
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeTextComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
675
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeTextComponent, isStandalone: false, selector: "jvs-column-type-text", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <div *ngIf=\"column.innerHTML; else sinInnerHTML\" [class]=\"column.text?.cssContenedor\" [ngStyle]=\"column.text?.cssStyle\" class=\"hover:!max-h-max\"\n [innerHTML]=\"column.innerHTML(row) | noSanitize\">\n </div>\n <ng-template #sinInnerHTML>\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container\n *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : row[column.property]) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: itm, class: column.textCss, row: row }\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #campoTextNormal>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n\n\n<!--<ng-container matColumnDef=\"{{ column.property }}\">\n<th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n</th>\n<ng-container *ngIf=\"column.innerHTML; else sinInnerHTML\">\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(column, row, $event)\">\n <div [class]=\"column.text?.cssContenedor\" [ngStyle]=\"column.text?.cssStyle\" class=\"hover:!max-h-max\"\n [innerHTML]=\"column.innerHTML(row) | noSanitize\">\n\n </div>\n </td>\n</ng-container>\n<ng-template #sinInnerHTML>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container\n *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : row[column.property]) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: itm, class: column.textCss, row: row }\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #campoTextNormal>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n </td>\n</ng-template>\n<th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell\n [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n</th>\n</ng-container>-->\n\n<ng-template #tipoDatoString let-row=\"row\" let-fila=\"fila\" let-tipo=\"tipo\" let-value=\"value\" let-format=\"format\"\n let-clase=\"class\">\n <ng-container [ngSwitch]=\"tipo\">\n <ng-container *ngSwitchCase=\"'text'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">\n <span *ngIf=\"!fila.zeroFill\">{{ value }}</span>\n <span *ngIf=\"fila.zeroFill\">{{ value | zeroFill: fila.zeroFill }}</span>\n </span></ng-container>\n <ng-container *ngSwitchCase=\"'date'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">{{ value | date: (format || 'dd/MM/yyyy') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'number'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">{{ value | number: (format || '0.0-2') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'money'\"><span [ngClass]=\"clase\"\n [class.text-sky-700]=\"(value * 1) >= 0\" [class.text-red-700]=\"(value * 1) < 0\"\n *ngIf=\"value\" (click)=\"accionClick(row, $event)\">{{ value | number: (format || '1.2-2') }}</span>\n </ng-container>\n\n <!--\t\t<span [ngClass]=\"class\" *ngSwitchCase=\"'date'\">{{ value | date: (format || 'dd/MM/yyyy') }}</span>-->\n <!--\t\t<span [ngClass]=\"class\" *ngSwitchCase=\"'number'\">{{ value | number: (format || '0.0-2') }}</span>-->\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: NoSanitizePipe, name: "noSanitize" }, { kind: "pipe", type: ZeroFillPipe, name: "zeroFill" }] });
676
- }
677
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeTextComponent, decorators: [{
678
- type: Component,
679
- args: [{ selector: 'jvs-column-type-text', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <div *ngIf=\"column.innerHTML; else sinInnerHTML\" [class]=\"column.text?.cssContenedor\" [ngStyle]=\"column.text?.cssStyle\" class=\"hover:!max-h-max\"\n [innerHTML]=\"column.innerHTML(row) | noSanitize\">\n </div>\n <ng-template #sinInnerHTML>\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container\n *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : row[column.property]) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: itm, class: column.textCss, row: row }\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #campoTextNormal>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n\n\n<!--<ng-container matColumnDef=\"{{ column.property }}\">\n<th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n</th>\n<ng-container *ngIf=\"column.innerHTML; else sinInnerHTML\">\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(column, row, $event)\">\n <div [class]=\"column.text?.cssContenedor\" [ngStyle]=\"column.text?.cssStyle\" class=\"hover:!max-h-max\"\n [innerHTML]=\"column.innerHTML(row) | noSanitize\">\n\n </div>\n </td>\n</ng-container>\n<ng-template #sinInnerHTML>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container\n *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : row[column.property]) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: itm, class: column.textCss, row: row }\"></ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #campoTextNormal>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n </td>\n</ng-template>\n<th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell\n [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n</th>\n</ng-container>-->\n\n<ng-template #tipoDatoString let-row=\"row\" let-fila=\"fila\" let-tipo=\"tipo\" let-value=\"value\" let-format=\"format\"\n let-clase=\"class\">\n <ng-container [ngSwitch]=\"tipo\">\n <ng-container *ngSwitchCase=\"'text'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">\n <span *ngIf=\"!fila.zeroFill\">{{ value }}</span>\n <span *ngIf=\"fila.zeroFill\">{{ value | zeroFill: fila.zeroFill }}</span>\n </span></ng-container>\n <ng-container *ngSwitchCase=\"'date'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">{{ value | date: (format || 'dd/MM/yyyy') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'number'\"><span [ngClass]=\"clase\" *ngIf=\"value\"\n (click)=\"accionClick(row, $event)\">{{ value | number: (format || '0.0-2') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'money'\"><span [ngClass]=\"clase\"\n [class.text-sky-700]=\"(value * 1) >= 0\" [class.text-red-700]=\"(value * 1) < 0\"\n *ngIf=\"value\" (click)=\"accionClick(row, $event)\">{{ value | number: (format || '1.2-2') }}</span>\n </ng-container>\n\n <!--\t\t<span [ngClass]=\"class\" *ngSwitchCase=\"'date'\">{{ value | date: (format || 'dd/MM/yyyy') }}</span>-->\n <!--\t\t<span [ngClass]=\"class\" *ngSwitchCase=\"'number'\">{{ value | number: (format || '0.0-2') }}</span>-->\n </ng-container>\n</ng-template>\n" }]
680
- }], propDecorators: { column: [{
681
- type: Input,
682
- args: [{ required: true }]
683
- }] } });
684
-
685
- class ColumnTypeMoneyComponent extends ColumnTypeComponent {
686
- column = {};
687
- value(row) {
688
- return (this.column.transformar ? this.column.transformar(row) : row[this.column.property]);
689
- }
690
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeMoneyComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
691
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeMoneyComponent, isStandalone: false, selector: "jvs-column-type-money", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <span [ngClass]=\"column.textCss\"\n [class.text-sky-700]=\"(value(row)) >= 0\" [class.text-red-700]=\"(value(row)) < 0\"\n *ngIf=\"value(row)\"\n (click)=\"accionClick(row, $event)\">{{ value(row) | number: (column.format || '1.2-2') }}</span>\n</ng-template>\n<ng-template #columnFooterTemplate let-row=\"row\">\n\t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\"\n [class.text-red-700]=\"column.transformarFooter() < 0\"\n >\n\t\t\t\t\t<span>{{ column.transformarFooter() | currency: column.simboloMoneda ?? 'S/' }}</span>\n\t\t\t\t</span>\n</ng-template>\n\n<!--<jvs-column-type [column]=\"column\" [cellTemplate]=\"cellTemplate\" [columnFooterTemplate]=\"columnFooterTemplate\"></jvs-column-type>-->\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n \t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\"\n [class.text-red-700]=\"column.transformarFooter() < 0\"\n >\n\t\t\t\t\t<span>{{ column.transformarFooter() | currency: column.simboloMoneda ?? 'S/' }}</span>\n\t\t\t\t</span>\n </th>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }] });
692
- }
693
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeMoneyComponent, decorators: [{
694
- type: Component,
695
- args: [{ selector: 'jvs-column-type-money', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <span [ngClass]=\"column.textCss\"\n [class.text-sky-700]=\"(value(row)) >= 0\" [class.text-red-700]=\"(value(row)) < 0\"\n *ngIf=\"value(row)\"\n (click)=\"accionClick(row, $event)\">{{ value(row) | number: (column.format || '1.2-2') }}</span>\n</ng-template>\n<ng-template #columnFooterTemplate let-row=\"row\">\n\t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\"\n [class.text-red-700]=\"column.transformarFooter() < 0\"\n >\n\t\t\t\t\t<span>{{ column.transformarFooter() | currency: column.simboloMoneda ?? 'S/' }}</span>\n\t\t\t\t</span>\n</ng-template>\n\n<!--<jvs-column-type [column]=\"column\" [cellTemplate]=\"cellTemplate\" [columnFooterTemplate]=\"columnFooterTemplate\"></jvs-column-type>-->\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n \t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\"\n [class.text-red-700]=\"column.transformarFooter() < 0\"\n >\n\t\t\t\t\t<span>{{ column.transformarFooter() | currency: column.simboloMoneda ?? 'S/' }}</span>\n\t\t\t\t</span>\n </th>\n</ng-container>\n" }]
696
- }], propDecorators: { column: [{
697
- type: Input,
698
- args: [{ required: true }]
699
- }] } });
700
-
701
- class ColumnTypeIconsComponent extends ColumnTypeComponent {
702
- column = {};
703
- obtenerItems(columna, row) {
704
- if (typeof columna.items === 'function') {
705
- return columna.items(row);
706
- }
707
- return columna.items;
708
- }
709
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeIconsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
710
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ColumnTypeIconsComponent, isStandalone: false, selector: "jvs-column-type-icons", inputs: { column: "column" }, usesInheritance: true, ngImport: i0, template: "<ng-template #cellTemplate let-row=\"row\">\n <div class=\"flex items-center justify-center\" [ngClass]=\"{ '-space-x-1': !column.iconsDef?.soloIcono }\"\n >\n <ng-container *ngFor=\"let icon of obtenerItems(column.iconsDef, row)\">\n <ng-container *ngIf=\"!column.iconsDef?.soloIcono; else soloIcono\">\n <button matRipple type=\"button\" *ngIf=\"!icon.esVisible || icon.esVisible(row)\"\n (click)=\"icon.click ? icon.click(row) : false; $event.stopPropagation()\"\n class=\"flex items-center justify-center p-1 rounded border shadow-sm hover:shadow-lg\"\n [ngClass]=\"icon.contentCss\"\n [matTooltip]=\"icon.toolTip ?? row[icon.toolTipField ?? '_field_']\"\n [matTooltipDisabled]=\"!icon.toolTip && !icon.toolTipField\"\n >\n <ng-container [ngTemplateOutlet]=\"iconoConTamanio\"\n [ngTemplateOutletContext]=\"{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}\"></ng-container>\n </button>\n </ng-container>\n <ng-template #soloIcono>\n <div *ngIf=\"!icon.esVisible || icon.esVisible(row)\" [ngClass]=\"icon.contentCss\"\n class=\"flex items-center\"\n [matTooltip]=\"icon.toolTip ?? row[icon.toolTipField ?? '_field_']\"\n [matTooltipDisabled]=\"!icon.toolTip && !icon.toolTipField\"\n >\n <ng-container [ngTemplateOutlet]=\"iconoConTamanio\"\n [ngTemplateOutletContext]=\"{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}\"></ng-container>\n </div>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n\n\n<ng-template #iconoConTamanio let-icon=\"icon\" let-iconClass=\"iconClass\" let-size=\"size\">\n <mat-icon *ngIf=\"size\" [svgIcon]=\"icon\" [ngClass]=\"iconClass\" [inline]=\"true\"\n [style.font-size]=\"size\"\n [style.height]=\"size\"\n [style.width]=\"size\"\n ></mat-icon>\n <mat-icon *ngIf=\"!size\" [svgIcon]=\"icon\" [ngClass]=\"iconClass\"></mat-icon>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
711
- }
712
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeIconsComponent, decorators: [{
713
- type: Component,
714
- args: [{ selector: 'jvs-column-type-icons', standalone: false, template: "<ng-template #cellTemplate let-row=\"row\">\n <div class=\"flex items-center justify-center\" [ngClass]=\"{ '-space-x-1': !column.iconsDef?.soloIcono }\"\n >\n <ng-container *ngFor=\"let icon of obtenerItems(column.iconsDef, row)\">\n <ng-container *ngIf=\"!column.iconsDef?.soloIcono; else soloIcono\">\n <button matRipple type=\"button\" *ngIf=\"!icon.esVisible || icon.esVisible(row)\"\n (click)=\"icon.click ? icon.click(row) : false; $event.stopPropagation()\"\n class=\"flex items-center justify-center p-1 rounded border shadow-sm hover:shadow-lg\"\n [ngClass]=\"icon.contentCss\"\n [matTooltip]=\"icon.toolTip ?? row[icon.toolTipField ?? '_field_']\"\n [matTooltipDisabled]=\"!icon.toolTip && !icon.toolTipField\"\n >\n <ng-container [ngTemplateOutlet]=\"iconoConTamanio\"\n [ngTemplateOutletContext]=\"{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}\"></ng-container>\n </button>\n </ng-container>\n <ng-template #soloIcono>\n <div *ngIf=\"!icon.esVisible || icon.esVisible(row)\" [ngClass]=\"icon.contentCss\"\n class=\"flex items-center\"\n [matTooltip]=\"icon.toolTip ?? row[icon.toolTipField ?? '_field_']\"\n [matTooltipDisabled]=\"!icon.toolTip && !icon.toolTipField\"\n >\n <ng-container [ngTemplateOutlet]=\"iconoConTamanio\"\n [ngTemplateOutletContext]=\"{icon: icon.icon, iconClass: icon.cssClass, size: (icon.iconSize ?? column.iconsDef?.iconSize)}\"></ng-container>\n </div>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-container matColumnDef=\"{{ column.property }}\">\n <!-- Definici\u00F3n del encabezado de la columna -->\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n </th>\n\n <!-- Cuerpo de la celda, definido por los hijos -->\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell (click)=\"accionClick(row, $event)\">\n\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{row}\"></ng-container>\n\n </td>\n\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell>\n {{ column.transformarFooter ? column.transformarFooter() : '' }}\n </th>\n</ng-container>\n\n\n<ng-template #iconoConTamanio let-icon=\"icon\" let-iconClass=\"iconClass\" let-size=\"size\">\n <mat-icon *ngIf=\"size\" [svgIcon]=\"icon\" [ngClass]=\"iconClass\" [inline]=\"true\"\n [style.font-size]=\"size\"\n [style.height]=\"size\"\n [style.width]=\"size\"\n ></mat-icon>\n <mat-icon *ngIf=\"!size\" [svgIcon]=\"icon\" [ngClass]=\"iconClass\"></mat-icon>\n</ng-template>\n" }]
715
- }], propDecorators: { column: [{
716
- type: Input,
717
- args: [{ required: true }]
718
- }] } });
719
-
720
- class ColumnTypeModule {
721
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
722
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeModule, declarations: [ColumnTypeComponent,
723
- ColumnTypeTextComponent,
724
- ColumnTypeMoneyComponent,
725
- ColumnTypeNumberComponent,
726
- ColumnTypeDateComponent,
727
- ColumnTypeIconsComponent,
728
- ColumnTypeSinoComponent,
729
- ColumnTypeProgressbarComponent], imports: [CommonModule,
730
- MatTableModule,
731
- MatSortModule,
732
- MatTooltipModule,
733
- NoSanitizePipe,
734
- ZeroFillPipe,
735
- MatRipple,
736
- MatIcon,
737
- ProgressBarComponent], exports: [ColumnTypeTextComponent,
738
- ColumnTypeMoneyComponent,
739
- ColumnTypeNumberComponent,
740
- ColumnTypeDateComponent,
741
- ColumnTypeIconsComponent,
742
- ColumnTypeSinoComponent,
743
- ColumnTypeProgressbarComponent] });
744
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeModule, imports: [CommonModule,
745
- MatTableModule,
746
- MatSortModule,
747
- MatTooltipModule,
748
- MatIcon,
749
- ProgressBarComponent] });
750
- }
751
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ColumnTypeModule, decorators: [{
752
- type: NgModule,
753
- args: [{
754
- declarations: [
755
- ColumnTypeComponent,
756
- ColumnTypeTextComponent,
757
- ColumnTypeMoneyComponent,
758
- ColumnTypeNumberComponent,
759
- ColumnTypeDateComponent,
760
- ColumnTypeIconsComponent,
761
- ColumnTypeSinoComponent,
762
- ColumnTypeProgressbarComponent,
763
- ],
764
- imports: [
765
- CommonModule,
766
- MatTableModule,
767
- MatSortModule,
768
- MatTooltipModule,
769
- NoSanitizePipe,
770
- ZeroFillPipe,
771
- MatRipple,
772
- MatIcon,
773
- ProgressBarComponent,
774
- ],
775
- exports: [
776
- ColumnTypeTextComponent,
777
- ColumnTypeMoneyComponent,
778
- ColumnTypeNumberComponent,
779
- ColumnTypeDateComponent,
780
- ColumnTypeIconsComponent,
781
- ColumnTypeSinoComponent,
782
- ColumnTypeProgressbarComponent,
783
- ]
784
- }]
785
- }] });
786
-
787
- class TablaMantenimientoColumnDefsComponent {
788
- table;
789
- cdRef;
790
- objThis;
791
- nombreColeccion;
792
- colDetalle;
793
- chkLista; // = new DataModel();
794
- chkListaChange = new EventEmitter();
795
- columnDefLocales;
796
- columnDefEnSubComponentes;
797
- constructor(table, cdRef) {
798
- this.table = table;
799
- this.cdRef = cdRef;
800
- }
801
- ngAfterContentInit() {
802
- if (this.table) {
803
- this.cdRef.detectChanges();
804
- this.columnDefEnSubComponentes.forEach(refCol => {
805
- this.table.addColumnDef(refCol);
806
- });
807
- this.columnDefLocales.forEach(refCol => {
808
- this.table.addColumnDef(refCol);
809
- });
810
- }
811
- }
812
- trackByProperty(index, column) {
813
- return column.property;
814
- }
815
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoColumnDefsComponent, deps: [{ token: i2.MatTable, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
816
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: TablaMantenimientoColumnDefsComponent, isStandalone: true, selector: "jvs-tabla-mantenimiento-column-defs", inputs: { objThis: "objThis", nombreColeccion: "nombreColeccion", colDetalle: "colDetalle", chkLista: "chkLista" }, outputs: { chkListaChange: "chkListaChange" }, queries: [{ propertyName: "columnDefEnSubComponentes", predicate: MatColumnDef, descendants: true }], viewQueries: [{ propertyName: "columnDefLocales", predicate: MatColumnDef, descendants: true }], ngImport: i0, template: "<ng-content></ng-content>\n\n\n\n<ng-container *ngFor=\"let column of colDetalle; trackBy: trackByProperty\">\n\n <ng-container *ngIf=\"column.type === 'expandir'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef class=\"w-4\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" class=\"w-4 text-center\" mat-cell>\n <button type=\"button\" class=\"boton-circular text-primary-contrast bg-primary mat-elevation-z2\" matRipple\n *ngIf=\"column.click\"\n (click)=\"column.click(row); row.isExpanded = !row.isExpanded; $event.stopPropagation()\"\n matTooltip=\"Expandir / Contraer\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"(row.isExpanded ? 'roundExpandLess' : 'roundExpandMore')\"></mat-icon>\n </button>\n <button type=\"button\" class=\"boton-circular text-primary-contrast bg-primary mat-elevation-z2\" matRipple\n *ngIf=\"!column.click\"\n (click)=\"row.isExpanded = !row.isExpanded; $event.stopPropagation()\"\n matTooltip=\"Expandir / Contraer\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"(row.isExpanded ? 'roundExpandLess' : 'roundExpandMore')\"></mat-icon>\n </button>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'checkbox'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"w-4 text-center\" mat-header-cell>\n <mat-checkbox *ngIf=\"chkLista\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"chkLista.checkbox.establecerTodos($event.checked)\"\n [indeterminate]=\"chkLista.checkbox.algunosActivos\"\n [checked]=\"chkLista.checkbox.todosActivos\"\n ></mat-checkbox>\n </th>\n <td *matCellDef=\"let row\" class=\"w-4 text-center\" mat-cell>\n <mat-checkbox *ngIf=\"chkLista\"\n (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"chkLista.modelosChk[chkLista.generarId(row, (column.chkField ?? column.property), column.chkFieldSeparador)]\"\n [ngModelOptions]=\"{standalone: true}\"\n ></mat-checkbox>\n\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'estiloEstablecido'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell\n mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n <span class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n {{ column.property }}\n <span class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </td>\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell\n [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n </th>\n\n </ng-container>\n\n <jvs-column-type-text *ngIf=\"column.type == 'text'\" [column]=\"column\"></jvs-column-type-text>\n <jvs-column-type-money *ngIf=\"column.type == 'money'\" [column]=\"column\"></jvs-column-type-money>\n <jvs-column-type-number *ngIf=\"column.type == 'number'\" [column]=\"column\"></jvs-column-type-number>\n <jvs-column-type-date *ngIf=\"column.type == 'date'\" [column]=\"column\"></jvs-column-type-date>\n <jvs-column-type-icons *ngIf=\"column.type == 'icons'\" [column]=\"column\"></jvs-column-type-icons>\n <jvs-column-type-sino *ngIf=\"column.type == 'yes_no'\" [column]=\"column\"></jvs-column-type-sino>\n <jvs-column-type-progressbar *ngIf=\"column.type == 'progress'\" [column]=\"column\"></jvs-column-type-progressbar>\n\n\n\n</ng-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "component", type: i3$1.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i2.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ColumnTypeModule }, { kind: "component", type: ColumnTypeTextComponent, selector: "jvs-column-type-text", inputs: ["column"] }, { kind: "component", type: ColumnTypeMoneyComponent, selector: "jvs-column-type-money", inputs: ["column"] }, { kind: "component", type: ColumnTypeNumberComponent, selector: "jvs-column-type-number", inputs: ["column"] }, { kind: "component", type: ColumnTypeDateComponent, selector: "jvs-column-type-date", inputs: ["column"] }, { kind: "component", type: ColumnTypeIconsComponent, selector: "jvs-column-type-icons", inputs: ["column"] }, { kind: "component", type: ColumnTypeSinoComponent, selector: "jvs-column-type-sino", inputs: ["column"] }, { kind: "component", type: ColumnTypeProgressbarComponent, selector: "jvs-column-type-progressbar", inputs: ["column"] }] });
817
- }
818
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoColumnDefsComponent, decorators: [{
819
- type: Component,
820
- args: [{ selector: 'jvs-tabla-mantenimiento-column-defs', standalone: true, imports: [
821
- CommonModule,
822
- MatCheckboxModule,
823
- MatIconModule,
824
- MatRippleModule,
825
- MatSortModule,
826
- MatTableModule,
827
- MatTooltipModule,
828
- ReactiveFormsModule,
829
- FormsModule,
830
- ColumnTypeModule,
831
- ], template: "<ng-content></ng-content>\n\n\n\n<ng-container *ngFor=\"let column of colDetalle; trackBy: trackByProperty\">\n\n <ng-container *ngIf=\"column.type === 'expandir'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef class=\"w-4\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" class=\"w-4 text-center\" mat-cell>\n <button type=\"button\" class=\"boton-circular text-primary-contrast bg-primary mat-elevation-z2\" matRipple\n *ngIf=\"column.click\"\n (click)=\"column.click(row); row.isExpanded = !row.isExpanded; $event.stopPropagation()\"\n matTooltip=\"Expandir / Contraer\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"(row.isExpanded ? 'roundExpandLess' : 'roundExpandMore')\"></mat-icon>\n </button>\n <button type=\"button\" class=\"boton-circular text-primary-contrast bg-primary mat-elevation-z2\" matRipple\n *ngIf=\"!column.click\"\n (click)=\"row.isExpanded = !row.isExpanded; $event.stopPropagation()\"\n matTooltip=\"Expandir / Contraer\">\n <mat-icon class=\"icon-xs\" [svgIcon]=\"(row.isExpanded ? 'roundExpandLess' : 'roundExpandMore')\"></mat-icon>\n </button>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'checkbox'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"w-4 text-center\" mat-header-cell>\n <mat-checkbox *ngIf=\"chkLista\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"chkLista.checkbox.establecerTodos($event.checked)\"\n [indeterminate]=\"chkLista.checkbox.algunosActivos\"\n [checked]=\"chkLista.checkbox.todosActivos\"\n ></mat-checkbox>\n </th>\n <td *matCellDef=\"let row\" class=\"w-4 text-center\" mat-cell>\n <mat-checkbox *ngIf=\"chkLista\"\n (click)=\"$event.stopPropagation()\"\n [(ngModel)]=\"chkLista.modelosChk[chkLista.generarId(row, (column.chkField ?? column.property), column.chkFieldSeparador)]\"\n [ngModelOptions]=\"{standalone: true}\"\n ></mat-checkbox>\n\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'estiloEstablecido'\" [matColumnDef]=\"column.property\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell\n mat-sort-header\n [disabled]=\"column.sort === false\">\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n <span class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n {{ column.property }}\n <span class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </td>\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell\n [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n </th>\n\n </ng-container>\n\n <jvs-column-type-text *ngIf=\"column.type == 'text'\" [column]=\"column\"></jvs-column-type-text>\n <jvs-column-type-money *ngIf=\"column.type == 'money'\" [column]=\"column\"></jvs-column-type-money>\n <jvs-column-type-number *ngIf=\"column.type == 'number'\" [column]=\"column\"></jvs-column-type-number>\n <jvs-column-type-date *ngIf=\"column.type == 'date'\" [column]=\"column\"></jvs-column-type-date>\n <jvs-column-type-icons *ngIf=\"column.type == 'icons'\" [column]=\"column\"></jvs-column-type-icons>\n <jvs-column-type-sino *ngIf=\"column.type == 'yes_no'\" [column]=\"column\"></jvs-column-type-sino>\n <jvs-column-type-progressbar *ngIf=\"column.type == 'progress'\" [column]=\"column\"></jvs-column-type-progressbar>\n\n\n\n</ng-container>\n" }]
832
- }], ctorParameters: () => [{ type: i2.MatTable, decorators: [{
833
- type: Optional
834
- }] }, { type: i0.ChangeDetectorRef }], propDecorators: { objThis: [{
835
- type: Input
836
- }], nombreColeccion: [{
837
- type: Input
838
- }], colDetalle: [{
839
- type: Input
840
- }], chkLista: [{
841
- type: Input
842
- }], chkListaChange: [{
843
- type: Output
844
- }], columnDefLocales: [{
845
- type: ViewChildren,
846
- args: [MatColumnDef]
847
- }], columnDefEnSubComponentes: [{
848
- type: ContentChildren,
849
- args: [MatColumnDef, { descendants: true }]
850
- }] } });
851
-
852
- class TablaMantenimientoMenuComponent {
853
- objThis;
854
- nombreColeccion;
855
- item;
856
- derechosActuales;
857
- // @Input() modalPrincipal;
858
- // @Input() botonDisabled = (btn: BotonMantenimiento, item: any) => [];
859
- opcionSelecionada = new EventEmitter();
860
- menu;
861
- subItems;
862
- botonTemplate;
863
- constructor() {
864
- }
865
- ngOnInit() {
866
- }
867
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
868
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: TablaMantenimientoMenuComponent, isStandalone: true, selector: "jvs-tabla-mantenimiento-menu", inputs: { objThis: "objThis", nombreColeccion: "nombreColeccion", item: "item", derechosActuales: "derechosActuales", subItems: "subItems", botonTemplate: "botonTemplate" }, outputs: { opcionSelecionada: "opcionSelecionada" }, viewQueries: [{ propertyName: "menu", first: true, predicate: ["menu"], descendants: true, static: true }], ngImport: i0, template: "<mat-menu #menu=\"matMenu\">\n <div class=\"mat-menu bg-white rounded mat-elevation-z8 shadow botonesContextual w-full\">\n <ng-container *ngFor=\"let btn of subItems\">\n <ng-container *ngTemplateOutlet=\"botonTemplate; context:{btn: btn, item: objThis['seleccionados'][nombreColeccion], barraSuperior: false}\"></ng-container>\n </ng-container>\n </div>\n</mat-menu>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }] });
869
- }
870
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoMenuComponent, decorators: [{
871
- type: Component,
872
- args: [{ selector: 'jvs-tabla-mantenimiento-menu', standalone: true, imports: [
873
- CommonModule,
874
- MatMenuModule,
875
- ], template: "<mat-menu #menu=\"matMenu\">\n <div class=\"mat-menu bg-white rounded mat-elevation-z8 shadow botonesContextual w-full\">\n <ng-container *ngFor=\"let btn of subItems\">\n <ng-container *ngTemplateOutlet=\"botonTemplate; context:{btn: btn, item: objThis['seleccionados'][nombreColeccion], barraSuperior: false}\"></ng-container>\n </ng-container>\n </div>\n</mat-menu>\n" }]
876
- }], ctorParameters: () => [], propDecorators: { objThis: [{
877
- type: Input
878
- }], nombreColeccion: [{
879
- type: Input
880
- }], item: [{
881
- type: Input
882
- }], derechosActuales: [{
883
- type: Input
884
- }], opcionSelecionada: [{
885
- type: Output
886
- }], menu: [{
887
- type: ViewChild,
888
- args: ['menu', { static: true }]
889
- }], subItems: [{
890
- type: Input,
891
- args: [{ required: true }]
892
- }], botonTemplate: [{
893
- type: Input,
894
- args: [{ required: true }]
895
- }] } });
896
-
897
- const getFileName = (name) => {
898
- const timeSpan = new Date().toISOString();
899
- const sheetName = name || 'ExportResult';
900
- const fileName = `${sheetName}-${timeSpan}`;
901
- return {
902
- sheetName,
903
- fileName
904
- };
905
- };
906
- class TableUtil {
907
- static exportTableToExcelV2(targetTableElm, name) {
908
- const { sheetName, fileName } = getFileName(name);
909
- console.log(targetTableElm);
910
- const wb = XLSX.utils.table_to_book(targetTableElm, {
911
- sheet: sheetName
912
- });
913
- XLSX.writeFile(wb, `${fileName}.xlsx`);
914
- }
915
- static exportTableToExcel(tableId, name) {
916
- const { sheetName, fileName } = getFileName(name);
917
- const targetTableElm = document.getElementById(tableId);
918
- console.log(targetTableElm);
919
- const wb = XLSX.utils.table_to_book(targetTableElm, {
920
- sheet: sheetName
921
- });
922
- // XLSX.writeFile(wb, `${fileName}.xlsx`);
923
- }
924
- static exportArrayToExcel(arr, name) {
925
- const { sheetName, fileName } = getFileName(name);
926
- const wb = XLSX.utils.book_new();
927
- const ws = XLSX.utils.json_to_sheet(arr, { dateNF: 'dd/MM/yyyy' });
928
- XLSX.utils.book_append_sheet(wb, ws, sheetName);
929
- XLSX.writeFile(wb, `${fileName}.xlsx`);
930
- }
931
- static getWorkBook(htmlTableId, data) {
932
- const targetTableElm = document.getElementById(htmlTableId);
933
- const tableToSheet = XLSX.utils.table_to_sheet(targetTableElm, { raw: true });
934
- const jsonToSheet = XLSX.utils.json_to_sheet(data);
935
- const sheetToJson = XLSX.utils.sheet_to_json(tableToSheet);
936
- return { tableToSheet, jsonToSheet, sheetToJson };
937
- }
938
- }
939
-
940
- class TablaMantenimientoService {
941
- get templateBotonesComunes() {
942
- return [
943
- { icono: 'roundAdd', tipo: 'nuevo', class: 'text-green-100 !bg-green-600', sinCondicion: true },
944
- { icono: 'roundEdit', tipo: 'editar', class: 'text-amber-900 !bg-amber-300' },
945
- { icono: 'roundDelete', tipo: 'eliminar', class: 'text-red-100 !bg-red-700' },
946
- { icono: 'roundDelete', tipo: 'eliminar_fila', class: 'text-red-100 !bg-red-700' },
947
- { icono: 'roundPrint', tipo: 'imprimir', class: '!bg-blue-100 text-blue-700' },
948
- { icono: 'roundDownload', tipo: 'descargar', class: '!bg-blue-100 text-blue-700' },
949
- { icono: 'roundFolder', tipo: 'ver_archivos', class: '!bg-green-100 text-green-700' },
950
- { icono: 'fa5FilePdf', tipo: 'exportar_pdf', label: 'Exportar a PDF', class: 'bg-pdf-light text-pdf' },
951
- { icono: 'fa5FileExcel', tipo: 'exportar_excel', label: 'Exportar a Excel', class: 'bg-excel-light text-excel' },
952
- { icono: 'fa5sFileExport', tipo: 'exportacion_avanzada', label: 'Exportación Avanzada', class: '!text-indigo-600 !bg-indigo-100' },
953
- { icono: 'icSave', tipo: 'guardar', class: '!text-indigo-100 !bg-indigo-600' },
954
- { icono: 'icCancel', tipo: 'cancelar', class: '!text-cyan-100 !bg-cyan-600' },
955
- {
956
- icono: 'roundFactCheck', tipo: 'seleccionar',
957
- class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700'
958
- },
959
- { icono: 'roundListAlt', tipo: 'detalle', class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700' },
960
- { icono: 'roundPublic', tipo: 'ver_mapa', class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700' },
961
- { icono: 'icCheck', tipo: 'activar', },
962
- { icono: 'icClose', tipo: 'desactivar', },
963
- { icono: 'fa5sLock', tipo: 'cerrar', },
964
- { icono: 'fa5sLockOpen', tipo: 'abrir', },
965
- ];
966
- }
967
- get templateColumnasTabla() {
968
- return [
969
- { label: '#', labelLista: 'Numeración', property: 'numeracion_automatica', type: 'numeracion_automatica' },
970
- ];
971
- }
972
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
973
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, providedIn: 'root' });
974
- }
975
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, decorators: [{
976
- type: Injectable,
977
- args: [{
978
- providedIn: 'root',
979
- }]
980
- }] });
981
-
982
- var TablaMantenimientoComponent_1;
983
- let TablaMantenimientoComponent = class TablaMantenimientoComponent {
984
- static { TablaMantenimientoComponent_1 = this; }
985
- fb;
986
- overlay;
987
- viewContainerRef;
988
- tablaMantenimientoService;
989
- cdRef;
990
- static nextId = 0;
991
- id = `jvs-tabla-mantenimiento-id-${TablaMantenimientoComponent_1.nextId++}`;
992
- get templateBotonesComunes() {
993
- return this.tablaMantenimientoService.templateBotonesComunes;
994
- }
995
- ;
996
- get templateColumnasTabla() {
997
- return this.tablaMantenimientoService.templateColumnasTabla;
998
- }
999
- ;
1000
- dataSuscription;
1001
- objThis;
1002
- nombreColeccion;
1003
- ctrlBusquedaValue = '';
1004
- ctrlBusquedaPlaceholder = 'Buscar...';
1005
- filtroCampos = true;
1006
- paginador = true;
1007
- esTabla = true;
1008
- readOnly = false;
1009
- filaExtraHeader;
1010
- filaFooter = false;
1011
- botonesCRUD = 'CUD';
1012
- dblclickItem = new EventEmitter();
1013
- objBotonesCRUD = [
1014
- { tipo: 'nuevo', sinCondicion: true },
1015
- { tipo: 'editar' },
1016
- { tipo: 'eliminar' },
1017
- ];
1018
- classSeleccionado = ['elemento-seleccionado', /*'!bg-primary-activo','text-primary-contrast', */ 'mat-elevation-z8', /*'dark:!bg-primary-dark-activo',*/ 'border-y-2 border-primary-contrast', 'font-bold', 'text-2xl'];
1019
- // @Input() classAnulado = ['line-through', 'text-red', 'italic'];
1020
- classAnulado = ['elemento-anulado', /*'line-through', */ 'text-red-900', 'bg-red-200'];
1021
- campoAnulado = null;
1022
- campoAnuladoMensaje = null;
1023
- opcionSelecionada = new EventEmitter();
1024
- opcBusqueda = new EventEmitter();
1025
- accionRecargar = new EventEmitter();
1026
- set selectionModel(val) {
1027
- this.objSeleccionado = val;
1028
- }
1029
- selectionModelChange = new EventEmitter();
1030
- isRecargarUsed = false;
1031
- filaExtraTemplate;
1032
- paginator;
1033
- sort;
1034
- exportarExcel = true;
1035
- // MIO
1036
- pageSize = 25;
1037
- pageSizeOptions = [5, 10, 25, 50, 100, 500, 1000];
1038
- dataSourceChange = new EventEmitter();
1039
- resultados = new EventEmitter();
1040
- dataSource = new MatTableDataSource(); // or whatever type of datasource you have
1041
- // this is where the magic happens:
1042
- table;
1043
- columnDefs;
1044
- componenteCargadoTotalmente = false;
1045
- /////////////////////
1046
- paginacion = {
1047
- pageSize: 25,
1048
- pageSizeOptions: [],
1049
- pageCurrent: null,
1050
- pageIndex: 0,
1051
- pageLength: null,
1052
- };
1053
- // All that's left is to add them to the table ourselves:
1054
- ignorarDerechos = false;
1055
- derechosActuales = null;
1056
- // listaCRUD: BotonMantenimiento[] = [];
1057
- rows;
1058
- rowFooter;
1059
- mouseEvent$;
1060
- overlayRef;
1061
- userMenu;
1062
- // FILTRO BUSQUEDA
1063
- opcFiltroActual = {};
1064
- capitalizarTexto = capitalizarTexto;
1065
- _seleccionado = {};
1066
- cCampoBusqueda = new FormControl('');
1067
- chkLista = new DataModel();
1068
- constructor(fb, overlay, viewContainerRef, tablaMantenimientoService, cdRef) {
1069
- this.fb = fb;
1070
- this.overlay = overlay;
1071
- this.viewContainerRef = viewContainerRef;
1072
- this.tablaMantenimientoService = tablaMantenimientoService;
1073
- this.cdRef = cdRef;
1074
- // this._seleccionado[this.nombreColeccion] = null;
1075
- }
1076
- _ctrlBusqueda = '';
1077
- get ctrlBusqueda() {
1078
- return this._ctrlBusqueda;
1079
- }
1080
- set ctrlBusqueda(val) {
1081
- if (val == '') {
1082
- val = 'simple';
1083
- }
1084
- this._ctrlBusqueda = val;
1085
- }
1086
- // @Input() leyenda;
1087
- _leyenda = undefined;
1088
- get leyenda() {
1089
- return this._leyenda;
1090
- }
1091
- set leyenda(val) {
1092
- if (typeof val == 'string') {
1093
- this._leyenda = { text: val };
1094
- }
1095
- else {
1096
- this._leyenda = val;
1097
- }
1098
- }
1099
- // @Input() idTabla: string[];
1100
- _idTabla = [];
1101
- get idTabla() {
1102
- return this._idTabla;
1103
- }
1104
- set idTabla(val) {
1105
- if (Array.isArray(val)) {
1106
- this._idTabla = val;
1107
- }
1108
- else {
1109
- this._idTabla.push(val);
1110
- }
1111
- }
1112
- _columnasTabla = [];
1113
- get columnasTabla() {
1114
- return this._columnasTabla ?? [];
1115
- }
1116
- set columnasTabla(val) {
1117
- const reemplazarConTemplate = (listaInicial = []) => {
1118
- listaInicial.forEach((btnActual, idx) => {
1119
- const btnEnTemplate = buscarEnArray(this.templateColumnasTabla, 'property', btnActual.property);
1120
- if (btnEnTemplate) {
1121
- listaInicial[idx] = {
1122
- ...btnEnTemplate,
1123
- ...btnActual
1124
- };
1125
- }
1126
- if (listaInicial[idx].type == 'text') {
1127
- if (!listaInicial[idx].text) {
1128
- listaInicial[idx].text = {
1129
- cssStyle: {}
1130
- };
1131
- }
1132
- else if (!listaInicial[idx].text.cssStyle) {
1133
- listaInicial[idx].text.cssStyle = {};
1134
- }
1135
- listaInicial[idx].text.cssStyle = { ...listaInicial[idx].text.cssStyle };
1136
- }
1137
- else if (listaInicial[idx].type == 'estado') {
1138
- const mutar = {
1139
- ...listaInicial[idx],
1140
- type: 'icons',
1141
- iconsDef: {
1142
- soloIcono: true,
1143
- iconSize: '16px',
1144
- items: [
1145
- // {
1146
- // icon: 'roundToggleOff', contentCss: 'text-gray-400',
1147
- // esVisible: (row) => row['iCredDepenTareaEstado'] == 0
1148
- // },
1149
- // {
1150
- // icon: 'roundToggleOn', contentCss: 'text-green-600',
1151
- // esVisible: (row) => row['iCredDepenTareaEstado'] == 1
1152
- // },
1153
- ]
1154
- },
1155
- };
1156
- if (listaInicial[idx].estados) {
1157
- listaInicial[idx].estados.forEach((estado) => {
1158
- if (Array.isArray(mutar.iconsDef.items)) {
1159
- mutar.iconsDef.items.push({
1160
- icon: estado.icon, contentCss: estado.cssClasses,
1161
- esVisible: (row) => row[listaInicial[idx].property] == estado.estado,
1162
- });
1163
- }
1164
- });
1165
- }
1166
- listaInicial[idx] = mutar;
1167
- }
1168
- if (btnActual.type == 'custom') {
1169
- listaInicial[idx].datosExtra = {
1170
- ...listaInicial[idx].datosExtra,
1171
- tabla_mantenimiento_config_visibleAlias: listaInicial[idx].visible == undefined ? true : listaInicial[idx].visible,
1172
- };
1173
- listaInicial[idx].visible = false;
1174
- }
1175
- });
1176
- return listaInicial;
1177
- };
1178
- this._columnasTabla = val ? reemplazarConTemplate(val) : [];
1179
- }
1180
- // @Input() botonesMenu: BotonMantenimiento[] = [];
1181
- _botonesMenu = {
1182
- crud: undefined,
1183
- principal: [],
1184
- izquierda: [],
1185
- derecha: [],
1186
- secundario: [],
1187
- inferior: [],
1188
- };
1189
- get botonesMenu() {
1190
- return this._botonesMenu;
1191
- }
1192
- get botonesMenuFinal() {
1193
- const nuevoBotonesMenu = this.botonesMenu;
1194
- // Iteramos sobre cada sección de botones
1195
- Object.keys(nuevoBotonesMenu).forEach(seccion => {
1196
- nuevoBotonesMenu[seccion] = nuevoBotonesMenu[seccion]?.filter((boton) => {
1197
- if (this.readOnly) {
1198
- if (boton.subItems) {
1199
- boton.subItems = boton.subItems.filter((subItem) => subItem.ignorarReadOnly === true);
1200
- return boton.subItems.length < 1;
1201
- }
1202
- return boton.ignorarReadOnly === true;
1203
- }
1204
- return true;
1205
- }); // Filtramos los botones nulos
1206
- });
1207
- return nuevoBotonesMenu;
1208
- }
1209
- set botonesMenu(val) {
1210
- const reemplazarConTemplate = (listaInicial = []) => listaInicial.map((btnActual) => {
1211
- const btnEnTemplate = buscarEnArray(this.templateBotonesComunes, 'tipo', btnActual.tipoTemplate ?? btnActual.tipo);
1212
- if (btnEnTemplate) {
1213
- if (btnActual.tipoTemplate && !btnActual.label) {
1214
- btnEnTemplate.label = undefined;
1215
- }
1216
- if (btnActual.subItems) {
1217
- return { ...btnEnTemplate, ...btnActual, seccion: this.nombreColeccion, subItems: reemplazarConTemplate(btnActual.subItems) };
1218
- }
1219
- return { ...btnEnTemplate, ...btnActual, seccion: this.nombreColeccion };
1220
- }
1221
- return btnActual;
1222
- });
1223
- if (val?.crud) {
1224
- this.objBotonesCRUD = this.templateBotonesComunes
1225
- .filter(obj => ['nuevo', 'editar', 'eliminar'].includes(obj.tipo))
1226
- .map(obj => val.crud?.find(o => o.tipo === obj.tipo) ?? obj);
1227
- }
1228
- Object.keys(val).forEach(btnKey => {
1229
- if (val[btnKey]) {
1230
- val[btnKey] = reemplazarConTemplate(val[btnKey]);
1231
- }
1232
- });
1233
- this._botonesMenu = { ...this._botonesMenu, ...val };
1234
- }
1235
- get listaMenuCompleto() {
1236
- let menuTotal = [];
1237
- menuTotal = menuTotal.concat(this.botonesMenu.izquierda ?? []);
1238
- menuTotal = menuTotal.concat(this.botonesMenu.crud ?? []);
1239
- menuTotal = menuTotal.concat(this.botonesMenu.principal ?? []);
1240
- menuTotal = menuTotal.concat(this.botonesMenu.derecha ?? []);
1241
- menuTotal = menuTotal.concat(this.botonesMenu.secundario ?? []);
1242
- menuTotal = menuTotal.concat(this.botonesMenu.inferior ?? []);
1243
- return menuTotal;
1244
- }
1245
- get objVisibleColumns() {
1246
- return this.columnasTabla.filter(column => {
1247
- if (column.noMostrar != undefined) {
1248
- column.noMostrarEnLista = column.noMostrar;
1249
- }
1250
- return !tipoValorFuncion(column.noMostrarEnLista, false);
1251
- }).filter(column => {
1252
- // SECCION MODIFICADOR
1253
- if (this.filaExtraTemplate) {
1254
- column.sort = false;
1255
- }
1256
- // Fin SECCION MODIFICADOR
1257
- column.visible = tipoValorFuncion(column.visible, true);
1258
- if (!column.visible && column.esVisible != undefined) {
1259
- column.visible = column.esVisible();
1260
- }
1261
- return column.visible;
1262
- });
1263
- }
1264
- get visibleColumns() {
1265
- return this.objVisibleColumns.map(column => column.property);
1266
- }
1267
- get tieneCheckbox() {
1268
- return this.columnasTabla && this.columnasTabla.length > 0 && this.columnasTabla.find(col => col.type === 'checkbox') || false;
1269
- }
1270
- get buscarItemSeleccionado() {
1271
- const dRet = this.dataSource.data.find(itm => this._seleccionado === this.propiedadSeleccion(itm));
1272
- return dRet ?? null;
1273
- }
1274
- get objSeleccionado() {
1275
- return this.buscarItemSeleccionado; // ?? this.objThis?.['seleccionados']?.[this.nombreColeccion];
1276
- }
1277
- set objSeleccionado(val) {
1278
- // if (val) {
1279
- this.seleccionarItem(val, true);
1280
- // }
1281
- /* if (!this.objThis) {
1282
- this.objThis = {};
1283
- }
1284
- if (!this.objThis['seleccionados']) {
1285
- this.objThis['seleccionados'] = {};
1286
- }
1287
- this.objThis['seleccionados'][this.nombreColeccion] = val;*/
1288
- }
1289
- get idsSeleccionado() {
1290
- return this.chkLista.generarLista();
1291
- }
1292
- idTablaValor(data) {
1293
- if (data) {
1294
- if (this.idTabla.length < 1) {
1295
- return shortHash(JSON.stringify({ data, claseFinal: undefined }));
1296
- }
1297
- return this.idTabla.map(d => data[d]).join('-');
1298
- }
1299
- return '';
1300
- }
1301
- condicionesClaseFila = (item) => [];
1302
- rowTooltip = (item) => '';
1303
- soloIconos = false;
1304
- ngOnInit() {
1305
- // this.sharedService.dataRutaActual$.pipe(untilDestroyed(this)).subscribe(datRouteData => {
1306
- // if (datRouteData) {
1307
- // this.derechosActuales = datRouteData['derechos'];
1308
- // if (!this.ignorarDerechos) {
1309
- // this.ignorarDerechos = datRouteData['ignorarDerechos'] ?? false;
1310
- // }
1311
- // }
1312
- // });
1313
- this.paginacion.pageSize = this.pageSize;
1314
- this.paginacion.pageSizeOptions = this.pageSizeOptions;
1315
- this.actualizarCrud();
1316
- this.agregarBotonesExportacion();
1317
- if (this.dataSuscription) {
1318
- this.dataSuscription.subscribe(res => {
1319
- if (res) {
1320
- if (this.objSeleccionado) {
1321
- console.log('SELECCIONADO');
1322
- if (this.idTabla && this.idTabla.length > 0) {
1323
- console.log('ID TABLA');
1324
- const arrayData = this.idTabla.map(d => this.objSeleccionado[d]);
1325
- console.log(arrayData);
1326
- const busqueda = buscarEnArray(res, this.idTabla, arrayData);
1327
- console.log(busqueda);
1328
- if (busqueda) {
1329
- console.log(busqueda);
1330
- this.objSeleccionado = busqueda;
1331
- }
1332
- }
1333
- else {
1334
- console.log('eLSE ID TABLA');
1335
- const dataStr = res.find((itm) => shortHash(JSON.stringify({
1336
- ...itm, claseFinal: undefined
1337
- })) == shortHash(JSON.stringify({ ...this.objSeleccionado, claseFinal: undefined })));
1338
- if (dataStr) {
1339
- this.objSeleccionado = dataStr;
1340
- }
1341
- }
1342
- }
1343
- this.setData(res);
1344
- }
1345
- });
1346
- }
1347
- this.isRecargarUsed = this.accionRecargar.observed;
1348
- }
1349
- ngAfterContentInit() {
1350
- this.componenteCargadoTotalmente = true;
1351
- this.cdRef.detectChanges();
1352
- this.columnDefs.forEach(columnDef => {
1353
- this.table.addColumnDef(columnDef);
1354
- const col = this.columnasTabla.find(col => col.property == columnDef.name);
1355
- if (col && col.type == 'custom') {
1356
- console.warn(JSON.stringify(col));
1357
- col.visible = col.datosExtra?.tabla_mantenimiento_config_visibleAlias ?? col.visible;
1358
- delete col.datosExtra?.tabla_mantenimiento_config_visibleAlias;
1359
- if (Object.keys(col.datosExtra).length < 1) {
1360
- delete col.datosExtra;
1361
- }
1362
- }
1363
- });
1364
- // console.log(a);
1365
- if (this.ctrlBusquedaValue) {
1366
- this.cCampoBusqueda.setValue(this.ctrlBusquedaValue);
1367
- }
1368
- this.table.renderRows(); // 🔹 Refrescar la tabla
1369
- }
1370
- ngOnChanges(changes) {
1371
- console.warn(changes);
1372
- if (changes['botonesCRUD'] || changes['ctrlBusqueda']) {
1373
- this.actualizarCrud();
1374
- }
1375
- if (changes['botonesMenu']) {
1376
- this.agregarBotonesExportacion();
1377
- }
1378
- }
1379
- trackByFn = (index, item) => {
1380
- return this.propiedadSeleccion(item);
1381
- };
1382
- agregarBotonesExportacion() {
1383
- const fnAddBoton = (condicion, tipoBoton) => {
1384
- if (condicion) {
1385
- const objBoton = buscarEnArray(this.templateBotonesComunes, 'tipo', tipoBoton);
1386
- const objBotonEnInferior = buscarEnArray((this.botonesMenu?.inferior ?? []), 'tipo', tipoBoton);
1387
- if (!objBotonEnInferior && objBoton) {
1388
- if (!this.botonesMenu.inferior) {
1389
- this.botonesMenu.inferior = [];
1390
- }
1391
- this.botonesMenu?.inferior?.push({
1392
- ...objBoton,
1393
- esIndependiente: true,
1394
- });
1395
- }
1396
- }
1397
- };
1398
- fnAddBoton((this.exportarExcel && this.esTabla), 'exportar_excel');
1399
- }
1400
- actualizarCrud() {
1401
- const operacionesCRUD = {
1402
- 'C': 'nuevo',
1403
- 'U': 'editar',
1404
- 'D': 'eliminar'
1405
- };
1406
- const agregarBoton = (tipo) => {
1407
- let botonComun = buscarEnArray(this.templateBotonesComunes, 'tipo', tipo);
1408
- if (botonComun) {
1409
- const personalizado = buscarEnArray(this.objBotonesCRUD, 'tipo', tipo);
1410
- const boton = personalizado ? { ...botonComun, ...personalizado } : botonComun;
1411
- if (this.botonesMenu.crud) {
1412
- this.botonesMenu.crud.push(boton);
1413
- }
1414
- }
1415
- };
1416
- const lstCRUD = (this.botonesMenu.crud ?? []).map(i => i.tipo);
1417
- if (lstCRUD.length > 0) {
1418
- for (const operacion of (this.botonesCRUD || "").toUpperCase()) {
1419
- const operacionKey = operacion;
1420
- if (lstCRUD.includes(operacion) && operacionesCRUD[operacionKey]) {
1421
- agregarBoton(operacionesCRUD[operacionKey]);
1422
- }
1423
- }
1424
- }
1425
- else {
1426
- this.botonesMenu.crud = [];
1427
- for (const operacion of (this.botonesCRUD || "").toUpperCase()) {
1428
- const operacionKey = operacion;
1429
- if (operacionesCRUD[operacionKey]) {
1430
- agregarBoton(operacionesCRUD[operacionKey]);
1431
- }
1432
- }
1433
- }
1434
- if (this.ctrlBusqueda === 'simple') {
1435
- this.cCampoBusqueda.valueChanges.pipe(untilDestroyed(this)).subscribe(value => this.onFilterChange(value ?? ''));
1436
- }
1437
- if (this.botonesCRUD === '-') {
1438
- this.botonesMenu.crud = [];
1439
- }
1440
- }
1441
- classFila(item) {
1442
- let claseFinal = [];
1443
- if (this.campoAnulado && (item[this.campoAnulado] == 1)) {
1444
- claseFinal = claseFinal.concat(this.classAnulado);
1445
- }
1446
- if (this.objSeleccionado == item || this.esSeleccionActual(item)) {
1447
- claseFinal = claseFinal.concat(this.classSeleccionado);
1448
- }
1449
- claseFinal = claseFinal.concat(this.condicionesClaseFila(item));
1450
- item.claseFinal = claseFinal;
1451
- return claseFinal;
1452
- }
1453
- procesarRowTooltip(item) {
1454
- let txtTooptip = [];
1455
- if (this.campoAnuladoMensaje && (item[this.campoAnulado] == 1)) {
1456
- txtTooptip.push(item[this.campoAnuladoMensaje]);
1457
- // return item[this.campoAnuladoMensaje];
1458
- }
1459
- if (this.rowTooltip) {
1460
- txtTooptip.push(this.rowTooltip(item));
1461
- }
1462
- return txtTooptip.filter(itm => !!itm).join(' | ');
1463
- }
1464
- subItemsActivos(btn, item) {
1465
- return btn.subItems.filter((sub) => !sub.esVisible || sub.esVisible(item)).length > 0;
1466
- }
1467
- get noData() {
1468
- if (!this.esTabla) {
1469
- return of(true);
1470
- }
1471
- if (!this.dataSource || !this.table) {
1472
- return of(true);
1473
- }
1474
- // @ts-ignore
1475
- return this.table.dataSource?.connect().pipe(map(data => data?.length === 0));
1476
- }
1477
- onFilterChange(value) {
1478
- if (!this.dataSource) {
1479
- return;
1480
- }
1481
- value = value.trim();
1482
- value = value.toLowerCase();
1483
- this.dataSource.filter = value;
1484
- }
1485
- toggleColumnVisibility(column, event) {
1486
- event.stopPropagation();
1487
- event.stopImmediatePropagation();
1488
- column.visible = !column.visible;
1489
- }
1490
- cargarData(retorno = false) {
1491
- if (this.ctrlBusqueda && this.ctrlBusqueda == 'simple') {
1492
- if (!retorno) {
1493
- this.dataSource.paginator = this.paginator;
1494
- this.dataSource.sort = this.sort;
1495
- }
1496
- const aS = this.dataSource?.data;
1497
- if ((!aS || !aS[0] || !aS[0]['iTotalRegistros'])) {
1498
- return false;
1499
- }
1500
- }
1501
- const dPag = {
1502
- iPaginacion: 1,
1503
- iPageSize: this.paginator?.pageSize ? this.paginator?.pageSize : this.paginacion.pageCurrent?.pageSize,
1504
- iPageNumber: (this.paginator?.pageIndex ? this.paginator?.pageIndex : 0) + 1,
1505
- };
1506
- if (this.ctrlBusqueda && this.ctrlBusqueda == 'query') {
1507
- dPag['cCampoBusqueda'] = this.cCampoBusqueda.value;
1508
- }
1509
- if (retorno) {
1510
- return dPag;
1511
- }
1512
- this.resultados.emit(dPag);
1513
- this.opcBusqueda.emit(dPag);
1514
- }
1515
- // FIN FILTRO BUSQUEDA INTEGRAR
1516
- setData(data) {
1517
- this.dataSource = new MatTableDataSource(data);
1518
- this.dataSource.sortingDataAccessor = (item, property) => {
1519
- const dColumn = buscarEnArray(this.columnasTabla, 'property', property);
1520
- if (dColumn) {
1521
- switch (dColumn.sortType ?? dColumn.type) {
1522
- case 'number':
1523
- return item[property] * 1;
1524
- case 'date':
1525
- return formatearFecha(item[property]);
1526
- }
1527
- }
1528
- if (item) {
1529
- switch (property) {
1530
- case 'fromDate':
1531
- return new Date(item['fromDate']);
1532
- default:
1533
- return item[property];
1534
- }
1535
- }
1536
- };
1537
- // this.paginator.length = (data && data[0] && data[0]['iTotalRegistros']) ? data[0]['iTotalRegistros'] : data.length;
1538
- // this.dataSource.paginator = this.paginator;
1539
- if (this.sort) {
1540
- this.dataSource.sort = this.sort;
1541
- }
1542
- // this.dataSource.filter = this.filter;
1543
- this.dataSourceChange.emit(this.dataSource);
1544
- // this.dataSource.paginator.pageSize = this.paginacion.pageSize;
1545
- if (data && data[0] && data[0]['iPageNumber']) {
1546
- this.paginacion.pageIndex = (data && data[0] && data[0]['iPageNumber']) ? data[0]['iPageNumber'] : 0;
1547
- }
1548
- this.paginacion.pageLength = (data && data[0] && data[0]['iTotalRegistros']) ? data[0]['iTotalRegistros'] : data.length;
1549
- if (data && data[0] && !data[0]['iTotalRegistros']) {
1550
- this.dataSource.paginator = this.paginator;
1551
- }
1552
- if (this.tieneCheckbox) {
1553
- this.chkLista.agregarControles(data, this.tieneCheckbox.property, !this.tieneCheckbox.chkFieldPersistente, (this.tieneCheckbox.chkField ?? null), this.tieneCheckbox.chkFieldSeparador);
1554
- }
1555
- }
1556
- botonDisabled(btn, item) {
1557
- let disabled;
1558
- if (!btn.sinCondicion) {
1559
- if (btn.estaDeshabilitado) {
1560
- disabled = btn.estaDeshabilitado(item, this);
1561
- }
1562
- else {
1563
- disabled = !this.objSeleccionado;
1564
- }
1565
- }
1566
- if (!disabled && !btn.esIndependiente && !btn.ignorarDerecho && this.derechosActuales) {
1567
- // if (!this.usuarioService.esEquipoJVSoft()) {
1568
- disabled = !(this.derechosActuales[btn.cDerechoCodigo ?? btn.tipo]);
1569
- // }
1570
- }
1571
- return disabled;
1572
- }
1573
- propiedadSeleccion(item) {
1574
- return `${this.nombreColeccion}_${this.idTablaValor(item)}`;
1575
- }
1576
- esSeleccionActual(item) {
1577
- return this._seleccionado === this.propiedadSeleccion(item);
1578
- }
1579
- seleccionarItem(item, forzado = false) {
1580
- const idItem = this.propiedadSeleccion(item);
1581
- console.log(this._seleccionado, idItem);
1582
- if (forzado) {
1583
- this._seleccionado = idItem;
1584
- }
1585
- else {
1586
- this._seleccionado = this._seleccionado === idItem ? null : idItem;
1587
- }
1588
- this.selectionModelChange.emit(this.objSeleccionado);
1589
- /*if (!this.objThis) {
1590
- this.objThis = {};
1591
- }
1592
- if (!this.objThis['seleccionados']) {
1593
- this.objThis['seleccionados'] = {};
1594
- }
1595
- this.objThis['seleccionados'][this.nombreColeccion] = this._seleccionado;*/
1596
- }
1597
- opcMenu(item, objMenu, modal = null, retorno = false) {
1598
- console.log(this.buscarItemSeleccionado);
1599
- console.log(objMenu);
1600
- // let salir = this.readOnly;
1601
- // if (salir && this.readOnly === 'permitirSeleccion' && ['ver', 'seleccionar'].includes(objMenu.tipo)) {
1602
- // salir = false;
1603
- // }
1604
- // if (salir) {
1605
- // return false;
1606
- // }
1607
- // console.warn(objMenu);
1608
- if (objMenu.tipo == 'exportar_excel' && this.exportarExcel) {
1609
- /*
1610
- TableUtil.exportArrayToExcel(this.dataSource.data.map(x => {
1611
- const columnasNumeros = this.objVisibleColumns.filter(column => ['money', 'number'].includes(column.type));
1612
- columnasNumeros.forEach(columna => {
1613
- x[columna.property] *= 1;
1614
- });
1615
- return x;
1616
- }), 'TEST');
1617
- */
1618
- const dataGeneradoPorHtml = TableUtil.getWorkBook('tabla_' + this.nombreColeccion, []);
1619
- const objetosExtraidos = this.dataSource.filteredData.map((objeto, idx) => this.objVisibleColumns.reduce((acumulador, columna) => {
1620
- // console.log(propiedad);
1621
- const nColumn = (columna.labelLista ?? columna.label).toUpperCase().replace('<BR>', ' ');
1622
- switch (columna.type) {
1623
- case 'date':
1624
- // acumulador[nColumn] = (new DatePipe('es-PE')).transform(objeto[columna.property], 'dd/MM/yyyy' /*'yyyy-MM-dd'*/);
1625
- // new Date(dateString.replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
1626
- // acumulador[nColumn] = new Date(objeto[columna.property].replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
1627
- // acumulador[nColumn] = formatearFechaFormato(objeto[columna.property], 'dd/MM/yyyy');
1628
- // acumulador[nColumn] = formatearFechaTimezone(objeto[columna.property]);
1629
- // acumulador[nColumn] = new Date(objeto[columna.property]);
1630
- let fecha = objeto[columna.property];
1631
- if (objeto[columna.property]) {
1632
- fecha = new Date(objeto[columna.property].replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
1633
- if (getBrowserName() == 'chrome') {
1634
- fecha = moment(objeto[columna.property], true).add(2, 'minutes').toDate();
1635
- }
1636
- }
1637
- acumulador[nColumn] = fecha;
1638
- // acumulador[nColumn] = objeto[columna.property];
1639
- break;
1640
- case 'number':
1641
- case 'money':
1642
- acumulador[nColumn] = objeto[columna.property] * 1;
1643
- break;
1644
- default:
1645
- if (columna.property == 'numeracion_automatica') {
1646
- acumulador[nColumn] = idx + 1;
1647
- }
1648
- else {
1649
- if (columna.type == 'custom') {
1650
- // dataGeneradoPorHtml.sheetToJson
1651
- acumulador[nColumn] = dataGeneradoPorHtml.sheetToJson[idx][columna.label];
1652
- }
1653
- else {
1654
- if (columna.type == 'text' && columna.innerHTML) {
1655
- const convertirHtmlATexto = (html) => {
1656
- const elementoTemporal = document.createElement('div');
1657
- elementoTemporal.innerHTML = html;
1658
- return elementoTemporal.textContent || "";
1659
- };
1660
- acumulador[nColumn] = convertirHtmlATexto(columna.innerHTML(objeto));
1661
- }
1662
- else if (columna.transformar) {
1663
- acumulador[nColumn] = columna.transformar(objeto);
1664
- }
1665
- else {
1666
- acumulador[nColumn] = objeto[columna.property];
1667
- }
1668
- }
1669
- }
1670
- break;
1671
- }
1672
- return acumulador;
1673
- }, {}));
1674
- // TableUtil.exportTableToExcel('tabla_' + this.nombreColeccion);
1675
- // console.log(objetosExtraidos);
1676
- TableUtil.exportArrayToExcel(objetosExtraidos, this.nombreColeccion);
1677
- // this.tableExporter.exportTable('xlsx', {fileName: 'JVSoftExport'});
1678
- }
1679
- const opAdic = { seccion: this.nombreColeccion };
1680
- if (item) {
1681
- opAdic['item'] = item;
1682
- }
1683
- opAdic['itemSeleccionado'] = this.objSeleccionado;
1684
- if (this.tieneCheckbox) {
1685
- // itmsSeleccionados = this.formulariosGlobalesService.generarLista(this.nombreColeccion);
1686
- opAdic['idsSeleccionados'] = this.idsSeleccionado;
1687
- }
1688
- // opAdic['refTabla'] = this;
1689
- objMenu = { ...objMenu, ...opAdic };
1690
- if (retorno) {
1691
- return objMenu;
1692
- }
1693
- // console.warn(objMenu);
1694
- this.opcionSelecionada.emit(objMenu);
1695
- return 1;
1696
- }
1697
- emitirResultados(evento = {}) {
1698
- this.opcFiltroActual = { ...this.opcFiltroActual, ...evento, ...this.cargarData(true) };
1699
- // console.warn('resultadosFILTRO', this.opcFiltroActual);
1700
- this.resultados.emit(this.opcFiltroActual);
1701
- }
1702
- abrirMenuContextual({ x, y }, user) {
1703
- // console.log(user);
1704
- // this.opcMenu(user, {tipo: 'ver'});
1705
- this.objSeleccionado = user;
1706
- this.cerrarMenuContextual();
1707
- const positionStrategy = this.overlay.position().flexibleConnectedTo({ x, y }).withPositions([
1708
- {
1709
- originX: 'end',
1710
- originY: 'bottom',
1711
- overlayX: 'end',
1712
- overlayY: 'top',
1713
- },
1714
- ]);
1715
- this.overlayRef = this.overlay.create({
1716
- positionStrategy,
1717
- scrollStrategy: this.overlay.scrollStrategies.close(),
1718
- });
1719
- this.overlayRef.attach(new TemplatePortal(this.userMenu, this.viewContainerRef, {
1720
- // $implicit: user
1721
- item: user,
1722
- }));
1723
- this.mouseEvent$ = fromEvent(document, 'click').pipe(filter(event => {
1724
- const clickTarget = event.target;
1725
- return !!this.overlayRef && !this.overlayRef.overlayElement.contains(clickTarget);
1726
- }), take(1)).subscribe(() => this.cerrarMenuContextual());
1727
- }
1728
- cerrarMenuContextual() {
1729
- this.mouseEvent$ && this.mouseEvent$.unsubscribe();
1730
- if (this.overlayRef) {
1731
- this.overlayRef.dispose();
1732
- this.overlayRef = undefined;
1733
- }
1734
- }
1735
- emitirAccionRecargar() {
1736
- if (!this.idTabla) {
1737
- this.objSeleccionado = null;
1738
- }
1739
- this.accionRecargar.emit(this.opcFiltroActual);
1740
- // this.accionRecargar.emit({ ...this.opcFiltroActual, ...{seleccionado: this.objSeleccionado}});
1741
- }
1742
- tipoValorFuncion = tipoValorFuncion;
1743
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoComponent, deps: [{ token: i1$2.FormBuilder }, { token: i2$2.Overlay }, { token: i0.ViewContainerRef }, { token: TablaMantenimientoService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1744
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: TablaMantenimientoComponent, isStandalone: true, selector: "jvs-tabla-mantenimiento", inputs: { dataSuscription: "dataSuscription", objThis: "objThis", nombreColeccion: "nombreColeccion", ctrlBusquedaValue: "ctrlBusquedaValue", ctrlBusquedaPlaceholder: "ctrlBusquedaPlaceholder", filtroCampos: "filtroCampos", paginador: "paginador", esTabla: "esTabla", readOnly: "readOnly", filaExtraHeader: "filaExtraHeader", filaFooter: "filaFooter", botonesCRUD: "botonesCRUD", objBotonesCRUD: "objBotonesCRUD", classSeleccionado: "classSeleccionado", classAnulado: "classAnulado", campoAnulado: "campoAnulado", campoAnuladoMensaje: "campoAnuladoMensaje", selectionModel: "selectionModel", filaExtraTemplate: "filaExtraTemplate", exportarExcel: "exportarExcel", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", derechosActuales: "derechosActuales", ctrlBusqueda: "ctrlBusqueda", leyenda: "leyenda", idTabla: "idTabla", columnasTabla: "columnasTabla", botonesMenu: "botonesMenu", condicionesClaseFila: "condicionesClaseFila", rowTooltip: "rowTooltip", soloIconos: "soloIconos" }, outputs: { dblclickItem: "dblclickItem", opcionSelecionada: "opcionSelecionada", opcBusqueda: "opcBusqueda", accionRecargar: "accionRecargar", selectionModelChange: "selectionModelChange", dataSourceChange: "dataSourceChange", resultados: "resultados" }, host: { properties: { "id": "this.id" }, classAttribute: "jvs-tabla-mantenimiento" }, providers: [
1745
- { provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: { formFieldAppearance: 'outline' } }
1746
- ], queries: [{ propertyName: "columnDefs", predicate: MatColumnDef, descendants: true }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "rowFooter", first: true, predicate: MatFooterRow, descendants: true, read: ElementRef }, { propertyName: "userMenu", first: true, predicate: ["userMenu"], descendants: true }, { propertyName: "rows", predicate: MatRow, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col h-fit\">\n <div class=\"grow flex items-center justify-between bg-white\">\n <ng-content select=\"[filtro]\"></ng-content>\n </div>\n\n <div class=\"flex flex-col border-t\">\n <div class=\"flex-1 bg-app-bar flex items-center justify-between p-1\">\n <!-- <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">-->\n <!-- </div>-->\n <div class=\"flex items-center flex-wrap mr-1 h-full\" *ngIf=\"leyenda\">\n <span class=\"font-bold\" [class]=\"leyenda.class\">{{ leyenda.text }}</span>\n </div>\n <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">\n <div *ngIf=\"(botonesMenuFinal.izquierda ?? []).length > 0 \" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.izquierda; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.izquierda?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.crud ?? []).length > 0\" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.crud; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.crud?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.principal ?? []).length > 0\" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.principal; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.principal?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.derecha ?? []).length > 0\" class=\"flex-auto flex items-center justify-end contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.derecha; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.derecha?.length}}\"></ng-container>\n </ng-container>\n </div>\n <ng-content select=\"[objetosMenuPegado]\"></ng-content>\n </div>\n <div class=\"flex flex-1 sm:hidden items-center flex-wrap gap-1\">\n <button class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1\"\n matRipple\n matTooltip=\"Botones de Acci\u00F3n\"\n type=\"button\"\n [matMenuTriggerFor]=\"menuOpciones\"\n >\n <mat-icon class=\"icon-xs\" svgIcon=\"roundMenu\"></mat-icon>\n </button>\n </div>\n <div class=\"flex-none flex items-center justify-end border-l-2\">\n <div class=\"flex-1 sm:flex-none flex items-center justify-end\">\n <ng-content select=\"[objetosMenu]\"></ng-content>\n </div>\n </div>\n <div *ngIf=\"ctrlBusqueda\" class=\"hidden flex-initial sm:flex items-center form-input max-w-[150px] bg-card rounded-full border m-1 px-1 border-l-2\"\n >\n <mat-icon svgIcon=\"roundSearch\" class=\"icon-xs\"></mat-icon>\n <input [formControl]=\"cCampoBusqueda\"\n class=\"text-xs px-1 py-1 border-0 outline-none w-full bg-transparent max-w-sm\"\n [placeholder]=\"ctrlBusquedaPlaceholder\"\n (keyup.enter)=\"ctrlBusqueda == 'query' ? cargarData() : false;\"\n type=\"search\">\n </div>\n <div class=\"flex-none flex items-center justify-end border-l-2\">\n <ng-content select=\"[botonesFiltro]\"></ng-content>\n <button matRipple *ngIf=\"isRecargarUsed || ctrlBusqueda == 'query'\"\n class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1 text-green-700\"\n matTooltip=\"Actualizar datos\"\n (click)=\"(ctrlBusqueda == 'query' ? cargarData() : emitirAccionRecargar())\"\n type=\"button\">\n <mat-icon svgIcon=\"roundRefresh\" class=\"icon-xs\"></mat-icon>\n\n </button>\n <button matRipple [matMenuTriggerFor]=\"columnFilterMenu\" *ngIf=\"filtroCampos\"\n class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1\"\n matTooltip=\"Columnas Filtro\"\n type=\"button\">\n <mat-icon svgIcon=\"roundFilterList\" class=\"icon-xs\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.secundario ?? []).length > 0\" class=\"flex-1 bg-app-bar flex items-center justify-between p-1 border-t\">\n <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">\n <div class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.secundario; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.secundario?.length}}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <!--<div class=\"grow flex flex-col items-stretch contenedor-tabla\" [ngClass]=\"{'table-container overflow-auto': esTabla}\">\n <pre>{{ this.chkLista.modelosChk | json }}</pre>\n <pre>{{ this.chkLista.checkbox.cantidadActivos | json }}</pre>\n <pre>{{ this.chkLista.checkbox.algunosActivos | json }}</pre>\n </div>-->\n <div class=\"grow flex flex-col items-stretch contenedor-tabla\" [ngClass]=\"{'table-container overflow-auto': esTabla}\">\n <ng-content select=\"[cuerpo]\"></ng-content>\n\n <table [id]=\"'tabla_' + nombreColeccion\" [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"true\"\n [hidden]=\"!esTabla\"\n class=\"flex-1 table-mantenimiento table-auto h-fit\" mat-table matSort\n [trackBy]=\"trackByFn\"\n #tablaMantenimiento\n >\n\n <!--<table [dataSource]=\"dataSource\" class=\"table-mantenimiento table-auto h-auto w-full justify-center\" mat-table matSort>-->\n\n\n <ng-content select=\"[tableDefinitions]\"></ng-content>\n <ng-container matColumnDef=\"numeracion_automatica\">\n <th mat-header-cell *matHeaderCellDef style=\"width: 16px !important\">N\u00BA</th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\" class=\"p-0 celda-numeracion-fila\">\n <div class=\"flex items-center justify-center font-bold numeracionFila\">\n <ng-container *ngIf=\"esTabla && paginador\">\n {{ (this.paginator?.pageIndex == 0 ? i + 1 : 1 + i + (this.paginator?.pageIndex ?? 1) * (this.paginator?.pageSize ?? 1)) }}\n </ng-container>\n <ng-container *ngIf=\"!paginador\">\n {{ (i + 1) }}\n </ng-container>\n </div>\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"uppercase\"></td>\n </ng-container>\n <jvs-tabla-mantenimiento-column-defs [objThis]=\"this\" [colDetalle]=\"columnasTabla\"\n [nombreColeccion]=\"nombreColeccion\" [(chkLista)]=\"chkLista\"></jvs-tabla-mantenimiento-column-defs>\n\n <tr *matHeaderRowDef=\"visibleColumns; sticky: true\" mat-header-row class=\"title\" matHeader\n ></tr>\n\n <ng-container *ngIf=\"!!filaExtraHeader\">\n <tr mat-row *matRowDef=\"let row; columns: ['filaExtraHeader']\" class=\"student-detail-row\"\n [style.height.px]=\"0\"\n ></tr>\n\n <ng-container matColumnDef=\"filaExtraHeader\">\n <td mat-cell *matCellDef=\"let row; let i = dataIndex\" [attr.colspan]=\"visibleColumns.length\">\n\n <div class=\"row m-0 student-element-detail\"\n [@detailExpand]=\"(i == 0 && filaExtraHeader.esVisible && filaExtraHeader.esVisible()) ? 'expanded' : 'collapsed'\"\n [style.padding-right.px]=\"row.isExpanded ? 5 : 0\"\n [style.padding-left.px]=\"row.isExpanded ? 5 : 0\"\n >\n <ng-container *ngIf=\"filaExtraHeader.template\"\n [ngTemplateOutlet]=\"filaExtraHeader.template\"\n [ngTemplateOutletContext]=\"{ row: row }\"></ng-container>\n </div>\n\n </td>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"filaFooter\">\n <tr *matFooterRowDef=\"visibleColumns\" mat-footer-row\n [style.height.px]=\"0\"\n [id]=\"nombreColeccion + '_filaFooter'\"\n ></tr>\n </ng-container>\n\n <!--\t<tr\n *matRowDef=\"let row; columns: visibleColumns;\"\n class=\"hover:bg-secondary trans-ease-out cursor-pointer\"\n mat-row></tr>-->\n <tr\n [matRowKeyboardSelection]=\"tablaMantenimiento\"\n [rowModel]=\"row\"\n (seleccionarSiguiente)=\"opcMenu($event, {seccion: nombreColeccion, tipo: 'ver'});\"\n\n *matRowDef=\"let row; let idxTabla = dataIndex; columns: visibleColumns;\"\n (click)=\"seleccionarItem(row); opcMenu(row, {seccion: nombreColeccion, tipo: 'ver', tableDataIndex: idxTabla });\"\n (dblclick)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'seleccionar'}); dblclickItem.emit(row)\"\n (contextmenu)=\"(abrirMenuContextual($event, row)); $event. preventDefault();\"\n [ngClass]=\"classFila(row)\"\n @fadeInUp\n class=\"trans-ease-out cursor-pointer h-auto\"\n [style.height.px]=\"0\"\n [id]=\"propiedadSeleccion(row)\"\n [matTooltip]=\"procesarRowTooltip(row)\"\n matTooltipPosition=\"below\"\n [matTooltipPositionAtOrigin]=\"true\"\n [matTooltipClass]=\"['bg-red-700', 'text-red-100', 'm-0']\"\n [matTooltipDisabled]=\"!procesarRowTooltip(row)\"\n [class.regAnulado]=\"row[campoAnulado] == 1\"\n [class.regTooltip]=\"!!procesarRowTooltip(row)\"\n (keyup.delete)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'eliminar'})\"\n mat-row></tr>\n <ng-container *ngIf=\"filaExtraTemplate\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"student-detail-row h-0\"></tr>\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"visibleColumns.length\">\n\n <div class=\"row m-0 student-element-detail\"\n [@detailExpand]=\"row.isExpanded ? 'expanded' : 'collapsed'\"\n [style.padding-right.px]=\"row.isExpanded ? 5 : 0\"\n [style.padding-left.px]=\"row.isExpanded ? 5 : 0\"\n >\n <ng-container [ngTemplateOutlet]=\"filaExtraTemplate\"\n [ngTemplateOutletContext]=\"{ row: row }\"></ng-container>\n </div>\n\n </td>\n </ng-container>\n </ng-container>\n </table>\n\n <ng-container *ngIf=\"componenteCargadoTotalmente\">\n <div *ngIf=\"(noData | async) && esTabla\" class=\"flex-1 text-center text-secondary font-medium\">\n No se encontraron datos\n </div>\n </ng-container>\n </div>\n <ng-content select=\"[appendTable]\"></ng-content>\n <div class=\"flex-1 bg-app-bar flex flex-col sm:flex-row items-start justify-between p-1\">\n <div class=\"flex-1 flex items-start flex-wrap gap-1\">\n <div *ngIf=\"(botonesMenuFinal.inferior ?? []).length > 0\" class=\" flex items-center flex-wrap\">\n <ng-container *ngFor=\"let btn of botonesMenu.inferior; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.inferior?.length}}\"></ng-container>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"esTabla && paginador\" class=\"flex-1 sm:flex-none flex items-center justify-end\">\n <mat-paginator class=\"tabla-mantenimiento-paginador\" [pageSizeOptions]=\"paginacion.pageSizeOptions\" [pageIndex]=\"paginacion.pageIndex - 1\" [length]=\"paginacion.pageLength\" [pageSize]=\"paginacion.pageSize\" (page)=\"paginacion.pageCurrent = $event; emitirResultados();\" ></mat-paginator>\n </div>\n </div>\n </div>\n\n</div>\n\n\n\n<!-- SECCION DE TEMPLATES O MENUS -->\n\n\n<mat-menu #columnFilterMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n <ng-container *ngFor=\"let column of columnasTabla\">\n <button (click)=\"toggleColumnVisibility(column, $event)\" *ngIf=\"!tipoValorFuncion(column.noMostrarEnLista, false)\"\n class=\"checkbox-item mat-menu-item\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" [(ngModel)]=\"column.visible\" [ngModelOptions]=\"{standalone: true}\" color=\"primary\">\n <span [innerHTML]=\"(column.labelLista ?? column.label).replace('<br>', ' ')\"></span>\n </mat-checkbox>\n </button>\n </ng-container>\n</mat-menu>\n\n\n\n\n\n\n<ng-template #botonesSuperiores let-btn=\"btn\" let-idx=\"idx\">\n <ng-container *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: true, idx: idx}\"></ng-container>\n</ng-template>\n\n<ng-template #botonesContextual let-btn=\"btn\" let-item=\"item\" let-barraSuperior=\"barraSuperior\" let-idx=\"idx\">\n\n <ng-container *ngIf=\"barraSuperior; else noBarraSuperior\">\n\n <!--\t\t<button mat-button style=\"min-width: unset; border: 1px !important;\" class=\"uppercase border border-gray rounded-none h-full px-1 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\">-->\n <!--\t\t\t<mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" size=\"15px\" class=\"icon-xs\"></mat-icon>-->\n <!--\t\t</button>-->\n <ng-container *ngIf=\"btn.subItems && btn.subItems.length > 0\">\n <button class=\"flex items-center justify-between uppercase text-2xs leading-none rounded-none px-2 py-1 bg-opacity-95 hover:bg-opacity-100 disabled:opacity-50 disabled:text-secondary disabled:!bg-gray-300 dark:disabled:!bg-gray-500 mat-elevation-z2\" type=\"button\"\n\n *ngIf=\"(!btn.esVisible || btn.esVisible(item, this)) && subItemsActivos(btn, item)\"\n [class]=\"(btn.class?btn.class:'')\"\n\n (click)=\"opcMenu(item, btn)\"\n [style.min-width]=\"((btn.soloIcono ?? tipoValorFuncion(soloIconos)) ? 'unset' : '')\"\n [matTooltip]=\"btn.tooltip || (btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo))) \"\n [matMenuTriggerFor]=\"menuOtrosBarra.menu\"\n\n [matBadge]=\"btn.badge\"\n matBadgeSize=\"small\"\n >\n <mat-icon class=\"icon-xs\" [class.mr-0.5]=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" ></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n <mat-icon class=\"icon-xs\" svgIcon=\"fa5sCaretDown\" ></mat-icon>\n </button>\n\n <jvs-tabla-mantenimiento-menu #menuOtrosBarra\n [objThis]=\"objThis\"\n [nombreColeccion]=\"nombreColeccion\"\n [item]=\"item\"\n [derechosActuales]=\"derechosActuales\"\n [subItems]=\"btn.subItems\"\n (opcionSelecionada)=\"opcMenu($event.item, $event.btn)\"\n [botonTemplate]=\"botonesContextual\"\n >\n </jvs-tabla-mantenimiento-menu>\n </ng-container>\n <ng-container *ngIf=\"!btn.subItems || btn.subItems.length == 0\">\n <button class=\"flex items-center justify-between uppercase text-2xs leading-none rounded-none px-2 py-1 bg-opacity-95 hover:bg-opacity-100 disabled:opacity-50 disabled:text-secondary disabled:!bg-gray-300 dark:disabled:!bg-gray-500 mat-elevation-z2\" type=\"button\"\n\n *ngIf=\"!btn.esVisible || btn.esVisible(item, this)\"\n [class]=\"(btn.class?btn.class:'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo])) && !(['nuevo', 'editar', 'eliminar'].includes(btn.tipo))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn)\"\n [style.min-width]=\"((btn.soloIcono ?? tipoValorFuncion(soloIconos)) ? 'unset' : '')\"\n [matTooltip]=\"btn.tooltip || (btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo))) \"\n\n [matBadge]=\"btn.badge\"\n matBadgeSize=\"small\"\n >\n <mat-icon class=\"icon-xs\" [class.mr-0.5]=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n </button>\n\n </ng-container>\n\n </ng-container>\n <ng-template #noBarraSuperior>\n\n <ng-container *ngIf=\"btn.subItems && btn.subItems.length > 0\">\n <button class=\"flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\" mat-menu-item type=\"button\"\n *ngIf=\"!btn.noContextual && (!btn.esVisible || btn.esVisible(item, this))\"\n [class]=\"(btn.class?btn.class.replace('text-white', '').replace('bg', 'text'):'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo]))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn); $event.stopPropagation();\"\n [matMenuTriggerFor]=\"menuOtrosBarra.menu\"\n >\n <div class=\"flex w-full items-center justify-between uppercase text-2xs\"\n >\n <mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"\n class=\"flex-none icon-xs\"\n ></mat-icon>\n <span class=\"grow text-2xs\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n <mat-icon class=\"flex-none icon-xs\" svgIcon=\"fa5sCaretRight\"></mat-icon>\n </div>\n </button>\n\n <jvs-tabla-mantenimiento-menu #menuOtrosBarra\n [objThis]=\"objThis\"\n [nombreColeccion]=\"nombreColeccion\"\n [item]=\"item\"\n [derechosActuales]=\"derechosActuales\"\n [subItems]=\"btn.subItems\"\n (opcionSelecionada)=\"opcMenu($event.item, $event.btn)\"\n [botonTemplate]=\"botonesContextual\"\n >\n </jvs-tabla-mantenimiento-menu>\n </ng-container>\n <ng-container *ngIf=\"!btn.subItems || btn.subItems.length == 0\">\n <ng-container *ngIf=\"btn.tipo == '-#SEPARADOR#-'; else itemsNormales\">\n <mat-divider></mat-divider>\n </ng-container>\n <ng-template #itemsNormales>\n <button class=\"flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\" mat-menu-item type=\"button\"\n *ngIf=\"!btn.noContextual && (!btn.esVisible || btn.esVisible(item, this))\"\n [class]=\"(btn.class?btn.class.replace('text-white', '').replace('bg', 'text'):'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo]))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn)\"\n >\n <div class=\"flex w-full items-center justify-between uppercase text-2xs\">\n <mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" class=\"flex-none icon-xs\"\n ></mat-icon>\n <span class=\"grow text-2xs\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n </div>\n </button>\n </ng-template>\n\n </ng-container>\n\n </ng-template>\n\n</ng-template>\n\n<ng-template #userMenu let-item=\"item\">\n <div class=\"mat-menu bg-white rounded mat-elevation-z8 shadow botonesContextual\">\n <ng-container *ngFor=\"let btn of listaMenuCompleto\">\n <ng-container *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: false}\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n\n<mat-menu #menuOpciones=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n <ng-container *ngFor=\"let btn of listaMenuCompleto\">\n <ng-container\n *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: false}\"></ng-container>\n </ng-container>\n</mat-menu>\n\n", styles: ["@charset \"UTF-8\";:root{--tabla-mantenimiento-seleccion-fondo: rgb(179, 217, 252);--tabla-mantenimiento-seleccion-texto: rgb(1, 84, 164);--mat-paginator-container-size: 30px}:root .table-mantenimiento .elemento-seleccionado{background-color:var(--tabla-mantenimiento-seleccion-fondo)!important;color:var(--tabla-mantenimiento-seleccion-texto)!important;border-color:var(--tabla-mantenimiento-seleccion-texto)!important}.jvs-tabla-mantenimiento{width:inherit}.jvs-tabla-mantenimiento .contenedor-botones>*:first-child{@apply rounded-l;}.jvs-tabla-mantenimiento .contenedor-botones>*:last-child{@apply rounded-r;}.jvs-tabla-mantenimiento tr.regTooltip>td:first-child div:first-child:before,.jvs-tabla-mantenimiento tr.regTooltip>th:first-child div:first-child:before{content:\"\\26a0\\fe0f \";color:red;margin-right:4px;font-size:12px}.jvs-tabla-mantenimiento tr.regTooltip>td:first-child:not(:has(div)):before,.jvs-tabla-mantenimiento tr.regTooltip>th:first-child:not(:has(div)):before{content:\"\\26a0\\fe0f \";color:red;margin-right:4px;font-size:12px}.jvs-tabla-mantenimiento .mat-mdc-menu-content:not(:empty){@apply flex flex-col items-start;padding:0!important}.jvs-tabla-mantenimiento .mat-mdc-menu-item{line-height:24px!important;height:24px!important;min-height:24px!important}.jvs-tabla-mantenimiento .mat-mdc-menu-panel{min-height:auto!important}.jvs-tabla-mantenimiento .mat-mdc-table .mat-mdc-cell,.jvs-tabla-mantenimiento .mat-mdc-table .mat-mdc-header-cell .mat-mdc-footer-cell{white-space:unset}.jvs-tabla-mantenimiento .table-container{max-height:600px!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-table-sticky-border-elem-right{border-left:1px solid #e0e0e0}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0}.jvs-tabla-mantenimiento .table-mantenimiento tr.regAnulado .mat-mdc-cell{color:unset!important}.jvs-tabla-mantenimiento .table-mantenimiento .bg-primary-activo .numeracionFila{@apply rounded-full bg-primary-contrast text-primary mx-1 p-1 w-6 h-6;}.jvs-tabla-mantenimiento .table-mantenimiento th .form-input{@apply w-auto;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell,.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell,.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell{border-width:1px;border-style:solid}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:not(.celda-numeracion-fila){padding:.05rem .25rem}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:last-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:last-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:last-of-type:not(.celda-numeracion-fila){padding:0 .25rem}.jvs-tabla-mantenimiento .table-mantenimiento .student-element-detail{overflow:hidden;display:flex;align-items:center;justify-content:center}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-header-row{height:25px!important;color:rgb(var(--color-primary))!important;background-color:rgb(var(--color-primary-contrast))!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-header-cell{padding:5px;font-size:10px;line-height:10px;font-weight:700!important;color:inherit}.jvs-tabla-mantenimiento .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):hover,.jvs-tabla-mantenimiento .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):focus{background-color:rgba(var(--color-primary-contrast),.04)}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-row .mat-mdc-cell,.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-footer-row .mat-mdc-cell{font-size:10px}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-row .mat-mdc-footer-cell:empty,.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-footer-row .mat-mdc-footer-cell:empty{border-width:0!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-cell{@apply leading-tight;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell{border-color:#d4d0d0;@apply text-center uppercase;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container{@apply flex items-center justify-between w-full;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-content{@apply inline w-full text-center;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-arrow{@apply flex-none;}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-sort-header-content{width:100%;text-align:center;display:unset;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i9.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i3$1.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i2.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i2.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: TablaMantenimientoColumnDefsComponent, selector: "jvs-tabla-mantenimiento-column-defs", inputs: ["objThis", "nombreColeccion", "colDetalle", "chkLista"], outputs: ["chkListaChange"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i14.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: TablaMantenimientoMenuComponent, selector: "jvs-tabla-mantenimiento-menu", inputs: ["objThis", "nombreColeccion", "item", "derechosActuales", "subItems", "botonTemplate"], outputs: ["opcionSelecionada"] }, { kind: "directive", type: MatRowKeyboardSelectionDirective, selector: "[matRowKeyboardSelection]", inputs: ["matRowKeyboardSelection", "rowModel"], outputs: ["seleccionarSiguiente"] }], animations: [
1747
- trigger('detailExpand', [
1748
- state('collapsed', style({ height: '0px', minHeight: '0' })),
1749
- state('expanded', style({ height: '*' })),
1750
- transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
1751
- ]),
1752
- trigger('fadeInUp', [
1753
- transition(':enter', [
1754
- style({
1755
- transform: 'translateY(20px)',
1756
- opacity: 0
1757
- }),
1758
- animate(`400ms cubic-bezier(0.35, 0, 0.25, 1)`, style({
1759
- transform: 'translateY(0)',
1760
- opacity: 1
1761
- }))
1762
- ])
1763
- ]),
1764
- ] });
1765
- };
1766
- TablaMantenimientoComponent = TablaMantenimientoComponent_1 = __decorate([
1767
- UntilDestroy({ checkProperties: true })
1768
- ], TablaMantenimientoComponent);
1769
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoComponent, decorators: [{
1770
- type: Component,
1771
- args: [{ selector: 'jvs-tabla-mantenimiento', standalone: true, imports: [
1772
- CommonModule,
1773
- FormsModule,
1774
- MatCheckboxModule,
1775
- MatDividerModule,
1776
- MatIconModule,
1777
- MatMenuModule,
1778
- MatPaginatorModule,
1779
- MatRippleModule,
1780
- MatSortModule,
1781
- MatTableModule,
1782
- MatTooltipModule,
1783
- ReactiveFormsModule,
1784
- TablaMantenimientoColumnDefsComponent,
1785
- MatBadgeModule,
1786
- TablaMantenimientoMenuComponent,
1787
- MatRowKeyboardSelectionDirective,
1788
- ], host: {
1789
- class: 'jvs-tabla-mantenimiento',
1790
- }, animations: [
1791
- trigger('detailExpand', [
1792
- state('collapsed', style({ height: '0px', minHeight: '0' })),
1793
- state('expanded', style({ height: '*' })),
1794
- transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
1795
- ]),
1796
- trigger('fadeInUp', [
1797
- transition(':enter', [
1798
- style({
1799
- transform: 'translateY(20px)',
1800
- opacity: 0
1801
- }),
1802
- animate(`400ms cubic-bezier(0.35, 0, 0.25, 1)`, style({
1803
- transform: 'translateY(0)',
1804
- opacity: 1
1805
- }))
1806
- ])
1807
- ]),
1808
- ], providers: [
1809
- { provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: { formFieldAppearance: 'outline' } }
1810
- ], template: "<div class=\"flex flex-col h-fit\">\n <div class=\"grow flex items-center justify-between bg-white\">\n <ng-content select=\"[filtro]\"></ng-content>\n </div>\n\n <div class=\"flex flex-col border-t\">\n <div class=\"flex-1 bg-app-bar flex items-center justify-between p-1\">\n <!-- <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">-->\n <!-- </div>-->\n <div class=\"flex items-center flex-wrap mr-1 h-full\" *ngIf=\"leyenda\">\n <span class=\"font-bold\" [class]=\"leyenda.class\">{{ leyenda.text }}</span>\n </div>\n <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">\n <div *ngIf=\"(botonesMenuFinal.izquierda ?? []).length > 0 \" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.izquierda; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.izquierda?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.crud ?? []).length > 0\" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.crud; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.crud?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.principal ?? []).length > 0\" class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.principal; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.principal?.length}}\"></ng-container>\n </ng-container>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.derecha ?? []).length > 0\" class=\"flex-auto flex items-center justify-end contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.derecha; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.derecha?.length}}\"></ng-container>\n </ng-container>\n </div>\n <ng-content select=\"[objetosMenuPegado]\"></ng-content>\n </div>\n <div class=\"flex flex-1 sm:hidden items-center flex-wrap gap-1\">\n <button class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1\"\n matRipple\n matTooltip=\"Botones de Acci\u00F3n\"\n type=\"button\"\n [matMenuTriggerFor]=\"menuOpciones\"\n >\n <mat-icon class=\"icon-xs\" svgIcon=\"roundMenu\"></mat-icon>\n </button>\n </div>\n <div class=\"flex-none flex items-center justify-end border-l-2\">\n <div class=\"flex-1 sm:flex-none flex items-center justify-end\">\n <ng-content select=\"[objetosMenu]\"></ng-content>\n </div>\n </div>\n <div *ngIf=\"ctrlBusqueda\" class=\"hidden flex-initial sm:flex items-center form-input max-w-[150px] bg-card rounded-full border m-1 px-1 border-l-2\"\n >\n <mat-icon svgIcon=\"roundSearch\" class=\"icon-xs\"></mat-icon>\n <input [formControl]=\"cCampoBusqueda\"\n class=\"text-xs px-1 py-1 border-0 outline-none w-full bg-transparent max-w-sm\"\n [placeholder]=\"ctrlBusquedaPlaceholder\"\n (keyup.enter)=\"ctrlBusqueda == 'query' ? cargarData() : false;\"\n type=\"search\">\n </div>\n <div class=\"flex-none flex items-center justify-end border-l-2\">\n <ng-content select=\"[botonesFiltro]\"></ng-content>\n <button matRipple *ngIf=\"isRecargarUsed || ctrlBusqueda == 'query'\"\n class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1 text-green-700\"\n matTooltip=\"Actualizar datos\"\n (click)=\"(ctrlBusqueda == 'query' ? cargarData() : emitirAccionRecargar())\"\n type=\"button\">\n <mat-icon svgIcon=\"roundRefresh\" class=\"icon-xs\"></mat-icon>\n\n </button>\n <button matRipple [matMenuTriggerFor]=\"columnFilterMenu\" *ngIf=\"filtroCampos\"\n class=\"flex items-center justify-center text-2xs leading-none rounded-full p-1\"\n matTooltip=\"Columnas Filtro\"\n type=\"button\">\n <mat-icon svgIcon=\"roundFilterList\" class=\"icon-xs\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"(botonesMenuFinal.secundario ?? []).length > 0\" class=\"flex-1 bg-app-bar flex items-center justify-between p-1 border-t\">\n <div class=\"hidden flex-1 sm:flex items-center flex-wrap gap-1\">\n <div class=\" flex items-center flex-wrap contenedor-botones\">\n <ng-container *ngFor=\"let btn of botonesMenu.secundario; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.secundario?.length}}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <!--<div class=\"grow flex flex-col items-stretch contenedor-tabla\" [ngClass]=\"{'table-container overflow-auto': esTabla}\">\n <pre>{{ this.chkLista.modelosChk | json }}</pre>\n <pre>{{ this.chkLista.checkbox.cantidadActivos | json }}</pre>\n <pre>{{ this.chkLista.checkbox.algunosActivos | json }}</pre>\n </div>-->\n <div class=\"grow flex flex-col items-stretch contenedor-tabla\" [ngClass]=\"{'table-container overflow-auto': esTabla}\">\n <ng-content select=\"[cuerpo]\"></ng-content>\n\n <table [id]=\"'tabla_' + nombreColeccion\" [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"true\"\n [hidden]=\"!esTabla\"\n class=\"flex-1 table-mantenimiento table-auto h-fit\" mat-table matSort\n [trackBy]=\"trackByFn\"\n #tablaMantenimiento\n >\n\n <!--<table [dataSource]=\"dataSource\" class=\"table-mantenimiento table-auto h-auto w-full justify-center\" mat-table matSort>-->\n\n\n <ng-content select=\"[tableDefinitions]\"></ng-content>\n <ng-container matColumnDef=\"numeracion_automatica\">\n <th mat-header-cell *matHeaderCellDef style=\"width: 16px !important\">N\u00BA</th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\" class=\"p-0 celda-numeracion-fila\">\n <div class=\"flex items-center justify-center font-bold numeracionFila\">\n <ng-container *ngIf=\"esTabla && paginador\">\n {{ (this.paginator?.pageIndex == 0 ? i + 1 : 1 + i + (this.paginator?.pageIndex ?? 1) * (this.paginator?.pageSize ?? 1)) }}\n </ng-container>\n <ng-container *ngIf=\"!paginador\">\n {{ (i + 1) }}\n </ng-container>\n </div>\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"uppercase\"></td>\n </ng-container>\n <jvs-tabla-mantenimiento-column-defs [objThis]=\"this\" [colDetalle]=\"columnasTabla\"\n [nombreColeccion]=\"nombreColeccion\" [(chkLista)]=\"chkLista\"></jvs-tabla-mantenimiento-column-defs>\n\n <tr *matHeaderRowDef=\"visibleColumns; sticky: true\" mat-header-row class=\"title\" matHeader\n ></tr>\n\n <ng-container *ngIf=\"!!filaExtraHeader\">\n <tr mat-row *matRowDef=\"let row; columns: ['filaExtraHeader']\" class=\"student-detail-row\"\n [style.height.px]=\"0\"\n ></tr>\n\n <ng-container matColumnDef=\"filaExtraHeader\">\n <td mat-cell *matCellDef=\"let row; let i = dataIndex\" [attr.colspan]=\"visibleColumns.length\">\n\n <div class=\"row m-0 student-element-detail\"\n [@detailExpand]=\"(i == 0 && filaExtraHeader.esVisible && filaExtraHeader.esVisible()) ? 'expanded' : 'collapsed'\"\n [style.padding-right.px]=\"row.isExpanded ? 5 : 0\"\n [style.padding-left.px]=\"row.isExpanded ? 5 : 0\"\n >\n <ng-container *ngIf=\"filaExtraHeader.template\"\n [ngTemplateOutlet]=\"filaExtraHeader.template\"\n [ngTemplateOutletContext]=\"{ row: row }\"></ng-container>\n </div>\n\n </td>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"filaFooter\">\n <tr *matFooterRowDef=\"visibleColumns\" mat-footer-row\n [style.height.px]=\"0\"\n [id]=\"nombreColeccion + '_filaFooter'\"\n ></tr>\n </ng-container>\n\n <!--\t<tr\n *matRowDef=\"let row; columns: visibleColumns;\"\n class=\"hover:bg-secondary trans-ease-out cursor-pointer\"\n mat-row></tr>-->\n <tr\n [matRowKeyboardSelection]=\"tablaMantenimiento\"\n [rowModel]=\"row\"\n (seleccionarSiguiente)=\"opcMenu($event, {seccion: nombreColeccion, tipo: 'ver'});\"\n\n *matRowDef=\"let row; let idxTabla = dataIndex; columns: visibleColumns;\"\n (click)=\"seleccionarItem(row); opcMenu(row, {seccion: nombreColeccion, tipo: 'ver', tableDataIndex: idxTabla });\"\n (dblclick)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'seleccionar'}); dblclickItem.emit(row)\"\n (contextmenu)=\"(abrirMenuContextual($event, row)); $event. preventDefault();\"\n [ngClass]=\"classFila(row)\"\n @fadeInUp\n class=\"trans-ease-out cursor-pointer h-auto\"\n [style.height.px]=\"0\"\n [id]=\"propiedadSeleccion(row)\"\n [matTooltip]=\"procesarRowTooltip(row)\"\n matTooltipPosition=\"below\"\n [matTooltipPositionAtOrigin]=\"true\"\n [matTooltipClass]=\"['bg-red-700', 'text-red-100', 'm-0']\"\n [matTooltipDisabled]=\"!procesarRowTooltip(row)\"\n [class.regAnulado]=\"row[campoAnulado] == 1\"\n [class.regTooltip]=\"!!procesarRowTooltip(row)\"\n (keyup.delete)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'eliminar'})\"\n mat-row></tr>\n <ng-container *ngIf=\"filaExtraTemplate\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"student-detail-row h-0\"></tr>\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"visibleColumns.length\">\n\n <div class=\"row m-0 student-element-detail\"\n [@detailExpand]=\"row.isExpanded ? 'expanded' : 'collapsed'\"\n [style.padding-right.px]=\"row.isExpanded ? 5 : 0\"\n [style.padding-left.px]=\"row.isExpanded ? 5 : 0\"\n >\n <ng-container [ngTemplateOutlet]=\"filaExtraTemplate\"\n [ngTemplateOutletContext]=\"{ row: row }\"></ng-container>\n </div>\n\n </td>\n </ng-container>\n </ng-container>\n </table>\n\n <ng-container *ngIf=\"componenteCargadoTotalmente\">\n <div *ngIf=\"(noData | async) && esTabla\" class=\"flex-1 text-center text-secondary font-medium\">\n No se encontraron datos\n </div>\n </ng-container>\n </div>\n <ng-content select=\"[appendTable]\"></ng-content>\n <div class=\"flex-1 bg-app-bar flex flex-col sm:flex-row items-start justify-between p-1\">\n <div class=\"flex-1 flex items-start flex-wrap gap-1\">\n <div *ngIf=\"(botonesMenuFinal.inferior ?? []).length > 0\" class=\" flex items-center flex-wrap\">\n <ng-container *ngFor=\"let btn of botonesMenu.inferior; let idx = index;\">\n <ng-container *ngTemplateOutlet=\"botonesSuperiores; context:{btn: btn, idx: {inicio: idx, fin: botonesMenu.inferior?.length}}\"></ng-container>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"esTabla && paginador\" class=\"flex-1 sm:flex-none flex items-center justify-end\">\n <mat-paginator class=\"tabla-mantenimiento-paginador\" [pageSizeOptions]=\"paginacion.pageSizeOptions\" [pageIndex]=\"paginacion.pageIndex - 1\" [length]=\"paginacion.pageLength\" [pageSize]=\"paginacion.pageSize\" (page)=\"paginacion.pageCurrent = $event; emitirResultados();\" ></mat-paginator>\n </div>\n </div>\n </div>\n\n</div>\n\n\n\n<!-- SECCION DE TEMPLATES O MENUS -->\n\n\n<mat-menu #columnFilterMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n <ng-container *ngFor=\"let column of columnasTabla\">\n <button (click)=\"toggleColumnVisibility(column, $event)\" *ngIf=\"!tipoValorFuncion(column.noMostrarEnLista, false)\"\n class=\"checkbox-item mat-menu-item\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" [(ngModel)]=\"column.visible\" [ngModelOptions]=\"{standalone: true}\" color=\"primary\">\n <span [innerHTML]=\"(column.labelLista ?? column.label).replace('<br>', ' ')\"></span>\n </mat-checkbox>\n </button>\n </ng-container>\n</mat-menu>\n\n\n\n\n\n\n<ng-template #botonesSuperiores let-btn=\"btn\" let-idx=\"idx\">\n <ng-container *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: true, idx: idx}\"></ng-container>\n</ng-template>\n\n<ng-template #botonesContextual let-btn=\"btn\" let-item=\"item\" let-barraSuperior=\"barraSuperior\" let-idx=\"idx\">\n\n <ng-container *ngIf=\"barraSuperior; else noBarraSuperior\">\n\n <!--\t\t<button mat-button style=\"min-width: unset; border: 1px !important;\" class=\"uppercase border border-gray rounded-none h-full px-1 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\">-->\n <!--\t\t\t<mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" size=\"15px\" class=\"icon-xs\"></mat-icon>-->\n <!--\t\t</button>-->\n <ng-container *ngIf=\"btn.subItems && btn.subItems.length > 0\">\n <button class=\"flex items-center justify-between uppercase text-2xs leading-none rounded-none px-2 py-1 bg-opacity-95 hover:bg-opacity-100 disabled:opacity-50 disabled:text-secondary disabled:!bg-gray-300 dark:disabled:!bg-gray-500 mat-elevation-z2\" type=\"button\"\n\n *ngIf=\"(!btn.esVisible || btn.esVisible(item, this)) && subItemsActivos(btn, item)\"\n [class]=\"(btn.class?btn.class:'')\"\n\n (click)=\"opcMenu(item, btn)\"\n [style.min-width]=\"((btn.soloIcono ?? tipoValorFuncion(soloIconos)) ? 'unset' : '')\"\n [matTooltip]=\"btn.tooltip || (btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo))) \"\n [matMenuTriggerFor]=\"menuOtrosBarra.menu\"\n\n [matBadge]=\"btn.badge\"\n matBadgeSize=\"small\"\n >\n <mat-icon class=\"icon-xs\" [class.mr-0.5]=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" ></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n <mat-icon class=\"icon-xs\" svgIcon=\"fa5sCaretDown\" ></mat-icon>\n </button>\n\n <jvs-tabla-mantenimiento-menu #menuOtrosBarra\n [objThis]=\"objThis\"\n [nombreColeccion]=\"nombreColeccion\"\n [item]=\"item\"\n [derechosActuales]=\"derechosActuales\"\n [subItems]=\"btn.subItems\"\n (opcionSelecionada)=\"opcMenu($event.item, $event.btn)\"\n [botonTemplate]=\"botonesContextual\"\n >\n </jvs-tabla-mantenimiento-menu>\n </ng-container>\n <ng-container *ngIf=\"!btn.subItems || btn.subItems.length == 0\">\n <button class=\"flex items-center justify-between uppercase text-2xs leading-none rounded-none px-2 py-1 bg-opacity-95 hover:bg-opacity-100 disabled:opacity-50 disabled:text-secondary disabled:!bg-gray-300 dark:disabled:!bg-gray-500 mat-elevation-z2\" type=\"button\"\n\n *ngIf=\"!btn.esVisible || btn.esVisible(item, this)\"\n [class]=\"(btn.class?btn.class:'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo])) && !(['nuevo', 'editar', 'eliminar'].includes(btn.tipo))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn)\"\n [style.min-width]=\"((btn.soloIcono ?? tipoValorFuncion(soloIconos)) ? 'unset' : '')\"\n [matTooltip]=\"btn.tooltip || (btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo))) \"\n\n [matBadge]=\"btn.badge\"\n matBadgeSize=\"small\"\n >\n <mat-icon class=\"icon-xs\" [class.mr-0.5]=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!(btn.soloIcono ?? tipoValorFuncion(soloIconos))\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n </button>\n\n </ng-container>\n\n </ng-container>\n <ng-template #noBarraSuperior>\n\n <ng-container *ngIf=\"btn.subItems && btn.subItems.length > 0\">\n <button class=\"flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\" mat-menu-item type=\"button\"\n *ngIf=\"!btn.noContextual && (!btn.esVisible || btn.esVisible(item, this))\"\n [class]=\"(btn.class?btn.class.replace('text-white', '').replace('bg', 'text'):'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo]))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn); $event.stopPropagation();\"\n [matMenuTriggerFor]=\"menuOtrosBarra.menu\"\n >\n <div class=\"flex w-full items-center justify-between uppercase text-2xs\"\n >\n <mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"\n class=\"flex-none icon-xs\"\n ></mat-icon>\n <span class=\"grow text-2xs\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n <mat-icon class=\"flex-none icon-xs\" svgIcon=\"fa5sCaretRight\"></mat-icon>\n </div>\n </button>\n\n <jvs-tabla-mantenimiento-menu #menuOtrosBarra\n [objThis]=\"objThis\"\n [nombreColeccion]=\"nombreColeccion\"\n [item]=\"item\"\n [derechosActuales]=\"derechosActuales\"\n [subItems]=\"btn.subItems\"\n (opcionSelecionada)=\"opcMenu($event.item, $event.btn)\"\n [botonTemplate]=\"botonesContextual\"\n >\n </jvs-tabla-mantenimiento-menu>\n </ng-container>\n <ng-container *ngIf=\"!btn.subItems || btn.subItems.length == 0\">\n <ng-container *ngIf=\"btn.tipo == '-#SEPARADOR#-'; else itemsNormales\">\n <mat-divider></mat-divider>\n </ng-container>\n <ng-template #itemsNormales>\n <button class=\"flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent\" mat-menu-item type=\"button\"\n *ngIf=\"!btn.noContextual && (!btn.esVisible || btn.esVisible(item, this))\"\n [class]=\"(btn.class?btn.class.replace('text-white', '').replace('bg', 'text'):'text-secondary')\"\n [ngClass]=\"{'text-secondary italic': !ignorarDerechos && !btn.esIndependiente && (!btn.ignorarDerecho && (!derechosActuales || !derechosActuales[btn.cDerechoCodigo ?? btn.tipo]))}\"\n [disabled]=\"!btn.esIndependiente && botonDisabled(btn, item)\"\n (click)=\"opcMenu(item, btn)\"\n >\n <div class=\"flex w-full items-center justify-between uppercase text-2xs\">\n <mat-icon *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" class=\"flex-none icon-xs\"\n ></mat-icon>\n <span class=\"grow text-2xs\">{{ btn.label ? btn.label : ( (derechosActuales && derechosActuales[btn.cDerechoCodigo ?? btn.tipo]) ? derechosActuales[btn.cDerechoCodigo ?? btn.tipo]['cDerechoNombre'] : capitalizarTexto(btn.tipo)) }}</span>\n </div>\n </button>\n </ng-template>\n\n </ng-container>\n\n </ng-template>\n\n</ng-template>\n\n<ng-template #userMenu let-item=\"item\">\n <div class=\"mat-menu bg-white rounded mat-elevation-z8 shadow botonesContextual\">\n <ng-container *ngFor=\"let btn of listaMenuCompleto\">\n <ng-container *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: false}\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n\n<mat-menu #menuOpciones=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\n <ng-container *ngFor=\"let btn of listaMenuCompleto\">\n <ng-container\n *ngTemplateOutlet=\"botonesContextual; context:{btn: btn, item: objSeleccionado, barraSuperior: false}\"></ng-container>\n </ng-container>\n</mat-menu>\n\n", styles: ["@charset \"UTF-8\";:root{--tabla-mantenimiento-seleccion-fondo: rgb(179, 217, 252);--tabla-mantenimiento-seleccion-texto: rgb(1, 84, 164);--mat-paginator-container-size: 30px}:root .table-mantenimiento .elemento-seleccionado{background-color:var(--tabla-mantenimiento-seleccion-fondo)!important;color:var(--tabla-mantenimiento-seleccion-texto)!important;border-color:var(--tabla-mantenimiento-seleccion-texto)!important}.jvs-tabla-mantenimiento{width:inherit}.jvs-tabla-mantenimiento .contenedor-botones>*:first-child{@apply rounded-l;}.jvs-tabla-mantenimiento .contenedor-botones>*:last-child{@apply rounded-r;}.jvs-tabla-mantenimiento tr.regTooltip>td:first-child div:first-child:before,.jvs-tabla-mantenimiento tr.regTooltip>th:first-child div:first-child:before{content:\"\\26a0\\fe0f \";color:red;margin-right:4px;font-size:12px}.jvs-tabla-mantenimiento tr.regTooltip>td:first-child:not(:has(div)):before,.jvs-tabla-mantenimiento tr.regTooltip>th:first-child:not(:has(div)):before{content:\"\\26a0\\fe0f \";color:red;margin-right:4px;font-size:12px}.jvs-tabla-mantenimiento .mat-mdc-menu-content:not(:empty){@apply flex flex-col items-start;padding:0!important}.jvs-tabla-mantenimiento .mat-mdc-menu-item{line-height:24px!important;height:24px!important;min-height:24px!important}.jvs-tabla-mantenimiento .mat-mdc-menu-panel{min-height:auto!important}.jvs-tabla-mantenimiento .mat-mdc-table .mat-mdc-cell,.jvs-tabla-mantenimiento .mat-mdc-table .mat-mdc-header-cell .mat-mdc-footer-cell{white-space:unset}.jvs-tabla-mantenimiento .table-container{max-height:600px!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-table-sticky-border-elem-right{border-left:1px solid #e0e0e0}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0}.jvs-tabla-mantenimiento .table-mantenimiento tr.regAnulado .mat-mdc-cell{color:unset!important}.jvs-tabla-mantenimiento .table-mantenimiento .bg-primary-activo .numeracionFila{@apply rounded-full bg-primary-contrast text-primary mx-1 p-1 w-6 h-6;}.jvs-tabla-mantenimiento .table-mantenimiento th .form-input{@apply w-auto;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell,.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell,.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell{border-width:1px;border-style:solid}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:not(.celda-numeracion-fila){padding:.05rem .25rem}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell:last-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-cell:last-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:first-of-type:not(.celda-numeracion-fila),.jvs-tabla-mantenimiento .table-mantenimiento td.mat-mdc-footer-cell:last-of-type:not(.celda-numeracion-fila){padding:0 .25rem}.jvs-tabla-mantenimiento .table-mantenimiento .student-element-detail{overflow:hidden;display:flex;align-items:center;justify-content:center}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-header-row{height:25px!important;color:rgb(var(--color-primary))!important;background-color:rgb(var(--color-primary-contrast))!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-header-cell{padding:5px;font-size:10px;line-height:10px;font-weight:700!important;color:inherit}.jvs-tabla-mantenimiento .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):hover,.jvs-tabla-mantenimiento .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):focus{background-color:rgba(var(--color-primary-contrast),.04)}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-row .mat-mdc-cell,.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-footer-row .mat-mdc-cell{font-size:10px}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-row .mat-mdc-footer-cell:empty,.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-footer-row .mat-mdc-footer-cell:empty{border-width:0!important}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-cell{@apply leading-tight;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell{border-color:#d4d0d0;@apply text-center uppercase;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container{@apply flex items-center justify-between w-full;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-content{@apply inline w-full text-center;}.jvs-tabla-mantenimiento .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-arrow{@apply flex-none;}.jvs-tabla-mantenimiento .table-mantenimiento .mat-mdc-sort-header-content{width:100%;text-align:center;display:unset;align-items:center}\n"] }]
1811
- }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: i2$2.Overlay }, { type: i0.ViewContainerRef }, { type: TablaMantenimientoService }, { type: i0.ChangeDetectorRef }], propDecorators: { id: [{
1812
- type: HostBinding
1813
- }], dataSuscription: [{
1814
- type: Input
1815
- }], objThis: [{
1816
- type: Input,
1817
- args: [{ required: true }]
1818
- }], nombreColeccion: [{
1819
- type: Input,
1820
- args: [{ required: true }]
1821
- }], ctrlBusquedaValue: [{
1822
- type: Input
1823
- }], ctrlBusquedaPlaceholder: [{
1824
- type: Input
1825
- }], filtroCampos: [{
1826
- type: Input
1827
- }], paginador: [{
1828
- type: Input
1829
- }], esTabla: [{
1830
- type: Input
1831
- }], readOnly: [{
1832
- type: Input
1833
- }], filaExtraHeader: [{
1834
- type: Input
1835
- }], filaFooter: [{
1836
- type: Input
1837
- }], botonesCRUD: [{
1838
- type: Input
1839
- }], dblclickItem: [{
1840
- type: Output
1841
- }], objBotonesCRUD: [{
1842
- type: Input
1843
- }], classSeleccionado: [{
1844
- type: Input
1845
- }], classAnulado: [{
1846
- type: Input
1847
- }], campoAnulado: [{
1848
- type: Input
1849
- }], campoAnuladoMensaje: [{
1850
- type: Input
1851
- }], opcionSelecionada: [{
1852
- type: Output
1853
- }], opcBusqueda: [{
1854
- type: Output
1855
- }], accionRecargar: [{
1856
- type: Output
1857
- }], selectionModel: [{
1858
- type: Input
1859
- }], selectionModelChange: [{
1860
- type: Output
1861
- }], filaExtraTemplate: [{
1862
- type: Input
1863
- }], paginator: [{
1864
- type: ViewChild,
1865
- args: [MatPaginator]
1866
- }], sort: [{
1867
- type: ViewChild,
1868
- args: [MatSort]
1869
- }], exportarExcel: [{
1870
- type: Input
1871
- }], pageSize: [{
1872
- type: Input
1873
- }], pageSizeOptions: [{
1874
- type: Input
1875
- }], dataSourceChange: [{
1876
- type: Output
1877
- }], resultados: [{
1878
- type: Output
1879
- }], table: [{
1880
- type: ViewChild,
1881
- args: [MatTable, { static: false }]
1882
- }], columnDefs: [{
1883
- type: ContentChildren,
1884
- args: [MatColumnDef, { descendants: true }]
1885
- }], derechosActuales: [{
1886
- type: Input
1887
- }], rows: [{
1888
- type: ViewChildren,
1889
- args: [MatRow, { read: ElementRef }]
1890
- }], rowFooter: [{
1891
- type: ViewChild,
1892
- args: [MatFooterRow, { read: ElementRef }]
1893
- }], userMenu: [{
1894
- type: ViewChild,
1895
- args: ['userMenu']
1896
- }], ctrlBusqueda: [{
1897
- type: Input
1898
- }], leyenda: [{
1899
- type: Input
1900
- }], idTabla: [{
1901
- type: Input,
1902
- args: [{ required: true }]
1903
- }], columnasTabla: [{
1904
- type: Input
1905
- }], botonesMenu: [{
1906
- type: Input
1907
- }], condicionesClaseFila: [{
1908
- type: Input
1909
- }], rowTooltip: [{
1910
- type: Input
1911
- }], soloIconos: [{
1912
- type: Input
1913
- }] } });
1914
-
1915
- class LucesNavidadComponent {
1916
- enProduccion = true;
1917
- forzarMuestra = false;
1918
- mesActual = new Date().getMonth() + 1;
1919
- constructor() {
1920
- }
1921
- ngOnInit() {
1922
- }
1923
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LucesNavidadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1924
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: LucesNavidadComponent, isStandalone: true, selector: "jvs-luces-navidad, [jvsLucesNavidad]", inputs: { enProduccion: "enProduccion", forzarMuestra: "forzarMuestra" }, ngImport: i0, template: "<ng-container *ngIf=\"forzarMuestra || (mesActual == 12 && enProduccion)\">\n <ul class=\"lightrope\">\n <li *ngFor=\"let e of [].constructor(100); let i = index\"></li>\n </ul>\n <div class=\"christmas-tree\"></div>\n</ng-container>\n", styles: [".lightrope{left:0;text-align:center;white-space:nowrap;overflow:hidden;position:absolute;z-index:1000;margin:-8px 0 0;padding:0;pointer-events:none;width:100%}.lightrope li{position:relative;animation-fill-mode:both;animation-iteration-count:infinite;list-style:none;padding:0;width:6px;height:14px;border-radius:50%;margin:10px;display:inline-block;background:#00f7a5;box-shadow:0 2.3333333333px 12px 1px #00f7a5;animation-name:flash-1;animation-duration:2s}.lightrope li:nth-child(odd){background:#0ff;box-shadow:0 2.3333333333px 12px 1px #00ffff80;animation-name:flash-2;animation-duration:.4s}.lightrope li:nth-child(4n+2){background:#f70094;box-shadow:0 2.3333333333px 12px 1px #f70094;animation-name:flash-3;animation-duration:1.1s}.lightrope li:nth-child(odd){animation-duration:1.8s}.lightrope li:nth-child(3n+1){animation-duration:1.4s}.lightrope li:before{content:\"\";position:absolute;background:#222;width:4px;height:4.6666666667px;border-radius:3px;top:-2.3333333333px;left:1px}.lightrope li:after{content:\"\";top:-7px;left:3px;position:absolute;width:32px;height:9.3333333333px;border-bottom:solid #222 2px;border-radius:50%}.lightrope li:last-child:after{content:none}.lightrope li:first-child{margin-left:-20px}@keyframes flash-1{0%,to{background:#00f7a5;box-shadow:0 2.3333333333px 12px 1px #00f7a5}50%{background:#00f7a566;box-shadow:0 2.3333333333px 12px 1px #00f7a533}}@keyframes flash-2{0%,to{background:#0ff;box-shadow:0 2.3333333333px 12px 1px #0ff}50%{background:#0ff6;box-shadow:0 2.3333333333px 12px 1px #0ff3}}@keyframes flash-3{0%,to{background:#f70094;box-shadow:0 2.3333333333px 12px 1px #f70094}50%{background:#f7009466;box-shadow:0 2.3333333333px 12px 1px #f7009433}}.christmas-tree{position:fixed;bottom:20px;left:20px;width:80px;height:120px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAFCCAMAAACD2mKmAAADAFBMVEUAAADv7+ro6OHV18vf4NfS08bBxLS3uqkWJQirr5sRGQGan4lpcFGOknd1fGCytJ6Fim2Ok3xGTzNrcVd7gFyoq5TPz78MFQBaYUVcZkFTXjcXKQI7RClMVywxPBwnMg5MVDicoIYcLQUxPxQ1PiJDTiYeNAMlLRMbJAkeJg3GxbESGwQqPQsqPg8zQBkkNwYqMhhrYyYYIAZ9hGshMQpob0tCSR0qLAYoOAY/Shmenn8+Th9cYDO5o0weIgRQVCYvMQo8OxI0RQpMThs9PBBtTCE4SRCAf0l9fVNwcENaXy5MKgnDtHFZWiC4qGeWkmvv5bxUVyRpZS/dvVni2KZvcDrazZypp3mIg03EvZrKwpaEiWBpZya3rnyEejqZk1ullEiIgTh2cCmanHV7dDPi3Lm1qW9TJBSaijNiQCju6tS1tY0DDgAJEQAMFQAIFQANGgEgOAIYKAETLQIRFwAWJAEWMQIOLAIbLAESHAETIQEEEgEeLQEaMgIQJgEKKAIOIAEJHgAaNgIZHwIWGwAgMgEeJwUlPAIqQAQkNAMIGQAlJQEvRAUPMgI1RhAuQA8fIQE9SxQlPAwlLAQrKQIpOAO9AgEsMAk6SglJUxcvOQk2QApPWx8bNw8JJAFAPw+cAgBEUQ86OAuwAgEnNBAiLQ9QWBMwNxNQTBRsBQFDUx9FSRIjPheTAgCmAwFZUhkZLwuBBQF3AwBXXRVWXihhZSdCRx2LAwH+8sY4QBt0cSZaXh9gZBlqbSk3TB4uRRs0LwZiWRoECABgBABNUSiZhy2AciJsXxtpahtLQhJ8dy6EeiuNgi53aB5QCwKNeySShTr/6aiijjBydDeqlDT/7rd6IwxhFwaomEWEfjiaj0KzmjVbPxxgKw92ZS+UHw1kazf/5Je/ojltOBS9toiTbDS0QCPMrUVbXTmHUCV/PRutJxU9GAKWkGFycUmYPR7w3qanm2G2YTLu0ozQvX6gWCrexoemcTm5gkOPhVSpgzxzfBXJVkDTlF/OcVTgoXgbQFpNAAAAbHRSTlMABwsXER4mL/049kWDX2lBblCldH1NKvqGlqD1rbHC3JRX7tO4t/bR5do57+Xay+zI/utb4pDL9fTUZ8Cs/PXF7N/z6O3+5v6VqcD+/uj8gv7Y1f7+v/7+uVr+/ueLzarR3/H75LW/4OrUWs77BYx4AABzOUlEQVR42tRdaVhTZxY2CQRCQtghLGEnbAlBAQsFtcWKa+02bWfaznTaZzqrWe5NbkhCEkIgy3WymDApSQggiqCAArKorHXqgkBHCtR1LK22drTtOHXqdJk/cy76zDPP/BfI0TyoP/S+nO9855z3vOe65nEbiUQhrfF98/OjRvtHU9b4ulH86SGhAcFU8hofNzotNiKBkRzmT/Lt40WiJSTnJaXGhTIDfNsnfvT8LCxen5ERGuLbQNbQ83OVmJyTxg7z7aNFKUiIASAqblwkdY0vG4WZHqiVA5BSRsAaXzZ/Vn6qHEVV+hKWb6cSKiMT1ctRvYoX6ttAyBFpBpVcpcd5sT4NhOTPerrTo7J7nFyGTwNZk7P96bEzHQMDOD85wJfvX7+QN5+dnm0fnB/ih4f5sEtI/sE/nTl9fXJm1lteEuy/xnct+uc73uoa7ro4660oKfDhGoWck7K92GP3To65B8vofmt813LK0opVVm//vPeN7T5dNfoxMgOtjrHR4am3tkWv8WGDxJ6qs58bvjj3xjZfjnVSWFja4KirfXJm+NnnaD58tEj0hCxO+3Bnp7f/2bgCIiH6aFL0AyCIyzrR1O3gl9LJVD9/ms+xEGQ/YLNI1PDcBrNtvKnJoWPTaSkhEQxGAMWnoPj7F4TQC2jM5Oxqs93W7bCUr2cxY9m8tFJmsA+1iiQS/cmijMhEYILWyY0mncNiliUyY/kcHYfHZdB95v4i+dOZbC4Yv7BwHSaz6MA4vIw0jkyGyPhpob6T4v1T2NximcVi4cjiNRZLJZiOl8bRWXQyBGH7Dg3hl/NkbIWusrq6urJSIlNzKiurKy0cBLEgiE6NrA/2mWgn+Ucl8ABIMyCxVOoIl1iIU4XoAAkvjuk7R4tMDSvlSCoBBxjggB8WmQUxchAdv5TpM7EOLgkITeRxZBbCFwBGJgM8EB3FvArztrAAH+oUSf5hEWweRwcI4HxVyiDGqyXxHO4bk61/eP4dnwkRiHZqQAE7kcuXySRLHnE4GtUmmZrfOjm29YfXonzDJSQKNYAZnpBXUW7UqXVqtUwiUVttNrPZZTS2Xhy228YT6D7hE3JYQmIaj2N2uUwIghjhwpWoHRMOm9U14u6/frVTp+YV+MS1FRCaAT4wmVv7XSaj2WQ0IQ5HU28vYm63u87dnAd0XJZP8NlUJqRwo9E+ebHd5TK7Wtdz1epeuLXURvPozJVBs7mCHewLQUKmMUuKTSZT6+j0xX//e7L92e3xkkoZEfISo93dbi1fX8b094n2ihIat6O8wlz+xtTwwkL/yBP5WlStlsA1DOcNx+KTwn0jQoirlx5ZtmNHLHvTs/NrOwx1Ukyp5pTLqpvhdOnRwPwwn7iyHhG+NHoIlcpMPBUoratT1NbK+TuQymqJGlFj65J9qkKBHzCYTs4KkkoBSq2ysaehXg849HhhQoHPDdypTFZiVp1CKJU2bLm8c2ejHkHw+DRGMDXaF5CQyI++UgvCmOkJmblCofC9LUfev3zaKVepVMVpZazIAupqD3cyNaQghLIEIyIiOTt3XUyQUCA4cPfIkcvnG8RKTCXjl5aU8DJYq/zi8gsrYGewmeATKp2VHRQjEAiqBHta7h4/cuT80wKBSOnkFHPM5eVcXviqTu0kSIUVnOJSul/OO9szg4RVe8AEf73Ud/zIlvrcoD0ipcmoazKZzeYnkumrOrdT4/jQynIS6O989sNQkFRQVSVSbFk80XfpdL0iSCRSViJGnQ5xmMzFhcm0VRzw5OAMPjwowi379e4fzmx+5oJB23Hn6IkTl3pQTU2NVowZAYjFokN0eBKDuoqBkMJK+TIAYuJven33rmtvr7WeebD/6Im7hyWVzc3NGlSm1ukAiMVo9OQxVzMjRKKxSnUy4jvOfXZ+w83fDn58+9j+o3daJNWVD2kImW7JjCZ+ImtV1ylkWhyXr5bJdLaRDVe+uPnjlwePLX7skEmaKyUSiQwqRwmU90Sc8JKpfqv4aAF3wmSt58okMu/Vs7Mbvn/34LF7IzLAQJB0OkSNgMGdZUQ4vIRk5mq+t0hkenJpMbBwJvfMle/ffffg53Yo3wGHBEAYTUb4mKxWk8nYmxofHhawapOiH50Vt55jMsHjDly5/+67t6ccgIOID4nR9NDMLqvJCJyETJcXF7laJR0UGjO2EIIA+nTz1fsH372/FlFLqsHAIXozdL2AwuXubzUjCDiNUxEXujrTO4nKSuToKi06CIOZ28cO3vcissqH15VGI29sbW11u93t/a2tLqMJ0JrKK8pW5+HyT9nOlxHPrdNNf7n/y8+tRpkM3EHwpSiKGTyu9v7RUfi0mokjBmgrYkNzViUSetxDIJa1i0fvTeHqh3SpBBg6VKno+MTb2g5AwDHEKVuyim201QiEGlxWoSNYd/di34OeGKUc6FIgHGSIGnDMf7N79xDiaiWYLogVMLPRVLEjZTV2vRQqIy1Bx9c9c/f4gwsKFDciaogRCaLXK8WCtn999roMyiwH5HXAAUcLMVk3PZmzGvM7iUanx6WVJt09cudArlKPo3A3QTaXy+Xiqj2n/lZ7BoAAFCLOzUSIGM2btoWsWY1G8vOPYjJefP9Oxx6xQow54ZaVoyqVQkH0JQIxBsQ8IIEsQwAxmitK41bnrbWUEcO2Xb57QADPrQRP6PUqg0EpeNhfCTG9XF6NqmVGp8nTvrOlvGJ7XAGNvCpzIokaxvjNrWeCAEiVWCGUY5hSqRA+AiKtxVC5UoMZUFW9c8tfDo+8/auXY5MLyKuxeCT5Ubfd2BKz1OKKpGLMgCkUYiAfCBwCqVhpQGvFUgUQdqePHBk9d+70mRd3JDPoAQQRvMqoLv+c393aR/AmVbWC2oY/ef5YKxaL4HeARCgQ1oJ/REJguf5098it9nNzG65c3ZidncmiU0hUGnk1hQtcwDd2ZAZJiYduOHXgvQMHahWKOqEUgFRVCYVicI9QIBVKzx8/crrr3Ozs9AGDIiaBSQsIY9Hpq6RjpARQKGvIa8r+mp67MUYqEJ754ZueAy0Nf6xVKGvraoR7BHuAp6sTSQFH3YVLRy719w+7p+Y+6EKxpITk5IR0Vih1VVxh/hRmREEAnbmTHZ6YV5u9rt7w2bc/eN2GA4b6erlBo9hTJaiCMwVI6urq7xw/ct4zPD8/MtlvwOLXFSYlBq1LTGCkrAY6ghrBTM9MSMjfmZgc90xqeGrgU1+/snvwVIenAXfKcLVEJBLBeYNTphDuu3P8+N2u8sFnB9yj/Va+PjU1HijIwPyIEP8VT/NkalRYeJZwXdbGjflpeZtfSOM+sfHvf9811ONpdKoI1Ya6WSuuE9eKCGb+fN/x4+fXv7ypZLMV2DwnruegGKqMj+dFrnwpTAkJTQwMVCrE8aih/JnizSXFHS1DQ4OnujyN+JKKBrFIsA6sQ7GvVtqz2Hf8TlFyBCNjE7ec6+TgeqdKjqF8NpO28j08yT8ljheIoZDLVZ6u9kZrqsHQENjR0dJiBhwIwdnJcGfnKdxQf/heX9/dw+EFdFZmOq/YiTv1etiSkas4XMYqoB79QyIzuHxI5FCW4C09bgeqFIsbDnV02Bv1BM9l1JlMNlvngLdtLeC49IE4K7kgOzsoCFWByQnj55WF0lceCNmfFhnL0RPPpJr32q02lbK+ocFw6FCXzUg4RGdErF5r59jZ0Qcn+vouGkSizNwspQIDHxKrPnqVnlfGCFkVk15/ZhGPy4eHcu/eNeK24fVYfcOpIXeb1YQQxbsMsY5/Mja8cP/EiRPftYj37ImJ0SoxdAmHXq7i8zOKwlZHkUKJiozblIbjKufASH+72+7yNHraWgY9brcRmhKdY0JmGR+bu38UcJyuhUQvEiuWgMDR0jt5iUXM1eEP4gIGn7Azkvi4s7GlsbGx3dXV1dUzONU12GpHgLjWQYBM3z569Oh3g9q9CqlAJIZ4AhAQ5Tg3IyJgNa27U2lhsclpfFW9B3d6Drta+3tGR64Onp3sd+llRpt9fPb2/qNHvx/rtjVCjIgUWozoV/BiTl4sbZVV8mRqRBqbj2GYB1MeaGhsWNvfP7IwPD3Z3tWISOw/frl///7vh7u7HQ6VuEokEitRvbO4vKIkNnjF8+D/mT89ojTeYFDUSYUi6DnqD3gOD46MDV/b+vpA++iPx44BjrHuCZvNIxZBWS8OAj3d5k1lscErX5n8P5DQDJ4cBBsCAZSIIqjl6xrt9sFXnv909zwQqMeOffn9YHc34HDWi6r2VInE8fyKF7ZviwzJ+f3vVz6n/6/RIkqf2igFAHvAAAsEAm599R//3LDh+u2DBwHHQNMEyM+cHlQMQSLWYr3dnS+++PKvX/no5MmcNavIyP6wzKqUPurRIQz2CA22ra9uvQrznoMH7/843uTottkdauBPlQqtUovikOzH3t79z39+evLXNL9Vs1hCDgstSzLUAo4l9kcALa7SYLPP/3gf5iQHv5/WWWCHBEEwHAoTwILJ9W22zsHhmdkN3/7j+ThoEf1Xwx1MPAI16oUKvFkrElYtBQkwWYYJ+wc/3n733Xe//H6kGnBMOBwGrVYpR6EqwZ241Ts4ODx1bddPXnkhNzE/PHmlF0dJUFxQKH5r/H/+6tZOVCuWSsEb0JwbDPWN0+AOGPj8aANS3tLU1CSDalKsVbpay61usLGpmZmZs2eHDytjYjIZK9tZAYgAun90FD2a+s6ub7yIElVCCEiVwkBpV8/cbQLH/Q8qm6sBh0Pn0GjFe0VCQz138+jk8PDw1Mzc9YWz5wZP4ZiyMDZlRUVDftGkHEZoVDA7Mvjn33w9by+Wy7VYvVN1yGP44P6XBwl32Je2FposCF5jEIuEBA/5xObB6bmFhbmF69e/eGnhTBuqDIzPXNkBFinsyZAidlkou+SFyBe+2fpWmkevVqlVkoaui7fhsgJ3EHMrgodHJAYxGCSRP+/ZU3f4/PUvvrj5xUtfzM5MDZzSx6uS4iJWsEck+VMCGCXr03jlJdzUkorNvDc2cW3WSr1af/7BsWMHD96+6HIiFgsxeXfIlVqxeO9ekYgAIjCcOT274aUrG17a8JbbyuVwStPicvxXDAiJHB0cydjB4eiKZToLH4QAxZ3lDgficJ27tx+A3O9RNSAwVlQjMnNDDSYmTChaup2Fioah+a2//Omv33y5opS7CTqriBXcEidFh6QUpXH4MDAAg+98U1N3N8dmPf1gcf/+Y7c/qDfs0+sleosc18jrAcRDj1QJAIdQWnfomc0vPxf1s8i4MnZcRlwYoVhbMQMoKdsrIAqqCSPQABTbB/eOAo4HLWKp2GBAMXmlXK7RKsUPTSQiYBClmHTdRnYRPYAZGhuZnFHESglZuUvLL+TJIkLpILNUVzcTSIgVJNudxaNH99/rUQJ/rQDKVIlqMKX2v0DAJQQOgiAOCg+DHcuiOG5EEic2I5ZGXbFEQqJEh0TwSjmWSgACDiF+Xrh74sTRxTue5poahbROARyDBtNqtRpUqdHWgGpLK1YYFLVAAUulQetYdCaTzYsPl/Of4BYxnlzBW4uaE1IQy4uHGHl0tED4d+LEvQtNOlRZB1OeOiWq1TY3a7UStUSjqa6BX6HyQ0+1vLcPhM356QmMiPQMQ6AG08RzOZEB0StYblFCInmpsIEEc2kAg97q6+tb3OJpqqzWovUHWur1Sox4fFDWECqhalBuSSS9bZ0jp9d2bEx9KpbJyCuMV4prtArlxkJ2ZMEKuoSSksIuLSlFHBbA0nDr+PG+uxckDoesUgLUVleXXi15JDqTyGRqpFKthi+OzrGpt6+++vzJ57el58VrtCIwbWBaeOgK8vGk6OhQZmx4Bo/PRzjvXTp+/NKWjl6HVuNU6539k102W+8jIM3gEhnobYCxQxxW9+T1l05++OlHr8VLNDUiKPxFQQY2VI0r2L6TIbeHhTFKM/gVO48cOX6rRdWosWGomtBmdbndVgccOzhVsKoAWdFms4NoCzG1Dg6f3U0A+awXgBCdb402NYMVtsJTK1i2p0eGZwKOSzcMHWIDqpcjRlf74NTF6XYrItOpCSSVEoet0u5uBMUWWPvo3IbnP/ro+U/0qEJEJMm91WmlRSv/lg6SH5Pxm/eP3HhPKdaKQb2IgOCkf2Ts3Gh/uwtcoNOpIUhsVgcwwGZ3a3s/aIQWZq7t2j1g1UkgRPbW7I1P5TFCKKQV5k0p9ND037z//o26vVoNmA6OlRtkWYPTX8yNwnffbNLJ9GpHk73T5h23t4JAyD18dm529uzZqf4uE1YDpsEK2REp1JDoleTqyLC7Hvu79y/vlMIJ0UJoS4xmYsNqfv7qdP/kvy+2j7a22jVNTdbOcTCb3T7snhmdnJq9Ov12v7tRhWoAiCqQF8uiBwcHU2kBK3Z1gdyB+fRfLn8lFIi1GlBnIUYw9+jFmbGxEegA54A0darabO7OifHu7gm1vb91pH/67d++9davfvFCuVGlEdeI0cbC0ljI8eFxDBaDvjJvtyBRaKWbnn7vvac2CgUKpVwH8QAXrLl1+uLo6PD0lSsbhmfGvG1KbXWlY2Kiu8nRBBFkK3/2Fz9987ntb+7gq7CavTU1jZy88IREHj81LakwLjZqRS5hCjM5j4PgxTgmrFXAuMMIZjK6Rlonr89dvHZlw4bh/jOGQLEGVTusE929hHoWcL7xi12hUaHruVol1F97DTtTU5NSJYEaFIvnF4bTV+JwgYqcx1HDoFC/rk4RqFARIibiYx68Oj09c31hbnjKEwgiDjHWaLUBgV3d3EyomT/55tvtjIKIzCzt3r3N2p1fSVCVHNWAGVSFbFbKSmgHAuK4OmK8xlHmhgfVF1fozSbCrN6RQffszDV315ACdA+wfmGzmWAoJ2kmqmTH1l2v/GQHg5UQVLN3b03DZVQi1xAFMgrlfiCvKCx6+aMEVpB4MgCCcAoTwtelrU/FcbPTbHY6GxudQ2fmz3R0KIDiIhQcKrnN1Wq3Qdsi0bXO7/osKTs/Swv3nEh54yslNC1yucGgAn2XgfN05Ar0in4hDD6xEYLwE1gR6dnJ8bge5jw4Xo8qsI62QwYgTqRLDJBIaWjE+902m4SQnRq9P8QHxSi1MXurBBeOG2AGV6+vR6GbxLBUdjB9eedwfhRyNJVMYzXwdTCB5uQlF4WXMlJRFcHt1ioVYLXQ64oJjxBAREpVvds66NXJ4IIGAhuPB1IFkvqB4ztrDZiqPh5mwihqSOVvKlrW1VESxZ/5s58xfkbPK00jjlbxE3nrSzPKHHIwUM6JFQqpSFAlFYn3ih9OGgTgE7fdO9QqMeoRo14hFiuFIoGo/tJxlab2j5zipNT4wqTUpxLZEbTldUjIk5EZ29/cVPZUbDoXhA3xhR0Vm9PKHXo9qoIjLxYRVBwxXQCdkxSAEOrAugYPTKz1uKsDNKhKAThKgG7p2ykVa/fVYqmZieERyeGMqIJlrYH9aMGx5VzrcLmVU1iRqtPpre6hoXGrA4b/KsIhWoVCCECWBtEKwAEmAG0Q1nJoqA3CSIyhCjH8sfR836VaoLxFiqCgTFjipQeE0cjLerCoUbHcCrUF0dksJhBpyOQNXSPezgkc0gEqx4igJbxSBRM2LXwVEr4hZI2KQ4EQ2bUqTAhAwSHn+/paCGdVVQmyElgFUfDGquXVnZL8c57bYSPorCadzuGw6JxW94DXql/CgT7EAVEgAhzwS5grVi0pz+oUwNABW1+LSQVgwtOLJ24JHw7qpHVBWayQ6GUNj0ce4fMtIOKHqQcssiFdI5NjY3YVZANUryfQqORAZhH6BkwLSIS1MMoSiaSgOhUpFJgUwka6hOPSgUcTR2FMJju8KGXZmS0ylc7gEesIDjAikVgnh/s9uArHwSugaAAwGGEoCiwQSGx6WhpqRULRXsJJMLyWAhDp+cUTJ04Lc4VLVHCQtDYz2N9v+ZUclCiQ0bih2LU6EEslx9o+Ojwy6naqAAhIMwCNXAUGi24E6eBwrz18vh4Dd0BXC+EP5JxQ8cHi0RN3NubmxsTEAIyg7PyEyBRodpe7taIERMRu4zUWc6xIIZfrAC1N/7mpkUYzDiD0YDiOGBEZtOsEEWSzj86tXTvUBiGyhAMoyNo7oOi41xKTnZCdmZ0dk5m1MTyCGQxtVY7/8pLyJD8/WhizKC59U15a+vrX5wfhpRvD0KIb8SWDWh72jyplSwZqreFzC2cH23AoDYH+rVPU/fHO/v1HF88rxEHMuITE0IT0dAaswQUzo5iR/ss97yGRSSCQhRSWnZ/09eudZlg8gnUdk8lpchJNIkgydRKisIK0bx49e/Pm7PCA1dGr0YjFtXX1D0DRsXiuVqwQ5dGY4UxmeHgEI5IZFxlaWsRYTnEKeQ01IKyADv9+fmLWutwsrE1vXVo4go+RMJ0MuFH4CZWxCRiVc7v/8emuKa/VOm7TQPB33COkKZ83KMRgTBqLUcBKSIxgZ2RwSzn5+WG0ZcrtJGoAoGAmpifw0jipgbliJaH0cZqXGiowwhkygiWFit1hdbUPj07uOvnRRydfa3d57RLg7Vvu7gcgnx8w7NtXb1BsjAhnJeQHpZemlXD1xei6vOSoZQp42NPLT0zPzgyM54BKFNIfoWNQOQFEebnLXA4uAcL34eCn1+FqPwfH6vmPPvz0w5N/t0JrpVZ7bvQBkO9ONxy+MLT21FBHRX5S4TpxKp+PQ92MYVmsiOURnJJpKcwEeJcDoY0F/TGRyIkC3GlyuUrKStcTW8fgDEACRKnG4BmbvvnSS//46NNPgSAl6CBEr3vv0v5j330wdOH02uErQzDTfUol1sohAy39XYqY7OUi5f1C4pIIjSgkPqfViS8lQFSFc9jsyNBgNq94af2QwAG5sOZQx8C1l17658mPPvzw5Gf2cSv468CNS4vfrW3r7Bqcmxu+tjB/BsbTer0JV4F3UXFQ4jKtugOO0PzUQAwDRzTaW+0OInOobFxuSXBIQEpkRh44BCgGIn1Y/6aF7YSOntmzX3x78uTJ5wfMZrurceeBG4ADbZoYHzk7c2XDtalrg0ONuJ7wCFHh5Ccv1+3rDxU8f0l47HR1uVx2q9Xp9H62IzI4BOjsnNg8YKyX9ijt87u3Vgn+vKfO0NFz9erVv2/12s3tXTsvXLp06fO1isDepvGBsYWb12Zubh3wgF8BCagc0ezEZetHSBQY7ZRywA16vGu03w229cMPf5JDJpGJ4t76cNNYjbR+8+1rf/vzn/8MWwodQ4NnOlB94/lbtwDG4o+noT3sberunJpbuLowM+hthXMFfoXCOT49gr5mmYzkH1IQmpGXlobzN4ONvPjGi2++8+k7S+vTkTu4HASQyHQS0/zuf31GANkDSPbVdxgUhx/ACweOLX75fU8VSDPRXkfnJ1OwnnTt6pjJqFIRLYCck5a8jMpysh+1IJRdBB16HDu26OVf/PzJnN9H/54AksJYn2Ei0ogR0SMNp1479BCHVArVouJjkAqB3f7+cJUIPAJB4p1aWJi9dmW+1YzLwcEoaLLDl/d106SAEBozmB5GC4iO+llIDsXvUfRERa43Q1ZEgBTVgeDvb4KqOmhjhUJFXe2F70AQSGiernQQWlkMVTmsk3M3r111t49BgaZf4lDQPNYyyzjIlDWUh/+dE/nhFzDCI2UVyNKyOmK0SgQ1Q0NCT80+JUjNanseHDu4n8AxC1IOEBFgept9YGx4aq29faTd5fSoiP4FTVrR175A8ejnT4FZIolMT8MRhHAI1FqnJFr7tKql+oCh2aD6+K9HTxw5CJLAj+UYGBwih909dXXM2253282N+FY7pMKg/IQIajTpERQS8Rc/Zlgkkt//OodO1N8hOcG0sLgaCXBcECVWs0XjRaovjnapXRja07bzq798dXn/7dkeJYoBX603eaz97tExr9XkdCImp2vrt69iitwEVtEfXnnHP5pMpRbQA2i0sIDHDIRK+Z9hDC2aHh7O3MQO3RSRpkUrLToLYu5ETJ2I5LSxfxjvsmlOSzT7tPu+6tsye8gAeg5MhaptjZCA3A4bosb1ao/TdW3X3xRB67LTX3z161ef2xbBSk5nscLzkwMeKy1PoQQEF7Boa8gPnRPA2J6fmJaU9vTmp9o0GrUOkKiN3k8G3W5Ju22t1epwqz31NWLFexc8mo4GVFsP0SDx1DudHhNu0QMPTCwneb/5RBSUlZU9PvDJJy+UbN7ES8rKzM0Mf6wvGKLkpBSwkrOTaTQK0SeGMGPTNooDazsCOybaDJgculugtIEjGp4529r59/G2cYdNqzEopBgK0w9Jg7ajEat2GnAdrpfp9CCMIIAgdsMpQZAwN7C3G+rKgYG2tmK4EgITWcGPcXOfQmEmJmUFZYUzGXC+qCGszLqNikDDobbeU20GiQGVWRCZ1epuh7Z3ftdPXm+bmGjD0SqYrzWLRTVt9kNDHtzoAVYCVyOIXi1Tg1P0em0NDBgIRRTKGfeeGRqy4+C3wKT00MfX9oL4j5GehSlFuXlxEVQyNSc44QmpofdUxxm1bcgmU+kluM417h0cG7u4sOEfn34tCmzqPdSgEu+tEQGNbWtyWO02Gy6RqxEnLpPBR0L4RIUCn6cFEgxc0jnUaW9TYVBdx7OjHqOClkKP48rh8qkvfob9XEpUMCPpUD2Gq61n3NZ2HJHUV0pAIQCX68jZhel/7fqawNGmqqkR1RAW2DYxbpuwuxA9rtYRHiHcoVejhCqNmPUQabLTO2B16qE34MXGhUY/vmj3o6cAEqyxpafljRe3PxdZlFyotttk1tFJk6sRhh9w6mWmJrPdO7NwttM9Udnb1lajleyFERuM2SAIJjrh3KgkYFDoWyQyMJ0cE1WJieyCT9i9A8C9wkZpKp8XGxbwGJteUlgklL6ehsNrh6em33j55bL1NtwKIw/HqNlt0llMRthyA4/Mfvf5xQOnG9uaO2ocnppHHgnU9HZ39/b2yiQQINBdLtFeMthVhHGJUgU0pcNm7ey02+3lxcW8MnboY/3/+ijRoez13DNjPWNTZ6fGBp7llgD7Y4MH0lmAPHUggEPm+Pjze7e3fNVz+j15tQfVqHCQAIIIsNfR3dRN7JAYZYRVWsAlEO0IIkEx2PDhl9tdVqv9GWv55ry8MnZRWMjjnVP7BTDYr0G/t2tuZmrQXs4pHvJ2PtSZNgGhrbOZZY4tdxfv3dh5687lFg+KAhKtUlNdC5KnoXGwbodNR5AsEB0AwwLOcTrlGqUiNzVtc3mFvbx8fUlZbCgziv7YJwyUlG0nCVLk27OTXrvT4zFB3iCANAMSB7z1vuXOpb7FI5cXF2/1AA4DjmpQZ6/DZvC2e8cGvBP/oe06AJpMz3AFgbC37A0CDhRkiAtwb0/PVW+2190SQkI0iUkMBiIBTQiBBpJASpqQHLENV8YZltBjjxPHueWso6dX9bR6tva6nu9H7bwOaz/Qa+9sLw/fer/nfd7nlTXhMbyXRZyRkG+ELJiPgl1w9y4REZnzlkfEzInJ9Fvr98Y3v/k9RwdU+/8fwOAnhOIK/J87uu786BcnP9re36WokiLayC85Ar0sgBwBEvnlT9/DgETz9qSULUHAXsfmCKRVMu2lDmgItB17ZRwOWBZ8dBy3wMLRyEr4xUijsGlGLm02LWLu3PT1r+28/9GxtYELvB2dX771gMMC7wXOCyLhJRAY9P1Xjm1/9Ux7AzLRlvHOioNHWCTpAxyyVdADEiCf3rQyodBgS+p4Ek6VRttxIXn0TP+11nGBEGHjAaEI5LyEKylD0KIpwUXC5DQV02AMwaPVHu2+dXfj4/vHMuNDfWJ9Il+2eYrjDO/Y+PDY2Pkovk+NWf2NiTNnBmpkspbWQcWhIwcPl0BSLpMPf/ozDOC4PakhIl8RWyhEkkTXlnyxq2XpaP+ZLosWBzGbXSgqhfpXUqCUMPiWenk+nroVciM4VBETl+LVNU8e379rmOcye3a8m7v3y50SO//gWBcXl+gQGogHprpmYumZsU6ZvK11oL1EVlEPvje/AtNBAfn0thXXRCmBwWTWFSs6kk+3t01MtJ5HcsHExsNXLGZgSIx0I63AYGvVyioq5McbZUasRE7F8caW0w92vdYoUzJEopC4l+wEjjxuaASPJ+JRlfQcQ2Pr0kuXBmqq0f6seUjbKjtUf1iz6uy77wIHpsN0YJ+QhZtaxGLxVXpdb0evbWSyvWWir9VAI/JYUPLiIht0Q0ZjgUHV0qq9+s7VlrZuOZNTLK0gMfDVlkaZgeTvaCFBUS/xXQLCNyowKZU87sgAFIOtZaS/v3MIhVKXTo12Njc36K6/iwHF7O3LewuF+4QcklXggJbHyWa2JCeP1HSctvUpucABJLQ9d+/fMxoNJq7B1NfyGgi8e30KzIusu7Gx5erp06dbNRKQgMzocF9/iGxearSYJA0BBAIFs8Lhy1HtNVRzuuXi+Uv9l86MrwIOAuTTVXpC0bGECEFgP4dzlsmR6q291l6zuctkVAEFhWTXyZO7IFfpo9lsfbbtH5386Ib8uGHhcqDAAJAWrQbpu3lJ4cEv19XCAQ2QglJJchAJKWxNjGKpWi7XKhDp9p/ov33lA4Lj7O1h5l6SOaSyI2Twcf6qdFZVr86iNqto9CkYDMP2X/zi/mvG430GG77JxbTdIDfQ5m39+po1mI6rp1vaqornzZmT5uH6cmP5aXgYBi2eO48wvVJCM5KxcOGchRy1ydQ3fPncBwTI9VUqjlAIGPiCKLAYXCiqLvhStW5Yp9TzJJK8Z8N278EvjhuP2loAxNRHgOxstNkM4XG7d7+55hstLZs2Zc5dnBkU7Oft8NJveEdPV7egoKDgxYtjZs5ZuLBq3syZ0S4MlE+WXzn3AcbZVT0wCGNjPogWHo8makqwGrkSprCnSgT94jMYdEIKGY1GG6bE1mJrfAcxz47M9XPmeyywd/dbv2qFn5ebr6uzp5Pdy5eZk4ftNMhZnVydFwSGzYGOMtoFuhgoSsqufEDG9ctFDBTh8vBqwqCSJAfzq/IFHB5bgm9mIY2Wh6whFB0k2Q7hAM149Gjb0cbGxu6+zDe+6enn5+fjscDbIdAn58r64MhgL8f/Zzu1aVPe115BEctc6MABmV8lhePc9R46+XTlJO4Q1rGQJMHjpGTvIbjQgTxhlnN4PAMtT2XE/VEOxEhT02zdRw3dx7tt3d2rFy1yd3Z1cnUNBCeTWHYuIyXex8/N3fkr/8cBFtvZyyc8NYA4TEGzUHblww8+/PDcZTFglDKKxFwxaBIBi+DYR7g6bBO+hAkwNpqxjysZlhQxlBJ6ERcCCN5xGx6MUAPXHl/ktcgJdL53ZGB8vMuGc2URqdlhYeBq/o8BMNrvRIbHzw6YnWu0qcqKNoB8+/DDDT1csl7E+ICAwuEQr2IW6xBRMwOJoIrPLGfSbG1tLXn63oJybhn+FJydaDzD0aMGfBmN7mFRDtPh6uoTnkAvOneuvKwyOzs2yNn1//JoR/RrR65GT/fghID9BbZXju0aHr7+4Z07dzZUEqEZJDNFkPlAlsWhMlYsSATBBGsOHlZXsZRKtqntwuSaXRtNyjwlvUdCz5PQGUa8F/FmpNHCg6M8nZ3cQrOX9ZRv+GBDWWVZRllMZJD/y2dNQcg5zJjhbAfixDcyPgVn1ZpjJ489sF6/cqenskwCqUxeHnHQohcACFuIMiQpcQ2q33uouhoGIyyexGRqMy8lKbhbdK5OKYZiSMKgiWpptCao7Iw+7m4LgrIisst0ODsApBJzssxrhuNLL7vCK8TebZYbaNmg0HCXAAhgb32Es3/cOlipk+gqi+h0kkDArikCEh4qxAQcwSFBiQzFL4jDio1YV8a+8RvHTp786BUuVw/Zk6mgCOEujcYQFXALUn3CvWLXr8zW6XXD5z7YUEmALItw83jpLWzt7Jy9Ar3SfOBr5h6XUpBLk5jaXjl58v6p5AGlxaRSFXGx91FbiN8wJzy2qFBYJyw+fEReU9EMxl3QZKQZr46ceHSMSribflCg00voJhQGMAgOOj06Ps4ne2WGTqczX//gnL6yDItr2fxY95euOLX39I9KSo9I9XFy90IzjiKlyXbvxrGPtp8Za9dqbTqTuEBMieLIFxmkJoQlPCjbp5B11DRA7svBnFjHzxMgH70Dzyq41RBZI52BIgekglySIjKU+kqd3oIJudJTieXq4pIY6v+SYRDKwStpSbTYJd4n0ic2ETIxW0vyxMaHS0+NdeEhbjPq9HD6zH0+9oNaFB4AjShrqmntblBUaLgSo81iNe8iYo57teBYYaHyg1wadRNhc3GjE5YpeyotKt31DwAES6u8wCUIRMpLnhGEWv5uc1EhyU2AkMZlGa6Q8srhwYGxMVBCjSAH21QScQFVF43fyGfL46EsBMyJvKJDPiSTI0ru62sfGNS9tv2Vd2praVxYN+bx6Pjz+MaCFBe5lJcp1XoLgrZzG3rKKsUFBSmxkS89RYJD1ytscYiIS18212d+eoRqxa17T85fu3T+1EhXa2O3tqZNBRjPx36EIRIak8fKl2uPKuq7sEtqTG02FVdv1Wm7jSC2DSpVGZdOM0rElHcjHbLHsnJVj958/d0Prpj1KjHOjvj5gS8/FQfjqbiIkAKmWDIzOjwoJSE4Y+XWb4x+baQLo7GxtUMnpqZj/xSQXMS5SgNNKZdXHGyt0A7Vd8gsKnaeZHC4ILnDaOg2msQqOvTyNIj6xUUF5PYpKheXqVS6VWhVct2qKij4weyARB9/4HjZQLzdgmP4IWylMiMkfvH8wMVzV6xbt+Str319dLS9pcUGkY+KLKqnQBgcg0pirjViSSmaD2u1Ndp6jUXU1paXNz6u0huNNWJVrkTMoIEAwsLCAI5yHFQ9w3gsXxm06stwDCT4uDo7OjpOe9lLyz1ubrRSylcp+anhc4MDl8xdv2736KaJ/o6xlq5WJbcc00FBIduXrmRVKCxyg/qooEbRWVFTo20wVRjgZNrbr6u06CRWTNh+Ev4WUFskl+AQIyzRf0reNOYesncCEhIDvZ29ZzlOn/5yX4iebmF8CZ6GynJmSERSjF9m1u4db33t7eSOEZPFainaT8/FIO6rCGx5NNbBihrFUUSE8u5GWTdmpIZF45XaJq0qq8QsKRjkGWl0Q26uuAiwycISl1diQlZROPTlWKJ0l3BfjwW+Xr5O3q5Odi/z/I0KzlooYElAgpYLeTGpSekr1m/b/bVvaHStEtWwvgyScZSKcHPz2Byor4QsUNmKo+B4Ko7KtEe1Wq2MZRTR+pIl+l69nm6wwmqPayJXD+UFXIDZQFRCWJhzl816McC5JIan+XqE+oQGRmJiXt6cQG4WtDhEqeJwxGwxV5SQwMquXJH11o4cs1IHQZ9ERcdpSlhQBgwehEQ+B8Lu+NEK0O/IC+KAPmhi7ueZ8lRtqiKxikZDTA8PdgoHTl8sK4zLZ8mE9OrLqJWVBJoxPiUlPjElMvIldoKEKbFXUHCEAGStmFtQmlcYQlOrF25dmW3S4/lHFyMoYfDw0FAq+ZQQEIMYQAAHQSLvPn7UsD+vdL9YIs5jGBmSPFsejUs3MKaAYGFhSi6TDXL2skbJzoVtYEpCfISLC2LQgMSEUO+XKTV39PfySUoKCWFT1lP7GUwxPFc1SrlSwgZtiAJ8nkjIJ/pYwZRzAsYROB/h2QQseD0JhaWoXsC3mMHLo7FJrQ+jHBvr6YRUgm0lE6KbyeTSAyQuLkplABslDbByTgj0gNfTS+SDopakz+FDLEN5r3ElBqnMplce5TOlbG6hCAwvU1oF6bJg7zMglPERkOAXfqsrBQrgwAOstFRSqioVEW05BuaDHLy3fwYgn66sYu3l443PlCL6xx7CP+dyZ89/iVWWDk5ugT5J86Jp8KAohW3OfqZBJ1dLEDMZOVXKOrYQtCBIIsE+zMO+qdbABygg1EBR6L5CkCilZBRKSqVCC+VpwWbjVaLEuHz7ZwDy6fDB4oOHUCtQXV/FRYEMt4DEoAGJQa4v7Vli5+DnlhSXFC08UIekOLkvuHyT2mTk8mhNTQZ+HcoSmCIwqcxiWGVOyUyRLjlCkNROTUuTgYZIkjhxNHFYcrWGyW8CHUn5NQqKez8DDpCUyIxClYNaRk2VVKks58LiAlPGjYh8WWk4O88FaUm0kOgQJlNYJ6JjlZSG8KV4bPP2M2gMKUfIBDEq5EByivWUvxdg9uELEICjpZHQC9141EJ1WldYV8eSVyB20cgFsiY87IWs4qpB4CA2C6Qk7iCgaKrrGzQatQqRI543LuFRILheFvPrFxbC40HmVljH40angqNqMuK6I/b2DIYQxy7SN0I+ZFck/19xEAYJZDowtGs23qrAuVVx3NAkZAkxUU0VTTKkRGWyfFZ+I37bq74JE2BCfsNYQXBEcPAQNMTwDVYtS8DTEVBmxwV72L+sleXtlq1k84Qc9gG2ODomISIidaEcBxaNt38/MNEKhUJMCgdDyASYIxXdFbXAceTo0asPNt6AmAFZArRyJZw2oFTIAUReUdHcoVUI8i034TlLcJg7G1gsUjDLClkOJjMiZn4i3SWgCHmrl3YjTnNaEBoTgu0MKl4ZHR7rFh6bGhKiVMuNTTSEfiIhvkTYI2w+W8wrFYny2yqa5Ef4MEWinb774O5VeVdLS/fR2r0CDJTmy7FpEMLsrRDgxz/++XsYPzt7c0hbD8U5FJH5xfwQcURYTmigj0/k/MRIn5cXzdt7pkWjUQJwMKNjwiLdwxeEJqawYYtnaAIMWp2QtEDDnLDF7FIMhoFW2lTKaqprOmAwdp+Wd2hrwItW5GOgDxS8LGoFR1lItOOX7OZn7xMgZ28OdI2eGLknF2BKqpTKZdkxQZGuHs6evh6RTjNeWgjs5BW8ECCgy01NivTwd/YNjE8IKChkmyxyY62otolFI4IA+H4ykVfDV2ke2AceJXUwqBUN7V2YEWwTZOdIYYlMRtlywCtFkPybjykcn93sR2nTwJr7t7rzoQwqLypwCXVzsncgbiXOL7HjlZ1/eAz8fWKS3IJ9XafbOToHJs7GpcuViDhNhloAKcTtguJCtVqi5HJFpeI8LgNTREYF1JcN2pZWbJKSfFLmU1JNWaWQsgzL7z6DlTGFY6D/wsjEo49O3m/MR+JCxHVJiHHzdyDKNjt8vbzwxN0rJjw13MfDyckZYQ8YwdkUgZ0rxhVci4OVB1MQXo9YokdKyigGZZ0nFopAbuFilLe3D7W2NtY0QnyOxiNkHBIQ9xr5BJyMCZD3P//NqQk4BLZ3PPzFRjSS4YFQCkjJdPMHG+zwciUD9g6+aJ3p5ew0zcHJwXW6k2toSgAuRSBBIqGJxWaJ8gqxMywqtcVk0InZVJCBhI8Ad4JCoW3WdmhbEMorgASFP/DjYe1rmvztr35CAfn4NwND7RMXJy5e6HiguMfEouRiZfVt+pZ7lLOXP9bXy4ECKex0lB06OXpHOdujkMvX1dfJOTCBTAjhf5BKoFFnViGiX0WNxdIol0mUTRwjcjukbeCh6not+iV1dXSd1mrRbEgLnxqkhaWtv4MhMwXk899ZtfUdI6dbWru0VcX8XEJZcvtuXX2w652wtHVeM/ydXkquBwy5r7ezs5OrvZOj/XRXj0C3wFhQ/4lTlanAgTgYQT0Dbg0qNdPS0XHvtas2AxZbFZ/ke4hRUH1DQ2cXaDyIfGHMXF8lZfN7f/dLVL1hYDpuyvdixeVXqFVKFRd9iQgSxq0HGx/efycsc7F/GrIkTvb/OxT7Be6R8bE+gZG+3t7eHh6R8akJKYmhofEAQlmvTkW0pQjq9WaQPhaSZ95z3FBrhEaOk4+OQtX1MNmB43dDTUN1Zz28snkSCsYUkM9/m0ySjSwOG6aa5AG/H1E9ItG+u3u275pzdE5m5qbgODessWn/Y6WlvbNz0HyX2YnxqfPDQ5PC0rMjKlXiZfNTXQLw+YkpHv5COeRxTSYDDCta9hwjpTvdtSb5ASmUzFQLseqGarRGUzTUqy0qlX7wN2j3OAXkV7+dMGDXsyAIZIP8m3q+Q+kJUqb7qrZRC1HUnCVzMhenB7k5Q4jv+OIshJ1TVHBCCI4kZgg7emZ0RnR2D+hZoyrDhTyu6Bh5KL0vEheg5FuMHHRH13ZUU508dktrMsrV8J0sqSINuGQo69Oo1Xj7DU8Cxk+ngHz866UdU/YiaKImwtQCRsDsaKXNZKvRtshlNfWgLRproOCamx4TFOfmgbwPrFNfOFhMiuaxOeyp6ltVhs6st7bBk60SYWlAAUlrFoEiRL5NAhGD6Xj3Lqq+bVd39/HaJiby2CWHqg5Lq5h4zXPYZcM3P/8VYEwB+fXSkRJSjQUcuCb5mBJsjwCXjGxTjUKm0HZpK6BIAJjlGoglV69OT1rs44VcgON0+2kvVE+F6i/+lHKDyVGqKvXm5LZWq1k9rOTGB3AZ+/dzkQEoLwc7T4rYulrXUGVhG1u6a420fSK8GgX5EJSUwpyxzAoYsDedAvLL395UVxUj14gtckggRH6OiybVGOXZGSa1BlRYc7MWN49GobHInqwp0VTMjImJ8Q1FFaz/i4T0Ds4L3ObOJOE5H0Nahb47La3m3t5hc6Uk3oVBAQESsRhZc2SkGo8ff+0YRl9jo80owjOqgFHIFhEYPYM3PwMKCggx+r6p54n5HFiK4WRDeTITlrTiIjq2CEqpyyUqDZIRCAi0rZZGyb1Xjh17DbUAC6NT56YmLA4GE/FiVCkM5vCGxXMcv+uHrS3J/YNWs1WnzInmYquLe/TgzosKxBK0IGmyNR6/euPGGrgEHTUY2HALISLZvPLhgc9/BUdpagDGb272/PznIOCV0LQI9qL8B/EuA8lHjDw61ivDoLFUI7KR1Tc29vURj7e7fGmJ4ADcBef6eXnOepGLZZqre3Dw3IVSKYpYBXypxjqYPDh6otdqHtavMBqxQyW95t6eSjG5T3immu6jjS3dLd1gTUppDEYdgSHUrcJk/BCDwjEFA4PQchylpEogPUTq9tikvxJywtQrXbxMrWnu7OjUNna3voPj41ifXE1KnjAiwtyiXmRtTUPuMG1xViq6nlTtxdrSmE9fHBw/AaVPzUqDkZtnbBsfGDeDU9vPkKhMTUchOTV1IG9+1FjKoGNGbMnYGQDxDMgvfzOpAoopIAXsKmUVBwWIDGLbzC3CvFLzQi9PUa+ob2+40AXFzs5jHx3bZauoEOSXAMnCLL8X7sTg4OoftCQmc+HCvaSFi+L0xVNnxnt7zTqToYlLJziGdToCBEvLBFcRo7wRRIOxVlzIMF598FuUiD0bBMYqCSkgo4DsJ8QcnCEEQim7FME/eB8ucGBO4GSRvbr6AqL/012nL+zZ+UTexEehBnDMnDszLs3/hXRPmBPPKMfguTHzVJx5C+eunrv1G6dODAzrrAqVsqiAYRoc1CuVZeWMUjYDcji9zmhgHZc08SqaJFBYAsZfxq8+v2kFZ02x9rlUmFbI5UmUfPAvQqK2oe/HXAAH+T11fcPq71xsPTN0Xntai6JN8pahqreWL4nzi3K0f8HGZ4uCveIk85QzUzPjYoLX7nj70okBUNFKsRjhnU5dzqDzyvGOwkBrHoZRpBIzC/vu7tz461/99CdYTc9gDAwX5T4bhBzJY8DZlLOPyT8oZEkKC/eXIs9FzwOMooLZLpu2Lv8OpuRi12h3q7ZGjpIn4ty1OnN5ptcM7PYXLH3xd5uzMKScyY+YsyQmzm/3N189c2rQqqssK0JUIZbAHkhYDjFpIZsnEeXx8nhc47099//0y5+899N33//pe+//FGA+u9mrB28EYyQ6AyDoZAmBNBWS+xDEEavioIgHPhVhG/4JVlZGzsDqpe0jF1oULacrFMtXaGX5h1YvX748bcn6oEX2eGm92NpCoBJdKUSLQ9q8iNQgHOsbvzM+aFGXU65A4kLIe8nrA2RbKR0/1r67j//0+x//6EfvnXv/w3fPnf3ZT8/eHkSHcxqfgWS7CpogY1sRl2tQKQvr2KwDQAFdvVxx4CCHK6ECHq54Wap0ZXLj2KkTjTXoiNP1emPmnOXLF69en7l17SL3KP9Z9i9KMnp6+cQxlUIuhy2JDllx7P7JY29ve32Frqy8iI5VAjNiiN+FdUw+EJkmN//h94hD0Ab8gw/Podat7PYwogAmWhCoFZpuU5vh7mtXb91iG01KpaiQsjre13TkoKIZcXxNobEpD8FOOeTMCxsbuzpkowrZzOUxSYvDFq9fv36HX9aite6zZsxwsHtBHLP8/XzCaWyJkIfMiNhw4+EvPvp+0MpNFj2QFIBDyy1kUNbEIr55Yumv0TGFwPjxBx/eKb8jrtTryyBN4VThFjDItX1a7Z6Nj9+5Z2pTKDSaKY/gg7XyfTUdMnlDRY3RaOIhTalXVzSBwZepK+TMmSGpqTHI9QXBOdvPb5Gz/XQ7uxcuD/MKCktPoYF1ZtBBlryz/eFHu1IjVmcjdETqT0zR6ziB1IO/+fwzRIMUkPff+/BOEXBC3lvOlFRJ8w8ratBLoav1nRsPH++829GqyK8+dHAf5T8tQ0ylbaxp6JR1oFBMqpYwJRUVR5toTWA0GHU0Xgpoj9SYuelu7v7+/wsxZGfv6OUWFjOPV1cI76/SuuPvbH/ltUIar1xSTpLLCCsK4TyuQ80IXkqAgfH+z96/cllFJ/u2qIhXDkMIPEpqtB1drV177v/i4bHTXe3NNfkgiA8QqrhW3ni88TW8pMb6L2ibFTq0iBPUHm0SlhZiMGBJXccOEUanBqUFpfl629v9LySKq7ufTxKrjoHscymD13dju00kwgkk5iGsyIWnatHwzdsfv/+T50A+vn2vjyYuwAAWMZdPlHQl9UPtraOj0Ad9tHMUdaGocYCiCwurQoag/zVIOz663wUXQYuuiqOuqKhligCEmLthlNLrRCGS1PA4d8f/rarEztk/Li5iGf0HyIugthPrhThFMiCEIHd02arb4KeAgwJCQvRHT0xFCAoJDiTW+FI+3lfk6d7ZPvIEgq2LJxpk1UfQFgpjH7pcITG3h3qQXRgdaZVJ+ZIqjVTN4eflAgX5JuQ/KblOiAnycv/fRB127l7BSXNpSIyIeES5T3AgY8MoQIC+6jYMvZ8D+dVvNj/pk3BxU+DhCHlKkZhRhKx2PnighoZ2jAubRwebm0GeooYUpUl7S6phRXl0FyXksmjwkFSxOSpOlVooEYpI1IlRSJnAFfCiY4Ld/7f8gh0ac6xdn5VKvHl5MFRki8gqQ5lkkX4VqXuhgBCb9c8vXuwzkkVXwCU4MC1YXpAGwv4FT96G5iGwdQPNFk3VoSrBkUPwAUZxD/GWPt5949ixnUv7R9pbLZWcSqEKcYuaRQthu4ChwYTAi48hwvMuKc3d0/7FO4zYOXz1q2/sXr9yXgj+z6DCRp9Zssp+kIfMOIpFKCTvvXv2+s3JPgODB16eBwVpOXAUkV5QYjHqFIGjBEAa4GWs01QV5x9E8wjYPdURxXa17OhxXBujo139Sy/2WuVkMmDRzs+YE5FAEzEwL6WMUnqhkBmdlYYYfobdC9Fajq7OX/V84423337z9R3HJaQaR4KEaBEjj8xI+Z0PCJCzP7ty7soqi61JWChiClgiwpai1AhAxOLcIjFTKVUfBhAsLmQ41TwGTyAAn30EXywm84Aa5SeKeu1Y/6VPBhq6Jlo6VMw6ZCRZrNTFceHhSdHR4gNCnrCIFh0eHREX5Tj9RR660+y8XXcfw6S//eZYVwuKcZmVSj4HUwKX3lwGcHx47t2zZ69fv6LTVGiEB8Cv4w0Oya8Q2UEIySGJqKwU81ANABqFNDSvKmYzEQcwWQcP7QUMHFsw+EeAflDR0TF26dSZpRNWtdViFAkJWx+yOMzD1csz1Gfr8LIQ2DiGxLm5ubt7/tcTYu8AIaZ3pN83qW14vr3DolGVKcuRgy3msMCnEfqk8sMN168PDnagq9O+Z/UJCJ2gGGhqqoWdt1ant0KFU4UKPWIYImWzCe1TuE+AvZ5PdjqSdoWoua6o6mxuP3Pq9dGJrg5jnaSMIwxhh0QEp6U5O9pHLVr1wbmcsHkREXEeYJ7/64T7dDgrRwbOD47HwQ/fn51QM9UoVOXllZJK0EKVlWyoFSSVavNgV0dNvbwWdDXeogQH0OTXNiEJihSo1jxgtloU6mImrBuJux5g4Ig4QLZHPg4tgUDIQ18SNUfaUfP6yMSIorPVUq9SClm06KQYWPjMQtXxjG+8+8Hl2PDoxfE+Hi/U326ak2+4S8Jslz5YMWFKupK1OrVKBQgSpb7nDqgTNgrTq2F40NrZKKO8yPMFFJC6fLkCj3aMbijSRgfaW4w8EQEAzgWDzAj5w9gkOIE5qDcuzJ4bvU1hPd02UmMA/aMWsiJS42IXBflFRc2yc9x97t0PViaEiyMSfHz9X+DAneXuFxg8uwDs262d2CXbx9o7wbVb9D2V+g3QkN+prCQcdU3nSKt2V301fDfwECWzQTyW5Ui0Ecl7d0vrWP9Yq1yhZhaCFJqCkScSInUooLYIYl9mSGIU+tNnqdVWW59ZWKxms5VJMT5xvh6uUa4Ojg5vXYcUbVkA7qXEFPcXeRrCPMAt3aWobPjEmWuvPtp8ZqyrtaPDqtPpUSvy4Qfn7iir8DNFOvzu/fvbYa6Ofq2kgpjsj71yMJ6NCDu6G1vaR/pPnZlolWkEQlHpUw1HIQvKZrTCwSbJPyAURoQF+0ckLBOW6Uz7FCo2M2RmSHBQUJK7tzf8cqcTHO/qAohixSURJqEvkm1zm1+O4LZyeODMtWufXOpH46xWrRkiUDI+3DCswQv6cEP76MmTJx/UE38aTAaIXDz50KOno6URo6Vr7NKrD09uX1NBdgPOZjItpUKmVEByoqTjLktUyksJWZjCyEWhg6GOzxbWhaxJXRwbHuXl6xc1y+kNIkW7jGcPmOGA+ZGe016ALPV0iw2PwOa2Xlj6ySefXPqkv32kvRelImScu7xi9cKqkhLkOzaiVOqGllpYCMqnHMJk4D9aW1rQAA2dkfB6eaW1oZpYPNUhTIZuWcIi3Y+xuA7iHGMwXHIj6krpUNsUiQ4cECVUPFoRFh0T6RaGsvy1BMc521QOwyXUw3H6CzTainL1ysmAWN06cWHN+fOnTp3q/844SkWompcdfr5xc6pKEJ3XTEw8vIs9cgjbnBJp4Re7pgEzNdI+2o9VSYAc0x7GwiPGYVhgdAZTKM0npoFYixymmI4sC5Rc9P2I14U0Ibdl46Mb34+YMzdpifNu4MCEuExpiWeHvkgTYbvpdlFLssLiVvas3GRNXvP20k+WLl2FTQ4YV77rviAIHb+lxEBP09B8ugX+eaSwigKC/a5SKYdOnDiFgY5bUJAf23UYTA62lEBIrHMZIomStbeq+CDkXSL0nscguqHCPOhUXISQfDzefitaGB29vndKwZVBp2S48J99gS2CKZnl7+6xKCw9Mysny/zm29/61mbgAJAr29Lcfb1DEwPEEp5SylGh1+lh7F0BMJDVg+2On7qpLXng0rVL2FufPNy+Z2kXZuwgqbtikQsRq4vP40iZqJhGzEYGoOAMABZoumrXwM5KxBUyQ15H3S8kdStdxEUMbJHZ8b5OL/IYmebg6OTp5bc2eO2SJeveWPS9Ld8FDFQgrfNMi4yNT5wtBo3GRekaF9EV1gk2OrVD8GEBBPVTk2Po43bt2sVLl/o7tPVIrxObJxiqlxJZsIiB5C2uEEJe0CmiGxOCpwcD/7HtwaOdTUV1nEngAJDenEooD8AhucwP9EYq879/sSNV7+Aa5efuhye//6yvfpvguLJkXlxg+NwE2HhSLZxIbM3HPUjWFeUIj4SHgEFevlxTXzLa0l2Dz8tEazPMG0uQ8jlUzMBuABJMClQFRUg3/JzsD9QrgHaEN0od3gm2B/du3GLwJ1G/DCCrFkaweExuEXJZSGMGuju5Otm/wBEM7sXR02nW9OmeFI71c1NjoueGLOMRfpawhXR8DPT6JXEJSaLtxYXN4pDmYdClGYxtk2dGk2vghE8yiTirCefOeCqeR80F6BcKSC72CNgkTAz5RTfYCkUG+U3gwFiVzaEJ+aCdAlISfQIDQ0MjfXxfRCk03X66vT3im1kEx7fXJqWHzGTThGJRAaZ6CgiDxykWIHIijpjESD2fw0TbXCIt309jtPX13TLQpMWEfCg+zOfjrCUTQk0JlUDAIIncApELzKsYgEQetoDTd/M9CsenJnA3EiYPF1pCbGh8istspJR97V/EcmM6sir2FI4sD7+0uTOFEjYhFilBWBES4mwekrecg3CvQPhbDG9ZGRPSZNI/CIPGsBmxkfE6xrMd84E9+wwHOGuYYoOXx3+jF9IlKg5luyMi70H25O2nOGxwT4JPqFTIDkGNPnKW0G/N9/jvF9e0GV+dseirzluA49v+Tl5zZ87ksPhsFl5DXC6Ekwwxgy2pQpaGnK0sAcYhLb9NbmsENfpU7o+PTn1wHg948DyeGuTgwk8C2YWnJnUwYt/LLGNyRSIsLw0EdQACHG3k+iSyPTaDyp4QOzuXBBRj2P2XVmb2s7a8sXvtlm/f+fC7To6enl5JlLeynHPQxoZqkrDQsOwvR+a2mLwv2AK+pqZEe9V2ta/WRqORn/7zQf7zX/57Hp36WLkUDoqbl0g1ZQrpPlyY3OTfvE/heBc4CEYoW5h8pYRKaJGSNJdYD6fp/2WU8tVFuzdt2/rdO3e+PcPZYYZX0pxoqVqtlnXv1apT0I+uCLMCuykISEAlcDiQ/bIbu7QXa85r5X1tIkKuU/PyFzzPUXHB2qFq5HnmSsxOVloq2gwWo23iM6KnQ1385TZIduCMJC7jS4d1GqZeCToDwyXW12naf3cjfnX3uq0rFfo7d3KQ4baD519ahlrdqJFdZbXIQow8cCREXSxhivmkWS7S1/CZOdWAKn3FSItMgpUE6TUF528H/hYsKrhKJZ2aEJIB5fFUGoWhTT44+TuyrN57990PV0nyELsUisVMld7SaV6BFFlGmVhZEJAQ/F+aWTh8b8uO5GyNqueOPikpdoG9g3dwTja/0drSeEHWNW813N/hNY7tjtUOlh5cA0fEkoHvudQ/NNbfflDPqhMRq4280r+eE8wRadXBQaGoRg8C7+e4EHGfMCSMXpNq0PK7z98HHfPeBz87N2zIy4W0jY7kkVq5YnxwxesD1sw+1Pwlhgd5O4LXIT/q/xBI1O6clWrpHeTGVLQIN2/nGciSLBQkjw7AoWZ5PpNN+kyTpQ91OZ2HE1kF/U91M16EnSdO1TeowXwIecBSuB8zQxBgIH/CyBOKlAo+3lHKymGSwcWk4hS3WXnm3/0WukBsjg9/ds7MzcMZDnEFjbdMousY2fqNt3d84+2sN78RgavE1dXX2RVG1nBnd/gPOBV7z7WvL1fyVXw+bCiS4lwXOHoHBkasruhH6aGi/mCXTUyVgWPg43ARLPGkzf39Q3j5Ng81NCvqoJ/jYVJwz2O7lGI9EXIPxxx8axqqqiz1Go25vLKnnA6xPyL4NnHy0l9Serp3P7hTZi6a2l7cgCKXaMPqTZteP3Xm7aVvv715Sfr6dXFufkHegTCBdnSN+g+aCjvM8PTLUvMrwfHjGZcaE+zt5OS0wGNdh6LzQotcWz/CVuJKoxYNyWySy1qNl2JnJ/QjaGMsBcXGQAzFKOSK6sR1DNF+EaOQyZYUSznSivqKBo3MUg1dC3zxGST+ZfQt/TXkQgTJz85tyEYFLTXIjEUbTCv7BibeWrodAqqsN9/M2rEuPih4vlusR+zULT/tyyvvp1EVPGlhOWqlRCxGzFZEi4jx8XT8ir2vzxxFS+NpbWfVQLGKK84lSJ5d1czq6mbUIDUiCas9JKIic0J01okYsHOiFWILsfkCKbHOq6qXW8waa7PVIhZTa8h2HrpADDIjZydzZmPRPm2QgSNXoqpp7foGbLXxIFj6nbdfX7EsKT4leH4inr6uDp4zHL9sRUFDCCNM0EF+O5Yj/0GcxOnwVYsO9rOH631oKoQN2tHqquYqPpIjVCULnSiUcCsL6hu0UCeXyKvlMrWIotERPyE8ZwpprCbhQRZ/715pPjguubzG3NCgaCD6ifL9+013//BLTAcGcNxOzkRuEkgwqGsEWSxLx9jSY6DrAeTaCCr/csqX0dEBINTPLc39S1pvOyDi9XZ0ioIkckbU2q1lTGQpSPVUoTB6bvACO8cZgRFyKJCGFLg8ilGizuXlIXokSVE6ncevgh3g8QrIzeTEx6kUg4ppS8Ec1gprIcziCIpBK+5FKyKZoqbBYtH1KBmmJ3/6NVGhPVUGfsMrMi2NIMHA76RKRqU3j09VKz8+YzVPJlt1YpQu4UZJCvrSmiUnf3uQi+4egV7O3r5+WWVKCYBQvDsvJNzfa5rjoqzM7tNDnZoK+N2plFVFfKWxp0glkeDw4UmkctnBCpAKyIirOeShRCHBGhNCG3ygtkIKc7CDpF0BWjE0QBxoUSttdx//Hqqnp0A+/91aFB+GQQA2VSJThGgRZZaW3qEbpMb38QhImWRUzonFhCBPSU8KAoVqP+0f89DTHTzc3GNjfdzjfYIW+ARlZMwkZS8Uh1MXEgEzXnArb33jawPVctj2SZSwm+JW67Bn2ww9kjKRRFV1qPYQ2DfYI1RxuFPZDSqe3VeLgQILYjSC5E4F8Zmr0dZoWh48/iNgPAXy2W8nM5zcvf2Cs8JSysUYRWKqzNI8cOraq/dPPn6QPH7p0iRwlEEiRoY4Ps0rapbDtH94ps/w93Cfn5EQ7zI/Pj4xND4yOyaaeQBrg/xsGQxarK+zs/+iN17fVg3XPnRsQtVLdbOmuW2o3twm1aEFuKZEA9uNI/mkJwGPQ04tBgFygLevCTNyQMiC4Rwx8YbMD0ld2ZpHD/+IRPZTIB//5nemPIafh1+UW1RQ+jJ8VPJpK1U9PTrr+CUQOa8uPQ8rrFF0AAGEIuye+LjFYW7+s/7RAnGG5yKv2Lho9NBwCUDZWUpKYvwyDpOHZU79ZEXxfh5uHn6Rflm9cg4PgZyquOpwwxdfNGu/sDQeV2jkB3SCppL8Q0dIMUuVknOAK6JymaKmJlT1HNjXdBBZHZjnHawVyGs6tHd3PvzjlJwOA6vqfB/WYWlCmp+fW2BYdk5SBlG0qXSDg9bxwRP91z65NgGL8IlBs64HMzI1KuMW2TtAB/FPwsSwBPGygKkDYzbDJSEjG7L9OvKSFuXmzU6N8IlJXxIXaColen+It+plzQ0XN55vHOvQdh+vJyXfghLkC1j5AjBWkMpwebDAbzpgBA3cV0u9hEmjtyq1vPjqjVce/x4wMIDi/Z98dr6lqZCccaLoeXFBSdERSTk+ej30euPmE5fQCuAa1QL94uTAxOSwrrKcgMhZvDIrZ8mWf1JF5uDp7+4XHIH4+ueU7gXtNVygyxBO5QvrSkPiY6NRNRIdwy1E9ghKBrWueegC0fl+0dl5XFuvOForP1iBap59ACIVAAjJ1oj2ymrl3Ud3vYMtQvqCC5vqZPf2fPSnXz5VBQLGe1cunDaVkocu0WrOS124N7oqOnrhyt7kXvP4+Ilrr167tvTUqxcmzp959dXJ3tMtOsDA6PELA50Ahc0/Kkqj3HwSsPpwUxdxISMWKsUo+gTxT4CA7wQIDrucmQHfUSGoHPjGdw49IqfJ9i+0jZ3dR+WHCYy9GHhj7ROiAKiOvS9fI6vQtry2/eT2XUwBTA2ZbTDK+wNUmhjUdLx3/WZrBWuKFqtj4aGJNxrOaenCDrN12DIwOPgJ5mJy6eSFkT5zT3Ly6RYVNLsxERk5GWmLorBD/oku0M4JSMIpwphRxldrNEqVQS0sZgrx/iS0Ey2aNESS4L2GmIkplRoqTDUkewJVaXNnI0ShtcQ0kySd88GzAwf661YpSiTaxqvbT/7ifi3aA8vv3bj/p99DgvYUyPvvfZrcKm8CCGqQWgwWckYCHHwyTY20obl38OKZpUsvbraenzD3micnk4dX9mVXrszMXpK+ZZ2XP6mtnvaPQGCmExiXEkAvQg2bsspSo1PJk9X8KhaOYMxKLvGUw2nF5EFgw2FzDtc3f/HFAwABuTs01HmcqgA9QsDUUjQdT4h3SkMJE30L6lvwp44fvLpr++M//hCDAoGD6uNPe7sU+ULMIeX9RJExU65cKJc5JMuvgUZzFGUMI6c3r7ACSUvy4HBmUmbmkvS1a8PWLXL3/JLEj4ODn09iCl6xXGm+SqO2oHuDtNcsFfDrKDfS2SHIsBMaQanScBD8ocquuXMnSQMd+2JIi5wIqg2B4wglMREK8S0089kas7yqXnvj+N0bOx//cUpRBxg/fv/jK2cvJ7c2ggUGCHhWAguFhEUNKgNGMqg1HV3JFybMySNm6+TW5A3WrcFZfqAM17q5L/Jc9GWxL97lPvHpqRlKjlSt0ZstNQo9cjsaDnOfiIqbaNgjKmJ2ZtEpBBymREJrkp9+BZsEQICEJHdqqWo34NlHmtepRSIoAPRVNafv7nkEFFMDO+P9s0gDt7YqSGEMoABMPpXz2ktlWAiDDGyAgdFRYm6YGB00r1z5+tYNVy77ec3yc49atMXfaYan3Yx/joM03VmAgrZEtpS08rbUtNnUmnp5BUoJuOQuodNCcAzBhU6p1skUpDeduqGz8SrC6wdfTEnyj6KKEiCetc9HmrmKaZG23H30HAWZj59CObRhVYsCL2PFYYICLAyISPxFMGWfS3hk4kgNohXJ+cOa+v4zE6Ob0lZc/vDyWpgneDo6+nuCB0YJ1pdmqWAMtSA0faEUloTW5L6+PnNzZ4PMwBSBPCP3ewiH8ChSwKtXS5mcfI1c3vjFF61jzY2d2u6pGaEGkZMBMc5fdd/dG1CiUQieA/nJ2T6WoVZejy7CJYQVxiBA8E08Ual+9ShIhGQeMgNIP4ZGxz75zu4dmy6fO7fKngRSM9Bo390e1Qv/ut2va2TQPGmGXqVus/W1d3Y2aKQcXgEFpI74R3JYHH6+RiGTNklRbKj44gtFp7bm+Bfd2uMYFQep1YU5IS3FTFfvbv7jL8n59DdAPptELYKisaMDbzCyeoDi6cgX4CqZGpgSZOaXLzzcvOn8J3gcvrUNybLLW8jL1QGRlJeXf5S/3b9qRIYZ812Xns1U6VSmlr62joEBtZopFjHIucXgCcnK4qur1Xy1vEpQka/UVJtkh2qaG5vlyBkSDPD0PdJ0BMqMtnsPHvya3Bd/B+SPj3e+1lgiV2CUKOohJCADP3p8S2UtQtZfEi2CmXPmZa7Y8bWvbf7Wm7snV32AlAaM9ew9XNOCgtOjgn2cPf+FuhF8tb+v37qkmBxJ9KaF6VmvW9VmvNp5XEo3hUOLicFRstUCBSaKWYpa7mKaxVIBO2kFzt6min2GfU2M47fWPEChCMbfAfn9n7bfuCfHrj4kq2mtQaEPaRoFLNRvfOmaNY3dKER+mvnC4lq9ek7W1h3bdm+ykqQfdghYXDe3pNCIhODUIL/AL+ezpyFwXLto3fr0oPDwMK/IIL8lmekrSQe6OlJ7gC8eoEBUwxfK+XxRHtUjfr/RWFqIGuQKI6sJ1Imt8d6T33z2MQSBfwcEKHZC/3/kIEj7ww0oq0C9Un01GdROqJLKTq95sKYbpzA2CdUdR1Axc+bcrPTMuW2rKBzbHL5iP32B7/xl8TBVTQlPhWnVl7NyW/xef/PrmdtQsOzq6Ozt7eUbGB4RwpQIib4Qr28SLaqEgCQpLXz+Xgd1uJ8QDcamtltrbgIExt8B+eUf/7Rz171uaOZw6ePlBR1adc1QZzMG9jx69ygMNlrf3c1PdhEWmUq3kKNr5uH8hVrlMJVLPrdpxgxPdyf/8BQxUbS5LEv0cP0yC91vvrLnna9vGhvVb0JrFmdnRwdXd98F4bHxElLmLSSDTEgFqa6nOEQKytPf8gx99wDiJxgUjL8A+dXv/7Dnxt2rMiLPYpELEycrpEL1Q52dQ0MDnWRihizm1pa+q2sMyooqFpXpBhDslpASgdp6+TJgYELeWgtZvNeC+S5FlMSQG+cT7O76T0/gGa/cePLkVnL76RZbjpu3a2CgO3LUkUER80mzDeRiRE37RE3FxUeFuBsRe5USzwTw5cBBa7s1CVUjVHR/ETZSOH756z/e2PXkaveUPEtI5Fkwwj5IlZDhaG9ux6/Ooc5TJ06c6D/fd2/PKzfaBFUlmBPq4CI9QDTmy+++S3AMzwxb5OfmG5lIaT5zuctcEmOhcfynC2v7rnuqtlutra06E+xV3OaHx/ugcj0kNYTFJM6ewroKqL/zj6K4vm6KIGGUwlrOdmvyU0oN+DdAfvqrX/9286679/qMvGIEgQByJH8fi71vrxRTAskTkGjgTgcR19BQ/5kzl66d+WQpDKR3vgMB5CHkhsnljj+osVw5R4BcvsyPDkOY6BMfgABdTCeLK9HNw9/hn271r+56MtZ+ugMVOyjvT4qLSMhYvlBaPBO9HAADrbzzWUcrcFUcOLqvDgNShmJTHwGB8RTI+wTHx599/psHd+/d6jOKmXQkPllPdWaIzkUHivnkzpaibkRKDkC+TNbZRTLyZ671L3306Bd7Xquq4h8iwReLeCPqhjdcITiuXM7YtGOtu7dnmg9JSZTTwQ5GJCz2+5IMw3T/9X02VS94GmVGRIgB5ScyOTLLRCwjQChRWyvATbG3qQlMAqtpX5PNuur6zzD+AgQQbj55cu9Wm5HkP8TgUsk1KkAQdYg0e90n5NUphUBVTBYrD4PBlqN9QWc75uQM0sCvbn58VXo4v6QYwggB+tWX6DYQGO9euQyqdeGK9XHr0hPFkgLkJJD6Wxbr5u1o92Vmkj60Yb1FzRfuMxBDPxLVHYIkiZShy7FgAQTmngBSa2i7fP0sbIqfATn76e2bazAJNhVmHnzU8zQOXSQ8kg8glDyrjrwt8SOHfosMqu0Q2vV0dKF4+swnMB7bfPdqB+r9igVITR6u11zZQBYWcNC44ux56evW5aRnl5mKyqlarHhflHJ/WQNNL58cvYrEUU2sWhlOedlUcHoIPoUHYVxPBquwCSiofwEF4yzBcG/N5s23SvHJUM2CueACBzXIgVZ3cAoIvP6RFyU9koAjD4Ok4HgcdLrB7TgyNnbqGpBc6KrRIOiSSjVtlusbzv1sCoeEFlKRFLNt7RvpqdltBSqSUs4LmB8c+GW1PdNgHLskU6dUcoox49rGeoUM6xTZZYTU0C4ABL5ZqmGgoAbkjKvgET16oX1oYuPp00aDhAv7GYzyImQ6MQi3B3kWEaURlW9tI4Q4Uqwrbt7TXBzI4SZ5IyqnoVw5MTDeoW2t0VQhjCy2TSZf+dnZc8gykPlQKzIscxan71ifo5P0mYpyMe3LIsKD8EK0+ycoYLeJzkEesXMgZ5WDiq6vBxAS1E11awQGPHuMRLCFVXvuyvXLfW2QzlUrOvvPf/LJxJoWrdyIlA+AoMASa4tK2eKTCnH64CFO5FmyhqGS+mLKtedZYhEGwVKsrXbMyJkT/f3nJ7paq4uL1ZNrbkOA+x5ZvJcvm/Y2Jy/dseOtbW+9tbLtqslI76MFpID59UBbmn+W+3RCvbdrJPpnzuEX43Ds7KhvRr0zRAskysbPlIXJ2EDdsVcuD+vkU3+3unPszKXzS69dG+mAZ7pBzRRhGwMJBlgMAKlDy2A8XcGkogURgmnSC5ICMnWf5org/g9bwfax0cGBE+B9zo+N1Fx9chPNasneA45hqUwxM3PbG2+84fP2219rnbQxrkqyI+LCfF2/OsueSh78rQ8jhB6BoZG+saHhKRFVJITAjdtcTwVCJP2MO4rTs4GogzboDYL8Cgh+pp4L9Z39Zy5evHRmpEurOF5BHrg8saoHpCa2Ci58tGhGQyH8GACECOTrSX9qbHNih0T9JqJBagdtV+vACV0vRG5LJ9Y8uPsZRc2TM+Syvs4wR74pMyluxxs7xsb6T5jpF0ymlcE+wd7InDuiVdTf0CjT0f0oMtI3MT4FcsxoNn+m9HA9iSFIWHe4GkjwYXqIHe4GlRDv8VqUUeDvAwVijBOnLp4Co4nOhn1y9D1mQh9QVllOLS/82Ol5kGcRf1ZstvpOc3O1BlsdM4IvFCoCCK/J0G1rbW0f7R0cN49ewsH14HOwRFNArl9WqYUh89Jz3tyS5bV+/dfH+sdVA21tCTmh6X5bdvg6RS2Kcke3Fbu/Ms/y95ofXwRrDZdcpLJ5bJwa1aS4oLO5HvugIl9KYNxRCkkoxxIKmviaeiTYkKA6dekUGs/h339xpLVFizo7bAE2IZhxrlDKN+huwNYhuqrqgJVC85CG3CDQAWBQBzDNIFe0Nbb2Jg+ZRwcGzm+88VvUBE0BObtKxy7K3MeMWeLlueira6O2tbUDh46+cGXM3Jj0HelpcW+FhXp7znB1ff5YtHMNWpYSEEBSaJTPNUPJl5qbz2/e/LWOmuXzDs3sIbpSJmJSEsnVCUVMfk1D/RcDQ18Mockk2OVXP7k0JEP9eX2NrKSYAxJdBfNICTYCpQSClXSVUK1QdPSeONGs5GPOGEwOhUeEvK3RYGjp03ZYBwatSzfv+QMKtJ4C+XSV6YAoJCfGJyg92N3fPWrdVltjm5Vr0C1ri87INGRkpOekJ7otSHPzdZ9h/8xIwDd4PqbjeR6ZzmWLVQ8ebty4Jilz+WrlHdRLCQ9QOPAYF4Kxk2g09aNjqKIYvXj+IqB8cq0fNocd9SX5uMv4SNj26p5n2Bk8Lpz/W8abEYqM11eri9k0NB4BEiYqAgDTaGxT2VrM1gsbdz6iCOEpdv72qjKE27TMaDcvLz98p8022bpNMDgwuhw30QwFkoxlkpScHRHpPsFR9nY4h6m+CW7ziWnAMxzEzYFue+XxoxtveYXN6blzp5yFsJoiBRA7oNUqvBH2m5PHLoxeHD1//iK+LkxcaEUDaqw2qICUmmErJuQv7xXjrb5bF05Y+kbGBxraNRa+RjXV/JxB7RY2XL+Nbbdu3Aev/eNnQG7fa2Mx65gcweK1QTuc3b+6aNGWrbDBstlMRrGRNKwv2C8uwi4QL4uNSFvk/7SuxM7eOW2+CxGlUo6RlPwoZcWxk/e/n7Y4fcMdyXNhGbkQK8RCBrnKTKbkromxkYvnz0Pw2D9x+nSNgrz4Sqr4YpVVLy7HDpkaxhukTmCi03IVs9KPymuNWlNNWRbwoKNhYChFfTc+evh7EBNPgXz25BZ5VGM3qmfuWL9urecWvy27t7Y1NXFzSb05lFEMEjsQ7SndJWFZehpwUCGWf1p4SgL1+TFgyucSkDg7/JvffMN50doNOQtBm1FAWCRyZFXwCkrJXqIV6K3m3tGlSze++urFi61dnUP1CMpVUmmVSqcjiednE7IdP5FHmy92Wmr6LL0DveODQFItJUCwTxhcCIdu7aFgPAWCSvE1piIuet/gja2sUmzbtu6t3bt3t64wGiDjMdoMubxcGmBQIxfBY1KQl6sDpRF0cHZFyzuwvvRcaiT6zPcJirR39l703ZVZq4kJEwHCIhJqAbMKBxIQE29bnV615tGjx4/uP0m+1TFI1lUVnJjUsIPWS4BjaqBxwuPHG0EWdg4pTB3j5oFeiRmuFmAsAQSuFYY1O1EQ+7xSHDDu9om4PAKyjqWUltQqOr/T/42vb9q2acUcpSTDZjKZGNRP/Fk5eQo8rIK8PO2ppeXksCA+ITERUzF7dmLKfA9fT2f4iG5ZsmTr6uXQ9E6pk1FSzhewITkCEGKkKkbhxZ6HDx+e/Kivr82CBCdqpKrAUZrN5nH9czEN7dj97Rs39k8MnDB3WlqSNVYzT1lVjAwcaQjMs929/5AQ28+B/HrzVR4XoiA2h1TrC1lSjaJ5SNGavHv3OuvalK0BPy8wGmnkB04BocQs5ctCvaKepuDsUGsI65P4+fGxsb4ebpHEXcfLb8ubm1aXqJcfovSXgr3CQ8VsvqRSQsIPkqrEX4xTbHw5bC3UzWaLsh65ZLMVTToGeyXPNsm9V/bswtqbNPc21HRcrbGZ9ucxDxUTIPyWzcgy/DXr9fuNT45C+8ETTtFO4JdrKxq1Xe0XRi5+7fX1b2yCKEJiENOI9u7ZhBS5JKUhJWpv97TIwsnDfYGvb5Srq7uz8wJvfHv4btv2+qbmbYh9CcmM9zMa+EqU5bi2i8QkUUlSyG1UfuQdMZJIOvDd+poeS++g+YR1XCdhPJcE0W7dUphHJs3tDTU1Gp0xD7Z1qPLhy9Y8fvxHQuE9r3j/46O7NoQ4bCbVjhNQKvkChJRaVILXKMwXNr+xaf2S9L6V2Skk/KGmBDPjUrQsNc7L3/65xed0BydHEKoodfBeEOwWHJq1OClDPzBUXX2oPv8wytRUAn5VOQy4y7GixEi5UsNGCiFfUSEXhhVl0XWYh3sHR+E6oNIznqvO8gqZxW2D/YNdyQ3NGrWY3JFsadXpzQ//8EuwLM+BgPZ6zUQH51QnZgIHUwknW36xGgmf1v5LF0ZGL729NTgueK3ffLcwA5dRQFoi5BIccWmZPh5es2bZ/w3PCBSuiIDnx0WE56w4PY6y9XpNL7T8JdVqnUajL9P39gwjaVz+LNNdTpqMtcH5kuyMDuuI1do+Ptbf2zuokuAcR1AIJBDUStuSx60DVkuNhscg0GwXHwMFxnMgf7y/856YHPzQaTEQvjAlTCWALK/SQDY10rX0/Ii2dk7WNr8tzj7+WZnGbNqcIp6+aBnkQy5p3v7uM/4mBTfd3tsLRkehPonhCfDaNrUN9p4YGBodqrdo6pube4fwWVdsW7k+x0VcibwqpgZwTHdfg50ILDytvR2DIyODg2MD/QMnxnV6+n5KCkvYLy6PY2tRDvaazGodwhbD6Y1/+DW59Z4BwWSc3HMPIKYoslx4BzPyUKqtlEijZZrO/vZTF6+2TpzGwbVtd7CHb3Cwz5LgmJytCTkZ2WFZ82PnI26E4/+0vyms8ohNmA3XI3EG+aQ26+CAddCqtgx2jo9b8IDr7V23JCgnPruM0h5QqW6AIOtK39uhGxkYawc91T82fmpALynCjxdAEDmS96xJ0oazWiU2GiaX/uHXH4Mxeg7k93+6v/3Gje3HXnmNnhvwPLKA3IjBU2YwrfLBsQtdFy9eaD81uikrcXZ8fGy8j2/wgiV+a9OD03esC4+b7+83w+HvK9c93d1C6SQdWl5JfUSdedBqHTrf34t89/jA11dsxf8wLgV7nQJSSb4wgAPG4nganRroP3HqRP+JibGJNvJxMCmkqoLLRmBlMOVJTBQKUEbPgfzyDw8fbm7RPlnzGAm81wKe2jhTgjskMtCyy6LoQPX4hYmLZzqGxkZsRgl88VNi3XzXOnl9NSrtq4v8Fvm6Ofxdteg0OOGuDUvFZsZeJkPVNnxiYGCg/yLkB4PX+t/8ztawdMhEoEn4axw9ZJT3JI+OjfePYUawtE4t3ThVvEIWCjghdLyB/jL5PEGB8RQIheJBa1XNUEfXg0ePTx7bkzvbhVpcz2I0SPsNTYpWGypfT106066WtfbRoEEPSAyPDfWMsp/lOcN/1iwUIzjY/0Plukf6MnHR061cpu9r6SU/YWzT8f6vj725Yv7sBLxXMB/PVxV+ZazUr+zpsQ6ODp/qP2EF+Tkwfub85lvUgqfc/fGLrZs8/9vPP8aT7xkQEMIPHz+4WlJcX9M8NHbx/MQjzAgdF7JL7l/ZtucxUmLCtra1tcsunRpp77LxGEZaHiRVEJ25O9gRWRl+s4Pq/e8UA55QDCSkiHFlU+bnOt2tydHxE+RITV765u7dYWGJuQGUMzoOrh58kaHPzkTqwTrc22vtHx/oPYWzd3xw67KnZTjkV/nwzd9+/tl74L+eAfnVH//0cOOaC9X16KA/1EzemE8e3X/ltaKA2SlQjj+PwokV2ezEpMzVy5I1nWNa9GExSnJxWpB6K18nR7svT7vBZDk4p4wa5dQW0en6enVmq9k8+Oa3tnh5xc7GbY5/JiY4yMjuyczJSc9aqYc7UvnAgLW394R5/PXXt+VEBEyt9gL9qpu/uU21TnsK5ONf/+HVV8+3GrndULIM4bt/oNc6evVWmzgXRQmzfVxgAUknosany9JldnhSapvagLZkBomNy82lACYmBn553wWsOUf/uOzs9GxqzeAbP/W2SnPlpH6Fbt1bXl5uQRG4OshWB0pg6cnIyF6ZhUxMRmWPuVI3CMzDg8OD5qwsn2WE0+y5PHkTIDCeAvn4l7999dWlF8x84trBUQAEDvdLZ071qqzDlVwAEcf7zI7FpCSQoxs4SIOFhPC41Gw1G92uDMsYEvp+CkhCbJDXrC+fkq9E+WUt8cvIrsyOqVRhG+vRPaOnEiIWvTjdy9vRN0Gc8PQcyCjL1utzcpZkrU9zS0vKKINkx2weNqv0aIa2Erzm/MrhVbc/vU4V+00Bee8zTMXS819XaJSkne0+YcjemgGSTrg0fmlUF5BRxkUcGhDv5uMeGh+PZzc2AiRKBUUZfu4+EVkZTPh3RafMplNbiO5SFOH7L4p7puP4dV+0JSdrCT5LBg4nrB9yDuMcy50d7u4VFB6bXZaRQbY5eTCvCA7y8PNyj1usysCf6dEP9wyXYdebdTk5l1FRfQ4VWdQAI/nZ57/95PyFZJAPVtQuG/gCJk1YaGg8PXCq88wp7ClEmHTE1EUB0LtFuYXDP3F+ggveTAXx8I8P9AhKSinnmgoioIfD38aB4BIe6vXljhx4YM1w8Izy8loftDYsKx1AsKmJlI2w0qD20OwrLiMnK6MyOzMnIzNuiZu/s1NUVFpadg75g5i/SnLHDw/rN6AIlhpUv7FPP//d7yatOkm52jJwYkBrtig0/JCmaJdSEXoRTpjHT/RLBhEIoMInD8ctGHaPSFdYxscGzw4HN+UWmubl5pG4TAyX98TQwNDA+YnBifNjY9H4fPq/7osE20289JcsjsgoA18oTnEpp7j13IDwONdF6Uv8VubkBK9cssR9UZQTzFac0tat39pTRs4xLELsHeDBG5+CgYLF2zdvTlr15SAfkO8GhKHxweQajUU1b05IHaOUdauxT2Np7zAb2oxclJ7l4ZCK9/J29pgR5ecT5B7qEx8bE+fu6+4aGJsi5uZycVZ5uKLVla+P2yx3u39boztrloPrIt8kLg6ovIKE8JTZUzcCHca1pHBsrV+615Ili9wputLJyT1sSbZy6pSjhh63I4CAGl616vJwTigCHpeUIkTmTOj6B6Aigq/pavBSIbRCEU3eZlDLGzc1hhD2uwhri45d7OUKFb/nAjdvN59Qfy83ZyfwVkGJZFUUwEHe2R71Yp4L0PTq35dSOpCQC9usCAsqPjQ8AJc0BQQHhZOn+9pFi7z80GuRol/ct2zZvcKirgSOsmcXS8+GFd/97kps3rwiemJkZKQP1rWyEib/mBLLkEzRnrxi7eJ5tEII5kQGNsSzNls0GyEiunlR90YwcKBJE1yCvNyi7PzdsUw8Yl2KSCVUQKwXUuuQaAHGf2Tf5B345+au7rVpKIqbNDcxbT6bJkvXpm3WZGs73erW+ZFJq7SIFUZxIFhwVV98U/ELrIionYL6oOCDomBhiAo++OCjCCuoRaQI/kX+0vntFKrgPE99aJp7eu8999xzfud38A9AoIhpZsaH+jb9dN6dZmle1AknMytAblI/eKDxor3kuyx9HZYre6sRoHfC2eJiE3sXJV5K2HS2ThbOoxb+6tNHV54+ejnnziQ3FpqXHhy/DtzXidHJrZMnQZzZ6hNWZZ2InuP805mlOIllGdwzaE5DsAp5l6G4xjED0UwOJ4b6YGg8mUplVprT4bACqJ42DPwnKxB6UHbVq6WdMNK+IsstxE4q2xRenB52psDC5jOlO6YkiZpVKIAc8eLT+1fuXX4+v304khq5ANA/FLmIcF5yNNY6g+8fxdnTTJjaSnt5KoBrBYe5watIHDPSr+ZRmQE5ycfwpL8oHUlVYQl9hzgbT+ksvJtvcvRGNFGe6yy97dxY9I/Idntvw7OxiiUfGukPq5gVVJUPRTfsSMdO3r12+8LNU+W9YkixkjC/ffpssHKNTBaKKNbye3kNnXZMjmOYL+UG/U+0zy8MPYYyeY0MVl4luWNB+AvjcW2a5VOozIU7F3QQK/5eYba+0Nh0u9tbXoK9gpdS2ry7TgJE1TJw1xCgaDYzcTNEOHFY2DC6a/TKyNaJ9OYZddpCT4CpTwQQF2LFUjJxrrkIRY4HE0VB/bm4RRUSwSAOmTFTDQxIMzmdRYe9bF6CtQ5IUj4/PlV0HPG7I4hGqUxpfqrVefOsDYLDXqdXbizUZHodBZQFoixX0TVhETl920dQWKmUu2EkuU3arkiiLUoFVPT2s1bIjk5uTDvFcZS0NafQg2smRH6mn5DDTiI45mj+CAYSRpXiGpqxhBgGP8ObcVzEUppNvlOE8HZ+qvi21+12um+X33Tf72vYdYKtKeZbN57ee/xw6eodN6XJhCKyqqpuIupGuYjOsTyHDkxAF8KCXL+4PubMhh03G0TdZzjpiIJMViHSCClaXDMHp2ikWFZlQ594emhqWtIFUyIY0rcHDq+NDS0udZ69ufHhdXfpfef1Ia9OKLw1Gq888WMq7W45L7As7CcJBHjPFhAOlAnPMIo1MQJidoQmjjXPubOmqaW98WQio0XDmryaXaIotK/8I951vJumvpBysawhczxP0d/d70U3Hk62273lLq7BlcMHjxxZqAd8UyHV9tx+333Sad86PCeE6C8cyDkDQHakxlnNtdJngqCaugSYkTubUgUTiydiabyuE+aXjDMM9ffU2FhiPxBTE13VxFSmgsD7G4y6PH8IehDG19CIhg+86z3rFdpjQu0zOIzyS5g/LRRTUWIxcEeDY2gkNmF5BjynqGBrPMuiJfu/FZAecgEhP/P4cfLZpkZlrrr/yEHPoPvLgNcWDu7vzne2Vy1tFUIshkePy3Shda714FbBjQ0nREIzHGcbMhJP/1wo+AliWM9vmdjxav9cuVyqLdQMOfDJiZYX6o3d8zMhbzW6TpoQz5pNxnacGT2fFqLbcwArYb65dTz28hpIQFaMkDthVcp7qntrpYiXq39xgXKiUVNqdYMlzGqFdawd3r1hdNvZ0vmCouoe059JOAxrogcN8xNQBNfeWd2DvFhV9wPiX/eUAf/lVyBQOFG2vjk6OxnZOCwwBoGdWkuBoSWeJ8hWdcZWakb9x2gfhPpl932iC2LU0iNRI0fT+Km1FSqXs416zfYMXf8Jg0v93giKRkhQONBi4Kxec6FYojNQQSYsydGBQSaTcDTxZCIb2Of/gdCwl2DqCCAUPqDBwfD9vUFgDP4LwfBZbIU/7HCLB/+L+fjsBv0Hi3xFPgJkLWOKUmW1EwAAAABJRU5ErkJggg==) no-repeat center center;background-size:contain;opacity:.8;z-index:1000;animation:glow 3s infinite ease-in-out}@keyframes glow{0%,to{opacity:.8}50%{opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
1925
- }
1926
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LucesNavidadComponent, decorators: [{
1927
- type: Component,
1928
- args: [{ selector: 'jvs-luces-navidad, [jvsLucesNavidad]', imports: [
1929
- NgIf,
1930
- NgForOf
1931
- ], template: "<ng-container *ngIf=\"forzarMuestra || (mesActual == 12 && enProduccion)\">\n <ul class=\"lightrope\">\n <li *ngFor=\"let e of [].constructor(100); let i = index\"></li>\n </ul>\n <div class=\"christmas-tree\"></div>\n</ng-container>\n", styles: [".lightrope{left:0;text-align:center;white-space:nowrap;overflow:hidden;position:absolute;z-index:1000;margin:-8px 0 0;padding:0;pointer-events:none;width:100%}.lightrope li{position:relative;animation-fill-mode:both;animation-iteration-count:infinite;list-style:none;padding:0;width:6px;height:14px;border-radius:50%;margin:10px;display:inline-block;background:#00f7a5;box-shadow:0 2.3333333333px 12px 1px #00f7a5;animation-name:flash-1;animation-duration:2s}.lightrope li:nth-child(odd){background:#0ff;box-shadow:0 2.3333333333px 12px 1px #00ffff80;animation-name:flash-2;animation-duration:.4s}.lightrope li:nth-child(4n+2){background:#f70094;box-shadow:0 2.3333333333px 12px 1px #f70094;animation-name:flash-3;animation-duration:1.1s}.lightrope li:nth-child(odd){animation-duration:1.8s}.lightrope li:nth-child(3n+1){animation-duration:1.4s}.lightrope li:before{content:\"\";position:absolute;background:#222;width:4px;height:4.6666666667px;border-radius:3px;top:-2.3333333333px;left:1px}.lightrope li:after{content:\"\";top:-7px;left:3px;position:absolute;width:32px;height:9.3333333333px;border-bottom:solid #222 2px;border-radius:50%}.lightrope li:last-child:after{content:none}.lightrope li:first-child{margin-left:-20px}@keyframes flash-1{0%,to{background:#00f7a5;box-shadow:0 2.3333333333px 12px 1px #00f7a5}50%{background:#00f7a566;box-shadow:0 2.3333333333px 12px 1px #00f7a533}}@keyframes flash-2{0%,to{background:#0ff;box-shadow:0 2.3333333333px 12px 1px #0ff}50%{background:#0ff6;box-shadow:0 2.3333333333px 12px 1px #0ff3}}@keyframes flash-3{0%,to{background:#f70094;box-shadow:0 2.3333333333px 12px 1px #f70094}50%{background:#f7009466;box-shadow:0 2.3333333333px 12px 1px #f7009433}}.christmas-tree{position:fixed;bottom:20px;left:20px;width:80px;height:120px;background:url(data:image/png;base64,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) no-repeat center center;background-size:contain;opacity:.8;z-index:1000;animation:glow 3s infinite ease-in-out}@keyframes glow{0%,to{opacity:.8}50%{opacity:1}}\n"] }]
1932
- }], ctorParameters: () => [], propDecorators: { enProduccion: [{
1933
- type: Input
1934
- }], forzarMuestra: [{
1935
- type: Input
1936
- }] } });
1937
-
1938
- class MatSuffixSearchButtonComponent {
1939
- fControl;
1940
- eventLimpiar = new EventEmitter();
1941
- eventBuscar = new EventEmitter();
1942
- get control() {
1943
- return this.fControl;
1944
- }
1945
- emitirClick() {
1946
- if (this.control.value) {
1947
- this.control.reset();
1948
- this.eventLimpiar.emit(true);
1949
- }
1950
- else {
1951
- this.eventBuscar.emit(true);
1952
- }
1953
- }
1954
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatSuffixSearchButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1955
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: MatSuffixSearchButtonComponent, isStandalone: true, selector: "div[matSuffix][matSuffixSearchButton]", inputs: { fControl: "fControl" }, outputs: { eventLimpiar: "eventLimpiar", eventBuscar: "eventBuscar" }, host: { classAttribute: "flex items-center justify-start" }, ngImport: i0, template: "<button matRipple type=\"button\" class=\"boton-circular-gris\"\n (click)=\"emitirClick(); $event.preventDefault();\"\n>\n <mat-icon [svgIcon]=\"(control.value ? 'roundCancel' : 'roundSearch')\" class=\"icon-xs\"></mat-icon>\n</button>\n", dependencies: [{ kind: "directive", type: MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
1956
- }
1957
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatSuffixSearchButtonComponent, decorators: [{
1958
- type: Component,
1959
- args: [{ selector: 'div[matSuffix][matSuffixSearchButton]', imports: [
1960
- MatRipple,
1961
- MatIcon
1962
- ], host: {
1963
- class: 'flex items-center justify-start',
1964
- }, template: "<button matRipple type=\"button\" class=\"boton-circular-gris\"\n (click)=\"emitirClick(); $event.preventDefault();\"\n>\n <mat-icon [svgIcon]=\"(control.value ? 'roundCancel' : 'roundSearch')\" class=\"icon-xs\"></mat-icon>\n</button>\n" }]
1965
- }], propDecorators: { fControl: [{
1966
- type: Input,
1967
- args: [{ required: true }]
1968
- }], eventLimpiar: [{
1969
- type: Output
1970
- }], eventBuscar: [{
1971
- type: Output
1972
- }] } });
1973
-
1974
- class MenuComponent {
1975
- cssBoton;
1976
- title;
1977
- disabled = false;
1978
- itemSeleccion;
1979
- menu = [];
1980
- action = new EventEmitter();
1981
- matmenus;
1982
- menuItems = [];
1983
- yet = false;
1984
- _submenus = []; // 🔥 Tipo explícito como Array de Array de BotonMenu
1985
- get submenus() {
1986
- return this._submenus.filter(() => true); // Mantiene la estructura, aunque no hace filtro real
1987
- }
1988
- ngOnInit() {
1989
- this.createSubmenus(this.menu, 's0', 1);
1990
- this.reindex();
1991
- }
1992
- ngAfterViewInit() {
1993
- // Previene errores de Angular al repintar el menú
1994
- setTimeout(() => {
1995
- this.yet = true;
1996
- });
1997
- }
1998
- onClick(value) {
1999
- this.action.emit(value);
2000
- }
2001
- getMenu(index) {
2002
- return index >= 0 && this.matmenus ? this.matmenus.get(index) ?? null : null;
2003
- }
2004
- reindex() {
2005
- // Asigna el índice del ítem del menú
2006
- this._submenus.forEach((menu) => {
2007
- menu.forEach((item) => {
2008
- if (item.idxOpcionCalc !== -1) {
2009
- item.idxOpcionCalc = this.menuItems.indexOf(item.valorSeleccion ?? '');
2010
- }
2011
- });
2012
- });
2013
- }
2014
- createSubmenus(menu, prefix, count) {
2015
- this.menuItems.push(prefix);
2016
- this._submenus.push(menu.map((item, index) => ({
2017
- ...item,
2018
- valorSeleccion: item.subItems ? `${prefix}${index}` : item.valorSeleccion,
2019
- idxOpcionCalc: item.subItems ? 0 : -1,
2020
- })));
2021
- // Llamada recursiva para crear submenús
2022
- menu.forEach((item, index) => {
2023
- if (item.subItems) {
2024
- this.createSubmenus(item.subItems, `${prefix}${index}`, count + 1);
2025
- }
2026
- });
2027
- }
2028
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2029
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: MenuComponent, isStandalone: true, selector: "jvs-menu", inputs: { cssBoton: "cssBoton", title: "title", disabled: "disabled", itemSeleccion: "itemSeleccion", menu: "menu" }, outputs: { action: "action" }, viewQueries: [{ propertyName: "matmenus", predicate: MatMenu, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"yet\">\n <button matRipple [matMenuTriggerFor]=\"matmenus.first\"\n [disabled]=\"disabled\"\n type=\"button\" [class]=\"cssBoton ?? 'boton-circular boton-circular-red border-0'\"\n (click)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\n [matTooltip]=\"title\"\n >\n <ng-content></ng-content>\n </button>\n</ng-container>\n\n<!--<pre class=\"text-indigo-900\">{{_submenus | json}}</pre>-->\n<ng-container *ngFor=\"let menu of _submenus\">\n <!--<pre class=\"text-red-700\">{{menu | json}}</pre>-->\n <mat-menu xPosition=\"before\" yPosition=\"below\" class=\"max-w-none\">\n <ng-container *ngFor=\"let item of menu\">\n <!--<pre *ngIf=\"menu$\" class=\"text-orange-700\">{{item | json}}</pre>-->\n <!--<span>{{ [item.label, item.idxOpcionCalc!=-1 , yet , (!item.esVisible || item.esVisible({itemMenu: item, archivo: itemSeleccion})), [!item.esVisible , (item.esVisible ? item.esVisible({itemMenu: item, archivo: itemSeleccion}) : 'NO HAY')]] | json }}</span>-->\n <button mat-menu-item *ngIf=\"item.idxOpcionCalc!=-1 && yet && (!item.esVisible || item.esVisible({itemMenu: item, archivo: itemSeleccion}))\"\n class=\"flex items-center justify-items-center uppercase w-full rounded-none px-2 \"\n [matMenuTriggerFor]=\"getMenu(item.idxOpcionCalc)\">\n <mat-icon *ngIf=\"item.icono\"\n class=\"flex-none flex items-center justify-center !text-red-700 !mr-1 icon-2xs\"\n [svgIcon]=\"item.icono ?? 'fa5sFileSignature'\"\n ></mat-icon>\n <span class=\"grow text-2xs\" [innerHTML]=\"item.label\">{{item.label}}</span>\n </button>\n <button mat-menu-item *ngIf=\"item.idxOpcionCalc==-1 && (!item.esVisible || item.esVisible(item))\" (click)=\"onClick(item.valorSeleccion)\"\n class=\"flex items-center justify-items-center uppercase w-full rounded-none px-2 \"\n >\n <mat-icon *ngIf=\"item.icono\"\n class=\"flex-none flex items-center justify-center !text-red-700 !mr-1 icon-2xs\"\n [svgIcon]=\"item.icono ?? 'fa5sFileSignature'\"\n ></mat-icon>\n <span class=\"grow text-2xs\" [innerHTML]=\"item.label\">{{item.label}} </span>\n </button>\n\n </ng-container>\n </mat-menu>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
2030
- }
2031
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuComponent, decorators: [{
2032
- type: Component,
2033
- args: [{ selector: 'jvs-menu', standalone: true, imports: [
2034
- CommonModule,
2035
- MatMenuModule,
2036
- MatIconModule,
2037
- MatRippleModule,
2038
- MatTooltipModule,
2039
- ], template: "<ng-container *ngIf=\"yet\">\n <button matRipple [matMenuTriggerFor]=\"matmenus.first\"\n [disabled]=\"disabled\"\n type=\"button\" [class]=\"cssBoton ?? 'boton-circular boton-circular-red border-0'\"\n (click)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\n [matTooltip]=\"title\"\n >\n <ng-content></ng-content>\n </button>\n</ng-container>\n\n<!--<pre class=\"text-indigo-900\">{{_submenus | json}}</pre>-->\n<ng-container *ngFor=\"let menu of _submenus\">\n <!--<pre class=\"text-red-700\">{{menu | json}}</pre>-->\n <mat-menu xPosition=\"before\" yPosition=\"below\" class=\"max-w-none\">\n <ng-container *ngFor=\"let item of menu\">\n <!--<pre *ngIf=\"menu$\" class=\"text-orange-700\">{{item | json}}</pre>-->\n <!--<span>{{ [item.label, item.idxOpcionCalc!=-1 , yet , (!item.esVisible || item.esVisible({itemMenu: item, archivo: itemSeleccion})), [!item.esVisible , (item.esVisible ? item.esVisible({itemMenu: item, archivo: itemSeleccion}) : 'NO HAY')]] | json }}</span>-->\n <button mat-menu-item *ngIf=\"item.idxOpcionCalc!=-1 && yet && (!item.esVisible || item.esVisible({itemMenu: item, archivo: itemSeleccion}))\"\n class=\"flex items-center justify-items-center uppercase w-full rounded-none px-2 \"\n [matMenuTriggerFor]=\"getMenu(item.idxOpcionCalc)\">\n <mat-icon *ngIf=\"item.icono\"\n class=\"flex-none flex items-center justify-center !text-red-700 !mr-1 icon-2xs\"\n [svgIcon]=\"item.icono ?? 'fa5sFileSignature'\"\n ></mat-icon>\n <span class=\"grow text-2xs\" [innerHTML]=\"item.label\">{{item.label}}</span>\n </button>\n <button mat-menu-item *ngIf=\"item.idxOpcionCalc==-1 && (!item.esVisible || item.esVisible(item))\" (click)=\"onClick(item.valorSeleccion)\"\n class=\"flex items-center justify-items-center uppercase w-full rounded-none px-2 \"\n >\n <mat-icon *ngIf=\"item.icono\"\n class=\"flex-none flex items-center justify-center !text-red-700 !mr-1 icon-2xs\"\n [svgIcon]=\"item.icono ?? 'fa5sFileSignature'\"\n ></mat-icon>\n <span class=\"grow text-2xs\" [innerHTML]=\"item.label\">{{item.label}} </span>\n </button>\n\n </ng-container>\n </mat-menu>\n</ng-container>\n" }]
2040
- }], propDecorators: { cssBoton: [{
2041
- type: Input
2042
- }], title: [{
2043
- type: Input
2044
- }], disabled: [{
2045
- type: Input
2046
- }], itemSeleccion: [{
2047
- type: Input
2048
- }], menu: [{
2049
- type: Input
2050
- }], action: [{
2051
- type: Output
2052
- }], matmenus: [{
2053
- type: ViewChildren,
2054
- args: [MatMenu]
2055
- }] } });
2056
-
2057
- function generarArbol(lista, campoId, campoIdPadre, idPadre = null, strChildren = 'hijos') {
2058
- const node2 = [];
2059
- lista.filter(n => n[campoIdPadre] === idPadre).forEach(n => {
2060
- n[strChildren] = generarArbol(lista, campoId, campoIdPadre, n[campoId], strChildren);
2061
- node2.push(n);
2062
- });
2063
- return node2;
2064
- }
2065
-
2066
- class ListaArbolComponent {
2067
- listaSuscription;
2068
- nombreColeccion;
2069
- checkbox = false;
2070
- expandirRecursivo = false;
2071
- checkboxSeleccionados = [];
2072
- campoId;
2073
- campoIdPadre;
2074
- campoStr;
2075
- strHijoContainer = 'hijos';
2076
- menuContextual;
2077
- classSeleccionado = ['bg-primary-activo', 'text-primary', 'dark:!bg-primary-dark-activo'];
2078
- classAnulado = ['line-through', 'text-red', 'italic'];
2079
- campoAnulado;
2080
- templateTxtData;
2081
- condicionMostrar;
2082
- condicionesClaseFila = () => [];
2083
- set selectionModel(val) {
2084
- this.objSeleccionado = val;
2085
- }
2086
- selectionModelChange = new EventEmitter();
2087
- seleccionado = new EventEmitter();
2088
- listaCheck = new EventEmitter();
2089
- listaCheckObj = new EventEmitter();
2090
- _idTabla = [];
2091
- get idTabla() {
2092
- return this._idTabla;
2093
- }
2094
- set idTabla(val) {
2095
- if (Array.isArray(val)) {
2096
- this._idTabla = val;
2097
- }
2098
- else {
2099
- this._idTabla.push(val);
2100
- }
2101
- }
2102
- get buscarItemSeleccionado() {
2103
- const dRet = this.listaOriginal.find(itm => this._seleccionado === this.propiedadSeleccion(itm));
2104
- return dRet ?? null;
2105
- }
2106
- get objSeleccionado() {
2107
- return this.buscarItemSeleccionado; // ?? this.objThis?.['seleccionados']?.[this.nombreColeccion];
2108
- }
2109
- set objSeleccionado(val) {
2110
- this.seleccionarItem(val, true);
2111
- }
2112
- chkLista = new DataModel$1();
2113
- listaMuestraArbol = [];
2114
- listaOriginal = [];
2115
- treeControl = new NestedTreeControl((node) => node[this.strHijoContainer]);
2116
- _seleccionado = {};
2117
- ngOnInit() {
2118
- this.listaSuscription.subscribe(res => {
2119
- if (res) {
2120
- this.listaOriginal = res;
2121
- const listaAs = generarArbol(res, this.campoId, this.campoIdPadre, null, this.strHijoContainer);
2122
- this.listaMuestraArbol = [];
2123
- setTimeout(() => {
2124
- this.listaMuestraArbol = listaAs;
2125
- }, 1);
2126
- if (this.checkbox) {
2127
- this.chkLista.agregarControles(res, this.campoId);
2128
- this.checkboxSeleccionados.forEach((chkSel) => {
2129
- this.chkLista.setState(chkSel[this.campoId], true);
2130
- });
2131
- this.emitirModeloCheck();
2132
- }
2133
- }
2134
- });
2135
- }
2136
- idTablaValor(data) {
2137
- if (data) {
2138
- if (this.idTabla.length < 1) {
2139
- return shortHash(JSON.stringify({ data, claseFinal: undefined }));
2140
- }
2141
- return this.idTabla.map(d => data[d]).join('-');
2142
- }
2143
- return '';
2144
- }
2145
- propiedadSeleccion(item) {
2146
- return `${this.nombreColeccion}_${this.idTablaValor(item)}`;
2147
- }
2148
- esSeleccionActual(item) {
2149
- return this._seleccionado === this.propiedadSeleccion(item);
2150
- }
2151
- seleccionarItem(item, forzado = false) {
2152
- const idItem = this.propiedadSeleccion(item);
2153
- console.warn(idItem);
2154
- if (forzado) {
2155
- this._seleccionado = idItem;
2156
- }
2157
- else {
2158
- this._seleccionado = this._seleccionado === idItem ? null : idItem;
2159
- }
2160
- this.selectionModelChange.emit(this.objSeleccionado);
2161
- this.seleccionado.emit(this.objSeleccionado);
2162
- }
2163
- hasChild = (_, node) => !!node[this.strHijoContainer] && node[this.strHijoContainer].length > 0;
2164
- opcMenu(v) {
2165
- // console.warn(v);
2166
- // console.warn(this.objSeleccionado);
2167
- const opAdic = { seccion: this.nombreColeccion };
2168
- opAdic['itemSeleccionado'] = this.objSeleccionado;
2169
- // v = {...v, ...opAdic};
2170
- // this.seleccionado.emit(v);
2171
- }
2172
- emitirModeloCheck() {
2173
- this.listaCheck.emit(this.chkLista.generarLista());
2174
- this.listaCheckObj.emit(this.chkLista.generarLista('object'));
2175
- }
2176
- cambiarPadre(checkActual, estado) {
2177
- const parentId = checkActual[this.campoIdPadre];
2178
- if (parentId) {
2179
- const padreAct = this.listaMuestraArbol.find((itm) => itm[this.campoId] == parentId);
2180
- if (padreAct) {
2181
- this.chkLista.setState(parentId, this.hijosActivos('checked', padreAct) || this.hijosActivos('indeterminate', padreAct));
2182
- this.cambiarPadre(padreAct, estado);
2183
- }
2184
- }
2185
- }
2186
- cambiarCheck(checkActual, estado) {
2187
- console.log(checkActual, estado);
2188
- if (this.hasChild(0, checkActual)) {
2189
- (this.treeControl.getChildren(checkActual) ?? []).forEach((vas) => {
2190
- this.cambiarCheck(vas, estado);
2191
- });
2192
- }
2193
- this.cambiarPadre(checkActual, estado);
2194
- this.chkLista.setState(checkActual[this.campoId], estado);
2195
- }
2196
- hijosActivos(tipo, checkActual) {
2197
- let totalHijos = 0;
2198
- let cantActivo = 0;
2199
- if (this.hasChild(0, checkActual)) {
2200
- (this.treeControl.getChildren(checkActual) ?? []).forEach((vas) => {
2201
- if (this.chkLista.getState(vas[this.campoId] + '')) {
2202
- cantActivo++;
2203
- }
2204
- totalHijos++;
2205
- });
2206
- }
2207
- switch (tipo) {
2208
- case 'checked':
2209
- return (cantActivo == totalHijos);
2210
- case 'indeterminate':
2211
- if (cantActivo == totalHijos) {
2212
- this.chkLista.setState(checkActual[this.campoId], true);
2213
- }
2214
- return ((cantActivo > 0) && (cantActivo != totalHijos));
2215
- }
2216
- return false;
2217
- }
2218
- classFila2(item) {
2219
- let clases = [];
2220
- if (this.campoAnulado && item[this.campoAnulado] === 1) {
2221
- clases = clases.concat(this.classAnulado);
2222
- }
2223
- if (item?.seleccionado) {
2224
- clases = clases.concat(this.classSeleccionado);
2225
- }
2226
- clases = clases.concat(this.condicionesClaseFila(item));
2227
- item.claseFinal = clases;
2228
- return clases;
2229
- }
2230
- classFila(item) {
2231
- let claseFinal = [];
2232
- if (this.campoAnulado && (item[this.campoAnulado] == 1)) {
2233
- claseFinal = claseFinal.concat(this.classAnulado);
2234
- }
2235
- if (this.objSeleccionado == item || this.esSeleccionActual(item)) {
2236
- claseFinal = claseFinal.concat(this.classSeleccionado);
2237
- }
2238
- claseFinal = claseFinal.concat(this.condicionesClaseFila(item));
2239
- item.claseFinal = claseFinal;
2240
- return claseFinal;
2241
- }
2242
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ListaArbolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2243
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ListaArbolComponent, isStandalone: true, selector: "jvs-lista-arbol", inputs: { listaSuscription: "listaSuscription", nombreColeccion: "nombreColeccion", checkbox: "checkbox", expandirRecursivo: "expandirRecursivo", checkboxSeleccionados: "checkboxSeleccionados", campoId: "campoId", campoIdPadre: "campoIdPadre", campoStr: "campoStr", strHijoContainer: "strHijoContainer", menuContextual: "menuContextual", classSeleccionado: "classSeleccionado", classAnulado: "classAnulado", campoAnulado: "campoAnulado", templateTxtData: "templateTxtData", condicionMostrar: "condicionMostrar", condicionesClaseFila: "condicionesClaseFila", selectionModel: "selectionModel", idTabla: "idTabla" }, outputs: { selectionModelChange: "selectionModelChange", seleccionado: "seleccionado", listaCheck: "listaCheck", listaCheckObj: "listaCheckObj" }, ngImport: i0, template: "<mat-tree [dataSource]=\"listaMuestraArbol\" [treeControl]=\"treeControl\">\n <mat-tree-node class=\"!pl-0 min-h-0\" *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [matTreeNodeToggleRecursive]=\"expandirRecursivo\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: false }\"></ng-container>\n </mat-tree-node>\n\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"flex flex-col trans-ease-out cursor-pointer\" matTreeNodeToggle [matTreeNodeToggleRecursive]=\"expandirRecursivo\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: true }\"></ng-container>\n <div class=\"pl-4\" [class.tree-invisible]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n </div>\n </mat-nested-tree-node>\n</mat-tree>\n\n<ng-template #liDat let-node=\"node\" let-nested=\"nested\">\n <div class=\"flex items-center gap-0 text-sm trans-ease-out cursor-pointer p-0 w-full\"\n (contextmenu)=\"menuContextual?.abrirMenuContextual($event, node); $event.preventDefault();\"\n (click)=\"seleccionarItem(node); opcMenu({ seccion: nombreColeccion, tipo: 'ver', item: node }); menuContextual?.cerrarMenuContextual();\"\n [ngClass]=\"classFila(node)\">\n <mat-icon *ngIf=\"!nested\"></mat-icon>\n <mat-icon *ngIf=\"nested\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'roundExpandMore' : 'roundChevronRight'\"></mat-icon>\n\n <mat-checkbox *ngIf=\"checkbox\"\n [(ngModel)]=\"chkLista.modelosChk[node[campoId]]\"\n [ngModelOptions]=\"{ standalone: true }\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"cambiarCheck(node, $event.checked); emitirModeloCheck()\"\n [checked]=\"nested ? hijosActivos('checked', node) : false\"\n [indeterminate]=\"nested ? hijosActivos('indeterminate', node) : false\">\n </mat-checkbox>\n\n <span *ngIf=\"!templateTxtData\" class=\"w-full\">{{ node[campoStr] }}</span>\n <ng-container *ngIf=\"templateTxtData\" [ngTemplateOutlet]=\"templateTxtData\"\n [ngTemplateOutletContext]=\"{ data: node, treeControl }\"></ng-container>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i3$2.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["matNestedTreeNode", "disabled", "tabIndex"], outputs: ["activation", "expandedChange"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i3$2.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i3$2.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i3$2.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i3$2.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i3$2.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i3$2.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5$1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }] });
2244
- }
2245
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ListaArbolComponent, decorators: [{
2246
- type: Component,
2247
- args: [{ selector: 'jvs-lista-arbol', standalone: true, imports: [
2248
- CommonModule,
2249
- FormsModule,
2250
- MatTreeModule,
2251
- MatIconModule,
2252
- MatCheckboxModule,
2253
- ], template: "<mat-tree [dataSource]=\"listaMuestraArbol\" [treeControl]=\"treeControl\">\n <mat-tree-node class=\"!pl-0 min-h-0\" *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [matTreeNodeToggleRecursive]=\"expandirRecursivo\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: false }\"></ng-container>\n </mat-tree-node>\n\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"flex flex-col trans-ease-out cursor-pointer\" matTreeNodeToggle [matTreeNodeToggleRecursive]=\"expandirRecursivo\">\n <ng-container [ngTemplateOutlet]=\"liDat\"\n [ngTemplateOutletContext]=\"{ node: node, nested: true }\"></ng-container>\n <div class=\"pl-4\" [class.tree-invisible]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </div>\n </div>\n </mat-nested-tree-node>\n</mat-tree>\n\n<ng-template #liDat let-node=\"node\" let-nested=\"nested\">\n <div class=\"flex items-center gap-0 text-sm trans-ease-out cursor-pointer p-0 w-full\"\n (contextmenu)=\"menuContextual?.abrirMenuContextual($event, node); $event.preventDefault();\"\n (click)=\"seleccionarItem(node); opcMenu({ seccion: nombreColeccion, tipo: 'ver', item: node }); menuContextual?.cerrarMenuContextual();\"\n [ngClass]=\"classFila(node)\">\n <mat-icon *ngIf=\"!nested\"></mat-icon>\n <mat-icon *ngIf=\"nested\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'roundExpandMore' : 'roundChevronRight'\"></mat-icon>\n\n <mat-checkbox *ngIf=\"checkbox\"\n [(ngModel)]=\"chkLista.modelosChk[node[campoId]]\"\n [ngModelOptions]=\"{ standalone: true }\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"cambiarCheck(node, $event.checked); emitirModeloCheck()\"\n [checked]=\"nested ? hijosActivos('checked', node) : false\"\n [indeterminate]=\"nested ? hijosActivos('indeterminate', node) : false\">\n </mat-checkbox>\n\n <span *ngIf=\"!templateTxtData\" class=\"w-full\">{{ node[campoStr] }}</span>\n <ng-container *ngIf=\"templateTxtData\" [ngTemplateOutlet]=\"templateTxtData\"\n [ngTemplateOutletContext]=\"{ data: node, treeControl }\"></ng-container>\n </div>\n</ng-template>\n" }]
2254
- }], propDecorators: { listaSuscription: [{
2255
- type: Input
2256
- }], nombreColeccion: [{
2257
- type: Input
2258
- }], checkbox: [{
2259
- type: Input
2260
- }], expandirRecursivo: [{
2261
- type: Input
2262
- }], checkboxSeleccionados: [{
2263
- type: Input
2264
- }], campoId: [{
2265
- type: Input
2266
- }], campoIdPadre: [{
2267
- type: Input
2268
- }], campoStr: [{
2269
- type: Input
2270
- }], strHijoContainer: [{
2271
- type: Input
2272
- }], menuContextual: [{
2273
- type: Input
2274
- }], classSeleccionado: [{
2275
- type: Input
2276
- }], classAnulado: [{
2277
- type: Input
2278
- }], campoAnulado: [{
2279
- type: Input
2280
- }], templateTxtData: [{
2281
- type: Input
2282
- }], condicionMostrar: [{
2283
- type: Input
2284
- }], condicionesClaseFila: [{
2285
- type: Input
2286
- }], selectionModel: [{
2287
- type: Input
2288
- }], selectionModelChange: [{
2289
- type: Output
2290
- }], seleccionado: [{
2291
- type: Output
2292
- }], listaCheck: [{
2293
- type: Output
2294
- }], listaCheckObj: [{
2295
- type: Output
2296
- }], idTabla: [{
2297
- type: Input,
2298
- args: [{ required: true }]
2299
- }] } });
2300
-
2301
- // export {};
2302
- // import './src/styles.scss';
2303
-
2304
- /**
2305
- * Generated bundle index. Do not edit.
2306
- */
2307
-
2308
- export { DialogFlotanteComponent, ListaArbolComponent, LucesNavidadComponent, MatSuffixSearchButtonComponent, MenuComponent, ProgressBarComponent, TablaMantenimientoComponent, TablaMantenimientoService };
2309
- //# sourceMappingURL=jvsoft-components.mjs.map