@jvsoft/components 0.0.2

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 (51) hide show
  1. package/README.md +63 -0
  2. package/dialog-flotante/dialog-flotante.component.d.ts +32 -0
  3. package/dialog-flotante/dialog-flotante.interface.d.ts +11 -0
  4. package/dialog-flotante/index.d.ts +5 -0
  5. package/dialog-flotante/public-api.d.ts +1 -0
  6. package/fesm2022/jvsoft-components-dialog-flotante.mjs +119 -0
  7. package/fesm2022/jvsoft-components-dialog-flotante.mjs.map +1 -0
  8. package/fesm2022/jvsoft-components-luces-navidad.mjs +33 -0
  9. package/fesm2022/jvsoft-components-luces-navidad.mjs.map +1 -0
  10. package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs +47 -0
  11. package/fesm2022/jvsoft-components-mat-suffix-search-button.mjs.map +1 -0
  12. package/fesm2022/jvsoft-components-progress-spinner.mjs +78 -0
  13. package/fesm2022/jvsoft-components-progress-spinner.mjs.map +1 -0
  14. package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs +89 -0
  15. package/fesm2022/jvsoft-components-tabla-mantenimiento-components-progress-bar.mjs.map +1 -0
  16. package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs +1481 -0
  17. package/fesm2022/jvsoft-components-tabla-mantenimiento.mjs.map +1 -0
  18. package/fesm2022/jvsoft-components.mjs +1714 -0
  19. package/fesm2022/jvsoft-components.mjs.map +1 -0
  20. package/index.d.ts +5 -0
  21. package/luces-navidad/index.d.ts +5 -0
  22. package/luces-navidad/luces-navidad.component.d.ts +11 -0
  23. package/luces-navidad/public-api.d.ts +1 -0
  24. package/mat-suffix-search-button/index.d.ts +5 -0
  25. package/mat-suffix-search-button/mat-suffix-search-button.component.d.ts +12 -0
  26. package/mat-suffix-search-button/public-api.d.ts +1 -0
  27. package/package.json +53 -0
  28. package/progress-spinner/index.d.ts +5 -0
  29. package/progress-spinner/progress-spinner.component.d.ts +9 -0
  30. package/progress-spinner/progress-spinner.service.d.ts +25 -0
  31. package/progress-spinner/public-api.d.ts +2 -0
  32. package/src/styles.scss +3 -0
  33. package/tabla-mantenimiento/classes/data-model.d.ts +25 -0
  34. package/tabla-mantenimiento/components/progress-bar/index.d.ts +5 -0
  35. package/tabla-mantenimiento/components/progress-bar/progress-bar.component.d.ts +30 -0
  36. package/tabla-mantenimiento/components/progress-bar/public-api.d.ts +1 -0
  37. package/tabla-mantenimiento/index.d.ts +5 -0
  38. package/tabla-mantenimiento/interfaces/global/boton-mantenimiento.d.ts +41 -0
  39. package/tabla-mantenimiento/interfaces/global/columnas-tabla.d.ts +108 -0
  40. package/tabla-mantenimiento/interfaces/global/index.d.ts +3 -0
  41. package/tabla-mantenimiento/interfaces/global/otros.d.ts +26 -0
  42. package/tabla-mantenimiento/mat-row-keyboard-selection.directive.d.ts +19 -0
  43. package/tabla-mantenimiento/pipes/no-sanitize.pipe.d.ts +10 -0
  44. package/tabla-mantenimiento/pipes/zero-fill.pipe.d.ts +8 -0
  45. package/tabla-mantenimiento/public-api.d.ts +3 -0
  46. package/tabla-mantenimiento/tabla-mantenimiento-column-defs/tabla-mantenimiento-column-defs.component.d.ts +26 -0
  47. package/tabla-mantenimiento/tabla-mantenimiento-menu/tabla-mantenimiento-menu.component.d.ts +18 -0
  48. package/tabla-mantenimiento/tabla-mantenimiento.component.d.ts +143 -0
  49. package/tabla-mantenimiento/tabla-mantenimiento.functions.d.ts +5 -0
  50. package/tabla-mantenimiento/tabla-mantenimiento.service.d.ts +8 -0
  51. package/tabla-mantenimiento/table-util.d.ts +11 -0
@@ -0,0 +1,1714 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, Output, Input, Component, Injectable, Pipe, ViewChildren, Optional, ViewChild, HostListener, Directive, ElementRef, ContentChildren, HostBinding } from '@angular/core';
3
+ import { MatDialogTitle, MatDialogClose, MatDialogContent, MatDialogActions } from '@angular/material/dialog';
4
+ import * as i4 from '@angular/material/icon';
5
+ import { MatIcon, MatIconModule } from '@angular/material/icon';
6
+ import * as i2 from '@angular/common';
7
+ import { CommonModule, NgIf, NgTemplateOutlet, NgClass, DecimalPipe, NgForOf } from '@angular/common';
8
+ import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
9
+ import * as i5 from '@angular/material/core';
10
+ import { MatRipple, MatRippleModule } from '@angular/material/core';
11
+ import * as i6$1 from '@angular/material/divider';
12
+ import { MatDivider, MatDividerModule } from '@angular/material/divider';
13
+ import { MatProgressSpinner } from '@angular/material/progress-spinner';
14
+ import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
15
+ import { BehaviorSubject, Subject, takeUntil, of, fromEvent } from 'rxjs';
16
+ import * as i1 from '@angular/cdk/overlay';
17
+ import { __decorate } from 'tslib';
18
+ import * as i1$2 from '@angular/forms';
19
+ import { ReactiveFormsModule, FormsModule, Validators, FormControl, FormGroup } from '@angular/forms';
20
+ import * as i3 from '@angular/material/checkbox';
21
+ import { MatCheckboxModule } from '@angular/material/checkbox';
22
+ import * as i8 from '@angular/material/menu';
23
+ import { MatMenuModule } from '@angular/material/menu';
24
+ import * as i9 from '@angular/material/paginator';
25
+ import { MatPaginatorModule, MatPaginator, MAT_PAGINATOR_DEFAULT_OPTIONS } from '@angular/material/paginator';
26
+ import * as i6 from '@angular/material/sort';
27
+ import { MatSortModule, MatSort } from '@angular/material/sort';
28
+ import * as i12 from '@angular/material/table';
29
+ import { MatTableModule, MatColumnDef, MatTableDataSource, MatTable, MatFooterRow, MatRow } from '@angular/material/table';
30
+ import * as i7 from '@angular/material/tooltip';
31
+ import { MatTooltipModule } from '@angular/material/tooltip';
32
+ import shortHash from 'shorthash2';
33
+ import { untilDestroyed, UntilDestroy } from '@ngneat/until-destroy';
34
+ import { map, filter, take } from 'rxjs/operators';
35
+ import { trigger, state, transition, style, animate } from '@angular/animations';
36
+ import * as i1$1 from '@angular/platform-browser';
37
+ import * as i14 from '@angular/material/badge';
38
+ import { MatBadgeModule } from '@angular/material/badge';
39
+ import moment from 'moment';
40
+ import * as XLSX from 'xlsx';
41
+
42
+ class DialogFlotanteComponent {
43
+ cssClases = {};
44
+ _sinTitulo = false;
45
+ get sinTitulo() {
46
+ return !!this._sinTitulo;
47
+ }
48
+ set sinTitulo(val) {
49
+ this._sinTitulo = val == '';
50
+ }
51
+ _sinBarraDeAccion = false;
52
+ get sinBarraDeAccion() {
53
+ return !!this._sinBarraDeAccion;
54
+ }
55
+ set sinBarraDeAccion(val) {
56
+ this._sinBarraDeAccion = val == '';
57
+ }
58
+ defaultBtnCerrar = { label: 'CERRAR', class: 'text-gray-700 border-gray-700' };
59
+ _btnCerrar = this.defaultBtnCerrar;
60
+ get btnCerrar() {
61
+ return this._btnCerrar;
62
+ }
63
+ set btnCerrar(val) {
64
+ this._btnCerrar = (typeof val === 'string' && val !== '') ? { ...this.defaultBtnCerrar, label: val } :
65
+ (typeof val === 'boolean' && val) ? this.defaultBtnCerrar :
66
+ val ?? this.defaultBtnCerrar;
67
+ }
68
+ _btnCerrarBarra = true;
69
+ get btnCerrarBarra() {
70
+ return this._btnCerrarBarra;
71
+ }
72
+ set btnCerrarBarra(val) {
73
+ this._btnCerrarBarra = val || true;
74
+ }
75
+ defaultBtnGuardar = {
76
+ label: 'GUARDAR', class: 'text-blue-700 border-blue-700', icono: 'roundSave'
77
+ };
78
+ _btnGuardar = this.defaultBtnGuardar;
79
+ get btnGuardar() {
80
+ return this._btnGuardar;
81
+ }
82
+ set btnGuardar(val) {
83
+ console.log(val);
84
+ if (val == null || val === '') {
85
+ this._btnGuardar = this.defaultBtnGuardar;
86
+ }
87
+ else {
88
+ this._btnGuardar = (typeof val === 'string' && val !== '') ? { ...this.defaultBtnGuardar, label: val } :
89
+ (typeof val === 'boolean' && val) ? this.defaultBtnGuardar :
90
+ val ?? this.defaultBtnGuardar;
91
+ }
92
+ }
93
+ iconoTitulo;
94
+ matDialogRefActual;
95
+ btnGuardarClick = new EventEmitter();
96
+ btnCerrarClick = new EventEmitter();
97
+ guardarDialogo() {
98
+ this.btnGuardarClick.emit(true);
99
+ }
100
+ cerrarDialogo() {
101
+ this.btnCerrarClick.emit(true);
102
+ if (this.matDialogRefActual) {
103
+ if (this.matDialogRefActual.componentInstance?.validarCerrarDialog) {
104
+ this.matDialogRefActual.componentInstance?.validarCerrarDialog();
105
+ }
106
+ else {
107
+ this.matDialogRefActual.close('Cerrado GDLG');
108
+ }
109
+ }
110
+ }
111
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DialogFlotanteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
112
+ 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 py-2\">\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\" *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: ["@tailwind base;@tailwind components;@tailwind utilities;:host fieldset{@apply w-full sm:w-auto rounded-sm bg-transparent pt-0 pb-1 px-1 border;}:host fieldset legend{@apply px-2 font-bold border-0 bg-transparent;width:auto}:host .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-form-field{color:unset}:host .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}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { 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"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }] });
113
+ }
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DialogFlotanteComponent, decorators: [{
115
+ type: Component,
116
+ args: [{ selector: '[jvsDialogFlotante]', imports: [
117
+ CommonModule,
118
+ MatIcon, NgIf, NgTemplateOutlet, CdkDrag, MatDialogTitle, CdkDragHandle, MatDialogClose,
119
+ MatRipple, MatDivider, MatDialogContent, MatDialogActions, NgClass
120
+ ], host: {
121
+ class: 'jvs-dialog-flotante',
122
+ }, 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 py-2\">\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\" *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: ["@tailwind base;@tailwind components;@tailwind utilities;:host fieldset{@apply w-full sm:w-auto rounded-sm bg-transparent pt-0 pb-1 px-1 border;}:host fieldset legend{@apply px-2 font-bold border-0 bg-transparent;width:auto}:host .mat-mdc-dialog-title .mat-mdc-checkbox .mdc-form-field{color:unset}:host .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}\n"] }]
123
+ }], propDecorators: { cssClases: [{
124
+ type: Input
125
+ }], sinTitulo: [{
126
+ type: Input
127
+ }], sinBarraDeAccion: [{
128
+ type: Input
129
+ }], btnCerrar: [{
130
+ type: Input
131
+ }], btnCerrarBarra: [{
132
+ type: Input
133
+ }], btnGuardar: [{
134
+ type: Input
135
+ }], iconoTitulo: [{
136
+ type: Input
137
+ }], matDialogRefActual: [{
138
+ type: Input
139
+ }], btnGuardarClick: [{
140
+ type: Output
141
+ }], btnCerrarClick: [{
142
+ type: Output
143
+ }] } });
144
+
145
+ class ProgressSpinnerService {
146
+ overlay;
147
+ overlayRef = this.createOverlay();
148
+ _mensaje = new BehaviorSubject('');
149
+ mensaje$ = this._mensaje.asObservable();
150
+ _config = new BehaviorSubject({});
151
+ config$ = this._config.asObservable();
152
+ overlayActivo = false;
153
+ get configActual() {
154
+ return this._config.getValue();
155
+ }
156
+ set configActual(data) {
157
+ this._config.next(data);
158
+ }
159
+ constructor(overlay) {
160
+ this.overlay = overlay;
161
+ }
162
+ createOverlay() {
163
+ return this.overlay.create({
164
+ hasBackdrop: true,
165
+ positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically()
166
+ });
167
+ }
168
+ show(config) {
169
+ this.configActual = config ?? {};
170
+ if (!this.overlayActivo) {
171
+ this.overlayRef.attach(new ComponentPortal(ProgressSpinnerComponent));
172
+ this.overlayActivo = true;
173
+ }
174
+ }
175
+ hide(config, timeout = 1) {
176
+ this.configActual = config ?? {};
177
+ setTimeout(() => {
178
+ this.overlayRef.detach();
179
+ this.overlayActivo = false;
180
+ }, timeout * 1000); // Ajusta según sea necesario
181
+ }
182
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressSpinnerService, deps: [{ token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Injectable });
183
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressSpinnerService, providedIn: 'root' });
184
+ }
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressSpinnerService, decorators: [{
186
+ type: Injectable,
187
+ args: [{
188
+ providedIn: 'root'
189
+ }]
190
+ }], ctorParameters: () => [{ type: i1.Overlay }] });
191
+
192
+ class ProgressSpinnerComponent {
193
+ progresSpinnerService;
194
+ get configProgressSpiiner() {
195
+ return this.progresSpinnerService._config.getValue();
196
+ }
197
+ constructor(progresSpinnerService) {
198
+ this.progresSpinnerService = progresSpinnerService;
199
+ }
200
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressSpinnerComponent, deps: [{ token: ProgressSpinnerService }], target: i0.ɵɵFactoryTarget.Component });
201
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ProgressSpinnerComponent, isStandalone: true, selector: "jvs-progress-spinner", ngImport: i0, template: "<div class=\"overlay\" [style]=\"'background-color: ' + configProgressSpiiner?.fondoStyle\">\n <div class=\"flex flex-col justify-center items-center gap-2\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <div class=\"w-full\">{{ configProgressSpiiner?.mensaje }}</div>\n </div>\n\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;:host .overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffffb3;display:flex;justify-content:center;align-items:center;z-index:1000}\n"], dependencies: [{ kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
202
+ }
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressSpinnerComponent, decorators: [{
204
+ type: Component,
205
+ args: [{ selector: 'jvs-progress-spinner', imports: [
206
+ MatProgressSpinner
207
+ ], template: "<div class=\"overlay\" [style]=\"'background-color: ' + configProgressSpiiner?.fondoStyle\">\n <div class=\"flex flex-col justify-center items-center gap-2\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <div class=\"w-full\">{{ configProgressSpiiner?.mensaje }}</div>\n </div>\n\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;:host .overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#ffffffb3;display:flex;justify-content:center;align-items:center;z-index:1000}\n"] }]
208
+ }], ctorParameters: () => [{ type: ProgressSpinnerService }] });
209
+
210
+ class NoSanitizePipe {
211
+ domSanitizer;
212
+ constructor(domSanitizer) {
213
+ this.domSanitizer = domSanitizer;
214
+ }
215
+ transform(html) {
216
+ return this.domSanitizer.bypassSecurityTrustHtml(html);
217
+ }
218
+ 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 });
219
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: NoSanitizePipe, isStandalone: true, name: "noSanitize" });
220
+ }
221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: NoSanitizePipe, decorators: [{
222
+ type: Pipe,
223
+ args: [{ name: 'noSanitize' }]
224
+ }], ctorParameters: () => [{ type: i1$1.DomSanitizer }] });
225
+
226
+ class ZeroFillPipe {
227
+ transform(value, digitos, ...args) {
228
+ let s = value + '';
229
+ while (s.length < digitos) {
230
+ s = '0' + s;
231
+ }
232
+ return s;
233
+ }
234
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
235
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, isStandalone: true, name: "zeroFill" });
236
+ }
237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ZeroFillPipe, decorators: [{
238
+ type: Pipe,
239
+ args: [{
240
+ name: 'zeroFill',
241
+ }]
242
+ }] });
243
+ function zeroFill(value, digitos, ...args) {
244
+ return new ZeroFillPipe().transform(value, digitos, args);
245
+ }
246
+
247
+ class TablaMantenimientoColumnDefsComponent {
248
+ table;
249
+ cdRef;
250
+ objThis;
251
+ nombreColeccion;
252
+ colDetalle;
253
+ chkLista; // = new DataModel();
254
+ chkListaChange = new EventEmitter();
255
+ columnDef;
256
+ constructor(table, cdRef) {
257
+ this.table = table;
258
+ this.cdRef = cdRef;
259
+ console.log(this.chkLista);
260
+ // this.chkLista.checkbox.establecerTodos(true)
261
+ }
262
+ ngAfterContentInit() {
263
+ if (this.table) {
264
+ this.cdRef.detectChanges();
265
+ this.columnDef.forEach(refCol => {
266
+ this.table.addColumnDef(refCol);
267
+ });
268
+ }
269
+ }
270
+ trackByProperty(index, column) {
271
+ return column.property;
272
+ }
273
+ verTexto(row, campo, glue = ' ') {
274
+ if (typeof campo == 'string') {
275
+ return row[campo];
276
+ }
277
+ // console.log('CARGAR TEXTO');
278
+ let strFinal = '';
279
+ const arrFinal = [];
280
+ campo.forEach((c) => {
281
+ if (c.charAt(0) == '*') {
282
+ arrFinal.push(c.replace('*', ''));
283
+ }
284
+ else {
285
+ arrFinal.push((row[c] ?? '').toString().trim());
286
+ }
287
+ });
288
+ strFinal = arrFinal.join(glue);
289
+ return strFinal;
290
+ }
291
+ camposNulos(row, campos) {
292
+ let rpta = false;
293
+ campos.forEach(campo => {
294
+ if (!rpta && !row[campo]) {
295
+ rpta = true;
296
+ }
297
+ });
298
+ return rpta;
299
+ }
300
+ accionClick(column, item, event) {
301
+ if (column.click) {
302
+ column.click(item);
303
+ event.stopPropagation();
304
+ }
305
+ return false;
306
+ }
307
+ obtenerItems(columna, row) {
308
+ if (typeof columna.items === 'function') {
309
+ return columna.items(row);
310
+ }
311
+ return columna.items;
312
+ }
313
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoColumnDefsComponent, deps: [{ token: i12.MatTable, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
314
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.1.7", type: TablaMantenimientoColumnDefsComponent, isStandalone: true, selector: "jvs-tabla-mantenimiento-column-defs", inputs: { objThis: "objThis", nombreColeccion: "nombreColeccion", colDetalle: "colDetalle", chkLista: ["chkLista", "chkLista", (value) => WritableStream] }, outputs: { chkListaChange: "chkListaChange" }, viewQueries: [{ propertyName: "columnDef", 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\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\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 === 'text' || column.type === 'estiloEstablecido'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" >\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n <span *ngIf=\"column.type == 'estiloEstablecido'\" class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</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\" [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 <!--\t\t\t<span *ngIf=\"column.property && !column.textArray\">{{ row[column.property] }}</span>-->\n <!--\t\t\t<span *ngIf=\"column.property && column.textArray\">{{ verTexto(row, column.textArray) }}</span>-->\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : (column.textArray ? verTexto(row, column.textArray) : row[column.property])) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\" [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\" [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : (column.textArray ? verTexto(row, column.textArray) : row[column.property])), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n <span *ngIf=\"column.type == 'estiloEstablecido'\" class=\"text-red-900 font-bold\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </td>\n </ng-template>\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n </th>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'text_rows'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" > <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <p *ngFor=\"let fila of column.text_rows\" style=\"font: unset; letter-spacing: unset\">\n <ng-container *ngIf=\"row[fila.value]\">\n <ng-container *ngIf=\"fila.siCampoNulo && camposNulos(row, fila.siCampoNulo)\">\n <span [ngClass]=\"fila.cssLabelClasses\" *ngIf=\"fila.label\">{{ fila.label }}:</span><br *ngIf=\"fila.salto\">\n <ng-template [ngTemplateOutlet]=\"tipoDatoString\" [ngTemplateOutletContext]=\"{ fila: fila, tipo: fila.valueType || 'text', value: (fila.textArray ? verTexto(row, fila.textArray) : row[fila.value]), format: fila.valueFormat, class: fila.cssValueClasses }\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"!fila.siCampoNulo\">\n <span [ngClass]=\"fila.cssLabelClasses\" *ngIf=\"fila.label\">{{ fila.label }}:</span><br *ngIf=\"fila.salto\">\n <ng-template [ngTemplateOutlet]=\"tipoDatoString\" [ngTemplateOutletContext]=\"{ fila: fila, tipo: fila.valueType || 'text', value: (fila.textArray ? verTexto(row, fila.textArray) : row[fila.value]), format: fila.valueFormat, class: fila.cssValueClasses }\"></ng-template>\n </ng-container>\n </ng-container>\n </p>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'money'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" > <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" class=\"text-right\" mat-cell>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'money', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row, format: (column.format ?? '1.2-2') }\"></ng-template>\n </td>\n <td *matFooterCellDef class=\"text-right\" [ngClass]=\"column.cssFooterClasses\" mat-cell>\n\t\t\t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\" [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 </td>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'number'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" > <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n\t\t\t\t<span *ngIf=\"column.property && row[column.property]\" class=\"!text-indigo-900 font-semibold\">\n\t\t\t\t\t<span *ngIf=\"column.zeroFill\">{{ row[column.property] | zeroFill: column.zeroFill }}</span>\n\t\t\t\t\t<span *ngIf=\"!column.zeroFill\">{{ row[column.property] | number: (column.format ? column.format : '1.0-2') }}</span>\n\t\t\t\t</span>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'date'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" > <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell><span *ngIf=\"column.property\">{{ row[column.property] | date: (column.format ? column.format : 'dd/MM/yyyy') }}</span></td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'icon'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <ng-container [ngSwitch]=\"row[column.property]\">\n <ng-container *ngFor=\"let opc of column.opcSwitchIcon.casos\">\n <mat-icon *ngSwitchCase=\"opc.case\" [ngClass]=\"opc.cssClasses\" style=\"height: unset; width: unset;\" [svgIcon]=\"opc.icon\"\n [matTooltip]=\"opc.campoTooltip ? row[opc.campoTooltip] : (opc.tooltip ?? '')\" [matTooltipDisabled]=\"!opc.tooltip && !opc.campoTooltip\"\n class=\"icon-sm\"></mat-icon>\n </ng-container>\n <ng-container *ngIf=\"column.opcSwitchIcon.default\">\n <div *ngSwitchDefault></div>\n </ng-container>\n </ng-container>\n <span class=\"cdk-visually-hidden\">{{ row[column.property] }}</span>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'icon_checkbox'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" [ngClass]=\"column.headerCssClasses\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <mat-icon [svgIcon]=\"(row[column.property] == 1 ? 'checkboxChecked20Regular' : 'checkboxUnchecked20Regular' )\" class=\"icon-sm\"></mat-icon>\n <span class=\"cdk-visually-hidden\">{{ row[column.property] }}</span>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'progress'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" [ngClass]=\"column.headerCssClasses\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n<!-- <jvsoft-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) : undefined\"\n ></jvsoft-progress-bar>-->\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'buttons'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n\n <div class=\"flex\">\n <ng-container *ngFor=\"let field of column.fields\">\n <a *ngIf=\"field.href && row[field.campo]\"\n [href]=\"field.href.pre + row[field.campo]\"\n [target]=\"field.href.target ? field.href.target : '_self'\"\n [matTooltip]=\"row[field.campo]\"\n class=\"w-6 h-6 btn-rounded-30 {{field.class}}\"\n >\n <mat-icon [svgIcon]=\"field.icono\" class=\"icon-sm\"></mat-icon>\n </a>\n <a *ngIf=\"!field.fnClick && !field.href && row[field.campo]\"\n (click)=\"$event.stopPropagation()\"\n [matTooltip]=\"row[field.campo]\"\n class=\"w-6 h-6 btn-rounded-30 {{field.class}}\"\n >\n <mat-icon [svgIcon]=\"field.icono\" class=\"icon-sm\"></mat-icon>\n </a>\n <a *ngIf=\"field.fnClick && row[field.campo]\"\n (click)=\"objThis[field.fnClick](row, field.fnClickData); $event.stopPropagation()\"\n [matTooltip]=\"row[field.campo]\"\n class=\"w-6 h-6 btn-rounded-30 {{field.class}}\"\n >\n <mat-icon [svgIcon]=\"field.icono\" class=\"icon-sm\"></mat-icon>\n </a>\n </ng-container>\n </div>\n\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'icons'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\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;\"\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\" [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\" [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 <span class=\"cdk-visually-hidden\" *ngIf=\"column.innerHTMLInvisible\" [innerHTML]=\"column.innerHTMLInvisible(row)\"></span>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n </ng-container>\n\n\n</ng-container>\n\n<ng-template #tipoDatoString let-row=\"row\" let-fila=\"fila\" let-tipo=\"tipo\" let-value=\"value\" let-format=\"format\" let-clase=\"class\">\n <ng-container [ngSwitch]=\"tipo\">\n <ng-container *ngSwitchCase=\"'text'\"><span [ngClass]=\"clase\" *ngIf=\"value\" (click)=\"accionClick(fila, 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\" (click)=\"accionClick(fila, row, $event)\" >{{ value | date: (format || 'dd/MM/yyyy') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'number'\"><span [ngClass]=\"clase\" *ngIf=\"value\" (click)=\"accionClick(fila, 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(fila, row, $event)\" >{{ value | number: (format || '1.2-2') }}</span></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\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", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.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: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "directive", type: i12.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i12.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i12.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.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: "pipe", type: NoSanitizePipe, name: "noSanitize" }, { kind: "pipe", type: ZeroFillPipe, name: "zeroFill" }] });
315
+ }
316
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoColumnDefsComponent, decorators: [{
317
+ type: Component,
318
+ args: [{ selector: 'jvs-tabla-mantenimiento-column-defs', standalone: true, imports: [
319
+ CommonModule,
320
+ MatCheckboxModule,
321
+ MatIconModule,
322
+ MatRippleModule,
323
+ MatSortModule,
324
+ MatTableModule,
325
+ MatTooltipModule,
326
+ ReactiveFormsModule,
327
+ FormsModule,
328
+ NoSanitizePipe,
329
+ ZeroFillPipe,
330
+ ], 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\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\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 === 'text' || column.type === 'estiloEstablecido'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase text-center\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" >\n <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span>\n <span *ngIf=\"column.type == 'estiloEstablecido'\" class=\"text-red-900 font-bold bg-white\">CONFIGURAR ESTILO ESTABLECIDO</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\" [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 <!--\t\t\t<span *ngIf=\"column.property && !column.textArray\">{{ row[column.property] }}</span>-->\n <!--\t\t\t<span *ngIf=\"column.property && column.textArray\">{{ verTexto(row, column.textArray) }}</span>-->\n <ng-container *ngIf=\"column.text && column.text?.separador else campoTextNormal\">\n <div [class]=\"column.text?.cssContenedor\">\n <ng-container *ngFor=\"let itm of ((column.transformar ? column.transformar(row) : (column.textArray ? verTexto(row, column.textArray) : row[column.property])) ?? '').split(column.text.separador)\">\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\" [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\" [ngTemplateOutletContext]=\"{ fila: column, tipo: 'text', value: (column.transformar ? column.transformar(row) : (column.textArray ? verTexto(row, column.textArray) : row[column.property])), class: column.textCss, row: row }\"></ng-template>\n </ng-template>\n <span *ngIf=\"column.type == 'estiloEstablecido'\" class=\"text-red-900 font-bold\">CONFIGURAR ESTILO ESTABLECIDO</span>\n </td>\n </ng-template>\n <th *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" style=\"height: unset !important;\" mat-footer-cell [innerHTML]=\"column.transformarFooter ? column.transformarFooter() : ''\">\n </th>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'text_rows'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" > <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <p *ngFor=\"let fila of column.text_rows\" style=\"font: unset; letter-spacing: unset\">\n <ng-container *ngIf=\"row[fila.value]\">\n <ng-container *ngIf=\"fila.siCampoNulo && camposNulos(row, fila.siCampoNulo)\">\n <span [ngClass]=\"fila.cssLabelClasses\" *ngIf=\"fila.label\">{{ fila.label }}:</span><br *ngIf=\"fila.salto\">\n <ng-template [ngTemplateOutlet]=\"tipoDatoString\" [ngTemplateOutletContext]=\"{ fila: fila, tipo: fila.valueType || 'text', value: (fila.textArray ? verTexto(row, fila.textArray) : row[fila.value]), format: fila.valueFormat, class: fila.cssValueClasses }\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"!fila.siCampoNulo\">\n <span [ngClass]=\"fila.cssLabelClasses\" *ngIf=\"fila.label\">{{ fila.label }}:</span><br *ngIf=\"fila.salto\">\n <ng-template [ngTemplateOutlet]=\"tipoDatoString\" [ngTemplateOutletContext]=\"{ fila: fila, tipo: fila.valueType || 'text', value: (fila.textArray ? verTexto(row, fila.textArray) : row[fila.value]), format: fila.valueFormat, class: fila.cssValueClasses }\"></ng-template>\n </ng-container>\n </ng-container>\n </p>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'money'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" > <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" class=\"text-right\" mat-cell>\n <ng-template *ngIf=\"column.property\" [ngTemplateOutlet]=\"tipoDatoString\"\n [ngTemplateOutletContext]=\"{ fila: column, tipo: 'money', value: (column.transformar ? column.transformar(row) : row[column.property]), class: column.textCss, row: row, format: (column.format ?? '1.2-2') }\"></ng-template>\n </td>\n <td *matFooterCellDef class=\"text-right\" [ngClass]=\"column.cssFooterClasses\" mat-cell>\n\t\t\t\t<span *ngIf=\"column.transformarFooter\"\n [class.text-sky-700]=\"column.transformarFooter() >= 0\" [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 </td>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'number'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" > <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n\t\t\t\t<span *ngIf=\"column.property && row[column.property]\" class=\"!text-indigo-900 font-semibold\">\n\t\t\t\t\t<span *ngIf=\"column.zeroFill\">{{ row[column.property] | zeroFill: column.zeroFill }}</span>\n\t\t\t\t\t<span *ngIf=\"!column.zeroFill\">{{ row[column.property] | number: (column.format ? column.format : '1.0-2') }}</span>\n\t\t\t\t</span>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'date'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell mat-sort-header [disabled]=\"column.sort === false\" > <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell><span *ngIf=\"column.property\">{{ row[column.property] | date: (column.format ? column.format : 'dd/MM/yyyy') }}</span></td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'icon'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <ng-container [ngSwitch]=\"row[column.property]\">\n <ng-container *ngFor=\"let opc of column.opcSwitchIcon.casos\">\n <mat-icon *ngSwitchCase=\"opc.case\" [ngClass]=\"opc.cssClasses\" style=\"height: unset; width: unset;\" [svgIcon]=\"opc.icon\"\n [matTooltip]=\"opc.campoTooltip ? row[opc.campoTooltip] : (opc.tooltip ?? '')\" [matTooltipDisabled]=\"!opc.tooltip && !opc.campoTooltip\"\n class=\"icon-sm\"></mat-icon>\n </ng-container>\n <ng-container *ngIf=\"column.opcSwitchIcon.default\">\n <div *ngSwitchDefault></div>\n </ng-container>\n </ng-container>\n <span class=\"cdk-visually-hidden\">{{ row[column.property] }}</span>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n </ng-container>\n <ng-container *ngIf=\"column.type === 'icon_checkbox'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" [ngClass]=\"column.headerCssClasses\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n <mat-icon [svgIcon]=\"(row[column.property] == 1 ? 'checkboxChecked20Regular' : 'checkboxUnchecked20Regular' )\" class=\"icon-sm\"></mat-icon>\n <span class=\"cdk-visually-hidden\">{{ row[column.property] }}</span>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'progress'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" [ngClass]=\"column.headerCssClasses\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n<!-- <jvsoft-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) : undefined\"\n ></jvsoft-progress-bar>-->\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'buttons'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\n\n <div class=\"flex\">\n <ng-container *ngFor=\"let field of column.fields\">\n <a *ngIf=\"field.href && row[field.campo]\"\n [href]=\"field.href.pre + row[field.campo]\"\n [target]=\"field.href.target ? field.href.target : '_self'\"\n [matTooltip]=\"row[field.campo]\"\n class=\"w-6 h-6 btn-rounded-30 {{field.class}}\"\n >\n <mat-icon [svgIcon]=\"field.icono\" class=\"icon-sm\"></mat-icon>\n </a>\n <a *ngIf=\"!field.fnClick && !field.href && row[field.campo]\"\n (click)=\"$event.stopPropagation()\"\n [matTooltip]=\"row[field.campo]\"\n class=\"w-6 h-6 btn-rounded-30 {{field.class}}\"\n >\n <mat-icon [svgIcon]=\"field.icono\" class=\"icon-sm\"></mat-icon>\n </a>\n <a *ngIf=\"field.fnClick && row[field.campo]\"\n (click)=\"objThis[field.fnClick](row, field.fnClickData); $event.stopPropagation()\"\n [matTooltip]=\"row[field.campo]\"\n class=\"w-6 h-6 btn-rounded-30 {{field.class}}\"\n >\n <mat-icon [svgIcon]=\"field.icono\" class=\"icon-sm\"></mat-icon>\n </a>\n </ng-container>\n </div>\n\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n\n </ng-container>\n <ng-container *ngIf=\"column.type === 'icons'\" [matColumnDef]=\"column.property\" [stickyEnd]=\"column.stickyEnd\" [sticky]=\"column.sticky\">\n\n <th *matHeaderCellDef [ngClass]=\"column.cssClassesTH\" class=\"uppercase\" mat-header-cell> <span [innerHTML]=\"column.label ?? ''\">{{ column.label }} </span></th>\n <td *matCellDef=\"let row\" [ngClass]=\"column.cssClasses\" mat-cell>\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;\"\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\" [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\" [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 <span class=\"cdk-visually-hidden\" *ngIf=\"column.innerHTMLInvisible\" [innerHTML]=\"column.innerHTMLInvisible(row)\"></span>\n </td>\n <td *matFooterCellDef [ngClass]=\"column.cssFooterClasses\" mat-footer-cell></td>\n </ng-container>\n\n\n</ng-container>\n\n<ng-template #tipoDatoString let-row=\"row\" let-fila=\"fila\" let-tipo=\"tipo\" let-value=\"value\" let-format=\"format\" let-clase=\"class\">\n <ng-container [ngSwitch]=\"tipo\">\n <ng-container *ngSwitchCase=\"'text'\"><span [ngClass]=\"clase\" *ngIf=\"value\" (click)=\"accionClick(fila, 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\" (click)=\"accionClick(fila, row, $event)\" >{{ value | date: (format || 'dd/MM/yyyy') }}</span></ng-container>\n <ng-container *ngSwitchCase=\"'number'\"><span [ngClass]=\"clase\" *ngIf=\"value\" (click)=\"accionClick(fila, 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(fila, row, $event)\" >{{ value | number: (format || '1.2-2') }}</span></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\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" }]
331
+ }], ctorParameters: () => [{ type: i12.MatTable, decorators: [{
332
+ type: Optional
333
+ }] }, { type: i0.ChangeDetectorRef }], propDecorators: { objThis: [{
334
+ type: Input
335
+ }], nombreColeccion: [{
336
+ type: Input
337
+ }], colDetalle: [{
338
+ type: Input
339
+ }], chkLista: [{
340
+ type: Input,
341
+ args: [{ transform: (value) => WritableStream }]
342
+ }], chkListaChange: [{
343
+ type: Output
344
+ }], columnDef: [{
345
+ type: ViewChildren,
346
+ args: [MatColumnDef]
347
+ }] } });
348
+
349
+ class TablaMantenimientoMenuComponent {
350
+ objThis;
351
+ nombreColeccion;
352
+ item;
353
+ derechosActuales;
354
+ // @Input() modalPrincipal;
355
+ // @Input() botonDisabled = (btn: BotonMantenimiento, item: any) => [];
356
+ opcionSelecionada = new EventEmitter();
357
+ menu;
358
+ subItems;
359
+ botonTemplate;
360
+ constructor() {
361
+ }
362
+ ngOnInit() {
363
+ }
364
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
365
+ 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: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }] });
366
+ }
367
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoMenuComponent, decorators: [{
368
+ type: Component,
369
+ args: [{ selector: 'jvs-tabla-mantenimiento-menu', standalone: true, imports: [
370
+ CommonModule,
371
+ MatMenuModule,
372
+ ], 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" }]
373
+ }], ctorParameters: () => [], propDecorators: { objThis: [{
374
+ type: Input
375
+ }], nombreColeccion: [{
376
+ type: Input
377
+ }], item: [{
378
+ type: Input
379
+ }], derechosActuales: [{
380
+ type: Input
381
+ }], opcionSelecionada: [{
382
+ type: Output
383
+ }], menu: [{
384
+ type: ViewChild,
385
+ args: ['menu', { static: true }]
386
+ }], subItems: [{
387
+ type: Input,
388
+ args: [{ required: true }]
389
+ }], botonTemplate: [{
390
+ type: Input,
391
+ args: [{ required: true }]
392
+ }] } });
393
+
394
+ function buscarEnArray(coleccion, idBuscar, dato) {
395
+ if (!Array.isArray(coleccion) || coleccion.length === 0)
396
+ return null; // 🔹 Validación de entrada
397
+ return Array.isArray(idBuscar)
398
+ ? coleccion.find(item => idBuscar.every((campo, idx) => item[campo] === dato[idx])) || null
399
+ : coleccion.find(item => item[idBuscar] === dato) || null;
400
+ }
401
+ function formatearFecha(val, hora = '00:00:00') {
402
+ if (val) {
403
+ if (val.length <= 10) {
404
+ val = val + ' ' + hora;
405
+ }
406
+ return new Date(val);
407
+ }
408
+ return val;
409
+ }
410
+ function esNumero(value) {
411
+ return !isNaN(Number(value));
412
+ }
413
+ function capitalizarTexto(texto) {
414
+ texto = texto.replace(/_/g, ' ');
415
+ texto = texto.replace(/-/g, ' ');
416
+ const textoCortado = texto.split(' ');
417
+ const nText = [];
418
+ textoCortado.forEach(textActual => {
419
+ nText.push(textActual.charAt(0).toUpperCase() + textActual.slice(1));
420
+ });
421
+ return nText.join(' ');
422
+ }
423
+ function getBrowserName() {
424
+ const agent = window.navigator.userAgent.toLowerCase();
425
+ switch (true) {
426
+ case agent.indexOf('edge') > -1:
427
+ return 'edge';
428
+ case agent.indexOf('opr') > -1 && !!window.opr:
429
+ return 'opera';
430
+ case agent.indexOf('chrome') > -1 && !!window.chrome:
431
+ return 'chrome';
432
+ case agent.indexOf('trident') > -1:
433
+ return 'ie';
434
+ case agent.indexOf('firefox') > -1:
435
+ return 'firefox';
436
+ case agent.indexOf('safari') > -1:
437
+ return 'safari';
438
+ default:
439
+ return 'other';
440
+ }
441
+ }
442
+
443
+ class DataModel {
444
+ modelosChk = {}; // Usar any para valores dinámicos
445
+ checkbox;
446
+ constructor() {
447
+ this.checkbox = new ForCheckboxModel(this);
448
+ }
449
+ generarId(row, campoValor, separador = '') {
450
+ if (typeof campoValor == 'string') {
451
+ campoValor = [campoValor];
452
+ }
453
+ return campoValor.map(data => row[data]).join(separador);
454
+ }
455
+ // Agrega controles al objeto modelosChk
456
+ agregarControles(lista, idLista, limpiar = true, campoValor = null, campoValorSeparador = '') {
457
+ if (limpiar) {
458
+ this.modelosChk = {};
459
+ }
460
+ const asignarValor = (dat, idLista, campoValor, key) => {
461
+ if (!key) {
462
+ key = dat[idLista] + (campoValor.includes('.') ? '' : `.${campoValor}`);
463
+ }
464
+ const mat = campoValor.match(/^([in])[A-Z][a-zA-Z]+/);
465
+ if (mat) {
466
+ this.modelosChk[key] = dat[campoValor] * 1;
467
+ }
468
+ else {
469
+ this.modelosChk[key] = dat[campoValor];
470
+ }
471
+ };
472
+ lista.forEach(dat => {
473
+ if (campoValor === null) {
474
+ // Caso 1: Sin campoValor, se asigna false
475
+ this.modelosChk[dat[idLista]] = false;
476
+ }
477
+ else if (typeof campoValor === 'string') {
478
+ // Caso 2: campoValor es un string
479
+ asignarValor(dat, idLista, campoValor, dat[idLista]);
480
+ }
481
+ else if (campoValorSeparador) {
482
+ const idStr = this.generarId(dat, campoValor, campoValorSeparador);
483
+ // Caso 2: campoValor es un string
484
+ asignarValor(dat, idLista, '.', idStr);
485
+ }
486
+ else {
487
+ // Caso 3: campoValor es un array de strings
488
+ campoValor.forEach(data => asignarValor(dat, idLista, data));
489
+ }
490
+ });
491
+ }
492
+ // Establece el estado de un índice
493
+ setState(idx, state) {
494
+ this.modelosChk[idx] = state;
495
+ }
496
+ // Obtiene el estado de un índice
497
+ getState(idx) {
498
+ return this.modelosChk[idx];
499
+ }
500
+ getDataMultiple(idx) {
501
+ const camposMod = Object.keys(this.modelosChk).filter(key => key.split('.')[0] == idx);
502
+ const vRet = {};
503
+ camposMod.forEach(key => {
504
+ vRet[key.split('.')[1]] = this.modelosChk[key];
505
+ });
506
+ return vRet;
507
+ }
508
+ // Genera una lista basada en el estado de los índices
509
+ generarLista(tipoRetorno = null, esCampoNumerico = false) {
510
+ const strLista = [];
511
+ const objLista = {};
512
+ Object.keys(this.modelosChk).forEach(key => {
513
+ if ((esCampoNumerico && esNumero(this.modelosChk[key])) ||
514
+ (this.modelosChk[key])) {
515
+ strLista.push(key);
516
+ objLista[key] = this.modelosChk[key];
517
+ }
518
+ });
519
+ if (tipoRetorno === 'array') {
520
+ return strLista;
521
+ }
522
+ if (tipoRetorno === 'object') {
523
+ return objLista;
524
+ }
525
+ return strLista.join(',');
526
+ }
527
+ generarFormGroupFromModelosChk(tipo) {
528
+ const formGroupObj = {};
529
+ let validadores = [];
530
+ if (tipo == 'number') {
531
+ validadores = [
532
+ Validators.required,
533
+ Validators.min(1)
534
+ ];
535
+ }
536
+ Object.keys(this.modelosChk).forEach(key => {
537
+ formGroupObj[key] = new FormControl(this.modelosChk[key], validadores);
538
+ });
539
+ return new FormGroup(formGroupObj);
540
+ // return this.formBuilder.group(formGroupObj);
541
+ }
542
+ }
543
+ class ForCheckboxModel {
544
+ modeloCheck;
545
+ constructor(modeloCheck) {
546
+ this.modeloCheck = modeloCheck;
547
+ }
548
+ get cantidadActivos() {
549
+ return Object.values(this.modeloCheck.modelosChk).filter(Boolean).length;
550
+ }
551
+ get existenActivados() {
552
+ return this.cantidadActivos > 0;
553
+ }
554
+ get todosActivos() {
555
+ const total = Object.keys(this.modeloCheck.modelosChk).length;
556
+ const activos = this.cantidadActivos;
557
+ return activos > 0 && total === activos;
558
+ }
559
+ get algunosActivos() {
560
+ const total = Object.keys(this.modeloCheck.modelosChk).length;
561
+ const activos = this.cantidadActivos;
562
+ return activos > 0 && total !== activos;
563
+ }
564
+ establecerTodos(activo) {
565
+ Object.keys(this.modeloCheck.modelosChk).forEach(idx => this.modeloCheck.modelosChk[idx] = activo);
566
+ }
567
+ }
568
+
569
+ const getFileName = (name) => {
570
+ const timeSpan = new Date().toISOString();
571
+ const sheetName = name || 'ExportResult';
572
+ const fileName = `${sheetName}-${timeSpan}`;
573
+ return {
574
+ sheetName,
575
+ fileName
576
+ };
577
+ };
578
+ class TableUtil {
579
+ static exportTableToExcelV2(targetTableElm, name) {
580
+ const { sheetName, fileName } = getFileName(name);
581
+ console.log(targetTableElm);
582
+ const wb = XLSX.utils.table_to_book(targetTableElm, {
583
+ sheet: sheetName
584
+ });
585
+ XLSX.writeFile(wb, `${fileName}.xlsx`);
586
+ }
587
+ static exportTableToExcel(tableId, name) {
588
+ const { sheetName, fileName } = getFileName(name);
589
+ const targetTableElm = document.getElementById(tableId);
590
+ console.log(targetTableElm);
591
+ const wb = XLSX.utils.table_to_book(targetTableElm, {
592
+ sheet: sheetName
593
+ });
594
+ // XLSX.writeFile(wb, `${fileName}.xlsx`);
595
+ }
596
+ static exportArrayToExcel(arr, name) {
597
+ const { sheetName, fileName } = getFileName(name);
598
+ const wb = XLSX.utils.book_new();
599
+ const ws = XLSX.utils.json_to_sheet(arr, { dateNF: 'dd/MM/yyyy' });
600
+ XLSX.utils.book_append_sheet(wb, ws, sheetName);
601
+ XLSX.writeFile(wb, `${fileName}.xlsx`);
602
+ }
603
+ static getWorkBook(htmlTableId, data) {
604
+ const targetTableElm = document.getElementById(htmlTableId);
605
+ const tableToSheet = XLSX.utils.table_to_sheet(targetTableElm, { raw: true });
606
+ const jsonToSheet = XLSX.utils.json_to_sheet(data);
607
+ const sheetToJson = XLSX.utils.sheet_to_json(tableToSheet);
608
+ return { tableToSheet, jsonToSheet, sheetToJson };
609
+ }
610
+ }
611
+
612
+ class MatRowKeyboardSelectionDirective {
613
+ el;
614
+ rows;
615
+ renderedData;
616
+ tabla; // Entrada: Referencia a la tabla
617
+ rowModel; // Entrada: Modelo de fila actual
618
+ seleccionarSiguiente = new EventEmitter(); // Salida: Evento al seleccionar siguiente
619
+ unsubscriber$ = new Subject();
620
+ constructor(el) {
621
+ this.el = el;
622
+ }
623
+ ngOnInit() {
624
+ // Asignar tabindex si no está definido
625
+ if (this.el.nativeElement.tabIndex < 0) {
626
+ this.el.nativeElement.tabIndex = 0;
627
+ }
628
+ // Obtener la fuente de datos de la tabla
629
+ const dataSource = this.tabla.dataSource;
630
+ // Suscribirse a los cambios en los datos
631
+ dataSource.connect().pipe(takeUntil(this.unsubscriber$)).subscribe(data => {
632
+ this.renderedData = data;
633
+ this.rows = Array.from(this.getTableRows());
634
+ });
635
+ }
636
+ ngOnDestroy() {
637
+ // Finalizar la suscripción al destruir la directiva
638
+ this.unsubscriber$.next(null);
639
+ this.unsubscriber$.complete();
640
+ }
641
+ onKeydown(event) {
642
+ var element = event.target;
643
+ if (element.tagName === "INPUT") {
644
+ event.stopPropagation();
645
+ }
646
+ else {
647
+ const currentIndex = this.renderedData.findIndex(row => row === this.rowModel);
648
+ const eRef = event.target;
649
+ this.rows = this.rows.filter(elem => elem.hasAttribute('id'));
650
+ const arrayFilas = Array.from(this.rows);
651
+ const fElem = arrayFilas.filter(elem => elem.id == eRef.id).pop();
652
+ const cElemIdx = arrayFilas.findIndex(elem => elem == fElem);
653
+ let newRow;
654
+ // Controlar las teclas presionadas
655
+ switch (event.key) {
656
+ case 'ArrowDown':
657
+ newRow = this.rows[cElemIdx + 1];
658
+ break;
659
+ case 'ArrowUp':
660
+ newRow = this.rows[cElemIdx - 1];
661
+ break;
662
+ case 'Enter':
663
+ case ' ':
664
+ this.seleccionarSiguiente.next(this.renderedData[currentIndex]);
665
+ event.preventDefault();
666
+ break;
667
+ }
668
+ // Enfocar la nueva fila seleccionada
669
+ if (newRow) {
670
+ newRow.classList.add('estaFocus');
671
+ newRow.focus();
672
+ }
673
+ }
674
+ }
675
+ getTableRows() {
676
+ let el = this.el.nativeElement;
677
+ // Recorrer los elementos padres hasta encontrar la tabla
678
+ while (el && el.parentNode) {
679
+ el = el.parentNode;
680
+ // Verificar si es una tabla de material
681
+ if (el.tagName && el.tagName.toLowerCase() === 'mat-table' || el.hasAttribute('mat-table')) {
682
+ return el.querySelectorAll('mat-row, tr[mat-row]');
683
+ }
684
+ }
685
+ return undefined;
686
+ }
687
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatRowKeyboardSelectionDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
688
+ 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 });
689
+ }
690
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatRowKeyboardSelectionDirective, decorators: [{
691
+ type: Directive,
692
+ args: [{
693
+ selector: '[matRowKeyboardSelection]'
694
+ }]
695
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { tabla: [{
696
+ type: Input,
697
+ args: ['matRowKeyboardSelection']
698
+ }], rowModel: [{
699
+ type: Input
700
+ }], seleccionarSiguiente: [{
701
+ type: Output
702
+ }], onKeydown: [{
703
+ type: HostListener,
704
+ args: ['keydown', ['$event']]
705
+ }] } });
706
+
707
+ class TablaMantenimientoService {
708
+ get templateBotonesComunes() {
709
+ return [
710
+ { icono: 'roundAdd', tipo: 'nuevo', class: 'text-green-100 !bg-green-600', sinCondicion: true },
711
+ { icono: 'roundEdit', tipo: 'editar', class: 'text-amber-900 !bg-amber-300' },
712
+ { icono: 'roundDelete', tipo: 'eliminar', class: 'text-red-100 !bg-red-700' },
713
+ { icono: 'roundDelete', tipo: 'eliminar_fila', class: 'text-red-100 !bg-red-700' },
714
+ { icono: 'roundPrint', tipo: 'imprimir', class: '!bg-blue-100 text-blue-700' },
715
+ { icono: 'roundDownload', tipo: 'descargar', class: '!bg-blue-100 text-blue-700' },
716
+ { icono: 'roundFolder', tipo: 'ver_archivos', class: '!bg-green-100 text-green-700' },
717
+ { icono: 'fa5FilePdf', tipo: 'exportar_pdf', label: 'Exportar a PDF', class: 'bg-pdf-light text-pdf' },
718
+ { icono: 'fa5FileExcel', tipo: 'exportar_excel', label: 'Exportar a Excel', class: 'bg-excel-light text-excel' },
719
+ { icono: 'fa5sFileExport', tipo: 'exportacion_avanzada', label: 'Exportación Avanzada', class: '!text-indigo-600 !bg-indigo-100' },
720
+ { icono: 'icSave', tipo: 'guardar', class: '!text-indigo-100 !bg-indigo-600' },
721
+ { icono: 'icCancel', tipo: 'cancelar', class: '!text-cyan-100 !bg-cyan-600' },
722
+ {
723
+ icono: 'roundFactCheck', tipo: 'seleccionar',
724
+ class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700'
725
+ },
726
+ { icono: 'roundListAlt', tipo: 'detalle', class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700' },
727
+ { icono: 'roundPublic', tipo: 'ver_mapa', class: 'text-blue-100 bg-blue-700 dark:text-blue-100 dark:bg-blue-700' },
728
+ { icono: 'icCheck', tipo: 'activar', },
729
+ { icono: 'icClose', tipo: 'desactivar', },
730
+ { icono: 'fa5sLock', tipo: 'cerrar', },
731
+ { icono: 'fa5sLockOpen', tipo: 'abrir', },
732
+ ];
733
+ }
734
+ get templateColumnasTabla() {
735
+ return [
736
+ { label: '#', labelLista: 'Numeración', property: 'numeracion_automatica', type: 'numeracion_automatica' },
737
+ ];
738
+ }
739
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
740
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, providedIn: 'root' });
741
+ }
742
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoService, decorators: [{
743
+ type: Injectable,
744
+ args: [{
745
+ providedIn: 'root',
746
+ }]
747
+ }] });
748
+
749
+ var TablaMantenimientoComponent_1;
750
+ let TablaMantenimientoComponent = class TablaMantenimientoComponent {
751
+ static { TablaMantenimientoComponent_1 = this; }
752
+ fb;
753
+ overlay;
754
+ viewContainerRef;
755
+ tablaMantenimientoService;
756
+ cdRef;
757
+ static nextId = 0;
758
+ id = `jvs-tabla-mantenimiento-id-${TablaMantenimientoComponent_1.nextId++}`;
759
+ get templateBotonesComunes() {
760
+ return this.tablaMantenimientoService.templateBotonesComunes;
761
+ }
762
+ ;
763
+ get templateColumnasTabla() {
764
+ return this.tablaMantenimientoService.templateColumnasTabla;
765
+ }
766
+ ;
767
+ virtualScroll = false;
768
+ itemSize = 48;
769
+ headerize = 48;
770
+ placeholderHeight = 0;
771
+ dataSuscription;
772
+ objThis;
773
+ nombreColeccion;
774
+ ctrlBusquedaValue = '';
775
+ ctrlBusquedaPlaceholder = 'Buscar...';
776
+ filtroCampos = true;
777
+ paginador = true;
778
+ esTabla = true;
779
+ readOnly = false;
780
+ filaExtraHeader;
781
+ filaFooter = false;
782
+ botonesCRUD = 'CUD';
783
+ dblclickItem = new EventEmitter();
784
+ objBotonesCRUD = [
785
+ { tipo: 'nuevo', sinCondicion: true },
786
+ { tipo: 'editar' },
787
+ { tipo: 'eliminar' },
788
+ ];
789
+ 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'];
790
+ // @Input() classAnulado = ['line-through', 'text-red', 'italic'];
791
+ classAnulado = ['elemento-anulado', /*'line-through', */ 'text-red-900', 'bg-red-200'];
792
+ campoAnulado = null;
793
+ campoAnuladoMensaje = null;
794
+ opcionSelecionada = new EventEmitter();
795
+ opcBusqueda = new EventEmitter();
796
+ accionRecargar = new EventEmitter();
797
+ isRecargarUsed = false;
798
+ filaExtraTemplate;
799
+ paginator;
800
+ sort;
801
+ exportarExcel = true;
802
+ // MIO
803
+ pageSize = 25;
804
+ pageSizeOptions = [5, 10, 25, 50, 100, 500, 1000];
805
+ dataSourceChange = new EventEmitter();
806
+ resultados = new EventEmitter();
807
+ resultadosConLabel = new EventEmitter();
808
+ dataFiltro = new EventEmitter();
809
+ // FIN FILTRO BUSQUEDA
810
+ dataSource = new MatTableDataSource(); // or whatever type of datasource you have
811
+ // this is where the magic happens:
812
+ table;
813
+ columnDefs;
814
+ componenteCargadoTotalmente = false;
815
+ /////////////////////
816
+ paginacion = {
817
+ pageSize: 25,
818
+ pageSizeOptions: [],
819
+ pageCurrent: null,
820
+ pageIndex: 0,
821
+ pageLength: null,
822
+ };
823
+ // All that's left is to add them to the table ourselves:
824
+ ignorarDerechos = false;
825
+ derechosActuales = null;
826
+ // listaCRUD: BotonMantenimiento[] = [];
827
+ rows;
828
+ rowFooter;
829
+ mouseEvent$;
830
+ overlayRef;
831
+ userMenu;
832
+ // FILTRO BUSQUEDA
833
+ opcFiltroActual = {};
834
+ capitalizarTexto = capitalizarTexto;
835
+ cCampoBusqueda = new FormControl('');
836
+ chkLista = new DataModel();
837
+ constructor(fb, overlay, viewContainerRef, tablaMantenimientoService, cdRef) {
838
+ this.fb = fb;
839
+ this.overlay = overlay;
840
+ this.viewContainerRef = viewContainerRef;
841
+ this.tablaMantenimientoService = tablaMantenimientoService;
842
+ this.cdRef = cdRef;
843
+ }
844
+ _ctrlBusqueda = '';
845
+ get ctrlBusqueda() {
846
+ return this._ctrlBusqueda;
847
+ }
848
+ set ctrlBusqueda(val) {
849
+ if (val == '') {
850
+ val = 'simple';
851
+ }
852
+ this._ctrlBusqueda = val;
853
+ }
854
+ // @Input() leyenda;
855
+ _leyenda = undefined;
856
+ get leyenda() {
857
+ return this._leyenda;
858
+ }
859
+ set leyenda(val) {
860
+ if (typeof val == 'string') {
861
+ this._leyenda = { text: val };
862
+ }
863
+ else {
864
+ this._leyenda = val;
865
+ }
866
+ }
867
+ // @Input() idTabla: string[];
868
+ _idTabla = [];
869
+ get idTabla() {
870
+ return this._idTabla;
871
+ }
872
+ set idTabla(val) {
873
+ if (Array.isArray(val)) {
874
+ this._idTabla = val;
875
+ }
876
+ else {
877
+ this._idTabla.push(val);
878
+ }
879
+ }
880
+ _columnasTabla = [];
881
+ get columnasTabla() {
882
+ return this._columnasTabla ?? [];
883
+ }
884
+ set columnasTabla(val) {
885
+ const reemplazarConTemplate = (listaInicial = []) => {
886
+ listaInicial.forEach((btnActual, idx) => {
887
+ const btnEnTemplate = buscarEnArray(this.templateColumnasTabla, 'property', btnActual.property);
888
+ if (btnEnTemplate) {
889
+ listaInicial[idx] = {
890
+ ...btnEnTemplate,
891
+ ...btnActual
892
+ };
893
+ }
894
+ if (!!!listaInicial[idx].text) {
895
+ listaInicial[idx].text = {
896
+ cssStyle: {}
897
+ };
898
+ }
899
+ else if (!!!listaInicial[idx].text.cssStyle) {
900
+ listaInicial[idx].text.cssStyle = {};
901
+ }
902
+ listaInicial[idx].text.cssStyle = { ...listaInicial[idx].text.cssStyle, ...{ 'max-height': this.itemSize + 'px' } };
903
+ if (btnActual.type == 'custom') {
904
+ listaInicial[idx]['visibleAlias'] = listaInicial[idx].visible ?? true;
905
+ listaInicial[idx].visible = false;
906
+ }
907
+ });
908
+ return listaInicial;
909
+ };
910
+ this._columnasTabla = val ? reemplazarConTemplate(val) : [];
911
+ }
912
+ // @Input() botonesMenu: BotonMantenimiento[] = [];
913
+ _botonesMenu = {
914
+ crud: undefined,
915
+ principal: [],
916
+ izquierda: [],
917
+ derecha: [],
918
+ secundario: [],
919
+ inferior: [],
920
+ };
921
+ get botonesMenu() {
922
+ return this._botonesMenu;
923
+ }
924
+ get botonesMenuFinal() {
925
+ const nuevoBotonesMenu = this.botonesMenu;
926
+ // Iteramos sobre cada sección de botones
927
+ Object.keys(nuevoBotonesMenu).forEach(seccion => {
928
+ nuevoBotonesMenu[seccion] = nuevoBotonesMenu[seccion]?.filter((boton) => {
929
+ if (this.readOnly) {
930
+ if (boton.subItems) {
931
+ boton.subItems = boton.subItems.filter((subItem) => subItem.ignorarReadOnly === true);
932
+ return boton.subItems.length < 1;
933
+ }
934
+ return boton.ignorarReadOnly === true;
935
+ }
936
+ return true;
937
+ }); // Filtramos los botones nulos
938
+ });
939
+ return nuevoBotonesMenu;
940
+ }
941
+ set botonesMenu(val) {
942
+ const reemplazarConTemplate = (listaInicial = []) => listaInicial.map((btnActual) => {
943
+ const btnEnTemplate = buscarEnArray(this.templateBotonesComunes, 'tipo', btnActual.tipoTemplate ?? btnActual.tipo);
944
+ if (btnEnTemplate) {
945
+ if (btnActual.tipoTemplate && !btnActual.label) {
946
+ btnEnTemplate.label = undefined;
947
+ }
948
+ if (btnActual.subItems) {
949
+ return { ...btnEnTemplate, ...btnActual, seccion: this.nombreColeccion, subItems: reemplazarConTemplate(btnActual.subItems) };
950
+ }
951
+ return { ...btnEnTemplate, ...btnActual, seccion: this.nombreColeccion };
952
+ }
953
+ return btnActual;
954
+ });
955
+ if (val?.crud) {
956
+ this.objBotonesCRUD = this.templateBotonesComunes
957
+ .filter(obj => ['nuevo', 'editar', 'eliminar'].includes(obj.tipo))
958
+ .map(obj => val.crud?.find(o => o.tipo === obj.tipo) ?? obj);
959
+ }
960
+ Object.keys(val).forEach(btnKey => {
961
+ if (val[btnKey]) {
962
+ val[btnKey] = reemplazarConTemplate(val[btnKey]);
963
+ }
964
+ });
965
+ this._botonesMenu = { ...this._botonesMenu, ...val };
966
+ }
967
+ get listaMenuCompleto() {
968
+ let menuTotal = [];
969
+ menuTotal = menuTotal.concat(this.botonesMenu.izquierda ?? []);
970
+ menuTotal = menuTotal.concat(this.botonesMenu.crud ?? []);
971
+ menuTotal = menuTotal.concat(this.botonesMenu.principal ?? []);
972
+ menuTotal = menuTotal.concat(this.botonesMenu.derecha ?? []);
973
+ menuTotal = menuTotal.concat(this.botonesMenu.secundario ?? []);
974
+ menuTotal = menuTotal.concat(this.botonesMenu.inferior ?? []);
975
+ return menuTotal;
976
+ }
977
+ get objVisibleColumns() {
978
+ return this.columnasTabla.filter(column => {
979
+ if (column.visible == undefined) {
980
+ column.visible = true;
981
+ }
982
+ if (this.filaExtraTemplate) {
983
+ column.sort = false;
984
+ }
985
+ if (column.esVisible != undefined) {
986
+ column.visible = column.esVisible();
987
+ }
988
+ if (column.noMostrar != undefined) {
989
+ column.visible = !column.noMostrar();
990
+ }
991
+ return column.visible;
992
+ });
993
+ }
994
+ get visibleColumns() {
995
+ return this.objVisibleColumns.map(column => column.property);
996
+ }
997
+ get tieneCheckbox() {
998
+ return this.columnasTabla && this.columnasTabla.length > 0 && this.columnasTabla.find(col => col.type === 'checkbox') || false;
999
+ }
1000
+ get objSeleccionado() {
1001
+ return this.objThis?.['seleccionados']?.[this.nombreColeccion];
1002
+ }
1003
+ set objSeleccionado(val) {
1004
+ if (!this.objThis) {
1005
+ this.objThis = {};
1006
+ }
1007
+ if (!this.objThis['seleccionados']) {
1008
+ this.objThis['seleccionados'] = {};
1009
+ }
1010
+ this.objThis['seleccionados'][this.nombreColeccion] = val;
1011
+ }
1012
+ get idsSeleccionado() {
1013
+ return this.chkLista.generarLista();
1014
+ }
1015
+ idTablaValor(data) {
1016
+ if (data) {
1017
+ if (this.idTabla.length < 1) {
1018
+ return shortHash(JSON.stringify({ data, claseFinal: undefined }));
1019
+ }
1020
+ return this.idTabla.map(d => data[d]).join('-');
1021
+ }
1022
+ return '';
1023
+ }
1024
+ condicionesClaseFila = (item) => [];
1025
+ ngOnInit() {
1026
+ // this.sharedService.dataRutaActual$.pipe(untilDestroyed(this)).subscribe(datRouteData => {
1027
+ // if (datRouteData) {
1028
+ // this.derechosActuales = datRouteData['derechos'];
1029
+ // if (!this.ignorarDerechos) {
1030
+ // this.ignorarDerechos = datRouteData['ignorarDerechos'] ?? false;
1031
+ // }
1032
+ // }
1033
+ // });
1034
+ this.paginacion.pageSize = this.pageSize;
1035
+ this.paginacion.pageSizeOptions = this.pageSizeOptions;
1036
+ this.actualizarCrud();
1037
+ this.agregarBotonesExportacion();
1038
+ if (this.dataSuscription) {
1039
+ this.dataSuscription.subscribe(res => {
1040
+ if (res) {
1041
+ if (this.objSeleccionado) {
1042
+ if (this.idTabla && this.idTabla.length > 0) {
1043
+ const arrayData = this.idTabla.map(d => this.objSeleccionado[d]);
1044
+ // console.log(arrayData);
1045
+ const busqueda = buscarEnArray(res, this.idTabla, arrayData);
1046
+ if (busqueda) {
1047
+ console.log(busqueda);
1048
+ this.objSeleccionado = busqueda;
1049
+ }
1050
+ }
1051
+ else {
1052
+ const dataStr = res.find((itm) => shortHash(JSON.stringify({
1053
+ ...itm, claseFinal: undefined
1054
+ })) == shortHash(JSON.stringify({ ...this.objSeleccionado, claseFinal: undefined })));
1055
+ if (dataStr) {
1056
+ this.objSeleccionado = dataStr;
1057
+ }
1058
+ }
1059
+ }
1060
+ this.setData(res);
1061
+ }
1062
+ });
1063
+ }
1064
+ this.isRecargarUsed = this.accionRecargar.observed;
1065
+ }
1066
+ ngAfterContentInit() {
1067
+ this.componenteCargadoTotalmente = true;
1068
+ this.cdRef.detectChanges();
1069
+ this.columnDefs.forEach(columnDef => {
1070
+ const col = this.columnasTabla.find(col => col.property == columnDef.name);
1071
+ if (col) {
1072
+ col.visible = col['visibleAlias'] ?? col.visible;
1073
+ if (col['visibleAlias']) {
1074
+ delete col['visibleAlias'];
1075
+ // col['visibleAlias'] = undefined;
1076
+ }
1077
+ }
1078
+ this.table.addColumnDef(columnDef);
1079
+ // this.cdRef.detectChanges();
1080
+ });
1081
+ // console.log(a);
1082
+ if (this.ctrlBusquedaValue) {
1083
+ this.cCampoBusqueda.setValue(this.ctrlBusquedaValue);
1084
+ }
1085
+ }
1086
+ ngOnChanges(changes) {
1087
+ if (changes['botonesCRUD'] || changes['ctrlBusqueda']) {
1088
+ this.actualizarCrud();
1089
+ }
1090
+ if (changes['botonesMenu']) {
1091
+ this.agregarBotonesExportacion();
1092
+ }
1093
+ }
1094
+ trackByFn(index, item) {
1095
+ return this.nombreColeccion + '_' + this.idTablaValor(item);
1096
+ }
1097
+ agregarBotonesExportacion() {
1098
+ const fnAddBoton = (condicion, tipoBoton) => {
1099
+ if (condicion) {
1100
+ const objBoton = buscarEnArray(this.templateBotonesComunes, 'tipo', tipoBoton);
1101
+ const objBotonEnInferior = buscarEnArray((this.botonesMenu?.inferior ?? []), 'tipo', tipoBoton);
1102
+ if (!objBotonEnInferior && objBoton) {
1103
+ if (!this.botonesMenu.inferior) {
1104
+ this.botonesMenu.inferior = [];
1105
+ }
1106
+ this.botonesMenu?.inferior?.push({
1107
+ ...objBoton,
1108
+ esIndependiente: true,
1109
+ });
1110
+ }
1111
+ }
1112
+ };
1113
+ fnAddBoton((this.exportarExcel && this.esTabla), 'exportar_excel');
1114
+ }
1115
+ actualizarCrud() {
1116
+ const operacionesCRUD = {
1117
+ 'C': 'nuevo',
1118
+ 'U': 'editar',
1119
+ 'D': 'eliminar'
1120
+ };
1121
+ const agregarBoton = (tipo) => {
1122
+ let botonComun = buscarEnArray(this.templateBotonesComunes, 'tipo', tipo);
1123
+ if (botonComun) {
1124
+ const personalizado = buscarEnArray(this.objBotonesCRUD, 'tipo', tipo);
1125
+ const boton = personalizado ? { ...botonComun, ...personalizado } : botonComun;
1126
+ if (this.botonesMenu.crud) {
1127
+ this.botonesMenu.crud.push(boton);
1128
+ }
1129
+ }
1130
+ };
1131
+ const lstCRUD = (this.botonesMenu.crud ?? []).map(i => i.tipo);
1132
+ if (lstCRUD.length > 0) {
1133
+ for (const operacion of (this.botonesCRUD || "").toUpperCase()) {
1134
+ const operacionKey = operacion;
1135
+ if (lstCRUD.includes(operacion) && operacionesCRUD[operacionKey]) {
1136
+ agregarBoton(operacionesCRUD[operacionKey]);
1137
+ }
1138
+ }
1139
+ }
1140
+ else {
1141
+ this.botonesMenu.crud = [];
1142
+ for (const operacion of (this.botonesCRUD || "").toUpperCase()) {
1143
+ const operacionKey = operacion;
1144
+ if (operacionesCRUD[operacionKey]) {
1145
+ agregarBoton(operacionesCRUD[operacionKey]);
1146
+ }
1147
+ }
1148
+ }
1149
+ if (this.ctrlBusqueda === 'simple') {
1150
+ this.cCampoBusqueda.valueChanges.pipe(untilDestroyed(this)).subscribe(value => this.onFilterChange(value ?? ''));
1151
+ }
1152
+ if (this.botonesCRUD === '-') {
1153
+ this.botonesMenu.crud = [];
1154
+ }
1155
+ }
1156
+ classFila(item) {
1157
+ let claseFinal = [];
1158
+ if (this.campoAnulado && (item[this.campoAnulado] == 1)) {
1159
+ claseFinal = claseFinal.concat(this.classAnulado);
1160
+ }
1161
+ if (this.objSeleccionado == item) {
1162
+ claseFinal = claseFinal.concat(this.classSeleccionado);
1163
+ }
1164
+ claseFinal = claseFinal.concat(this.condicionesClaseFila(item));
1165
+ item.claseFinal = claseFinal;
1166
+ return claseFinal;
1167
+ }
1168
+ subItemsActivos(btn, item) {
1169
+ return btn.subItems.filter((sub) => !sub.esVisible || sub.esVisible(item)).length > 0;
1170
+ }
1171
+ get noData() {
1172
+ if (!this.esTabla) {
1173
+ return of(true);
1174
+ }
1175
+ if (!this.dataSource || !this.table) {
1176
+ return of(true);
1177
+ }
1178
+ // @ts-ignore
1179
+ return this.table.dataSource?.connect().pipe(map(data => data?.length === 0));
1180
+ }
1181
+ onFilterChange(value) {
1182
+ if (!this.dataSource) {
1183
+ return;
1184
+ }
1185
+ value = value.trim();
1186
+ value = value.toLowerCase();
1187
+ this.dataSource.filter = value;
1188
+ }
1189
+ toggleColumnVisibility(column, event) {
1190
+ event.stopPropagation();
1191
+ event.stopImmediatePropagation();
1192
+ column.visible = !column.visible;
1193
+ }
1194
+ cargarData(retorno = false) {
1195
+ if (this.ctrlBusqueda && this.ctrlBusqueda == 'simple') {
1196
+ if (!retorno) {
1197
+ this.dataSource.paginator = this.paginator;
1198
+ this.dataSource.sort = this.sort;
1199
+ }
1200
+ const aS = this.dataSource?.data;
1201
+ if ((!aS || !aS[0] || !aS[0]['iTotalRegistros'])) {
1202
+ return false;
1203
+ }
1204
+ }
1205
+ const dPag = {
1206
+ iPaginacion: 1,
1207
+ iPageSize: this.paginator?.pageSize ? this.paginator?.pageSize : this.paginacion.pageCurrent?.pageSize,
1208
+ iPageNumber: (this.paginator?.pageIndex ? this.paginator?.pageIndex : 0) + 1,
1209
+ };
1210
+ if (this.ctrlBusqueda && this.ctrlBusqueda == 'query') {
1211
+ dPag['cCampoBusqueda'] = this.cCampoBusqueda.value;
1212
+ }
1213
+ if (retorno) {
1214
+ return dPag;
1215
+ }
1216
+ this.resultados.emit(dPag);
1217
+ this.opcBusqueda.emit(dPag);
1218
+ }
1219
+ // FIN FILTRO BUSQUEDA INTEGRAR
1220
+ setData(data) {
1221
+ this.dataSource = new MatTableDataSource(data);
1222
+ this.dataSource.sortingDataAccessor = (item, property) => {
1223
+ const dColumn = buscarEnArray(this.columnasTabla, 'property', property);
1224
+ if (dColumn) {
1225
+ switch (dColumn.sortType ?? dColumn.type) {
1226
+ case 'number':
1227
+ return item[property] * 1;
1228
+ case 'date':
1229
+ return formatearFecha(item[property]);
1230
+ }
1231
+ }
1232
+ if (item) {
1233
+ switch (property) {
1234
+ case 'fromDate':
1235
+ return new Date(item['fromDate']);
1236
+ default:
1237
+ return item[property];
1238
+ }
1239
+ }
1240
+ };
1241
+ // this.paginator.length = (data && data[0] && data[0]['iTotalRegistros']) ? data[0]['iTotalRegistros'] : data.length;
1242
+ // this.dataSource.paginator = this.paginator;
1243
+ if (this.sort) {
1244
+ this.dataSource.sort = this.sort;
1245
+ }
1246
+ // this.dataSource.filter = this.filter;
1247
+ this.dataSourceChange.emit(this.dataSource);
1248
+ // this.dataSource.paginator.pageSize = this.paginacion.pageSize;
1249
+ if (data && data[0] && data[0]['iPageNumber']) {
1250
+ this.paginacion.pageIndex = (data && data[0] && data[0]['iPageNumber']) ? data[0]['iPageNumber'] : 0;
1251
+ }
1252
+ this.paginacion.pageLength = (data && data[0] && data[0]['iTotalRegistros']) ? data[0]['iTotalRegistros'] : data.length;
1253
+ if (data && data[0] && !data[0]['iTotalRegistros']) {
1254
+ this.dataSource.paginator = this.paginator;
1255
+ }
1256
+ if (this.tieneCheckbox) {
1257
+ this.chkLista.agregarControles(data, this.tieneCheckbox.property, !this.tieneCheckbox.chkFieldPersistente, (this.tieneCheckbox.chkField ?? null), this.tieneCheckbox.chkFieldSeparador);
1258
+ }
1259
+ }
1260
+ botonDisabled(btn, item) {
1261
+ let disabled;
1262
+ if (!btn.sinCondicion) {
1263
+ if (btn.estaDeshabilitado) {
1264
+ disabled = btn.estaDeshabilitado(item, this);
1265
+ }
1266
+ else {
1267
+ disabled = !this.objSeleccionado;
1268
+ }
1269
+ }
1270
+ if (!disabled && !btn.esIndependiente && !btn.ignorarDerecho && this.derechosActuales) {
1271
+ // if (!this.usuarioService.esEquipoJVSoft()) {
1272
+ disabled = !(this.derechosActuales[btn.cDerechoCodigo ?? btn.tipo]);
1273
+ // }
1274
+ }
1275
+ return disabled;
1276
+ }
1277
+ opcMenu(item, objMenu, modal = null, retorno = false) {
1278
+ console.log(objMenu);
1279
+ // let salir = this.readOnly;
1280
+ // if (salir && this.readOnly === 'permitirSeleccion' && ['ver', 'seleccionar'].includes(objMenu.tipo)) {
1281
+ // salir = false;
1282
+ // }
1283
+ // if (salir) {
1284
+ // return false;
1285
+ // }
1286
+ // console.warn(objMenu);
1287
+ if (objMenu.tipo == 'exportar_excel' && this.exportarExcel) {
1288
+ /*
1289
+ TableUtil.exportArrayToExcel(this.dataSource.data.map(x => {
1290
+ const columnasNumeros = this.objVisibleColumns.filter(column => ['money', 'number'].includes(column.type));
1291
+ columnasNumeros.forEach(columna => {
1292
+ x[columna.property] *= 1;
1293
+ });
1294
+ return x;
1295
+ }), 'TEST');
1296
+ */
1297
+ const dataGeneradoPorHtml = TableUtil.getWorkBook('tabla_' + this.nombreColeccion, []);
1298
+ const objetosExtraidos = this.dataSource.filteredData.map((objeto, idx) => this.objVisibleColumns.reduce((acumulador, columna) => {
1299
+ // console.log(propiedad);
1300
+ const nColumn = (columna.labelLista ?? columna.label).toUpperCase().replace('<BR>', ' ');
1301
+ switch (columna.type) {
1302
+ case 'date':
1303
+ // acumulador[nColumn] = (new DatePipe('es-PE')).transform(objeto[columna.property], 'dd/MM/yyyy' /*'yyyy-MM-dd'*/);
1304
+ // new Date(dateString.replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
1305
+ // acumulador[nColumn] = new Date(objeto[columna.property].replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
1306
+ // acumulador[nColumn] = formatearFechaFormato(objeto[columna.property], 'dd/MM/yyyy');
1307
+ // acumulador[nColumn] = formatearFechaTimezone(objeto[columna.property]);
1308
+ // acumulador[nColumn] = new Date(objeto[columna.property]);
1309
+ let fecha = objeto[columna.property];
1310
+ if (objeto[columna.property]) {
1311
+ fecha = new Date(objeto[columna.property].replace(/(\d{2}:\d{2}:\d{2}):\w{2}/, '$1'));
1312
+ if (getBrowserName() == 'chrome') {
1313
+ fecha = moment(objeto[columna.property], true).add(2, 'minutes').toDate();
1314
+ }
1315
+ }
1316
+ acumulador[nColumn] = fecha;
1317
+ // acumulador[nColumn] = objeto[columna.property];
1318
+ break;
1319
+ case 'number':
1320
+ case 'money':
1321
+ acumulador[nColumn] = objeto[columna.property] * 1;
1322
+ break;
1323
+ default:
1324
+ if (columna.property == 'numeracion_automatica') {
1325
+ acumulador[nColumn] = idx + 1;
1326
+ }
1327
+ else {
1328
+ if (columna.type == 'custom') {
1329
+ // dataGeneradoPorHtml.sheetToJson
1330
+ acumulador[nColumn] = dataGeneradoPorHtml.sheetToJson[idx][columna.label];
1331
+ }
1332
+ else {
1333
+ if (columna.innerHTML) {
1334
+ const convertirHtmlATexto = (html) => {
1335
+ const elementoTemporal = document.createElement('div');
1336
+ elementoTemporal.innerHTML = html;
1337
+ return elementoTemporal.textContent || "";
1338
+ };
1339
+ acumulador[nColumn] = convertirHtmlATexto(columna.innerHTML(objeto));
1340
+ }
1341
+ else if (columna.transformar) {
1342
+ acumulador[nColumn] = columna.transformar(objeto);
1343
+ }
1344
+ else {
1345
+ acumulador[nColumn] = objeto[columna.property];
1346
+ }
1347
+ }
1348
+ }
1349
+ break;
1350
+ }
1351
+ return acumulador;
1352
+ }, {}));
1353
+ // TableUtil.exportTableToExcel('tabla_' + this.nombreColeccion);
1354
+ // console.log(objetosExtraidos);
1355
+ TableUtil.exportArrayToExcel(objetosExtraidos, this.nombreColeccion);
1356
+ // this.tableExporter.exportTable('xlsx', {fileName: 'JVSoftExport'});
1357
+ }
1358
+ const opAdic = { seccion: this.nombreColeccion };
1359
+ if (item) {
1360
+ opAdic['item'] = item;
1361
+ }
1362
+ if (this.tieneCheckbox) {
1363
+ // itmsSeleccionados = this.formulariosGlobalesService.generarLista(this.nombreColeccion);
1364
+ opAdic['idsSeleccionados'] = this.idsSeleccionado;
1365
+ }
1366
+ // opAdic['refTabla'] = this;
1367
+ objMenu = { ...objMenu, ...opAdic };
1368
+ if (retorno) {
1369
+ return objMenu;
1370
+ }
1371
+ // console.warn(objMenu);
1372
+ this.opcionSelecionada.emit(objMenu);
1373
+ return 1;
1374
+ }
1375
+ emitirResultados(evento = {}) {
1376
+ this.opcFiltroActual = { ...this.opcFiltroActual, ...evento, ...this.cargarData(true) };
1377
+ // console.warn('resultadosFILTRO', this.opcFiltroActual);
1378
+ this.resultados.emit(this.opcFiltroActual);
1379
+ }
1380
+ abrirMenuContextual({ x, y }, user) {
1381
+ // console.log(user);
1382
+ // this.opcMenu(user, {tipo: 'ver'});
1383
+ this.objSeleccionado = user;
1384
+ this.cerrarMenuContextual();
1385
+ const positionStrategy = this.overlay.position().flexibleConnectedTo({ x, y }).withPositions([
1386
+ {
1387
+ originX: 'end',
1388
+ originY: 'bottom',
1389
+ overlayX: 'end',
1390
+ overlayY: 'top',
1391
+ },
1392
+ ]);
1393
+ this.overlayRef = this.overlay.create({
1394
+ positionStrategy,
1395
+ scrollStrategy: this.overlay.scrollStrategies.close(),
1396
+ });
1397
+ this.overlayRef.attach(new TemplatePortal(this.userMenu, this.viewContainerRef, {
1398
+ // $implicit: user
1399
+ item: user,
1400
+ }));
1401
+ this.mouseEvent$ = fromEvent(document, 'click').pipe(filter(event => {
1402
+ const clickTarget = event.target;
1403
+ return !!this.overlayRef && !this.overlayRef.overlayElement.contains(clickTarget);
1404
+ }), take(1)).subscribe(() => this.cerrarMenuContextual());
1405
+ }
1406
+ cerrarMenuContextual() {
1407
+ this.mouseEvent$ && this.mouseEvent$.unsubscribe();
1408
+ if (this.overlayRef) {
1409
+ this.overlayRef.dispose();
1410
+ this.overlayRef = undefined;
1411
+ }
1412
+ }
1413
+ emitirAccionRecargar() {
1414
+ if (!this.idTabla) {
1415
+ this.objSeleccionado = null;
1416
+ }
1417
+ this.accionRecargar.emit(this.opcFiltroActual);
1418
+ // this.accionRecargar.emit({ ...this.opcFiltroActual, ...{seleccionado: this.objSeleccionado}});
1419
+ }
1420
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoComponent, deps: [{ token: i1$2.FormBuilder }, { token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: TablaMantenimientoService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1421
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: TablaMantenimientoComponent, isStandalone: true, selector: "jvs-tabla-mantenimiento", inputs: { virtualScroll: "virtualScroll", itemSize: "itemSize", headerize: "headerize", 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", filaExtraTemplate: "filaExtraTemplate", exportarExcel: "exportarExcel", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", derechosActuales: "derechosActuales", ctrlBusqueda: "ctrlBusqueda", leyenda: "leyenda", idTabla: "idTabla", columnasTabla: "columnasTabla", botonesMenu: "botonesMenu", condicionesClaseFila: "condicionesClaseFila" }, outputs: { dblclickItem: "dblclickItem", opcionSelecionada: "opcionSelecionada", opcBusqueda: "opcBusqueda", accionRecargar: "accionRecargar", dataSourceChange: "dataSourceChange", resultados: "resultados", resultadosConLabel: "resultadosConLabel", dataFiltro: "dataFiltro" }, host: { properties: { "id": "this.id" }, classAttribute: "jvs-tabla-mantenimiento" }, providers: [
1422
+ { provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: { formFieldAppearance: 'outline' } }
1423
+ ], queries: [{ propertyName: "columnDefs", predicate: MatColumnDef }], 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 <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 #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 [style.height.px]=\"placeholderHeight\"\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]=\"(virtualScroll ? (itemSize ? itemSize : 0) : 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]=\"(virtualScroll ? (itemSize ? itemSize : 0) : 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; columns: visibleColumns;\"\n (click)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'ver'});\"\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]=\"(virtualScroll ? (itemSize ? itemSize : 0) : 0)\"\n [id]=\"nombreColeccion + '_' + idTablaValor(row)\"\n [matTooltip]=\"row[campoAnuladoMensaje ?? '']\"\n matTooltipPosition=\"below\"\n matTooltipClass=\"bg-red-700 text-red-100 m-0\"\n [matTooltipDisabled]=\"!campoAnuladoMensaje || !row[campoAnuladoMensaje]\"\n [class.regAnulado]=\"row[campoAnulado ?? ''] == 1\"\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=\"!column.noMostrar || !column.noMostrar()\"\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 matRipple [matRippleUnbounded]=\"false\" 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 ? '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\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" ></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!btn.soloIcono\">{{ 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 ? '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\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!btn.soloIcono\">{{ 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", styles: ["@tailwind base;@tailwind components;@tailwind utilities;:root{--tabla-mantenimiento-seleccion-fondo: rgb(179, 217, 252);--tabla-mantenimiento-seleccion-texto: rgb(1, 84, 164)}: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}html{--mat-paginator-container-size: 30px}:host{width:inherit}:host .example-viewport{height:500px;width:100%;border:1px solid black}:host .table{width:100%}:host ::ng-deep .mat-mdc-menu-content:not(:empty){@apply flex flex-col items-start;padding:0!important}:host ::ng-deep .mat-mdc-menu-item{line-height:24px!important;height:24px!important;min-height:24px!important}:host ::ng-deep .mat-mdc-menu-panel{min-height:auto!important}:host ::ng-deep .mat-mdc-table .mat-mdc-cell,:host ::ng-deep .mat-mdc-table .mat-mdc-header-cell .mat-mdc-footer-cell{white-space:unset}:host .table-container{max-height:600px!important}:host ::ng-deep .table-mantenimiento .mat-mdc-table-sticky-border-elem-right{border-left:1px solid #e0e0e0}:host ::ng-deep .table-mantenimiento .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0}:host ::ng-deep .table-mantenimiento tr.regAnulado .mat-mdc-cell{color:unset!important}:host ::ng-deep .table-mantenimiento .bg-primary-activo .numeracionFila{@apply rounded-full bg-primary-contrast text-primary mx-1 p-1 w-6 h-6;}:host ::ng-deep .table-mantenimiento th .form-input{@apply w-auto;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell,:host ::ng-deep .table-mantenimiento td.mat-mdc-cell,:host ::ng-deep .table-mantenimiento td.mat-mdc-footer-cell{border-width:1px;border-style:solid}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-cell:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-footer-cell:not(.celda-numeracion-fila){padding:.05rem .25rem}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell:first-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell:last-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-cell:first-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-cell:last-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-footer-cell:first-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-footer-cell:last-of-type:not(.celda-numeracion-fila){padding:0 .25rem}:host ::ng-deep .table-mantenimiento .student-element-detail{overflow:hidden;display:flex;align-items:center;justify-content:center}:host ::ng-deep .table-mantenimiento .mat-mdc-header-row{height:25px!important;color:rgb(var(--color-primary))!important;background-color:rgb(var(--color-primary-contrast))!important}:host ::ng-deep .table-mantenimiento .mat-mdc-header-cell{padding:5px;font-size:10px;line-height:10px;font-weight:700!important;color:inherit}:host ::ng-deep .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):hover,:host ::ng-deep .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):focus{background-color:rgba(var(--color-primary-contrast),.04)}:host ::ng-deep .table-mantenimiento .mat-mdc-row .mat-mdc-cell,:host ::ng-deep .table-mantenimiento .mat-mdc-footer-row .mat-mdc-cell{font-size:10px}:host ::ng-deep .table-mantenimiento .mat-mdc-row .mat-mdc-footer-cell:empty,:host ::ng-deep .table-mantenimiento .mat-mdc-footer-row .mat-mdc-footer-cell:empty{border-width:0!important}:host ::ng-deep .table-mantenimiento .mat-mdc-cell{@apply leading-tight;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell{border-color:#d4d0d0;@apply text-center uppercase;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container{@apply flex items-center justify-between w-full;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-content{@apply inline w-full text-center;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-arrow{@apply flex-none;}:host ::ng-deep .table-mantenimiento .mat-mdc-sort-header-content{width:100%;text-align:center;display:unset;align-items:center}:host .rotate{animation:rotation 2s infinite linear}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(359deg)}}:host .contenedor-botones>*:first-child{@apply rounded-l;}:host .contenedor-botones>*:last-child{@apply rounded-r;}.jvs-tabla-mantenimiento{width:inherit}.tabla-mantenimiento-boton-superior-firmar{@apply tabla-mantenimiento-boton-superior mat-elevation-z2 px-2 uppercase;@apply rounded disabled:bg-gray-300 dark:disabled:bg-gray-500 !important;}.tabla-mantenimiento-boton-superior{@apply 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;}.tabla-mantenimiento-boton-contextual{@apply flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent;}.tabla-mantenimiento-paginador{--mat-form-field-container-height: 36px;--mat-form-field-filled-label-display: none;--mat-form-field-container-vertical-padding: 6px;--mat-form-field-filled-with-label-container-padding-top: 6px;--mat-form-field-filled-with-label-container-padding-bottom: 6px}.tabla-mantenimiento-paginador{--mat-select-arrow-transform: none}.tabla-mantenimiento-paginador{--mdc-checkbox-state-layer-size: 28px}.tabla-mantenimiento-paginador{--mat-checkbox-touch-target-display: none}.tabla-mantenimiento-paginador .mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.tabla-mantenimiento-paginador{--mdc-switch-state-layer-size: 28px}.tabla-mantenimiento-paginador{--mdc-radio-state-layer-size: 28px}.tabla-mantenimiento-paginador{--mat-radio-touch-target-display: none}.tabla-mantenimiento-paginador{--mdc-list-list-item-one-line-container-height: 24px;--mdc-list-list-item-two-line-container-height: 48px;--mdc-list-list-item-three-line-container-height: 56px}.tabla-mantenimiento-paginador{--mat-list-list-item-leading-icon-start-space: 16px;--mat-list-list-item-leading-icon-end-space: 32px}.tabla-mantenimiento-paginador .mdc-list-item__start,.tabla-mantenimiento-paginador .mdc-list-item__end{--mdc-radio-state-layer-size: 28px}.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-avatar.mdc-list-item--with-one-line,.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-checkbox.mdc-list-item--with-one-line,.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-one-line{height:40px}.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines,.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines,.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines{height:56px}.tabla-mantenimiento-paginador{--mat-paginator-container-size: 40px;--mat-paginator-form-field-container-height: 36px;--mat-paginator-form-field-container-vertical-padding: 6px;--mat-paginator-touch-target-display: none}.tabla-mantenimiento-paginador .mat-mdc-tab-header{--mdc-secondary-navigation-tab-container-height: 32px}.tabla-mantenimiento-paginador{--mdc-text-button-container-height: 24px}.tabla-mantenimiento-paginador{--mdc-filled-button-container-height: 24px}.tabla-mantenimiento-paginador{--mdc-protected-button-container-height: 24px}.tabla-mantenimiento-paginador{--mdc-outlined-button-container-height: 24px}.tabla-mantenimiento-paginador{--mat-text-button-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-filled-button-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-protected-button-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-outlined-button-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-icon-button-touch-target-display: none}.tabla-mantenimiento-paginador .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.tabla-mantenimiento-paginador{--mat-fab-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-fab-small-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-table-header-container-height: 40px;--mat-table-footer-container-height: 36px;--mat-table-row-item-container-height: 36px}.tabla-mantenimiento-paginador{--mat-expansion-header-collapsed-state-height: 36px;--mat-expansion-header-expanded-state-height: 48px}.tabla-mantenimiento-paginador{--mat-stepper-header-height: 42px}.tabla-mantenimiento-paginador{--mat-toolbar-standard-height: 52px;--mat-toolbar-mobile-height: 44px}.tabla-mantenimiento-paginador{--mat-tree-node-min-height: 28px}.tabla-mantenimiento-paginador{--mat-standard-button-toggle-height: 24px}.tabla-mantenimiento-paginador .mat-mdc-paginator-container{min-height:unset!important}.tabla-mantenimiento-paginador .mat-mdc-text-field-wrapper{@apply px-1;}.tabla-mantenimiento-paginador .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-form-field-infix{height:25px!important;min-height:25px;max-height:25px;@apply py-0;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.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: i3.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$1.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: i8.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: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.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: i6.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i12.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i12.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i12.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i12.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i12.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i12.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.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: [
1424
+ trigger('detailExpand', [
1425
+ state('collapsed', style({ height: '0px', minHeight: '0' })),
1426
+ state('expanded', style({ height: '*' })),
1427
+ transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
1428
+ ]),
1429
+ ] });
1430
+ };
1431
+ TablaMantenimientoComponent = TablaMantenimientoComponent_1 = __decorate([
1432
+ UntilDestroy({ checkProperties: true })
1433
+ ], TablaMantenimientoComponent);
1434
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: TablaMantenimientoComponent, decorators: [{
1435
+ type: Component,
1436
+ args: [{ selector: 'jvs-tabla-mantenimiento', standalone: true, imports: [
1437
+ CommonModule,
1438
+ FormsModule,
1439
+ MatCheckboxModule,
1440
+ MatDividerModule,
1441
+ MatIconModule,
1442
+ MatMenuModule,
1443
+ MatPaginatorModule,
1444
+ MatRippleModule,
1445
+ MatSortModule,
1446
+ MatTableModule,
1447
+ MatTooltipModule,
1448
+ ReactiveFormsModule,
1449
+ TablaMantenimientoColumnDefsComponent,
1450
+ MatBadgeModule,
1451
+ TablaMantenimientoMenuComponent,
1452
+ MatRowKeyboardSelectionDirective,
1453
+ ], host: {
1454
+ class: 'jvs-tabla-mantenimiento',
1455
+ }, animations: [
1456
+ trigger('detailExpand', [
1457
+ state('collapsed', style({ height: '0px', minHeight: '0' })),
1458
+ state('expanded', style({ height: '*' })),
1459
+ transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
1460
+ ]),
1461
+ ], providers: [
1462
+ { provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: { formFieldAppearance: 'outline' } }
1463
+ ], 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 <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 #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 [style.height.px]=\"placeholderHeight\"\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]=\"(virtualScroll ? (itemSize ? itemSize : 0) : 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]=\"(virtualScroll ? (itemSize ? itemSize : 0) : 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; columns: visibleColumns;\"\n (click)=\"opcMenu(row, {seccion: nombreColeccion, tipo: 'ver'});\"\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]=\"(virtualScroll ? (itemSize ? itemSize : 0) : 0)\"\n [id]=\"nombreColeccion + '_' + idTablaValor(row)\"\n [matTooltip]=\"row[campoAnuladoMensaje ?? '']\"\n matTooltipPosition=\"below\"\n matTooltipClass=\"bg-red-700 text-red-100 m-0\"\n [matTooltipDisabled]=\"!campoAnuladoMensaje || !row[campoAnuladoMensaje]\"\n [class.regAnulado]=\"row[campoAnulado ?? ''] == 1\"\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=\"!column.noMostrar || !column.noMostrar()\"\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 matRipple [matRippleUnbounded]=\"false\" 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 ? '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\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\" ></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!btn.soloIcono\">{{ 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 ? '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\" *ngIf=\"btn.icono\" [svgIcon]=\"btn.icono\"></mat-icon>\n <span class=\"whitespace-nowrap\" *ngIf=\"!btn.soloIcono\">{{ 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", styles: ["@tailwind base;@tailwind components;@tailwind utilities;:root{--tabla-mantenimiento-seleccion-fondo: rgb(179, 217, 252);--tabla-mantenimiento-seleccion-texto: rgb(1, 84, 164)}: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}html{--mat-paginator-container-size: 30px}:host{width:inherit}:host .example-viewport{height:500px;width:100%;border:1px solid black}:host .table{width:100%}:host ::ng-deep .mat-mdc-menu-content:not(:empty){@apply flex flex-col items-start;padding:0!important}:host ::ng-deep .mat-mdc-menu-item{line-height:24px!important;height:24px!important;min-height:24px!important}:host ::ng-deep .mat-mdc-menu-panel{min-height:auto!important}:host ::ng-deep .mat-mdc-table .mat-mdc-cell,:host ::ng-deep .mat-mdc-table .mat-mdc-header-cell .mat-mdc-footer-cell{white-space:unset}:host .table-container{max-height:600px!important}:host ::ng-deep .table-mantenimiento .mat-mdc-table-sticky-border-elem-right{border-left:1px solid #e0e0e0}:host ::ng-deep .table-mantenimiento .mat-mdc-table-sticky-border-elem-left{border-right:1px solid #e0e0e0}:host ::ng-deep .table-mantenimiento tr.regAnulado .mat-mdc-cell{color:unset!important}:host ::ng-deep .table-mantenimiento .bg-primary-activo .numeracionFila{@apply rounded-full bg-primary-contrast text-primary mx-1 p-1 w-6 h-6;}:host ::ng-deep .table-mantenimiento th .form-input{@apply w-auto;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell,:host ::ng-deep .table-mantenimiento td.mat-mdc-cell,:host ::ng-deep .table-mantenimiento td.mat-mdc-footer-cell{border-width:1px;border-style:solid}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-cell:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-footer-cell:not(.celda-numeracion-fila){padding:.05rem .25rem}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell:first-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell:last-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-cell:first-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-cell:last-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-footer-cell:first-of-type:not(.celda-numeracion-fila),:host ::ng-deep .table-mantenimiento td.mat-mdc-footer-cell:last-of-type:not(.celda-numeracion-fila){padding:0 .25rem}:host ::ng-deep .table-mantenimiento .student-element-detail{overflow:hidden;display:flex;align-items:center;justify-content:center}:host ::ng-deep .table-mantenimiento .mat-mdc-header-row{height:25px!important;color:rgb(var(--color-primary))!important;background-color:rgb(var(--color-primary-contrast))!important}:host ::ng-deep .table-mantenimiento .mat-mdc-header-cell{padding:5px;font-size:10px;line-height:10px;font-weight:700!important;color:inherit}:host ::ng-deep .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):hover,:host ::ng-deep .table-mantenimiento .mdc-data-table__row:not(.mdc-data-table__row--selected):not(.elemento-seleccionado):focus{background-color:rgba(var(--color-primary-contrast),.04)}:host ::ng-deep .table-mantenimiento .mat-mdc-row .mat-mdc-cell,:host ::ng-deep .table-mantenimiento .mat-mdc-footer-row .mat-mdc-cell{font-size:10px}:host ::ng-deep .table-mantenimiento .mat-mdc-row .mat-mdc-footer-cell:empty,:host ::ng-deep .table-mantenimiento .mat-mdc-footer-row .mat-mdc-footer-cell:empty{border-width:0!important}:host ::ng-deep .table-mantenimiento .mat-mdc-cell{@apply leading-tight;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell{border-color:#d4d0d0;@apply text-center uppercase;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container{@apply flex items-center justify-between w-full;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-content{@apply inline w-full text-center;}:host ::ng-deep .table-mantenimiento th.mat-mdc-header-cell .mat-sort-header-container .mat-sort-header-arrow{@apply flex-none;}:host ::ng-deep .table-mantenimiento .mat-mdc-sort-header-content{width:100%;text-align:center;display:unset;align-items:center}:host .rotate{animation:rotation 2s infinite linear}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(359deg)}}:host .contenedor-botones>*:first-child{@apply rounded-l;}:host .contenedor-botones>*:last-child{@apply rounded-r;}.jvs-tabla-mantenimiento{width:inherit}.tabla-mantenimiento-boton-superior-firmar{@apply tabla-mantenimiento-boton-superior mat-elevation-z2 px-2 uppercase;@apply rounded disabled:bg-gray-300 dark:disabled:bg-gray-500 !important;}.tabla-mantenimiento-boton-superior{@apply 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;}.tabla-mantenimiento-boton-contextual{@apply flex items-center justify-between uppercase w-full rounded-none px-2 disabled:opacity-50 disabled:text-secondary disabled:bg-transparent;}.tabla-mantenimiento-paginador{--mat-form-field-container-height: 36px;--mat-form-field-filled-label-display: none;--mat-form-field-container-vertical-padding: 6px;--mat-form-field-filled-with-label-container-padding-top: 6px;--mat-form-field-filled-with-label-container-padding-bottom: 6px}.tabla-mantenimiento-paginador{--mat-select-arrow-transform: none}.tabla-mantenimiento-paginador{--mdc-checkbox-state-layer-size: 28px}.tabla-mantenimiento-paginador{--mat-checkbox-touch-target-display: none}.tabla-mantenimiento-paginador .mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.tabla-mantenimiento-paginador{--mdc-switch-state-layer-size: 28px}.tabla-mantenimiento-paginador{--mdc-radio-state-layer-size: 28px}.tabla-mantenimiento-paginador{--mat-radio-touch-target-display: none}.tabla-mantenimiento-paginador{--mdc-list-list-item-one-line-container-height: 24px;--mdc-list-list-item-two-line-container-height: 48px;--mdc-list-list-item-three-line-container-height: 56px}.tabla-mantenimiento-paginador{--mat-list-list-item-leading-icon-start-space: 16px;--mat-list-list-item-leading-icon-end-space: 32px}.tabla-mantenimiento-paginador .mdc-list-item__start,.tabla-mantenimiento-paginador .mdc-list-item__end{--mdc-radio-state-layer-size: 28px}.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-avatar.mdc-list-item--with-one-line,.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-checkbox.mdc-list-item--with-one-line,.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-one-line{height:40px}.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines,.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines,.tabla-mantenimiento-paginador .mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines{height:56px}.tabla-mantenimiento-paginador{--mat-paginator-container-size: 40px;--mat-paginator-form-field-container-height: 36px;--mat-paginator-form-field-container-vertical-padding: 6px;--mat-paginator-touch-target-display: none}.tabla-mantenimiento-paginador .mat-mdc-tab-header{--mdc-secondary-navigation-tab-container-height: 32px}.tabla-mantenimiento-paginador{--mdc-text-button-container-height: 24px}.tabla-mantenimiento-paginador{--mdc-filled-button-container-height: 24px}.tabla-mantenimiento-paginador{--mdc-protected-button-container-height: 24px}.tabla-mantenimiento-paginador{--mdc-outlined-button-container-height: 24px}.tabla-mantenimiento-paginador{--mat-text-button-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-filled-button-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-protected-button-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-outlined-button-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-icon-button-touch-target-display: none}.tabla-mantenimiento-paginador .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.tabla-mantenimiento-paginador{--mat-fab-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-fab-small-touch-target-display: none}.tabla-mantenimiento-paginador{--mat-table-header-container-height: 40px;--mat-table-footer-container-height: 36px;--mat-table-row-item-container-height: 36px}.tabla-mantenimiento-paginador{--mat-expansion-header-collapsed-state-height: 36px;--mat-expansion-header-expanded-state-height: 48px}.tabla-mantenimiento-paginador{--mat-stepper-header-height: 42px}.tabla-mantenimiento-paginador{--mat-toolbar-standard-height: 52px;--mat-toolbar-mobile-height: 44px}.tabla-mantenimiento-paginador{--mat-tree-node-min-height: 28px}.tabla-mantenimiento-paginador{--mat-standard-button-toggle-height: 24px}.tabla-mantenimiento-paginador .mat-mdc-paginator-container{min-height:unset!important}.tabla-mantenimiento-paginador .mat-mdc-text-field-wrapper{@apply px-1;}.tabla-mantenimiento-paginador .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-form-field-infix{height:25px!important;min-height:25px;max-height:25px;@apply py-0;}\n"] }]
1464
+ }], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: TablaMantenimientoService }, { type: i0.ChangeDetectorRef }], propDecorators: { id: [{
1465
+ type: HostBinding
1466
+ }], virtualScroll: [{
1467
+ type: Input
1468
+ }], itemSize: [{
1469
+ type: Input
1470
+ }], headerize: [{
1471
+ type: Input
1472
+ }], dataSuscription: [{
1473
+ type: Input
1474
+ }], objThis: [{
1475
+ type: Input,
1476
+ args: [{ required: true }]
1477
+ }], nombreColeccion: [{
1478
+ type: Input,
1479
+ args: [{ required: true }]
1480
+ }], ctrlBusquedaValue: [{
1481
+ type: Input
1482
+ }], ctrlBusquedaPlaceholder: [{
1483
+ type: Input
1484
+ }], filtroCampos: [{
1485
+ type: Input
1486
+ }], paginador: [{
1487
+ type: Input
1488
+ }], esTabla: [{
1489
+ type: Input
1490
+ }], readOnly: [{
1491
+ type: Input
1492
+ }], filaExtraHeader: [{
1493
+ type: Input
1494
+ }], filaFooter: [{
1495
+ type: Input
1496
+ }], botonesCRUD: [{
1497
+ type: Input
1498
+ }], dblclickItem: [{
1499
+ type: Output
1500
+ }], objBotonesCRUD: [{
1501
+ type: Input
1502
+ }], classSeleccionado: [{
1503
+ type: Input
1504
+ }], classAnulado: [{
1505
+ type: Input
1506
+ }], campoAnulado: [{
1507
+ type: Input
1508
+ }], campoAnuladoMensaje: [{
1509
+ type: Input
1510
+ }], opcionSelecionada: [{
1511
+ type: Output
1512
+ }], opcBusqueda: [{
1513
+ type: Output
1514
+ }], accionRecargar: [{
1515
+ type: Output
1516
+ }], filaExtraTemplate: [{
1517
+ type: Input
1518
+ }], paginator: [{
1519
+ type: ViewChild,
1520
+ args: [MatPaginator]
1521
+ }], sort: [{
1522
+ type: ViewChild,
1523
+ args: [MatSort]
1524
+ }], exportarExcel: [{
1525
+ type: Input
1526
+ }], pageSize: [{
1527
+ type: Input
1528
+ }], pageSizeOptions: [{
1529
+ type: Input
1530
+ }], dataSourceChange: [{
1531
+ type: Output
1532
+ }], resultados: [{
1533
+ type: Output
1534
+ }], resultadosConLabel: [{
1535
+ type: Output
1536
+ }], dataFiltro: [{
1537
+ type: Output
1538
+ }], table: [{
1539
+ type: ViewChild,
1540
+ args: [MatTable, { static: false }]
1541
+ }], columnDefs: [{
1542
+ type: ContentChildren,
1543
+ args: [MatColumnDef]
1544
+ }], derechosActuales: [{
1545
+ type: Input
1546
+ }], rows: [{
1547
+ type: ViewChildren,
1548
+ args: [MatRow, { read: ElementRef }]
1549
+ }], rowFooter: [{
1550
+ type: ViewChild,
1551
+ args: [MatFooterRow, { read: ElementRef }]
1552
+ }], userMenu: [{
1553
+ type: ViewChild,
1554
+ args: ['userMenu']
1555
+ }], ctrlBusqueda: [{
1556
+ type: Input
1557
+ }], leyenda: [{
1558
+ type: Input
1559
+ }], idTabla: [{
1560
+ type: Input
1561
+ }], columnasTabla: [{
1562
+ type: Input
1563
+ }], botonesMenu: [{
1564
+ type: Input
1565
+ }], condicionesClaseFila: [{
1566
+ type: Input
1567
+ }] } });
1568
+
1569
+ class ProgressBarComponent {
1570
+ objThis;
1571
+ porcentaje = 0;
1572
+ textoCentrado = false;
1573
+ _textoMostrar = '';
1574
+ get textoMostrar() { return this._textoMostrar; }
1575
+ set textoMostrar(val) { this._textoMostrar = val; }
1576
+ _formatoNumero = '';
1577
+ get formatoNumero() { return this._formatoNumero; }
1578
+ set formatoNumero(val) { this._formatoNumero = val ?? '1.0-0'; }
1579
+ _coloresValor = [];
1580
+ get coloresValor() { return this._coloresValor; }
1581
+ set coloresValor(val) {
1582
+ if (!val || !Array.isArray(val)) {
1583
+ this._coloresValor = [
1584
+ { valorMaximo: 1, class: 'p-0' },
1585
+ { valorMaximo: 40, class: 'bg-red-400 text-red-900' },
1586
+ // {valorMaximo: 35, class: 'bg-red-600 text-red-100'},
1587
+ { valorMaximo: 80, class: 'bg-yellow-600 text-yellow-100' },
1588
+ { valorMaximo: 100, class: 'bg-green-600 text-green-100' },
1589
+ ];
1590
+ }
1591
+ else {
1592
+ this._coloresValor = val;
1593
+ }
1594
+ }
1595
+ constructor() { }
1596
+ ngOnInit() {
1597
+ }
1598
+ colorEstilo() {
1599
+ let estiloFin = null;
1600
+ let claseFin = null;
1601
+ let encontro = false;
1602
+ this.coloresValor = this.ordenarPorPropiedad(this.coloresValor, 'valorMaximo');
1603
+ this.coloresValor.forEach(estilo => {
1604
+ if (!encontro && (this.porcentaje <= estilo.valorMaximo)) {
1605
+ // console.log(this.porcentaje, estilo, (this.porcentaje < estilo.valorMaximo));
1606
+ encontro = true;
1607
+ estiloFin = estilo.style;
1608
+ claseFin = estilo.class;
1609
+ }
1610
+ });
1611
+ return {
1612
+ style: estiloFin ?? '',
1613
+ class: claseFin ?? '',
1614
+ };
1615
+ }
1616
+ ordenarPorPropiedad(objData, propiedad, numeros = false) {
1617
+ if (numeros) {
1618
+ return objData.sort((a, b) => a[propiedad] - b[propiedad]);
1619
+ }
1620
+ return objData.sort((a, b) => (a[propiedad] > b[propiedad]) ? 1 : ((b[propiedad] > a[propiedad]) ? -1 : 0));
1621
+ }
1622
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1623
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: ProgressBarComponent, isStandalone: true, selector: "jvsoft-progress-bar", inputs: { objThis: "objThis", porcentaje: "porcentaje", textoCentrado: "textoCentrado", textoMostrar: "textoMostrar", formatoNumero: "formatoNumero", coloresValor: "coloresValor" }, 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", styles: ["@tailwind base;@tailwind components;@tailwind utilities;\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }] });
1624
+ }
1625
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ProgressBarComponent, decorators: [{
1626
+ type: Component,
1627
+ args: [{ selector: 'jvsoft-progress-bar', imports: [
1628
+ CommonModule,
1629
+ DecimalPipe
1630
+ ], 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", styles: ["@tailwind base;@tailwind components;@tailwind utilities;\n"] }]
1631
+ }], ctorParameters: () => [], propDecorators: { objThis: [{
1632
+ type: Input
1633
+ }], porcentaje: [{
1634
+ type: Input
1635
+ }], textoCentrado: [{
1636
+ type: Input
1637
+ }], textoMostrar: [{
1638
+ type: Input
1639
+ }], formatoNumero: [{
1640
+ type: Input
1641
+ }], coloresValor: [{
1642
+ type: Input
1643
+ }] } });
1644
+
1645
+ // export * from './progress-spinner.service';
1646
+
1647
+ class LucesNavidadComponent {
1648
+ enProduccion = true;
1649
+ forzarMuestra = false;
1650
+ mesActual = new Date().getMonth() + 1;
1651
+ constructor() {
1652
+ }
1653
+ ngOnInit() {
1654
+ }
1655
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LucesNavidadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1656
+ 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,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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"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
1657
+ }
1658
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LucesNavidadComponent, decorators: [{
1659
+ type: Component,
1660
+ args: [{ selector: 'jvs-luces-navidad, [jvsLucesNavidad]', imports: [
1661
+ NgIf,
1662
+ NgForOf
1663
+ ], 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"] }]
1664
+ }], ctorParameters: () => [], propDecorators: { enProduccion: [{
1665
+ type: Input
1666
+ }], forzarMuestra: [{
1667
+ type: Input
1668
+ }] } });
1669
+
1670
+ class MatSuffixSearchButtonComponent {
1671
+ fControl;
1672
+ eventLimpiar = new EventEmitter();
1673
+ eventBuscar = new EventEmitter();
1674
+ get control() {
1675
+ return this.fControl;
1676
+ }
1677
+ emitirClick() {
1678
+ if (this.control.value) {
1679
+ this.control.reset();
1680
+ this.eventLimpiar.emit(true);
1681
+ }
1682
+ else {
1683
+ this.eventBuscar.emit(true);
1684
+ }
1685
+ }
1686
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatSuffixSearchButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1687
+ 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"] }] });
1688
+ }
1689
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MatSuffixSearchButtonComponent, decorators: [{
1690
+ type: Component,
1691
+ args: [{ selector: 'div[matSuffix][matSuffixSearchButton]', imports: [
1692
+ MatRipple,
1693
+ MatIcon
1694
+ ], host: {
1695
+ class: 'flex items-center justify-start',
1696
+ }, 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" }]
1697
+ }], propDecorators: { fControl: [{
1698
+ type: Input,
1699
+ args: [{ required: true }]
1700
+ }], eventLimpiar: [{
1701
+ type: Output
1702
+ }], eventBuscar: [{
1703
+ type: Output
1704
+ }] } });
1705
+
1706
+ // export {};
1707
+ // import './src/styles.scss';
1708
+
1709
+ /**
1710
+ * Generated bundle index. Do not edit.
1711
+ */
1712
+
1713
+ export { DialogFlotanteComponent, LucesNavidadComponent, MatSuffixSearchButtonComponent, ProgressBarComponent, ProgressSpinnerComponent, ProgressSpinnerService, TablaMantenimientoComponent, TablaMantenimientoService };
1714
+ //# sourceMappingURL=jvsoft-components.mjs.map